/** * Worker - performs sending of registration data to mahara.org */ function registration_send_data() { $registrationurl = 'http://mahara.org/api/registration.php'; $data = registration_data(); $request = array(CURLOPT_URL => $registrationurl, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $data); return mahara_http_request($request); }
private static function scrape_url($url) { $config = array(CURLOPT_URL => $url); static $scrape_regex = '#.*?https?://(www\\.)?slideshare\\.net/share/(tweet|facebook|linkedin)/([0-9]+)/.*#'; $data = mahara_http_request($config); if (preg_match($scrape_regex, $data->data, $matches)) { $slideid = $matches[3]; return 'http://www.slideshare.net/slideshow/embed_code/' . $slideid; } return false; }
private static function scrape_url($url) { $config = array(CURLOPT_URL => $url); $data = mahara_http_request($config); if (!empty($data->data)) { if (preg_match('#.*var *wgArticleId *= *"?([0-9]+)"?;.*#', $data->data, $matches)) { $newurl = self::$base_url . 'index.php?curid=' . $matches[1]; return $newurl; } } return false; }
private static function scrape_url($url) { $config = array(CURLOPT_URL => $url); $data = mahara_http_request($config); if (!empty($data->data)) { if (preg_match('#<textarea[^>]*?id="glogiframe"[^>]*>.*?\\bsrc\\s*=\\s*"([^>"]+)"[^<]*</textarea>#m', $data->data, $matches)) { $iframe = html_entity_decode($matches[1], ENT_QUOTES); return $iframe; } } return false; }
public static function render_instance(BlockInstance $instance, $editing = false) { global $USER; // Get site wide Embed.ly API key $embedlyapikey = get_config_plugin('blocktype', 'embedly', 'embedlysiteapikey'); // Get user's Embed.ly API key if site wide key is empty or not set if (empty($embedlyapikey) || !isset($embedlyapikey)) { $owner = $instance->get('view_obj')->get('owner'); $embedlyapikey = get_account_preference($owner, 'embedlyapikey'); } $configdata = $instance->get('configdata'); $width = !empty($configdata['width']) ? hsc($configdata['width']) : null; $height = !empty($configdata['height']) ? hsc($configdata['height']) : null; $align = !empty($configdata['align']) ? hsc($configdata['align']) : 'left'; $result = ''; // To silence warning if (isset($configdata['mediaid'])) { // IE seems to wait for all elements on the page to load // fully before the onload event goes off. This means the // view editor isn't initialised until all videos have // finished loading, and an invalid video URL can stop the // editor from loading and result in an uneditable view. // Therefore, when this block appears on first load of the // view editing page, keep the embed code out of the page // initially and add it in after the page has loaded. $url = 'http://api.embed.ly/1/oembed?key=' . $embedlyapikey . '&url=' . urlencode($configdata['mediaid']) . '&maxwidth=' . $width . '&maxheight=' . $height . '&wmode=transparent'; $request = array(CURLOPT_URL => $url); $result = mahara_http_request($request); $data = json_decode($result->data, true); $result = '<div class="' . $align . '">'; $result .= '<p>' . $configdata['mediadesc'] . '</p>'; switch ($data['type']) { case 'photo': $result .= '<img src="' . $data['url'] . '" width="' . $width . '" height="' . $height . '" border="0">'; break; case 'video': case 'rich': $result .= $data['html']; break; case 'link': $result .= $configdata['mediaid']; break; } if (isset($data['description']) && !empty($configdata['showdescription'])) { $result .= '<p>' . nl2br($data['description']) . '</p>'; } $result .= '</div>'; } return $result; }
/** * Single HTTP Request * * @param string $url The URL to request * @param array $options cUrl options * @return bool */ protected function request($url, $method = 'get', $data = array(), array $additional_opts = array()) { $curlopts = array(CURLOPT_URL => $url); if ($method === 'get') { $curlopts[CURLOPT_HTTPGET] = true; } else { if ($method === 'post') { $curlopts[CURLOPT_POST] = true; $curlopts[CURLOPT_POSTFIELDS] = $data; } } if (!empty($this->headers)) { $headers = []; foreach ($this->headers as $k => $v) { $headers[] = $k . ': ' . $v; } $curlopts[CURLOPT_HTTPHEADER] = $headers; } $result = mahara_http_request($curlopts); return $result->data; }
/** * Parses the RSS feed given by $source. Throws an exception if the feed * isn't able to be parsed * * @param string $source The URI for the feed * @throws XML_Feed_Parser_Exception */ public static function parse_feed($source) { static $cache; if (empty($cache)) { $cache = array(); } if (array_key_exists($source, $cache)) { return $cache[$source]; } require_once 'XML/Feed/Parser.php'; $config = array(CURLOPT_URL => $source); $result = mahara_http_request($config); if ($result->error) { throw new XML_Feed_Parser_Exception($result->error); } if (empty($result->data)) { throw new XML_Feed_Parser_Exception('Feed url returned no data'); } try { $feed = new XML_Feed_Parser($result->data, false, true, false); } catch (XML_Feed_Parser_Exception $e) { $cache[$source] = $e; throw $e; // Don't catch other exceptions, they're an indication something // really bad happened } $data = new StdClass(); $data->title = $feed->title; $data->url = $source; $data->link = $feed->link; $data->description = $feed->description; // Work out the icon for the feed depending on whether it's RSS or ATOM $data->image = $feed->image; if (!$data->image) { // ATOM feed. These are simple strings $data->image = $feed->logo ? $feed->logo : null; } $data->content = array(); foreach ($feed as $count => $item) { if ($count == 20) { break; } $description = $item->content ? $item->content : ($item->description ? $item->description : ($item->summary ? $item->summary : null)); $data->content[] = (object) array('title' => $item->title, 'link' => $item->link, 'description' => $description); } $cache[$source] = $data; return $data; }
/** * Return a Gravatar URL if one exists for the given user. * * @param string $email Email address of the user * @param object $size Maximum size of the image * @param boolean $notfound The value to return if the avatar is not found * * @returns string The URL of the image or $notfound if none was found */ function remote_avatar($email, $size, $notfound) { if (!get_config('remoteavatars')) { return false; } require_once 'file.php'; $md5sum = md5(strtolower($email)); $s = 100; $newsize = image_get_new_dimensions($s, $s, $size); if ($newsize) { $s = min($newsize['w'], $newsize['h']); } $baseurl = 'http://www.gravatar.com/avatar/'; if (is_https() === true) { $baseurl = 'https://secure.gravatar.com/avatar/'; } if (get_config('remoteavatarbaseurl')) { $baseurl = get_config('remoteavatarbaseurl'); } // Check if it is a valid avatar $result = mahara_http_request(array(CURLOPT_URL => "{$baseurl}{$md5sum}.jpg?d=404", CURLOPT_HEADER => true, CURLOPT_NOBODY => true), true); if (!$result || $result->error || $result->info['http_code'] == 404) { return $notfound; } return "{$baseurl}{$md5sum}.jpg?r=g&s={$s}"; }
/** * Checks if $CFG->behat_wwwroot is available * * @return bool */ public static function is_server_running() { global $CFG; $request = mahara_http_request(array(CURLOPT_URL => $CFG->behat_wwwroot, CURLOPT_TIMEOUT => 5, CURLOPT_USERAGENT => ''), true); return !$request->error; }
private static function get_group_opt($host, $uid) { $opt = array(); $backpack_url = self::get_backpack_url($host); $res = mahara_http_request(array(CURLOPT_URL => $backpack_url . "displayer/{$uid}/groups.json")); $res = json_decode($res->data); if (!empty($res->groups)) { foreach ($res->groups as $g) { if ($g->name == 'Public badges' && $g->groupId == 0) { $name = get_string('obppublicbadges', 'blocktype.openbadgedisplayer'); } else { $name = hsc($g->name); } $name .= ' (' . get_string('nbadges', 'blocktype.openbadgedisplayer', $g->badges) . ')'; $cb_id = $host . ':' . $uid . ':' . $g->groupId; $cb_name = self::_sanitize_name($cb_id); $opt[$cb_name] = array('type' => 'checkbox', 'title' => $name, 'value' => $cb_id); } } return $opt; }
/** * Parses the RSS feed given by $source. Throws an exception if the feed * isn't able to be parsed * * @param string $source The URI for the feed * @param bool $insecuresslmode Skip certificate checking * @param string $authuser HTTP basic auth username to use * @param string $authpassword HTTP basic auth password to use * @throws XML_Feed_Parser_Exception */ public static function parse_feed($source, $insecuresslmode = false, $authuser = '', $authpassword = '') { static $cache; if (empty($cache)) { $cache = array(); } if (array_key_exists($source, $cache)) { if ($cache[$source] instanceof Exception) { throw $cache[$source]; } return $cache[$source]; } $config = array(CURLOPT_URL => $source, CURLOPT_TIMEOUT => 15, CURLOPT_USERAGENT => ''); if (!empty($authuser) || !empty($authpassword)) { $config[CURLOPT_USERPWD] = $authuser . ':' . $authpassword; } if ($insecuresslmode) { $config[CURLOPT_SSL_VERIFYPEER] = false; } $result = mahara_http_request($config, true); if ($result->error) { throw new XML_Feed_Parser_Exception($result->error); } if (empty($result->data)) { throw new XML_Feed_Parser_Exception('Feed url returned no data'); } try { $feed = new XML_Feed_Parser($result->data, false, true, false); } catch (XML_Feed_Parser_Exception $e) { $cache[$source] = $e; throw $e; // Don't catch other exceptions, they're an indication something // really bad happened } $data = new StdClass(); $data->title = $feed->title; $data->url = $source; $data->authuser = $authuser; $data->authpassword = $authpassword; $data->insecuresslmode = (int) $insecuresslmode; $data->link = $feed->link; $data->description = $feed->description; // Work out the icon for the feed depending on whether it's RSS or ATOM $data->image = $feed->image; if (!$data->image) { // ATOM feed. These are simple strings $data->image = $feed->logo ? $feed->logo : null; } $data->content = array(); foreach ($feed as $count => $item) { if ($count == 20) { break; } $description = $item->content ? $item->content : ($item->description ? $item->description : ($item->summary ? $item->summary : null)); if (!$item->title) { if (!empty($description)) { $item->title = substr($description, 0, 60); } else { if ($item->link) { $item->title = $item->link; } else { $item->title = get_string('notitle', 'view'); } } } if (!($pubdate = $item->pubDate)) { if (!($pubdate = $item->date)) { if (!($pubdate = $item->published)) { $pubdate = $item->updated; } } } $data->content[] = (object) array('title' => $item->title, 'link' => $item->link, 'description' => $description, 'pubdate' => $pubdate); } $cache[$source] = $data; return $data; }
/** * Function to check a BrowserID verifier status * @return boolean true if the verifier is available, false otherwise */ public static function is_available() { // Send a test assertion to the verification service $request = array(CURLOPT_URL => self::BROWSERID_VERIFIER_URL, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => 'request=1'); $response = mahara_http_request($request); if (!empty($response->data)) { $jsondata = json_decode($response->data); return !empty($jsondata); } return false; }
$SESSION->set('fileformat', ''); $SESSION->set('photograph', ''); $SESSION->set('internaldate', ''); $SESSION->set('externaldate', ''); // Stop processing the page exit; } if ($locale != '' and $fileformat != '' and $internaldate != '' and $externaldate != '') { if (in_array($fileformat, array('pdf', 'doc', 'odt', 'html'))) { $document = generate_europasscv_xml($USER->get('id'), false, $locale, $internaldate, $externaldate, $photograph); // Call XML Upgrade service $url = 'https://europass.cedefop.europa.eu/rest/v1/document/upgrade'; $header = array(); $header[] = 'Content-Type: application/xml'; $config = array(CURLOPT_URL => $url, CURLOPT_PORT => '443', CURLOPT_HEADER => true, CURLOPT_HTTPHEADER => $header, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $document, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_CAINFO => get_config('docroot') . 'artefact/europass/cert/cacert.crt'); $result = mahara_http_request($config); if ($result->info['http_code'] == 200 && !empty($result->data)) { $document_v3 = substr($result->data, $result->info['header_size']); // Call the API method switch ($fileformat) { case 'pdf': $url = 'https://europass.cedefop.europa.eu/rest/v1/document/to/pdf'; break; case 'doc': $url = 'https://europass.cedefop.europa.eu/rest/v1/document/to/word'; break; case 'odt': $url = 'https://europass.cedefop.europa.eu/rest/v1/document/to/opendoc'; break; } $header = array();
function send($wwwroot, $use_cached_peer = true) { $this->peer = get_peer($wwwroot, $use_cached_peer); $this->response = ''; $URL = $this->peer->wwwroot . $this->peer->application->xmlrpcserverurl; $this->requesttext = xmlrpc_encode_request($this->method, $this->params, array("encoding" => "utf-8")); $this->signedrequest = xmldsig_envelope($this->requesttext); $this->encryptedrequest = xmlenc_envelope($this->signedrequest, $this->peer->certificate); $config = array(CURLOPT_URL => $URL, CURLOPT_TIMEOUT => $this->timeout, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_USERAGENT => 'Mahara', CURLOPT_POSTFIELDS => $this->encryptedrequest, CURLOPT_HTTPHEADER => array("Content-Type: text/xml charset=UTF-8", 'Expect: '), CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => 0); $result = mahara_http_request($config); $timestamp_send = time(); $this->rawresponse = $result->data; $response_code = $result->info['http_code']; $response_code_prefix = substr($response_code, 0, 1); if ('2' != $response_code_prefix) { if ('4' == $response_code_prefix) { throw new XmlrpcClientException('Client error code: ' . $response_code); } else { if ('5' == $response_code_prefix) { throw new XmlrpcClientException('An error occurred at the remote server. Code: ' . $response_code); } } } $timestamp_receive = time(); $remote_timestamp = null; $curl_errno = $result->errno; if ($curl_errno || $this->rawresponse == false) { throw new XmlrpcClientException('Curl error: ' . $curl_errno . ': ' . $result->error); return false; } try { $xml = new SimpleXMLElement(trim($this->rawresponse)); } catch (Exception $e) { log_debug($this->rawresponse); throw new XmlrpcClientException('Payload is not a valid XML document (payload is above)', 6001); } try { if ($xml->getName() == 'encryptedMessage') { $payload_encrypted = true; $wwwroot = (string) $xml->wwwroot; // Strip encryption, using an older code is OK, because we're the client. // The server is able to respond with the correct key, be we're not $payload = xmlenc_envelope_strip($xml, true); } if ($xml->getName() == 'signedMessage') { $payload_signed = true; $remote_timestamp = $xml->timestamp; $payload = xmldsig_envelope_strip($xml); } } catch (CryptException $e) { throw new XmlrpcClientException("An error occurred while decrypting a message sent by {$wwwroot}. Unable to authenticate the user."); } if ($xml->getName() == 'methodResponse') { $this->response = xmlrpc_decode($payload); // Margin of error is the time it took the request to complete. $margin_of_error = $timestamp_receive - $timestamp_send; // Guess the time gap between sending the request and the remote machine // executing the time() function. Marginally better than nothing. $hysteresis = $margin_of_error / 2; if (!empty($remote_timestamp)) { $remote_timestamp = $remote_timestamp - $hysteresis; $time_offset = $remote_timestamp - $timestamp_send; if ($time_offset > self::get_max_server_time_difference()) { throw new XmlrpcClientException('Time drift (' . $margin_of_error . ', ' . $time_offset . ') is too large.'); } } if (is_array($this->response) && array_key_exists('faultCode', $this->response)) { if ($this->response['faultCode'] == 7025) { log_info('Remote application has sent us a new public key'); // The remote application sent back a new public key, the // old one must have expired if (array_key_exists('faultString', $this->response)) { $details = openssl_x509_parse($this->response['faultString']); if (isset($details['validTo_time_t'])) { $updateobj = (object) array('publickey' => $this->response['faultString'], 'publickeyexpires' => $details['validTo_time_t']); $whereobj = (object) array('wwwroot' => $wwwroot); update_record('host', $updateobj, $whereobj); log_info('New key has been imported. Valid until ' . date('Y/m/d h:i:s', $details['validTo_time_t'])); // Send request again. But don't use the cached // peer, look it up again now we've changed the // public key $this->send($wwwroot, false); } else { throw new XmlrpcClientException('Could not parse new public key'); } } else { throw new XmlrpcClientException('Remote site claims to have sent a public key, but they LIE'); } } throw new XmlrpcClientException('Unknown error occurred: ' . $this->response['faultCode'] . ': ' . $this->response['faultString']); } // Clean up so object can be re-used. $this->requesttext = ''; $this->signedrequest = ''; $this->encryptedrequest = ''; $this->params = array(); $this->method = ''; return true; } else { throw new XmlrpcClientException('Unrecognized XML document form: ' . $payload); } }
/** * Cronjob to check Launchpad for the latest Mahara version */ function cron_check_for_updates() { $request = array(CURLOPT_URL => 'https://launchpad.net/mahara/+download'); $result = mahara_http_request($request); if (!empty($result->errno)) { log_debug('Could not retrieve launchpad download page'); return; } $page = new DOMDocument(); libxml_use_internal_errors(true); $success = $page->loadHTML($result->data); libxml_use_internal_errors(false); if (!$success) { log_debug('Error parsing launchpad download page'); return; } $xpath = new DOMXPath($page); $query = '//div[starts-with(@id,"release-information-")]'; $elements = $xpath->query($query); $versions = array(); foreach ($elements as $e) { if (preg_match('/^release-information-(\\d+)-(\\d+)-(\\d+)$/', $e->getAttribute('id'), $match)) { $versions[] = "{$match['1']}.{$match['2']}.{$match['3']}"; } } if (!empty($versions)) { usort($versions, 'strnatcmp'); set_config('latest_version', end($versions)); } }
public static function render_instance(BlockInstance $instance, $editing = false) { $configdata = $instance->get('configdata'); // this will make sure to unserialize it for us $configdata['viewid'] = $instance->get('view'); $style = isset($configdata['style']) ? intval($configdata['style']) : 2; $copyright = null; // Needed to set Panoramio copyright later... $width = !empty($configdata['width']) ? $configdata['width'] : 75; switch ($style) { case 0: // thumbnails $template = 'thumbnails'; break; case 1: // slideshow $template = 'slideshow'; $width = !empty($configdata['width']) ? $configdata['width'] : 400; break; case 2: // square thumbnails $template = 'squarethumbs'; break; } $images = array(); $slimbox2 = get_config_plugin('blocktype', 'gallery', 'useslimbox2'); if ($slimbox2) { $slimbox2attr = 'lightbox_' . $instance->get('id'); } else { $slimbox2attr = null; } // if we're trying to embed external gallery (thumbnails or slideshow) if (isset($configdata['select']) && $configdata['select'] == 2) { $gallery = self::make_gallery_url($configdata['external']); if (empty($gallery)) { return get_string('externalnotsupported', 'blocktype.file/gallery'); } $url = isset($gallery['url']) ? hsc($gallery['url']) : null; $type = isset($gallery['type']) ? hsc($gallery['type']) : null; $var1 = isset($gallery['var1']) ? hsc($gallery['var1']) : null; $var2 = isset($gallery['var2']) ? hsc($gallery['var2']) : null; switch ($type) { case 'widget': /***************************** Roy Tanck's FLICKR WIDGET for Flickr RSS & Picasa RSS http://www.roytanck.com/get-my-flickr-widget/ *****************************/ $widget_sizes = array(100, 200, 300); $width = self::find_nearest($widget_sizes, $width); $images = urlencode(str_replace('&', '&', $url)); $template = 'imagecloud'; break; case 'picasa': // Slideshow if ($style == 1) { $picasa_show_sizes = array(144, 288, 400, 600, 800); $width = self::find_nearest($picasa_show_sizes, $width); $height = round($width * 0.75); $images = array('user' => $var1, 'gallery' => $var2); $template = 'picasashow'; } else { $picasa_thumbnails = array(32, 48, 64, 72, 104, 144, 150, 160); $width = self::find_nearest($picasa_thumbnails, $width); // If the Thumbnails should be Square... if ($style == 2) { $small = 's' . $width . '-c'; $URL = 'http://picasaweb.google.com/data/feed/api/user/' . $var1 . '/album/' . $var2 . '?kind=photo&thumbsize=' . $width . 'c'; } else { $small = 's' . $width; $URL = 'http://picasaweb.google.com/data/feed/api/user/' . $var1 . '/album/' . $var2 . '?kind=photo&thumbsize=' . $width; } $big = 's' . get_config_plugin('blocktype', 'gallery', 'previewwidth'); $xmlDoc = new DOMDocument('1.0', 'UTF-8'); $config = array(CURLOPT_URL => $URL, CURLOPT_RETURNTRANSFER => true); $result = mahara_http_request($config); $xmlDoc->loadXML($result->data); $photos = $xmlDoc->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'group'); foreach ($photos as $photo) { $children = $photo->cloneNode(true); $thumb = $children->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'thumbnail')->item(0)->getAttribute('url'); $description = null; if (isset($children->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'description')->item(0)->firstChild->nodeValue)) { $description = $children->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'description')->item(0)->firstChild->nodeValue; } $images[] = array('link' => str_replace($small, $big, $thumb), 'source' => $thumb, 'title' => $description, 'slimbox2' => $slimbox2attr); } } break; case 'flickr': // Slideshow if ($style == 1) { $flickr_show_sizes = array(400, 500, 700, 800); $width = self::find_nearest($flickr_show_sizes, $width); $height = round($width * 0.75); $images = array('user' => $var1, 'gallery' => $var2); $template = 'flickrshow'; } else { $width = 75; // Currently only thumbnail size, that Flickr supports $api_key = get_config_plugin('blocktype', 'gallery', 'flickrapikey'); $URL = 'http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&extras=url_sq,url_t&photoset_id=' . $var2 . '&api_key=' . $api_key; $xmlDoc = new DOMDocument('1.0', 'UTF-8'); $config = array(CURLOPT_URL => $URL, CURLOPT_RETURNTRANSFER => true); $result = mahara_http_request($config); $xmlDoc->loadXML($result->data); $photos = $xmlDoc->getElementsByTagName('photo'); foreach ($photos as $photo) { // If the Thumbnails should be Square... if ($style == 2) { $thumb = $photo->getAttribute('url_sq'); $link = str_replace('_s.jpg', '_b.jpg', $thumb); } else { $thumb = $photo->getAttribute('url_t'); $link = str_replace('_t.jpg', '_b.jpg', $thumb); } $description = $photo->getAttribute('title'); $images[] = array('link' => $link, 'source' => $thumb, 'title' => $description, 'slimbox2' => $slimbox2attr); } } break; case 'panoramio': // Slideshow if ($style == 1) { $height = round($width * 0.75); $images = array('user' => $var1); $template = 'panoramioshow'; } else { $copyright = get_string('panoramiocopyright', 'blocktype.file/gallery'); $URL = 'http://www.panoramio.com/map/get_panoramas.php?set=' . $var1 . '&from=0&to=50&size=original&mapfilter=true'; $config = array(CURLOPT_URL => $URL, CURLOPT_RETURNTRANSFER => true); $result = mahara_http_request($config); $data = json_decode($result->data, true); foreach ($data['photos'] as $photo) { $link = str_replace('/original/', '/large/', $photo['photo_file_url']); // If the Thumbnails should be Square... if ($style == 2) { $thumb = str_replace('/original/', '/square/', $photo['photo_file_url']); $width = 60; // Currently only square thumbnail size, that Panoramio supports } else { $thumb = str_replace('/original/', '/thumbnail/', $photo['photo_file_url']); } $title = !empty($photo['photo_title']) ? $photo['photo_title'] : get_string('Photo', 'blocktype.file/gallery'); $description = '<a href="' . $photo['photo_url'] . '" target="_blank">' . $title . '</a>' . ' ' . get_string('by', 'blocktype.file/gallery') . ' ' . '<a href="' . $photo['owner_url'] . '" target="_blank">' . $photo['owner_name'] . '</a>'; $images[] = array('link' => $link, 'source' => $thumb, 'title' => $description, 'slimbox2' => $slimbox2attr); } } break; case 'photobucket': // Slideshow if ($style == 1) { $height = round($width * 0.75); $images = array('url' => $url, 'user' => $var1, 'album' => $var2); $template = 'photobucketshow'; } else { $consumer_key = get_config_plugin('blocktype', 'gallery', 'pbapikey'); // PhotoBucket API key $consumer_secret = get_config_plugin('blocktype', 'gallery', 'pbapiprivatekey'); //PhotoBucket API private key $oauth_signature_method = 'HMAC-SHA1'; $oauth_version = '1.0'; $oauth_timestamp = time(); $mt = microtime(); $rand = mt_rand(); $oauth_nonce = md5($mt . $rand); $method = 'GET'; $albumname = $var1 . '/' . $var2; $api_url = 'http://api.photobucket.com/album/' . urlencode($albumname); $params = null; $paramstring = 'oauth_consumer_key=' . $consumer_key . '&oauth_nonce=' . $oauth_nonce . '&oauth_signature_method=' . $oauth_signature_method . '&oauth_timestamp=' . $oauth_timestamp . '&oauth_version=' . $oauth_version; $base = urlencode($method) . '&' . urlencode($api_url) . '&' . urlencode($paramstring); $oauth_signature = base64_encode(hash_hmac('sha1', $base, $consumer_secret . '&', true)); $URL = $api_url . '?' . $paramstring . '&oauth_signature=' . urlencode($oauth_signature); $xmlDoc = new DOMDocument('1.0', 'UTF-8'); $config = array(CURLOPT_URL => $URL, CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true); $result = mahara_http_request($config); $xmlDoc->loadXML($result->data); $xmlDoc2 = new DOMDocument('1.0', 'UTF-8'); $config2 = array(CURLOPT_URL => $xmlDoc->getElementsByTagName('url')->item(0)->firstChild->nodeValue, CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true); $result2 = mahara_http_request($config2); $xmlDoc2->loadXML($result->data); $photos = $xmlDoc2->getElementsByTagName('media'); foreach ($photos as $photo) { $children = $photo->cloneNode(true); $link = $children->getElementsByTagName('url')->item(0)->firstChild->nodeValue; $thumb = $children->getElementsByTagName('thumb')->item(0)->firstChild->nodeValue; $description = null; if (isset($children->getElementsByTagName('description')->item(0)->firstChild->nodeValue)) { $description = $children->getElementsByTagName('description')->item(0)->firstChild->nodeValue; } $images[] = array('link' => $link, 'source' => $thumb, 'title' => $description, 'slimbox2' => $slimbox2attr); } } break; case 'windowslive': // Slideshow if ($style == 1) { $images = array('url' => $url, 'user' => $var1, 'album' => $var2); $template = 'windowsliveshow'; } else { $config = array(CURLOPT_URL => str_replace(' ', '%20', $url), CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true); $result = mahara_http_request($config); $data = $result->data; // Extract data about images and thumbs from HTML source - hack! preg_match_all("#previewImageUrl: '([a-zA-Z0-9\\_\\-\\.\\\\/]+)'#", $data, $photos); preg_match_all("#thumbnailImageUrl: '([a-zA-Z0-9\\_\\-\\.\\\\/]+)'#", $data, $thumbs); for ($i = 0; $i < sizeof($photos[1]); $i++) { $images[] = array('link' => str_replace(array('\\x3a', '\\x2f', '\\x25', '\\x3fpsid\\x3d1'), array(':', '/', '%', ''), $photos[1][$i]), 'source' => str_replace(array('\\x3a', '\\x2f', '\\x25', '\\x3fpsid\\x3d1'), array(':', '/', '%', ''), $thumbs[1][$i]), 'title' => null, 'slimbox2' => $slimbox2attr); } } break; } } else { safe_require('artefact', 'file'); $artefactids = array(); if (isset($configdata['select']) && $configdata['select'] == 1 && is_array($configdata['artefactids'])) { $artefactids = $configdata['artefactids']; } else { if (!empty($configdata['artefactid'])) { // Get descendents of this folder. $artefactids = artefact_get_descendants(array(intval($configdata['artefactid']))); } } // This can be either an image or profileicon. They both implement // render_self foreach ($artefactids as $artefactid) { $image = $instance->get_artefact_instance($artefactid); if ($image instanceof ArtefactTypeProfileIcon) { $src = get_config('wwwroot') . 'thumb.php?type=profileiconbyid&id=' . $artefactid; $description = $image->get('title'); } else { if ($image instanceof ArtefactTypeImage) { $src = get_config('wwwroot') . 'artefact/file/download.php?file=' . $artefactid; $src .= '&view=' . $instance->get('view'); $description = $image->get('description'); } else { continue; } } if ($slimbox2) { $link = $src . '&maxwidth=' . get_config_plugin('blocktype', 'gallery', 'previewwidth'); } else { $link = get_config('wwwroot') . 'artefact/artefact.php?artefact=' . $artefactid . '&view=' . $instance->get('view'); } // If the Thumbnails are Square or not... if ($style == 2) { $src .= '&size=' . $width . 'x' . $width; $height = $width; } else { $src .= '&maxwidth=' . $width; $imgwidth = $image->get('width'); $imgheight = $image->get('height'); $height = $imgwidth > $width ? intval($width / $imgwidth * $imgheight) : $imgheight; } $images[] = array('link' => $link, 'source' => $src, 'height' => $height, 'title' => $image->get('description'), 'slimbox2' => $slimbox2attr); } } $smarty = smarty_core(); $smarty->assign('instanceid', $instance->get('id')); $smarty->assign('count', count($images)); $smarty->assign('images', $images); $smarty->assign('showdescription', !empty($configdata['showdescription']) ? $configdata['showdescription'] : false); $smarty->assign('width', $width); $smarty->assign('captionwidth', get_config_plugin('blocktype', 'gallery', 'photoframe') ? $width + 8 : $width); if (isset($height)) { $smarty->assign('height', $height); } if (isset($needsapikey)) { $smarty->assign('needsapikey', $needsapikey); } $smarty->assign('frame', get_config_plugin('blocktype', 'gallery', 'photoframe')); $smarty->assign('copyright', $copyright); return $smarty->fetch('blocktype:gallery:' . $template . '.tpl'); }
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL version 3 or later * @copyright For copyright information on Mahara, please see the README file distributed with this software. * */ define('INTERNAL', 1); define('PUBLIC', 1); require '../../init.php'; safe_require('auth', 'browserid'); if (empty($_SESSION['browseridexpires']) || time() >= $_SESSION['browseridexpires']) { $assertion = param_variable('assertion', null); if (!$assertion) { throw new AuthInstanceException(get_string('missingassertion', 'auth.browserid')); } // Send the assertion to the verification service $request = array(CURLOPT_URL => PluginAuthBrowserid::BROWSERID_VERIFIER_URL, CURLOPT_POST => 1, CURLOPT_POSTFIELDS => 'assertion=' . urlencode($assertion) . '&audience=' . get_audience()); $response = mahara_http_request($request); if (empty($response->data)) { throw new AuthInstanceException(get_string('badverification', 'auth.browserid')); } $jsondata = json_decode($response->data); if (empty($jsondata)) { throw new AuthInstanceException(get_string('badverification', 'auth.browserid')); } if ($jsondata->status != 'okay') { throw new AuthInstanceException(get_string('badassertion', 'auth.browserid', htmlspecialchars($jsondata->reason))); } $SESSION->set('browseridexpires', $jsondata->expires / 1000); $SESSION->set('browseridemail', $jsondata->email); } // Not using $USER->get('sesskey') for this because when we printed the browserid setup stuff // in auth/browserid/lib.php, $USER isn't set up yet.
function get_public_key($uri, $application = null) { static $keyarray = array(); if (isset($keyarray[$uri])) { return $keyarray[$uri]; } $openssl = OpenSslRepo::singleton(); if (empty($application)) { $application = 'moodle'; } $xmlrpcserverurl = get_field('application', 'xmlrpcserverurl', 'name', $application); if (empty($xmlrpcserverurl)) { throw new XmlrpcClientException('Unknown application'); } $wwwroot = dropslash(get_config('wwwroot')); $rq = xmlrpc_encode_request('system/keyswap', array($wwwroot, $openssl->certificate), array("encoding" => "utf-8")); $config = array(CURLOPT_URL => $uri . $xmlrpcserverurl, CURLOPT_POST => true, CURLOPT_USERAGENT => 'Moodle', CURLOPT_POSTFIELDS => $rq, CURLOPT_HTTPHEADER => array("Content-Type: text/xml charset=UTF-8", 'Expect: ')); $result = mahara_http_request($config); if (!empty($result->errno)) { throw new XmlrpcClientException('Curl error: ' . $result->errno . ': ' . $result->error); } if (empty($result->data)) { throw new XmlrpcClientException('CURL connection failed'); } $response_code = $result->info['http_code']; $response_code_prefix = substr($response_code, 0, 1); if ('2' != $response_code_prefix) { if ('4' == $response_code_prefix) { throw new XmlrpcClientException('Client error code: ', $response_code); } elseif ('5' == $response_code_prefix) { throw new XmlrpcClientException('An error occurred at the remote server. Code: ', $response_code); } } $res = xmlrpc_decode($result->data); // XMLRPC error messages are returned as an array // We are expecting a string if (!is_array($res)) { $keyarray[$uri] = $res; $credentials = array(); if (strlen(trim($keyarray[$uri]))) { $credentials = openssl_x509_parse($keyarray[$uri]); $host = $credentials['subject']['CN']; if (strpos($uri, $host) !== false) { return $keyarray[$uri]; } throw new XmlrpcClientException('The remote site sent us a key that is valid for ' . $host . ' instead of their hostname (' . $uri . ')', 500); } } else { throw new XmlrpcClientException($res['faultString'], $res['faultCode']); } return false; }
public function get_user_profile($type = 'basicprofile', $owner = null) { global $USER, $SESSION; $referring_page = basename($_SERVER['SCRIPT_NAME']) . '?' . $_SERVER['QUERY_STRING']; // TODO: check if that really works self::check_access_token($referring_page); $consumer = self::get_service_consumer(); if (!$owner) { $owner = $USER->get('id'); } if (!empty($consumer->key) && !empty($consumer->secret)) { $data = get_record('usr_account_preference', 'usr', $owner, 'field', 'linkedinprofile'); if ($data) { $token = unserialize($data->value); switch ($type) { case 'fullprofile': //$fields = ':(first-name,last-name,formatted-name,headline,location:(name),picture-url,picture-urls::(original),public-profile-url,member-url-resources,num-connections,three-current-positions,three-past-positions,summary,specialties,positions,languages,educations,skills,group-memberships)'; // SEE: https://developer.linkedin.com/support/developer-program-transition#hero-par_longformtext_longform-text-content-par_resourceparagraph_5 $fields = ':(first-name,last-name,formatted-name,headline,location:(name),picture-url,picture-urls::(original),public-profile-url,num-connections,three-current-positions,three-past-positions,summary,specialties,positions,languages,educations,skills,group-memberships)'; break; case 'contactinfo': //$fields = ':(first-name,last-name,formatted-name,headline,location:(name),picture-url,picture-urls::(original),public-profile-url,member-url-resources,email-address,phone-numbers,main-address,primary-twitter-account)'; // SEE: https://developer.linkedin.com/support/developer-program-transition#hero-par_longformtext_longform-text-content-par_resourceparagraph_5 $fields = ':(first-name,last-name,formatted-name,headline,location:(name),picture-url,picture-urls::(original),public-profile-url,email-address)'; break; case 'basicprofile': default: $fields = ':(first-name,last-name,formatted-name,headline,location:(name),picture-url,public-profile-url)'; break; } $url = $consumer->apiurl . 'people/~' . $fields; $method = 'POST'; $port = $consumer->ssl ? '443' : '80'; $params = array('oauth2_access_token' => $token['access_token']); $config = array(CURLOPT_URL => $url . '?' . oauth_http_build_query($params), CURLOPT_PORT => $port, CURLOPT_POST => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_CAINFO => dirname(__FILE__) . '/cert/cacert.crt'); $result = mahara_http_request($config); if (isset($result->data) && !empty($result->data) && isset($result->info) && !empty($result->info) && $result->info['http_code'] == 200) { $data = oauth_parse_xml($result->data); return $data; } else { $SESSION->add_error_msg(get_string('httprequesterror', 'blocktype.linkedinprofile') . ' ' . $result->info['http_code']); } } else { $SESSION->add_error_msg(get_string('notconnectedtolinkedin', 'blocktype.linkedinprofile')); } } else { throw new ConfigException('Can\'t find LinkedIn api key and/or secret key.'); } }