Merge branch '0.8.x' of git://gitorious.org/laconica/dev into dev/0.8.x

This commit is contained in:
Evan Prodromou 2009-02-17 15:17:26 +00:00
commit 095aecdd5c
15 changed files with 4701 additions and 1051 deletions

4
README
View File

@ -201,6 +201,10 @@ and the URLs are listed here for your convenience.
version may render your Laconica site unable to send or receive XMPP version may render your Laconica site unable to send or receive XMPP
messages. messages.
- Facebook library. Used for the Facebook application. - Facebook library. Used for the Facebook application.
- PEAR Services_oEmbed. Used for some multimedia integration.
- PEAR HTTP_Request is an oEmbed dependency.
- PEAR Validat is an oEmbed dependency.e
- PEAR Net_URL is an oEmbed dependency.2
A design goal of Laconica is that the basic Web functionality should A design goal of Laconica is that the basic Web functionality should
work on even the most restrictive commercial hosting services. work on even the most restrictive commercial hosting services.

1521
extlib/HTTP/Request.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,106 @@
<?php
/**
* Listener for HTTP_Request and HTTP_Response objects
*
* PHP versions 4 and 5
*
* LICENSE:
*
* Copyright (c) 2002-2007, Richard Heyes
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* o Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* o Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* o The names of the authors may not be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @category HTTP
* @package HTTP_Request
* @author Alexey Borzov <avb@php.net>
* @copyright 2002-2007 Richard Heyes
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Listener.php,v 1.3 2007/05/18 10:33:31 avb Exp $
* @link http://pear.php.net/package/HTTP_Request/
*/
/**
* Listener for HTTP_Request and HTTP_Response objects
*
* This class implements the Observer part of a Subject-Observer
* design pattern.
*
* @category HTTP
* @package HTTP_Request
* @author Alexey Borzov <avb@php.net>
* @version Release: 1.4.4
*/
class HTTP_Request_Listener
{
/**
* A listener's identifier
* @var string
*/
var $_id;
/**
* Constructor, sets the object's identifier
*
* @access public
*/
function HTTP_Request_Listener()
{
$this->_id = md5(uniqid('http_request_', 1));
}
/**
* Returns the listener's identifier
*
* @access public
* @return string
*/
function getId()
{
return $this->_id;
}
/**
* This method is called when Listener is notified of an event
*
* @access public
* @param object an object the listener is attached to
* @param string Event name
* @param mixed Additional data
* @abstract
*/
function update(&$subject, $event, $data = null)
{
echo "Notified of event: '$event'\n";
if (null !== $data) {
echo "Additional data: ";
var_dump($data);
}
}
}
?>

813
extlib/Net/URL2.php Normal file
View File

@ -0,0 +1,813 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2007-2008, Christian Schmidt, Peytz & Co. A/S |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Christian Schmidt <schmidt at php dot net> |
// +-----------------------------------------------------------------------+
//
// $Id: URL2.php,v 1.10 2008/04/26 21:57:08 schmidt Exp $
//
// Net_URL2 Class (PHP5 Only)
// This code is released under the BSD License - http://www.opensource.org/licenses/bsd-license.php
/**
* @license BSD License
*/
class Net_URL2
{
/**
* Do strict parsing in resolve() (see RFC 3986, section 5.2.2). Default
* is true.
*/
const OPTION_STRICT = 'strict';
/**
* Represent arrays in query using PHP's [] notation. Default is true.
*/
const OPTION_USE_BRACKETS = 'use_brackets';
/**
* URL-encode query variable keys. Default is true.
*/
const OPTION_ENCODE_KEYS = 'encode_keys';
/**
* Query variable separators when parsing the query string. Every character
* is considered a separator. Default is specified by the
* arg_separator.input php.ini setting (this defaults to "&").
*/
const OPTION_SEPARATOR_INPUT = 'input_separator';
/**
* Query variable separator used when generating the query string. Default
* is specified by the arg_separator.output php.ini setting (this defaults
* to "&").
*/
const OPTION_SEPARATOR_OUTPUT = 'output_separator';
/**
* Default options corresponds to how PHP handles $_GET.
*/
private $options = array(
self::OPTION_STRICT => true,
self::OPTION_USE_BRACKETS => true,
self::OPTION_ENCODE_KEYS => true,
self::OPTION_SEPARATOR_INPUT => 'x&',
self::OPTION_SEPARATOR_OUTPUT => 'x&',
);
/**
* @var string|bool
*/
private $scheme = false;
/**
* @var string|bool
*/
private $userinfo = false;
/**
* @var string|bool
*/
private $host = false;
/**
* @var int|bool
*/
private $port = false;
/**
* @var string
*/
private $path = '';
/**
* @var string|bool
*/
private $query = false;
/**
* @var string|bool
*/
private $fragment = false;
/**
* @param string $url an absolute or relative URL
* @param array $options
*/
public function __construct($url, $options = null)
{
$this->setOption(self::OPTION_SEPARATOR_INPUT,
ini_get('arg_separator.input'));
$this->setOption(self::OPTION_SEPARATOR_OUTPUT,
ini_get('arg_separator.output'));
if (is_array($options)) {
foreach ($options as $optionName => $value) {
$this->setOption($optionName);
}
}
if (preg_match('@^([a-z][a-z0-9.+-]*):@i', $url, $reg)) {
$this->scheme = $reg[1];
$url = substr($url, strlen($reg[0]));
}
if (preg_match('@^//([^/#?]+)@', $url, $reg)) {
$this->setAuthority($reg[1]);
$url = substr($url, strlen($reg[0]));
}
$i = strcspn($url, '?#');
$this->path = substr($url, 0, $i);
$url = substr($url, $i);
if (preg_match('@^\?([^#]*)@', $url, $reg)) {
$this->query = $reg[1];
$url = substr($url, strlen($reg[0]));
}
if ($url) {
$this->fragment = substr($url, 1);
}
}
/**
* Returns the scheme, e.g. "http" or "urn", or false if there is no
* scheme specified, i.e. if this is a relative URL.
*
* @return string|bool
*/
public function getScheme()
{
return $this->scheme;
}
/**
* @param string|bool $scheme
*
* @return void
* @see getScheme()
*/
public function setScheme($scheme)
{
$this->scheme = $scheme;
}
/**
* Returns the user part of the userinfo part (the part preceding the first
* ":"), or false if there is no userinfo part.
*
* @return string|bool
*/
public function getUser()
{
return $this->userinfo !== false ? preg_replace('@:.*$@', '', $this->userinfo) : false;
}
/**
* Returns the password part of the userinfo part (the part after the first
* ":"), or false if there is no userinfo part (i.e. the URL does not
* contain "@" in front of the hostname) or the userinfo part does not
* contain ":".
*
* @return string|bool
*/
public function getPassword()
{
return $this->userinfo !== false ? substr(strstr($this->userinfo, ':'), 1) : false;
}
/**
* Returns the userinfo part, or false if there is none, i.e. if the
* authority part does not contain "@".
*
* @return string|bool
*/
public function getUserinfo()
{
return $this->userinfo;
}
/**
* Sets the userinfo part. If two arguments are passed, they are combined
* in the userinfo part as username ":" password.
*
* @param string|bool $userinfo userinfo or username
* @param string|bool $password
*
* @return void
*/
public function setUserinfo($userinfo, $password = false)
{
$this->userinfo = $userinfo;
if ($password !== false) {
$this->userinfo .= ':' . $password;
}
}
/**
* Returns the host part, or false if there is no authority part, e.g.
* relative URLs.
*
* @return string|bool
*/
public function getHost()
{
return $this->host;
}
/**
* @param string|bool $host
*
* @return void
*/
public function setHost($host)
{
$this->host = $host;
}
/**
* Returns the port number, or false if there is no port number specified,
* i.e. if the default port is to be used.
*
* @return int|bool
*/
public function getPort()
{
return $this->port;
}
/**
* @param int|bool $port
*
* @return void
*/
public function setPort($port)
{
$this->port = intval($port);
}
/**
* Returns the authority part, i.e. [ userinfo "@" ] host [ ":" port ], or
* false if there is no authority none.
*
* @return string|bool
*/
public function getAuthority()
{
if (!$this->host) {
return false;
}
$authority = '';
if ($this->userinfo !== false) {
$authority .= $this->userinfo . '@';
}
$authority .= $this->host;
if ($this->port !== false) {
$authority .= ':' . $this->port;
}
return $authority;
}
/**
* @param string|false $authority
*
* @return void
*/
public function setAuthority($authority)
{
$this->user = false;
$this->pass = false;
$this->host = false;
$this->port = false;
if (preg_match('@^(([^\@]+)\@)?([^:]+)(:(\d*))?$@', $authority, $reg)) {
if ($reg[1]) {
$this->userinfo = $reg[2];
}
$this->host = $reg[3];
if (isset($reg[5])) {
$this->port = intval($reg[5]);
}
}
}
/**
* Returns the path part (possibly an empty string).
*
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* @param string $path
*
* @return void
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* Returns the query string (excluding the leading "?"), or false if "?"
* isn't present in the URL.
*
* @return string|bool
* @see self::getQueryVariables()
*/
public function getQuery()
{
return $this->query;
}
/**
* @param string|bool $query
*
* @return void
* @see self::setQueryVariables()
*/
public function setQuery($query)
{
$this->query = $query;
}
/**
* Returns the fragment name, or false if "#" isn't present in the URL.
*
* @return string|bool
*/
public function getFragment()
{
return $this->fragment;
}
/**
* @param string|bool $fragment
*
* @return void
*/
public function setFragment($fragment)
{
$this->fragment = $fragment;
}
/**
* Returns the query string like an array as the variables would appear in
* $_GET in a PHP script.
*
* @return array
*/
public function getQueryVariables()
{
$pattern = '/[' .
preg_quote($this->getOption(self::OPTION_SEPARATOR_INPUT), '/') .
']/';
$parts = preg_split($pattern, $this->query, -1, PREG_SPLIT_NO_EMPTY);
$return = array();
foreach ($parts as $part) {
if (strpos($part, '=') !== false) {
list($key, $value) = explode('=', $part, 2);
} else {
$key = $part;
$value = null;
}
if ($this->getOption(self::OPTION_ENCODE_KEYS)) {
$key = rawurldecode($key);
}
$value = rawurldecode($value);
if ($this->getOption(self::OPTION_USE_BRACKETS) &&
preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) {
$key = $matches[1];
$idx = $matches[2];
// Ensure is an array
if (empty($return[$key]) || !is_array($return[$key])) {
$return[$key] = array();
}
// Add data
if ($idx === '') {
$return[$key][] = $value;
} else {
$return[$key][$idx] = $value;
}
} elseif (!$this->getOption(self::OPTION_USE_BRACKETS)
&& !empty($return[$key])
) {
$return[$key] = (array) $return[$key];
$return[$key][] = $value;
} else {
$return[$key] = $value;
}
}
return $return;
}
/**
* @param array $array (name => value) array
*
* @return void
*/
public function setQueryVariables(array $array)
{
if (!$array) {
$this->query = false;
} else {
foreach ($array as $name => $value) {
if ($this->getOption(self::OPTION_ENCODE_KEYS)) {
$name = rawurlencode($name);
}
if (is_array($value)) {
foreach ($value as $k => $v) {
$parts[] = $this->getOption(self::OPTION_USE_BRACKETS)
? sprintf('%s[%s]=%s', $name, $k, $v)
: ($name . '=' . $v);
}
} elseif (!is_null($value)) {
$parts[] = $name . '=' . $value;
} else {
$parts[] = $name;
}
}
$this->query = implode($this->getOption(self::OPTION_SEPARATOR_OUTPUT),
$parts);
}
}
/**
* @param string $name
* @param mixed $value
*
* @return array
*/
public function setQueryVariable($name, $value)
{
$array = $this->getQueryVariables();
$array[$name] = $value;
$this->setQueryVariables($array);
}
/**
* @param string $name
*
* @return void
*/
public function unsetQueryVariable($name)
{
$array = $this->getQueryVariables();
unset($array[$name]);
$this->setQueryVariables($array);
}
/**
* Returns a string representation of this URL.
*
* @return string
*/
public function getURL()
{
// See RFC 3986, section 5.3
$url = "";
if ($this->scheme !== false) {
$url .= $this->scheme . ':';
}
$authority = $this->getAuthority();
if ($authority !== false) {
$url .= '//' . $authority;
}
$url .= $this->path;
if ($this->query !== false) {
$url .= '?' . $this->query;
}
if ($this->fragment !== false) {
$url .= '#' . $this->fragment;
}
return $url;
}
/**
* Returns a normalized string representation of this URL. This is useful
* for comparison of URLs.
*
* @return string
*/
public function getNormalizedURL()
{
$url = clone $this;
$url->normalize();
return $url->getUrl();
}
/**
* Returns a normalized Net_URL2 instance.
*
* @return Net_URL2
*/
public function normalize()
{
// See RFC 3886, section 6
// Schemes are case-insensitive
if ($this->scheme) {
$this->scheme = strtolower($this->scheme);
}
// Hostnames are case-insensitive
if ($this->host) {
$this->host = strtolower($this->host);
}
// Remove default port number for known schemes (RFC 3986, section 6.2.3)
if ($this->port &&
$this->scheme &&
$this->port == getservbyname($this->scheme, 'tcp')) {
$this->port = false;
}
// Normalize case of %XX percentage-encodings (RFC 3986, section 6.2.2.1)
foreach (array('userinfo', 'host', 'path') as $part) {
if ($this->$part) {
$this->$part = preg_replace('/%[0-9a-f]{2}/ie', 'strtoupper("\0")', $this->$part);
}
}
// Path segment normalization (RFC 3986, section 6.2.2.3)
$this->path = self::removeDotSegments($this->path);
// Scheme based normalization (RFC 3986, section 6.2.3)
if ($this->host && !$this->path) {
$this->path = '/';
}
}
/**
* Returns whether this instance represents an absolute URL.
*
* @return bool
*/
public function isAbsolute()
{
return (bool) $this->scheme;
}
/**
* Returns an Net_URL2 instance representing an absolute URL relative to
* this URL.
*
* @param Net_URL2|string $reference relative URL
*
* @return Net_URL2
*/
public function resolve($reference)
{
if (is_string($reference)) {
$reference = new self($reference);
}
if (!$this->isAbsolute()) {
throw new Exception('Base-URL must be absolute');
}
// A non-strict parser may ignore a scheme in the reference if it is
// identical to the base URI's scheme.
if (!$this->getOption(self::OPTION_STRICT) && $reference->scheme == $this->scheme) {
$reference->scheme = false;
}
$target = new self('');
if ($reference->scheme !== false) {
$target->scheme = $reference->scheme;
$target->setAuthority($reference->getAuthority());
$target->path = self::removeDotSegments($reference->path);
$target->query = $reference->query;
} else {
$authority = $reference->getAuthority();
if ($authority !== false) {
$target->setAuthority($authority);
$target->path = self::removeDotSegments($reference->path);
$target->query = $reference->query;
} else {
if ($reference->path == '') {
$target->path = $this->path;
if ($reference->query !== false) {
$target->query = $reference->query;
} else {
$target->query = $this->query;
}
} else {
if (substr($reference->path, 0, 1) == '/') {
$target->path = self::removeDotSegments($reference->path);
} else {
// Merge paths (RFC 3986, section 5.2.3)
if ($this->host !== false && $this->path == '') {
$target->path = '/' . $this->path;
} else {
$i = strrpos($this->path, '/');
if ($i !== false) {
$target->path = substr($this->path, 0, $i + 1);
}
$target->path .= $reference->path;
}
$target->path = self::removeDotSegments($target->path);
}
$target->query = $reference->query;
}
$target->setAuthority($this->getAuthority());
}
$target->scheme = $this->scheme;
}
$target->fragment = $reference->fragment;
return $target;
}
/**
* Removes dots as described in RFC 3986, section 5.2.4, e.g.
* "/foo/../bar/baz" => "/bar/baz"
*
* @param string $path a path
*
* @return string a path
*/
private static function removeDotSegments($path)
{
$output = '';
// Make sure not to be trapped in an infinite loop due to a bug in this
// method
$j = 0;
while ($path && $j++ < 100) {
// Step A
if (substr($path, 0, 2) == './') {
$path = substr($path, 2);
} elseif (substr($path, 0, 3) == '../') {
$path = substr($path, 3);
// Step B
} elseif (substr($path, 0, 3) == '/./' || $path == '/.') {
$path = '/' . substr($path, 3);
// Step C
} elseif (substr($path, 0, 4) == '/../' || $path == '/..') {
$path = '/' . substr($path, 4);
$i = strrpos($output, '/');
$output = $i === false ? '' : substr($output, 0, $i);
// Step D
} elseif ($path == '.' || $path == '..') {
$path = '';
// Step E
} else {
$i = strpos($path, '/');
if ($i === 0) {
$i = strpos($path, '/', 1);
}
if ($i === false) {
$i = strlen($path);
}
$output .= substr($path, 0, $i);
$path = substr($path, $i);
}
}
return $output;
}
/**
* Returns a Net_URL2 instance representing the canonical URL of the
* currently executing PHP script.
*
* @return string
*/
public static function getCanonical()
{
if (!isset($_SERVER['REQUEST_METHOD'])) {
// ALERT - no current URL
throw new Exception('Script was not called through a webserver');
}
// Begin with a relative URL
$url = new self($_SERVER['PHP_SELF']);
$url->scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
$url->host = $_SERVER['SERVER_NAME'];
$port = intval($_SERVER['SERVER_PORT']);
if ($url->scheme == 'http' && $port != 80 ||
$url->scheme == 'https' && $port != 443) {
$url->port = $port;
}
return $url;
}
/**
* Returns the URL used to retrieve the current request.
*
* @return string
*/
public static function getRequestedURL()
{
return self::getRequested()->getUrl();
}
/**
* Returns a Net_URL2 instance representing the URL used to retrieve the
* current request.
*
* @return Net_URL2
*/
public static function getRequested()
{
if (!isset($_SERVER['REQUEST_METHOD'])) {
// ALERT - no current URL
throw new Exception('Script was not called through a webserver');
}
// Begin with a relative URL
$url = new self($_SERVER['REQUEST_URI']);
$url->scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
// Set host and possibly port
$url->setAuthority($_SERVER['HTTP_HOST']);
return $url;
}
/**
* Sets the specified option.
*
* @param string $optionName a self::OPTION_ constant
* @param mixed $value option value
*
* @return void
* @see self::OPTION_STRICT
* @see self::OPTION_USE_BRACKETS
* @see self::OPTION_ENCODE_KEYS
*/
function setOption($optionName, $value)
{
if (!array_key_exists($optionName, $this->options)) {
return false;
}
$this->options[$optionName] = $value;
}
/**
* Returns the value of the specified option.
*
* @param string $optionName The name of the option to retrieve
*
* @return mixed
*/
function getOption($optionName)
{
return isset($this->options[$optionName])
? $this->options[$optionName] : false;
}
}

357
extlib/Services/oEmbed.php Normal file
View File

@ -0,0 +1,357 @@
<?php
/**
* An interface for oEmbed consumption
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Validate.php';
require_once 'Net/URL2.php';
require_once 'HTTP/Request.php';
require_once 'Services/oEmbed/Exception.php';
require_once 'Services/oEmbed/Exception/NoSupport.php';
require_once 'Services/oEmbed/Object.php';
/**
* Base class for consuming oEmbed objects
*
* <code>
* <?php
*
* require_once 'Services/oEmbed.php';
*
* // The URL that we'd like to find out more information about.
* $url = 'http://flickr.com/photos/joestump/2848795611/';
*
* // The oEmbed API URI. Not all providers support discovery yet so we're
* // explicitly providing one here. If one is not provided Services_oEmbed
* // attempts to discover it. If none is found an exception is thrown.
* $oEmbed = new Services_oEmbed($url, array(
* Services_oEmbed::OPTION_API => 'http://www.flickr.com/services/oembed/'
* ));
* $object = $oEmbed->getObject();
*
* // All of the objects have somewhat sane __toString() methods that allow
* // you to output them directly.
* echo (string)$object;
*
* ?>
* </code>
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed
{
/**
* HTTP timeout in seconds
*
* All HTTP requests made by Services_oEmbed will respect this timeout.
* This can be passed to {@link Services_oEmbed::setOption()} or to the
* options parameter in {@link Services_oEmbed::__construct()}.
*
* @var string OPTION_TIMEOUT Timeout in seconds
*/
const OPTION_TIMEOUT = 'http_timeout';
/**
* HTTP User-Agent
*
* All HTTP requests made by Services_oEmbed will be sent with the
* string set by this option.
*
* @var string OPTION_USER_AGENT The HTTP User-Agent string
*/
const OPTION_USER_AGENT = 'http_user_agent';
/**
* The API's URI
*
* If the API is known ahead of time this option can be used to explicitly
* set it. If not present then the API is attempted to be discovered
* through the auto-discovery mechanism.
*
* @var string OPTION_API
*/
const OPTION_API = 'oembed_api';
/**
* Options for oEmbed requests
*
* @var array $options The options for making requests
*/
protected $options = array(
self::OPTION_TIMEOUT => 3,
self::OPTION_API => null,
self::OPTION_USER_AGENT => 'Services_oEmbed 0.1.0'
);
/**
* URL of object to get embed information for
*
* @var object $url {@link Net_URL2} instance of URL of object
*/
protected $url = null;
/**
* Constructor
*
* @param string $url The URL to fetch an oEmbed for
* @param array $options A list of options for the oEmbed lookup
*
* @throws {@link Services_oEmbed_Exception} if the $url is invalid
* @throws {@link Services_oEmbed_Exception} when no valid API is found
* @return void
*/
public function __construct($url, array $options = array())
{
if (Validate::uri($url)) {
$this->url = new Net_URL2($url);
} else {
throw new Services_oEmbed_Exception('URL is invalid');
}
if (count($options)) {
foreach ($options as $key => $val) {
$this->setOption($key, $val);
}
}
if ($this->options[self::OPTION_API] === null) {
$this->options[self::OPTION_API] = $this->discover();
}
}
/**
* Set an option for the oEmbed request
*
* @param mixed $option The option name
* @param mixed $value The option value
*
* @see Services_oEmbed::OPTION_API, Services_oEmbed::OPTION_TIMEOUT
* @throws {@link Services_oEmbed_Exception} on invalid option
* @access public
* @return void
*/
public function setOption($option, $value)
{
switch ($option) {
case self::OPTION_API:
case self::OPTION_TIMEOUT:
break;
default:
throw new Services_oEmbed_Exception(
'Invalid option "' . $option . '"'
);
}
$func = '_set_' . $option;
if (method_exists($this, $func)) {
$this->options[$option] = $this->$func($value);
} else {
$this->options[$option] = $value;
}
}
/**
* Set the API option
*
* @param string $value The API's URI
*
* @throws {@link Services_oEmbed_Exception} on invalid API URI
* @see Validate::uri()
* @return string
*/
protected function _set_oembed_api($value)
{
if (!Validate::uri($value)) {
throw new Services_oEmbed_Exception(
'API URI provided is invalid'
);
}
return $value;
}
/**
* Get the oEmbed response
*
* @param array $params Optional parameters for
*
* @throws {@link Services_oEmbed_Exception} on cURL errors
* @throws {@link Services_oEmbed_Exception} on HTTP errors
* @throws {@link Services_oEmbed_Exception} when result is not parsable
* @return object The oEmbed response as an object
*/
public function getObject(array $params = array())
{
$params['url'] = $this->url->getURL();
if (!isset($params['format'])) {
$params['format'] = 'json';
}
$sets = array();
foreach ($params as $var => $val) {
$sets[] = $var . '=' . urlencode($val);
}
$url = $this->options[self::OPTION_API] . '?' . implode('&', $sets);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->options[self::OPTION_TIMEOUT]);
$result = curl_exec($ch);
if (curl_errno($ch)) {
throw new Services_oEmbed_Exception(
curl_error($ch), curl_errno($ch)
);
}
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (substr($code, 0, 1) != '2') {
throw new Services_oEmbed_Exception('Non-200 code returned');
}
curl_close($ch);
switch ($params['format']) {
case 'json':
$res = json_decode($result);
if (!is_object($res)) {
throw new Services_oEmbed_Exception(
'Could not parse JSON response'
);
}
break;
case 'xml':
libxml_use_internal_errors(true);
$res = simplexml_load_string($result);
if (!$res instanceof SimpleXMLElement) {
$errors = libxml_get_errors();
$err = array_shift($errors);
libxml_clear_errors();
libxml_use_internal_errors(false);
throw new Services_oEmbed_Exception(
$err->message, $error->code
);
}
break;
}
return Services_oEmbed_Object::factory($res);
}
/**
* Discover an oEmbed API
*
* @param string $url The URL to attempt to discover oEmbed for
*
* @throws {@link Services_oEmbed_Exception} if the $url is invalid
* @return string The oEmbed API endpoint discovered
*/
protected function discover($url)
{
$body = $this->sendRequest($url);
// Find all <link /> tags that have a valid oembed type set. We then
// extract the href attribute for each type.
$regexp = '#<link([^>]*)type="' .
'(application/json|text/xml)\+oembed"([^>]*)>#i';
$m = $ret = array();
if (!preg_match_all($regexp, $body, $m)) {
throw new Services_oEmbed_Exception_NoSupport(
'No valid oEmbed links found on page'
);
}
foreach ($m[0] as $i => $link) {
$h = array();
if (preg_match('/href="([^"]+)"/i', $link, $h)) {
$ret[$m[2][$i]] = $h[1];
}
}
return (isset($ret['json']) ? $ret['json'] : array_pop($ret));
}
/**
* Send a GET request to the provider
*
* @param mixed $url The URL to send the request to
*
* @throws {@link Services_oEmbed_Exception} on HTTP errors
* @return string The contents of the response
*/
private function sendRequest($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->options[self::OPTION_TIMEOUT]);
curl_setopt($ch, CURLOPT_USERAGENT, $this->options[self::OPTION_USER_AGENT]);
$result = curl_exec($ch);
if (curl_errno($ch)) {
throw new Services_oEmbed_Exception(
curl_error($ch), curl_errno($ch)
);
}
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (substr($code, 0, 1) != '2') {
throw new Services_oEmbed_Exception('Non-200 code returned');
}
return $result;
}
}
?>

View File

@ -0,0 +1,65 @@
<?php
/**
* Base exception class for {@link Services_oEmbed}
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'PEAR/Exception.php';
/**
* Base exception class for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Exception extends PEAR_Exception
{
}
?>

View File

@ -0,0 +1,63 @@
<?php
/**
* Exception class when no oEmbed support is discovered
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
/**
* Exception class when no oEmbed support is discovered
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Exception_NoSupport extends Services_oEmbed_Exception
{
}
?>

View File

@ -0,0 +1,126 @@
<?php
/**
* An interface for oEmbed consumption
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Exception.php';
/**
* Base class for consuming oEmbed objects
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
abstract class Services_oEmbed_Object
{
/**
* Valid oEmbed object types
*
* @var array $types Array of valid object types
* @see Services_oEmbed_Object::factory()
*/
static protected $types = array(
'photo' => 'Photo',
'video' => 'Video',
'link' => 'Link',
'rich' => 'Rich'
);
/**
* Create an oEmbed object from result
*
* @param object $object Raw object returned from API
*
* @throws {@link Services_oEmbed_Object_Exception} on object error
* @return object Instance of object driver
* @see Services_oEmbed_Object_Link, Services_oEmbed_Object_Photo
* @see Services_oEmbed_Object_Rich, Services_oEmbed_Object_Video
*/
static public function factory($object)
{
if (!isset($object->type)) {
throw new Services_oEmbed_Object_Exception(
'Object has no type'
);
}
$type = (string)$object->type;
if (!isset(self::$types[$type])) {
throw new Services_oEmbed_Object_Exception(
'Object type is unknown or invalid: ' . $type
);
}
$file = 'Services/oEmbed/Object/' . self::$types[$type] . '.php';
include_once $file;
$class = 'Services_oEmbed_Object_' . self::$types[$type];
if (!class_exists($class)) {
throw new Services_oEmbed_Object_Exception(
'Object class is invalid or not present'
);
}
$instance = new $class($object);
return $instance;
}
/**
* Instantiation is not allowed
*
* @return void
*/
private function __construct()
{
}
}
?>

View File

@ -0,0 +1,139 @@
<?php
/**
* Base class for oEmbed objects
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
/**
* Base class for oEmbed objects
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
abstract class Services_oEmbed_Object_Common
{
/**
* Raw object returned from API
*
* @var object $object The raw object from the API
*/
protected $object = null;
/**
* Required fields per the specification
*
* @var array $required Array of required fields
* @link http://oembed.com
*/
protected $required = array();
/**
* Constructor
*
* @param object $object Raw object returned from the API
*
* @throws {@link Services_oEmbed_Object_Exception} on missing fields
* @return void
*/
public function __construct($object)
{
$this->object = $object;
$this->required[] = 'version';
foreach ($this->required as $field) {
if (!isset($this->$field)) {
throw new Services_oEmbed_Object_Exception(
'Object is missing required ' . $field . ' attribute'
);
}
}
}
/**
* Get object variable
*
* @param string $var Variable to get
*
* @see Services_oEmbed_Object_Common::$object
* @return mixed Attribute's value or null if it's not set/exists
*/
public function __get($var)
{
if (property_exists($this->object, $var)) {
return $this->object->$var;
}
return null;
}
/**
* Is variable set?
*
* @param string $var Variable name to check
*
* @return boolean True if set, false if not
* @see Services_oEmbed_Object_Common::$object
*/
public function __isset($var)
{
if (property_exists($this->object, $var)) {
return (isset($this->object->$var));
}
return false;
}
/**
* Require a sane __toString for all objects
*
* @return string
*/
abstract public function __toString();
}
?>

View File

@ -0,0 +1,65 @@
<?php
/**
* Exception for {@link Services_oEmbed_Object}
*
* PHP version 5.1.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Exception.php';
/**
* Exception for {@link Services_oEmbed_Object}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Exception extends Services_oEmbed_Exception
{
}
?>

View File

@ -0,0 +1,73 @@
<?php
/**
* Link object for {@link Services_oEmbed}
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Common.php';
/**
* Link object for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Link extends Services_oEmbed_Object_Common
{
/**
* Output a sane link
*
* @return string An HTML link of the object
*/
public function __toString()
{
return '<a href="' . $this->url . '">' . $this->title . '</a>';
}
}
?>

View File

@ -0,0 +1,89 @@
<?php
/**
* Photo object for {@link Services_oEmbed}
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Common.php';
/**
* Photo object for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Photo extends Services_oEmbed_Object_Common
{
/**
* Required fields for photo objects
*
* @var array $required Required fields
*/
protected $required = array(
'url', 'width', 'height'
);
/**
* Output a valid HTML tag for image
*
* @return string HTML <img /> tag for Photo
*/
public function __toString()
{
$img = '<img src="' . $this->url . '" width="' . $this->width . '" ' .
'height="' . $this->height . '"';
if (isset($this->title)) {
$img .= ' alt="' . $this->title . '"';
}
return $img . ' />';
}
}
?>

View File

@ -0,0 +1,82 @@
<?php
/**
* Photo object for {@link Services_oEmbed}
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Common.php';
/**
* Photo object for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Rich extends Services_oEmbed_Object_Common
{
/**
* Required fields for rich objects
*
* @var array $required Required fields
*/
protected $required = array(
'html', 'width', 'height'
);
/**
* Output a the HTML tag for rich object
*
* @return string HTML for rich object
*/
public function __toString()
{
return $this->html;
}
}
?>

View File

@ -0,0 +1,82 @@
<?php
/**
* Photo object for {@link Services_oEmbed}
*
* PHP version 5.2.0+
*
* Copyright (c) 2008, Digg.com, Inc.
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* - Neither the name of Digg.com, Inc. nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version SVN: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
require_once 'Services/oEmbed/Object/Common.php';
/**
* Photo object for {@link Services_oEmbed}
*
* @category Services
* @package Services_oEmbed
* @author Joe Stump <joe@joestump.net>
* @copyright 2008 Digg.com, Inc.
* @license http://tinyurl.com/42zef New BSD License
* @version Release: @version@
* @link http://code.google.com/p/digg
* @link http://oembed.com
*/
class Services_oEmbed_Object_Video extends Services_oEmbed_Object_Common
{
/**
* Required fields for video objects
*
* @var array $required Required fields
*/
protected $required = array(
'html', 'width', 'height'
);
/**
* Output a valid embed tag for video
*
* @return string HTML for video
*/
public function __toString()
{
return $this->html;
}
}
?>

View File

@ -1,24 +1,22 @@
<?php <?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox, Amir Saied |
// +----------------------------------------------------------------------+
// | This source file is subject to the New BSD license, That is bundled |
// | with this package in the file LICENSE, and is available through |
// | the world-wide-web at |
// | http://www.opensource.org/licenses/bsd-license.php |
// | If you did not receive a copy of the new BSDlicense and are unable |
// | to obtain it through the world-wide-web, please send a note to |
// | pajoye@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Tomas V.V.Cox <cox@idecnet.com> |
// | Pierre-Alain Joye <pajoye@php.net> |
// | Amir Mohammad Saied <amir@php.net> |
// +----------------------------------------------------------------------+
//
/** /**
* Validation class * Validation class
* *
* Copyright (c) 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox, Amir Saied
*
* This source file is subject to the New BSD license, That is bundled
* with this package in the file LICENSE, and is available through
* the world-wide-web at
* http://www.opensource.org/licenses/bsd-license.php
* If you did not receive a copy of the new BSDlicense and are unable
* to obtain it through the world-wide-web, please send a note to
* pajoye@php.net so we can mail you a copy immediately.
*
* Author: Tomas V.V.Cox <cox@idecnet.com>
* Pierre-Alain Joye <pajoye@php.net>
* Amir Mohammad Saied <amir@php.net>
*
*
* Package to validate various datas. It includes : * Package to validate various datas. It includes :
* - numbers (min/max, decimal or not) * - numbers (min/max, decimal or not)
* - email (syntax, domain check) * - email (syntax, domain check)
@ -34,7 +32,7 @@
* @author Amir Mohammad Saied <amir@php.net> * @author Amir Mohammad Saied <amir@php.net>
* @copyright 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox,Amir Mohammad Saied * @copyright 1997-2006 Pierre-Alain Joye,Tomas V.V.Cox,Amir Mohammad Saied
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License * @license http://www.opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Validate.php,v 1.123 2007/12/12 16:45:51 davidc Exp $ * @version CVS: $Id: Validate.php,v 1.134 2009/01/28 12:27:33 davidc Exp $
* @link http://pear.php.net/package/Validate * @link http://pear.php.net/package/Validate
*/ */
@ -205,13 +203,47 @@ class Validate
'zm','zw', 'zm','zw',
); );
/**
* Validate a tag URI (RFC4151)
*
* @param string $uri tag URI to validate
*
* @return boolean true if valid tag URI, false if not
*
* @access private
*/
function __uriRFC4151($uri)
{
$datevalid = false;
if (preg_match(
'/^tag:(?<name>.*),(?<date>\d{4}-?\d{0,2}-?\d{0,2}):(?<specific>.*)(.*:)*$/', $uri, $matches)) {
$date = $matches['date'];
$date6 = strtotime($date);
if ((strlen($date) == 4) && $date <= date('Y')) {
$datevalid = true;
} elseif ((strlen($date) == 7) && ($date6 < strtotime("now"))) {
$datevalid = true;
} elseif ((strlen($date) == 10) && ($date6 < strtotime("now"))) {
$datevalid = true;
}
if (self::email($matches['name'])) {
$namevalid = true;
} else {
$namevalid = self::email('info@' . $matches['name']);
}
return $datevalid && $namevalid;
} else {
return false;
}
}
/** /**
* Validate a number * Validate a number
* *
* @param string $number Number to validate * @param string $number Number to validate
* @param array $options array where: * @param array $options array where:
* 'decimal' is the decimal char or false when decimal not allowed * 'decimal' is the decimal char or false when decimal
* not allowed.
* i.e. ',.' to allow both ',' and '.' * i.e. ',.' to allow both ',' and '.'
* 'dec_prec' Number of allowed decimals * 'dec_prec' Number of allowed decimals
* 'min' minimum value * 'min' minimum value
@ -253,13 +285,14 @@ class Validate
/** /**
* Converting a string to UTF-7 (RFC 2152) * Converting a string to UTF-7 (RFC 2152)
* *
* @param $string string to be converted * @param string $string string to be converted
* *
* @return string converted string * @return string converted string
* *
* @access private * @access private
*/ */
function __stringToUtf7($string) { function __stringToUtf7($string)
{
$return = ''; $return = '';
$utf7 = array( $utf7 = array(
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
@ -270,7 +303,9 @@ class Validate
'3', '4', '5', '6', '7', '8', '9', '+', ',' '3', '4', '5', '6', '7', '8', '9', '+', ','
); );
$state = 0; $state = 0;
if (!empty($string)) { if (!empty($string)) {
$i = 0; $i = 0;
while ($i <= strlen($string)) { while ($i <= strlen($string)) {
@ -336,9 +371,6 @@ class Validate
*/ */
function __emailRFC822(&$email, &$options) function __emailRFC822(&$email, &$options)
{ {
if (Validate::__stringToUtf7($email) != $email) {
return false;
}
static $address = null; static $address = null;
static $uncomment = null; static $uncomment = null;
if (!$address) { if (!$address) {
@ -383,6 +415,7 @@ class Validate
// address = mailbox ; one addressee // address = mailbox ; one addressee
// / group ; named list // / group ; named list
$address = '/^\s*(?:' . $mailbox . '|' . $group . ')$/'; $address = '/^\s*(?:' . $mailbox . '|' . $group . ')$/';
$uncomment = $uncomment =
'/((?:(?:\\\\"|[^("])*(?:' . $quoted_string . '/((?:(?:\\\\"|[^("])*(?:' . $quoted_string .
')?)*)((?<!\\\\)\((?:(?2)|.)*?(?<!\\\\)\))/'; ')?)*)((?<!\\\\)\((?:(?2)|.)*?(?<!\\\\)\))/';
@ -398,61 +431,19 @@ class Validate
* This function is used to make a much more proficient validation * This function is used to make a much more proficient validation
* against all types of official domain names. * against all types of official domain names.
* *
* @access protected
* @param string $email The email address to check. * @param string $email The email address to check.
* @param array $options The options for validation * @param array $options The options for validation
*
* @access protected
*
* @return bool True if validating succeeds * @return bool True if validating succeeds
*/ */
function _fullTLDValidation($email, $options) function _fullTLDValidation($email, $options)
{ {
$validate = array(); $validate = array();
if(!empty($options["VALIDATE_ITLD_EMAILS"])) array_push($validate, 'itld');
switch ($options) { if(!empty($options["VALIDATE_GTLD_EMAILS"])) array_push($validate, 'gtld');
/** 1 */ if(!empty($options["VALIDATE_CCTLD_EMAILS"])) array_push($validate, 'cctld');
case VALIDATE_ITLD_EMAILS:
array_push($validate, 'itld');
break;
/** 2 */
case VALIDATE_GTLD_EMAILS:
array_push($validate, 'gtld');
break;
/** 3 */
case VALIDATE_ITLD_EMAILS | VALIDATE_GTLD_EMAILS:
array_push($validate, 'itld');
array_push($validate, 'gtld');
break;
/** 4 */
case VALIDATE_CCTLD_EMAILS:
array_push($validate, 'cctld');
break;
/** 5 */
case VALIDATE_CCTLD_EMAILS | VALIDATE_ITLD_EMAILS:
array_push($validate, 'cctld');
array_push($validate, 'itld');
break;
/** 6 */
case VALIDATE_CCTLD_EMAILS ^ VALIDATE_ITLD_EMAILS:
array_push($validate, 'cctld');
array_push($validate, 'itld');
break;
/** 7 - 8 */
case VALIDATE_CCTLD_EMAILS | VALIDATE_ITLD_EMAILS | VALIDATE_GTLD_EMAILS:
case VALIDATE_ALL_EMAILS:
array_push($validate, 'cctld');
array_push($validate, 'itld');
array_push($validate, 'gtld');
break;
}
/**
* Debugging still, not implemented but code is somewhat here.
*/
$self = new Validate; $self = new Validate;
@ -460,6 +451,7 @@ class Validate
foreach ($validate as $valid) { foreach ($validate as $valid) {
$tmpVar = '_' . (string)$valid; $tmpVar = '_' . (string)$valid;
$toValidate[$valid] = $self->{$tmpVar}; $toValidate[$valid] = $self->{$tmpVar};
} }
@ -467,23 +459,24 @@ class Validate
return $e; return $e;
} }
// {{{ protected function executeFullEmailValidation
/** /**
* Execute the validation * Execute the validation
* *
* This function will execute the full email vs tld * This function will execute the full email vs tld
* validation using an array of tlds passed to it. * validation using an array of tlds passed to it.
* *
* @access public
* @param string $email The email to validate. * @param string $email The email to validate.
* @param array $arrayOfTLDs The array of the TLDs to validate * @param array $arrayOfTLDs The array of the TLDs to validate
*
* @access public
*
* @return true or false (Depending on if it validates or if it does not) * @return true or false (Depending on if it validates or if it does not)
*/ */
function executeFullEmailValidation($email, $arrayOfTLDs) function executeFullEmailValidation($email, $arrayOfTLDs)
{ {
$emailEnding = explode('.', $email); $emailEnding = explode('.', $email);
$emailEnding = $emailEnding[count($emailEnding)-1]; $emailEnding = $emailEnding[count($emailEnding)-1];
foreach ($arrayOfTLDs as $validator => $keys) { foreach ($arrayOfTLDs as $validator => $keys) {
if (in_array($emailEnding, $keys)) { if (in_array($emailEnding, $keys)) {
return true; return true;
@ -491,7 +484,6 @@ class Validate
} }
return false; return false;
} }
// }}}
/** /**
* Validate an email * Validate an email
@ -502,6 +494,16 @@ class Validate
* 'check_domain' boolean Check or not if the domain exists * 'check_domain' boolean Check or not if the domain exists
* 'use_rfc822' boolean Apply the full RFC822 grammar * 'use_rfc822' boolean Apply the full RFC822 grammar
* *
* Ex.
* $options = array(
* 'check_domain' => 'true',
* 'fullTLDValidation' => 'true',
* 'use_rfc822' => 'true',
* 'VALIDATE_GTLD_EMAILS' => 'true',
* 'VALIDATE_CCTLD_EMAILS' => 'true',
* 'VALIDATE_ITLD_EMAILS' => 'true',
* );
*
* @return boolean true if valid email, false if not * @return boolean true if valid email, false if not
* *
* @access public * @access public
@ -516,12 +518,39 @@ class Validate
extract($options); extract($options);
} }
/**
* Check for IDN usage so we can encode the domain as Punycode
* before continuing.
*/
$hasIDNA = false;
if (@include_once('Net/IDNA.php')) {
$hasIDNA = true;
}
if ($hasIDNA === true) {
if (strpos($email, '@') !== false) {
list($name, $domain) = explode('@', $email, 2);
// Check if the domain contains characters > 127 which means
// it's an idn domain name.
$chars = count_chars($domain, 1);
if (!empty($chars) && max(array_keys($chars)) > 127) {
$idna =& Net_IDNA::singleton();
$domain = $idna->encode($domain);
}
$email = "$name@$domain";
}
}
/** /**
* @todo Fix bug here.. even if it passes this, it won't be passing * @todo Fix bug here.. even if it passes this, it won't be passing
* The regular expression below * The regular expression below
*/ */
if (isset($fullTLDValidation)) { if (isset($fullTLDValidation)) {
$valid = Validate::_fullTLDValidation($email, $fullTLDValidation); //$valid = Validate::_fullTLDValidation($email, $fullTLDValidation);
$valid = Validate::_fullTLDValidation($email, $options);
if (!$valid) { if (!$valid) {
return false; return false;
@ -539,10 +568,11 @@ class Validate
\.((?:([^- ])[-a-z]*[-a-z]))) #7 TLD \.((?:([^- ])[-a-z]*[-a-z]))) #7 TLD
$&xi'; $&xi';
//checks if exists the domain (MX or A)
if ($use_rfc822? Validate::__emailRFC822($email, $options) : if ($use_rfc822? Validate::__emailRFC822($email, $options) :
preg_match($regex, $email)) { preg_match($regex, $email)) {
if ($check_domain && function_exists('checkdnsrr')) { if ($check_domain && function_exists('checkdnsrr')) {
list (, $domain) = explode('@', $email); list ($account, $domain) = explode('@', $email);
if (checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A')) { if (checkdnsrr($domain, 'MX') || checkdnsrr($domain, 'A')) {
return true; return true;
} }
@ -570,19 +600,25 @@ class Validate
function string($string, $options) function string($string, $options)
{ {
$format = null; $format = null;
$min_length = $max_length = 0; $min_length = 0;
$max_length = 0;
if (is_array($options)) { if (is_array($options)) {
extract($options); extract($options);
} }
if ($format && !preg_match("|^[$format]*\$|s", $string)) { if ($format && !preg_match("|^[$format]*\$|s", $string)) {
return false; return false;
} }
if ($min_length && strlen($string) < $min_length) { if ($min_length && strlen($string) < $min_length) {
return false; return false;
} }
if ($max_length && strlen($string) > $max_length) { if ($max_length && strlen($string) > $max_length) {
return false; return false;
} }
return true; return true;
} }
@ -631,6 +667,14 @@ class Validate
if (is_array($options)) { if (is_array($options)) {
extract($options); extract($options);
} }
if (is_array($allowed_schemes) &&
in_array("tag", $allowed_schemes)
) {
if (strpos($url, "tag:") === 0) {
return self::__uriRFC4151($url);
}
}
if (preg_match( if (preg_match(
'&^(?:([a-z][-+.a-z0-9]*):)? # 1. scheme '&^(?:([a-z][-+.a-z0-9]*):)? # 1. scheme
(?:// # authority start (?:// # authority start
@ -693,8 +737,10 @@ class Validate
*/ */
function date($date, $options) function date($date, $options)
{ {
$max = $min = false; $max = false;
$min = false;
$format = ''; $format = '';
if (is_array($options)) { if (is_array($options)) {
extract($options); extract($options);
} }
@ -832,13 +878,13 @@ class Validate
include_once 'Date/Calc.php'; include_once 'Date/Calc.php';
if (is_a($min, 'Date') && if (is_a($min, 'Date') &&
(Date_Calc::compareDates($day, $month, $year, (Date_Calc::compareDates($day, $month, $year,
$min->getDay(), $min->getMonth(), $min->getYear()) < 0)) $min->getDay(), $min->getMonth(), $min->getYear()) < 0)
{ ) {
return false; return false;
} elseif (is_array($min) && } elseif (is_array($min) &&
(Date_Calc::compareDates($day, $month, $year, (Date_Calc::compareDates($day, $month, $year,
$min[0], $min[1], $min[2]) < 0)) $min[0], $min[1], $min[2]) < 0)
{ ) {
return false; return false;
} }
} }
@ -847,13 +893,13 @@ class Validate
include_once 'Date/Calc.php'; include_once 'Date/Calc.php';
if (is_a($max, 'Date') && if (is_a($max, 'Date') &&
(Date_Calc::compareDates($day, $month, $year, (Date_Calc::compareDates($day, $month, $year,
$max->getDay(), $max->getMonth(), $max->getYear()) > 0)) $max->getDay(), $max->getMonth(), $max->getYear()) > 0)
{ ) {
return false; return false;
} elseif (is_array($max) && } elseif (is_array($max) &&
(Date_Calc::compareDates($day, $month, $year, (Date_Calc::compareDates($day, $month, $year,
$max[0], $max[1], $max[2]) > 0)) $max[0], $max[1], $max[2]) > 0)
{ ) {
return false; return false;
} }
} }
@ -862,6 +908,16 @@ class Validate
return true; return true;
} }
/**
* Substr
*
* @param string &$date Date
* @param string $num Length
* @param string $opt Unknown
*
* @access private
* @return string
*/
function _substr(&$date, $num, $opt = false) function _substr(&$date, $num, $opt = false)
{ {
if ($opt && strlen($date) >= $opt && preg_match('/^[0-9]{'.$opt.'}/', $date, $m)) { if ($opt && strlen($date) >= $opt && preg_match('/^[0-9]{'.$opt.'}/', $date, $m)) {
@ -873,7 +929,8 @@ class Validate
return $ret; return $ret;
} }
function _modf($val, $div) { function _modf($val, $div)
{
if (function_exists('bcmod')) { if (function_exists('bcmod')) {
return bcmod($val, $div); return bcmod($val, $div);
} elseif (function_exists('fmod')) { } elseif (function_exists('fmod')) {
@ -890,11 +947,12 @@ class Validate
* @param string $number number string * @param string $number number string
* @param array $weights reference to array of weights * @param array $weights reference to array of weights
* *
* @returns int returns product of number digits with weights
*
* @access protected * @access protected
*
* @return int returns product of number digits with weights
*/ */
function _multWeights($number, &$weights) { function _multWeights($number, &$weights)
{
if (!is_array($weights)) { if (!is_array($weights)) {
return -1; return -1;
} }
@ -920,11 +978,12 @@ class Validate
* @param int $subtract (optional) number * @param int $subtract (optional) number
* @param bool $allow_high (optional) true if function can return number higher than 10 * @param bool $allow_high (optional) true if function can return number higher than 10
* *
* @returns int -1 calculated control number is returned
*
* @access protected * @access protected
*
* @return int -1 calculated control number is returned
*/ */
function _getControlNumber($number, &$weights, $modulo = 10, $subtract = 0, $allow_high = false) { function _getControlNumber($number, &$weights, $modulo = 10, $subtract = 0, $allow_high = false)
{
// calc sum // calc sum
$sum = Validate::_multWeights($number, $weights); $sum = Validate::_multWeights($number, $weights);
if ($sum == -1) { if ($sum == -1) {
@ -946,14 +1005,15 @@ class Validate
* *
* @param string $number number to validate * @param string $number number to validate
* @param array $weights reference to array of weights * @param array $weights reference to array of weights
* @param int $modulo (optionsl) number * @param int $modulo (optional) number
* @param int $subtract (optional) numbier * @param int $subtract (optional) number
*
* @returns bool true if valid, false if not
* *
* @access protected * @access protected
*
* @return bool true if valid, false if not
*/ */
function _checkControlNumber($number, &$weights, $modulo = 10, $subtract = 0) { function _checkControlNumber($number, &$weights, $modulo = 10, $subtract = 0)
{
if (strlen($number) < count($weights)) { if (strlen($number) < count($weights)) {
return false; return false;
} }
@ -993,6 +1053,7 @@ class Validate
{ {
$keys = array_keys($data); $keys = array_keys($data);
$valid = array(); $valid = array();
foreach ($keys as $var_name) { foreach ($keys as $var_name) {
if (!isset($val_type[$var_name])) { if (!isset($val_type[$var_name])) {
if ($remove) { if ($remove) {
@ -1029,20 +1090,24 @@ class Validate
trigger_error("$class isn't installed or you may have some permissoin issues", E_USER_ERROR); trigger_error("$class isn't installed or you may have some permissoin issues", E_USER_ERROR);
} }
$ce = substr(phpversion(), 0, 1) > 4 ? class_exists($class, false) : class_exists($class); $ce = substr(phpversion(), 0, 1) > 4 ?
class_exists($class, false) : class_exists($class);
if (!$ce || if (!$ce ||
!in_array($method, get_class_methods($class))) !in_array($method, get_class_methods($class))
{ ) {
trigger_error("Invalid validation type $class::$method", E_USER_WARNING); trigger_error("Invalid validation type $class::$method",
E_USER_WARNING);
continue; continue;
} }
unset($opt['type']); unset($opt['type']);
if (sizeof($opt) == 1) { if (sizeof($opt) == 1) {
$opt = array_pop($opt); $opt = array_pop($opt);
} }
$valid[$var_name] = call_user_func(array($class, $method), $data[$var_name], $opt); $valid[$var_name] = call_user_func(array($class, $method),
$data[$var_name], $opt);
} else { } else {
trigger_error("Invalid validation type {$opt['type']}", E_USER_WARNING); trigger_error("Invalid validation type {$opt['type']}",
E_USER_WARNING);
} }
} }
return $valid; return $valid;