示例#1
0
 public static function loadFixtures(TBGScope $scope)
 {
     $scope_id = $scope->getID();
     $admin_group = new TBGGroup();
     $admin_group->setName('Administrators');
     $admin_group->setScope($scope);
     $admin_group->save();
     TBGSettings::saveSetting('admingroup', $admin_group->getID(), 'core', $scope_id);
     $user_group = new TBGGroup();
     $user_group->setName('Regular users');
     $user_group->setScope($scope);
     $user_group->save();
     TBGSettings::saveSetting('defaultgroup', $user_group->getID(), 'core', $scope_id);
     $guest_group = new TBGGroup();
     $guest_group->setName('Guests');
     $guest_group->setScope($scope);
     $guest_group->save();
     // Set up initial users, and their permissions
     if ($scope->isDefault()) {
         list($guestuser_id, $adminuser_id) = TBGUser::loadFixtures($scope, $admin_group, $user_group, $guest_group);
         TBGUserScopesTable::getTable()->addUserToScope($guestuser_id, $scope->getID(), $guest_group->getID(), true);
         TBGUserScopesTable::getTable()->addUserToScope($adminuser_id, $scope->getID(), $admin_group->getID(), true);
     } else {
         $default_scope_id = TBGSettings::getDefaultScopeID();
         $default_user_id = (int) TBGSettings::get(TBGSettings::SETTING_DEFAULT_USER_ID, 'core', $default_scope_id);
         TBGUserScopesTable::getTable()->addUserToScope($default_user_id, $scope->getID(), $user_group->getID(), true);
         TBGUserScopesTable::getTable()->addUserToScope(1, $scope->getID(), $admin_group->getID());
         TBGSettings::saveSetting(TBGSettings::SETTING_DEFAULT_USER_ID, $default_user_id, 'core', $scope->getID());
     }
     TBGPermissionsTable::getTable()->loadFixtures($scope, $admin_group->getID(), $guest_group->getID());
 }
 public static function loadFixtures(TBGScope $scope)
 {
     $scheme = new TBGWorkflowScheme();
     $scheme->setScope($scope);
     $scheme->setName("Default workflow scheme");
     $scheme->setDescription("This is the default workflow scheme. It is used by all projects with no specific workflow scheme selected. This scheme cannot be edited or removed.");
     $scheme->save();
     TBGSettings::saveSetting(TBGSettings::SETTING_DEFAULT_WORKFLOWSCHEME, $scheme->getID(), 'core', $scope->getID());
 }
 public static function loadFixtures(TBGScope $scope)
 {
     $scheme = new TBGIssuetypeScheme();
     $scheme->setScope($scope->getID());
     $scheme->setName("Default issuetype scheme");
     $scheme->setDescription("This is the default issuetype scheme. It is used by all projects with no specific issuetype scheme selected. This scheme cannot be edited or removed.");
     $scheme->save();
     TBGSettings::saveSetting(TBGSettings::SETTING_DEFAULT_ISSUETYPESCHEME, $scheme->getID(), 'core', $scope->getID());
     foreach (TBGIssuetype::getAll() as $issuetype) {
         $scheme->setIssuetypeEnabled($issuetype);
         if ($issuetype->getIcon() == 'developer_report') {
             $scheme->setIssuetypeRedirectedAfterReporting($issuetype, false);
         }
         if (in_array($issuetype->getIcon(), array('task', 'developer_report', 'idea'))) {
             $scheme->setIssuetypeReportable($issuetype, false);
         }
     }
     return $scheme;
 }
 public function do_execute()
 {
     $this->cliEcho("\n");
     $this->cliEcho("Revert authentication backend\n", 'white', 'bold');
     $this->cliEcho("This command is useful if you've managed to lock yourself.\n");
     $this->cliEcho("out due to an authentication backend change gone bad.\n\n");
     if (TBGSettings::getAuthenticationBackend() == 'tbg' || TBGSettings::getAuthenticationBackend() == null) {
         $this->cliEcho("You are currently using the default authentication backend.\n\n");
     } else {
         $this->cliEcho("Please type 'yes' if you want to revert to the default authentication backend: ");
         $this->cliEcho("\n");
         if ($this->getInput() == 'yes') {
             TBGSettings::saveSetting(TBGSettings::SETTING_AUTH_BACKEND, 'tbg');
             $this->cliEcho("Authentication backend reverted.\n\n");
         } else {
             $this->cliEcho("No changes made.\n\n");
         }
     }
 }
 public static function loadFixtures(TBGScope $scope)
 {
     $scope_id = $scope->getID();
     $bug_report = new TBGIssuetype();
     $bug_report->setName('Bug report');
     $bug_report->setIcon('bug_report');
     $bug_report->setDescription('Have you discovered a bug in the application, or is something not working as expected?');
     $bug_report->save();
     TBGSettings::saveSetting('defaultissuetypefornewissues', $bug_report->getID(), 'core', $scope_id);
     TBGSettings::saveSetting('issuetype_bug_report', $bug_report->getID(), 'core', $scope_id);
     $feature_request = new TBGIssuetype();
     $feature_request->setName('Feature request');
     $feature_request->setIcon('feature_request');
     $feature_request->setDescription('Are you missing some specific feature, or is your favourite part of the application a bit lacking?');
     $feature_request->save();
     TBGSettings::saveSetting('issuetype_feature_request', $feature_request->getID(), 'core', $scope_id);
     $enhancement = new TBGIssuetype();
     $enhancement->setName('Enhancement');
     $enhancement->setIcon('enhancement');
     $enhancement->setDescription('Have you found something that is working in a way that could be improved?');
     $enhancement->save();
     TBGSettings::saveSetting('issuetype_enhancement', $enhancement->getID(), 'core', $scope_id);
     $task = new TBGIssuetype();
     $task->setName('Task');
     $task->setIcon('task');
     $task->setIsTask();
     $task->save();
     TBGSettings::saveSetting('issuetype_task', $task->getID(), 'core', $scope_id);
     $user_story = new TBGIssuetype();
     $user_story->setName('User story');
     $user_story->setIcon('developer_report');
     $user_story->setDescription('Doing it Agile-style. Issue type perfectly suited for entering user stories');
     $user_story->save();
     TBGSettings::saveSetting('issuetype_user_story', $user_story->getID(), 'core', $scope_id);
     $idea = new TBGIssuetype();
     $idea->setName('Idea');
     $idea->setIcon('idea');
     $idea->setDescription('Express yourself - share your ideas with the rest of the team!');
     $idea->save();
     TBGSettings::saveSetting('issuetype_idea', $idea->getID(), 'core', $scope_id);
     return array($bug_report->getID(), $feature_request->getID(), $enhancement->getID(), $task->getID(), $user_story->getID(), $idea->getID());
 }
 public static function loadFixtures(TBGScope $scope)
 {
     $scope_id = $scope->getID();
     $admin_group = new TBGGroup();
     $admin_group->setName('Administrators');
     $admin_group->setScope($scope);
     $admin_group->save();
     TBGSettings::saveSetting('admingroup', $admin_group->getID(), 'core', $scope_id);
     $user_group = new TBGGroup();
     $user_group->setName('Regular users');
     $user_group->setScope($scope);
     $user_group->save();
     TBGSettings::saveSetting('defaultgroup', $user_group->getID(), 'core', $scope_id);
     $guest_group = new TBGGroup();
     $guest_group->setName('Guests');
     $guest_group->setScope($scope);
     $guest_group->save();
     // Set up initial users, and their permissions
     TBGUser::loadFixtures($scope, $admin_group, $user_group, $guest_group);
     TBGPermissionsTable::getTable()->loadFixtures($scope, $admin_group->getID(), $guest_group->getID());
 }
示例#7
0
 /**
  * Save Planning column settings for user
  *
  * @param TBGRequest $request
  * @return bool
  */
 public function runSavePlanningColumnSettings(TBGRequest $request)
 {
     if ($this->getUser() instanceof TBGUser) {
         try {
             TBGSettings::saveSetting('planning_columns_' . $this->selected_project->getID(), join(',', $request['planning_column']), 'project', TBGContext::getScope()->getID(), $this->getUser()->getID());
         } catch (Exception $e) {
         }
     }
     $this->forward(TBGContext::getRouting()->generate('project_planning', array('project_key' => $this->selected_project->getKey())));
 }
示例#8
0
 public function runSiteIcons(TBGRequest $request)
 {
     if ($this->getAccessLevel($request['section'], 'core') == TBGSettings::ACCESS_FULL) {
         if ($request->isPost()) {
             switch ($request['small_icon_action']) {
                 case 'upload_file':
                     $file = $request->handleUpload('small_icon');
                     TBGSettings::saveSetting(TBGSettings::SETTING_FAVICON_TYPE, TBGSettings::APPEARANCE_FAVICON_CUSTOM);
                     TBGSettings::saveSetting(TBGSettings::SETTING_FAVICON_ID, $file->getID());
                     break;
                 case 'clear_file':
                     TBGSettings::saveSetting(TBGSettings::SETTING_FAVICON_TYPE, TBGSettings::APPEARANCE_FAVICON_THEME);
                     break;
             }
             switch ($request['large_icon_action']) {
                 case 'upload_file':
                     $file = $request->handleUpload('large_icon');
                     TBGSettings::saveSetting(TBGSettings::SETTING_HEADER_ICON_TYPE, TBGSettings::APPEARANCE_HEADER_CUSTOM);
                     TBGSettings::saveSetting(TBGSettings::SETTING_HEADER_ICON_ID, $file->getID());
                     break;
                 case 'clear_file':
                     TBGSettings::saveSetting(TBGSettings::SETTING_HEADER_ICON_TYPE, TBGSettings::APPEARANCE_HEADER_THEME);
                     break;
             }
         }
         $route = TBGContext::getRouting()->generate('configure_settings');
         if ($request->isAjaxCall()) {
             return $this->renderJSON(array('forward' => $route));
         } else {
             $this->forward($route);
         }
     }
     return $this->forward403($this->getI18n()->__("You don't have access to perform this action"));
 }
示例#9
0
 public function setKeyboardNavigationEnabled($value = true)
 {
     if (!$value) {
         TBGSettings::saveSetting(TBGSettings::SETTING_USER_KEYBOARD_NAVIGATION, false, 'core', null, $this->getID());
     } else {
         TBGSettings::deleteSetting(TBGSettings::SETTING_USER_KEYBOARD_NAVIGATION, 'core', null, $this->getID());
     }
 }
 public function saveSetting($setting, $value, $uid = 0, $scope = null)
 {
     $scope = $scope === null ? TBGContext::getScope()->getID() : $scope;
     return TBGSettings::saveSetting($setting, $value, $this->getName(), $scope, $uid);
 }
示例#11
0
 public static function loadFixtures(TBGScope $scope)
 {
     $available = new TBGUserstate();
     $available->setIsOnline();
     $available->setName('Available');
     $available->save();
     $offline = new TBGUserstate();
     $offline->setIsUnavailable();
     $offline->setName('Offline');
     $offline->save();
     $busy = new TBGUserstate();
     $busy->setIsUnavailable();
     $busy->setIsOnline();
     $busy->setName('Busy');
     $busy->save();
     $unavailable = new TBGUserstate();
     $unavailable->setIsUnavailable();
     $unavailable->setIsOnline();
     $unavailable->setName('Unavailable');
     $unavailable->save();
     $in_a_meeting = new TBGUserstate();
     $in_a_meeting->setIsUnavailable();
     $in_a_meeting->setIsInMeeting();
     $in_a_meeting->setName('In a meeting');
     $in_a_meeting->save();
     $coding = new TBGUserstate();
     $coding->setIsUnavailable();
     $coding->setIsBusy();
     $coding->setIsOnline();
     $coding->setName('Coding');
     $coding->save();
     $coffee = new TBGUserstate();
     $coffee->setIsUnavailable();
     $coffee->setIsBusy();
     $coffee->setIsOnline();
     $coffee->setName('On coffee break');
     $away = new TBGUserstate();
     $away->setIsUnavailable();
     $away->setIsOnline();
     $away->setIsBusy();
     $away->setIsAbsent();
     $away->setName('Away');
     $away->save();
     $vacation = new TBGUserstate();
     $vacation->setIsUnavailable();
     $vacation->setIsBusy();
     $vacation->setIsAbsent();
     $vacation->setName('On vacation');
     $vacation->save();
     TBGSettings::saveSetting(TBGSettings::SETTING_ONLINESTATE, $available->getID(), 'core', $scope->getID());
     TBGSettings::saveSetting(TBGSettings::SETTING_OFFLINESTATE, $offline->getID(), 'core', $scope->getID());
     TBGSettings::saveSetting(TBGSettings::SETTING_AWAYSTATE, $away->getID(), 'core', $scope->getID());
 }
 public function do_execute()
 {
     if (file_exists(THEBUGGENIE_PATH . 'installed')) {
         $this->cliEcho("The Bug Genie seems to already be installed.\n", 'red', 'bold');
         $this->cliEcho('Please remove the file ');
         $this->cliEcho(THEBUGGENIE_PATH . 'installed', 'white', 'bold');
         $this->cliEcho(' and try again.');
         $this->cliEcho("\n");
         return;
     }
     $this->cliEcho("\nWelcome to the \"The Bug Genie\" installation wizard!\n", 'white', 'bold');
     $this->cliEcho("This wizard will take you through the installation of The Bug Genie.\nRemember that you can also install The Bug Genie from your web-browser.\n");
     $this->cliEcho("Simply point your web-browser to the The Bug Genie subdirectory on your web server,\nand the installation will start.\n\n");
     $this->cliEcho("Press ENTER to continue with the installation: ");
     $this->pressEnterToContinue();
     $this->cliEcho("\n");
     $this->cliEcho("How to support future development\n", 'green', 'bold');
     $this->cliEcho("Even though this software has been provided to you free of charge,\ndeveloping it would not have been possible without support from our users.\n");
     $this->cliEcho("By making a donation, or buying a support contract you can help us continue development.\n\n");
     $this->cliEcho("If this software is valuable to you - please consider supporting it.\n\n");
     $this->cliEcho("More information about supporting The Bug Genie's development can be found here:\n");
     $this->cliEcho("http://www.thebuggenie.com/giving_back.php\n\n", 'blue', 'underline');
     $this->cliEcho("Press ENTER to continue: ");
     $this->pressEnterToContinue();
     $this->cliEcho("\n");
     try {
         $this->cliEcho("License information\n", 'green', 'bold');
         $this->cliEcho("This software is Open Source Initiative approved Open Source Software.\nOpen Source Initiative Approved is a trademark of the Open Source Initiative.\n\n");
         $this->cliEcho("True to the the Open Source Definition, The Bug Genie is released\nunder the MPL 1.1 only. You can read the full license here:\n");
         $this->cliEcho("http://www.opensource.org/licenses/mozilla1.1.php\n\n", 'blue', 'underline');
         if ($this->getProvidedArgument('accept_license') != 'yes') {
             $this->cliEcho("Before you can continue the installation, you need to confirm that you \nagree to be bound by the terms in this license.\n\n");
             $this->cliEcho("Do you agree to be bound by the terms in the MPL 1.1 license?\n(type \"yes\" to agree, anything else aborts the installation): ");
             if (!$this->askToAccept()) {
                 throw new Exception($this->cliEcho('You need to accept the license to continue', 'red', 'bold'));
             }
         } else {
             $this->cliEcho('You have accepted the license', 'yellow', 'bold');
             $this->cliEcho("\n\n");
         }
         $not_well = array();
         if (!is_writable('core/B2DB/')) {
             $not_well[] = 'b2db_perm';
         }
         if (!is_writable(THEBUGGENIE_PATH)) {
             $not_well[] = 'root';
         }
         if (count($not_well) > 0) {
             $this->cliEcho("\n");
             foreach ($not_well as $afail) {
                 switch ($afail) {
                     case 'b2db_perm':
                         $this->cliEcho("Could not write to the B2DB directory\n", 'red', 'bold');
                         $this->cliEcho('The folder ');
                         $this->cliEcho('include/B2DB', 'white', 'bold');
                         $this->cliEcho(' folder needs to be writable');
                         break;
                     case 'root':
                         $this->cliEcho("Could not write to the main directory\n", 'red', 'bold');
                         $this->cliEcho('The top level folder must be writable during installation');
                         break;
                 }
             }
             throw new Exception("\n\nYou need to correct the above errors before the installation can continue.");
         } else {
             $this->cliEcho("Step 1 - database information\n");
             if (file_exists('core/b2db_bootstrap.inc.php')) {
                 $this->cliEcho("You seem to already have completed this step successfully.\n");
                 if ($this->getProvidedArgument('use_existing_db_info') == 'yes') {
                     $this->cliEcho("\n");
                     $this->cliEcho("Using existing database information\n", 'yellow', 'bold');
                     $use_existing_db_info = true;
                 } else {
                     $this->cliEcho("Do you want to use the stored settings?\n", 'white', 'bold');
                     $this->cliEcho("\nType \"no\" to enter new settings, press ENTER to use existing: ", 'white', 'bold');
                     $use_existing_db_info = $this->askToDecline();
                 }
                 $this->cliEcho("\n");
             } else {
                 $use_existing_db_info = false;
             }
             if (!$use_existing_db_info) {
                 $this->cliEcho("The Bug Genie uses a database to store information. To be able to connect\nto your database, The Bug Genie needs some information, such as\ndatabase type, username, password, etc.\n\n");
                 $this->cliEcho("Please select what kind of database you are installing The Bug Genie on:\n");
                 B2DB::setHTMLException(false);
                 $db_types = array();
                 foreach (B2DB::getDBtypes() as $db_type => $db_desc) {
                     $db_types[] = $db_type;
                     $this->cliEcho(count($db_types) . ': ' . $db_desc . "\n", 'white', 'bold');
                 }
                 do {
                     $this->cliEcho('Enter the corresponding number for the database (1-' . count($db_types) . '): ');
                     $db_selection = $this->getInput();
                     if (!isset($db_types[(int) $db_selection - 1])) {
                         throw new Exception($db_selection . ' is not a valid database type selection');
                     }
                     $db_type = $db_types[(int) $db_selection - 1];
                     $this->cliEcho("Selected database type: ");
                     $this->cliEcho($db_type . "\n\n");
                     $this->cliEcho("Please enter the database hostname: \n");
                     $this->cliEcho('Database hostname [localhost]: ', 'white', 'bold');
                     $db_hostname = $this->getInput();
                     $db_hostname = $db_hostname == '' ? 'localhost' : $db_hostname;
                     $this->cliEcho("\nPlease enter the username The Bug Genie will use to connect to the database: \n");
                     $this->cliEcho('Database username: '******'white', 'bold');
                     $db_username = $this->getInput();
                     $this->cliEcho("Database password (press ENTER if blank): ", 'white', 'bold');
                     $db_password = $this->getInput();
                     $this->cliEcho("\nPlease enter the database The Bug Genie will use.\nIf it does not exist, The Bug Genie will create it for you.\n(the default database name is ");
                     $this->cliEcho("thebuggenie_db", 'white', 'bold');
                     $this->cliEcho(" - press ENTER to use that):\n");
                     $this->cliEcho('Database name: ', 'white', 'bold');
                     $db_name = $this->getInput('thebuggenie_db');
                     $this->cliEcho("\n");
                     $this->cliEcho("The following settings will be used:\n");
                     $this->cliEcho("Database type: \t\t", 'white', 'bold');
                     $this->cliEcho($db_type . "\n");
                     $this->cliEcho("Database hostname: \t", 'white', 'bold');
                     $this->cliEcho($db_hostname . "\n");
                     $this->cliEcho("Database username: \t", 'white', 'bold');
                     $this->cliEcho($db_username . "\n");
                     $this->cliEcho("Database password: \t", 'white', 'bold');
                     $this->cliEcho($db_password . "\n");
                     $this->cliEcho("Database name: \t\t", 'white', 'bold');
                     $this->cliEcho($db_name . "\n");
                     $this->cliEcho("\nIf these settings are ok, press ENTER, or anything else to retry: ");
                     $e_ok = $this->askToDecline();
                 } while (!$e_ok);
                 try {
                     B2DB::setHost($db_hostname);
                     B2DB::setUname($db_username);
                     B2DB::setPasswd($db_password);
                     B2DB::setDBtype($db_type);
                     B2DB::initialize();
                     $engine_path = B2DB::getEngineClassPath();
                     if ($engine_path !== null) {
                         TBGContext::addClasspath($engine_path);
                     } else {
                         throw new Exception("Cannot initialize the B2DB engine");
                     }
                     B2DB::doConnect();
                     B2DB::createDatabase($db_name);
                     B2DB::setDBname($db_name);
                     B2DB::doConnect();
                 } catch (Exception $e) {
                     throw new Exception("Could not connect to the database:\n" . $e->getMessage());
                 }
                 B2DB::setDBname($db_name);
                 B2DB::doSelectDB();
                 $this->cliEcho("\nSuccessfully connected to the database.\n", 'green');
                 $this->cliEcho("Press ENTER to continue ... ");
                 $this->pressEnterToContinue();
                 $this->cliEcho("\n");
                 $this->cliEcho("Saving database connection information ... ", 'white', 'bold');
                 $this->cliEcho("\n");
                 B2DB::saveConnectionParameters(THEBUGGENIE_CORE_PATH . 'b2db_bootstrap.inc.php');
                 $this->cliEcho("Successfully saved database connection information.\n", 'green');
                 $this->cliEcho("\n");
             } else {
                 B2DB::initialize(THEBUGGENIE_CORE_PATH . 'b2db_bootstrap.inc.php');
                 $this->cliEcho("Successfully connected to the database.\n", 'green');
                 if ($this->getProvidedArgument('use_existing_db_info') != 'yes') {
                     $this->cliEcho("Press ENTER to continue ... ");
                     $this->pressEnterToContinue();
                 }
             }
             $this->cliEcho("\nThe Bug Genie needs some server settings to function properly...\n\n");
             do {
                 $this->cliEcho("URL rewriting\n", 'cyan', 'bold');
                 $this->cliEcho("The Bug Genie uses a technique called \"url rewriting\" - which allows for pretty\nURLs such as ") . $this->cliEcho('/issue/1', 'white', 'bold') . $this->cliEcho(' instead of ') . $this->cliEcho("viewissue.php?issue_id=1\n", 'white', 'bold');
                 $this->cliEcho("Make sure you have read the URL_REWRITE document located in the root\nfolder, or at http://www.thebuggenie.com before you continue\n");
                 if (!$this->hasProvidedArgument('url_subdir')) {
                     $this->cliEcho("Press ENTER to continue ... ");
                     $this->pressEnterToContinue();
                 }
                 $this->cliEcho("\n");
                 $this->cliEcho("The Bug Genie subdir\n", 'white', 'bold');
                 $this->cliEcho("This is the sub-path of the Web server where The Bug Genie will be located.\n");
                 if ($this->hasProvidedArgument('url_subdir')) {
                     $this->cliEcho('The Bug Genie subdir: ', 'white', 'bold');
                     $url_subdir = $this->getProvidedArgument('url_subdir');
                     $this->cliEcho($url_subdir, 'yellow', 'bold');
                     $this->cliEcho("\n");
                 } else {
                     $this->cliEcho('Start and end this with a forward slash', 'white', 'bold');
                     $this->cliEcho(". (ex: \"/thebuggenie/\")\nIf The Bug Genie is running at the root directory, just type \"/\" (without the quotes)\n\n");
                     $this->cliEcho('The Bug Genie subdir: ', 'white', 'bold');
                     $url_subdir = $this->getInput();
                 }
                 $this->cliEcho("\n");
                 $this->cliEcho("The Bug Genie will now be accessible at\n");
                 $this->cliEcho("http://example.com" . $url_subdir, 'white', 'bold');
                 if ($this->hasProvidedArgument('url_subdir')) {
                     $this->cliEcho("\n");
                     $this->cliEcho("Using existing values", 'yellow', 'bold');
                     $this->cliEcho("\n");
                     $e_ok = true;
                 } else {
                     $this->cliEcho("\nPress ENTER if ok, or \"no\" to try again: ");
                     $e_ok = $this->askToDecline();
                 }
                 $this->cliEcho("\n");
             } while (!$e_ok);
             if ($this->getProvidedArgument('setup_htaccess') != 'yes') {
                 $this->cliEcho("Setup can autoconfigure your .htaccess file (located in the thebuggenie/ subfolder), so you don't have to.\n");
                 $this->cliEcho('Would you like setup to auto-generate the .htaccess file for you?');
                 $this->cliEcho("\nPress ENTER if ok, or \"no\" to not set up the .htaccess file: ");
                 $htaccess_ok = $this->askToDecline();
             } else {
                 $this->cliEcho('Autoconfiguring .htaccess', 'yellow', 'bold');
                 $this->cliEcho("\n");
                 $htaccess_ok = true;
             }
             $this->cliEcho("\n");
             if ($htaccess_ok) {
                 if (!is_writable(THEBUGGENIE_PATH . 'thebuggenie/') || file_exists(THEBUGGENIE_PATH . 'thebuggenie/.htaccess') && !is_writable(THEBUGGENIE_PATH . 'thebuggenie/.htaccess')) {
                     $this->cliEcho("Permission denied when trying to save the [main folder]/thebuggenie/.htaccess\n", 'red', 'bold');
                     $this->cliEcho("You will have to set up the .htaccess file yourself. See the README file for more information.\n", 'white', 'bold');
                     $this->cliEcho('Please note: ', 'white', 'bold');
                     $this->cliEcho("The Bug Genie will not function properly until the .htaccess file is properly set up!\n");
                 } else {
                     $content = str_replace('###PUT URL SUBDIRECTORY HERE###', $url_subdir, file_get_contents(THEBUGGENIE_CORE_PATH . 'templates/htaccess.template'));
                     file_put_contents(THEBUGGENIE_PATH . 'thebuggenie/.htaccess', $content);
                     if (file_get_contents(THEBUGGENIE_PATH . 'thebuggenie/.htaccess') != $content) {
                         $this->cliEcho("Permission denied when trying to save the [main folder]/thebuggenie/.htaccess\n", 'red', 'bold');
                         $this->cliEcho("You will have to set up the .htaccess file yourself. See the README file for more information.\n", 'white', 'bold');
                         $this->cliEcho('Please note: ', 'white', 'bold');
                         $this->cliEcho("The Bug Genie will not function properly until the .htaccess file is properly set up!\n");
                     } else {
                         $this->cliEcho("The .htaccess file was successfully set up...\n", 'green', 'bold');
                     }
                 }
             } else {
                 $this->cliEcho("Skipping .htaccess auto-setup.");
             }
             if ($this->getProvidedArgument('setup_htaccess') != 'yes') {
                 $this->cliEcho("Press ENTER to continue ... ");
                 $this->pressEnterToContinue();
                 $this->cliEcho("\n");
             }
             $enable_modules = array();
             if ($this->getProvidedArgument('enable_all_modules') != 'yes') {
                 $this->cliEcho("You will now get a list of available modules.\nTo enable the module after installation, just press ENTER.\nIf you don't want to enable the module, type \"no\".\nRemember that all these modules can be disabled/uninstalled after installation.\n\n");
             }
             $this->cliEcho("Enable incoming and outgoing email? ", 'white', 'bold') . $this->cliEcho('(yes): ');
             $enable_modules['mailing'] = $this->getProvidedArgument('enable_all_modules') == 'yes' ? true : $this->askToDecline();
             if ($this->getProvidedArgument('enable_all_modules') == 'yes') {
                 $this->cliEcho("Yes\n", 'yellow', 'bold');
             }
             $this->cliEcho("Enable communication with version control systems (i.e. svn)? ", 'white', 'bold') . $this->cliEcho('(yes): ');
             $enable_modules['vcs_integration'] = $this->getProvidedArgument('enable_all_modules') == 'yes' ? true : $this->askToDecline();
             if ($this->getProvidedArgument('enable_all_modules') == 'yes') {
                 $this->cliEcho("Yes\n", 'yellow', 'bold');
             }
             $enable_modules['publish'] = true;
             $this->cliEcho("\n");
             $this->cliEcho("Creating tables ...\n", 'white', 'bold');
             $tables_path = THEBUGGENIE_CORE_PATH . 'classes' . DIRECTORY_SEPARATOR . 'B2DB' . DIRECTORY_SEPARATOR;
             TBGContext::addClasspath($tables_path);
             $tables_path_handle = opendir($tables_path);
             $tables_created = array();
             while ($table_class_file = readdir($tables_path_handle)) {
                 if (($tablename = substr($table_class_file, 0, strpos($table_class_file, '.'))) != '') {
                     B2DB::getTable($tablename)->create();
                     $this->cliEcho("Creating table {$tablename}\n", 'white', 'bold');
                 }
             }
             $this->cliEcho("\n");
             $this->cliEcho("All tables successfully created...\n\n", 'green', 'bold');
             $this->cliEcho("Setting up initial scope... \n", 'white', 'bold');
             TBGContext::reinitializeI18n('en_US');
             $scope = new TBGScope();
             $scope->setName('The default scope');
             $scope->addHostname('*');
             $scope->setEnabled();
             TBGContext::setScope($scope);
             $scope->save();
             TBGSettings::saveSetting('language', 'en_US');
             $this->cliEcho("Initial scope setup successfully... \n\n", 'green', 'bold');
             $this->cliEcho("Setting up modules... \n", 'white', 'bold');
             try {
                 foreach ($enable_modules as $module => $install) {
                     if ((bool) $install && file_exists(THEBUGGENIE_MODULES_PATH . $module . DS . 'module')) {
                         $this->cliEcho("Installing {$module}... \n");
                         TBGModule::installModule($module);
                         $this->cliEcho("Module {$module} installed successfully...\n", 'green');
                     }
                 }
                 $this->cliEcho("\n");
                 $this->cliEcho("All modules installed successfully...\n", 'green', 'bold');
                 $this->cliEcho("\n");
                 $this->cliEcho("Finishing installation... \n", 'white', 'bold');
                 if (!is_writable(THEBUGGENIE_PATH . 'installed')) {
                     $this->cliEcho("\n");
                     $this->cliEcho("Could not create the 'installed' file.\n", 'red', 'bold');
                     $this->cliEcho("Please create the file ");
                     $this->cliEcho(THEBUGGENIE_PATH . "installed\n", 'white', 'bold');
                     $this->cliEcho("with the following line inside:\n");
                     $this->cliEcho('3.0, installed ' . date('d.m.Y H:i'), 'blue', 'bold');
                     $this->cliEcho("\n");
                     $this->cliEcho("This can be done by running the following command when installation has finished:\n");
                     $this->cliEcho('echo "3.0, installed ' . date('d.m.Y H:i') . '" > ' . THEBUGGENIE_PATH . 'installed', 'white', 'bold');
                     $this->cliEcho("\n");
                     $this->cliEcho("Press ENTER to continue ... ");
                     $this->pressEnterToContinue();
                     $this->cliEcho("\n");
                     $this->cliEcho("\n");
                 } else {
                     file_put_contents(THEBUGGENIE_PATH . 'installed', '3.0, installed ' . date('d.m.Y H:i'));
                 }
                 $this->cliEcho("The installation was completed successfully!\n", 'green', 'bold');
                 $this->cliEcho("\nTo use The Bug Genie, access http://example.com" . $url_subdir . "index.php with a web-browser.\n");
                 $this->cliEcho("The default username is ") . $this->cliEcho('Administrator') . $this->cliEcho(' and the password is ') . $this->cliEcho('admin');
                 $this->cliEcho("\n\nFor support, please visit ") . $this->cliEcho('http://www.thebuggenie.com/', 'blue', 'underline');
                 $this->cliEcho("\n");
             } catch (Exception $e) {
                 throw new Exception("Could not install the {$module} module:\n" . $e->getMessage());
             }
         }
     } catch (Exception $e) {
         $this->cliEcho("\n\nThe installation was interrupted\n", 'red');
         $this->cliEcho($e->getMessage() . "\n");
         var_dump($e->getTraceAsString());
         die;
     }
     $this->cliEcho("\n");
 }
示例#13
0
 public static function loadFixtures(TBGScope $scope)
 {
     $workflow = new TBGWorkflow();
     $workflow->setName("Default workflow");
     $workflow->setDescription("This is the default workflow. It is used by all projects with no specific workflow selected, and for issue types with no specific workflow specified. This workflow cannot be edited or removed.");
     $workflow->setScope($scope->getID());
     $workflow->save();
     TBGSettings::saveSetting(TBGSettings::SETTING_DEFAULT_WORKFLOW, $workflow->getID(), 'core', $scope->getID());
     TBGWorkflowStep::loadFixtures($scope, $workflow);
 }
示例#14
0
 /**
  * Performs post-save actions on user objects
  * 
  * This includes firing off events for modules to listen to (e.g. so 
  * activation emails can be sent out), and setting up a default 
  * dashboard for the new user.
  * 
  * @param boolean $is_new Whether this is a new object or not (automatically passed to the function from B2DB)
  */
 protected function _postSave($is_new)
 {
     if ($is_new) {
         $event = TBGEvent::createNew('core', 'TBGUser::createNew', $this);
         $event->trigger();
         // If the event isn't processed we automatically enable the user
         // since we can be sure no activation email has been sent out
         if (!$event->isProcessed()) {
             $this->setEnabled();
             $this->setActivated();
             $this->save();
         }
         // Set up a default dashboard for the user
         TBGUserDashboardViewsTable::getTable()->addView($this->getID(), array('type' => TBGDashboard::DASHBOARD_VIEW_PREDEFINED_SEARCH, 'id' => TBGContext::PREDEFINED_SEARCH_MY_REPORTED_ISSUES));
         TBGUserDashboardViewsTable::getTable()->addView($this->getID(), array('type' => TBGDashboard::DASHBOARD_VIEW_PREDEFINED_SEARCH, 'id' => TBGContext::PREDEFINED_SEARCH_MY_ASSIGNED_OPEN_ISSUES));
         TBGUserDashboardViewsTable::getTable()->addView($this->getID(), array('type' => TBGDashboard::DASHBOARD_VIEW_LOGGED_ACTION, 'id' => 0));
     }
     if ($this->_timezone !== null) {
         TBGSettings::saveSetting('timezone', $this->_timezone, 'core', null, $this->getID());
     } else {
         TBGSettings::saveSetting('timezone', 'sys', 'core', null, $this->getID());
     }
     if ($this->_language != null) {
         TBGSettings::saveSetting('language', $this->_language, 'core', null, $this->getID());
     } else {
         TBGSettings::saveSetting('language', 'sys', 'core', null, $this->getID());
     }
 }
示例#15
0
 protected function _upgradeFrom3dot2(TBGRequest $request)
 {
     set_time_limit(0);
     TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . 'installation' . DS . 'classes' . DS . 'upgrade_3.2');
     foreach (array('publish', 'mailing') as $module) {
         TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . $module . DS . 'classes');
         TBGContext::addAutoloaderClassPath(THEBUGGENIE_MODULES_PATH . $module . DS . 'classes' . DS . 'B2DB');
     }
     TBGMilestonesTable::getTable()->upgrade(TBGMilestonesTable3dot2::getTable());
     TBGArticlesTable::getTable()->upgrade(TBGArticlesTable3dot2::getTable());
     TBGProjectsTable::getTable()->upgrade(TBGProjectsTable3dot2::getTable());
     TBGLogTable::getTable()->upgrade(TBGLogTable3dot2::getTable());
     TBGUsersTable::getTable()->upgrade(TBGUsersTable3dot2::getTable());
     TBGIssuesTable::getTable()->upgrade(TBGIssuesTable3dot2::getTable());
     TBGWorkflowsTable::getTable()->upgrade(TBGWorkflowsTable3dot2::getTable());
     TBGIncomingEmailAccountTable::getTable()->upgrade(TBGIncomingEmailAccountTable3dot2::getTable());
     TBGIssueSpentTimesTable::getTable()->upgrade(TBGIssueSpentTimesTable3dot2::getTable());
     TBGCommentsTable::getTable()->upgrade(TBGCommentsTable3dot2::getTable());
     TBGSavedSearchesTable::getTable()->upgrade(TBGSavedSearchesTable3dot2::getTable());
     TBGSettingsTable::getTable()->upgrade(TBGSettingsTable3dot2::getTable());
     TBGNotificationsTable::getTable()->upgrade(TBGNotificationsTable3dot2::getTable());
     TBGPermissionsTable::getTable()->upgrade(TBGPermissionsTable3dot2::getTable());
     TBGUserArticlesTable::getTable()->create();
     TBGApplicationPasswordsTable::getTable()->create();
     TBGUserNotificationSettingsTable::getTable()->create();
     $transaction = \b2db\Core::startTransaction();
     // Upgrade user passwords
     switch ($request['upgrade_passwords']) {
         case 'manual':
             $password = $request['manul_password'];
             foreach (TBGUsersTable::getTable()->selectAll() as $user) {
                 $user->setPassword($password);
                 $user->save();
             }
             break;
         case 'auto':
             $field = $request['upgrade_passwords_pick'] == 'username' ? 'username' : 'email';
             foreach (TBGUsersTable::getTable()->selectAll() as $user) {
                 if ($field == 'username' && trim($user->getUsername())) {
                     $user->setPassword(trim($user->getUsername()));
                     $user->save();
                 } elseif ($field == 'email' && trim($user->getEmail())) {
                     $user->setPassword(trim($user->getEmail()));
                     $user->save();
                 }
             }
             break;
     }
     $adminuser = TBGUsersTable::getTable()->selectById(1);
     $adminuser->setPassword($request['admin_password']);
     $adminuser->save();
     // Add new settings
     TBGSettings::saveSetting(TBGSettings::SETTING_SERVER_TIMEZONE, 'core', date_default_timezone_get(), 0, 1);
     foreach ($request->getParameter('status') as $scope_id => $status_id) {
         $scope = TBGScopesTable::getTable()->selectById((int) $scope_id);
         if ($scope instanceof TBGScope) {
             foreach (TBGWorkflowsTable::getTable()->getAll((int) $scope_id) as $workflow) {
                 $transition = new TBGWorkflowTransition();
                 $steps = $workflow->getSteps();
                 $step = array_shift($steps);
                 $step->setLinkedStatusID((int) $status_id);
                 $step->save();
                 $transition->setOutgoingStep($step);
                 $transition->setName('Issue created');
                 $transition->setWorkflow($workflow);
                 $transition->setScope($scope);
                 $transition->setDescription('This is the initial transition for issues using this workflow');
                 $transition->save();
                 $workflow->setInitialTransition($transition);
                 $workflow->save();
             }
             TBGActivityType::loadFixtures($scope);
         }
     }
     $transaction->commitAndEnd();
     TBGContext::finishUpgrading();
     TBGContext::getModule('mailing')->upgradeFrom3dot2();
     $this->upgrade_complete = true;
 }
示例#16
0
 public function runSaveColumnSettings(TBGRequest $request)
 {
     TBGSettings::saveSetting('search_scs_' . $request['template'], join(',', $request['columns']));
     return $this->renderJSON(array('failed' => false, 'message' => TBGContext::getI18n()->__('Visible columns has been set successfully')));
 }
示例#17
0
 public function runSaveAuthentication(TBGRequest $request)
 {
     if (TBGContext::getRequest()->isMethod(TBGRequest::POST)) {
         $this->forward403unless($this->access_level == TBGSettings::ACCESS_FULL);
         $settings = array(TBGSettings::SETTING_AUTH_BACKEND, 'register_message', 'forgot_message', 'changepw_message', 'changedetails_message');
         foreach ($settings as $setting) {
             if (TBGContext::getRequest()->getParameter($setting) !== null) {
                 $value = TBGContext::getRequest()->getParameter($setting);
                 TBGSettings::saveSetting($setting, $value);
             }
         }
     }
 }
示例#18
0
 protected function _upgradeFrom3dot0()
 {
     // Add new tables
     TBGScopeHostnamesTable::getTable()->create();
     // Add classpath for existing old tables used for upgrade
     TBGContext::addClasspath(THEBUGGENIE_MODULES_PATH . 'installation' . DS . 'classes' . DS . 'upgrade_3.0');
     // Upgrade old tables
     TBGScopesTable::getTable()->upgrade(TBGScopesTable3dot0::getTable());
     TBGIssueFieldsTable::getTable()->upgrade(TBGIssueFieldsTable3dot0::getTable());
     // Upgrade all modules
     foreach (TBGContext::getModules() as $module) {
         if (method_exists($module, 'upgradeFrom3dot0')) {
             $module->upgradeFrom3dot0();
         }
     }
     // Start a transaction to preserve the upgrade path
     $transaction = B2DB::startTransaction();
     // Add votes to feature requests for default issue type scheme
     $its = new TBGIssuetypeScheme(1);
     foreach (TBGIssuetype::getAll() as $fr) {
         if ($fr instanceof TBGIssuetype) {
             if (in_array($fr->getKey(), array('featurerequest', 'bugreport', 'enhancement'))) {
                 $its->setFieldAvailableForIssuetype($fr, 'votes');
             }
         }
     }
     $ut = TBGUsersTable::getTable();
     $crit = $ut->getCriteria();
     $crit->addUpdate(TBGUsersTable::PRIVATE_EMAIL, true);
     $ut->doUpdate($crit);
     // Add default gravatar setting
     TBGSettings::saveSetting(TBGSettings::SETTING_ENABLE_GRAVATARS, 1);
     $trans_crit = TBGWorkflowTransitionsTable::getTable()->getCriteria();
     $trans_crit->addWhere(TBGWorkflowTransitionsTable::NAME, 'Request more information');
     $trans_crit->addWhere(TBGWorkflowTransitionsTable::WORKFLOW_ID, 1);
     $trans_row = TBGWorkflowTransitionsTable::getTable()->doSelectOne($trans_crit);
     if ($trans_row) {
         $transition = new TBGWorkflowTransition($trans_row->get(TBGWorkflowTransitionsTable::ID), $trans_row);
         $transition->setTemplate('main/updateissueproperties');
         $transition->save();
     }
     // End transaction and finalize upgrade
     $transaction->commitAndEnd();
     $this->upgrade_complete = true;
 }