/**
* Remove items of certain type and autho
*
* This method can be used to remove spam comments or attachments
* 
* person - id of person who did the changes
* data - date to with revert changes
* delete_history  (Default off) - Reverting can't be undone! The person's modification are lost forever!
*                                 This can be useful on massive changes to avoid sending huge
*                                 notification mails.
*/
function itemsRemoveMany()
{
    global $PH;
    global $auth;
    $PH->go_submit = 'itemsRemoveManyPreview';
    $page = new Page();
    $page->cur_tab = 'home';
    $page->title = __('Remove many items');
    $page->title_minor = '';
    echo new PageHeader();
    echo new PageContentOpen();
    require_once confGet('DIR_STREBER') . "render/render_form.inc.php";
    $form = new PageForm();
    $form->button_cancel = true;
    ### author
    $people = array(0 => 'anybody');
    foreach (Person::getPeople() as $p) {
        $people[$p->id] = $p->nickname;
    }
    $form->add(new Form_Dropdown('person', __("Created by"), array_flip($people), 0));
    $form->add(new Form_Checkbox('type_comment', __("Comments"), true));
    $form->add(new Form_Checkbox('only_spam_comments', __("Only comments that look like spam"), true));
    $form->add(new Form_Checkbox('type_task', __("Tasks"), false));
    $form->add(new Form_Checkbox('type_topic', __("Topic"), false));
    $form->add(new Form_DateTime('time_start', __('starting at', 'label for time filter'), getGMTString(time() - 7 * 24 * 60 * 60)));
    $form->add(new Form_DateTime('time_end', __('ending at', 'label for time filter'), getGMTString(time() + 60 * 60)));
    echo $form;
    echo new PageContentClose();
    echo new PageHtmlEnd();
}
Example #2
0
 static function getFromItem($item)
 {
     ### get changes ###
     $all_changes = $all_changes = ItemChange::getItemChanges(array('item' => $item->id));
     $versions = array(new ItemVersion(array('version_number' => 1, 'date_from' => $item->created, 'author' => $item->created_by)));
     $last_version = $versions[0];
     $version_number = 2;
     $modified_last = NULL;
     foreach ($all_changes as $cf) {
         $flag_new = false;
         if ($cf->modified != $modified_last) {
             $flag_new = true;
         }
         if (isset($last_version) && $last_version->author != $cf->modified_by) {
             $flag_new;
         }
         if ($flag_new) {
             $version = new ItemVersion(array('version_number' => $version_number++, 'date_from' => $cf->modified, 'author' => $cf->modified_by));
             $modified_last = $cf->modified;
             $versions[] = $version;
             $last_version = $versions[count($versions) - 2];
             $last_version->date_to = $cf->modified;
         }
         $last_version->values[$cf->field] = $cf->value_old;
         #$versions[count($versions)-1]->values[$cf->field]= 'bla';
     }
     ### finally fill out latest values ###
     if (count($versions) > 1) {
         foreach ($versions[count($versions) - 2]->values as $fname => $value) {
             $versions[count($versions) - 1]->values[$fname] = $item->{$fname};
         }
         $versions[count($versions) - 1]->date_to = getGMTString();
         ### fill in next values ###
         $changed = array();
         foreach (array_reverse($versions) as $v) {
             foreach ($v->values as $name => $value) {
                 if (isset($changed[$name])) {
                     $v->values_next[$name] = $changed[$name];
                 } else {
                     $v->values_next[$name] = $item->{$name};
                 }
                 $changed[$name] = $value;
             }
         }
     }
     return $versions;
 }
Example #3
0
/**
* Mark all items of a person as been viewed @ingroup pages
*
* if an item is viewed (not changed) depends on two facts:
* 1. item_person item exists
* 2. item.modfied < person.date_highlight_changes
*/
function personAllItemsViewed()
{
    global $PH;
    global $auth;
    $id = intval(getOnePassedId('person', 'people_*'));
    if ($id) {
        if ($id == $auth->cur_user->id) {
            $person = $auth->cur_user;
        } else {
            $person = Person::getEditableById($id);
            if (!$person) {
                $PH->abortWarning("Could not get object...");
            }
        }
    } else {
        ### profile and login ###
        if ($auth->cur_user->user_rights & RIGHT_PERSON_EDIT_RIGHTS) {
            $person = $auth->cur_user;
        } else {
            $PH->abortWarning("Could not get object...");
        }
    }
    $person->date_highlight_changes = getGMTString();
    $person->update(array('date_highlight_changes'), false);
    /**
     * note, we have to update the current user to get an emmidate effect
     */
    if ($auth->cur_user->id == $person->id) {
        $auth->cur_user->date_highlight_changes = getGMTString();
    }
    new FeedbackMessage(sprintf(__("Marked all previous items as viewed.")));
    if (!$PH->showFromPage()) {
        $PH->show('personView', array('person' => $person->id));
    }
}
Example #4
0
 /**
  * mark_delete (sets object-state to -1)
  *
  * returns true on success
  */
 public function delete()
 {
     global $auth;
     if (!$this->id) {
         trigger_error("Deleting requires id", E_USER_WARNING);
     }
     ### check user-rights ###
     if ($pp = $this->getProjectPerson()) {
         $pub_level = $this->pub_level;
         ### owned ###
         if ($this->created_by == $pp->person) {
             $pub_level = PUB_LEVEL_OWNED;
         }
         ### is item editable ?
         if ($pub_level >= $pp->level_delete) {
             ### AND below delete-level ###
             if ($pub_level >= $pp->level_delete) {
                 $this->state = -1;
                 $this->deleted_by = $auth->cur_user->id;
                 $this->deleted = getGMTString();
                 $this->update();
                 #--- deleting yourself? ----
                 return true;
             }
         }
     } else {
         if ($this->project == 0) {
             if ($auth->cur_user) {
                 $this->state = -1;
                 $this->deleted_by = $auth->cur_user->id;
                 $this->deleted = getGMTString();
                 $this->update();
                 return true;
             } else {
                 return false;
             }
         }
     }
     return false;
 }
Example #5
0
/**
* Edit note on person
*
* @ingroup pages
*/
function taskNoteOnPersonEdit($task = NULL, $person = NULL)
{
    global $PH;
    global $auth;
    global $g_pub_level_names;
    global $g_prio_names;
    if (!$task) {
        $id = getOnePassedId('tsk');
        if (!($task = Task::getEditableById($id))) {
            $PH->abortWarning(__("Select a note to edit"), ERROR_NOTE);
            return;
        }
    }
    ## get person ##
    if (!$person) {
        $pid = getOnePassedId('person');
        if (!($person = Person::getById($pid))) {
            $PH->abortWarning(__("ERROR: could not get Person"), ERROR_NOTE);
            return;
        }
    }
    $page = new Page(array('use_jscalendar' => false, 'autofocus_field' => 'task_name'));
    $page->cur_tab = 'people';
    if ($person->id) {
        $page->crumbs = build_person_crumbs($person);
    }
    $page->crumbs[] = new NaviCrumb(array('target_id' => 'taskNoteOnPersonEdit'));
    $page->type = __("Note");
    if (!$task->id) {
        $page->title = __('Create new note');
        $page->title_minor = __('Edit');
        ## default title ##
        $date = gmdate("Y-m-d", time());
        $time = getGMTString();
        $dt = $date . " " . renderTime($time);
        $task->name = sprintf(__("New Note on %s, %s"), $person->name, $dt);
    }
    ## eventually needed later when note is a subcategory of task
    /*else {
          $page->title=$task->name;
          $page->title_minor=$task->short;
      }*/
    echo new PageHeader();
    echo new PageContentOpen();
    require_once confGet('DIR_STREBER') . 'render/render_form.inc.php';
    $form = new PageForm();
    $form->button_cancel = true;
    ## name field ##
    $form->add($task->fields['name']->getFormElement($task));
    ## description field ##
    $e = $task->fields['description']->getFormElement($task);
    $e->rows = 22;
    $form->add($e);
    ### public-level drop down menu ###
    $form->add(new Form_Dropdown('task_pub_level', __("Publish to", "Form label"), array_flip($g_pub_level_names), $task->pub_level));
    ## priority drop down menu##
    $form->add(new Form_Dropdown('task_prio', __("Prio", "Form label"), array_flip($g_prio_names), $task->prio));
    if ($task->id == 0) {
        $proj_select = 0;
    }
    $p_list = array();
    $count = 1;
    $p_projects = $person->getProjects();
    $num = count($p_projects);
    if ($num > 0) {
        $p_list[0] = __('Assigned Projects');
        foreach ($p_projects as $pp) {
            $p_list[$pp->id] = "- " . $pp->name;
            $count++;
        }
    }
    $p_companies = $person->getCompanies();
    $num = count($p_companies);
    if ($num > 0) {
        $p_list['-1'] = __('Company Projects');
        foreach ($p_companies as $pcs) {
            $c_id = $pcs->id;
            $c_projects = Project::getAll(array('company' => $c_id));
            $count2 = 0;
            foreach ($c_projects as $cp) {
                $p_list[$cp->id] = "- " . $cp->name;
            }
        }
    }
    if (!($projects = Project::getAll(array('order_by' => 'name ASC')))) {
    } else {
        $p_list['-2'] = __('All other Projects');
        foreach ($projects as $pj) {
            $p_list[$pj->id] = "- " . $pj->name;
        }
    }
    $form->add(new Form_Dropdown('project', __('For Project', 'form label'), array_flip($p_list), $proj_select, "id='proj_list'"));
    ## new project ##
    if ($task->id == 0) {
        $form->add(new Form_checkbox('new_project', __('New project', 'form label'), false, "id='proj_new_checkbox'"));
        $form->add(new Form_Input('new_project_name', __('Project name', 'form label'), false, NULL, false, "id='proj_new_input'", "style='display:none'"));
    }
    $checked1 = "";
    $checked2 = "";
    if ($task->id == 0) {
        $checked1 = "checked";
        $checked2 = "checked";
        $person_select = -1;
    }
    ## eventually needed later when note is a subcategory of task
    /*else {
          if(!$pperson = $task->getAssignedPeople()){
              $PH->abortWarning(__("ERROR: could not get assigned people"), ERROR_NOTE);
          }
          else{
              foreach($pperson as $pp){
                  if($pp->id == $person->id){
                      $checked1= "checked";
                  }
                  elseif($pp->id == $auth->cur_user->id){
                      $checked2= "checked";
                  }
                  else{
                      $person_select = $pp->id;
                  }
              }
          }
      }*/
    $form->add(new Form_customHTML('<p><label>' . __('Assign to') . '</lable></p>', 'assigne_note'));
    if ($person->id != $auth->cur_user->id) {
        $form->add(new Form_customHTML('<span class="checker"><input value="' . $person->id . '" name="task_assignement1" type="checkbox" ' . $checked1 . '><label for="task_assignement1">' . $person->name . '</label></span>', 'assigned_person1'));
        $form->add(new Form_customHTML('<span class="checker"><input value="' . $auth->cur_user->id . '" name="task_assignement2" type="checkbox" ' . $checked2 . '><label for="task_assignement2">' . $auth->cur_user->name . '</label></span>', 'assigned_person2'));
    } else {
        $form->add(new Form_customHTML('<span class="checker"><input value="' . $auth->cur_user->id . '" name="task_assignement2" type="checkbox" ' . $checked2 . '><label for="task_assignement2">' . $auth->cur_user->name . '</label></span>', 'assigned_person'));
    }
    $pers_list = array();
    $pers_list[-1] = __('undefined');
    if ($people = Person::getPeople(array('can_login' => 1))) {
        foreach ($people as $pers) {
            if ($auth->cur_user->name != $pers->name) {
                $pers_list[$pers->id] = $pers->name;
            }
        }
    }
    $form->add(new Form_Dropdown('task_also_assign', __('Also assign to'), array_flip($pers_list), $person_select));
    ## Book effort after submit ##
    $form->form_options[] = "<span class=option><input id='book_effort' name='book_effort' class='checker' type=checkbox>" . __("Book effort after submit") . "</span>";
    $form->add(new Form_HiddenField('tsk', '', $task->id));
    $form->add(new Form_HiddenField('person_id', '', $person->id));
    $form->add(new Form_HiddenField('creation_time', '', $time));
    echo $form;
    $PH->go_submit = 'taskNoteOnPersonEditSubmit';
    echo new PageContentClose();
    echo new PageHtmlEnd();
}
function newEffortFromTimeTracking()
{
    global $PH;
    global $auth;
    require_once confGet('DIR_STREBER') . 'db/class_effort.inc.php';
    $time_end = intval(get('effort_end_seconds'));
    if ($time_end == 0) {
        $time_end = null;
    }
    $new_effort = new Effort(array('id' => 0, 'time_start' => getGMTString(get('effort_start_seconds')), 'time_end' => getGMTString($time_end), 'name' => get('description'), 'billing' => get('billing'), 'productivity' => get('productivity')));
    ### get project ###
    $new_effort->project = get('effort_project_id');
    if (!($project = Project::getVisibleById($new_effort->project))) {
        $PH->abortWarning(__("Could not get project of effort"));
    }
    if (!$project->isPersonVisibleTeamMember($auth->cur_user)) {
        $PH->abortWarning("ERROR: Insufficient rights");
    }
    ### link to task ###
    $task_id = get('effort_task_id');
    if (!(is_null($task_id) || $task_id == 0)) {
        if ($task_id == 0) {
            $new_effort->task = 0;
        } else {
            if ($task = Task::getVisibleById($task_id)) {
                $new_effort->task = $task->id;
            }
        }
    } else {
        if (get('task_name') != "") {
            ### create new task
            $newtask = new Task(array('id' => 0, 'name' => get('task_name'), 'project' => $project->id));
            $newtask->insert();
            $new_effort->task = $newtask->id;
        }
    }
    ### get person ###
    $new_effort->person = $auth->cur_user->id;
    ### go back to from if validation fails ###
    $failure = false;
    if (strToGMTime($new_effort->time_end) - strToGMTime($new_effort->time_start) < 0) {
        $failure = true;
        new FeedbackWarning(__("Cannot start before end."));
    }
    ### write to db ###
    $new_effort->insert();
    ### display taskView ####
    if (!$PH->showFromPage()) {
        $PH->show('projView', array('prj' => $effort->project));
    }
}
Example #7
0
/**
* converts a time in seconds from the client's timezone to database GMT-String
*/
function clientTimeToGMTString($time)
{
    global $auth;
    $time_offset = 0;
    if (isset($auth->cur_user)) {
        $time_offset = $auth->cur_user->time_offset;
    }
    return getGMTString($time - $time_offset - confGet('SERVER_TIME_OFFSET'));
}
Example #8
0
/**
* Logout the current user and remove cookies @ingroup pages
*/
function logout()
{
    global $PH;
    global $auth;
    ### kill cookie ###
    $auth->removeUserCookie();
    $PH->cur_page_md5 = NULL;
    /**
     * keep date of last logout
     * NOTE: the cur_user-object might be no longer up to date (think about person submit).
     * so we get the latest version from the database to update the last_login-field
     */
    if ($cur_user = Person::getById($auth->cur_user->id)) {
        $cur_user->cookie_string = $auth->cur_user->calcCookieString();
        $cur_user->last_logout = getGMTString();
        $cur_user->update();
    }
    ### go to login-page ####
    $PH->messages[] = "Logged out";
    $PH->show('loginForm');
    #header("location:index.php");
    if ($auth->cur_user) {
        $nickname = $auth->cur_user->nickname;
    } else {
        $nickname = '_nobody_';
    }
    log_message("'" . $nickname . "' logged out from:" . getServerVar("REMOTE_ADDR", true), LOG_MESSAGE_LOGOUT);
    require_once confGet('DIR_STREBER') . 'std/mail.inc.php';
    Notifier::sendNotifications();
}
Example #9
0
/**
* submit changes to several bookmarks @ingroup pages
*/
function itemBookmarkEditMultipleSubmit()
{
    global $PH;
    global $auth;
    ### cancel ? ###
    if (get('form_do_cancel')) {
        if (!$PH->showFromPage()) {
            $PH->show('home', array());
        }
        exit;
    }
    $count = 0;
    $error = 0;
    $edit = 0;
    $bookmark_array = array();
    $is_bookmark = array();
    $number = get('number');
    for ($i = 0; $i < $number; $i++) {
        $bm_id = intval(get('bookmark_id_' . $i));
        $bm_item = intval(get('bookmark_item_' . $i));
        $is_already_bookmark = intval(get('is_already_bookmark_' . $i));
        $is_bookmark[$bm_id] = $is_already_bookmark;
        if ($bm_id != 0 && $is_already_bookmark) {
            if (!($bookmark = ItemPerson::getAll(array('id' => $bm_id, 'person' => $auth->cur_user->id, 'is_bookmark' => 1)))) {
                $error++;
            } else {
                $bookmark_array[] = $bookmark[0];
            }
        } elseif ($bm_id != 0 && !$is_already_bookmark) {
            if (!($bookmark = ItemPerson::getAll(array('id' => $bm_id, 'person' => $auth->cur_user->id, 'is_bookmark' => 0)))) {
                $error++;
            } else {
                $bookmark_array[] = $bookmark[0];
            }
        } elseif ($bm_id == 0) {
            $date = getGMTString();
            $bookmark = new ItemPerson(array('id' => 0, 'item' => $bm_item, 'person' => $auth->cur_user->id, 'is_bookmark' => 1, 'created' => $date));
            $bookmark_array[] = $bookmark;
        }
    }
    foreach ($bookmark_array as $bma) {
        #$change = false;
        ### notify on change ###
        $noc = intval(get('notify_on_change'));
        if (!is_null($noc) && $noc != -1 && $noc != $bma->notify_on_change) {
            $bma->notify_on_change = $noc;
            #$change= true;
        }
        ### notify if unchanged ###
        $niu = intval(get('notify_if_unchanged'));
        if (!is_null($niu) && $niu != -1 && $niu != $bma->notify_if_unchanged) {
            $bma->notify_if_unchanged = $niu;
            #$change= true;
        }
        #if($change){
        if ($bma->id != 0 && $is_bookmark[$bma->id]) {
            $bma->update();
            $edit++;
        } elseif ($bma->id != 0 && !$is_bookmark[$bma->id]) {
            $bma->is_bookmark = 1;
            $bma->created = getGMTString();
            $bma->update();
            $count++;
        } elseif ($bma->id == 0) {
            $bma->insert();
            $count++;
        }
        #}
    }
    if ($count) {
        new FeedbackMessage(sprintf(__("Added %s bookmark(s)."), $count));
    }
    if ($edit) {
        new FeedbackMessage(sprintf(__("Edited %s bookmark(s)."), $edit));
    }
    if ($error) {
        new FeedbackWarning(sprintf(__('%s bookmark(s) could not be added.'), $error));
    }
    ### display fromPage ####
    if (!$PH->showFromPage()) {
        $PH->show('home', array());
    }
}
/**
* Submit data of a newly registered person @ingroup pages
*/
function personRegisterSubmit()
{
    global $PH;
    global $auth;
    ### cancel ? ###
    if (get('form_do_cancel')) {
        if (!$PH->showFromPage()) {
            $PH->show('home', array());
        }
        exit;
    }
    if (!validateFormCrc()) {
        $PH->abortWarning(__('Invalid checksum for hidden form elements'));
    }
    $person = new Person(array('id' => 0));
    $person->user_rights = RIGHT_PERSON_EDIT_SELF;
    ### person category ###
    $pcategory = get('pcategory');
    if ($pcategory != NULL) {
        if ($pcategory == -1) {
            $person->category = PCATEGORY_STAFF;
        } else {
            if ($pcategory == -2) {
                $person->category = PCATEGORY_CONTACT;
            } else {
                $person->category = $pcategory;
            }
        }
    }
    $flag_ok = true;
    # update valid?
    # retrieve all possible values from post-data
    # NOTE:
    # - this could be an security-issue.
    # - TODO: as some kind of form-edit-behaviour to field-definition
    foreach ($person->fields as $f) {
        $name = $f->name;
        $f->parseForm($person);
    }
    $person->can_login = 1;
    $period = get('person_notification_period');
    ### turn off ###
    if ($period === 0 || $period === "0") {
        $person->settings &= USER_SETTING_NOTIFICATIONS ^ RIGHT_ALL;
        $person->notification_period = 0;
    } else {
        $person->settings |= USER_SETTING_NOTIFICATIONS;
        $person->notification_period = $period;
        if ($person->can_login && !$person->personal_email && !$person->office_email) {
            $flag_ok = false;
            $person->fields['office_email']->required = true;
            $person->fields['personal_email']->required = true;
            new FeedbackWarning(__("Sending notifactions requires an email-address."));
        }
    }
    if (get('person_html_mail')) {
        $person->settings |= USER_SETTING_HTML_MAIL;
    } else {
        $person->settings &= USER_SETTING_HTML_MAIL ^ RIGHT_ALL;
    }
    $zone = get('person_time_zone');
    if ($zone != NULL && $person->time_zone != 1.0 * $zone) {
        $person->time_zone = 1.0 * $zone;
        if ($zone == TIME_OFFSET_AUTO) {
            new FeedbackMessage(__("Using auto detection of time zone requires this user to relogin."));
        } else {
            $person->time_offset = $zone * 60.0 * 60.0;
            if ($person->id == $auth->cur_user->id) {
                $auth->cur_user->time_offset = $zone * 60.0 * 60.0;
            }
        }
    }
    $theme = get('person_theme');
    if ($theme != NULL) {
        $person->theme = $theme;
        ### update immediately / without page-reload ####
        if ($person->id == $auth->cur_user->id) {
            $auth->cur_user->theme = $theme;
        }
    }
    $language = get('person_language');
    global $g_languages;
    if (isset($g_languages[$language])) {
        $person->language = $language;
        ### update immediately / without page-reload ####
        if ($person->id == $auth->cur_user->id) {
            $auth->cur_user->language = $language;
            setLang($language);
        }
    }
    if (!$person->name) {
        new FeedbackWarning(__("Login-accounts require a full name."));
        $person->fields['name']->required = true;
        $person->fields['name']->invalid = true;
        $flag_ok = false;
    }
    if (!$person->office_email) {
        new FeedbackWarning(__("Please enter an e-mail address."));
        $person->fields['office_email']->required = true;
        $person->fields['office_email']->invalid = true;
        $flag_ok = false;
    }
    $t_nickname = get('person_nickname');
    if (!$person->nickname) {
        new FeedbackWarning(__("Login-accounts require a unique nickname"));
        $person->fields['nickname']->required = true;
        $person->fields['nickname']->invalid = true;
        $flag_ok = false;
    }
    ### check if changed nickname is unique
    if ($person->can_login || $person->nickname != "") {
        /**
         * \todo actually this should be mb_strtolower, but this is not installed by default
         */
        if ($person->nickname != strtolower($person->nickname)) {
            new FeedbackMessage(__("Nickname has been converted to lowercase"));
            $person->nickname = strtolower($person->nickname);
        }
        if ($p2 = Person::getByNickname($t_nickname)) {
            # another person with this nick?
            if ($p2->id != $person->id) {
                new FeedbackWarning(__("Nickname has to be unique"));
                $person->fields['nickname']->required = true;
                $flag_ok = false;
            }
        }
    }
    ### password entered? ###
    $t_password1 = get('person_password1');
    $t_password2 = get('person_password2');
    $flag_password_ok = true;
    if (($t_password1 || $t_password2) && $t_password1 != "__dont_change__") {
        ### check if password match ###
        if ($t_password1 !== $t_password2) {
            new FeedbackWarning(__("Passwords do not match"));
            $person->fields['password']->required = true;
            $flag_ok = false;
            $flag_password_ok = false;
            $person->cookie_string = $auth->cur_user->calcCookieString();
        }
    }
    ### check if password is good enough ###
    $password_length = strlen($t_password1);
    $password_count_numbers = strlen(preg_replace('/[\\d]/', '', $t_password1));
    $password_count_special = strlen(preg_replace('/[\\w]/', '', $t_password1));
    $password_value = -7 + $password_length + $password_count_numbers * 2 + $password_count_special * 4;
    if ($password_value < confGet('CHECK_PASSWORD_LEVEL')) {
        new FeedbackWarning(__("Password is too weak (please add numbers, special chars or length)"));
        $flag_ok = false;
        $flag_password_ok = false;
    }
    if ($flag_password_ok) {
        $person->password = md5($t_password1);
    }
    if (!validateFormCaptcha()) {
        new FeedbackWarning(__("Please copy the text from the image."));
        $flag_ok = false;
    }
    ### repeat form if invalid data ###
    if (!$flag_ok) {
        $PH->show('personRegister', NULL, $person);
        exit;
    }
    /**
     * store indentifier-string for login from notification & reminder - mails
     */
    $person->identifier = $person->calcIdentifierString();
    ### insert new object ###
    if ($person->settings & USER_SETTING_NOTIFICATIONS && $person->can_login) {
        $person->settings |= USER_SETTING_SEND_ACTIVATION;
        new FeedbackHint(sprintf(__("A notification / activation  will be mailed to <b>%s</b> when you log out."), $person->name) . " " . sprintf(__("Read more about %s."), $PH->getWikiLink('notifications')));
    }
    $person->notification_last = getGMTString(time() - $person->notification_period * 60 * 60 * 24 - 1);
    $person->cookie_string = $person->calcCookieString();
    if ($person->insert()) {
        new FeedbackHint(__("Thank you for registration! After your request has been approved by a moderator, you will can an email."));
        ### link to a company ###
        if ($c_id = get('company')) {
            require_once confGet('DIR_STREBER') . 'db/class_company.inc.php';
            if ($c = Company::getVisibleById($c_id)) {
                require_once confGet('DIR_STREBER') . 'db/class_employment.inc.php';
                $e = new Employment(array('id' => 0, 'person' => $person->id, 'company' => $c->id));
                $e->insert();
            }
        }
        ## assigne to project ##
        require_once confGet('DIR_STREBER') . 'db/class_projectperson.inc.php';
        $prj_num = confGet('REGISTER_NEW_USERS_TO_PROJECT');
        global $g_user_profile_names;
        if (isset($prj_num)) {
            if ($prj_num != -1) {
                if ($p = Project::getVisibleById($prj_num)) {
                    $prj_person = new ProjectPerson(array('person' => $person->id, 'project' => $p->id, 'name' => $g_user_profile_names[$person->profile]));
                    $prj_person->insert();
                }
            }
        }
        new FeedbackMessage(sprintf(__('Person %s created'), $person->getLink()));
        ### automatically login ###
        $foo = array('login_name' => $person->nickname, 'login_password_md5' => $person->password);
        addRequestVars($foo);
        $PH->show('loginFormSubmit', array());
        exit;
    } else {
        new FeedbackError(__("Could not insert object"));
    }
    ### display fromPage ####
    if (!$PH->showFromPage()) {
        $PH->show('home', array());
    }
}
Example #11
0
/**
* renders a comparision between two versions of an item @ingroup pages
*/
function itemViewDiff()
{
    global $PH;
    global $auth;
    require_once confGet('DIR_STREBER') . 'render/render_wiki.inc.php';
    ### get task ####
    $item_id = get('item');
    if (!($item = DbProjectItem::getObjectById($item_id))) {
        $PH->abortWarning("invalid item-id", ERROR_FATAL);
    }
    if (!($project = Project::getVisibleById($item->project))) {
        $PH->abortWarning("this item has an invalid project id", ERROR_DATASTRUCTURE);
    }
    require_once confGet('DIR_STREBER') . "db/db_itemchange.inc.php";
    $versions = ItemVersion::getFromItem($item);
    $date1 = get('date1');
    $date2 = get('date2');
    if (!$date1) {
        #if(count($versions) > 1) {
        #    if($auth->cur_user->last_logout < $versions[count($versions)-2]->date_to)
        #    {
        #        $date1 = $auth->cur_user->last_logout;
        #    }
        #    else {
        #        $date1 = $versions[count($versions)-2]->date_from;
        #    }
        #}
        #else {
        foreach (array_reverse($versions) as $v) {
            if ($v->author == $auth->cur_user->id) {
                $date1 = $v->date_from;
                break;
            }
        }
        #}
    }
    if (!$date2) {
        $date2 = getGMTString();
    }
    $page = new Page();
    $page->cur_tab = 'projects';
    $page->crumbs = build_project_crumbs($project);
    $page->options = build_projView_options($project);
    $page->title = $item->name;
    $page->title_minor = __('changes');
    $page->add_function(new PageFunction(array('target' => 'itemView', 'params' => array('item' => $item->id), 'icon' => 'edit', 'name' => __('View item'))));
    ### render title ###
    echo new PageHeader();
    echo new PageContentOpen();
    if ($date1 > $date2) {
        new FeedbackMessage(__("date1 should be smaller than date2. Swapped"));
        $t = $date1;
        $date1 = $date2;
        $date2 = $t;
    }
    if (count($versions) == 1) {
        echo __("item has not been edited history");
    } else {
        $old_version = NULL;
        $version_right = NULL;
        $version_left = $versions[0];
        foreach ($versions as $v) {
            if ($v->date_from <= $date1) {
                $version_left = $v;
            }
            if ($v->date_from >= $date2) {
                if (isset($version_right)) {
                    if ($version_right->date_from > $v->date_from) {
                        $version_right = $v;
                    }
                } else {
                    $version_right = $v;
                }
            }
        }
        if (!isset($version_right)) {
            $version_right = $versions[count($versions) - 1];
        }
        $options_left = array();
        $options_right = array();
        ### list versions left ###
        for ($i = 0; $i < count($versions) - 1; $i++) {
            $v = $versions[$i];
            if ($person = Person::getVisibleById($v->author)) {
                $author = $person->name;
            } else {
                $author = __('unknown');
            }
            if ($v->version_number == $version_left->version_number) {
                $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $versions[$i]->date_to));
                $name = ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.' . $v->version_number . ' -- ' . $author . " -- " . $v->date_from;
                $options_left[] = "<option selected=1 value='" . $str_link . "'>" . $name . "</option>";
            } else {
                if ($v->version_number > $version_left->version_number) {
                    if ($v->version_number < $version_right->version_number) {
                        $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $versions[$i]->date_to));
                        $name = '&gt; &nbsp;&nbsp; v.' . $v->version_number . ' -- ' . $author . " -- " . renderDate($v->date_from);
                    } else {
                        $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $version_right->date_to));
                        $name = '&gt;&gt;&nbsp;&nbsp; v.' . $v->version_number . ' -- ' . $author . " -- " . renderDate($v->date_from);
                    }
                    $options_left[] = "<option  value='" . $str_link . "'>" . $name . "</option>";
                } else {
                    $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $version_right->date_from));
                    $name = '&lt; &nbsp;&nbsp; v.' . $v->version_number . ' -- ' . $author . " -- " . renderDate($v->date_from);
                    $options_left[] = "<option  value='" . $str_link . "'>" . $name . "</option>";
                }
            }
        }
        ### list versions right ###
        for ($i = 1; $i < count($versions); $i++) {
            $v = $versions[$i];
            if ($person = Person::getVisibleById($v->author)) {
                $author = $person->name;
            } else {
                $author = __('unknown');
            }
            if ($v->version_number == $version_right->version_number) {
                $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $versions[$i]->date_to));
                $name = ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; v.' . $v->version_number . ' -- ' . $author . " -- " . $v->date_from;
                $options_right[] = "<option selected=1 value='" . $str_link . "'>" . $name . "</option>";
            } else {
                if ($v->version_number > $version_right->version_number) {
                    $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $version_left->date_from, 'date2' => $versions[$i]->date_from));
                    $name = '&gt; &nbsp;&nbsp; v.' . $v->version_number . ' -- ' . $author . ' -- ' . renderDate($v->date_from);
                    $options_right[] = "<option  value='" . $str_link . "'>" . $name . "</option>";
                } else {
                    if ($v->version_number > $version_left->version_number) {
                        $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $version_left->date_from, 'date2' => $versions[$i]->date_from));
                        $name = '&lt; &nbsp;&nbsp; v.' . $v->version_number . ' -- ' . $author . " -- " . renderDate($v->date_from);
                    } else {
                        $str_link = $PH->getUrl('itemViewDiff', array('item' => $item->id, 'date1' => $versions[$i]->date_from, 'date2' => $versions[$i]->date_to));
                        $name = '&lt;&lt;&nbsp;&nbsp; v.' . $v->version_number . ' -- ' . $author . ' -- ' . renderDate($v->date_from);
                    }
                    $options_right[] = "<option  value='" . $str_link . "'>" . $name . "</option>";
                }
            }
        }
        ### prev ###
        if ($version_left->version_number > 1) {
            $link_prev = $PH->getLink('itemViewDiff', '&lt;&lt; ' . __('prev change'), array('item' => $item->id, 'date1' => $versions[$version_left->version_number - 2]->date_from, 'date2' => $versions[$version_left->version_number - 2]->date_to), NULL, true);
        } else {
            $link_prev = '';
        }
        ### next ###
        if ($version_right->version_number < count($versions)) {
            $link_next = $PH->getLink('itemViewDiff', __('next') . '&gt;&gt;', array('item' => $item->id, 'date1' => $versions[$version_right->version_number - 1]->date_from, 'date2' => $versions[$version_right->version_number - 1]->date_to), NULL, true);
        } else {
            $link_next = '';
        }
        ### summary ###
        $link_summary = $PH->getLink('itemViewDiff', __('summary'), array('item' => $item->id, 'date1' => $auth->cur_user->last_logout, 'date2' => getGMTString()), NULL, true);
        echo "<div class=diff>";
        echo "<table class=nav><tr>";
        echo "<td class=older>" . "<select onChange='location.href=this.options[this.selectedIndex].value'>" . join(array_reverse($options_left)) . "</select>" . '<br><b class=doclear></b>' . $link_prev . "</td>";
        echo "<td class=newer>" . "<select onChange='location.href=this.options[this.selectedIndex].value'>" . join(array_reverse($options_right)) . "</select>" . '<br><b class=doclear></b>' . $link_next . $link_summary . "</td>";
        echo "</table>";
        #if(!$date2 || !$date1) {
        #    echo sprintf(__("Item did not exists at %s"), renderTime($date2));
        #}
        if ($old_version == $version_right) {
            echo sprintf(__('no changes between %s and %s'), renderTime($date1), renderTime($date2));
        }
        ### collect changes ###
        $old_field_values = array();
        $new_field_values = array();
        foreach ($versions as $v) {
            if ($v->version_number <= $version_left->version_number) {
                foreach ($v->values as $name => $value) {
                    $old_field_values[$name] = $value;
                }
            }
            if ($v->version_number >= $version_left->version_number && $v->version_number < $version_right->version_number) {
                foreach ($v->values_next as $name => $value) {
                    $new_field_values[$name] = $value;
                }
            }
        }
        foreach ($new_field_values as $field_name => $value) {
            echo "<h2>{$field_name}</h2>";
            $old_value = isset($old_field_values[$field_name]) ? $old_field_values[$field_name] : "";
            $new_value = isset($new_field_values[$field_name]) ? $new_field_values[$field_name] : '';
            $field_type = $item->fields[$field_name]->type;
            if ($field_type == 'FieldText') {
                echo render_changes($old_value, $new_value);
            } else {
                if ($field_type == 'FieldOption') {
                    if ($field_name == 'status') {
                        global $g_status_names;
                        $old_value = isset($g_status_names[$old_value]) ? $g_status_names[$old_value] : __('undefined');
                        $new_value = isset($g_status_names[$new_value]) ? $g_status_names[$new_value] : __('undefined');
                    } else {
                        if ($field_name == 'label') {
                            if ($project = Project::getVisibleById($item->project)) {
                                $labels = explode(",", $project->labels);
                                $old_value = isset($labels[$old_value - 1]) ? $labels[$old_value - 1] : __('undefined');
                                $new_value = isset($labels[$new_value - 1]) ? $labels[$new_value - 1] : __('undefined');
                            }
                        }
                    }
                    echo render_changes($old_value, $new_value);
                } else {
                    if ($field_type == 'FieldInternal') {
                        if ($field_name == 'parent_item') {
                            if ($task_parent_old = Task::getVisibleById($old_value)) {
                                $ar = array();
                                foreach ($task_parent_old->getFolder() as $f) {
                                    $ar[] = $f->name;
                                }
                                $ar[] = $task_parent_old->name;
                                $old_value = join($ar, " > ");
                            }
                            if ($task_parent_new = Task::getVisibleById($new_value)) {
                                $ar = array();
                                foreach ($task_parent_new->getFolder() as $f) {
                                    $ar[] = $f->name;
                                }
                                $ar[] = $task_parent_new->name;
                                $new_value = join($ar, " > ");
                            }
                        } else {
                            if ($field_name == 'state') {
                                $old_value = $old_value == -1 ? __('deleted') : __('ok');
                                $new_value = $new_value == -1 ? __('deleted') : __('ok');
                            } else {
                                if ($field_name == 'pub_level') {
                                    global $g_pub_level_names;
                                    $old_value = isset($g_pub_level_names[$old_value]) ? $g_pub_level_names[$old_value] : __('undefined');
                                    $new_value = isset($g_pub_level_names[$new_value]) ? $g_pub_level_names[$new_value] : __('undefined');
                                }
                            }
                        }
                        echo render_changes($old_value, $new_value);
                    } else {
                        if ($field_type == 'FieldPercentage') {
                            echo render_changes($old_value, $new_value);
                        } else {
                            if ($field_type == 'FieldInt') {
                                echo render_changes($old_value, $new_value);
                            } else {
                                if ($field_type == 'FieldString') {
                                    echo render_changes($old_value, $new_value);
                                } else {
                                    if ($field_type == 'FieldDate') {
                                        echo render_changes(renderDate($old_value), renderDate($new_value));
                                    } else {
                                        if ($field_type == 'FieldDatetime') {
                                            echo render_changes(renderTimestamp($old_value), renderTimestamp($new_value));
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    echo "</div>";
    echo new PageContentClose();
    echo new PageHtmlEnd();
}
Example #12
0
/**
* Show an RSS Feed of the latest changes on a project @ingroup pages
*/
function projViewAsRSS()
{
    require_once confGet('DIR_STREBER') . "std/class_rss.inc.php";
    global $PH;
    global $auth;
    $project_id = getOnePassedId('prj', 'projects_*');
    # aborts on failure
    if (!($project = Project::getVisibleById($project_id))) {
        echo "Project is not readable. Anonymous user active?";
        exit;
    }
    ### used cached? ###
    $filepath = "_rss/proj_{$project->id}.xml";
    if (file_exists($filepath) || getGMTString(filemtime($filepath)) . "<" . $project->modified) {
        RSS::updateRSS($project);
    }
    readfile_chunked($filepath);
    exit;
}
Example #13
0
 /**
  * perform login for user/password
  *
  * - on success:
  *    - sets current_user
  *    - set cookie
  *    - return current user
  *
  * @return       false if login wasn't successfull
  */
 public function tryLoginUser($name, $password_md5)
 {
     log_message("tryLoginUser()", LOG_MESSAGE_DEBUG);
     if (!($user = Person::getByNickname($name))) {
         log_message("login failed, unknown person '{$name}' from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_FAILURE);
         return false;
     }
     if ($user->state != ITEM_STATE_OK) {
         log_message("login failed,  deleted person '{$name}'/ from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_FAILURE);
         return false;
     }
     if (!$user->can_login) {
         log_message("login failed,  person '{$name}' without account / from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_FAILURE);
         return false;
     }
     if (!$user instanceof Person) {
         return false;
     }
     if ($user->password != $password_md5) {
         log_message("login failed, wrong password for person '{$name}' / from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_FAILURE);
         return false;
     }
     $this->cur_user = $user;
     /**
      * if cookie-string is empty add appropriate setting
      * - actually this is only good for providing the first admin-user
      *   a valid cookie setting. This can not be done in install because
      *   we can't use Person->calcCookieString() from there.
      *
      * If users should keep login across sessions (on different computers
      * or IP-Adresses), calcCookieString must NOT be called here, because
      * it uses Time and Random.
      *
      * However, when the user is loggin out, the cookieString should be randomized.
      * This make all stored cookies invalid.
      */
     if (confGet('CHECK_IP_ADDRESS') || $this->cur_user->cookie_string == "" || $this->cur_user->cookie_string == "0") {
         log_message("tryLoginUser()->calcCookieString()", LOG_MESSAGE_DEBUG);
         $this->cur_user->cookie_string = $this->cur_user->calcCookieString();
         log_message("cookie is (" . $this->cur_user->cookie_string . ")", LOG_MESSAGE_DEBUG);
     }
     $this->cur_user->ip_address = asCleanString(getServerVar('REMOTE_ADDR', true));
     /**
      * guess time client time offset to gmt in seconds
      */
     if ($this->cur_user->time_zone == TIME_OFFSET_AUTO) {
         ### store date-offsetset for this user ###
         if ($time_offset = get('user_timeoffset')) {
             list($hour, $min, $sec) = explode(':', $time_offset);
             $client_day_seconds = $hour * 60 * 60 + $min * 60 + $sec;
             ### get servertime ###
             if ($t = get('edit_request_time')) {
                 $t = get('edit_request_time');
             } else {
                 $t = time();
             }
             list($hour, $min, $sec) = explode(':', gmdate('H:i:s', $t));
             $server_day_seconds = $hour * 60 * 60 + $min * 60 + $sec;
             $offset = $server_day_seconds - $client_day_seconds;
             if ($offset < -12 * 60 * 60) {
                 $offset += 24 * 60 * 60;
             } else {
                 if ($offset > 12 * 60 * 60) {
                     $offset -= 24 * 60 * 60;
                 }
             }
             $offset *= -1;
             if (confGet('ROUND_AUTO_DETECTED_TIME_OFFSET')) {
                 $offset = intval(($offset + 30 * 60) / 60 / 60) * 60 * 60;
             }
             $this->cur_user->time_offset = $offset;
             log_message("usertime offset = {$offset} sec", LOG_MESSAGE_LOGIN_SUCCESS);
         } else {
             new FeedbackWarning(__("Unable to automatically detect client time zone"));
         }
     } else {
         $this->cur_user->time_offset = $this->cur_user->time_zone * 60.0 * 60.0;
     }
     /**
      * update user
      */
     log_message("tryLoginUser()->update cur_user", LOG_MESSAGE_DEBUG);
     $this->cur_user->last_login = getGMTString();
     $this->cur_user->update(array('last_login', 'cookie_string', 'ip_address', 'time_offset'), false);
     log_message("tryLoginUser()->success", LOG_MESSAGE_DEBUG);
     log_message("'{$name}' logged in from " . getServerVar('REMOTE_ADDR', true), LOG_MESSAGE_LOGIN_SUCCESS);
     return $user;
 }
Example #14
0
/**
* Submit changes to an effort  @ingroup pages
*/
function effortEditSubmit()
{
    global $PH;
    global $auth;
    ### Validate form crc
    if (!validateFormCrc()) {
        $PH->abortWarning(__('Invalid checksum for hidden form elements'));
    }
    ### get effort ####
    $id = getOnePassedId('effort');
    if ($id == 0) {
        $effort = new Effort(array('id' => 0));
    } else {
        $effort = Effort::getEditableById($id);
        if (!$effort) {
            $PH->abortWarning(__("Could not get effort"));
            return;
        }
        $effort->validateEditRequestTime();
    }
    ### cancel ###
    if (get('form_do_cancel')) {
        if (!$PH->showFromPage()) {
            $PH->show('projView', array('prj' => $effort->project));
        }
        exit;
    }
    ### get project ###
    $effort->project = get('effort_project');
    if (!($project = Project::getVisibleById($effort->project))) {
        $PH->abortWarning(__("Could not get project of effort"));
    }
    if (!$project->isPersonVisibleTeamMember($auth->cur_user)) {
        $PH->abortWarning("ERROR: Insufficient rights");
    }
    ### get person ###
    if ($effort->person = get('effort_person')) {
        if (!($person = Person::getVisibleById($effort->person))) {
            $PH->abortWarning(__("Could not get person of effort"));
        }
    }
    # retrieve all possible values from post-data
    # NOTE:
    # - this could be an security-issue.
    # - TODO: as some kind of form-edit-behaviour to field-definition
    foreach ($effort->fields as $f) {
        $name = $f->name;
        $f->parseForm($effort);
    }
    ### times as duration ###
    if ($as_duration = get('effort_as_duration')) {
        $effort->as_duration = $as_duration;
        ### make sure day of time_end stays the same if date changes... ###
        if (($time_start = $effort->time_start) && ($time_end = $effort->time_end)) {
            $effort->time_end = gmdate("Y-m-d", strToClientTime($time_end)) . " " . gmdate("H:i:s", strToClientTime($time_end));
            $effort->time_start = gmdate("Y-m-d", strToClientTime($time_end)) . " " . gmdate("00:00:00", strToClientTime($time_end));
        } else {
            trigger_error("Getting time_start and time_end failed", E_USER_WARNING);
        }
    }
    ### pub level ###
    if ($pub_level = get('effort_pub_level')) {
        ### not a new effort ###
        if ($effort->id) {
            if ($pub_level > $effort->getValidUserSetPublicLevels()) {
                $PH->abortWarning('invalid data', ERROR_RIGHTS);
            }
        }
        #else {
        #  #@@@ check for person create rights
        #}
        $effort->pub_level = $pub_level;
    }
    ## effort status ##
    if ($effort_status = get('effort_status')) {
        $effort->status = $effort_status;
    }
    if ($effort_billing = get('effort_billing')) {
        $effort->billing = intval($effort_billing);
    }
    if ($effort_productivity = get('effort_productivity')) {
        $effort->productivity = intval($effort_productivity);
    }
    ### link to task ###
    $task_id = get('effort_task');
    if (!is_null($task_id)) {
        if ($task_id == 0) {
            $effort->task = 0;
        } else {
            if ($task = Task::getVisibleById($task_id)) {
                $effort->task = $task->id;
            }
        }
    }
    ### go back to from if validation fails ###
    $failure = false;
    if (!$effort->name) {
        $failure = true;
        new FeedbackWarning(__("Name required"));
    }
    if (strToGMTime($effort->time_end) - strToGMTime($effort->time_start) < 0) {
        $failure = true;
        new FeedbackWarning(__("Cannot start before end."));
    }
    ### validation of the Datetime fields###
    if (!$as_duration) {
        if (strToGMTime($effort->time_start) == 0) {
            $failure = true;
            $name = $effort->fields['time_start']->name;
            $field_id = $effort->_type . '_' . $name;
            $value_time = get($field_id . '_time');
            new FeedbackWarning(sprintf(__("<b>%s</b> is not a valid value for start time."), $value_time));
            $effort->time_start = getGMTString();
        }
        if (strToGMTime($effort->time_end) == 0) {
            $failure = true;
            $name = $effort->fields['time_end']->name;
            $field_id = $effort->_type . '_' . $name;
            $value_time = get($field_id . '_time');
            new FeedbackWarning(sprintf(__("<b>%s</b> is not a valid value for end time."), $value_time));
            $effort->time_end = getGMTString();
        }
    } else {
        ##As duration
        if (strToGMTime($effort->time_end) == 0) {
            $failure = true;
            $name = $effort->fields['time_end']->name;
            $field_id = $effort->_type . '_' . $name;
            $value_time = get($field_id . '_time');
            new FeedbackWarning(sprintf(__("<b>%s</b> is not a valid value for hours."), $value_time));
            $effort->time_end = gmdate("Y-m-d", time()) . " 00:00:00";
        }
    }
    if ($failure) {
        $PH->show('effortEdit', NULL, $effort);
        exit;
    }
    ### write to db ###
    if ($effort->id == 0) {
        $effort->insert();
    } else {
        $effort->update();
    }
    ### display taskView ####
    if (!$PH->showFromPage()) {
        $PH->show('projView', array('prj' => $effort->project));
    }
}
Example #15
0
 public function getQuerryAttributes()
 {
     $a = array();
     if ($this->active) {
         if ($this->value) {
             $a['date_min'] = getGMTString(time() - $this->value);
         }
     }
     return $a;
 }