mirror of
https://github.com/e107inc/e107.git
synced 2025-01-17 20:58:30 +01:00
Removing old files
This commit is contained in:
parent
3896effe44
commit
3913e76b3d
@ -1,91 +0,0 @@
|
||||
<?php
|
||||
if (!defined('e107_INIT'))
|
||||
{
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* we need a full wide page, no sidebar,
|
||||
* where place the Facebook Invite Friends Flash Object,
|
||||
* this Object can't be styled so... put it in CUSTOMPAGES
|
||||
*
|
||||
* but we can use a popup page instead ?
|
||||
*/
|
||||
|
||||
if (USER_AREA == TRUE)
|
||||
{
|
||||
//TODO use popup window for 'invite friends'.
|
||||
// $CUSTOMPAGES = array_push(explode(' ', $CUSTOMPAGES), ' facebook.php');
|
||||
|
||||
$fb = e107::getSingleton('e_facebook',e_PLUGIN.'facebook/facebook_function.php');
|
||||
|
||||
include_once (e_PLUGIN.'facebook/facebook_function.php');
|
||||
|
||||
//echo '<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js"></script>';
|
||||
|
||||
echo '<link rel="stylesheet" href="'.e_PLUGIN.'facebook/facebook.css" type="text/css" />';
|
||||
|
||||
/**
|
||||
* if we are in comment.php page add "publish_to_facebook" checkbox to the form
|
||||
*
|
||||
*/
|
||||
|
||||
if (((e_PAGE == "comment.php") || (stripos(e_QUERY, 'extend') !== FALSE)) && ($fb->fb_uid))
|
||||
{
|
||||
|
||||
echo '<script type="text/javascript">
|
||||
document.observe("dom:loaded", function() {
|
||||
|
||||
var commentbutton = document.getElementsByName("commentsubmit")[0];
|
||||
|
||||
commentbutton.insert( {"after" : " <img src=\"http://static.ak.fbcdn.net/images/icons/favicon.gif\" /><input type=\"checkbox\" name=\"publish_to_facebook\" checked /> Publish Comment to Facebook"}) }); </script>';
|
||||
|
||||
onloadRegister('facebook_show_feed_checkbox();');
|
||||
|
||||
/**
|
||||
* Simple Pure Javascript code , do same thing of prototype!
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
echo '
|
||||
var commentbutton = document.getElementsByName("commentsubmit")[0];
|
||||
|
||||
var checkbox = document.createElement("input");
|
||||
checkbox.type = "checkbox";
|
||||
checkbox.name = "publish_to_facebook";
|
||||
checkbox.defaultChecked = true;
|
||||
|
||||
var txt = document.createTextNode("Publish Comment to Facebook");
|
||||
|
||||
var img = document.createElement("img");
|
||||
img.setAttribute("src", "http://static.ak.fbcdn.net/images/icons/favicon.gif");
|
||||
img.setAttribute("alt", "");
|
||||
img.setAttribute("style", "padding-left:5px");
|
||||
|
||||
commentbutton.parentNode.insertBefore(img,commentbutton.nextSibling);
|
||||
img.parentNode.insertBefore(checkbox,img.nextSibling);
|
||||
checkbox.parentNode.insertBefore(txt,checkbox.nextSibling);
|
||||
';
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* if we are in the signup page add the Facebook Connect Button
|
||||
*
|
||||
*/
|
||||
|
||||
}
|
||||
elseif (e_PAGE == "signup.php")
|
||||
{
|
||||
echo '<script type="text/javascript">
|
||||
document.observe("dom:loaded", function() {
|
||||
$("signupform").insert(
|
||||
{"before" : "<center>OR | Login by using Facebook<br /><br /><a href=\"#\" onclick=\"FB.Connect.requireSession(); return false;\" ><img id=\"fb_login_image\" src=\"http://static.ak.fbcdn.net/images/fbconnect/login-buttons/connect_light_medium_long.gif\" alt=\"Connect\"/></a><fb:login-button size=\"medium\" background=\"light\" length=\"long\" onlogin=\"facebook_onlogin_ready();\"></fb:login-button><br /><br /></center>"})
|
||||
|
||||
});
|
||||
</script>';
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
@ -1,602 +0,0 @@
|
||||
<?php
|
||||
// Copyright 2004-2009 Facebook. All Rights Reserved.
|
||||
//
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | Facebook Platform PHP5 client |
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | Copyright (c) 2007 Facebook, 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: |
|
||||
// | |
|
||||
// | 1. Redistributions of source code must retain the above copyright |
|
||||
// | notice, this list of conditions and the following disclaimer. |
|
||||
// | 2. 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. |
|
||||
// | |
|
||||
// | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. |
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | For help with this library, contact developers-help@facebook.com |
|
||||
// +---------------------------------------------------------------------------+
|
||||
|
||||
include_once 'facebookapi_php5_restlib.php';
|
||||
|
||||
define('FACEBOOK_API_VALIDATION_ERROR', 1);
|
||||
class Facebook {
|
||||
public $api_client;
|
||||
public $api_key;
|
||||
public $secret;
|
||||
public $generate_session_secret;
|
||||
public $session_expires;
|
||||
|
||||
public $fb_params;
|
||||
public $user;
|
||||
public $profile_user;
|
||||
public $canvas_user;
|
||||
protected $base_domain;
|
||||
/*
|
||||
* Create a Facebook client like this:
|
||||
*
|
||||
* $fb = new Facebook(API_KEY, SECRET);
|
||||
*
|
||||
* This will automatically pull in any parameters, validate them against the
|
||||
* session signature, and chuck them in the public $fb_params member variable.
|
||||
*
|
||||
* @param api_key your Developer API key
|
||||
* @param secret your Developer API secret
|
||||
* @param generate_session_secret whether to automatically generate a session
|
||||
* if the user doesn't have one, but
|
||||
* there is an auth token present in the url,
|
||||
*/
|
||||
public function __construct($api_key, $secret, $generate_session_secret=false) {
|
||||
$this->api_key = $api_key;
|
||||
$this->secret = $secret;
|
||||
$this->generate_session_secret = $generate_session_secret;
|
||||
$this->api_client = new FacebookRestClient($api_key, $secret, null);
|
||||
$this->validate_fb_params();
|
||||
|
||||
// Set the default user id for methods that allow the caller to
|
||||
// pass an explicit uid instead of using a session key.
|
||||
$defaultUser = null;
|
||||
if ($this->user) {
|
||||
$defaultUser = $this->user;
|
||||
} else if ($this->profile_user) {
|
||||
$defaultUser = $this->profile_user;
|
||||
} else if ($this->canvas_user) {
|
||||
$defaultUser = $this->canvas_user;
|
||||
}
|
||||
|
||||
$this->api_client->set_user($defaultUser);
|
||||
|
||||
|
||||
if (isset($this->fb_params['friends'])) {
|
||||
$this->api_client->friends_list = explode(',', $this->fb_params['friends']);
|
||||
}
|
||||
if (isset($this->fb_params['added'])) {
|
||||
$this->api_client->added = $this->fb_params['added'];
|
||||
}
|
||||
if (isset($this->fb_params['canvas_user'])) {
|
||||
$this->api_client->canvas_user = $this->fb_params['canvas_user'];
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Validates that the parameters passed in were sent from Facebook. It does so
|
||||
* by validating that the signature matches one that could only be generated
|
||||
* by using your application's secret key.
|
||||
*
|
||||
* Facebook-provided parameters will come from $_POST, $_GET, or $_COOKIE,
|
||||
* in that order. $_POST and $_GET are always more up-to-date than cookies,
|
||||
* so we prefer those if they are available.
|
||||
*
|
||||
* For nitty-gritty details of when each of these is used, check out
|
||||
* http://wiki.developers.facebook.com/index.php/Verifying_The_Signature
|
||||
*
|
||||
* @param bool resolve_auth_token convert an auth token into a session
|
||||
*/
|
||||
public function validate_fb_params($resolve_auth_token=true) {
|
||||
$this->fb_params = $this->get_valid_fb_params($_POST, 48 * 3600, 'fb_sig');
|
||||
|
||||
// note that with preload FQL, it's possible to receive POST params in
|
||||
// addition to GET, so use a different prefix to differentiate them
|
||||
if (!$this->fb_params) {
|
||||
$fb_params = $this->get_valid_fb_params($_GET, 48 * 3600, 'fb_sig');
|
||||
$fb_post_params = $this->get_valid_fb_params($_POST, 48 * 3600, 'fb_post_sig');
|
||||
$this->fb_params = array_merge($fb_params, $fb_post_params);
|
||||
}
|
||||
|
||||
// Okay, something came in via POST or GET
|
||||
if ($this->fb_params) {
|
||||
$user = isset($this->fb_params['user']) ?
|
||||
$this->fb_params['user'] : null;
|
||||
$this->profile_user = isset($this->fb_params['profile_user']) ?
|
||||
$this->fb_params['profile_user'] : null;
|
||||
$this->canvas_user = isset($this->fb_params['canvas_user']) ?
|
||||
$this->fb_params['canvas_user'] : null;
|
||||
$this->base_domain = isset($this->fb_params['base_domain']) ?
|
||||
$this->fb_params['base_domain'] : null;
|
||||
|
||||
if (isset($this->fb_params['session_key'])) {
|
||||
$session_key = $this->fb_params['session_key'];
|
||||
} else if (isset($this->fb_params['profile_session_key'])) {
|
||||
$session_key = $this->fb_params['profile_session_key'];
|
||||
} else {
|
||||
$session_key = null;
|
||||
}
|
||||
$expires = isset($this->fb_params['expires']) ?
|
||||
$this->fb_params['expires'] : null;
|
||||
$this->set_user($user,
|
||||
$session_key,
|
||||
$expires);
|
||||
}
|
||||
// if no Facebook parameters were found in the GET or POST variables,
|
||||
// then fall back to cookies, which may have cached user information
|
||||
// Cookies are also used to receive session data via the Javascript API
|
||||
else if ($cookies =
|
||||
$this->get_valid_fb_params($_COOKIE, null, $this->api_key)) {
|
||||
|
||||
$base_domain_cookie = 'base_domain_' . $this->api_key;
|
||||
if (isset($_COOKIE[$base_domain_cookie])) {
|
||||
$this->base_domain = $_COOKIE[$base_domain_cookie];
|
||||
}
|
||||
|
||||
// use $api_key . '_' as a prefix for the cookies in case there are
|
||||
// multiple facebook clients on the same domain.
|
||||
$expires = isset($cookies['expires']) ? $cookies['expires'] : null;
|
||||
$this->set_user($cookies['user'],
|
||||
$cookies['session_key'],
|
||||
$expires);
|
||||
}
|
||||
// finally, if we received no parameters, but the 'auth_token' GET var
|
||||
// is present, then we are in the middle of auth handshake,
|
||||
// so go ahead and create the session
|
||||
else if ($resolve_auth_token && isset($_GET['auth_token']) &&
|
||||
$session = $this->do_get_session($_GET['auth_token'])) {
|
||||
if ($this->generate_session_secret &&
|
||||
!empty($session['secret'])) {
|
||||
$session_secret = $session['secret'];
|
||||
}
|
||||
|
||||
if (isset($session['base_domain'])) {
|
||||
$this->base_domain = $session['base_domain'];
|
||||
}
|
||||
|
||||
$this->set_user($session['uid'],
|
||||
$session['session_key'],
|
||||
$session['expires'],
|
||||
isset($session_secret) ? $session_secret : null);
|
||||
}
|
||||
|
||||
return !empty($this->fb_params);
|
||||
}
|
||||
|
||||
// Store a temporary session secret for the current session
|
||||
// for use with the JS client library
|
||||
public function promote_session() {
|
||||
try {
|
||||
$session_secret = $this->api_client->auth_promoteSession();
|
||||
if (!$this->in_fb_canvas()) {
|
||||
$this->set_cookies($this->user, $this->api_client->session_key, $this->session_expires, $session_secret);
|
||||
}
|
||||
return $session_secret;
|
||||
} catch (FacebookRestClientException $e) {
|
||||
// API_EC_PARAM means we don't have a logged in user, otherwise who
|
||||
// knows what it means, so just throw it.
|
||||
if ($e->getCode() != FacebookAPIErrorCodes::API_EC_PARAM) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function do_get_session($auth_token) {
|
||||
try {
|
||||
return $this->api_client->auth_getSession($auth_token, $this->generate_session_secret);
|
||||
} catch (FacebookRestClientException $e) {
|
||||
// API_EC_PARAM means we don't have a logged in user, otherwise who
|
||||
// knows what it means, so just throw it.
|
||||
if ($e->getCode() != FacebookAPIErrorCodes::API_EC_PARAM) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Invalidate the session currently being used, and clear any state associated
|
||||
// with it. Note that the user will still remain logged into Facebook.
|
||||
public function expire_session() {
|
||||
try {
|
||||
if ($this->api_client->auth_expireSession()) {
|
||||
$this->clear_cookie_state();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
$this->clear_cookie_state();
|
||||
}
|
||||
}
|
||||
|
||||
/** Logs the user out of all temporary application sessions as well as their
|
||||
* Facebook session. Note this will only work if the user has a valid current
|
||||
* session with the application.
|
||||
*
|
||||
* @param string $next URL to redirect to upon logging out
|
||||
*
|
||||
*/
|
||||
public function logout($next) {
|
||||
$logout_url = $this->get_logout_url($next);
|
||||
|
||||
// Clear any stored state
|
||||
$this->clear_cookie_state();
|
||||
|
||||
$this->redirect($logout_url);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears any persistent state stored about the user, including
|
||||
* cookies and information related to the current session in the
|
||||
* client.
|
||||
*
|
||||
*/
|
||||
public function clear_cookie_state() {
|
||||
if (!$this->in_fb_canvas() && isset($_COOKIE[$this->api_key . '_user'])) {
|
||||
$cookies = array('user', 'session_key', 'expires', 'ss');
|
||||
foreach ($cookies as $name) {
|
||||
setcookie($this->api_key . '_' . $name, false, time() - 3600);
|
||||
unset($_COOKIE[$this->api_key . '_' . $name]);
|
||||
}
|
||||
setcookie($this->api_key, false, time() - 3600);
|
||||
unset($_COOKIE[$this->api_key]);
|
||||
}
|
||||
|
||||
// now, clear the rest of the stored state
|
||||
$this->user = 0;
|
||||
$this->api_client->session_key = 0;
|
||||
}
|
||||
|
||||
public function redirect($url) {
|
||||
if ($this->in_fb_canvas()) {
|
||||
echo '<fb:redirect url="' . $url . '"/>';
|
||||
} else if (preg_match('/^https?:\/\/([^\/]*\.)?facebook\.com(:\d+)?/i', $url)) {
|
||||
// make sure facebook.com url's load in the full frame so that we don't
|
||||
// get a frame within a frame.
|
||||
echo "<script type=\"text/javascript\">\ntop.location.href = \"$url\";\n</script>";
|
||||
} else {
|
||||
header('Location: ' . $url);
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
public function in_frame() {
|
||||
return isset($this->fb_params['in_canvas'])
|
||||
|| isset($this->fb_params['in_iframe']);
|
||||
}
|
||||
public function in_fb_canvas() {
|
||||
return isset($this->fb_params['in_canvas']);
|
||||
}
|
||||
|
||||
public function get_loggedin_user() {
|
||||
return $this->user;
|
||||
}
|
||||
|
||||
public function get_canvas_user() {
|
||||
return $this->canvas_user;
|
||||
}
|
||||
|
||||
public function get_profile_user() {
|
||||
return $this->profile_user;
|
||||
}
|
||||
|
||||
public static function current_url() {
|
||||
return 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
|
||||
}
|
||||
|
||||
// require_add and require_install have been removed.
|
||||
// see http://developer.facebook.com/news.php?blog=1&story=116 for more details
|
||||
public function require_login() {
|
||||
if ($user = $this->get_loggedin_user()) {
|
||||
return $user;
|
||||
}
|
||||
$this->redirect($this->get_login_url(self::current_url(), $this->in_frame()));
|
||||
}
|
||||
|
||||
public function require_frame() {
|
||||
if (!$this->in_frame()) {
|
||||
$this->redirect($this->get_login_url(self::current_url(), true));
|
||||
}
|
||||
}
|
||||
|
||||
public static function get_facebook_url($subdomain='www') {
|
||||
return 'http://' . $subdomain . '.facebook.com';
|
||||
}
|
||||
|
||||
public function get_install_url($next=null) {
|
||||
// this was renamed, keeping for compatibility's sake
|
||||
return $this->get_add_url($next);
|
||||
}
|
||||
|
||||
public function get_add_url($next=null) {
|
||||
$page = self::get_facebook_url().'/add.php';
|
||||
$params = array('api_key' => $this->api_key);
|
||||
|
||||
if ($next) {
|
||||
$params['next'] = $next;
|
||||
}
|
||||
|
||||
return $page . '?' . http_build_query($params);
|
||||
}
|
||||
|
||||
public function get_login_url($next, $canvas) {
|
||||
$page = self::get_facebook_url().'/login.php';
|
||||
$params = array('api_key' => $this->api_key,
|
||||
'v' => '1.0');
|
||||
|
||||
if ($next) {
|
||||
$params['next'] = $next;
|
||||
}
|
||||
if ($canvas) {
|
||||
$params['canvas'] = '1';
|
||||
}
|
||||
|
||||
return $page . '?' . http_build_query($params);
|
||||
}
|
||||
|
||||
public function get_logout_url($next) {
|
||||
$page = self::get_facebook_url().'/logout.php';
|
||||
$params = array('app_key' => $this->api_key,
|
||||
'session_key' => $this->api_client->session_key);
|
||||
|
||||
if ($next) {
|
||||
$params['connect_next'] = 1;
|
||||
$params['next'] = $next;
|
||||
}
|
||||
|
||||
return $page . '?' . http_build_query($params);
|
||||
}
|
||||
|
||||
public function set_user($user, $session_key, $expires=null, $session_secret=null) {
|
||||
if (!$this->in_fb_canvas() && (!isset($_COOKIE[$this->api_key . '_user'])
|
||||
|| $_COOKIE[$this->api_key . '_user'] != $user)) {
|
||||
$this->set_cookies($user, $session_key, $expires, $session_secret);
|
||||
}
|
||||
$this->user = $user;
|
||||
$this->api_client->session_key = $session_key;
|
||||
$this->session_expires = $expires;
|
||||
}
|
||||
|
||||
public function set_cookies($user, $session_key, $expires=null, $session_secret=null) {
|
||||
$cookies = array();
|
||||
$cookies['user'] = $user;
|
||||
$cookies['session_key'] = $session_key;
|
||||
if ($expires != null) {
|
||||
$cookies['expires'] = $expires;
|
||||
}
|
||||
if ($session_secret != null) {
|
||||
$cookies['ss'] = $session_secret;
|
||||
}
|
||||
|
||||
foreach ($cookies as $name => $val) {
|
||||
setcookie($this->api_key . '_' . $name, $val, (int)$expires, '', $this->base_domain);
|
||||
$_COOKIE[$this->api_key . '_' . $name] = $val;
|
||||
}
|
||||
$sig = self::generate_sig($cookies, $this->secret);
|
||||
setcookie($this->api_key, $sig, (int)$expires, '', $this->base_domain);
|
||||
$_COOKIE[$this->api_key] = $sig;
|
||||
|
||||
if ($this->base_domain != null) {
|
||||
$base_domain_cookie = 'base_domain_' . $this->api_key;
|
||||
setcookie($base_domain_cookie, $this->base_domain, (int)$expires, '', $this->base_domain);
|
||||
$_COOKIE[$base_domain_cookie] = $this->base_domain;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tries to undo the badness of magic quotes as best we can
|
||||
* @param string $val Should come directly from $_GET, $_POST, etc.
|
||||
* @return string val without added slashes
|
||||
*/
|
||||
public static function no_magic_quotes($val) {
|
||||
if (get_magic_quotes_gpc()) {
|
||||
return stripslashes($val);
|
||||
} else {
|
||||
return $val;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the signed parameters that were sent from Facebook. Validates the set
|
||||
* of parameters against the included signature.
|
||||
*
|
||||
* Since Facebook sends data to your callback URL via unsecured means, the
|
||||
* signature is the only way to make sure that the data actually came from
|
||||
* Facebook. So if an app receives a request at the callback URL, it should
|
||||
* always verify the signature that comes with against your own secret key.
|
||||
* Otherwise, it's possible for someone to spoof a request by
|
||||
* pretending to be someone else, i.e.:
|
||||
* www.your-callback-url.com/?fb_user=10101
|
||||
*
|
||||
* This is done automatically by verify_fb_params.
|
||||
*
|
||||
* @param assoc $params a full array of external parameters.
|
||||
* presumed $_GET, $_POST, or $_COOKIE
|
||||
* @param int $timeout number of seconds that the args are good for.
|
||||
* Specifically good for forcing cookies to expire.
|
||||
* @param string $namespace prefix string for the set of parameters we want
|
||||
* to verify. i.e., fb_sig or fb_post_sig
|
||||
*
|
||||
* @return assoc the subset of parameters containing the given prefix,
|
||||
* and also matching the signature associated with them.
|
||||
* OR an empty array if the params do not validate
|
||||
*/
|
||||
public function get_valid_fb_params($params, $timeout=null, $namespace='fb_sig') {
|
||||
$prefix = $namespace . '_';
|
||||
$prefix_len = strlen($prefix);
|
||||
$fb_params = array();
|
||||
if (empty($params)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
foreach ($params as $name => $val) {
|
||||
// pull out only those parameters that match the prefix
|
||||
// note that the signature itself ($params[$namespace]) is not in the list
|
||||
if (strpos($name, $prefix) === 0) {
|
||||
$fb_params[substr($name, $prefix_len)] = self::no_magic_quotes($val);
|
||||
}
|
||||
}
|
||||
|
||||
// validate that the request hasn't expired. this is most likely
|
||||
// for params that come from $_COOKIE
|
||||
if ($timeout && (!isset($fb_params['time']) || time() - $fb_params['time'] > $timeout)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
// validate that the params match the signature
|
||||
$signature = isset($params[$namespace]) ? $params[$namespace] : null;
|
||||
if (!$signature || (!$this->verify_signature($fb_params, $signature))) {
|
||||
return array();
|
||||
}
|
||||
return $fb_params;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the account that a user was trying to set up an
|
||||
* independent account through Facebook Connect.
|
||||
*
|
||||
* @param user The user attempting to set up an independent account.
|
||||
* @param hash The hash passed to the reclamation URL used.
|
||||
* @return bool True if the user is the one that selected the
|
||||
* reclamation link.
|
||||
*/
|
||||
public function verify_account_reclamation($user, $hash) {
|
||||
return $hash == md5($user . $this->secret);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates that a given set of parameters match their signature.
|
||||
* Parameters all match a given input prefix, such as "fb_sig".
|
||||
*
|
||||
* @param $fb_params an array of all Facebook-sent parameters,
|
||||
* not including the signature itself
|
||||
* @param $expected_sig the expected result to check against
|
||||
*/
|
||||
public function verify_signature($fb_params, $expected_sig) {
|
||||
return self::generate_sig($fb_params, $this->secret) == $expected_sig;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate the given signed public session data structure with
|
||||
* public key of the app that
|
||||
* the session proof belongs to.
|
||||
*
|
||||
* @param $signed_data the session info that is passed by another app
|
||||
* @param string $public_key Optional public key of the app. If this
|
||||
* is not passed, function will make an API call to get it.
|
||||
* return true if the session proof passed verification.
|
||||
*/
|
||||
public function verify_signed_public_session_data($signed_data,
|
||||
$public_key = null) {
|
||||
|
||||
// If public key is not already provided, we need to get it through API
|
||||
if (!$public_key) {
|
||||
$public_key = $this->api_client->auth_getAppPublicKey(
|
||||
$signed_data['api_key']);
|
||||
}
|
||||
|
||||
// Create data to verify
|
||||
$data_to_serialize = $signed_data;
|
||||
unset($data_to_serialize['sig']);
|
||||
$serialized_data = implode('_', $data_to_serialize);
|
||||
|
||||
// Decode signature
|
||||
$signature = base64_decode($signed_data['sig']);
|
||||
$result = openssl_verify($serialized_data, $signature, $public_key,
|
||||
OPENSSL_ALGO_SHA1);
|
||||
return $result == 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generate a signature using the application secret key.
|
||||
*
|
||||
* The only two entities that know your secret key are you and Facebook,
|
||||
* according to the Terms of Service. Since nobody else can generate
|
||||
* the signature, you can rely on it to verify that the information
|
||||
* came from Facebook.
|
||||
*
|
||||
* @param $params_array an array of all Facebook-sent parameters,
|
||||
* NOT INCLUDING the signature itself
|
||||
* @param $secret your app's secret key
|
||||
*
|
||||
* @return a hash to be checked against the signature provided by Facebook
|
||||
*/
|
||||
public static function generate_sig($params_array, $secret) {
|
||||
$str = '';
|
||||
|
||||
ksort($params_array);
|
||||
// Note: make sure that the signature parameter is not already included in
|
||||
// $params_array.
|
||||
foreach ($params_array as $k=>$v) {
|
||||
$str .= "$k=$v";
|
||||
}
|
||||
$str .= $secret;
|
||||
|
||||
return md5($str);
|
||||
}
|
||||
|
||||
public function encode_validationError($summary, $message) {
|
||||
return json_encode(
|
||||
array('errorCode' => FACEBOOK_API_VALIDATION_ERROR,
|
||||
'errorTitle' => $summary,
|
||||
'errorMessage' => $message));
|
||||
}
|
||||
|
||||
public function encode_multiFeedStory($feed, $next) {
|
||||
return json_encode(
|
||||
array('method' => 'multiFeedStory',
|
||||
'content' =>
|
||||
array('next' => $next,
|
||||
'feed' => $feed)));
|
||||
}
|
||||
|
||||
public function encode_feedStory($feed, $next) {
|
||||
return json_encode(
|
||||
array('method' => 'feedStory',
|
||||
'content' =>
|
||||
array('next' => $next,
|
||||
'feed' => $feed)));
|
||||
}
|
||||
|
||||
public function create_templatizedFeedStory($title_template, $title_data=array(),
|
||||
$body_template='', $body_data = array(), $body_general=null,
|
||||
$image_1=null, $image_1_link=null,
|
||||
$image_2=null, $image_2_link=null,
|
||||
$image_3=null, $image_3_link=null,
|
||||
$image_4=null, $image_4_link=null) {
|
||||
return array('title_template'=> $title_template,
|
||||
'title_data' => $title_data,
|
||||
'body_template'=> $body_template,
|
||||
'body_data' => $body_data,
|
||||
'body_general' => $body_general,
|
||||
'image_1' => $image_1,
|
||||
'image_1_link' => $image_1_link,
|
||||
'image_2' => $image_2,
|
||||
'image_2_link' => $image_2_link,
|
||||
'image_3' => $image_3,
|
||||
'image_3_link' => $image_3_link,
|
||||
'image_4' => $image_4,
|
||||
'image_4_link' => $image_4_link);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,104 +0,0 @@
|
||||
<?php
|
||||
// Copyright 2004-2009 Facebook. All Rights Reserved.
|
||||
//
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | Facebook Platform PHP5 client |
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | Copyright (c) 2007 Facebook, 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: |
|
||||
// | |
|
||||
// | 1. Redistributions of source code must retain the above copyright |
|
||||
// | notice, this list of conditions and the following disclaimer. |
|
||||
// | 2. 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. |
|
||||
// | |
|
||||
// | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. |
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | For help with this library, contact developers-help@facebook.com |
|
||||
// +---------------------------------------------------------------------------+
|
||||
//
|
||||
|
||||
/**
|
||||
* This class extends and modifies the "Facebook" class to better
|
||||
* suit desktop apps.
|
||||
*/
|
||||
class FacebookDesktop extends Facebook {
|
||||
// the application secret, which differs from the session secret
|
||||
public $app_secret;
|
||||
public $verify_sig;
|
||||
|
||||
public function __construct($api_key, $secret) {
|
||||
$this->app_secret = $secret;
|
||||
$this->verify_sig = false;
|
||||
parent::__construct($api_key, $secret);
|
||||
}
|
||||
|
||||
public function do_get_session($auth_token) {
|
||||
$this->api_client->secret = $this->app_secret;
|
||||
$this->api_client->session_key = null;
|
||||
$session_info = parent::do_get_session($auth_token);
|
||||
if (!empty($session_info['secret'])) {
|
||||
// store the session secret
|
||||
$this->set_session_secret($session_info['secret']);
|
||||
}
|
||||
return $session_info;
|
||||
}
|
||||
|
||||
public function set_session_secret($session_secret) {
|
||||
$this->secret = $session_secret;
|
||||
$this->api_client->use_session_secret($session_secret);
|
||||
}
|
||||
|
||||
public function require_login() {
|
||||
if ($this->get_loggedin_user()) {
|
||||
try {
|
||||
// try a session-based API call to ensure that we have the correct
|
||||
// session secret
|
||||
$user = $this->api_client->users_getLoggedInUser();
|
||||
|
||||
// now that we have a valid session secret, verify the signature
|
||||
$this->verify_sig = true;
|
||||
if ($this->validate_fb_params(false)) {
|
||||
return $user;
|
||||
} else {
|
||||
// validation failed
|
||||
return null;
|
||||
}
|
||||
} catch (FacebookRestClientException $ex) {
|
||||
if (isset($_GET['auth_token'])) {
|
||||
// if we have an auth_token, use it to establish a session
|
||||
$session_info = $this->do_get_session($_GET['auth_token']);
|
||||
if ($session_info) {
|
||||
return $session_info['uid'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// if we get here, we need to redirect the user to log in
|
||||
$this->redirect($this->get_login_url(self::current_url(), $this->in_fb_canvas()));
|
||||
}
|
||||
|
||||
public function verify_signature($fb_params, $expected_sig) {
|
||||
// we don't want to verify the signature until we have a valid
|
||||
// session secret
|
||||
if ($this->verify_sig) {
|
||||
return parent::verify_signature($fb_params, $expected_sig);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,260 +0,0 @@
|
||||
<?php
|
||||
// Copyright 2004-2009 Facebook. All Rights Reserved.
|
||||
//
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | Facebook Platform PHP5 client |
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | Copyright (c) 2007 Facebook, 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: |
|
||||
// | |
|
||||
// | 1. Redistributions of source code must retain the above copyright |
|
||||
// | notice, this list of conditions and the following disclaimer. |
|
||||
// | 2. 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. |
|
||||
// | |
|
||||
// | THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. |
|
||||
// +---------------------------------------------------------------------------+
|
||||
// | For help with this library, contact developers-help@facebook.com |
|
||||
// +---------------------------------------------------------------------------+
|
||||
//
|
||||
/**
|
||||
* This class extends and modifies the "Facebook" class to better suit wap
|
||||
* apps. Since there is no javascript support, we need to use server redirect
|
||||
* to implement Facebook connect functionalities such as authenticate,
|
||||
* authorize, feed form etc.. This library provide many helper functions for
|
||||
* wap developer to locate the right wap url. The url here is targed at
|
||||
* facebook wap site or wap-friendly url.
|
||||
*/
|
||||
class FacebookMobile extends Facebook {
|
||||
// the application secret, which differs from the session secret
|
||||
|
||||
public function __construct($api_key, $secret, $generate_session_secret=false) {
|
||||
parent::__construct($api_key, $secret, $generate_session_secret);
|
||||
}
|
||||
|
||||
public function redirect($url) {
|
||||
header('Location: '. $url);
|
||||
}
|
||||
|
||||
public function get_m_url($action, $params) {
|
||||
$page = parent::get_facebook_url('m'). '/' .$action;
|
||||
foreach($params as $key => $val) {
|
||||
if (!$val) {
|
||||
unset($params[$key]);
|
||||
}
|
||||
}
|
||||
return $page . '?' . http_build_query($params);
|
||||
}
|
||||
|
||||
public function get_www_url($action, $params) {
|
||||
$page = parent::get_facebook_url('www'). '/' .$action;
|
||||
foreach($params as $key => $val) {
|
||||
if (!$val) {
|
||||
unset($params[$key]);
|
||||
}
|
||||
}
|
||||
return $page . '?' . http_build_query($params);
|
||||
}
|
||||
|
||||
public function get_add_url($next=null) {
|
||||
|
||||
return $this->get_m_url('add.php', array('api_key' => $this->api_key,
|
||||
'next' => $next));
|
||||
}
|
||||
|
||||
public function get_tos_url($next=null, $cancel = null, $canvas=null) {
|
||||
return $this->get_m_url('tos.php', array('api_key' => $this->api_key,
|
||||
'v' => '1.0',
|
||||
'next' => $next,
|
||||
'canvas' => $canvas,
|
||||
'cancel' => $cancel));
|
||||
}
|
||||
|
||||
public function get_logout_url($next=null) {
|
||||
$params = array('api_key' => $this->api_key,
|
||||
'session_key' => $this->api_client->session_key,
|
||||
);
|
||||
|
||||
if ($next) {
|
||||
$params['connect_next'] = 1;
|
||||
$params['next'] = $next;
|
||||
}
|
||||
|
||||
return $this->get_m_url('logout.php', $params);
|
||||
}
|
||||
public function get_register_url($next=null, $cancel_url=null) {
|
||||
return $this->get_m_url('r.php',
|
||||
array('fbconnect' => 1,
|
||||
'api_key' => $this->api_key,
|
||||
'next' => $next ? $next : parent::current_url(),
|
||||
'cancel_url' => $cancel_url ? $cancel_url : parent::current_url()));
|
||||
}
|
||||
/**
|
||||
* These set of fbconnect style url redirect back to the application current
|
||||
* page when the action is done. Developer can also use the non fbconnect
|
||||
* style url and provide their own redirect link by giving the right parameter
|
||||
* to $next and/or $cancel_url
|
||||
*/
|
||||
public function get_fbconnect_register_url() {
|
||||
return $this->get_register_url(parent::current_url(), parent::current_url());
|
||||
}
|
||||
public function get_fbconnect_tos_url() {
|
||||
return $this->get_tos_url(parent::current_url(), parent::current_url(), $this->in_frame());
|
||||
}
|
||||
|
||||
public function get_fbconnect_logout_url() {
|
||||
return $this->get_logout_url(parent::current_url());
|
||||
}
|
||||
|
||||
public function logout_user() {
|
||||
$this->user = null;
|
||||
}
|
||||
|
||||
public function get_prompt_permissions_url($ext_perm,
|
||||
$next=null,
|
||||
$cancel_url=null) {
|
||||
|
||||
return $this->get_www_url('connect/prompt_permissions.php',
|
||||
array('api_key' => $this->api_key,
|
||||
'ext_perm' => $ext_perm,
|
||||
'next' => $next ? $next : parent::current_url(),
|
||||
'cancel' => $cancel_url ? $cancel_url : parent::current_url(),
|
||||
'display' => 'wap'));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* support both prompt_permissions.php and authorize.php for now.
|
||||
* authorized.php is to be deprecate though.
|
||||
*/
|
||||
public function get_extended_permission_url($ext_perm,
|
||||
$next=null,
|
||||
$cancel_url=null) {
|
||||
$next = $next ? $next : parent::current_url();
|
||||
$cancel_url = $cancel_url ? $cancel_url : parent::current_url();
|
||||
|
||||
return $this->get_m_url('authorize.php',
|
||||
array('api_key' => $this->api_key,
|
||||
'ext_perm' => $ext_perm,
|
||||
'next' => $next,
|
||||
'cancel_url' => $cancel_url));
|
||||
|
||||
}
|
||||
|
||||
public function render_prompt_feed_url($action_links=NULL,
|
||||
$target_id=NULL,
|
||||
$message='',
|
||||
$user_message_prompt='',
|
||||
$caption=NULL,
|
||||
$callback ='',
|
||||
$cancel='',
|
||||
$attachment=NULL,
|
||||
$preview=true) {
|
||||
|
||||
$params = array('api_key' => $this->api_key,
|
||||
'session_key' => $this->api_client->session_key,
|
||||
);
|
||||
if (!empty($attachment)) {
|
||||
$params['attachment'] = urlencode(json_encode($attachment));
|
||||
} else {
|
||||
$attachment = new stdClass();
|
||||
$app_display_info = $this->api_client->admin_getAppProperties(array('application_name',
|
||||
'callback_url',
|
||||
'description',
|
||||
'logo_url'));
|
||||
$app_display_info = $app_display_info;
|
||||
$attachment->name = $app_display_info['application_name'];
|
||||
$attachment->caption = !empty($caption) ? $caption : 'Just see what\'s new!';
|
||||
$attachment->description = $app_display_info['description'];
|
||||
$attachment->href = $app_display_info['callback_url'];
|
||||
if (!empty($app_display_info['logo_url'])) {
|
||||
$logo = new stdClass();
|
||||
$logo->type = 'image';
|
||||
$logo->src = $app_display_info['logo_url'];
|
||||
$logo->href = $app_display_info['callback_url'];
|
||||
$attachment->media = array($logo);
|
||||
}
|
||||
$params['attachment'] = urlencode(json_encode($attachment));
|
||||
}
|
||||
$params['preview'] = $preview;
|
||||
$params['message'] = $message;
|
||||
$params['user_message_prompt'] = $user_message_prompt;
|
||||
if (!empty($callback)) {
|
||||
$params['callback'] = $callback;
|
||||
} else {
|
||||
$params['callback'] = $this->current_url();
|
||||
}
|
||||
if (!empty($cancel)) {
|
||||
$params['cancel'] = $cancel;
|
||||
} else {
|
||||
$params['cancel'] = $this->current_url();
|
||||
}
|
||||
|
||||
if (!empty($target_id)) {
|
||||
$params['target_id'] = $target_id;
|
||||
}
|
||||
if (!empty($action_links)) {
|
||||
$params['action_links'] = urlencode(json_encode($action_links));
|
||||
}
|
||||
|
||||
$params['display'] = 'wap';
|
||||
header('Location: '. $this->get_www_url('connect/prompt_feed.php', $params));
|
||||
}
|
||||
|
||||
//use template_id
|
||||
public function render_feed_form_url($template_id=NULL,
|
||||
$template_data=NULL,
|
||||
$user_message=NULL,
|
||||
$body_general=NULL,
|
||||
$user_message_prompt=NULL,
|
||||
$target_id=NULL,
|
||||
$callback=NULL,
|
||||
$cancel=NULL,
|
||||
$preview=true) {
|
||||
|
||||
$params = array('api_key' => $this->api_key);
|
||||
$params['preview'] = $preview;
|
||||
if (isset($template_id) && $template_id) {
|
||||
$params['template_id'] = $template_id;
|
||||
}
|
||||
$params['message'] = $user_message ? $user_message['value'] : '';
|
||||
if (isset($body_general) && $body_general) {
|
||||
$params['body_general'] = $body_general;
|
||||
}
|
||||
if (isset($user_message_prompt) && $user_message_prompt) {
|
||||
$params['user_message_prompt'] = $user_message_prompt;
|
||||
}
|
||||
if (isset($callback) && $callback) {
|
||||
$params['callback'] = $callback;
|
||||
} else {
|
||||
$params['callback'] = $this->current_url();
|
||||
}
|
||||
if (isset($cancel) && $cancel) {
|
||||
$params['cancel'] = $cancel;
|
||||
} else {
|
||||
$params['cancel'] = $this->current_url();
|
||||
}
|
||||
if (isset($template_data) && $template_data) {
|
||||
$params['template_data'] = $template_data;
|
||||
}
|
||||
if (isset($target_id) && $target_id) {
|
||||
$params['to_ids'] = $target_id;
|
||||
}
|
||||
$params['display'] = 'wap';
|
||||
header('Location: '. $this->get_www_url('connect/prompt_feed.php', $params));
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,806 +0,0 @@
|
||||
<?php
|
||||
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
|
||||
|
||||
/**
|
||||
* Converts to and from JSON format.
|
||||
*
|
||||
* JSON (JavaScript Object Notation) is a lightweight data-interchange
|
||||
* format. It is easy for humans to read and write. It is easy for machines
|
||||
* to parse and generate. It is based on a subset of the JavaScript
|
||||
* Programming Language, Standard ECMA-262 3rd Edition - December 1999.
|
||||
* This feature can also be found in Python. JSON is a text format that is
|
||||
* completely language independent but uses conventions that are familiar
|
||||
* to programmers of the C-family of languages, including C, C++, C#, Java,
|
||||
* JavaScript, Perl, TCL, and many others. These properties make JSON an
|
||||
* ideal data-interchange language.
|
||||
*
|
||||
* This package provides a simple encoder and decoder for JSON notation. It
|
||||
* is intended for use with client-side Javascript applications that make
|
||||
* use of HTTPRequest to perform server communication functions - data can
|
||||
* be encoded into JSON notation for use in a client-side javascript, or
|
||||
* decoded from incoming Javascript requests. JSON format is native to
|
||||
* Javascript, and can be directly eval()'ed with no further parsing
|
||||
* overhead
|
||||
*
|
||||
* All strings should be in ASCII or UTF-8 format!
|
||||
*
|
||||
* LICENSE: 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.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED ``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 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
|
||||
* @package Services_JSON
|
||||
* @author Michal Migurski <mike-json@teczno.com>
|
||||
* @author Matt Knapp <mdknapp[at]gmail[dot]com>
|
||||
* @author Brett Stimmerman <brettstimmerman[at]gmail[dot]com>
|
||||
* @copyright 2005 Michal Migurski
|
||||
* @version CVS: $Id$
|
||||
* @license http://www.opensource.org/licenses/bsd-license.php
|
||||
* @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198
|
||||
*/
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_SLICE', 1);
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_IN_STR', 2);
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_IN_ARR', 3);
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_IN_OBJ', 4);
|
||||
|
||||
/**
|
||||
* Marker constant for Services_JSON::decode(), used to flag stack state
|
||||
*/
|
||||
define('SERVICES_JSON_IN_CMT', 5);
|
||||
|
||||
/**
|
||||
* Behavior switch for Services_JSON::decode()
|
||||
*/
|
||||
define('SERVICES_JSON_LOOSE_TYPE', 16);
|
||||
|
||||
/**
|
||||
* Behavior switch for Services_JSON::decode()
|
||||
*/
|
||||
define('SERVICES_JSON_SUPPRESS_ERRORS', 32);
|
||||
|
||||
/**
|
||||
* Converts to and from JSON format.
|
||||
*
|
||||
* Brief example of use:
|
||||
*
|
||||
* <code>
|
||||
* // create a new instance of Services_JSON
|
||||
* $json = new Services_JSON();
|
||||
*
|
||||
* // convert a complexe value to JSON notation, and send it to the browser
|
||||
* $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4)));
|
||||
* $output = $json->encode($value);
|
||||
*
|
||||
* print($output);
|
||||
* // prints: ["foo","bar",[1,2,"baz"],[3,[4]]]
|
||||
*
|
||||
* // accept incoming POST data, assumed to be in JSON notation
|
||||
* $input = file_get_contents('php://input', 1000000);
|
||||
* $value = $json->decode($input);
|
||||
* </code>
|
||||
*/
|
||||
class Services_JSON
|
||||
{
|
||||
/**
|
||||
* constructs a new JSON instance
|
||||
*
|
||||
* @param int $use object behavior flags; combine with boolean-OR
|
||||
*
|
||||
* possible values:
|
||||
* - SERVICES_JSON_LOOSE_TYPE: loose typing.
|
||||
* "{...}" syntax creates associative arrays
|
||||
* instead of objects in decode().
|
||||
* - SERVICES_JSON_SUPPRESS_ERRORS: error suppression.
|
||||
* Values which can't be encoded (e.g. resources)
|
||||
* appear as NULL instead of throwing errors.
|
||||
* By default, a deeply-nested resource will
|
||||
* bubble up with an error, so all return values
|
||||
* from encode() should be checked with isError()
|
||||
*/
|
||||
function Services_JSON($use = 0)
|
||||
{
|
||||
$this->use = $use;
|
||||
}
|
||||
|
||||
/**
|
||||
* convert a string from one UTF-16 char to one UTF-8 char
|
||||
*
|
||||
* Normally should be handled by mb_convert_encoding, but
|
||||
* provides a slower PHP-only method for installations
|
||||
* that lack the multibye string extension.
|
||||
*
|
||||
* @param string $utf16 UTF-16 character
|
||||
* @return string UTF-8 character
|
||||
* @access private
|
||||
*/
|
||||
function utf162utf8($utf16)
|
||||
{
|
||||
// oh please oh please oh please oh please oh please
|
||||
if(function_exists('mb_convert_encoding')) {
|
||||
return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16');
|
||||
}
|
||||
|
||||
$bytes = (ord($utf16{0}) << 8) | ord($utf16{1});
|
||||
|
||||
switch(true) {
|
||||
case ((0x7F & $bytes) == $bytes):
|
||||
// this case should never be reached, because we are in ASCII range
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr(0x7F & $bytes);
|
||||
|
||||
case (0x07FF & $bytes) == $bytes:
|
||||
// return a 2-byte UTF-8 character
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr(0xC0 | (($bytes >> 6) & 0x1F))
|
||||
. chr(0x80 | ($bytes & 0x3F));
|
||||
|
||||
case (0xFFFF & $bytes) == $bytes:
|
||||
// return a 3-byte UTF-8 character
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr(0xE0 | (($bytes >> 12) & 0x0F))
|
||||
. chr(0x80 | (($bytes >> 6) & 0x3F))
|
||||
. chr(0x80 | ($bytes & 0x3F));
|
||||
}
|
||||
|
||||
// ignoring UTF-32 for now, sorry
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* convert a string from one UTF-8 char to one UTF-16 char
|
||||
*
|
||||
* Normally should be handled by mb_convert_encoding, but
|
||||
* provides a slower PHP-only method for installations
|
||||
* that lack the multibye string extension.
|
||||
*
|
||||
* @param string $utf8 UTF-8 character
|
||||
* @return string UTF-16 character
|
||||
* @access private
|
||||
*/
|
||||
function utf82utf16($utf8)
|
||||
{
|
||||
// oh please oh please oh please oh please oh please
|
||||
if(function_exists('mb_convert_encoding')) {
|
||||
return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8');
|
||||
}
|
||||
|
||||
switch(strlen($utf8)) {
|
||||
case 1:
|
||||
// this case should never be reached, because we are in ASCII range
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return $utf8;
|
||||
|
||||
case 2:
|
||||
// return a UTF-16 character from a 2-byte UTF-8 char
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr(0x07 & (ord($utf8{0}) >> 2))
|
||||
. chr((0xC0 & (ord($utf8{0}) << 6))
|
||||
| (0x3F & ord($utf8{1})));
|
||||
|
||||
case 3:
|
||||
// return a UTF-16 character from a 3-byte UTF-8 char
|
||||
// see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
return chr((0xF0 & (ord($utf8{0}) << 4))
|
||||
| (0x0F & (ord($utf8{1}) >> 2)))
|
||||
. chr((0xC0 & (ord($utf8{1}) << 6))
|
||||
| (0x7F & ord($utf8{2})));
|
||||
}
|
||||
|
||||
// ignoring UTF-32 for now, sorry
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* encodes an arbitrary variable into JSON format
|
||||
*
|
||||
* @param mixed $var any number, boolean, string, array, or object to be encoded.
|
||||
* see argument 1 to Services_JSON() above for array-parsing behavior.
|
||||
* if var is a strng, note that encode() always expects it
|
||||
* to be in ASCII or UTF-8 format!
|
||||
*
|
||||
* @return mixed JSON string representation of input var or an error if a problem occurs
|
||||
* @access public
|
||||
*/
|
||||
function encode($var)
|
||||
{
|
||||
switch (gettype($var)) {
|
||||
case 'boolean':
|
||||
return $var ? 'true' : 'false';
|
||||
|
||||
case 'NULL':
|
||||
return 'null';
|
||||
|
||||
case 'integer':
|
||||
return (int) $var;
|
||||
|
||||
case 'double':
|
||||
case 'float':
|
||||
return (float) $var;
|
||||
|
||||
case 'string':
|
||||
// STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT
|
||||
$ascii = '';
|
||||
$strlen_var = strlen($var);
|
||||
|
||||
/*
|
||||
* Iterate over every character in the string,
|
||||
* escaping with a slash or encoding to UTF-8 where necessary
|
||||
*/
|
||||
for ($c = 0; $c < $strlen_var; ++$c) {
|
||||
|
||||
$ord_var_c = ord($var{$c});
|
||||
|
||||
switch (true) {
|
||||
case $ord_var_c == 0x08:
|
||||
$ascii .= '\b';
|
||||
break;
|
||||
case $ord_var_c == 0x09:
|
||||
$ascii .= '\t';
|
||||
break;
|
||||
case $ord_var_c == 0x0A:
|
||||
$ascii .= '\n';
|
||||
break;
|
||||
case $ord_var_c == 0x0C:
|
||||
$ascii .= '\f';
|
||||
break;
|
||||
case $ord_var_c == 0x0D:
|
||||
$ascii .= '\r';
|
||||
break;
|
||||
|
||||
case $ord_var_c == 0x22:
|
||||
case $ord_var_c == 0x2F:
|
||||
case $ord_var_c == 0x5C:
|
||||
// double quote, slash, slosh
|
||||
$ascii .= '\\'.$var{$c};
|
||||
break;
|
||||
|
||||
case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
|
||||
// characters U-00000000 - U-0000007F (same as ASCII)
|
||||
$ascii .= $var{$c};
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xE0) == 0xC0):
|
||||
// characters U-00000080 - U-000007FF, mask 110XXXXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c, ord($var{$c + 1}));
|
||||
$c += 1;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xF0) == 0xE0):
|
||||
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c,
|
||||
ord($var{$c + 1}),
|
||||
ord($var{$c + 2}));
|
||||
$c += 2;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xF8) == 0xF0):
|
||||
// characters U-00010000 - U-001FFFFF, mask 11110XXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c,
|
||||
ord($var{$c + 1}),
|
||||
ord($var{$c + 2}),
|
||||
ord($var{$c + 3}));
|
||||
$c += 3;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xFC) == 0xF8):
|
||||
// characters U-00200000 - U-03FFFFFF, mask 111110XX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c,
|
||||
ord($var{$c + 1}),
|
||||
ord($var{$c + 2}),
|
||||
ord($var{$c + 3}),
|
||||
ord($var{$c + 4}));
|
||||
$c += 4;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
|
||||
case (($ord_var_c & 0xFE) == 0xFC):
|
||||
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$char = pack('C*', $ord_var_c,
|
||||
ord($var{$c + 1}),
|
||||
ord($var{$c + 2}),
|
||||
ord($var{$c + 3}),
|
||||
ord($var{$c + 4}),
|
||||
ord($var{$c + 5}));
|
||||
$c += 5;
|
||||
$utf16 = $this->utf82utf16($char);
|
||||
$ascii .= sprintf('\u%04s', bin2hex($utf16));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return '"'.$ascii.'"';
|
||||
|
||||
case 'array':
|
||||
/*
|
||||
* As per JSON spec if any array key is not an integer
|
||||
* we must treat the the whole array as an object. We
|
||||
* also try to catch a sparsely populated associative
|
||||
* array with numeric keys here because some JS engines
|
||||
* will create an array with empty indexes up to
|
||||
* max_index which can cause memory issues and because
|
||||
* the keys, which may be relevant, will be remapped
|
||||
* otherwise.
|
||||
*
|
||||
* As per the ECMA and JSON specification an object may
|
||||
* have any string as a property. Unfortunately due to
|
||||
* a hole in the ECMA specification if the key is a
|
||||
* ECMA reserved word or starts with a digit the
|
||||
* parameter is only accessible using ECMAScript's
|
||||
* bracket notation.
|
||||
*/
|
||||
|
||||
// treat as a JSON object
|
||||
if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) {
|
||||
$properties = array_map(array($this, 'name_value'),
|
||||
array_keys($var),
|
||||
array_values($var));
|
||||
|
||||
foreach($properties as $property) {
|
||||
if(Services_JSON::isError($property)) {
|
||||
return $property;
|
||||
}
|
||||
}
|
||||
|
||||
return '{' . join(',', $properties) . '}';
|
||||
}
|
||||
|
||||
// treat it like a regular array
|
||||
$elements = array_map(array($this, 'encode'), $var);
|
||||
|
||||
foreach($elements as $element) {
|
||||
if(Services_JSON::isError($element)) {
|
||||
return $element;
|
||||
}
|
||||
}
|
||||
|
||||
return '[' . join(',', $elements) . ']';
|
||||
|
||||
case 'object':
|
||||
$vars = get_object_vars($var);
|
||||
|
||||
$properties = array_map(array($this, 'name_value'),
|
||||
array_keys($vars),
|
||||
array_values($vars));
|
||||
|
||||
foreach($properties as $property) {
|
||||
if(Services_JSON::isError($property)) {
|
||||
return $property;
|
||||
}
|
||||
}
|
||||
|
||||
return '{' . join(',', $properties) . '}';
|
||||
|
||||
default:
|
||||
return ($this->use & SERVICES_JSON_SUPPRESS_ERRORS)
|
||||
? 'null'
|
||||
: new Services_JSON_Error(gettype($var)." can not be encoded as JSON string");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* array-walking function for use in generating JSON-formatted name-value pairs
|
||||
*
|
||||
* @param string $name name of key to use
|
||||
* @param mixed $value reference to an array element to be encoded
|
||||
*
|
||||
* @return string JSON-formatted name-value pair, like '"name":value'
|
||||
* @access private
|
||||
*/
|
||||
function name_value($name, $value)
|
||||
{
|
||||
$encoded_value = $this->encode($value);
|
||||
|
||||
if(Services_JSON::isError($encoded_value)) {
|
||||
return $encoded_value;
|
||||
}
|
||||
|
||||
return $this->encode(strval($name)) . ':' . $encoded_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* reduce a string by removing leading and trailing comments and whitespace
|
||||
*
|
||||
* @param $str string string value to strip of comments and whitespace
|
||||
*
|
||||
* @return string string value stripped of comments and whitespace
|
||||
* @access private
|
||||
*/
|
||||
function reduce_string($str)
|
||||
{
|
||||
$str = preg_replace(array(
|
||||
|
||||
// eliminate single line comments in '// ...' form
|
||||
'#^\s*//(.+)$#m',
|
||||
|
||||
// eliminate multi-line comments in '/* ... */' form, at start of string
|
||||
'#^\s*/\*(.+)\*/#Us',
|
||||
|
||||
// eliminate multi-line comments in '/* ... */' form, at end of string
|
||||
'#/\*(.+)\*/\s*$#Us'
|
||||
|
||||
), '', $str);
|
||||
|
||||
// eliminate extraneous space
|
||||
return trim($str);
|
||||
}
|
||||
|
||||
/**
|
||||
* decodes a JSON string into appropriate variable
|
||||
*
|
||||
* @param string $str JSON-formatted string
|
||||
*
|
||||
* @return mixed number, boolean, string, array, or object
|
||||
* corresponding to given JSON input string.
|
||||
* See argument 1 to Services_JSON() above for object-output behavior.
|
||||
* Note that decode() always returns strings
|
||||
* in ASCII or UTF-8 format!
|
||||
* @access public
|
||||
*/
|
||||
function decode($str)
|
||||
{
|
||||
$str = $this->reduce_string($str);
|
||||
|
||||
switch (strtolower($str)) {
|
||||
case 'true':
|
||||
return true;
|
||||
|
||||
case 'false':
|
||||
return false;
|
||||
|
||||
case 'null':
|
||||
return null;
|
||||
|
||||
default:
|
||||
$m = array();
|
||||
|
||||
if (is_numeric($str)) {
|
||||
// Lookie-loo, it's a number
|
||||
|
||||
// This would work on its own, but I'm trying to be
|
||||
// good about returning integers where appropriate:
|
||||
// return (float)$str;
|
||||
|
||||
// Return float or int, as appropriate
|
||||
return ((float)$str == (integer)$str)
|
||||
? (integer)$str
|
||||
: (float)$str;
|
||||
|
||||
} elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) {
|
||||
// STRINGS RETURNED IN UTF-8 FORMAT
|
||||
$delim = substr($str, 0, 1);
|
||||
$chrs = substr($str, 1, -1);
|
||||
$utf8 = '';
|
||||
$strlen_chrs = strlen($chrs);
|
||||
|
||||
for ($c = 0; $c < $strlen_chrs; ++$c) {
|
||||
|
||||
$substr_chrs_c_2 = substr($chrs, $c, 2);
|
||||
$ord_chrs_c = ord($chrs{$c});
|
||||
|
||||
switch (true) {
|
||||
case $substr_chrs_c_2 == '\b':
|
||||
$utf8 .= chr(0x08);
|
||||
++$c;
|
||||
break;
|
||||
case $substr_chrs_c_2 == '\t':
|
||||
$utf8 .= chr(0x09);
|
||||
++$c;
|
||||
break;
|
||||
case $substr_chrs_c_2 == '\n':
|
||||
$utf8 .= chr(0x0A);
|
||||
++$c;
|
||||
break;
|
||||
case $substr_chrs_c_2 == '\f':
|
||||
$utf8 .= chr(0x0C);
|
||||
++$c;
|
||||
break;
|
||||
case $substr_chrs_c_2 == '\r':
|
||||
$utf8 .= chr(0x0D);
|
||||
++$c;
|
||||
break;
|
||||
|
||||
case $substr_chrs_c_2 == '\\"':
|
||||
case $substr_chrs_c_2 == '\\\'':
|
||||
case $substr_chrs_c_2 == '\\\\':
|
||||
case $substr_chrs_c_2 == '\\/':
|
||||
if (($delim == '"' && $substr_chrs_c_2 != '\\\'') ||
|
||||
($delim == "'" && $substr_chrs_c_2 != '\\"')) {
|
||||
$utf8 .= $chrs{++$c};
|
||||
}
|
||||
break;
|
||||
|
||||
case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $c, 6)):
|
||||
// single, escaped unicode character
|
||||
$utf16 = chr(hexdec(substr($chrs, ($c + 2), 2)))
|
||||
. chr(hexdec(substr($chrs, ($c + 4), 2)));
|
||||
$utf8 .= $this->utf162utf8($utf16);
|
||||
$c += 5;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F):
|
||||
$utf8 .= $chrs{$c};
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xE0) == 0xC0:
|
||||
// characters U-00000080 - U-000007FF, mask 110XXXXX
|
||||
//see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 2);
|
||||
++$c;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xF0) == 0xE0:
|
||||
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 3);
|
||||
$c += 2;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xF8) == 0xF0:
|
||||
// characters U-00010000 - U-001FFFFF, mask 11110XXX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 4);
|
||||
$c += 3;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xFC) == 0xF8:
|
||||
// characters U-00200000 - U-03FFFFFF, mask 111110XX
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 5);
|
||||
$c += 4;
|
||||
break;
|
||||
|
||||
case ($ord_chrs_c & 0xFE) == 0xFC:
|
||||
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
|
||||
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
|
||||
$utf8 .= substr($chrs, $c, 6);
|
||||
$c += 5;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return $utf8;
|
||||
|
||||
} elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) {
|
||||
// array, or object notation
|
||||
|
||||
if ($str{0} == '[') {
|
||||
$stk = array(SERVICES_JSON_IN_ARR);
|
||||
$arr = array();
|
||||
} else {
|
||||
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
|
||||
$stk = array(SERVICES_JSON_IN_OBJ);
|
||||
$obj = array();
|
||||
} else {
|
||||
$stk = array(SERVICES_JSON_IN_OBJ);
|
||||
$obj = new stdClass();
|
||||
}
|
||||
}
|
||||
|
||||
array_push($stk, array('what' => SERVICES_JSON_SLICE,
|
||||
'where' => 0,
|
||||
'delim' => false));
|
||||
|
||||
$chrs = substr($str, 1, -1);
|
||||
$chrs = $this->reduce_string($chrs);
|
||||
|
||||
if ($chrs == '') {
|
||||
if (reset($stk) == SERVICES_JSON_IN_ARR) {
|
||||
return $arr;
|
||||
|
||||
} else {
|
||||
return $obj;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//print("\nparsing {$chrs}\n");
|
||||
|
||||
$strlen_chrs = strlen($chrs);
|
||||
|
||||
for ($c = 0; $c <= $strlen_chrs; ++$c) {
|
||||
|
||||
$top = end($stk);
|
||||
$substr_chrs_c_2 = substr($chrs, $c, 2);
|
||||
|
||||
if (($c == $strlen_chrs) || (($chrs{$c} == ',') && ($top['what'] == SERVICES_JSON_SLICE))) {
|
||||
// found a comma that is not inside a string, array, etc.,
|
||||
// OR we've reached the end of the character list
|
||||
$slice = substr($chrs, $top['where'], ($c - $top['where']));
|
||||
array_push($stk, array('what' => SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false));
|
||||
//print("Found split at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
|
||||
|
||||
if (reset($stk) == SERVICES_JSON_IN_ARR) {
|
||||
// we are in an array, so just push an element onto the stack
|
||||
array_push($arr, $this->decode($slice));
|
||||
|
||||
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
|
||||
// we are in an object, so figure
|
||||
// out the property name and set an
|
||||
// element in an associative array,
|
||||
// for now
|
||||
$parts = array();
|
||||
|
||||
if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
|
||||
// "name":value pair
|
||||
$key = $this->decode($parts[1]);
|
||||
$val = $this->decode($parts[2]);
|
||||
|
||||
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
|
||||
$obj[$key] = $val;
|
||||
} else {
|
||||
$obj->$key = $val;
|
||||
}
|
||||
} elseif (preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis', $slice, $parts)) {
|
||||
// name:value pair, where name is unquoted
|
||||
$key = $parts[1];
|
||||
$val = $this->decode($parts[2]);
|
||||
|
||||
if ($this->use & SERVICES_JSON_LOOSE_TYPE) {
|
||||
$obj[$key] = $val;
|
||||
} else {
|
||||
$obj->$key = $val;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} elseif ((($chrs{$c} == '"') || ($chrs{$c} == "'")) && ($top['what'] != SERVICES_JSON_IN_STR)) {
|
||||
// found a quote, and we are not inside a string
|
||||
array_push($stk, array('what' => SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs{$c}));
|
||||
//print("Found start of string at {$c}\n");
|
||||
|
||||
} elseif (($chrs{$c} == $top['delim']) &&
|
||||
($top['what'] == SERVICES_JSON_IN_STR) &&
|
||||
((strlen(substr($chrs, 0, $c)) - strlen(rtrim(substr($chrs, 0, $c), '\\'))) % 2 != 1)) {
|
||||
// found a quote, we're in a string, and it's not escaped
|
||||
// we know that it's not escaped becase there is _not_ an
|
||||
// odd number of backslashes at the end of the string so far
|
||||
array_pop($stk);
|
||||
//print("Found end of string at {$c}: ".substr($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n");
|
||||
|
||||
} elseif (($chrs{$c} == '[') &&
|
||||
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
|
||||
// found a left-bracket, and we are in an array, object, or slice
|
||||
array_push($stk, array('what' => SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false));
|
||||
//print("Found start of array at {$c}\n");
|
||||
|
||||
} elseif (($chrs{$c} == ']') && ($top['what'] == SERVICES_JSON_IN_ARR)) {
|
||||
// found a right-bracket, and we're in an array
|
||||
array_pop($stk);
|
||||
//print("Found end of array at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
|
||||
|
||||
} elseif (($chrs{$c} == '{') &&
|
||||
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
|
||||
// found a left-brace, and we are in an array, object, or slice
|
||||
array_push($stk, array('what' => SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false));
|
||||
//print("Found start of object at {$c}\n");
|
||||
|
||||
} elseif (($chrs{$c} == '}') && ($top['what'] == SERVICES_JSON_IN_OBJ)) {
|
||||
// found a right-brace, and we're in an object
|
||||
array_pop($stk);
|
||||
//print("Found end of object at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
|
||||
|
||||
} elseif (($substr_chrs_c_2 == '/*') &&
|
||||
in_array($top['what'], array(SERVICES_JSON_SLICE, SERVICES_JSON_IN_ARR, SERVICES_JSON_IN_OBJ))) {
|
||||
// found a comment start, and we are in an array, object, or slice
|
||||
array_push($stk, array('what' => SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false));
|
||||
$c++;
|
||||
//print("Found start of comment at {$c}\n");
|
||||
|
||||
} elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == SERVICES_JSON_IN_CMT)) {
|
||||
// found a comment end, and we're in one now
|
||||
array_pop($stk);
|
||||
$c++;
|
||||
|
||||
for ($i = $top['where']; $i <= $c; ++$i)
|
||||
$chrs = substr_replace($chrs, ' ', $i, 1);
|
||||
|
||||
//print("Found end of comment at {$c}: ".substr($chrs, $top['where'], (1 + $c - $top['where']))."\n");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (reset($stk) == SERVICES_JSON_IN_ARR) {
|
||||
return $arr;
|
||||
|
||||
} elseif (reset($stk) == SERVICES_JSON_IN_OBJ) {
|
||||
return $obj;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo Ultimately, this should just call PEAR::isError()
|
||||
*/
|
||||
function isError($data, $code = null)
|
||||
{
|
||||
if (class_exists('pear')) {
|
||||
return PEAR::isError($data, $code);
|
||||
} elseif (is_object($data) && (get_class($data) == 'services_json_error' ||
|
||||
is_subclass_of($data, 'services_json_error'))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (class_exists('PEAR_Error')) {
|
||||
|
||||
class Services_JSON_Error extends PEAR_Error
|
||||
{
|
||||
function Services_JSON_Error($message = 'unknown error', $code = null,
|
||||
$mode = null, $options = null, $userinfo = null)
|
||||
{
|
||||
parent::PEAR_Error($message, $code, $mode, $options, $userinfo);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
/**
|
||||
* @todo Ultimately, this class shall be descended from PEAR_Error
|
||||
*/
|
||||
class Services_JSON_Error
|
||||
{
|
||||
function Services_JSON_Error($message = 'unknown error', $code = null,
|
||||
$mode = null, $options = null, $userinfo = null)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
@ -1,21 +0,0 @@
|
||||
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.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED ``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 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.
|
@ -1,6 +0,0 @@
|
||||
<?php
|
||||
# In PHP 5.2 or higher we don't need to bring this in
|
||||
if (!function_exists('json_encode')) {
|
||||
require_once 'jsonwrapper_inner.php';
|
||||
}
|
||||
?>
|
@ -1,23 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once 'JSON/JSON.php';
|
||||
|
||||
function json_encode($arg)
|
||||
{
|
||||
global $services_json;
|
||||
if (!isset($services_json)) {
|
||||
$services_json = new Services_JSON();
|
||||
}
|
||||
return $services_json->encode($arg);
|
||||
}
|
||||
|
||||
function json_decode($arg)
|
||||
{
|
||||
global $services_json;
|
||||
if (!isset($services_json)) {
|
||||
$services_json = new Services_JSON();
|
||||
}
|
||||
return $services_json->decode($arg);
|
||||
}
|
||||
|
||||
?>
|
@ -1,62 +0,0 @@
|
||||
.fb_share_button { display: -moz-inline-block; display:inline-block; padding:1px 20px 0 5px; height:15px; border:1px solid #d8dfea; background:url(http://static.ak.fbcdn.net/rsrc.php/z39E0/hash/ya8q506x.gif) no-repeat top right; }
|
||||
|
||||
html .fb_share_button:hover { color:#fff; border-color:#295582; background:#3b5998 url(http://static.ak.fbcdn.net/rsrc.php/z39E0/hash/ya8q506x.gif) no-repeat top right; text-decoration:none; }
|
||||
|
||||
.facebook_link {
|
||||
background:#3b5998;
|
||||
line-height:1.6em;font-size:12px;height:100%;width:100%;padding:5px;border:1px solid #203360;
|
||||
color:#fff; font-weight:bold; margin: 5px auto auto auto
|
||||
}
|
||||
|
||||
.facebook_link:hover {
|
||||
background:#637bad;
|
||||
}
|
||||
|
||||
.facebook_notice a,
|
||||
.facebook_link a{
|
||||
text-decoration:none
|
||||
}
|
||||
|
||||
.facebook_notice a{
|
||||
color:#000
|
||||
}
|
||||
|
||||
.facebook_link a{
|
||||
color: #fff
|
||||
}
|
||||
|
||||
.facebook_notice {
|
||||
color:#000;
|
||||
background:#fff9d7;
|
||||
line-height:1.6em;font-size:12px;height:100%;width:100%;padding:5px;border:1px solid #e2c822;font-weight:bold; margin: 5px auto auto auto
|
||||
}
|
||||
|
||||
.facebook_notice:hover {
|
||||
border:1px solid #dd3c10;
|
||||
background: #ffebe8;
|
||||
}
|
||||
|
||||
.welcome_msg {
|
||||
height:100%;
|
||||
width:100%;
|
||||
background:#eaecf3;
|
||||
padding:5px;
|
||||
line-height:1.6em;
|
||||
border:1px solid #d1d5da;
|
||||
margin: 5px auto auto auto
|
||||
}
|
||||
|
||||
.user_image {
|
||||
height:100%;
|
||||
width:100%;
|
||||
padding:5px;
|
||||
background:#eaecf3;
|
||||
border:1px solid #d1d5da;
|
||||
margin: 5px auto auto auto
|
||||
}
|
||||
|
||||
.fb_green {
|
||||
background: #ddffbb;
|
||||
color:#558833;
|
||||
line-height:1.6em;font-size:12px;height:100%;width:100%;padding:5px;border:1px solid #88dd00;font-weight:bold; margin: 5px auto auto auto
|
||||
}
|
@ -1,133 +0,0 @@
|
||||
|
||||
/*
|
||||
* The facebook_onload statement is printed out in the PHP. If the user's logged in
|
||||
* status has changed since the last page load, then refresh the page to pick up
|
||||
* the change.
|
||||
*
|
||||
* This helps enforce the concept of "single sign on", so that if a user is signed into
|
||||
* Facebook when they visit your site, they will be automatically logged in -
|
||||
* without any need to click the login button.
|
||||
*
|
||||
* @param already_logged_into_facebook reports whether the server thinks the user
|
||||
* is logged in, based on their cookies
|
||||
*
|
||||
*/
|
||||
function facebook_onload(already_logged_into_facebook) {
|
||||
// user state is either: has a session, or does not.
|
||||
// if the state has changed, detect that and reload.
|
||||
FB.ensureInit(function() {
|
||||
|
||||
FB.Connect.get_status().waitUntilReady( function( status ) {
|
||||
switch ( status ) {
|
||||
case FB.ConnectState.connected:
|
||||
|
||||
loggedIn = true;
|
||||
break;
|
||||
case FB.ConnectState.appNotAuthorized:
|
||||
case FB.ConnectState.userNotLoggedIn:
|
||||
|
||||
|
||||
loggedIn = false;
|
||||
}
|
||||
});
|
||||
|
||||
/* FB.Facebook.get_sessionState().waitUntilReady(function(session) {
|
||||
var is_now_logged_into_facebook = session ? true : false;
|
||||
|
||||
// if the new state is the same as the old (i.e., nothing changed)
|
||||
// then do nothing
|
||||
if (is_now_logged_into_facebook == already_logged_into_facebook) {
|
||||
return;
|
||||
}
|
||||
|
||||
// otherwise, refresh to pick up the state change
|
||||
refresh_page();
|
||||
}); */
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* Our <fb:login-button> specifies this function in its onlogin attribute,
|
||||
* which is triggered after the user authenticates the app in the Connect
|
||||
* dialog and the Facebook session has been set in the cookies.
|
||||
*/
|
||||
function facebook_onlogin_ready() {
|
||||
FB.Connect.ifUserConnected("/index.php?login", null);
|
||||
// In this app, we redirect the user back to index.php. The server will read
|
||||
// the cookie and see that the user is logged in, and will deliver a new page
|
||||
// with content appropriate for a logged-in user.
|
||||
//
|
||||
// However, a more complex app could use this function to do AJAX calls
|
||||
// and/or in-place replacement of page contents to avoid a full page refresh.
|
||||
// refresh_page();
|
||||
}
|
||||
|
||||
/*
|
||||
* Do a page refresh after login state changes.
|
||||
* This is the easiest but not the only way to pick up changes.
|
||||
* If you have a small amount of Facebook-specific content on a large page,
|
||||
* then you could change it in Javascript without refresh.
|
||||
*/
|
||||
function refresh_page() {
|
||||
window.location = 'index.php';
|
||||
}
|
||||
|
||||
/*
|
||||
* Prompts the user to grant a permission to the application.
|
||||
*/
|
||||
function facebook_prompt_permission(permission) {
|
||||
FB.ensureInit(function() {
|
||||
FB.Connect.showPermissionDialog(permission);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function facebook_log_out(){
|
||||
FB.ensureInit(function() {
|
||||
FB.Connect.logout(function() { refresh_page(); });
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Show the feed form. This would be typically called in response to the
|
||||
* onclick handler of a "Publish" button, or in the onload event after
|
||||
* the user submits a form with info that should be published.
|
||||
*
|
||||
*/
|
||||
function facebook_publish_feed_story(user_message) {
|
||||
// Load the feed form
|
||||
FB.ensureInit(function() {
|
||||
// FB.Connect.showFeedDialog(form_bundle_id, template_data);
|
||||
// FB.Connect.showFeedDialog(form_bundle_id, template_data, null, null, FB.FeedStorySize.shortStory, FB.RequireConnect.promptConnect);
|
||||
FB.Connect.streamPublish(user_message,'');
|
||||
|
||||
// hide the "Loading feed story ..." div
|
||||
ge('feed_loading').style.visibility = "hidden";
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* If a user is not connected, then the checkbox that says "Publish To Facebook"
|
||||
* is hidden in the "add run" form.
|
||||
*
|
||||
* This function detects whether the user is logged into facebook but just
|
||||
* not connected, and shows the checkbox if that's true.
|
||||
*/
|
||||
function facebook_show_feed_checkbox() {
|
||||
FB.ensureInit(function() {
|
||||
FB.Connect.get_status().waitUntilReady(function(status) {
|
||||
if (status != FB.ConnectState.userNotLoggedIn) {
|
||||
// If the user is currently logged into Facebook, but has not
|
||||
// authorized the app, then go ahead and show them the feed dialog + upsell
|
||||
checkbox = ge('publish_fb_checkbox');
|
||||
if (checkbox) {
|
||||
checkbox.style.visibility = "visible";
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
require_once('../../class2.php');
|
||||
|
||||
require_once(HEADERF);
|
||||
//TODO include_lan();
|
||||
|
||||
$text = '<fb:serverfbml style="'.USER_WIDTH.'">
|
||||
<script type="text/fbml">
|
||||
<fb:fbml>
|
||||
<fb:request-form
|
||||
action="'.e_SELF.'"
|
||||
method="GET"
|
||||
invite="true"
|
||||
type="'.SITENAME.'"
|
||||
content="'.SITENAME.'
|
||||
<fb:req-choice url=\''.e_SELF.'\'
|
||||
label=\'Become a Member!\' />
|
||||
">
|
||||
|
||||
<fb:multi-friend-selector
|
||||
showborder="true"
|
||||
|
||||
actiontext="Select the friends you want to invite.">
|
||||
</fb:request-form>
|
||||
</fb:fbml>
|
||||
|
||||
</script>
|
||||
</fb:serverfbml>';
|
||||
|
||||
$ns->tablerender("Facebook Connect Invite Friends",$text);
|
||||
|
||||
require_once(FOOTERF);
|
||||
|
||||
?>
|
@ -1,234 +0,0 @@
|
||||
<?php
|
||||
$eplug_admin = TRUE;
|
||||
require_once ("../../class2.php");
|
||||
if (!getperms("P"))
|
||||
{
|
||||
header("location:".e_BASE."index.php");
|
||||
exit();
|
||||
}
|
||||
|
||||
// version 0.8
|
||||
/*if(!plugInstalled('facebook'))
|
||||
{
|
||||
header("location:".e_BASE."index.php");
|
||||
exit();
|
||||
}*/
|
||||
|
||||
class facebook_admin extends e_admin_dispatcher
|
||||
{
|
||||
|
||||
protected $modes = array(
|
||||
'main' => array(
|
||||
'controller' => 'facebook_main_ui',
|
||||
'path' => null,
|
||||
'ui' => 'facebook_admin_form_ui',
|
||||
'uipath' => null
|
||||
)
|
||||
);
|
||||
|
||||
protected $adminMenu = array(
|
||||
'main/prefs' => array('caption'=> LAN_PREFS, 'perm' => '0'),
|
||||
'main/custom' => array('caption'=> 'Instructions', 'perm' => '0'),
|
||||
'main/list' => array('caption'=> 'Facebook Users', 'perm' => '0')
|
||||
);
|
||||
|
||||
protected $menuTitle = 'Facebook';
|
||||
}
|
||||
|
||||
|
||||
|
||||
class facebook_main_ui extends e_admin_ui
|
||||
{
|
||||
protected $pluginTitle = 'Facebook Connect';
|
||||
protected $pluginName = 'facebook';
|
||||
protected $table = "facebook";
|
||||
protected $pid = "facebook_id";
|
||||
|
||||
|
||||
protected $fields; //coming soon.
|
||||
|
||||
|
||||
protected $prefs = array(
|
||||
'Facebook_App-Bundle' => array('title'=> 'Facebook Application ID', 'type'=>'text'),
|
||||
'Facebook_Api-Key' => array('title'=> 'Facebook API Key', 'type'=>'text'),
|
||||
'Facebook_Secret-Key' => array('title'=> 'Facebook Secret Key', 'type'=>'text')
|
||||
);
|
||||
|
||||
|
||||
function init()
|
||||
{
|
||||
$this->fields = array();
|
||||
// echo $this->readSQLFile();
|
||||
}
|
||||
|
||||
function readSQLFile()
|
||||
{
|
||||
$convert = array('varchar'=>'text','int'=>'int','text'=>'textarea');
|
||||
$text = "<pre>";
|
||||
$text .= "\$fields = array(\n";
|
||||
$text .= "\t'checkboxes' => array('title'=> '', 'type' => null),\n";
|
||||
|
||||
$tmp = file_get_contents(e_PLUGIN.$this->pluginName."/".$this->pluginName."_sql.php");
|
||||
$lines = explode("\n",$tmp);
|
||||
foreach($lines as $line)
|
||||
{
|
||||
$line = trim($line);
|
||||
$line = str_replace(" "," ",$line);
|
||||
list($field,$tmp2,$other) = explode(" ",$line,3);
|
||||
list($type,$dummy) = explode("(",$tmp2);
|
||||
if($field == 'CREATE' || $field == 'PRIMARY' || $field == 'UNIQUE')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$title = str_replace("_"," ",$field);
|
||||
|
||||
if($convert[$type])
|
||||
{
|
||||
$text .= "\t'".$field."' => array('title'=> '".ucwords($title)."', 'type'=> '".$convert[$type]."' ),\n";
|
||||
}
|
||||
}
|
||||
$text .= "\t'options' => array('title'=> '', 'type' => null)\n);\n";
|
||||
$text .= "</pre>";
|
||||
return $text;
|
||||
}
|
||||
|
||||
|
||||
function customPage()
|
||||
{
|
||||
global $ns,$pref;
|
||||
|
||||
$text = '
|
||||
|
||||
|
||||
<h2><img class="left" src="'.e_PLUGIN.'facebook/images/facebooklogo.gif" alt="" /> Setting Up Your Application and Getting an API Key</h2>
|
||||
<div style="padding:20px">
|
||||
<table style="'.ADMIN_WIDTH.'">
|
||||
<tr>
|
||||
<td>
|
||||
<p>If you don\'t already have a Facebook Platform API key for your site, create an application with the <a href="http://www.facebook.com/developers" class="external text" title="http://www.facebook.com/developers" rel="external nofollow">Facebook Developer application</a>.
|
||||
</p><p><b>Note:</b> Even if you have created an application and received an API key, you should review steps 1.4 through 1.7 and make sure your application settings are appropriate.
|
||||
</p>
|
||||
|
||||
<ol><li>1. Go to <a rel="external nofollow" href="http://www.facebook.com/developers/createapp.php" class="external free" title="http://www.facebook.com/developers/createapp.php">http://www.facebook.com/developers/createapp.php</a> to create a new application.
|
||||
</li><li>2. Enter a name for your application in the <b>Application Name</b> field.
|
||||
</li><li>3. Accept the <a href="http://developers.facebook.com/terms.php" class="external text" title="http://developers.facebook.com/terms.php" rel="nofollow">Developer Terms of Service</a>, then click <b>Save Changes</b>.
|
||||
</li><li>4. On the <b>Basic</b> tab, keep all of the defaults.
|
||||
</li><li>5. Take note of the <b>API Key</b>, you\'ll need this shortly.<br/>
|
||||
</li><li>6. Click the <b>Connect</b> tab. Set <b>Connect URL</b> to the top-level directory of the site where you plan to implement Facebook Connect (this is usually your domain, like <a href="http://www.example.com" class="external free" title="http://www.example.com" rel="nofollow">http://www.example.com</a>, but could also be a subdirectory).
|
||||
</li><li>7. You should include a logo that appears on the Facebook Connect dialog. Next to <b>Facebook Connect Logo</b>, click <b>Change your Facebook Connect logo</b> and browse to an image file. The logo can be up to 99 pixels wide by 22 pixels tall, and must be in JPG, GIF, or PNG format.
|
||||
</li><li>8. If you plan to implement Facebook Connect across a number of subdomains of your site (for example, foo.example.com and bar.example.com), you need to enter a <b><a href="/index.php/Base_Domain" title="Base Domain">Base Domain</a></b> (which would be example.com in this case). Specifying a base domain allows you to make calls using the <a href="/index.php/PHP" title="PHP">PHP</a> and <a href="/index.php/JavaScript_Client_Library" title="JavaScript Client Library">JavaScript</a> client libraries as well as get and store session information for any subdomain of the base domain. For more information about subdomains, see <a href="/index.php/Supporting_Subdomains_In_Facebook_Connect" title="Supporting Subdomains In Facebook Connect">Supporting Subdomains In Facebook Connect</a>.
|
||||
</li><li>9. Click <b>Save Changes</b>.
|
||||
</li></ol>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
';
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class facebook_admin_form_ui extends e_admin_form_ui
|
||||
{
|
||||
|
||||
function init()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
new facebook_admin();
|
||||
|
||||
|
||||
require_once(e_ADMIN."auth.php");
|
||||
|
||||
e107::getAdminUI()->runPage();
|
||||
|
||||
require_once(e_ADMIN."footer.php");
|
||||
exit;
|
||||
|
||||
|
||||
|
||||
|
||||
class facebook_aasdadmin
|
||||
{
|
||||
|
||||
var $message;
|
||||
|
||||
function save_settings()
|
||||
{
|
||||
global $pref;
|
||||
$pref['Facebook_Api-Key'] = $_POST['Facebook_Api-Key'];
|
||||
$pref['Facebook_Secret-Key'] = $_POST['Facebook_Secret-Key'];
|
||||
$pref['Facebook_App-Bundle'] = $_POST['Facebook_App-Bundle'];
|
||||
save_prefs(); // uses toDB() automatically
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function pref_form()
|
||||
{
|
||||
global $ns,$pref;
|
||||
|
||||
$text = ""; // Remove Notice in PHP.
|
||||
|
||||
// if (($pref['Facebook_Api-Key'] == '') || ($pref['Facebook_Secret-Key'] == ''))
|
||||
{
|
||||
$text .= $this->display_help();
|
||||
}
|
||||
|
||||
$text .= '
|
||||
|
||||
<form method="post" action="'.e_SELF.'" class="fborder admin-form">
|
||||
<div><img src="'.e_PLUGIN.'facebook/images/facebooklogo.gif" alt="" /> </div>
|
||||
<div style="clear:both"></div>
|
||||
<table cellpadding="0" cellspacing="0" class="adminform" >
|
||||
<colgroup span="2" >
|
||||
<col class = "col-label" style="width:30%" />
|
||||
<col class = "col-control" style="width:70%" />
|
||||
</colgroup >
|
||||
<tr>
|
||||
<td class="forumheader3">Facebook Application ID</td>
|
||||
<td class="forumheader3">
|
||||
<input class="tbox" type="text" id="Facebook_App-Bundle" name="Facebook_App-Bundle" value="'.$pref['Facebook_App-Bundle'].'" />
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="forumheader3">Facebook API Key</td>
|
||||
<td class="forumheader3">
|
||||
<input class="tbox" type="text" id="Facebook_Api-Key" name="Facebook_Api-Key" value="'.$pref['Facebook_Api-Key'].'" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="forumheader3">Facebook Secret Key</td>
|
||||
<td class="forumheader3">
|
||||
<input class="tbox" type="text" id="Facebook_Secret-Key" name="Facebook_Secret-Key" value="'.$pref['Facebook_Secret-Key'].'" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
|
||||
<tr>
|
||||
<td class="forumheader buttons-bar" style="text-align:center" colspan="2">
|
||||
<input class="button" type="submit" name="save-settings" id="save-settings" value="Save Settings" />
|
||||
</td>
|
||||
</tr>
|
||||
</table></form>';
|
||||
|
||||
$ns->tablerender("Facebook Connect :: General Settings", $this->message.$text);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
File diff suppressed because it is too large
Load Diff
@ -1,41 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* Fan Box - Become a Fan Of...
|
||||
*
|
||||
* http://wiki.developers.facebook.com/index.php/Fan_Box
|
||||
* this must be later inserted in the Control Panel where User can chose below Parameters :
|
||||
* stream = Set to 1 to display stream stories in the Fan Box or 0 to hide stream stories. (Default value is 1.)
|
||||
* connections = The number of fans to display in the Fan Box. Specifying 0 hides the list of fans in the Fan Box. You cannot display more than 100 fans. (Default value is 10 connections.)
|
||||
*
|
||||
* see the render_fun_box() function
|
||||
*
|
||||
*/
|
||||
|
||||
if (!defined('e107_INIT'))
|
||||
{
|
||||
exit;
|
||||
}
|
||||
|
||||
include_once(e_PLUGIN.'facebook/facebook_function.php');
|
||||
|
||||
global $fb;
|
||||
|
||||
if (isset($_POST['fb_sig_in_canvas']))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->fb_uid)
|
||||
{
|
||||
|
||||
$html = '';
|
||||
|
||||
$html .= Render_Fun_Box('0', '10', '200px');
|
||||
|
||||
$caption = 'Fan Box';
|
||||
|
||||
$ns->tablerender($caption, $html);
|
||||
|
||||
}
|
||||
|
||||
?>
|
@ -1,73 +0,0 @@
|
||||
<?php
|
||||
//error_reporting(E_ALL);
|
||||
|
||||
if (!defined('e107_INIT'))
|
||||
{
|
||||
exit;
|
||||
}
|
||||
|
||||
include_once (e_PLUGIN.'facebook/facebook_function.php');
|
||||
|
||||
if (isset($_POST['fb_sig_in_canvas']))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* start the logic...
|
||||
*
|
||||
*/
|
||||
|
||||
global $pref;
|
||||
|
||||
if (!vartrue($pref['user_reg']))
|
||||
{
|
||||
if (ADMIN)
|
||||
{
|
||||
$ns->tablerender("Facebook", "User Registration is turned off.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$html = '';
|
||||
|
||||
$fb_pref = e107::getPlugConfig('facebook')->getPref();
|
||||
|
||||
if (($fb_pref['Facebook_Api-Key'] != '') && ($fb_pref['Facebook_Secret-Key'] != ''))
|
||||
{
|
||||
$fb = e107::getSingleton('e_facebook',e_PLUGIN.'facebook/facebook_function.php');
|
||||
|
||||
$html = '';
|
||||
|
||||
if (USER)
|
||||
{
|
||||
|
||||
if (USERID == $fb->e107_userid)
|
||||
{
|
||||
|
||||
if ($fb->isConnected() === true)
|
||||
{
|
||||
|
||||
///$html .= Render_Facebook_Profile();
|
||||
|
||||
//$caption = 'Welcome, ' . Get_Facebook_Info ( 'name' );
|
||||
|
||||
$html .= $fb->Render_Facebook_Friends_Table();
|
||||
|
||||
$html .= $fb->Render_Connect_Invite_Friends();
|
||||
|
||||
$caption = 'Friends on this site';
|
||||
// $text = $tp->parseTemplate($html, true, $facebook_shortcodes);
|
||||
|
||||
$ns->tablerender($caption, $html);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
?>
|
@ -1,24 +0,0 @@
|
||||
<?php
|
||||
//error_reporting(E_ALL);
|
||||
|
||||
if (!defined('e107_INIT'))
|
||||
{
|
||||
exit;
|
||||
}
|
||||
|
||||
include_once (e_PLUGIN.'facebook/facebook_function.php');
|
||||
|
||||
if (isset($_POST['fb_sig_in_canvas']))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$fb = e107::getSingleton('e_facebook',e_PLUGIN.'facebook/facebook_function.php');
|
||||
$html = $fb->fb_connect();
|
||||
|
||||
$caption = 'Facebook';
|
||||
// $text = $tp->parseTemplate($html, true, $facebook_shortcodes);
|
||||
|
||||
$ns->tablerender($caption, $html);
|
||||
|
||||
?>
|
@ -1,11 +0,0 @@
|
||||
<?php
|
||||
|
||||
if ( !defined ( 'e107_INIT' ) ) {
|
||||
exit ;
|
||||
}
|
||||
|
||||
Header ('Location: ' . e_BASE );
|
||||
|
||||
|
||||
|
||||
?>
|
@ -1,28 +0,0 @@
|
||||
/**
|
||||
* http://wiki.developers.facebook.com/index.php/Fb:share-button
|
||||
*
|
||||
* $box_type = box_count, button_count, button, icon, or icon_link
|
||||
*
|
||||
*
|
||||
*
|
||||
*<fb:share-button class="meta" type="icon_link">
|
||||
<meta name="medium" content="blog"/>
|
||||
<meta name="title" content="Leonidas in All of Us"/>
|
||||
<meta name="video_type" content="application/x-shockwave-flash"/>
|
||||
<meta name="video_height" content="345"/>
|
||||
<meta name="video_width" content="473"/>
|
||||
<meta name="description" content="That's the lesson 300 teaches us."/>
|
||||
<link rel="image_src" href="http://9.content.collegehumor.com/d1/ch6/f/6/collegehumor.b38e345f621621dfa9de5456094735a0.jpg"/>
|
||||
<link rel="video_src" href="http://www.collegehumor.com/moogaloop/moogaloop.swf?clip_id=1757757&autoplay=true"/>
|
||||
<link rel="target_url" href="http://www.collegehumor.com/video:1757757"/>
|
||||
</fb:share-button>
|
||||
*/
|
||||
|
||||
$news_item = getcachedvars('current_news_item'); //get news id
|
||||
|
||||
$box_type = "box_count";
|
||||
|
||||
$share = "<fb:share-button href='".e_SELF."?item.".$news_item['news_id']."' type='{$box_type}'></fb:share-button>";
|
||||
|
||||
return $share;
|
||||
|
@ -1,26 +0,0 @@
|
||||
<?php
|
||||
// cache the xd_receiver
|
||||
header('Cache-Control: max-age=225065900');
|
||||
header('Expires:');
|
||||
header('Pragma:');
|
||||
|
||||
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" >
|
||||
<head>
|
||||
<title>cross domain receiver page</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!--
|
||||
This is a cross domain (XD) receiver page. It needs to be placed on your domain so that the Javascript
|
||||
library can communicate within the iframe permission model. Put it here:
|
||||
|
||||
http://www.example.com/xd_receiver.php
|
||||
-->
|
||||
|
||||
<?php
|
||||
echo '<script src="http://static.ak.facebook.com/js/api_lib/v0.4/XdCommReceiver.debug.js" type="text/javascript"></script>';
|
||||
?>
|
||||
</body>
|
||||
</html>
|
Loading…
x
Reference in New Issue
Block a user