| case 'IDF_Project::created':␊ |
| $plug->processProjectCreate($params['project']);␊ |
| break;␊ |
| case 'IDF_Project::membershipsUpdated':␊ |
| $plug->processMembershipsUpdated($params['project']);␊ |
| break;␊ |
| case 'IDF_Project::preDelete':␊ |
| $plug->processProjectDelete($params['project']);␊ |
| break;␊ |
|
| * 4) write monotonerc␊ |
| * 5) add the database as new local server in the usher configuration␊ |
| * 6) reload the running usher instance so it acknowledges the new server␊ |
| * 7) create read-/write-permissions for the project and add all public␊ |
| * keys to the project␊ |
| *␊ |
| * The initial right setup happens in processMembershipsUpdated()␊ |
| *␊ |
| * @param IDF_Project␊ |
| */␊ |
|
| // step 6) reload usher to pick up the new configuration␊ |
| //␊ |
| IDF_Scm_Monotone_Usher::reload();␊ |
| }␊ |
| ␊ |
| /**␊ |
| * Updates the read / write permissions for the monotone database␊ |
| *␊ |
| * @param IDF_Project␊ |
| */␊ |
| public function processMembershipsUpdated($project)␊ |
| {␊ |
| $projecttempl = Pluf::f('mtn_repositories', false);␊ |
| if ($projecttempl === false) {␊ |
| throw new IDF_Scm_Exception(␊ |
| '"mtn_repositories" must be defined in your configuration file.'␊ |
| );␊ |
| }␊ |
| ␊ |
| $shortname = $project->shortname;␊ |
| $projectpath = sprintf($projecttempl, $shortname);␊ |
| ␊ |
| //␊ |
| // step 7) add public monotone keys for the project to␊ |
| // read-permissions, write-permissions and the database␊ |
| //␊ |
| $mtn = IDF_Scm_Monotone::factory($project);␊ |
| $stdio = $mtn->getStdio();␊ |
| ␊ |
|
| }␊ |
| ␊ |
| $wildcard_section = null;␊ |
| foreach ($parsed_read_perms as $stanzas) {␊ |
| foreach ($stanzas as $stanza_line) {␊ |
| for ($i=0; $i<count($parsed_read_perms); ++$i) {␊ |
| foreach ($parsed_read_perms[$i] as $stanza_line) {␊ |
| if ($stanza_line['key'] == 'pattern' &&␊ |
| $stanza_line['values'][0] == '*') {␊ |
| $wildcard_section =& $stanzas;␊ |
| $wildcard_section =& $parsed_read_perms[$i];␊ |
| break;␊ |
| }␊ |
| }␊ |
|
| }␊ |
| ␊ |
| $write_perms = file_get_contents($projectpath.'/write-permissions');␊ |
| $lines = preg_split("/(\n|\r\n)/", $write_perms);␊ |
| $lines = preg_split("/(\n|\r\n)/", $write_perms, -1, PREG_SPLIT_NO_EMPTY);␊ |
| if (!in_array('*', $lines) && !in_array($mtn_key_id, $lines)) {␊ |
| $lines[] = $mtn_key_id;␊ |
| }␊ |
| if (file_put_contents($projectpath.'/write-permissions',␊ |
| implode("\n", $lines), LOCK_EX) === false) {␊ |
| implode("\n", $lines) . "\n", LOCK_EX) === false) {␊ |
| throw new IDF_Scm_Exception(sprintf(␊ |
| __('Could not write write-permissions file for project "%s"'),␊ |
| $shortname␊ |
|
| // pattern "*"␊ |
| // allow "*"␊ |
| // which is the default for non-private projects␊ |
| if ($project->private === true) {␊ |
| if ($project->private) {␊ |
| $read_perms = file_get_contents($projectpath.'/read-permissions');␊ |
| $parsed_read_perms = array();␊ |
| try {␊ |
|
| // while we add new keys only to an existing wild-card entry␊ |
| // we remove dropped keys from all sections since the key␊ |
| // should be simply unavailable for all of them␊ |
| foreach ($parsed_read_perms as $stanzas) {␊ |
| for ($i=0; $i<count($stanzas); ) {␊ |
| if ($stanzas[$i]['key'] == 'allow' &&␊ |
| $stanzas[$i]['values'][0] == $mtn_key_id) {␊ |
| unset($stanzas[$i]);␊ |
| for ($h=0; $h<count($parsed_read_perms); ++$h) {␊ |
| for ($i=0; $i<count($parsed_read_perms[$h]); ++$i) {␊ |
| if ($parsed_read_perms[$h][$i]['key'] == 'allow' &&␊ |
| $parsed_read_perms[$h][$i]['values'][0] == $mtn_key_id) {␊ |
| unset($parsed_read_perms[$h][$i]);␊ |
| continue;␊ |
| }␊ |
| ++$i;␊ |
| }␊ |
| }␊ |
| ␊ |
|
| }␊ |
| ␊ |
| $write_perms = file_get_contents($projectpath.'/write-permissions');␊ |
| $lines = preg_split("/(\n|\r\n)/", $write_perms);␊ |
| for ($i=0; $i<count($lines); ) {␊ |
| $lines = preg_split("/(\n|\r\n)/", $write_perms, -1, PREG_SPLIT_NO_EMPTY);␊ |
| for ($i=0; $i<count($lines); ++$i) {␊ |
| if ($lines[$i] == $mtn_key_id) {␊ |
| unset($lines[$i]);␊ |
| // the key should actually only exist once in the␊ |
| // file, but we're paranoid␊ |
| continue;␊ |
| }␊ |
| ++$i;␊ |
| }␊ |
| if (file_put_contents($projectpath.'/write-permissions',␊ |
| implode("\n", $lines), LOCK_EX) === false) {␊ |
| implode("\n", $lines) . "\n", LOCK_EX) === false) {␊ |
| throw new IDF_Scm_Exception(sprintf(␊ |
| __('Could not write write-permissions file for project "%s"'),␊ |
| $shortname␊ |