Esempio n. 1
0
 /**
  * action_sendmagic 
  * 
  * @access public
  * @return array
  */
 function action_sendmagic()
 {
     global $db, $baseurl;
     // Check that the username exists
     if (strpos(Post::val('user_name'), '@') === false) {
         $user = Flyspray::getUserDetails(Flyspray::UserNameToId(Post::val('user_name')));
     } else {
         $user_id = $db->x->GetOne('SELECT user_id FROM {users} WHERE email_address = ?', null, Post::val('user_name'));
         $user = Flyspray::getUserDetails($user_id);
     }
     // If the username doesn't exist, throw an error
     if (!is_array($user) || !count($user)) {
         return array(ERROR_RECOVER, L('usernotexist'));
     }
     $magic_url = md5(uniqid(mt_rand(), true));
     // Insert the random "magic url" into the user's profile
     $db->x->execParam('UPDATE {users}
                           SET magic_url = ?
                         WHERE user_id = ?', array($magic_url, $user['user_id']));
     Notifications::send($user['user_id'], ADDRESS_USER, NOTIFY_PW_CHANGE, array($baseurl, $magic_url));
     return array(SUBMIT_OK, L('magicurlsent'));
 }
Esempio n. 2
0
 /**
  * Closes a task
  * @param integer $task_id
  * @param integer $reason
  * @param string $comment
  * @param bool $mark100
  * @access public
  * @return bool
  * @version 1.0
  */
 function close_task($task_id, $reason, $comment, $mark100 = true)
 {
     global $db, $user, $fs;
     $task = Flyspray::GetTaskDetails($task_id);
     if (!$user->can_close_task($task)) {
         return false;
     }
     if ($task['is_closed']) {
         return false;
     }
     $db->x->autoExecute('{tasks}', array('date_closed' => time(), 'closed_by' => $user->id, 'closure_comment' => $comment, 'is_closed' => 1, 'resolution_reason' => $reason, 'last_edited_time' => time(), 'last_edited_by' => $user->id, 'percent_complete' => (bool) $mark100 * 100), MDB2_AUTOQUERY_UPDATE, sprintf('task_id = %d', $task_id));
     if ($mark100) {
         Flyspray::logEvent($task_id, 3, 100, $task['percent_complete'], 'percent_complete');
     }
     // [RED] Update last changed date
     $db->x->execParam('UPDATE {redundant} SET last_changed_time = ?,
                               last_changed_by_real_name = ?, last_changed_by_user_name = ?,
                               closed_by_real_name = ?, closed_by_user_name = ?
                         WHERE task_id = ?', array(time(), $user->infos['real_name'], $user->infos['user_name'], $user->infos['real_name'], $user->infos['user_name'], $task_id));
     Notifications::send($task_id, ADDRESS_TASK, NOTIFY_TASK_CLOSED);
     Flyspray::logEvent($task_id, 2, $reason, $comment);
     // If there's an admin request related to this, close it
     $db->x->autoExecute('{admin_requests}', array('resolved_by' => $user->id, 'time_resolved' => time()), MDB2_AUTOQUERY_UPDATE, sprintf('task_id = %d AND request_type = 1', $task_id));
     // duplicate
     if ($reason == $fs->prefs['resolution_dupe']) {
         $look = array('FS#', 'bug ');
         foreach ($fs->projects as $project) {
             $look[] = preg_quote($project['project_prefix'] . '#', '/');
         }
         preg_match("/\\b(" . implode('|', $look) . ")(\\d+)\\b/", $comment, $dupe_of);
         if (count($dupe_of) >= 2) {
             $existing = $db->x->getOne('SELECT count(*) FROM {related} WHERE this_task = ? AND related_task = ? AND related_type = 1', null, array($task_id, $dupe_of[1]));
             if (!$existing) {
                 $db->x->autoExecute('{related}', array('this_task' => $task_id, 'related_task' => $dupe_of[1], 'related_type' => 1));
             }
             Backend::add_vote($task['opened_by'], $dupe_of[1]);
         }
     }
     return true;
 }
Esempio n. 3
0
 function action_sendcode()
 {
     global $user, $db, $fs, $conf, $baseurl;
     if (!Post::val('user_name') || !Post::val('real_name') || !Post::val('email_address')) {
         // If the form wasn't filled out correctly, show an error
         return array(ERROR_RECOVER, L('registererror'));
     }
     $email = Post::val('email_address');
     $jabber_id = Post::val('jabber_id');
     //email is mandatory
     if (!$email || !Flyspray::check_email($email)) {
         return array(ERROR_RECOVER, L('novalidemail'));
     }
     //jabber_id is optional
     if ($jabber_id && !Jabber::check_jid($jabber_id)) {
         return array(ERROR_RECOVER, L('novalidjabber'));
     }
     $user_name = Backend::clean_username(Post::val('user_name'));
     // Limit lengths
     $real_name = substr(trim(Post::val('real_name')), 0, 100);
     // Remove doubled up spaces and control chars
     $real_name = preg_replace('![\\x00-\\x1f\\s]+!u', ' ', $real_name);
     if (!$user_name || !$real_name) {
         return array(ERROR_RECOVER, L('entervalidusername'));
     }
     // Delete registration codes older than 24 hours
     $yesterday = time() - 86400;
     $db->x->execParam('DELETE FROM {registrations} WHERE reg_time < ?', $yesterday);
     $taken = $db->x->getRow('SELECT u.user_id FROM {users} u, {registrations} r
                               WHERE u.user_name = ? OR r.user_name = ?', null, array($user_name, $user_name));
     if ($taken) {
         return array(ERROR_RECOVER, L('usernametaken'));
     }
     $taken = $db->x->getRow("SELECT user_id\n                                   FROM {users}\n                                  WHERE jabber_id = ? AND jabber_id != NULL\n                                        OR email_address = ? AND email_address != NULL", null, array($jabber_id, $email));
     if ($taken) {
         return array(ERROR_RECOVER, L('emailtaken'));
     }
     if ($fs->prefs['use_recaptcha']) {
         $solution = new reCAPTCHA_Solution();
         $solution->privatekey = $fs->prefs['recaptcha_priv_key'];
         $solution->challenge = Post::val('recaptcha_challenge_field');
         $solution->response = Post::val('recaptcha_response_field');
         $solution->remoteip = $_SERVER['REMOTE_ADDR'];
         if (!$solution->isValid()) {
             return array(ERROR_RECOVER, $solution->error_code);
         }
     }
     $magic_url = substr(md5(uniqid(rand(), true)), 0, 20);
     //send the email first.
     if (Notifications::send(Post::val('email_address'), ADDRESS_EMAIL, NOTIFY_CONFIRMATION, array($baseurl, $magic_url, $user_name))) {
         //email sent succefully, now update the database.
         $reg_values = array('reg_time' => time(), 'user_name' => $user_name, 'real_name' => $real_name, 'email_address' => Post::val('email_address'), 'jabber_id' => Post::val('jabber_id'), 'notify_type' => Post::num('notify_type'), 'magic_url' => $magic_url, 'time_zone' => Post::num('time_zone'));
         // Insert everything into the database
         $query = $db->x->autoExecute('{registrations}', $reg_values);
         if (!PEAR::isError($query)) {
             return array(SUBMIT_OK, L('codesent'), $baseurl);
         }
     } else {
         return array(ERROR_INPUT, L('codenotsent'));
     }
 }
Esempio n. 4
0
 function action_requestclose($task)
 {
     global $proj, $user, $db;
     if (Post::val('action') == 'requestclose') {
         Flyspray::AdminRequest(1, $proj->id, $task['task_id'], $user->id, Post::val('reason_given'));
         Flyspray::logEvent($task['task_id'], 20, Post::val('reason_given'));
     } else {
         Flyspray::AdminRequest(2, $proj->id, $task['task_id'], $user->id, Post::val('reason_given'));
         Flyspray::logEvent($task['task_id'], 21, Post::val('reason_given'));
         Backend::add_notification($user->id, $task['task_id']);
     }
     // Now, get the project managers' details for this project
     $pms = $db->x->GetCol('SELECT  u.user_id
                           FROM  {users} u
                      LEFT JOIN  {users_in_groups} uig ON u.user_id = uig.user_id
                      LEFT JOIN  {groups} g ON uig.group_id = g.group_id
                          WHERE  g.project_id = ? AND g.manage_project = 1', null, $proj->id);
     if (count($pms)) {
         Notifications::send($pms, ADDRESS_USER, NOTIFY_PM_REQUEST, array('task_id' => $task['task_id']));
     }
     return array(SUBMIT_OK, L('adminrequestmade'));
 }