user); $stats = self::getProjectsStatistics ($projects); if ($api == true) return $projects; return Pluf_Shortcuts_RenderToResponse('idf/index.html', array('page_title' => __('Projects'), 'projects' => $projects, 'stats' => new Pluf_Template_ContextVars($stats)), $request); } /** * Login view. */ public function login($request, $match) { if (isset($request->POST['action']) and $request->POST['action'] == 'new-user') { $login = (isset($request->POST['login'])) ? $request->POST['login'] : ''; $url = Pluf_HTTP_URL_urlForView('IDF_Views::register', array(), array('login' => $login)); return new Pluf_HTTP_Response_Redirect($url); } $v = new Pluf_Views(); $request->POST['login'] = (isset($request->POST['login'])) ? mb_strtolower($request->POST['login']) : ''; return $v->login($request, $match, Pluf::f('login_success_url'), array(), 'idf/login_form.html'); } /** * Logout view. */ function logout($request, $match) { $views = new Pluf_Views(); return $views->logout($request, $match, Pluf::f('after_logout_page')); } /** * Registration. * * We just ask for login, email and to agree with the terms. Then, * we go ahead and send a confirmation email. The confirmation * email will allow to set the password, first name and last name * of the user. */ function register($request, $match) { $title = __('Create Your Account'); $params = array('request'=>$request); if ($request->method == 'POST') { $form = new IDF_Form_Register(array_merge( (array)$request->POST, (array)$request->FILES ), $params); if ($form->isValid()) { $user = $form->save(); // It is sending the confirmation email $url = Pluf_HTTP_URL_urlForView('IDF_Views::registerInputKey'); return new Pluf_HTTP_Response_Redirect($url); } } else { if (isset($request->GET['login'])) { $params['initial'] = array('login' => $request->GET['login']); } $form = new IDF_Form_Register(null, $params); } $context = new Pluf_Template_Context(array()); $tmpl = new Pluf_Template('idf/terms.html'); $terms = Pluf_Template::markSafe($tmpl->render($context)); return Pluf_Shortcuts_RenderToResponse('idf/register/index.html', array('page_title' => $title, 'form' => $form, 'terms' => $terms), $request); } /** * Input the registration confirmation key. * * Very simple view just to redirect to the register confirmation * views to input the password. */ function registerInputKey($request, $match) { $title = __('Confirm Your Account Creation'); if ($request->method == 'POST') { $form = new IDF_Form_RegisterInputKey($request->POST); if ($form->isValid()) { $url = $form->save(); return new Pluf_HTTP_Response_Redirect($url); } } else { $form = new IDF_Form_RegisterInputKey(); } return Pluf_Shortcuts_RenderToResponse('idf/register/inputkey.html', array('page_title' => $title, 'form' => $form), $request); } /** * Registration confirmation. * * Input first/last name, password and sign in the user. * * Maybe in the future send the user to its personal page for * customization. */ function registerConfirmation($request, $match) { $title = __('Confirm Your Account Creation'); $key = $match[1]; // first "check", full check is done in the form. $email_id = IDF_Form_RegisterInputKey::checkKeyHash($key); if (false == $email_id) { $url = Pluf_HTTP_URL_urlForView('IDF_Views::registerInputKey'); return new Pluf_HTTP_Response_Redirect($url); } $user = new Pluf_User($email_id[1]); $extra = array('key' => $key, 'user' => $user); if ($request->method == 'POST') { $form = new IDF_Form_RegisterConfirmation($request->POST, $extra); if ($form->isValid()) { $user = $form->save(); $request->user = $user; $request->session->clear(); $request->session->setData('login_time', gmdate('Y-m-d H:i:s')); $user->last_login = gmdate('Y-m-d H:i:s'); $user->update(); $request->user->setMessage(__('Welcome! You can now participate in the life of your project of choice.')); $url = Pluf_HTTP_URL_urlForView('IDF_Views::index'); return new Pluf_HTTP_Response_Redirect($url); } } else { $form = new IDF_Form_RegisterConfirmation(null, $extra); } return Pluf_Shortcuts_RenderToResponse('idf/register/confirmation.html', array('page_title' => $title, 'new_user' => $user, 'form' => $form), $request); } /** * Password recovery. * * Request the login or the email of the user and if the login or * email is available in the database, send an email with a key to * reset the password. * * If the user is not yet confirmed, send the confirmation key one * more time. */ function passwordRecoveryAsk($request, $match) { $title = __('Password Recovery'); if ($request->method == 'POST') { $form = new IDF_Form_Password($request->POST); if ($form->isValid()) { $url = $form->save(); return new Pluf_HTTP_Response_Redirect($url); } } else { $form = new IDF_Form_Password(); } return Pluf_Shortcuts_RenderToResponse('idf/user/passrecovery-ask.html', array('page_title' => $title, 'form' => $form), $request); } /** * If the key is valid, provide a nice form to reset the password * and automatically login the user. * * This is also firing the password change event for the plugins. */ public function passwordRecovery($request, $match) { $title = __('Password Recovery'); $key = $match[1]; // first "check", full check is done in the form. $email_id = IDF_Form_PasswordInputKey::checkKeyHash($key); if (false == $email_id) { $url = Pluf_HTTP_URL_urlForView('IDF_Views::passwordRecoveryInputKey'); return new Pluf_HTTP_Response_Redirect($url); } $user = new Pluf_User($email_id[1]); $extra = array('key' => $key, 'user' => $user); if ($request->method == 'POST') { $form = new IDF_Form_PasswordReset($request->POST, $extra); if ($form->isValid()) { $user = $form->save(); $request->user = $user; $request->session->clear(); $request->session->setData('login_time', gmdate('Y-m-d H:i:s')); $user->last_login = gmdate('Y-m-d H:i:s'); $user->update(); $request->user->setMessage(__('Welcome back! Next time, you can use your broswer options to remember the password.')); $url = Pluf_HTTP_URL_urlForView('IDF_Views::index'); return new Pluf_HTTP_Response_Redirect($url); } } else { $form = new IDF_Form_PasswordReset(null, $extra); } return Pluf_Shortcuts_RenderToResponse('idf/user/passrecovery.html', array('page_title' => $title, 'new_user' => $user, 'form' => $form), $request); } /** * Just a simple input box to provide the code and redirect to * passwordRecovery */ public function passwordRecoveryInputCode($request, $match) { $title = __('Password Recovery'); if ($request->method == 'POST') { $form = new IDF_Form_PasswordInputKey($request->POST); if ($form->isValid()) { $url = $form->save(); return new Pluf_HTTP_Response_Redirect($url); } } else { $form = new IDF_Form_PasswordInputKey(); } return Pluf_Shortcuts_RenderToResponse('idf/user/passrecovery-inputkey.html', array('page_title' => $title, 'form' => $form), $request); } /** * FAQ. */ public function faq($request, $match) { $title = __('Here to Help You!'); $projects = self::getProjects($request->user); return Pluf_Shortcuts_RenderToResponse('idf/faq.html', array( 'page_title' => $title, 'projects' => $projects, ), $request); } /** * API FAQ. */ public function faqApi($request, $match) { $title = __('InDefero API (Application Programming Interface)'); $projects = self::getProjects($request->user); return Pluf_Shortcuts_RenderToResponse('idf/faq-api.html', array( 'page_title' => $title, 'projects' => $projects, ), $request); } /** * Returns a list of projects accessible for the user. * * @param Pluf_User * @return ArrayObject IDF_Project */ public static function getProjects($user) { $db =& Pluf::db(); $false = Pluf_DB_BooleanToDb(false, $db); if ($user->isAnonymous()) { $sql = sprintf('%s=%s', $db->qn('private'), $false); return Pluf::factory('IDF_Project')->getList(array('filter'=> $sql, 'order' => 'name ASC')); } if ($user->administrator) { return Pluf::factory('IDF_Project')->getList(array('order' => 'name ASC')); } // grab the list of projects where the user is admin, member // or authorized $perms = array( Pluf_Permission::getFromString('IDF.project-member'), Pluf_Permission::getFromString('IDF.project-owner'), Pluf_Permission::getFromString('IDF.project-authorized-user') ); $sql = new Pluf_SQL("model_class='IDF_Project' AND owner_class='Pluf_User' AND owner_id=%s AND negative=".$false, $user->id); $rows = Pluf::factory('Pluf_RowPermission')->getList(array('filter' => $sql->gen())); $sql = sprintf('%s=%s', $db->qn('private'), $false); if ($rows->count() > 0) { $ids = array(); foreach ($rows as $row) { $ids[] = $row->model_id; } $sql .= sprintf(' OR id IN (%s)', implode(', ', $ids)); } return Pluf::factory('IDF_Project')->getList(array('filter' => $sql, 'order' => 'name ASC')); } /** * Returns statistics on a list of projects. * * @param ArrayObject IDF_Project * @return Associative array of statistics */ public static function getProjectsStatistics($projects) { // Init the return var $forgestats = array('downloads' => 0, 'reviews' => 0, 'issues' => 0, 'docpages' => 0, 'commits' => 0); // Count for each projects foreach ($projects as $p) { $pstats = $p->getStats (); $forgestats['downloads'] += $pstats['downloads']; $forgestats['reviews'] += $pstats['reviews']; $forgestats['issues'] += $pstats['issues']; $forgestats['docpages'] += $pstats['docpages']; $forgestats['commits'] += $pstats['commits']; } // Count projects $forgestats['projects'] = count($projects); // Count members $sql = new Pluf_SQL('first_name != %s', array('---')); $forgestats['members'] = Pluf::factory('Pluf_User') ->getCount(array('filter' => $sql->gen())); return $forgestats; } }