template; $cmd = Pluf::f('idf_plugin_syncgit_path_gitserve', '/dev/null'); $authorized_keys = Pluf::f('idf_plugin_syncgit_path_authorized_keys', false); if (false == $authorized_keys) { throw new Pluf_Exception_SettingError('Setting idf_plugin_syncgit_path_authorized_keys not set.'); } if (!is_writable($authorized_keys)) { throw new Exception('Cannot create file: '.$authorized_keys); } $out = ''; $keys = Pluf::factory('IDF_Key')->getList(array('view'=>'join_user')); foreach ($keys as $key) { if (strlen($key->content) > 40 // minimal check and preg_match('/^[a-zA-Z][a-zA-Z0-9_.-]*(@[a-zA-Z][a-zA-Z0-9.-]*)?$/', $key->login)) { $content = trim(str_replace(array("\n", "\r"), '', $key->content)); $out .= sprintf($template, $cmd, $key->login, $content)."\n"; } } file_put_contents($authorized_keys, $out, LOCK_EX); } /** * Mark export of git repositories for the daemon. */ public static function markExport() { foreach (Pluf::factory('IDF_Project')->getList() as $project) { $rep = sprintf(Pluf::f('git_repositories'), $project->shortname); $serve = new IDF_Plugin_SyncGit_Serve(); $serve->setGitExport($project->shortname, $rep); } } /** * Remove orphan repositories. */ public static function removeOrphanRepositories() { $path = Pluf::f('idf_plugin_syncgit_base_repositories', '/home/git/repositories'); if (!is_dir($path) || is_link($path)) { throw new Pluf_Exception_SettingError(sprintf( 'Directory %s does not exist! Setting "idf_plugin_syncgit_base_repositories not set.', $path)); } if (!is_writable($path)) { throw new Exception(sprintf('Repository %s is not writable.', $path)); } $projects = array(); foreach (Pluf::factory('IDF_Project')->getList() as $project) { $projects[] = $project->shortname; } unset($project); $it = new DirectoryIterator($path); $orphans = array(); while ($it->valid()) { if (!$it->isDot() && $it->isDir() && !in_array(basename($it->getFileName(), '.git'), $projects)) { $orphans[] = $it->getPathName(); } $it->next(); } if (count($orphans)) { $cmd = Pluf::f('idf_exec_cmd_prefix', '').'rm -rf '.implode(' ', $orphans); exec($cmd); clearstatcache(); while (list(, $project) = each($orphans)) { if (is_dir($project)) { throw new Exception(sprintf('Cannot remove %s directory.', $project)); } } } } /** * Check if a sync is needed. * */ public static function main() { if (file_exists(Pluf::f('idf_plugin_syncgit_sync_file'))) { @unlink(Pluf::f('idf_plugin_syncgit_sync_file')); self::sync(); self::markExport(); if (Pluf::f('idf_plugin_syncgit_remove_orphans', false)) { self::removeOrphanRepositories(); } } } }