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(); }
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); } } }