public static function sendSubscriptionVerificationTextMail($subscription) { $actions = array(); $delivery = array(); $users = new Default_Model_Researchers(); $subject = "EGI AppDB: Email subscription verification"; $body = ""; $nl = "\r\n"; $t = "\t"; //Find subscriber in researchers $users->filter->id->equals($subscription->researcherid); $users->refresh(); if (count($users->items) == 0) { error_log("[appdb:Subscription Verification Email] : Could not find user with id = " . $subscription->researcherID . " . Delivery cancelled."); return; } $user = $users->items[0]; //Get event types of subscriptions if (NewsEventType::has($subscription->events, NewsEventType::E_INSERT) == true) { $actions[] = "new software"; } if (NewsEventType::has($subscription->events, NewsEventType::E_UPDATE) == true) { $actions[] = "software updates"; } if (NewsEventType::has($subscription->events, NewsEventType::E_INSERT_CONTACT) == true) { $actions[] = "new contacts"; } if (NewsEventType::has($subscription->events, NewsEventType::E_INSERT_COMMENT) == true) { $actions[] = "new comments"; } //Get delivery types of subscriptions if (NewsDeliveryType::has($subscription->delivery, NewsDeliveryType::D_DAILY_DIGEST) == true) { $delivery[] = "daily"; } if (NewsDeliveryType::has($subscription->delivery, NewsDeliveryType::D_WEEKLY_DIGEST) == true) { $delivery[] = "every monday"; } if (NewsDeliveryType::has($subscription->delivery, NewsDeliveryType::D_MONTHLY_DIGEST) == true) { $delivery[] = "every 1st day of the month"; } $body = "Dear " . $user->firstName . " " . $user->lastName . "," . $nl . $nl; $body .= "Your request to receive e-mail notifications about '" . $subscription->name . "' has been processed. " . $nl . $nl; //Render actions (events) $body .= "You will be notified for"; if (count($actions) == 1) { $body .= " " . $actions[0]; } else { $ac = count($actions); for ($i = 0; $i < $ac; $i += 1) { $body .= " " . $actions[$i]; if ($i == $ac - 2) { $body .= ($ac > 2 ? "," : "") . " and"; } else { if ($i < $ac - 1) { $body .= ","; } } } } $body .= "." . $nl; //Render delivery $body .= "The delivery of notifications will take place"; if (count($delivery) == 1) { $body .= " " . $delivery[0]; } else { $dc = count($delivery); for ($i = 0; $i < $dc; $i += 1) { $body .= " " . $delivery[$i]; if ($i == $dc - 2) { $body .= ($dc > 2 ? "," : "") . " and"; } else { if ($i < $dc - 1) { $body .= ","; } } } } $body .= "." . $nl . $nl; $body .= 'If no new software registrations (or updates of existing software) occur within the given delivery time span, no e-mail will be sent.' . $nl . $nl; $body .= "Sincerely," . $nl; $body .= "EGI AppDB notifications service" . $nl; $body .= "website: http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "/"; //Get primary e-mail contact of subscriber and send e-mail $rs = new Default_Model_Contacts(); $rs->filter->researcherid->equals($subscription->researcherid)->and($rs->filter->contacttypeid->equals(7))->and($rs->filter->isprimary->equals(true)); if (count($rs->refresh()->items) > 0) { $to = $rs->items[0]->data; //sendMultipartMail($subject, $to, $body,'', '*****@*****.**', 'enadyskolopassword'); EmailService::sendReport($subject, $to, $body); error_log("[appdb:Subscription Verification Email]: Sending subscription verification to " . $to); } else { error_log("[appdb:Subscription Verification Email]: Cannot find a primary e-mail for user with id = " . $subscription->researcherid); } }
public function loginAction() { /* Check whether the user is already logged in */ if ($this->session->userid !== null) { if (!$this->handle_actions()) { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); header('Location: https://' . $_SERVER['HTTP_HOST'] . '/'); } return; } $this->view->session = $this->session; $ldap = ApplicationConfiguration::service('egi.ldap.host'); if (array_key_exists('username', $_POST)) { $this->view->username = $_POST['username']; $username = "******" . $_POST['username'] . ",ou=People,dc=egi,dc=eu"; $password = $_POST['password']; $ds = $this->initLDAP(true, $username, $password); if (is_resource($ds)) { @ldap_close($ds); $username = $_POST['username']; $this->session->username = $username; $users = new Default_Model_Researchers(); $users->viewModerated = true; $users->filter->username->equals($username); if ($users->count() == 1) { if (!$users->items[0]->deleted) { $this->session->userid = $users->items[0]->Id; $this->session->userRole = $users->items[0]->positionTypeID; $this->session->userCountryID = $users->items[0]->countryID; $this->session->userCountryName = $users->items[0]->country->name; $this->session->user = $users->items[0]; $this->session->fullName = $users->items[0]->firstName . " " . $users->items[0]->lastName; $this->session->cname = $users->items[0]->cname; setAuthCookies($username, md5($password)); $user = $users->items[0]; $user->lastLogin = time(); $user->password = md5($password); // TODO: remove this when SAML has been implemented $user->save(); $this->saveUserCredentials($user->id, md5($password)); // TODO: replace with SAML Auth token $this->handle_actions(); } else { $this->view->accountDeleted = true; error_log(var_export($users->items[0]->delInfo, true)); $this->view->accountDeleter = $users->items[0]->delInfo->deleter->name; $this->view->accountDeleterID = $users->items[0]->delInfo->deleter->id; $this->view->accountDeletedOn = $users->items[0]->delInfo->deletedOn; } } else { $this->session->claimPassword = md5($password); $ds = $this->initLDAP(true); // no rdn/pwd: root connection if ($ds !== false) { $users2 = new Default_Model_Contacts(); $sr = ldap_search($ds, "ou=people,dc=egi,dc=eu", "(uid=" . $_POST['username'] . ")"); $info = ldap_get_entries($ds, $sr); ldap_close($ds); if ($info["count"] > 0) { $this->session->fullName = $info[0]['cn'][0]; $users2->filter->data->ilike($info[0]['mail'][0]); if ($users2->refresh()->count() != 0) { // Found existing profiles $ids = array(); for ($i = 0; $i < $users2->count(); $i++) { $ids[] = $users2->items[$i]->researcherid; } $users->viewModerated = false; $users->filter->id->in($ids); $users->refresh(); $entries = array(); $canClaim = array(); for ($i = 0; $i < $users->count(); $i++) { $entries[] = $users->items[$i]; $canClaim[] = $users->items[$i]->id; } $this->view->entries = $entries; $this->session->canClaim = $canClaim; } else { // Create a new profile $roleTypeID = 3; if (array_key_exists('usercertificatesubject', $info[0])) { $sub = explode('/', $info[0]['usercertificatesubject'][0]); foreach ($sub as $s) { if (substr($s, 0, 2) == 'C=') { $country = substr($s, 2); $cs = new Default_Model_Countries(); $cs->filter->isocode->equals($country); if ($cs->count() > 0) { $this->view->country = $cs->items[0]->name; } break; } } } if (array_key_exists('sn', $info[0])) { $this->view->lastname = $info[0]['sn'][0]; $this->view->firstname = str_replace($info[0]['sn'][0], "", $info[0]['cn'][0]); } if (array_key_exists('destinationindicator', $info[0])) { $this->view->gender = $info[0]['destinationindicator'][0]; } if (array_key_exists('ou', $info[0])) { $this->view->institute = $info[0]['ou']['0']; } if (array_key_exists('employeetype', $info[0])) { if ($info[0]['employeetype'][0] == "Experienced researcher" || $info[0]['employeetype'][0] == "Management") { $roleTypeID = 2; } else { if ($info[0]['employeetype'][0] == "Technical Support" || $info[0]['employeetype'][0] == "PhD Student") { $roleTypeID = 3; } else { $roleTypeID = 4; } } } if (array_key_exists('mail', $info[0])) { $this->view->SSOmail = $info[0]['mail'][0]; } $pts = new Default_Model_PositionTypes(); $pts->filter->id->equals($roleTypeID); $this->view->roleType = $pts->items[0]->description; $contactTypes = new Default_Model_ContactTypes(); $this->view->contactTypes = $contactTypes->refresh(); } } } else { error_log($this->view->ldapError); } } } else { error_log($this->view->ldapError); } } }
public static function sendPermissionsRequest($userid, $apikeyid, $msg) { //Get sender $users = new Default_Model_Researchers(); $users->filter->id->equals($userid); if ($users->count() == 0) { return "Sender not found"; } $user = $users->items[0]; //Get sender's primary email $contacts = new Default_Model_Contacts(); $contacts->filter->isprimary->equals(true)->and($contacts->filter->researcherid->equals($userid)); if ($contacts->count() == 0) { return "Sender has no primary e-mail set"; } //Check if e-mail has value $useremail = $contacts->items[0]->data; if (trim($useremail) == '') { return "Sender has no valid primary e-mail set"; } //Get api key $apikeys = new Default_Model_APIKeys(); $apikeys->filter->id->equals($apikeyid)->and($apikeys->filter->ownerid->equals($userid)); if (count($apikeys) == 0) { return "Api key not found"; } $apikey = $apikeys->items[0]; //Get Appdb administrators $recipients = array(); $admins = new Default_Model_Researchers(); $agmf = new Default_Model_ActorGroupMembersFilter(); $agmf->groupid->numequals(-1); // admins $admins->filter->chain($agmf, "AND"); if (count($admins->items) == 0) { return ""; } //Get admins primary emails $admins = $admins->items; foreach ($admins as $admin) { $contacts = new Default_Model_Contacts(); $contacts->filter->isprimary->equals(true)->and($contacts->filter->researcherid->equals($admin->id))->and($contacts->filter->contacttypeid->equals(7)); if (count($contacts->items) == 0) { continue; } if (trim($contacts->items[0]->data) !== '') { $recipients[] = $contacts->items[0]->data; } } $recipients = array_unique($recipients); if (count($recipients) == 0) { return ""; } $textbody = self::getMailBody($user, $apikey, $msg); //Get text body and also set html body $body = preg_replace("/\\</", "<", $textbody); $body = preg_replace("/\\>/", ">", $body); $body = preg_replace("/\n/", "<br/>", $body); $body = preg_replace("/\t/", "<span style='padding-left:10px;'></span>", $body); $body = preg_replace("/\\[1\\]/", "<a href='http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "?p=" . base64_encode("/people/details?id=" . $user->id) . "' target='_blank' title='View person's entry in EGI AppDB' >" . $user->firstname . " " . $user->lastname . "</a>", $body); $body = preg_replace("/\\[2\\]/", "<b>" . $apikey->key . "</b>", $body); $body = "<html><head></head><body>" . $body . "</body></html>"; $textbody = preg_replace("/\t/", " ", $textbody); $textbody = preg_replace("/\\[1\\]/", $user->firstname . " " . $user->lastname . " [id: " . $user->id . ", url: http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "?p=" . base64_encode("/people/details?id=" . $user->id) . "]", $textbody); $textbody = preg_replace("/\\[2\\]/", $apikey->key, $textbody); $subject = "EGI AppDB: API Permissions request from user " . $user->firstname . " " . $user->lastname; //sendMultipartMail($subject,$recipients, $textbody, $body, '*****@*****.**', 'enadyskolopassword',$useremail); EmailService::sendReport($subject, $recipients, $textbody, $body, $useremail); return true; }
/** * implementation of abstract parse() operation from RestXMLParser. * * @xml SimpleXMLElement the root element of the application XML representation * * @return Default_Model_Researcher * @access public */ public function parse($xml) { if (!is_null($this->_user)) { $person = new Default_Model_Researcher(); try { $xml = new SimpleXMLElement($xml); } catch (Exception $e) { $this->_error = RestErrorEnum::RE_INVALID_REPRESENTATION; $this->_extError = $e->getMessage(); return $person; } $xmli = $xml->xpath('//person:person'); if (count($xmli) === 0) { $this->_error = RestErrorEnum::RE_INVALID_REPRESENTATION; return $person; } $xml = $xmli[0]; if ($this->_parent->getMethod() === RestMethodEnum::RM_POST) { if ($xml->attributes()->id) { $person->id = strval($xml->attributes()->id); } else { $this->_error = RestErrorEnum::RE_INVALID_REPRESENTATION; $this->_extError = 'Resource ID missing'; return $person; } } if ($xml->attributes()->nodissemination) { $person->noDissemination = strval($xml->attributes()->nodissemination) === "true" ? true : false; } if ($xml->attributes()->cname) { $person->cname = strval($xml->attributes()->cname); } $firstname = $this->el($xml, "person:firstname"); if (!is_null($firstname) && trim(strval($firstname)) !== "") { $person->firstName = trim(strval($firstname)); } $lastname = $this->el($xml, "person:lastname"); if (!is_null($lastname) && trim(strval($lastname)) !== "") { $person->lastName = trim(strval($lastname)); } $gender = $this->el($xml, "person:gender"); if (!is_null($gender)) { if (trim(strval($gender->attributes(RestAPIHelper::XMLNS_XSI())->nil)) === "true") { $person->gender = 'n/a'; } elseif (trim(strval($gender)) !== "") { if (trim(strtolower(strval($gender))) === "male") { $person->gender = "male"; } elseif (trim(strtolower(strval($gender))) === "female") { $person->gender = "female"; } } } if ($this->_parent->getMethod() === RestMethodEnum::RM_PUT) { $person->dateInclusion = date("Y-m-d"); $person->addedByID = $this->_parent->getUser()->id; } $person->lastUpdated = date('Y-m-d'); $institute = trim(strval($this->el($xml, "person:institute"))); if (!is_null($institute)) { $person->institution = trim(strval($institute)); } $country = $this->el($xml, "regional:country"); if (!is_null($country) && trim(strval($country->attributes()->id)) !== "") { $person->countryID = trim(strval($country->attributes()->id)); } $role = $this->el($xml, "person:role"); if (!is_null($role) && trim(strval($role->attributes()->id)) !== "") { $person->positionTypeID = trim(strval($role->attributes()->id)); } $image = $this->el($xml, "person:image"); $removeImageCache = false; if (!is_null($image)) { if (trim(strval($image->attributes(RestAPIHelper::XMLNS_XSI())->nil)) === "true") { $person->clearImage(); $removeImageCache = true; } else { if (!is_null($image->attributes()->type) && trim(strval($image->attributes()->type)) === "base64") { // image is given as byte64 encoded string if (trim(strval($image)) != '') { $person->image = pg_escape_bytea(trim(strval($image))); $removeImageCache = true; } } else { // image is given as URL if (trim(parse_url(strval($image), PHP_URL_SCHEME)) == '') { // no URL scheme present; assume uploaded file though // portal's uploadimage action in AppsController if (trim(strval($image)) != '') { try { $person->image = pg_escape_bytea(base64_encode(file_get_contents(APPLICATION_PATH . "/../public/" . trim(strval($image))))); $removeImageCache = true; } catch (Exception $e) { $this->_error = RestErrorEnum::RE_BACKEND_ERROR; $this->_extError = $e->getMessage(); return $person; } } } else { // URL scheme present; assume remote file if (trim(strval($image)) != '') { try { $person->image = pg_escape_bytea(base64_encode(file_get_contents(trim(strval($image))))); $removeImageCache = true; } catch (Exception $e) { $this->_error = RestErrorEnum::RE_BACKEND_ERROR; $this->_extError = $e->getMessage(); return $person; } } } } } } if ($removeImageCache === true) { if ($person->id != '' && file_exists(APPLICATION_PATH . "/../cache/ppl-image-" . $person->id . ".png")) { unlink(APPLICATION_PATH . "/../cache/ppl-image-" . $person->id . ".png"); } } $person->save(); if ($this->_parent->getMethod() === RestMethodEnum::RM_POST) { //remove existing contact info $conts = new Default_Model_Contacts(); $conts->filter->researcherid->equals($person->id); $conts->refresh(); for ($i = count($conts->items) - 1; $i >= 0; $i--) { $conts->remove($conts->items[$i]); } } //add new contact info $cts = new Default_Model_ContactTypes(); $cts->refresh(); $xmli = $xml->xpath("//person:contact"); $conts2 = new Default_Model_Contacts(); foreach ($xmli as $x) { if (trim(strval($x)) !== '') { $cont = new Default_Model_Contact(); $cont->researcherID = $person->id; $ct = trim(strval($x->attributes()->type)); $ctid = null; for ($i = 0; $i < count($cts->items); $i++) { if (strtolower($ct) == strtolower($cts->items[$i]->description)) { $ctid = $cts->items[$i]->id; break; } } if (!is_null($ctid)) { $cont->contactTypeID = $ctid; } else { $cont->contactTypeID = 7; //e-mail by default } $cont->data = trim(strval($x)); if (strval($x->attributes()->primary) === "true") { $cont->isPrimary = true; } $conts2->filter->data->equals($cont->data)->and($conts2->filter->contacttypeid->equals(7))->and($conts2->filter->researcherid->notequals($person->id)); $conts2->refresh("xml"); if (count($conts2->items) == 0) { $cont->save(); } else { $this->_error = RestErrorEnum::RE_BACKEND_ERROR; $this->_extError = "e-mail address `" . $cont->data . "' already exists"; return $person; } } } if ($this->_parent->getMethod() === RestMethodEnum::RM_POST || $this->_parent->getMethod() === RestMethodEnum::RM_PUT) { $xrels = $xml->xpath("person:relation"); $ps = new Default_Model_Researchers(); $ps->filter->id->equals($person->id); $p = null; if (count($ps->items) > 0) { $p = $ps->items[0]; } if ($p !== null) { $rels = array(); if (count($xml->xpath('person:relation[@xsi:nil="true"]')) === 0) { foreach ($xrels as $x) { $targuid = trim(strval($x->attributes()->targetguid)); $subguid = trim(strval($x->attributes()->subjectguid)); $rel = array("id" => trim(strval($x->attributes()->id)), "parentid" => trim(strval($x->attributes()->parentid))); if ($targuid === "") { $rel["subjectguid"] = $subguid; } else { if ($subguid === "") { $rel["targetguid"] = $targuid; } } if ($rel["parentid"] === "") { $rel["parentid"] = null; } $rels[] = $rel; } } try { $res = PersonRelations::syncRelations($p->guid, $this->_user->id, $rels); } catch (Exception $ex) { $res = $ex->getMessage(); } if (is_string($res)) { $this->_error = RestErrorEnum::RE_BACKEND_ERROR; $this->_extError = $res; return $p; } } } } $this->_error = RestErrorEnum::RE_OK; return $person; }
public static function sendMessage($appid, $userid, $recipientid, $message) { //Get sender $users = new Default_Model_Researchers(); $users->filter->id->equals($userid); if ($users->count() == 0) { return "Sender not found"; } $user = $users->items[0]; //Get sender's primary email $contacts = new Default_Model_Contacts(); $contacts->filter->isprimary->equals(true)->and($contacts->filter->researcherid->equals($userid)); if ($contacts->count() == 0) { return "Sender has no primary e-mail set"; } $useremail = $contacts->items[0]->data; //Get recipient $recipients = new Default_Model_Researchers(); $recipients->filter->id->equals($recipientid); if ($recipients->count() == 0) { return "Recipient not found"; } $recipient = $recipients->items[0]; //Get recipient's primary email $contacts = new Default_Model_Contacts(); $contacts->filter->isprimary->equals(true)->and($contacts->filter->researcherid->equals($recipientid)); if ($contacts->count() == 0) { return "Recipient has no primary e-mail set"; } $recipientmail = $contacts->items[0]->data; //Get application $applications = new Default_Model_Applications(); $applications->filter->id->equals($appid); if ($applications->count() == 0) { return "Software not found"; } $app = $applications->items[0]; //Decode message $message = base64_decode($message); if (strlen(trim($message)) === 0) { return "Message is empty"; } //Get text body and also set html body $textbody = self::getTextBody($app, $user, $useremail, $recipient, $message); $body = preg_replace("/\\</", "<", $textbody); $body = preg_replace("/\\>/", ">", $body); $body = preg_replace("/\n/", "<br/>", $body); $body = preg_replace("/\t/", "<span style='padding-left:10px;'></span>", $body); $body = preg_replace("/\\[1\\]/", "<a href='http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "' target='_blank' title='Visit EGI Applications Database' >EGI AppDB</a>", $body); $body = preg_replace("/\\[2\\]/", "<a href='http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "?p=" . base64_encode("//people/details?id=" . $user->id) . "' target='_blank' title='View person's entry in EGI AppDB' >" . $user->firstname . " " . $user->lastname . "</a>", $body); $body = preg_replace("/\\[3\\]/", "'<a href='http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "?p=" . base64_encode("/apps/details?id=" . $app->id) . "' target='_blank' title='View software entry in EGI AppDB' >" . $app->name . "</a>'", $body); $body = "<html><head></head><body>" . $body . "</body></html>"; $textbody = preg_replace("/\t/", " ", $textbody); $textbody = preg_replace("/\\[1\\]/", "EGI AppDB [1]", $textbody); $textbody = preg_replace("/\\[2\\]/", $user->firstname . " " . $user->lastname . " [2]", $textbody); $textbody = preg_replace("/\\[3\\]/", "'" . $app->name . "' [3]", $textbody); $textbody .= "\n\n________________________________________________________________________________________________________\n"; $textbody .= "[1]. http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "\n"; $textbody .= "[2]. http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "?p=" . base64_encode("/people/details?id=" . $user->id) . "\n"; $textbody .= "[3]. http://" . $_SERVER["APPLICATION_UI_HOSTNAME"] . "?p=" . base64_encode("/apps/details?id=" . $app->id) . " \n"; $subject = "EGI Applications Database: " . $user->firstname . " " . $user->lastname . " sent you a message"; if (trim($useremail) === '') { $useremail = false; } //sendMultipartMail($subject,$recipientmail, $textbody, $body, '*****@*****.**', 'enadyskolopassword',$useremail, null, false, array("From"=>$useremail)); EmailService::sendReportAsUser($useremail, $subject, $recipientmail, $textbody, $body); }
public function primarycontactAction() { $this->_helper->layout->disableLayout(); $this->_helper->viewRenderer->setNoRender(); $id = $this->_getParam("id"); $action = $this->_getParam("act"); $action = strtolower(trim($action)); if ($action == '') { $action = 'get'; } $error = ''; $res = ''; $resid = ''; if ($this->session->userid == null || $action === 'set' && $id == '') { $this->getResponse()->clearAllHeaders(); $this->getResponse()->setRawHeader("HTTP/1.0 403 Forbidden"); $this->getResponse()->setHeader("Status", "403 Forbidden"); return; } if ($action === 'set') { $p = new Default_Model_Contacts(); $p->filter->researcherid->equals($this->session->userid)->and($p->filter->id->equals($id)); if ($p->count() === 0) { $error = "The provided contact is not found"; } else { $pi = $p->items[0]; $pi->isprimary = true; $pi->save(); $resid = $pi->id; $res = $pi->data; } } else { $p = new Default_Model_Contacts(); $p->filter->researcherid->equals($this->session->userid)->and($p->filter->isprimary->equals(true)); if (count($p->items) === 0) { $error = "The provided contact is not found"; } else { $pi = $p->items[0]; $resid = $pi->id; $res = $pi->data; } } if ($error !== '') { echo "<response error='" . $error . "'></response>"; } else { echo "<response " . ($resid !== '' ? "id='" . $resid . "'" : "") . " >" . $res . "</response>"; } }