/** * Send a test email * * @Route(url="/mailing/test") * @param \thebuggenie\core\framework\Request $request */ public function runTestEmail(framework\Request $request) { if ($email_to = $request['test_email_to']) { try { if (framework\Context::getModule('mailing')->sendTestEmail($email_to)) { framework\Context::setMessage('module_message', framework\Context::getI18n()->__('The email was successfully accepted for delivery')); } else { framework\Context::setMessage('module_error', framework\Context::getI18n()->__('The email was not sent')); framework\Context::setMessage('module_error_details', framework\Logging::getMessagesForCategory('mailing', framework\Logging::LEVEL_NOTICE)); } } catch (\Exception $e) { framework\Context::setMessage('module_error', framework\Context::getI18n()->__('The email was not sent')); framework\Context::setMessage('module_error_details', $e->getMessage()); } } else { framework\Context::setMessage('module_error', framework\Context::getI18n()->__('Please specify an email address')); } $this->forward(framework\Context::getRouting()->generate('configure_module', array('config_module' => 'mailing'))); }
/** * Transition an issue to the outgoing step, based on request data if available * * @param \thebuggenie\core\entities\Issue $issue */ public function transitionIssueToOutgoingStepWithoutRequest(\thebuggenie\core\entities\Issue $issue) { // Pass new Request object so that functions like getParameter can be called. $request = new \thebuggenie\core\framework\Request(); if (!$this->validateFromRequest($request)) { framework\Context::setMessage('issue_error', 'transition_error'); framework\Context::setMessage('issue_workflow_errors', $this->getValidationErrors()); return false; } $this->getOutgoingStep()->applyToIssue($issue); if (!empty($this->_validation_errors)) { return false; } foreach ($this->getActions() as $action) { $action->perform($issue, $request); } foreach ($this->getPostValidationRules() as $rule) { if (!$rule->isValid($request)) { $this->_validation_errors[$rule->getRule()] = true; } } if (count($this->getValidationErrors())) { framework\Context::setMessage('issue_error', 'transition_error'); framework\Context::setMessage('issue_workflow_errors', $this->getValidationErrors()); return false; } $issue->save(); return true; }
/** * Show an article * * @param \thebuggenie\core\framework\Request $request */ public function runEditArticle(framework\Request $request) { if (!$this->article->canEdit()) { framework\Context::setMessage('publish_article_error', framework\Context::getI18n()->__('You do not have permission to edit this article')); $this->forward(framework\Context::getRouting()->generate('publish_article', array('article_name' => $this->article_name))); } $this->article_route = $this->article->getID() ? 'publish_article_edit' : 'publish_article_new'; $this->article_route_params = $this->article->getID() ? array('article_name' => $this->article_name) : array(); if ($request->isPost()) { $this->preview = (bool) $request['preview']; $this->change_reason = $request['change_reason']; try { $this->article->setArticleType($request['article_type']); $this->article->setName($request['new_article_name']); $this->article->setParentArticle(Articles::getTable()->getArticleByName($request['parent_article_name'])); $this->article->setManualName($request['manual_name']); if ($this->article->getArticleType() == Article::TYPE_MANUAL && !$this->article->getName()) { $article_name_prefix = $this->article->getParentArticle() instanceof Article ? $this->article->getParentArticle()->getName() . ':' : $request['parent_article_name']; $this->article->setName(str_replace(' ', '', $article_name_prefix . $this->article->getManualName())); } $this->article->setContentSyntax($request['article_content_syntax']); $this->article->setContent($request->getRawParameter('article_content')); if (!$this->article->getName() || trim($this->article->getName()) == '' || !preg_match('/[\\w:]+/i', $this->article->getName())) { throw new \Exception(framework\Context::getI18n()->__('You need to specify a valid article name')); } if ($request['article_type'] == Article::TYPE_MANUAL && (!$this->article->getManualName() || trim($this->article->getManualName()) == '' || !preg_match('/[\\w:]+/i', $this->article->getManualName()))) { throw new \Exception(framework\Context::getI18n()->__('You need to specify a valid article name')); } if (!$this->preview && framework\Context::getModule('publish')->getSetting('require_change_reason') == 1 && (!$this->change_reason || trim($this->change_reason) == '')) { throw new \Exception(framework\Context::getI18n()->__('You have to provide a reason for the changes')); } if ($this->article->getLastUpdatedDate() != $request['last_modified']) { throw new \Exception(framework\Context::getI18n()->__('The file has been modified since you last opened it')); } if (($article = Article::getByName($request['new_new_article_name'])) && $article instanceof Article && $article->getID() != $request['article_id']) { throw new \Exception(framework\Context::getI18n()->__('An article with that name already exists. Please choose a different article name')); } if (!$this->preview) { $this->article->doSave(array(), $request['change_reason']); framework\Context::setMessage('publish_article_message', framework\Context::getI18n()->__('The article was saved')); $this->forward(framework\Context::getRouting()->generate('publish_article', array('article_name' => $this->article->getName()))); } } catch (\Exception $e) { $this->error = $e->getMessage(); } } }
/** * Add a build (AJAX call) * * @param framework\Request $request The request object */ public function runProjectBuild(framework\Request $request) { $i18n = framework\Context::getI18n(); if ($this->getUser()->canManageProjectReleases($this->selected_project)) { try { if (framework\Context::getUser()->canManageProjectReleases($this->selected_project)) { if (($b_name = $request['build_name']) && trim($b_name) != '') { $build = new entities\Build($request['build_id']); $build->setName($b_name); $build->setVersion($request->getParameter('ver_mj', 0), $request->getParameter('ver_mn', 0), $request->getParameter('ver_rev', 0)); $build->setReleased((bool) $request['isreleased']); $build->setLocked((bool) $request['locked']); if ($request['milestone'] && ($milestone = entities\Milestone::getB2DBTable()->selectById($request['milestone']))) { $build->setMilestone($milestone); } else { $build->clearMilestone(); } if ($request['edition'] && ($edition = entities\Edition::getB2DBTable()->selectById($request['edition']))) { $build->setEdition($edition); } else { $build->clearEdition(); } $release_date = null; if ($request['has_release_date']) { $release_date = mktime($request['release_hour'], $request['release_minute'], 1, $request['release_month'], $request['release_day'], $request['release_year']); } $build->setReleaseDate($release_date); switch ($request->getParameter('download', 'leave_file')) { case '0': $build->clearFile(); $build->setFileURL(''); break; case 'upload_file': if ($build->hasFile()) { $build->getFile()->delete(); $build->clearFile(); } $file = framework\Context::getRequest()->handleUpload('upload_file'); $build->setFile($file); $build->setFileURL(''); break; case 'url': $build->clearFile(); $build->setFileURL($request['file_url']); break; } if (!$build->getID()) { $build->setProject($this->selected_project); } $build->save(); } else { throw new \Exception($i18n->__('You need to specify a name for the release')); } } else { throw new \Exception($i18n->__('You do not have access to this project')); } } catch (\Exception $e) { framework\Context::setMessage('build_error', $e->getMessage()); } $this->forward(framework\Context::getRouting()->generate('project_release_center', array('project_key' => $this->selected_project->getKey()))); } return $this->forward403($i18n->__("You don't have access to add releases")); }
public function postConfigSettings(\thebuggenie\core\framework\Request $request) { if ($request->hasParameter('import_articles')) { $cc = 0; foreach ($request['import_article'] as $article_name => $import) { $cc++; Articles::getTable()->deleteArticleByName(urldecode($article_name)); $content = file_get_contents(THEBUGGENIE_MODULES_PATH . 'publish' . DS . 'fixtures' . DS . $article_name); Article::createNew(urldecode($article_name), $content, null, array('overwrite' => true, 'noauthor' => true)); } framework\Context::setMessage('module_message', framework\Context::getI18n()->__('%number_of_articles articles imported successfully', array('%number_of_articles' => $cc))); } else { $settings = array('allow_camelcase_links', 'menu_title', 'hide_wiki_links', 'free_edit', 'require_change_reason'); foreach ($settings as $setting) { if ($request->hasParameter($setting)) { $this->saveSetting($setting, $request->getParameter($setting)); } } } }
public function runScope(framework\Request $request) { $this->scope = new entities\Scope($request['id']); $modules = tables\Modules::getTable()->getModulesForScope($this->scope->getID()); $this->modules = $modules; $this->scope_save_error = framework\Context::getMessageAndClear('scope_save_error'); if ($request->isPost()) { try { if ($request['scope_action'] == 'delete') { if (!$this->scope->isDefault()) { $this->scope->delete(); framework\Context::setMessage('scope_deleted', true); $this->forward(make_url('configure_scopes')); } else { $this->scope_save_error = $this->getI18n()->__('You cannot delete the default scope'); } } else { if (!$request['name']) { throw new \Exception($this->getI18n()->__('Please specify a scope name')); } $this->scope->setName($request['name']); $this->scope->setDescription($request['description']); $this->scope->setCustomWorkflowsEnabled((bool) $request['custom_workflows_enabled']); $this->scope->setMaxWorkflowsLimit((int) $request['workflow_limit']); $this->scope->setUploadsEnabled((bool) $request['file_uploads_enabled']); $this->scope->setMaxUploadLimit((int) $request['upload_limit']); $this->scope->setMaxProjects((int) $request['project_limit']); $this->scope->setMaxUsers((int) $request['user_limit']); $this->scope->setMaxTeams((int) $request['team_limit']); $this->scope->save(); $enabled_modules = $request['module_enabled']; $prev_scope = framework\Context::getScope(); foreach ($enabled_modules as $module => $enabled) { if (!framework\Context::getModule($module)->isCore() && !$enabled && array_key_exists($module, $modules)) { $module = tables\Modules::getTable()->getModuleForScope($module, $this->scope->getID()); $module->uninstall($this->scope->getID()); } elseif (!framework\Context::getModule($module)->isCore() && $enabled && !array_key_exists($module, $modules)) { framework\Context::setScope($this->scope); entities\Module::installModule($module); framework\Context::setScope($prev_scope); } } framework\Context::setMessage('scope_saved', true); $this->forward(make_url('configure_scopes')); } } catch (\Exception $e) { framework\Context::setMessage('scope_save_error', $e->getMessage()); } } }
public function runAccountPickUsername(framework\Request $request) { if (entities\User::isUsernameAvailable($request['selected_username'])) { $user = $this->getUser(); $user->setUsername($request['selected_username']); $user->setOpenIdLocked(false); $user->setPassword(entities\User::createPassword()); $user->save(); $this->getResponse()->setCookie('tbg3_username', $user->getUsername()); $this->getResponse()->setCookie('tbg3_password', $user->getPassword()); framework\Context::setMessage('username_chosen', true); $this->forward($this->getRouting()->generate('account')); } framework\Context::setMessage('error', $this->getI18n()->__('Could not pick the username "%username"', array('%username' => $request['selected_username']))); $this->forward($this->getRouting()->generate('account')); }
public function runEditSavedSearch(framework\Request $request) { if ($request->isPost()) { if ($request['delete_saved_search']) { try { if (!$this->search_object instanceof entities\SavedSearch || !$this->search_object->getB2DBID()) { throw new \Exception('not a saved search'); } if ($this->search_object->getUserID() == framework\Context::getUser()->getID() || $this->search_object->isPublic() && framework\Context::getUser()->canCreatePublicSearches()) { $this->search_object->delete(); return $this->renderJSON(array('failed' => false, 'message' => framework\Context::getI18n()->__('The saved search was deleted successfully'))); } } catch (\Exception $e) { return $this->renderJSON(array('failed' => true, 'message' => framework\Context::getI18n()->__('Cannot delete this saved search'))); } } elseif ($request['saved_search_name'] != '') { if (!$this->saved_search instanceof entities\SavedSearch) { $this->saved_search = new entities\SavedSearch(); } $this->saved_search->setName($request['saved_search_name']); $this->saved_search->setDescription($request['saved_search_description']); $this->saved_search->setIsPublic((bool) $request['saved_search_public']); $this->saved_search->save(); if ($request['saved_search_id']) { framework\Context::setMessage('search_message', framework\Context::getI18n()->__('The saved search was updated')); } else { framework\Context::setMessage('search_message', framework\Context::getI18n()->__('The saved search has been created')); } $params = array(); } else { framework\Context::setMessage('search_error', framework\Context::getI18n()->__('You have to specify a name for the saved search')); $params = array('fs' => $this->filters, 'groupby' => $this->groupby, 'grouporder' => $this->grouporder, 'templatename' => $this->templatename, 'saved_search' => $request['saved_search_id'], 'issues_per_page' => $this->ipp); } if (framework\Context::isProjectContext()) { $route = 'project_issues'; $params['project_key'] = framework\Context::getCurrentProject()->getKey(); } else { $route = 'search'; } $this->forward(framework\Context::getRouting()->generate($route, $params)); } }
/** * Import all valid users * * @param \thebuggenie\core\framework\Request $request */ public function runImportUsers(framework\Request $request) { $validgroups = framework\Context::getModule('auth_ldap')->getSetting('groups'); $base_dn = framework\Context::getModule('auth_ldap')->getSetting('b_dn'); $dn_attr = framework\Context::getModule('auth_ldap')->getSetting('dn_attr'); $username_attr = framework\Context::getModule('auth_ldap')->getSetting('u_attr'); $fullname_attr = framework\Context::getModule('auth_ldap')->getSetting('f_attr'); $buddyname_attr = framework\Context::getModule('auth_ldap')->getSetting('b_attr'); $email_attr = framework\Context::getModule('auth_ldap')->getSetting('e_attr'); $groups_members_attr = framework\Context::getModule('auth_ldap')->getSetting('g_attr'); $user_class = framework\Context::getModule('auth_ldap')->getSetting('u_type'); $group_class = framework\Context::getModule('auth_ldap')->getSetting('g_type'); $users = array(); $importcount = 0; $updatecount = 0; try { /* * Connect and bind to the control user */ $connection = framework\Context::getModule('auth_ldap')->connect(); framework\Context::getModule('auth_ldap')->bind($connection, framework\Context::getModule('auth_ldap')->getSetting('control_user'), framework\Context::getModule('auth_ldap')->getSetting('control_pass')); /* * Get a list of all users of a certain objectClass */ $fields = array($fullname_attr, $buddyname_attr, $username_attr, $email_attr, 'cn', $dn_attr); $filter = '(objectClass=' . framework\Context::getModule('auth_ldap')->escape($user_class) . ')'; $results = ldap_search($connection, $base_dn, $filter, $fields); if (!$results) { framework\Logging::log('failed to search for users: ' . ldap_error($connection), 'ldap', framework\Logging::LEVEL_FATAL); throw new \Exception(framework\Context::geti18n()->__('Search failed: ') . ldap_error($connection)); } $data = ldap_get_entries($connection, $results); /* * For every user that exists, process it. */ for ($i = 0; $i != $data['count']; $i++) { $user_dn = $data[$i][strtolower($dn_attr)][0]; /* * If groups are specified, perform group restriction tests */ if ($validgroups != '') { /* * We will repeat this for every group, but groups are supplied as a comma-separated list */ if (strstr($validgroups, ',')) { $groups = explode(',', $validgroups); } else { $groups = array(); $groups[] = $validgroups; } // Assumed we are initially banned $allowed = false; foreach ($groups as $group) { // No need to carry on looking if we have access if ($allowed == true) { continue; } /* * Find the group we are looking for, we search the entire directory * We want to find 1 group, if we don't get 1, silently ignore this group. */ $fields2 = array($groups_members_attr); $filter2 = '(&(cn=' . framework\Context::getModule('auth_ldap')->escape($group) . ')(objectClass=' . framework\Context::getModule('auth_ldap')->escape($group_class) . '))'; $results2 = ldap_search($connection, $base_dn, $filter2, $fields2); if (!$results2) { framework\Logging::log('failed to search for user: '******'ldap', framework\Logging::LEVEL_FATAL); throw new \Exception(framework\Context::geti18n()->__('Search failed: ') . ldap_error($connection)); } $data2 = ldap_get_entries($connection, $results2); if ($data2['count'] != 1) { continue; } /* * Look through the group's member list. If we are found, grant access. */ foreach ($data2[0][strtolower($groups_members_attr)] as $member) { $member = preg_replace('/(?<=,) +(?=[a-zA-Z])/', '', $member); $user_dn = preg_replace('/(?<=,) +(?=[a-zA-Z])/', '', $user_dn); if (!is_numeric($member) && strtolower($member) == strtolower($user_dn)) { $allowed = true; } } } if ($allowed == false) { continue; } } $users[$i] = array(); /* * Set user's properties. * Realname is obtained from directory, if not found we set it to the username * Email is obtained from directory, if not found we set it to blank */ if (!array_key_exists(strtolower($fullname_attr), $data[$i])) { $users[$i]['realname'] = $data[$i]['cn'][0]; } else { $users[$i]['realname'] = $data[$i][strtolower($fullname_attr)][0]; } if (!array_key_exists(strtolower($buddyname_attr), $data[$i])) { $users[$i]['buddyname'] = $data[$i]['cn'][0]; } else { $users[$i]['buddyname'] = $data[$i][strtolower($buddyname_attr)][0]; } if (!array_key_exists(strtolower($email_attr), $data[$i])) { $users[$i]['email'] = ''; } else { $users[$i]['email'] = $data[$i][strtolower($email_attr)][0]; } $users[$i]['username'] = $data[$i][strtolower($username_attr)][0]; } } catch (\Exception $e) { framework\Context::setMessage('module_error', framework\Context::getI18n()->__('Import failed')); framework\Context::setMessage('module_error_details', $e->getMessage()); $this->forward(framework\Context::getRouting()->generate('configure_module', array('config_module' => 'auth_ldap'))); } /* * For every user that was found, either create a new user object, or update * the existing one. This will update the created and updated counts as appropriate. */ foreach ($users as $ldapuser) { $username = $ldapuser['username']; $email = $ldapuser['email']; $realname = $ldapuser['realname']; $buddyname = $ldapuser['buddyname']; try { $user = \thebuggenie\core\entities\User::getByUsername($username); if ($user instanceof \thebuggenie\core\entities\User) { $user->setRealname($realname); $user->setEmail($email); // update email address $user->save(); $updatecount++; } else { // create user $user = new \thebuggenie\core\entities\User(); $user->setUsername($username); $user->setRealname($realname); $user->setBuddyname($buddyname); $user->setEmail($email); $user->setEnabled(); $user->setActivated(); $user->setPassword($user->getJoinedDate() . $username); $user->setJoined(); $user->save(); $importcount++; } } catch (\Exception $e) { ldap_unbind($connection); framework\Context::setMessage('module_error', framework\Context::getI18n()->__('Import failed')); framework\Context::setMessage('module_error_details', $e->getMessage()); $this->forward(framework\Context::getRouting()->generate('configure_module', array('config_module' => 'auth_ldap'))); } } ldap_unbind($connection); framework\Context::setMessage('module_message', framework\Context::getI18n()->__('Import successful! %imp users imported, %upd users updated from LDAP', array('%imp' => $importcount, '%upd' => $updatecount))); $this->forward(framework\Context::getRouting()->generate('configure_module', array('config_module' => 'auth_ldap'))); }