Example #1
0
 public function createnewprofileAction()
 {
     $this->_helper->layout->disableLayout();
     if ($this->session->userid !== -1 || $this->session->isNewUser !== true) {
         $this->_helper->viewRenderer->setNoRender();
         header("HTTP/1.0 404 Not Found");
         return;
     }
     $firstname = isset($_POST["firstName"]) ? trim($_POST["firstName"]) : null;
     $lastname = isset($_POST["lastName"]) ? trim($_POST["lastName"]) : null;
     $gender = isset($_POST["gender"]) ? trim($_POST["gender"]) : null;
     $institution = isset($_POST["institution"]) ? trim($_POST["institution"]) : null;
     $countryid = isset($_POST["countryID"]) ? intval($_POST["countryID"]) : null;
     $positiontypeid = isset($_POST["positionTypeID"]) ? intval($_POST["positionTypeID"]) : null;
     $error = array();
     if ($firstname === null) {
         array_push($error, "Invalid user first name given");
     }
     if ($lastname === null) {
         array_push($error, "Invalid user last name given");
     }
     //if( $institution === null ) array_push($error, "Invalid user institute given");
     if ($countryid === null) {
         array_push($error, "Invalid user country given");
     }
     if ($positiontypeid === null) {
         array_push($error, "Invalid user role given");
     }
     if (count($error) > 0) {
         //todo: Add Error handler
         $this->view->error = $error;
         return;
     }
     //Collect user information
     $entry = new Default_Model_Researcher();
     $entry->lastName = $lastname;
     $entry->firstName = $firstname;
     $entry->gender = $gender;
     $entry->institution = "";
     $entry->countryID = $countryid;
     $entry->positionTypeID = $positiontypeid;
     //Collect user contacts
     $conts = array();
     foreach ($_POST as $key => $value) {
         if (trim($value) === "") {
             continue;
         }
         if (substr($key, 0, 7) === "contact" && substr($key, 0, 11) !== "contactType") {
             $cnum = substr($key, 7);
             $cont = new Default_Model_Contact();
             $cont->data = $value;
             $cont->contactTypeID = $_POST['contactType' . $cnum];
             if (is_numeric($cont->contactTypeID) === false) {
                 array_push($error, "Invalid contact type given");
             }
             if (trim($value) === "") {
                 array_push($error, "Empty contact value given");
             }
             if (count($error) > 0) {
                 continue;
             }
             array_push($conts, $cont);
         }
     }
     //Collect user relations
     $relations = array();
     foreach ($_POST as $key => $value) {
         if (trim($value) === "") {
             continue;
         }
         if (strtolower(trim($key)) === "organization") {
             $data = json_decode($value);
             $relations[] = array("id" => trim(strval($data->id)), "targetguid" => trim(strval($data->targetguid)), "parentid" => null);
         }
     }
     if (count($error) > 0) {
         //todo: Add error handler
         $this->view->error = $error;
         return;
     }
     //Check if user account has been registered in the meanwhile
     $uid = $this->session->authUid;
     $source = $this->session->authSource;
     $useraccounts = new Default_Model_UserAccounts();
     $f1 = new Default_Model_UserAccountsFilter();
     $f2 = new Default_Model_UserAccountsFilter();
     $f1->accountid->equals($uid);
     $f2->accounttype->equals($source);
     $useraccounts->filter->chain($f1, "AND");
     $useraccounts->filter->chain($f2, "AND");
     if (count($useraccounts->items) > 0) {
         array_push($error, "User account is already registered");
         $this->view->error = $error;
         return;
     }
     //Everything is ok. Continue with saving new profile
     //Save entry
     $entry->save();
     //Save entry contacts
     for ($i = 0; $i < count($conts); $i += 1) {
         $cont = $conts[$i];
         $cont->researcherID = $entry->id;
         $cont->save();
     }
     //extract IDP Trace in case it is returned from SAML
     $attrs = $this->session->samlattrs;
     $idptrace = array();
     if (isset($attrs['idp:traceidp']) && is_array($attrs['idp:traceidp'])) {
         $idptrace = $attrs['idp:traceidp'];
     }
     //Save user account
     $useraccount = new Default_Model_UserAccount();
     $useraccount->researcherid = $entry->id;
     $useraccount->accountid = $this->session->authUid;
     $useraccount->accounttypeid = str_replace("-sp", "", $this->session->authSource);
     $useraccount->IDPTrace = $idptrace;
     $useraccount->save();
     //Save user relations (organization)
     if ($entry && count($relations) > 0) {
         //ensure permissions are built
         $try_counter = 0;
         while ($try_counter < 25) {
             $try_counter += 1;
             $confs = db()->query("select data from config where var = 'permissions_cache_dirty';")->fetchAll();
             if (count($confs) > 0) {
                 $conf = $confs[0];
                 if (isset($conf["data"]) && trim($conf["data"]) === '0') {
                     break;
                 }
             }
             sleep(1);
         }
         //Refetch entry (user) to retrieve guid
         $us = new Default_Model_Researchers();
         $us->filter->id->numequals($entry->id);
         if (count($us->items) > 0) {
             $u = $us->items[0];
             EntityRelations::syncRelations($u->guid, $u->id, $relations);
         }
     }
     //Setup new session
     if ($entry) {
         //ensure race condition
         $try_counter = 0;
         while ($try_counter < 10) {
             $try_counter += 1;
             $ppl = new Default_Model_Researchers();
             $ppl->filter->id->equals($entry->id);
             if (count($ppl->items) > 0) {
                 break;
             }
             sleep(1);
         }
         unset($this->session->isNewUser);
         $this->session->userid = $entry->id;
         SamlAuth::setupSamlAuth($this->session);
     }
     $this->view->session = $this->session;
     $this->view->error = array();
 }
Example #2
0
 private static function pairResearcherOrganization($reltype, $userid, $recordids, $unrelateold = true)
 {
     $ps = new Default_Model_Researchers();
     $ps->filter->id->equals($userid);
     $p = null;
     if (count($ps->items) > 0) {
         $p = $ps->items[0];
     }
     if ($p !== null) {
         $rels = array();
         foreach ($recordids as $recordid) {
             $rel = array("id" => $reltype->id, "targetguid" => $recordid);
             $rel["parentid"] = null;
             $rels[] = $rel;
         }
         $res = EntityRelations::syncRelations($p->guid, $p->id, $rels, false, $unrelateold);
         if ($res !== true) {
             throw new Exception($res);
         }
     }
 }