/** * Attempt to authenticate the current user. * * @return object User object if successful, PEAR_Error otherwise. * @access public */ public function authenticate() { global $configArray; if (!isset($_POST['assertion'])) { return new PEAR_Error('Missing assertion'); } $assertion = $_POST['assertion']; $audience = (empty($_SERVER['HTTPS']) ? 'http://' : 'https://') . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT']; $postdata = 'assertion=' . urlencode($assertion) . '&audience=' . urlencode($audience); $client = new Proxy_Request('https://verifier.login.persona.org/verify'); $client->setMethod(HTTP_REQUEST_METHOD_POST); $client->addPostData('assertion', $assertion); $client->addPostData('audience', $audience); $client->sendRequest(); $response = $client->getResponseBody(); $result = json_decode($response); if ($result->status !== 'okay') { return new PEAR_ERROR($result->reason); } $user = new User(); $user->username = (isset($configArray['Site']['institution']) ? $configArray['Site']['institution'] . ':' : '') . $result->email; $userIsInVufindDatabase = $user->find(true); $user->authMethod = 'MozillaPersona'; if (!$userIsInVufindDatabase || !$user->email) { $user->email = $result->email; } $user->last_login = date('Y-m-d H:i:s'); if ($userIsInVufindDatabase) { $user->update(); } else { $user->created = date('Y-m-d'); $user->insert(); } return $user; }
/** * Send an NCIP request. * * @param string $xml XML request document * * @return object SimpleXMLElement parsed from response * @access private */ private function _sendRequest($xml) { // Make the NCIP request: $client = new Proxy_Request(null, array('useBrackets' => false)); $client->setMethod(HTTP_REQUEST_METHOD_POST); $client->setURL($this->_config['Catalog']['url']); $client->addPostData('NCIP', $xml); $result = $client->sendRequest(); if (PEAR::isError($result)) { PEAR::raiseError($result); } // Process the NCIP response: $response = $client->getResponseBody(); if ($result = @simplexml_load_string($response)) { return $result; } else { PEAR::raiseError(new PEAR_Error("Problem parsing XML")); } }
/** * Get data and output in JSON * * @return void * @access public */ public function getRSIStatuses() { //<SFX server>:<port>/<sfx_instance>/cgi/core/rsi/rsi.cgi global $configArray; if (!isset($configArray['OpenURL']['url'])) { return $this->output(array(), JSON::STATUS_OK); } $sfxUrl = $configArray['OpenURL']['url'] . "/cgi/core/rsi/rsi.cgi"; $metalib = new MetaLib(); $indexEngine = SearchObjectFactory::initSearchObject()->getIndexEngine(); $dom = new DOMDocument('1.0', 'UTF-8'); // ID REQUEST $idReq = $dom->createElement('IDENTIFIER_REQUEST', ''); $idReq->setAttribute("VERSION", "1.0"); $idReq->setAttribute("xsi:noNamespaceSchemaLocation", "ISSNRequest.xsd"); $idReq->setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); $dom->appendChild($idReq); // Cache values and status in an array $rsiResults = array(); $validRequest = false; foreach ($_REQUEST['id'] as $id) { if (strncmp($id, 'metalib.', 8) == 0) { if (!($record = $metalib->getRecord($id))) { $this->output('Record does not exist', JSON::STATUS_ERROR); return; } $values = array('isbn' => !empty($record['ISBN']) ? $record['ISBN'][0] : '', 'issn' => !empty($record['ISSN']) ? $record['ISSN'][0] : '', 'year' => !empty($record['PublicationDate']) ? $record['PublicationDate'][0] : '', 'volume' => !empty($record['Volume']) ? $record['Volume'] : '', 'issue' => !empty($record['Issue']) ? $record['Issue'] : '', 'institute' => isset($configArray['OpenURL']['institute']) ? $configArray['OpenURL']['institute'] : ''); } else { if (!($record = $indexEngine->getRecord($id))) { $this->output('Record does not exist', JSON::STATUS_ERROR); return; } $recordDriver = RecordDriverFactory::initRecordDriver($record); $values = $recordDriver->getRSIValues($recordDriver); } $result = array('id' => $id, 'status' => 'noInformation'); // Ignore the record if mandatory elements are not available if (empty($values['issn']) && empty($values['isbn'])) { // Mark this result invalid so it can be skipped when processing results $result['invalid'] = true; $rsiResults[] = $result; continue; } $rsiResults[] = $result; $validRequest = true; // ID REQUEST ITEM $idReqItem = $dom->createElement('IDENTIFIER_REQUEST_ITEM', ''); $idReq->appendChild($idReqItem); // ID if (!empty($values['issn'])) { $identifier = $dom->createElement('IDENTIFIER', 'issn:' . $values['issn']); $idReqItem->appendChild($identifier); } if (!empty($values['isbn'])) { $identifier = $dom->createElement('IDENTIFIER', 'isbn:' . $values['isbn']); $idReqItem->appendChild($identifier); } // Optional elements if ($values['year']) { $year = $dom->createElement('YEAR', $values['year']); $idReqItem->appendChild($year); } if ($values['volume']) { $volume = $dom->createElement('VOLUME', $values['volume']); $idReqItem->appendChild($volume); } if ($values['issue']) { $issue = $dom->createElement('ISSUE', $values['issue']); $idReqItem->appendChild($issue); } if ($values['institute']) { $institute = $dom->createElement('INSTITUTE_NAME', $values['institute']); $idReqItem->appendChild($institute); } } if (!$validRequest) { return $this->output(array(), JSON::STATUS_OK); } $xml = $dom->saveXML(); $req = new Proxy_Request($sfxUrl, array('saveBody' => true)); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addPostData('request_xml', $xml); $req->sendRequest(); $code = $req->getResponseCode(); if ($code != 200) { $this->output("SFX RSI request failed ({$code})", JSON::STATUS_ERROR); return; } $dom->loadXML($req->getResponseBody()); $items = $dom->getElementsByTagName('IDENTIFIER_RESPONSE_ITEM'); $position = -1; foreach ($items as $item) { $requests = $dom->getElementsByTagName('IDENTIFIER_REQUEST_ITEM'); $request = $requests->item(0); $position++; // Bypass invalid ID's and stop if at the end of list. while (isset($rsiResults[$position]['invalid'])) { ++$position; } if (!isset($rsiResults[$position])) { break; } $result = $item->getElementsByTagName('RESULT')->item(0)->nodeValue; if ($result == 'not found') { $rsiResults[$position]['status'] = 'noFullText'; } elseif ($result == 'maybe') { $rsiResults[$position]['status'] = 'maybeFullText'; } else { foreach ($item->getElementsByTagName('AVAILABLE_SERVICES') as $service) { if ($service->nodeValue == 'getFullTxt') { $peerReviewed = false; foreach ($item->getElementsByTagName('PEER_REVIEWED') as $peer) { if ($peer->nodeValue == 'YES') { $peerReviewed = true; break; } } $rsiResults[$position]['status'] = $peerReviewed ? 'peerReviewedFullText' : 'fullText'; break; } } } } $results = array(); foreach ($rsiResults as $result) { $results[] = array('id' => $result['id'], 'status' => $result['status']); } return $this->output($results, JSON::STATUS_OK); }