/**
  * Finish the installation - create owner company and administrator
  *
  * @param void
  * @return null
  */
 function complete_installation()
 {
     if (Companies::getOwnerCompany() instanceof Company) {
         die('Owner company already exists');
         // Somebody is trying to access this method even if the user already exists
     }
     // if
     $this->setLayout('complete_install');
     $form_data = array_var($_POST, 'form');
     tpl_assign('form_data', $form_data);
     if (array_var($form_data, 'submitted') == 'submitted') {
         try {
             $admin_password = trim(array_var($form_data, 'admin_password'));
             $admin_password_a = trim(array_var($form_data, 'admin_password_a'));
             if (trim($admin_password) == '') {
                 throw new Error(lang('password value required'));
             }
             // if
             if ($admin_password != $admin_password_a) {
                 throw new Error(lang('passwords dont match'));
             }
             // if
             DB::beginWork();
             Users::delete();
             // clear users table
             Companies::delete();
             // clear companies table
             // Create the administrator user
             $administrator = new User();
             $administrator->setId(1);
             $administrator->setCompanyId(1);
             $administrator->setUsername(array_var($form_data, 'admin_username'));
             $administrator->setEmail(array_var($form_data, 'admin_email'));
             $administrator->setPassword($admin_password);
             $administrator->setIsAdmin(true);
             $administrator->setAutoAssign(true);
             $administrator->save();
             // Create a company
             $company = new Company();
             $company->setId(1);
             $company->setClientOfId(0);
             $company->setName(array_var($form_data, 'company_name'));
             $company->setCreatedById(1);
             $company->save();
             DB::commit();
             $this->redirectTo('access', 'login');
         } catch (Exception $e) {
             tpl_assign('error', $e);
             DB::rollback();
         }
         // try
     }
     // if
 }
 /**
  * Try to log user in with given credentials
  *
  * @param array $credentials
  * @return User
  */
 function authenticate($credentials)
 {
     $username = array_var($credentials, 'email');
     $password = array_var($credentials, 'password');
     $remember = (bool) array_var($credentials, 'remember', false);
     if (!function_exists('ldap_connect')) {
         return new error('LDAP error: PHP LDAP extension not found.');
     }
     // if
     // Assumes username is the first initial, last name, so we double split.
     //$useremail = explode('@',$email);
     //$tempname = $useremail[0];
     //print $tempname."<br />";
     //$domain = $useremail[1];
     //$tempname = explode('.', $tempname);
     //$firstinitial = substr($tempname[0], 0, 1);
     //$lastname = $tempname[1];
     //print $firstinitial.$lastname;
     //$logon = $firstinitial.$lastname;
     //$password = "******";
     $this->adldap = new adLDAP();
     // new adLDAP instance
     $search_field = array("mail");
     // Authenticate user
     /*&& $domain == str_replace('@','', AUTH_AD_EMAIL_SUFFIX)*/
     if ($this->adldap->authenticate($username, $password)) {
         // Check if user is created
         $properties = $this->adldap->user_info($username, $search_field);
         //print_r($properties);
         $email = $properties[0]["mail"][0];
         if (Users::findByEmail($email)) {
             return $this->logUserIn($email, array('remember' => $remember, 'new_visit' => true));
             // Else create the user, then log in.
         } else {
             if (AUTH_AD_USERADD_AUTO) {
                 // Get the user_info from AD
                 $fields = array("givenname", "email", "sn", "department", "telephonenumber", "mobile", "title");
                 $user_info = $this->adldap->user_info($username, $fields);
                 $user = new User();
                 $user->setAttributes(array('role_id' => AUTH_AD_USERADD_ROLE_ID, 'email' => $user_info[0]['mail'][0], 'password' => $password, 'first_name' => $user_info[0]['givenname'][0], 'last_name' => $user_info[0]['sn'][0]));
                 $user->setCompanyId(AUTH_AD_USERADD_COMPANY_ID);
                 $user->resetToken();
                 $save = $user->save();
                 if (is_error($save)) {
                     return new Error('Failed to create an account. Reason: ' . $save->getMessage());
                 }
                 // if
                 // Need to get the id of the newly created user and update the userconfigoptions, so we get the last three fields in as well
                 //UserConfigOptions::setValue('phone_mobile', $user_info[0]['mobile'][0], $user->getId);
                 //UserConfigOptions::setValue('phone_work',   $user_info[0]['telephonenumber'][0], $user->getId);
                 //UserConfigOptions::setValue('title', 	$user_info[0]['title'][0], $user->getId);
                 return $this->logUserIn($user, array('remember' => $remember, 'new_visit' => true));
             } else {
                 return new Error('User is not registered.');
             }
             // if
         }
     }
     // if
     // Fall back to Basic Auth
     $user = Users::findByEmail($email);
     if (!instance_of($user, 'User')) {
         return new Error('User is not registered');
     }
     // if
     if (!$user->isCurrentPassword($password)) {
         return new Error('Invalid password');
     }
     // if
     return $this->logUserIn($user, array('remember' => $remember, 'new_visit' => true));
 }
Example #3
0
function create_user($user_data, $permissionsString)
{
    $user = new User();
    $user->setUsername(array_var($user_data, 'username'));
    $user->setDisplayName(array_var($user_data, 'display_name'));
    $user->setEmail(array_var($user_data, 'email'));
    $user->setCompanyId(array_var($user_data, 'company_id'));
    $user->setType(array_var($user_data, 'type'));
    $user->setTimezone(array_var($user_data, 'timezone'));
    if (!logged_user() instanceof User || can_manage_security(logged_user())) {
        $user->setCanEditCompanyData(array_var($user_data, 'can_edit_company_data'));
        $user->setCanManageSecurity(array_var($user_data, 'can_manage_security'));
        $user->setCanManageWorkspaces(array_var($user_data, 'can_manage_workspaces'));
        $user->setCanManageConfiguration(array_var($user_data, 'can_manage_configuration'));
        $user->setCanManageContacts(array_var($user_data, 'can_manage_contacts'));
        $user->setCanManageTemplates(array_var($user_data, 'can_manage_templates'));
        $user->setCanManageReports(array_var($user_data, 'can_manage_reports'));
        $user->setCanManageTime(array_var($user_data, 'can_manage_time'));
        $user->setCanAddMailAccounts(array_var($user_data, 'can_add_mail_accounts'));
        $other_permissions = array();
        Hook::fire('add_user_permissions', $user, $other_permissions);
        foreach ($other_permissions as $k => $v) {
            $user->setColumnValue($k, array_var($user_data, $k));
        }
    }
    if (array_var($user_data, 'password_generator', 'random') == 'random') {
        // Generate random password
        $password = UserPasswords::generateRandomPassword();
    } else {
        // Validate input
        $password = array_var($user_data, 'password');
        if (trim($password) == '') {
            throw new Error(lang('password value required'));
        }
        // if
        if ($password != array_var($user_data, 'password_a')) {
            throw new Error(lang('passwords dont match'));
        }
        // if
    }
    // if
    $user->setPassword($password);
    $user->save();
    $user_password = new UserPassword();
    $user_password->setUserId($user->getId());
    $user_password->setPasswordDate(DateTimeValueLib::now());
    $user_password->setPassword(cp_encrypt($password, $user_password->getPasswordDate()->getTimestamp()));
    $user_password->password_temp = $password;
    $user_password->save();
    if (array_var($user_data, 'autodetect_time_zone', 1) == 1) {
        set_user_config_option('autodetect_time_zone', 1, $user->getId());
    }
    if ($user->getType() == 'admin') {
        if ($user->getCompanyId() != owner_company()->getId() || logged_user() instanceof User && !can_manage_security(logged_user())) {
            // external users can't be admins or logged user has no rights to create admins => set as Normal
            $user->setType('normal');
        } else {
            $user->setAsAdministrator(true);
        }
    }
    /* create contact for this user*/
    if (array_var($user_data, 'create_contact', 1)) {
        // if contact with same email exists take it, else create new
        $contact = Contacts::getByEmail($user->getEmail(), true);
        if (!$contact instanceof Contact) {
            $contact = new Contact();
            $contact->setEmail($user->getEmail());
        } else {
            if ($contact->isTrashed()) {
                $contact->untrash();
            }
        }
        $contact->setFirstname($user->getDisplayName());
        $contact->setUserId($user->getId());
        $contact->setTimezone($user->getTimezone());
        $contact->setCompanyId($user->getCompanyId());
        $contact->save();
    } else {
        $contact_id = array_var($user_data, 'contact_id');
        $contact = Contacts::findById($contact_id);
        if ($contact instanceof Contact) {
            // user created from a contact
            $contact->setUserId($user->getId());
            $contact->save();
        } else {
            // if contact with same email exists use it as user's contact, without changing it
            $contact = Contacts::getByEmail($user->getEmail(), true);
            if ($contact instanceof Contact) {
                $contact->setUserId($user->getId());
                if ($contact->isTrashed()) {
                    $contact->untrash();
                }
                $contact->save();
            }
        }
    }
    $contact = $user->getContact();
    if ($contact instanceof Contact) {
        // update contact data with data entered for this user
        $contact->setCompanyId($user->getCompanyId());
        if ($contact->getEmail() != $user->getEmail()) {
            // make user's email the contact's main email address
            if ($contact->getEmail2() == $user->getEmail()) {
                $contact->setEmail2($contact->getEmail());
            } else {
                if ($contact->getEmail3() == $user->getEmail()) {
                    $contact->setEmail3($contact->getEmail());
                } else {
                    if ($contact->getEmail2() == "") {
                        $contact->setEmail2($contact->getEmail());
                    } else {
                        $contact->setEmail3($contact->getEmail());
                    }
                }
            }
        }
        $contact->setEmail($user->getEmail());
        $contact->save();
    }
    if (!$user->isGuest()) {
        /* create personal project or assing the selected*/
        //if recived a personal project assing this
        //project as personal project for this user
        $new_project = null;
        $personalProjectId = array_var($user_data, 'personal_project', 0);
        $project = Projects::findById($personalProjectId);
        if (!$project instanceof Project) {
            $project = new Project();
            $wname = new_personal_project_name($user->getUsername());
            $project->setName($wname);
            $wdesc = Localization::instance()->lang(lang('personal workspace description'));
            if (!is_null($wdesc)) {
                $project->setDescription($wdesc);
            }
            $project->setCreatedById($user->getId());
            $project->save();
            //Save to set an ID number
            $project->setP1($project->getId());
            //Set ID number to the first project
            $project->save();
            $new_project = $project;
        }
        $user->setPersonalProjectId($project->getId());
        $project_user = new ProjectUser();
        $project_user->setProjectId($project->getId());
        $project_user->setUserId($user->getId());
        $project_user->setCreatedById($user->getId());
        $project_user->setAllPermissions(true);
        $project_user->save();
        /* end personal project */
    }
    $user->save();
    ApplicationLogs::createLog($user, null, ApplicationLogs::ACTION_ADD);
    //TODO - Make batch update of these permissions
    if ($permissionsString && $permissionsString != '') {
        $permissions = json_decode($permissionsString);
    } else {
        $permissions = null;
    }
    if (is_array($permissions) && (!logged_user() instanceof User || can_manage_security(logged_user()))) {
        foreach ($permissions as $perm) {
            if (ProjectUser::hasAnyPermissions($perm->pr, $perm->pc)) {
                if (!$personalProjectId || $personalProjectId != $perm->wsid) {
                    $relation = new ProjectUser();
                    $relation->setProjectId($perm->wsid);
                    $relation->setUserId($user->getId());
                    $relation->setCheckboxPermissions($perm->pc, $user->isGuest() ? false : true);
                    $relation->setRadioPermissions($perm->pr, $user->isGuest() ? false : true);
                    $relation->save();
                }
            }
        }
    }
    // if
    if ($new_project instanceof Project && logged_user() instanceof User && logged_user()->isProjectUser($new_project)) {
        evt_add("workspace added", array("id" => $new_project->getId(), "name" => $new_project->getName(), "color" => $new_project->getColor()));
    }
    // Send notification...
    try {
        if (array_var($user_data, 'send_email_notification')) {
            Notifier::newUserAccount($user, $password);
        }
        // if
    } catch (Exception $e) {
    }
    // try
    return $user;
}
 /**
  * Create new user
  *
  * @param void
  * @return null
  */
 function add()
 {
     $this->wireframe->print_button = false;
     if ($this->request->isApiCall() && !$this->request->isSubmitted()) {
         $this->httpError(HTTP_ERR_BAD_REQUEST);
     }
     // if
     if (!User::canAdd($this->logged_user, $this->active_company)) {
         $this->httpError(HTTP_ERR_FORBIDDEN);
     }
     // if
     $user_data = $this->request->post('user');
     if (!is_array($user_data)) {
         $user_data = array('role_id' => ConfigOptions::getValue('default_role'), 'auto_assign' => false);
     }
     // if
     $this->smarty->assign(array('user_data' => $user_data));
     if ($this->request->isSubmitted()) {
         db_begin_work();
         // Validate password
         if ($this->request->isApiCall() || array_var($user_data, 'specify_password')) {
             $errors = new ValidationErrors();
             $password = array_var($user_data, 'password');
             $password_a = array_var($user_data, 'password_a');
             if (strlen(trim($password)) < 3) {
                 $errors->addError(lang('3 Letters or Longer'), 'password');
             } else {
                 if ($password != $password_a) {
                     $errors->addError(lang('Passwords Mismatch'), 'password_a');
                 }
                 // if
             }
             // if
             if ($errors->hasErrors()) {
                 if ($this->request->getFormat() == FORMAT_HTML) {
                     $this->smarty->assign('errors', $errors);
                     $this->render();
                 } else {
                     $this->serveData($errors);
                 }
                 // if
             }
             // if
         } else {
             $password = make_password(11);
         }
         // if
         $this->active_user = new User();
         $this->active_user->setAttributes($user_data);
         $this->active_user->setPassword($password);
         $this->active_user->setCompanyId($this->active_company->getId());
         if ($this->logged_user->isPeopleManager()) {
             $this->active_user->setAutoAssignData((bool) array_var($user_data, 'auto_assign'), (int) array_var($user_data, 'auto_assign_role_id'), array_var($user_data, 'auto_assign_permissions'));
         } else {
             $this->active_user->setRoleId(ConfigOptions::getValue('default_role'));
         }
         // if
         $save = $this->active_user->save();
         if ($save && !is_error($save)) {
             $welcome_message_sent = false;
             if (array_var($user_data, 'send_welcome_message')) {
                 $welcome_message = trim(array_var($user_data, 'welcome_message'));
                 if ($welcome_message) {
                     UserConfigOptions::setValue('welcome_message', $welcome_message, $this->active_user);
                 }
                 // if
                 $welcome_message_sent = ApplicationMailer::send(array($this->active_user), 'system/new_user', array('created_by_id' => $this->logged_user->getId(), 'created_by_name' => $this->logged_user->getDisplayName(), 'created_by_url' => $this->logged_user->getViewUrl(), 'email' => $this->active_user->getEmail(), 'password' => $password, 'login_url' => assemble_url('login'), 'welcome_body' => $welcome_message ? nl2br(clean($welcome_message)) : ''));
             }
             // if
             $title = trim(array_var($user_data, 'title'));
             if ($title) {
                 UserConfigOptions::setValue('title', $title, $this->active_user);
             }
             // if
             db_commit();
             if ($this->request->isApiCall()) {
                 $this->serveData($this->active_user, 'user');
             } else {
                 if ($welcome_message_sent) {
                     flash_success('New user account has been created. Login information has been sent to :email', array('email' => $this->active_user->getEmail()));
                 } else {
                     flash_success('New user account has been created');
                 }
                 // if
                 $this->redirectToUrl($this->active_user->getViewUrl());
             }
             // if
         } else {
             db_rollback();
             if ($this->request->isApiCall()) {
                 $this->serveData($save);
             } else {
                 $this->smarty->assign('errors', $save);
             }
             // if
         }
         // if
     }
     // if
 }
 /**
  * Finish the installation - create owner company and administrator
  *
  * @param void
  * @return null
  */
 function complete_installation()
 {
     if (Companies::getOwnerCompany() instanceof Company) {
         die('Owner company already exists');
         // Somebody is trying to access this method even if the user already exists
     }
     // if
     $form_data = array_var($_POST, 'form');
     tpl_assign('form_data', $form_data);
     if (array_var($form_data, 'submited') == 'submited') {
         try {
             $admin_password = trim(array_var($form_data, 'admin_password'));
             $admin_password_a = trim(array_var($form_data, 'admin_password_a'));
             if (trim($admin_password) == '') {
                 throw new Error(lang('password value required'));
             }
             // if
             if ($admin_password != $admin_password_a) {
                 throw new Error(lang('passwords dont match'));
             }
             // if
             DB::beginWork();
             Users::delete();
             // clear users table
             Companies::delete();
             // clear companies table
             // Create the administrator user
             $administrator = new User();
             $administrator->setId(1);
             $administrator->setCompanyId(1);
             $administrator->setUsername(array_var($form_data, 'admin_username'));
             $administrator->setEmail(array_var($form_data, 'admin_email'));
             $administrator->setPassword($admin_password);
             $administrator->setCanEditCompanyData(true);
             $administrator->setCanManageConfiguration(true);
             $administrator->setCanManageSecurity(true);
             $administrator->setCanManageWorkspaces(true);
             $administrator->setCanManageContacts(true);
             $administrator->setCanManageTemplates(true);
             $administrator->setCanManageReports(true);
             $administrator->setCanManageTime(true);
             $administrator->setCanAddMailAccounts(true);
             $administrator->setAutoAssign(false);
             $administrator->setPersonalProjectId(1);
             $administrator->setType('admin');
             $administrator->save();
             $group = new Group();
             $group->setName('administrators');
             $group->setAllPermissions(true);
             $group->setId(Group::CONST_ADMIN_GROUP_ID);
             $group->save();
             $group_user = new GroupUser();
             $group_user->setGroupId(Group::CONST_ADMIN_GROUP_ID);
             $group_user->setUserId($administrator->getId());
             $group_user->save();
             $project = new Project();
             $project->setId(1);
             $project->setP1(1);
             $project->setName(new_personal_project_name($administrator->getUsername()));
             $project->setDescription(lang('files'));
             $project->setCreatedById($administrator->getId());
             $project->save();
             $project_user = new ProjectUser();
             $project_user->setProjectId($project->getId());
             $project_user->setUserId($administrator->getId());
             $project_user->setCreatedById($administrator->getId());
             $project_user->setAllPermissions(true);
             $project_user->save();
             // Create a company
             $company = new Company();
             $company->setId(1);
             $company->setClientOfId(0);
             $company->setName(array_var($form_data, 'company_name'));
             $company->setCreatedById(1);
             $company->save();
             DB::commit();
             $this->redirectTo('access', 'login');
         } catch (Exception $e) {
             tpl_assign('error', $e);
             DB::rollback();
         }
         // try
     }
     // if
 }