WordPress.org

Plugin Directory

Changeset 1479964


Ignore:
Timestamp:
08/21/16 12:44:17 (7 months ago)
Author:
polevaultweb
Message:

Tagging 1.0.7

Location:
wp-trello/trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • wp-trello/trunk

    • Property svn:ignore set to
      .git
      .gitattributes
      .gitignore
  • wp-trello/trunk/includes/oauth.php

    r719492 r1479964  
    11<?php 
    2 if( !class_exists('OAuthException') ){ 
    3     class OAuthException extends Exception { 
    4       // pass 
    5     } 
    6 } 
    7  
    8 if( !class_exists('OAuthConsumer') ){ 
    9     class OAuthConsumer { 
    10       public $key; 
    11       public $secret; 
    12      
    13       function __construct($key, $secret, $callback_url=NULL) { 
    14         $this->key = $key; 
    15         $this->secret = $secret; 
    16         $this->callback_url = $callback_url; 
    17       } 
    18      
    19       function __toString() { 
    20         return "OAuthConsumer[key=$this->key,secret=$this->secret]"; 
    21       } 
    22     } 
    23 } 
    24  
    25 if( !class_exists('OAuthToken') ){ 
    26     class OAuthToken { 
    27       // access tokens and request tokens 
    28       public $key; 
    29       public $secret; 
    30      
    31       /** 
    32        * key = the token 
    33        * secret = the token secret 
    34        */ 
    35       function __construct($key, $secret) { 
    36         $this->key = $key; 
    37         $this->secret = $secret; 
    38       } 
    39      
    40       /** 
    41        * generates the basic string serialization of a token that a server 
    42        * would respond to request_token and access_token calls with 
    43        */ 
    44       function to_string() { 
    45         return "oauth_token=" . 
    46                OAuthUtil::urlencode_rfc3986($this->key) . 
    47                "&oauth_token_secret=" . 
    48                OAuthUtil::urlencode_rfc3986($this->secret); 
    49       } 
    50      
    51       function __toString() { 
    52         return $this->to_string(); 
    53       } 
    54     } 
     2if ( ! class_exists( 'OAuthException' ) ) { 
     3    class OAuthException extends Exception { 
     4 
     5        // pass 
     6    } 
     7} 
     8 
     9if ( ! class_exists( 'OAuthConsumer' ) ) { 
     10    class OAuthConsumer { 
     11 
     12        public $key; 
     13        public $secret; 
     14 
     15        function __construct( $key, $secret, $callback_url = null ) { 
     16            $this->key          = $key; 
     17            $this->secret       = $secret; 
     18            $this->callback_url = $callback_url; 
     19        } 
     20 
     21        function __toString() { 
     22            return "OAuthConsumer[key=$this->key,secret=$this->secret]"; 
     23        } 
     24    } 
     25} 
     26 
     27if ( ! class_exists( 'OAuthToken' ) ) { 
     28    class OAuthToken { 
     29 
     30        // access tokens and request tokens 
     31        public $key; 
     32        public $secret; 
     33 
     34        /** 
     35         * key = the token 
     36         * secret = the token secret 
     37         */ 
     38        function __construct( $key, $secret ) { 
     39            $this->key    = $key; 
     40            $this->secret = $secret; 
     41        } 
     42 
     43        /** 
     44         * generates the basic string serialization of a token that a server 
     45         * would respond to request_token and access_token calls with 
     46         */ 
     47        function to_string() { 
     48            return "oauth_token=" . OAuthUtil::urlencode_rfc3986( $this->key ) . "&oauth_token_secret=" . OAuthUtil::urlencode_rfc3986( $this->secret ); 
     49        } 
     50 
     51        function __toString() { 
     52            return $this->to_string(); 
     53        } 
     54    } 
    5555} 
    5656 
     
    5959 * See section 9 ("Signing Requests") in the spec 
    6060 */ 
    61 if( !class_exists('OAuthSignatureMethod') ){ 
     61if ( ! class_exists( 'OAuthSignatureMethod' ) ) { 
    6262    abstract class OAuthSignatureMethod { 
    63       /** 
    64        * Needs to return the name of the Signature Method (ie HMAC-SHA1) 
    65        * @return string 
    66        */ 
    67       abstract public function get_name(); 
    68      
    69       /** 
    70        * Build up the signature 
    71        * NOTE: The output of this function MUST NOT be urlencoded. 
    72        * the encoding is handled in OAuthRequest when the final 
    73        * request is serialized 
    74        * @param OAuthRequest $request 
    75        * @param OAuthConsumer $consumer 
    76        * @param OAuthToken $token 
    77        * @return string 
    78        */ 
    79       abstract public function build_signature($request, $consumer, $token); 
    80      
    81       /** 
    82        * Verifies that a given signature is correct 
    83        * @param OAuthRequest $request 
    84        * @param OAuthConsumer $consumer 
    85        * @param OAuthToken $token 
    86        * @param string $signature 
    87        * @return bool 
    88        */ 
    89       public function check_signature($request, $consumer, $token, $signature) { 
    90         $built = $this->build_signature($request, $consumer, $token); 
    91         return $built == $signature; 
    92       } 
     63 
     64        /** 
     65         * Needs to return the name of the Signature Method (ie HMAC-SHA1) 
     66         * 
     67         * @return string 
     68         */ 
     69        abstract public function get_name(); 
     70 
     71        /** 
     72         * Build up the signature 
     73         * NOTE: The output of this function MUST NOT be urlencoded. 
     74         * the encoding is handled in OAuthRequest when the final 
     75         * request is serialized 
     76         * 
     77         * @param OAuthRequest  $request 
     78         * @param OAuthConsumer $consumer 
     79         * @param OAuthToken    $token 
     80         * 
     81         * @return string 
     82         */ 
     83        abstract public function build_signature( $request, $consumer, $token ); 
     84 
     85        /** 
     86         * Verifies that a given signature is correct 
     87         * 
     88         * @param OAuthRequest  $request 
     89         * @param OAuthConsumer $consumer 
     90         * @param OAuthToken    $token 
     91         * @param string        $signature 
     92         * 
     93         * @return bool 
     94         */ 
     95        public function check_signature( $request, $consumer, $token, $signature ) { 
     96            $built = $this->build_signature( $request, $consumer, $token ); 
     97 
     98            return $built == $signature; 
     99        } 
    93100    } 
    94101} 
    95102 
    96103/** 
    97  * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104]  
    98  * where the Signature Base String is the text and the key is the concatenated values (each first  
    99  * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&'  
     104 * The HMAC-SHA1 signature method uses the HMAC-SHA1 signature algorithm as defined in [RFC2104] 
     105 * where the Signature Base String is the text and the key is the concatenated values (each first 
     106 * encoded per Parameter Encoding) of the Consumer Secret and Token Secret, separated by an '&' 
    100107 * character (ASCII code 38) even if empty. 
    101108 *   - Chapter 9.2 ("HMAC-SHA1") 
    102109 */ 
    103 if( !class_exists('OAuthSignatureMethod_HMAC_SHA1') ){ 
     110if ( ! class_exists( 'OAuthSignatureMethod_HMAC_SHA1' ) ) { 
    104111    class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod { 
    105       function get_name() { 
    106         return "HMAC-SHA1"; 
    107       } 
    108      
    109       public function build_signature($request, $consumer, $token) { 
    110         $base_string = $request->get_signature_base_string(); 
    111         $request->base_string = $base_string; 
    112      
    113         $key_parts = array( 
    114           $consumer->secret, 
    115           ($token) ? $token->secret : "" 
    116         ); 
    117      
    118         $key_parts = OAuthUtil::urlencode_rfc3986($key_parts); 
    119         $key = implode('&', $key_parts); 
    120      
    121         return base64_encode(hash_hmac('sha1', $base_string, $key, true)); 
    122       } 
     112 
     113        function get_name() { 
     114            return "HMAC-SHA1"; 
     115        } 
     116 
     117        public function build_signature( $request, $consumer, $token ) { 
     118            $base_string          = $request->get_signature_base_string(); 
     119            $request->base_string = $base_string; 
     120 
     121            $key_parts = array( 
     122                $consumer->secret, 
     123                ( $token ) ? $token->secret : "", 
     124            ); 
     125 
     126            $key_parts = OAuthUtil::urlencode_rfc3986( $key_parts ); 
     127            $key       = implode( '&', $key_parts ); 
     128 
     129            return base64_encode( hash_hmac( 'sha1', $base_string, $key, true ) ); 
     130        } 
    123131    } 
    124132} 
    125133 
    126134/** 
    127  * The PLAINTEXT method does not provide any security protection and SHOULD only be used  
     135 * The PLAINTEXT method does not provide any security protection and SHOULD only be used 
    128136 * over a secure channel such as HTTPS. It does not use the Signature Base String. 
    129137 *   - Chapter 9.4 ("PLAINTEXT") 
    130138 */ 
    131 if( !class_exists('OAuthSignatureMethod_PLAINTEXT') ){ 
     139if ( ! class_exists( 'OAuthSignatureMethod_PLAINTEXT' ) ) { 
    132140    class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod { 
    133       public function get_name() { 
    134         return "PLAINTEXT"; 
    135       } 
    136      
    137       /** 
    138        * oauth_signature is set to the concatenated encoded values of the Consumer Secret and  
    139        * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is  
    140        * empty. The result MUST be encoded again. 
    141        *   - Chapter 9.4.1 ("Generating Signatures") 
    142        * 
    143        * Please note that the second encoding MUST NOT happen in the SignatureMethod, as 
    144        * OAuthRequest handles this! 
    145        */ 
    146       public function build_signature($request, $consumer, $token) { 
    147         $key_parts = array( 
    148           $consumer->secret, 
    149           ($token) ? $token->secret : "" 
    150         ); 
    151      
    152         $key_parts = OAuthUtil::urlencode_rfc3986($key_parts); 
    153         $key = implode('&', $key_parts); 
    154         $request->base_string = $key; 
    155      
    156         return $key; 
    157       } 
     141 
     142        public function get_name() { 
     143            return "PLAINTEXT"; 
     144        } 
     145 
     146        /** 
     147         * oauth_signature is set to the concatenated encoded values of the Consumer Secret and 
     148         * Token Secret, separated by a '&' character (ASCII code 38), even if either secret is 
     149         * empty. The result MUST be encoded again. 
     150         *   - Chapter 9.4.1 ("Generating Signatures") 
     151         * 
     152         * Please note that the second encoding MUST NOT happen in the SignatureMethod, as 
     153         * OAuthRequest handles this! 
     154         */ 
     155        public function build_signature( $request, $consumer, $token ) { 
     156            $key_parts = array( 
     157                $consumer->secret, 
     158                ( $token ) ? $token->secret : "", 
     159            ); 
     160 
     161            $key_parts            = OAuthUtil::urlencode_rfc3986( $key_parts ); 
     162            $key                  = implode( '&', $key_parts ); 
     163            $request->base_string = $key; 
     164 
     165            return $key; 
     166        } 
    158167    } 
    159168} 
    160169 
    161170/** 
    162  * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in  
    163  * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for  
    164  * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a  
    165  * verified way to the Service Provider, in a manner which is beyond the scope of this  
     171 * The RSA-SHA1 signature method uses the RSASSA-PKCS1-v1_5 signature algorithm as defined in 
     172 * [RFC3447] section 8.2 (more simply known as PKCS#1), using SHA-1 as the hash function for 
     173 * EMSA-PKCS1-v1_5. It is assumed that the Consumer has provided its RSA public key in a 
     174 * verified way to the Service Provider, in a manner which is beyond the scope of this 
    166175 * specification. 
    167176 *   - Chapter 9.3 ("RSA-SHA1") 
    168177 */ 
    169 if( !class_exists('OAuthSignatureMethod_RSA_SHA1') ){ 
     178if ( ! class_exists( 'OAuthSignatureMethod_RSA_SHA1' ) ) { 
    170179    abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod { 
    171       public function get_name() { 
    172         return "RSA-SHA1"; 
    173       } 
    174      
    175       // Up to the SP to implement this lookup of keys. Possible ideas are: 
    176       // (1) do a lookup in a table of trusted certs keyed off of consumer 
    177       // (2) fetch via http using a url provided by the requester 
    178       // (3) some sort of specific discovery code based on request 
    179       // 
    180       // Either way should return a string representation of the certificate 
    181       protected abstract function fetch_public_cert(&$request); 
    182      
    183       // Up to the SP to implement this lookup of keys. Possible ideas are: 
    184       // (1) do a lookup in a table of trusted certs keyed off of consumer 
    185       // 
    186       // Either way should return a string representation of the certificate 
    187       protected abstract function fetch_private_cert(&$request); 
    188      
    189       public function build_signature($request, $consumer, $token) { 
    190         $base_string = $request->get_signature_base_string(); 
    191         $request->base_string = $base_string; 
    192      
    193         // Fetch the private key cert based on the request 
    194         $cert = $this->fetch_private_cert($request); 
    195      
    196         // Pull the private key ID from the certificate 
    197         $privatekeyid = openssl_get_privatekey($cert); 
    198      
    199         // Sign using the key 
    200         $ok = openssl_sign($base_string, $signature, $privatekeyid); 
    201      
    202         // Release the key resource 
    203         openssl_free_key($privatekeyid); 
    204      
    205         return base64_encode($signature); 
    206       } 
    207      
    208       public function check_signature($request, $consumer, $token, $signature) { 
    209         $decoded_sig = base64_decode($signature); 
    210      
    211         $base_string = $request->get_signature_base_string(); 
    212      
    213         // Fetch the public key cert based on the request 
    214         $cert = $this->fetch_public_cert($request); 
    215      
    216         // Pull the public key ID from the certificate 
    217         $publickeyid = openssl_get_publickey($cert); 
    218      
    219         // Check the computed signature against the one passed in the query 
    220         $ok = openssl_verify($base_string, $decoded_sig, $publickeyid); 
    221      
    222         // Release the key resource 
    223         openssl_free_key($publickeyid); 
    224      
    225         return $ok == 1; 
    226       } 
    227     } 
    228 } 
    229  
    230 if( !class_exists('OAuthRequest') ){ 
     180 
     181        public function get_name() { 
     182            return "RSA-SHA1"; 
     183        } 
     184 
     185        // Up to the SP to implement this lookup of keys. Possible ideas are: 
     186        // (1) do a lookup in a table of trusted certs keyed off of consumer 
     187        // (2) fetch via http using a url provided by the requester 
     188        // (3) some sort of specific discovery code based on request 
     189        // 
     190        // Either way should return a string representation of the certificate 
     191        protected abstract function fetch_public_cert( &$request ); 
     192 
     193        // Up to the SP to implement this lookup of keys. Possible ideas are: 
     194        // (1) do a lookup in a table of trusted certs keyed off of consumer 
     195        // 
     196        // Either way should return a string representation of the certificate 
     197        protected abstract function fetch_private_cert( &$request ); 
     198 
     199        public function build_signature( $request, $consumer, $token ) { 
     200            $base_string          = $request->get_signature_base_string(); 
     201            $request->base_string = $base_string; 
     202 
     203            // Fetch the private key cert based on the request 
     204            $cert = $this->fetch_private_cert( $request ); 
     205 
     206            // Pull the private key ID from the certificate 
     207            $privatekeyid = openssl_get_privatekey( $cert ); 
     208 
     209            // Sign using the key 
     210            $ok = openssl_sign( $base_string, $signature, $privatekeyid ); 
     211 
     212            // Release the key resource 
     213            openssl_free_key( $privatekeyid ); 
     214 
     215            return base64_encode( $signature ); 
     216        } 
     217 
     218        public function check_signature( $request, $consumer, $token, $signature ) { 
     219            $decoded_sig = base64_decode( $signature ); 
     220 
     221            $base_string = $request->get_signature_base_string(); 
     222 
     223            // Fetch the public key cert based on the request 
     224            $cert = $this->fetch_public_cert( $request ); 
     225 
     226            // Pull the public key ID from the certificate 
     227            $publickeyid = openssl_get_publickey( $cert ); 
     228 
     229            // Check the computed signature against the one passed in the query 
     230            $ok = openssl_verify( $base_string, $decoded_sig, $publickeyid ); 
     231 
     232            // Release the key resource 
     233            openssl_free_key( $publickeyid ); 
     234 
     235            return $ok == 1; 
     236        } 
     237    } 
     238} 
     239 
     240if ( ! class_exists( 'OAuthRequest' ) ) { 
    231241    class OAuthRequest { 
    232       private $parameters; 
    233       private $http_method; 
    234       private $http_url; 
    235       // for debug purposes 
    236       public $base_string; 
    237       public static $version = '1.0'; 
    238       public static $POST_INPUT = 'php://input'; 
    239      
    240       function __construct($http_method, $http_url, $parameters=NULL) { 
    241         @$parameters or $parameters = array(); 
    242         $parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters); 
    243         $this->parameters = $parameters; 
    244         $this->http_method = $http_method; 
    245         $this->http_url = $http_url; 
    246       } 
    247      
    248      
    249       /** 
    250        * attempt to build up a request from what was passed to the server 
    251        */ 
    252       public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) { 
    253         $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") 
    254                   ? 'http' 
    255                   : 'https'; 
    256         @$http_url or $http_url = $scheme . 
    257                                   '://' . $_SERVER['HTTP_HOST'] . 
    258                                   ':' . 
    259                                   $_SERVER['SERVER_PORT'] . 
    260                                   $_SERVER['REQUEST_URI']; 
    261         @$http_method or $http_method = $_SERVER['REQUEST_METHOD']; 
    262      
    263         // We weren't handed any parameters, so let's find the ones relevant to 
    264         // this request. 
    265         // If you run XML-RPC or similar you should use this to provide your own 
    266         // parsed parameter-list 
    267         if (!$parameters) { 
    268           // Find request headers 
    269           $request_headers = OAuthUtil::get_headers(); 
    270      
    271           // Parse the query-string to find GET parameters 
    272           $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']); 
    273      
    274           // It's a POST request of the proper content-type, so parse POST 
    275           // parameters and add those overriding any duplicates from GET 
    276           if ($http_method == "POST" 
    277               && @strstr($request_headers["Content-Type"], 
    278                          "application/x-www-form-urlencoded") 
    279               ) { 
    280             $post_data = OAuthUtil::parse_parameters( 
    281               file_get_contents(self::$POST_INPUT) 
    282             ); 
    283             $parameters = array_merge($parameters, $post_data); 
    284           } 
    285      
    286           // We have a Authorization-header with OAuth data. Parse the header 
    287           // and add those overriding any duplicates from GET or POST 
    288           if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") { 
    289             $header_parameters = OAuthUtil::split_header( 
    290               $request_headers['Authorization'] 
    291             ); 
    292             $parameters = array_merge($parameters, $header_parameters); 
    293           } 
    294      
    295         } 
    296      
    297         return new OAuthRequest($http_method, $http_url, $parameters); 
    298       } 
    299      
    300       /** 
    301        * pretty much a helper function to set up the request 
    302        */ 
    303       public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) { 
    304         @$parameters or $parameters = array(); 
    305         $defaults = array("oauth_version" => OAuthRequest::$version, 
    306                           "oauth_nonce" => OAuthRequest::generate_nonce(), 
    307                           "oauth_timestamp" => OAuthRequest::generate_timestamp(), 
    308                           "oauth_consumer_key" => $consumer->key); 
    309         if ($token) 
    310           $defaults['oauth_token'] = $token->key; 
    311      
    312         $parameters = array_merge($defaults, $parameters); 
    313      
    314         return new OAuthRequest($http_method, $http_url, $parameters); 
    315       } 
    316      
    317       public function set_parameter($name, $value, $allow_duplicates = true) { 
    318         if ($allow_duplicates && isset($this->parameters[$name])) { 
    319           // We have already added parameter(s) with this name, so add to the list 
    320           if (is_scalar($this->parameters[$name])) { 
    321             // This is the first duplicate, so transform scalar (string) 
    322             // into an array so we can add the duplicates 
    323             $this->parameters[$name] = array($this->parameters[$name]); 
    324           } 
    325      
    326           $this->parameters[$name][] = $value; 
    327         } else { 
    328           $this->parameters[$name] = $value; 
    329         } 
    330       } 
    331      
    332       public function get_parameter($name) { 
    333         return isset($this->parameters[$name]) ? $this->parameters[$name] : null; 
    334       } 
    335      
    336       public function get_parameters() { 
    337         return $this->parameters; 
    338       } 
    339      
    340       public function unset_parameter($name) { 
    341         unset($this->parameters[$name]); 
    342       } 
    343      
    344       /** 
    345        * The request parameters, sorted and concatenated into a normalized string. 
    346        * @return string 
    347        */ 
    348       public function get_signable_parameters() { 
    349         // Grab all parameters 
    350         $params = $this->parameters; 
    351      
    352         // Remove oauth_signature if present 
    353         // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") 
    354         if (isset($params['oauth_signature'])) { 
    355           unset($params['oauth_signature']); 
    356         } 
    357      
    358         return OAuthUtil::build_http_query($params); 
    359       } 
    360      
    361       /** 
    362        * Returns the base string of this request 
    363        * 
    364        * The base string defined as the method, the url 
    365        * and the parameters (normalized), each urlencoded 
    366        * and the concated with &. 
    367        */ 
    368       public function get_signature_base_string() { 
    369         $parts = array( 
    370           $this->get_normalized_http_method(), 
    371           $this->get_normalized_http_url(), 
    372           $this->get_signable_parameters() 
    373         ); 
    374      
    375         $parts = OAuthUtil::urlencode_rfc3986($parts); 
    376      
    377         return implode('&', $parts); 
    378       } 
    379      
    380       /** 
    381        * just uppercases the http method 
    382        */ 
    383       public function get_normalized_http_method() { 
    384         return strtoupper($this->http_method); 
    385       } 
    386      
    387       /** 
    388        * parses the url and rebuilds it to be 
    389        * scheme://host/path 
    390        */ 
    391       public function get_normalized_http_url() { 
    392         $parts = parse_url($this->http_url); 
    393          
    394         $port = isset($parts['port']) ? $parts['port'] : ''; 
    395         $scheme = $parts['scheme']; 
    396         $host = $parts['host']; 
    397         $path = @$parts['path']; 
    398      
    399         $port or $port = ($scheme == 'https') ? '443' : '80'; 
    400      
    401         if (($scheme == 'https' && $port != '443') 
    402             || ($scheme == 'http' && $port != '80')) { 
    403           $host = "$host:$port"; 
    404         } 
    405         return "$scheme://$host$path"; 
    406       } 
    407      
    408       /** 
    409        * builds a url usable for a GET request 
    410        */ 
    411       public function to_url() { 
    412         $post_data = $this->to_postdata(); 
    413         $out = $this->get_normalized_http_url(); 
    414         if ($post_data) { 
    415           $out .= '?'.$post_data; 
    416         } 
    417         return $out; 
    418       } 
    419      
    420       /** 
    421        * builds the data one would send in a POST request 
    422        */ 
    423       public function to_postdata() { 
    424         return OAuthUtil::build_http_query($this->parameters); 
    425       } 
    426      
    427       /** 
    428        * builds the Authorization: header 
    429        */ 
    430       public function to_header($realm=null) { 
    431         $first = true; 
    432         if($realm) { 
    433           $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"'; 
    434           $first = false; 
    435         } else 
    436           $out = 'Authorization: OAuth'; 
    437      
    438         $total = array(); 
    439         foreach ($this->parameters as $k => $v) { 
    440           if (substr($k, 0, 5) != "oauth") continue; 
    441           if (is_array($v)) { 
    442             throw new OAuthException('Arrays not supported in headers'); 
    443           } 
    444           $out .= ($first) ? ' ' : ','; 
    445           $out .= OAuthUtil::urlencode_rfc3986($k) . 
    446                   '="' . 
    447                   OAuthUtil::urlencode_rfc3986($v) . 
    448                   '"'; 
    449           $first = false; 
    450         } 
    451         return $out; 
    452       } 
    453      
    454       public function __toString() { 
    455         return $this->to_url(); 
    456       } 
    457      
    458      
    459       public function sign_request($signature_method, $consumer, $token) { 
    460         $this->set_parameter( 
    461           "oauth_signature_method", 
    462           $signature_method->get_name(), 
    463           false 
    464         ); 
    465         $signature = $this->build_signature($signature_method, $consumer, $token); 
    466         $this->set_parameter("oauth_signature", $signature, false); 
    467       } 
    468      
    469       public function build_signature($signature_method, $consumer, $token) { 
    470         $signature = $signature_method->build_signature($this, $consumer, $token); 
    471         return $signature; 
    472       } 
    473      
    474       /** 
    475        * util function: current timestamp 
    476        */ 
    477       private static function generate_timestamp() { 
    478         return time(); 
    479       } 
    480      
    481       /** 
    482        * util function: current nonce 
    483        */ 
    484       private static function generate_nonce() { 
    485         $mt = microtime(); 
    486         $rand = mt_rand(); 
    487      
    488         return md5($mt . $rand); // md5s look nicer than numbers 
    489       } 
    490     } 
    491 } 
    492  
    493 if( !class_exists('OAuthServer') ){ 
     242 
     243        private $parameters; 
     244        private $http_method; 
     245        private $http_url; 
     246        // for debug purposes 
     247        public $base_string; 
     248        public static $version = '1.0'; 
     249        public static $POST_INPUT = 'php://input'; 
     250 
     251        function __construct( $http_method, $http_url, $parameters = null ) { 
     252            @$parameters or $parameters = array(); 
     253            $parameters        = array_merge( OAuthUtil::parse_parameters( parse_url( $http_url, PHP_URL_QUERY ) ), $parameters ); 
     254            $this->parameters  = $parameters; 
     255            $this->http_method = $http_method; 
     256            $this->http_url    = $http_url; 
     257        } 
     258 
     259 
     260        /** 
     261         * attempt to build up a request from what was passed to the server 
     262         */ 
     263        public static function from_request( $http_method = null, $http_url = null, $parameters = null ) { 
     264            $scheme = ( ! isset( $_SERVER['HTTPS'] ) || $_SERVER['HTTPS'] != "on" ) ? 'http' : 'https'; 
     265            @$http_url or $http_url = $scheme . '://' . $_SERVER['HTTP_HOST'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI']; 
     266            @$http_method or $http_method = $_SERVER['REQUEST_METHOD']; 
     267 
     268            // We weren't handed any parameters, so let's find the ones relevant to 
     269            // this request. 
     270            // If you run XML-RPC or similar you should use this to provide your own 
     271            // parsed parameter-list 
     272            if ( ! $parameters ) { 
     273                // Find request headers 
     274                $request_headers = OAuthUtil::get_headers(); 
     275 
     276                // Parse the query-string to find GET parameters 
     277                $parameters = OAuthUtil::parse_parameters( $_SERVER['QUERY_STRING'] ); 
     278 
     279                // It's a POST request of the proper content-type, so parse POST 
     280                // parameters and add those overriding any duplicates from GET 
     281                if ( $http_method == "POST" && @strstr( $request_headers["Content-Type"], "application/x-www-form-urlencoded" ) ) { 
     282                    $post_data  = OAuthUtil::parse_parameters( file_get_contents( self::$POST_INPUT ) ); 
     283                    $parameters = array_merge( $parameters, $post_data ); 
     284                } 
     285 
     286                // We have a Authorization-header with OAuth data. Parse the header 
     287                // and add those overriding any duplicates from GET or POST 
     288                if ( @substr( $request_headers['Authorization'], 0, 6 ) == "OAuth " ) { 
     289                    $header_parameters = OAuthUtil::split_header( $request_headers['Authorization'] ); 
     290                    $parameters        = array_merge( $parameters, $header_parameters ); 
     291                } 
     292 
     293            } 
     294 
     295            return new OAuthRequest( $http_method, $http_url, $parameters ); 
     296        } 
     297 
     298        /** 
     299         * pretty much a helper function to set up the request 
     300         */ 
     301        public static function from_consumer_and_token( $consumer, $token, $http_method, $http_url, $parameters = null ) { 
     302            @$parameters or $parameters = array(); 
     303            $defaults = array( 
     304                "oauth_version"      => OAuthRequest::$version, 
     305                "oauth_nonce"        => OAuthRequest::generate_nonce(), 
     306                "oauth_timestamp"    => OAuthRequest::generate_timestamp(), 
     307                "oauth_consumer_key" => $consumer->key, 
     308            ); 
     309            if ( $token ) { 
     310                $defaults['oauth_token'] = $token->key; 
     311            } 
     312 
     313            $parameters = array_merge( $defaults, $parameters ); 
     314 
     315            return new OAuthRequest( $http_method, $http_url, $parameters ); 
     316        } 
     317 
     318        public function set_parameter( $name, $value, $allow_duplicates = true ) { 
     319            if ( $allow_duplicates && isset( $this->parameters[ $name ] ) ) { 
     320                // We have already added parameter(s) with this name, so add to the list 
     321                if ( is_scalar( $this->parameters[ $name ] ) ) { 
     322                    // This is the first duplicate, so transform scalar (string) 
     323                    // into an array so we can add the duplicates 
     324                    $this->parameters[ $name ] = array( $this->parameters[ $name ] ); 
     325                } 
     326 
     327                $this->parameters[ $name ][] = $value; 
     328            } else { 
     329                $this->parameters[ $name ] = $value; 
     330            } 
     331        } 
     332 
     333        public function get_parameter( $name ) { 
     334            return isset( $this->parameters[ $name ] ) ? $this->parameters[ $name ] : null; 
     335        } 
     336 
     337        public function get_parameters() { 
     338            return $this->parameters; 
     339        } 
     340 
     341        public function unset_parameter( $name ) { 
     342            unset( $this->parameters[ $name ] ); 
     343        } 
     344 
     345        /** 
     346         * The request parameters, sorted and concatenated into a normalized string. 
     347         * 
     348         * @return string 
     349         */ 
     350        public function get_signable_parameters() { 
     351            // Grab all parameters 
     352            $params = $this->parameters; 
     353 
     354            // Remove oauth_signature if present 
     355            // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") 
     356            if ( isset( $params['oauth_signature'] ) ) { 
     357                unset( $params['oauth_signature'] ); 
     358            } 
     359 
     360            return OAuthUtil::build_http_query( $params ); 
     361        } 
     362 
     363        /** 
     364         * Returns the base string of this request 
     365         * 
     366         * The base string defined as the method, the url 
     367         * and the parameters (normalized), each urlencoded 
     368         * and the concated with &. 
     369         */ 
     370        public function get_signature_base_string() { 
     371            $parts = array( 
     372                $this->get_normalized_http_method(), 
     373                $this->get_normalized_http_url(), 
     374                $this->get_signable_parameters(), 
     375            ); 
     376 
     377            $parts = OAuthUtil::urlencode_rfc3986( $parts ); 
     378 
     379            return implode( '&', $parts ); 
     380        } 
     381 
     382        /** 
     383         * just uppercases the http method 
     384         */ 
     385        public function get_normalized_http_method() { 
     386            return strtoupper( $this->http_method ); 
     387        } 
     388 
     389        /** 
     390         * parses the url and rebuilds it to be 
     391         * scheme://host/path 
     392         */ 
     393        public function get_normalized_http_url() { 
     394            $parts = parse_url( $this->http_url ); 
     395 
     396            $port   = isset( $parts['port'] ) ? $parts['port'] : ''; 
     397            $scheme = $parts['scheme']; 
     398            $host   = $parts['host']; 
     399            $path   = @$parts['path']; 
     400 
     401            $port or $port = ( $scheme == 'https' ) ? '443' : '80'; 
     402 
     403            if ( ( $scheme == 'https' && $port != '443' ) || ( $scheme == 'http' && $port != '80' ) ) { 
     404                $host = "$host:$port"; 
     405            } 
     406 
     407            return "$scheme://$host$path"; 
     408        } 
     409 
     410        /** 
     411         * builds a url usable for a GET request 
     412         */ 
     413        public function to_url() { 
     414            $post_data = $this->to_postdata(); 
     415            $out       = $this->get_normalized_http_url(); 
     416            if ( $post_data ) { 
     417                $out .= '?' . $post_data; 
     418            } 
     419 
     420            return $out; 
     421        } 
     422 
     423        /** 
     424         * builds the data one would send in a POST request 
     425         */ 
     426        public function to_postdata() { 
     427            return OAuthUtil::build_http_query( $this->parameters ); 
     428        } 
     429 
     430        /** 
     431         * builds the Authorization: header 
     432         */ 
     433        public function to_header( $realm = null ) { 
     434            $first = true; 
     435            if ( $realm ) { 
     436                $out   = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986( $realm ) . '"'; 
     437                $first = false; 
     438            } else { 
     439                $out = 'Authorization: OAuth'; 
     440            } 
     441 
     442            $total = array(); 
     443            foreach ( $this->parameters as $k => $v ) { 
     444                if ( substr( $k, 0, 5 ) != "oauth" ) { 
     445                    continue; 
     446                } 
     447                if ( is_array( $v ) ) { 
     448                    throw new OAuthException( 'Arrays not supported in headers' ); 
     449                } 
     450                $out .= ( $first ) ? ' ' : ','; 
     451                $out .= OAuthUtil::urlencode_rfc3986( $k ) . '="' . OAuthUtil::urlencode_rfc3986( $v ) . '"'; 
     452                $first = false; 
     453            } 
     454 
     455            return $out; 
     456        } 
     457 
     458        public function __toString() { 
     459            return $this->to_url(); 
     460        } 
     461 
     462 
     463        public function sign_request( $signature_method, $consumer, $token ) { 
     464            $this->set_parameter( "oauth_signature_method", $signature_method->get_name(), false ); 
     465            $signature = $this->build_signature( $signature_method, $consumer, $token ); 
     466            $this->set_parameter( "oauth_signature", $signature, false ); 
     467        } 
     468 
     469        public function build_signature( $signature_method, $consumer, $token ) { 
     470            $signature = $signature_method->build_signature( $this, $consumer, $token ); 
     471 
     472            return $signature; 
     473        } 
     474 
     475        /** 
     476         * util function: current timestamp 
     477         */ 
     478        private static function generate_timestamp() { 
     479            return time(); 
     480        } 
     481 
     482        /** 
     483         * util function: current nonce 
     484         */ 
     485        private static function generate_nonce() { 
     486            $mt   = microtime(); 
     487            $rand = mt_rand(); 
     488 
     489            return md5( $mt . $rand ); // md5s look nicer than numbers 
     490        } 
     491    } 
     492} 
     493 
     494if ( ! class_exists( 'OAuthServer' ) ) { 
    494495    class OAuthServer { 
    495       protected $timestamp_threshold = 300; // in seconds, five minutes 
    496       protected $version = '1.0';             // hi blaine 
    497       protected $signature_methods = array(); 
    498      
    499       protected $data_store; 
    500      
    501       function __construct($data_store) { 
    502         $this->data_store = $data_store; 
    503       } 
    504      
    505       public function add_signature_method($signature_method) { 
    506         $this->signature_methods[$signature_method->get_name()] = 
    507           $signature_method; 
    508       } 
    509      
    510       // high level functions 
    511      
    512       /** 
    513        * process a request_token request 
    514        * returns the request token on success 
    515        */ 
    516       public function fetch_request_token(&$request) { 
    517         $this->get_version($request); 
    518      
    519         $consumer = $this->get_consumer($request); 
    520      
    521         // no token required for the initial token request 
    522         $token = NULL; 
    523      
    524         $this->check_signature($request, $consumer, $token); 
    525      
    526         // Rev A change 
    527         $callback = $request->get_parameter('oauth_callback'); 
    528         $new_token = $this->data_store->new_request_token($consumer, $callback); 
    529      
    530         return $new_token; 
    531       } 
    532      
    533       /** 
    534        * process an access_token request 
    535        * returns the access token on success 
    536        */ 
    537       public function fetch_access_token(&$request) { 
    538         $this->get_version($request); 
    539      
    540         $consumer = $this->get_consumer($request); 
    541      
    542         // requires authorized request token 
    543         $token = $this->get_token($request, $consumer, "request"); 
    544      
    545         $this->check_signature($request, $consumer, $token); 
    546      
    547         // Rev A change 
    548         $verifier = $request->get_parameter('oauth_verifier'); 
    549         $new_token = $this->data_store->new_access_token($token, $consumer, $verifier); 
    550      
    551         return $new_token; 
    552       } 
    553      
    554       /** 
    555        * verify an api call, checks all the parameters 
    556        */ 
    557       public function verify_request(&$request) { 
    558         $this->get_version($request); 
    559         $consumer = $this->get_consumer($request); 
    560         $token = $this->get_token($request, $consumer, "access"); 
    561         $this->check_signature($request, $consumer, $token); 
    562         return array($consumer, $token); 
    563       } 
    564      
    565       // Internals from here 
    566       /** 
    567        * version 1 
    568        */ 
    569       private function get_version(&$request) { 
    570         $version = $request->get_parameter("oauth_version"); 
    571         if (!$version) { 
    572           // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present.  
    573           // Chapter 7.0 ("Accessing Protected Ressources") 
    574           $version = '1.0'; 
    575         } 
    576         if ($version !== $this->version) { 
    577           throw new OAuthException("OAuth version '$version' not supported"); 
    578         } 
    579         return $version; 
    580       } 
    581      
    582       /** 
    583        * figure out the signature with some defaults 
    584        */ 
    585       private function get_signature_method(&$request) { 
    586         $signature_method = 
    587             @$request->get_parameter("oauth_signature_method"); 
    588      
    589         if (!$signature_method) { 
    590           // According to chapter 7 ("Accessing Protected Ressources") the signature-method 
    591           // parameter is required, and we can't just fallback to PLAINTEXT 
    592           throw new OAuthException('No signature method parameter. This parameter is required'); 
    593         } 
    594      
    595         if (!in_array($signature_method, 
    596                       array_keys($this->signature_methods))) { 
    597           throw new OAuthException( 
    598             "Signature method '$signature_method' not supported " . 
    599             "try one of the following: " . 
    600             implode(", ", array_keys($this->signature_methods)) 
    601           ); 
    602         } 
    603         return $this->signature_methods[$signature_method]; 
    604       } 
    605      
    606       /** 
    607        * try to find the consumer for the provided request's consumer key 
    608        */ 
    609       private function get_consumer(&$request) { 
    610         $consumer_key = @$request->get_parameter("oauth_consumer_key"); 
    611         if (!$consumer_key) { 
    612           throw new OAuthException("Invalid consumer key"); 
    613         } 
    614      
    615         $consumer = $this->data_store->lookup_consumer($consumer_key); 
    616         if (!$consumer) { 
    617           throw new OAuthException("Invalid consumer"); 
    618         } 
    619      
    620         return $consumer; 
    621       } 
    622      
    623       /** 
    624        * try to find the token for the provided request's token key 
    625        */ 
    626       private function get_token(&$request, $consumer, $token_type="access") { 
    627         $token_field = @$request->get_parameter('oauth_token'); 
    628         $token = $this->data_store->lookup_token( 
    629           $consumer, $token_type, $token_field 
    630         ); 
    631         if (!$token) { 
    632           throw new OAuthException("Invalid $token_type token: $token_field"); 
    633         } 
    634         return $token; 
    635       } 
    636      
    637       /** 
    638        * all-in-one function to check the signature on a request 
    639        * should guess the signature method appropriately 
    640        */ 
    641       private function check_signature(&$request, $consumer, $token) { 
    642         // this should probably be in a different method 
    643         $timestamp = @$request->get_parameter('oauth_timestamp'); 
    644         $nonce = @$request->get_parameter('oauth_nonce'); 
    645      
    646         $this->check_timestamp($timestamp); 
    647         $this->check_nonce($consumer, $token, $nonce, $timestamp); 
    648      
    649         $signature_method = $this->get_signature_method($request); 
    650      
    651         $signature = $request->get_parameter('oauth_signature'); 
    652         $valid_sig = $signature_method->check_signature( 
    653           $request, 
    654           $consumer, 
    655           $token, 
    656           $signature 
    657         ); 
    658      
    659         if (!$valid_sig) { 
    660           throw new OAuthException("Invalid signature"); 
    661         } 
    662       } 
    663      
    664       /** 
    665        * check that the timestamp is new enough 
    666        */ 
    667       private function check_timestamp($timestamp) { 
    668         if( ! $timestamp ) 
    669           throw new OAuthException( 
    670             'Missing timestamp parameter. The parameter is required' 
    671           ); 
    672          
    673         // verify that timestamp is recentish 
    674         $now = time(); 
    675         if (abs($now - $timestamp) > $this->timestamp_threshold) { 
    676           throw new OAuthException( 
    677             "Expired timestamp, yours $timestamp, ours $now" 
    678           ); 
    679         } 
    680       } 
    681      
    682       /** 
    683        * check that the nonce is not repeated 
    684        */ 
    685       private function check_nonce($consumer, $token, $nonce, $timestamp) { 
    686         if( ! $nonce ) 
    687           throw new OAuthException( 
    688             'Missing nonce parameter. The parameter is required' 
    689           ); 
    690      
    691         // verify that the nonce is uniqueish 
    692         $found = $this->data_store->lookup_nonce( 
    693           $consumer, 
    694           $token, 
    695           $nonce, 
    696           $timestamp 
    697         ); 
    698         if ($found) { 
    699           throw new OAuthException("Nonce already used: $nonce"); 
    700         } 
    701       } 
    702     } 
    703 } 
    704  
    705 if( !class_exists('OAuthDataStore') ){ 
     496 
     497        protected $timestamp_threshold = 300; // in seconds, five minutes 
     498        protected $version = '1.0';             // hi blaine 
     499        protected $signature_methods = array(); 
     500 
     501        protected $data_store; 
     502 
     503        function __construct( $data_store ) { 
     504            $this->data_store = $data_store; 
     505        } 
     506 
     507        public function add_signature_method( $signature_method ) { 
     508            $this->signature_methods[ $signature_method->get_name() ] = $signature_method; 
     509        } 
     510 
     511        // high level functions 
     512 
     513        /** 
     514         * process a request_token request 
     515         * returns the request token on success 
     516         */ 
     517        public function fetch_request_token( &$request ) { 
     518            $this->get_version( $request ); 
     519 
     520            $consumer = $this->get_consumer( $request ); 
     521 
     522            // no token required for the initial token request 
     523            $token = null; 
     524 
     525            $this->check_signature( $request, $consumer, $token ); 
     526 
     527            // Rev A change 
     528            $callback  = $request->get_parameter( 'oauth_callback' ); 
     529            $new_token = $this->data_store->new_request_token( $consumer, $callback ); 
     530 
     531            return $new_token; 
     532        } 
     533 
     534        /** 
     535         * process an access_token request 
     536         * returns the access token on success 
     537         */ 
     538        public function fetch_access_token( &$request ) { 
     539            $this->get_version( $request ); 
     540 
     541            $consumer = $this->get_consumer( $request ); 
     542 
     543            // requires authorized request token 
     544            $token = $this->get_token( $request, $consumer, "request" ); 
     545 
     546            $this->check_signature( $request, $consumer, $token ); 
     547 
     548            // Rev A change 
     549            $verifier  = $request->get_parameter( 'oauth_verifier' ); 
     550            $new_token = $this->data_store->new_access_token( $token, $consumer, $verifier ); 
     551 
     552            return $new_token; 
     553        } 
     554 
     555        /** 
     556         * verify an api call, checks all the parameters 
     557         */ 
     558        public function verify_request( &$request ) { 
     559            $this->get_version( $request ); 
     560            $consumer = $this->get_consumer( $request ); 
     561            $token    = $this->get_token( $request, $consumer, "access" ); 
     562            $this->check_signature( $request, $consumer, $token ); 
     563 
     564            return array( $consumer, $token ); 
     565        } 
     566 
     567        // Internals from here 
     568        /** 
     569         * version 1 
     570         */ 
     571        private function get_version( &$request ) { 
     572            $version = $request->get_parameter( "oauth_version" ); 
     573            if ( ! $version ) { 
     574                // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present. 
     575                // Chapter 7.0 ("Accessing Protected Ressources") 
     576                $version = '1.0'; 
     577            } 
     578            if ( $version !== $this->version ) { 
     579                throw new OAuthException( "OAuth version '$version' not supported" ); 
     580            } 
     581 
     582            return $version; 
     583        } 
     584 
     585        /** 
     586         * figure out the signature with some defaults 
     587         */ 
     588        private function get_signature_method( &$request ) { 
     589            $signature_method = @$request->get_parameter( "oauth_signature_method" ); 
     590 
     591            if ( ! $signature_method ) { 
     592                // According to chapter 7 ("Accessing Protected Ressources") the signature-method 
     593                // parameter is required, and we can't just fallback to PLAINTEXT 
     594                throw new OAuthException( 'No signature method parameter. This parameter is required' ); 
     595            } 
     596 
     597            if ( ! in_array( $signature_method, array_keys( $this->signature_methods ) ) ) { 
     598                throw new OAuthException( "Signature method '$signature_method' not supported " . "try one of the following: " . implode( ", ", array_keys( $this->signature_methods ) ) ); 
     599            } 
     600 
     601            return $this->signature_methods[ $signature_method ]; 
     602        } 
     603 
     604        /** 
     605         * try to find the consumer for the provided request's consumer key 
     606         */ 
     607        private function get_consumer( &$request ) { 
     608            $consumer_key = @$request->get_parameter( "oauth_consumer_key" ); 
     609            if ( ! $consumer_key ) { 
     610                throw new OAuthException( "Invalid consumer key" ); 
     611            } 
     612 
     613            $consumer = $this->data_store->lookup_consumer( $consumer_key ); 
     614            if ( ! $consumer ) { 
     615                throw new OAuthException( "Invalid consumer" ); 
     616            } 
     617 
     618            return $consumer; 
     619        } 
     620 
     621        /** 
     622         * try to find the token for the provided request's token key 
     623         */ 
     624        private function get_token( &$request, $consumer, $token_type = "access" ) { 
     625            $token_field = @$request->get_parameter( 'oauth_token' ); 
     626            $token       = $this->data_store->lookup_token( $consumer, $token_type, $token_field ); 
     627            if ( ! $token ) { 
     628                throw new OAuthException( "Invalid $token_type token: $token_field" ); 
     629            } 
     630 
     631            return $token; 
     632        } 
     633 
     634        /** 
     635         * all-in-one function to check the signature on a request 
     636         * should guess the signature method appropriately 
     637         */ 
     638        private function check_signature( &$request, $consumer, $token ) { 
     639            // this should probably be in a different method 
     640            $timestamp = @$request->get_parameter( 'oauth_timestamp' ); 
     641            $nonce     = @$request->get_parameter( 'oauth_nonce' ); 
     642 
     643            $this->check_timestamp( $timestamp ); 
     644            $this->check_nonce( $consumer, $token, $nonce, $timestamp ); 
     645 
     646            $signature_method = $this->get_signature_method( $request ); 
     647 
     648            $signature = $request->get_parameter( 'oauth_signature' ); 
     649            $valid_sig = $signature_method->check_signature( $request, $consumer, $token, $signature ); 
     650 
     651            if ( ! $valid_sig ) { 
     652                throw new OAuthException( "Invalid signature" ); 
     653            } 
     654        } 
     655 
     656        /** 
     657         * check that the timestamp is new enough 
     658         */ 
     659        private function check_timestamp( $timestamp ) { 
     660            if ( ! $timestamp ) { 
     661                throw new OAuthException( 'Missing timestamp parameter. The parameter is required' ); 
     662            } 
     663 
     664            // verify that timestamp is recentish 
     665            $now = time(); 
     666            if ( abs( $now - $timestamp ) > $this->timestamp_threshold ) { 
     667                throw new OAuthException( "Expired timestamp, yours $timestamp, ours $now" ); 
     668            } 
     669        } 
     670 
     671        /** 
     672         * check that the nonce is not repeated 
     673         */ 
     674        private function check_nonce( $consumer, $token, $nonce, $timestamp ) { 
     675            if ( ! $nonce ) { 
     676                throw new OAuthException( 'Missing nonce parameter. The parameter is required' ); 
     677            } 
     678 
     679            // verify that the nonce is uniqueish 
     680            $found = $this->data_store->lookup_nonce( $consumer, $token, $nonce, $timestamp ); 
     681            if ( $found ) { 
     682                throw new OAuthException( "Nonce already used: $nonce" ); 
     683            } 
     684        } 
     685    } 
     686} 
     687 
     688if ( ! class_exists( 'OAuthDataStore' ) ) { 
    706689    class OAuthDataStore { 
    707       function lookup_consumer($consumer_key) { 
    708         // implement me 
    709       } 
    710      
    711       function lookup_token($consumer, $token_type, $token) { 
    712         // implement me 
    713       } 
    714      
    715       function lookup_nonce($consumer, $token, $nonce, $timestamp) { 
    716         // implement me 
    717       } 
    718      
    719       function new_request_token($consumer, $callback = null) { 
    720         // return a new token attached to this consumer 
    721       } 
    722      
    723       function new_access_token($token, $consumer, $verifier = null) { 
    724         // return a new access token attached to this consumer 
    725         // for the user associated with this token if the request token 
    726         // is authorized 
    727         // should also invalidate the request token 
    728       } 
    729      
    730     } 
    731 } 
    732  
    733 if( !class_exists('OAuthUtil') ){ 
    734 class OAuthUtil { 
    735   public static function urlencode_rfc3986($input) { 
    736   if (is_array($input)) { 
    737     return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input); 
    738   } else if (is_scalar($input)) { 
    739     return str_replace( 
    740       '+', 
    741       ' ', 
    742       str_replace('%7E', '~', rawurlencode($input)) 
    743     ); 
    744   } else { 
    745     return ''; 
    746   } 
    747 } 
    748  
    749  
    750   // This decode function isn't taking into consideration the above 
    751   // modifications to the encoding process. However, this method doesn't 
    752   // seem to be used anywhere so leaving it as is. 
    753   public static function urldecode_rfc3986($string) { 
    754     return urldecode($string); 
    755   } 
    756  
    757   // Utility function for turning the Authorization: header into 
    758   // parameters, has to do some unescaping 
    759   // Can filter out any non-oauth parameters if needed (default behaviour) 
    760   public static function split_header($header, $only_allow_oauth_parameters = true) { 
    761     $pattern = '/(([-_a-z]*)=("([^"]*)"|([^,]*)),?)/'; 
    762     $offset = 0; 
    763     $params = array(); 
    764     while (preg_match($pattern, $header, $matches, PREG_OFFSET_CAPTURE, $offset) > 0) { 
    765       $match = $matches[0]; 
    766       $header_name = $matches[2][0]; 
    767       $header_content = (isset($matches[5])) ? $matches[5][0] : $matches[4][0]; 
    768       if (preg_match('/^oauth_/', $header_name) || !$only_allow_oauth_parameters) { 
    769         $params[$header_name] = OAuthUtil::urldecode_rfc3986($header_content); 
    770       } 
    771       $offset = $match[1] + strlen($match[0]); 
    772     } 
    773  
    774     if (isset($params['realm'])) { 
    775       unset($params['realm']); 
    776     } 
    777  
    778     return $params; 
    779   } 
    780  
    781   // helper to try to sort out headers for people who aren't running apache 
    782   public static function get_headers() { 
    783     if (function_exists('apache_request_headers')) { 
    784       // we need this to get the actual Authorization: header 
    785       // because apache tends to tell us it doesn't exist 
    786       $headers = apache_request_headers(); 
    787  
    788       // sanitize the output of apache_request_headers because 
    789       // we always want the keys to be Cased-Like-This and arh() 
    790       // returns the headers in the same case as they are in the 
    791       // request 
    792       $out = array(); 
    793       foreach( $headers AS $key => $value ) { 
    794         $key = str_replace( 
    795             " ", 
    796             "-", 
    797             ucwords(strtolower(str_replace("-", " ", $key))) 
    798           ); 
    799         $out[$key] = $value; 
    800       } 
    801     } else { 
    802       // otherwise we don't have apache and are just going to have to hope 
    803       // that $_SERVER actually contains what we need 
    804       $out = array(); 
    805       if( isset($_SERVER['CONTENT_TYPE']) ) 
    806         $out['Content-Type'] = $_SERVER['CONTENT_TYPE']; 
    807       if( isset($_ENV['CONTENT_TYPE']) ) 
    808         $out['Content-Type'] = $_ENV['CONTENT_TYPE']; 
    809  
    810       foreach ($_SERVER as $key => $value) { 
    811         if (substr($key, 0, 5) == "HTTP_") { 
    812           // this is chaos, basically it is just there to capitalize the first 
    813           // letter of every word that is not an initial HTTP and strip HTTP 
    814           // code from przemek 
    815           $key = str_replace( 
    816             " ", 
    817             "-", 
    818             ucwords(strtolower(str_replace("_", " ", substr($key, 5)))) 
    819           ); 
    820           $out[$key] = $value; 
    821         } 
    822       } 
    823     } 
    824     return $out; 
    825   } 
    826  
    827   // This function takes a input like a=b&a=c&d=e and returns the parsed 
    828   // parameters like this 
    829   // array('a' => array('b','c'), 'd' => 'e') 
    830   public static function parse_parameters( $input ) { 
    831     if (!isset($input) || !$input) return array(); 
    832  
    833     $pairs = explode('&', $input); 
    834  
    835     $parsed_parameters = array(); 
    836     foreach ($pairs as $pair) { 
    837       $split = explode('=', $pair, 2); 
    838       $parameter = OAuthUtil::urldecode_rfc3986($split[0]); 
    839       $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : ''; 
    840  
    841       if (isset($parsed_parameters[$parameter])) { 
    842         // We have already recieved parameter(s) with this name, so add to the list 
    843         // of parameters with this name 
    844  
    845         if (is_scalar($parsed_parameters[$parameter])) { 
    846           // This is the first duplicate, so transform scalar (string) into an array 
    847           // so we can add the duplicates 
    848           $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]); 
    849         } 
    850  
    851         $parsed_parameters[$parameter][] = $value; 
    852       } else { 
    853         $parsed_parameters[$parameter] = $value; 
    854       } 
    855     } 
    856     return $parsed_parameters; 
    857   } 
    858  
    859   public static function build_http_query($params) { 
    860     if (!$params) return ''; 
    861  
    862     // Urlencode both keys and values 
    863     $keys = OAuthUtil::urlencode_rfc3986(array_keys($params)); 
    864     $values = OAuthUtil::urlencode_rfc3986(array_values($params)); 
    865     $params = array_combine($keys, $values); 
    866  
    867     // Parameters are sorted by name, using lexicographical byte value ordering. 
    868     // Ref: Spec: 9.1.1 (1) 
    869     uksort($params, 'strcmp'); 
    870  
    871     $pairs = array(); 
    872     foreach ($params as $parameter => $value) { 
    873       if (is_array($value)) { 
    874         // If two or more parameters share the same name, they are sorted by their value 
    875         // Ref: Spec: 9.1.1 (1) 
    876         natsort($value); 
    877         foreach ($value as $duplicate_value) { 
    878           $pairs[] = $parameter . '=' . $duplicate_value; 
    879         } 
    880       } else { 
    881         $pairs[] = $parameter . '=' . $value; 
    882       } 
    883     } 
    884     // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61) 
    885     // Each name-value pair is separated by an '&' character (ASCII code 38) 
    886     return implode('&', $pairs); 
    887   } 
    888 } 
    889 } 
    890 ?> 
     690 
     691        function lookup_consumer( $consumer_key ) { 
     692            // implement me 
     693        } 
     694 
     695        function lookup_token( $consumer, $token_type, $token ) { 
     696            // implement me 
     697        } 
     698 
     699        function lookup_nonce( $consumer, $token, $nonce, $timestamp ) { 
     700            // implement me 
     701        } 
     702 
     703        function new_request_token( $consumer, $callback = null ) { 
     704            // return a new token attached to this consumer 
     705        } 
     706 
     707        function new_access_token( $token, $consumer, $verifier = null ) { 
     708            // return a new access token attached to this consumer 
     709            // for the user associated with this token if the request token 
     710            // is authorized 
     711            // should also invalidate the request token 
     712        } 
     713 
     714    } 
     715} 
     716 
     717if ( ! class_exists( 'OAuthUtil' ) ) { 
     718    class OAuthUtil { 
     719 
     720        public static function urlencode_rfc3986( $input ) { 
     721            if ( is_array( $input ) ) { 
     722                return array_map( array( 'OAuthUtil', 'urlencode_rfc3986' ), $input ); 
     723            } else if ( is_scalar( $input ) ) { 
     724                return str_replace( '+', ' ', str_replace( '%7E', '~', rawurlencode( $input ) ) ); 
     725            } else { 
     726                return ''; 
     727            } 
     728        } 
     729 
     730 
     731        // This decode function isn't taking into consideration the above 
     732        // modifications to the encoding process. However, this method doesn't 
     733        // seem to be used anywhere so leaving it as is. 
     734        public static function urldecode_rfc3986( $string ) { 
     735            return urldecode( $string ); 
     736        } 
     737 
     738        // Utility function for turning the Authorization: header into 
     739        // parameters, has to do some unescaping 
     740        // Can filter out any non-oauth parameters if needed (default behaviour) 
     741        public static function split_header( $header, $only_allow_oauth_parameters = true ) { 
     742            $pattern = '/(([-_a-z]*)=("([^"]*)"|([^,]*)),?)/'; 
     743            $offset  = 0; 
     744            $params  = array(); 
     745            while ( preg_match( $pattern, $header, $matches, PREG_OFFSET_CAPTURE, $offset ) > 0 ) { 
     746                $match          = $matches[0]; 
     747                $header_name    = $matches[2][0]; 
     748                $header_content = ( isset( $matches[5] ) ) ? $matches[5][0] : $matches[4][0]; 
     749                if ( preg_match( '/^oauth_/', $header_name ) || ! $only_allow_oauth_parameters ) { 
     750                    $params[ $header_name ] = OAuthUtil::urldecode_rfc3986( $header_content ); 
     751                } 
     752                $offset = $match[1] + strlen( $match[0] ); 
     753            } 
     754 
     755            if ( isset( $params['realm'] ) ) { 
     756                unset( $params['realm'] ); 
     757            } 
     758 
     759            return $params; 
     760        } 
     761 
     762        // helper to try to sort out headers for people who aren't running apache 
     763        public static function get_headers() { 
     764            if ( function_exists( 'apache_request_headers' ) ) { 
     765                // we need this to get the actual Authorization: header 
     766                // because apache tends to tell us it doesn't exist 
     767                $headers = apache_request_headers(); 
     768 
     769                // sanitize the output of apache_request_headers because 
     770                // we always want the keys to be Cased-Like-This and arh() 
     771                // returns the headers in the same case as they are in the 
     772                // request 
     773                $out = array(); 
     774                foreach ( $headers AS $key => $value ) { 
     775                    $key         = str_replace( " ", "-", ucwords( strtolower( str_replace( "-", " ", $key ) ) ) ); 
     776                    $out[ $key ] = $value; 
     777                } 
     778            } else { 
     779                // otherwise we don't have apache and are just going to have to hope 
     780                // that $_SERVER actually contains what we need 
     781                $out = array(); 
     782                if ( isset( $_SERVER['CONTENT_TYPE'] ) ) { 
     783                    $out['Content-Type'] = $_SERVER['CONTENT_TYPE']; 
     784                } 
     785                if ( isset( $_ENV['CONTENT_TYPE'] ) ) { 
     786                    $out['Content-Type'] = $_ENV['CONTENT_TYPE']; 
     787                } 
     788 
     789                foreach ( $_SERVER as $key => $value ) { 
     790                    if ( substr( $key, 0, 5 ) == "HTTP_" ) { 
     791                        // this is chaos, basically it is just there to capitalize the first 
     792                        // letter of every word that is not an initial HTTP and strip HTTP 
     793                        // code from przemek 
     794                        $key         = str_replace( " ", "-", ucwords( strtolower( str_replace( "_", " ", substr( $key, 5 ) ) ) ) ); 
     795                        $out[ $key ] = $value; 
     796                    } 
     797                } 
     798            } 
     799 
     800            return $out; 
     801        } 
     802 
     803        // This function takes a input like a=b&a=c&d=e and returns the parsed 
     804        // parameters like this 
     805        // array('a' => array('b','c'), 'd' => 'e') 
     806        public static function parse_parameters( $input ) { 
     807            if ( ! isset( $input ) || ! $input ) { 
     808                return array(); 
     809            } 
     810 
     811            $pairs = explode( '&', $input ); 
     812 
     813            $parsed_parameters = array(); 
     814            foreach ( $pairs as $pair ) { 
     815                $split     = explode( '=', $pair, 2 ); 
     816                $parameter = OAuthUtil::urldecode_rfc3986( $split[0] ); 
     817                $value     = isset( $split[1] ) ? OAuthUtil::urldecode_rfc3986( $split[1] ) : ''; 
     818 
     819                if ( isset( $parsed_parameters[ $parameter ] ) ) { 
     820                    // We have already recieved parameter(s) with this name, so add to the list 
     821                    // of parameters with this name 
     822 
     823                    if ( is_scalar( $parsed_parameters[ $parameter ] ) ) { 
     824                        // This is the first duplicate, so transform scalar (string) into an array 
     825                        // so we can add the duplicates 
     826                        $parsed_parameters[ $parameter ] = array( $parsed_parameters[ $parameter ] ); 
     827                    } 
     828 
     829                    $parsed_parameters[ $parameter ][] = $value; 
     830                } else { 
     831                    $parsed_parameters[ $parameter ] = $value; 
     832                } 
     833            } 
     834 
     835            return $parsed_parameters; 
     836        } 
     837 
     838        public static function build_http_query( $params ) { 
     839            if ( ! $params ) { 
     840                return ''; 
     841            } 
     842 
     843            // Urlencode both keys and values 
     844            $keys   = OAuthUtil::urlencode_rfc3986( array_keys( $params ) ); 
     845            $values = OAuthUtil::urlencode_rfc3986( array_values( $params ) ); 
     846            $params = array_combine( $keys, $values ); 
     847 
     848            // Parameters are sorted by name, using lexicographical byte value ordering. 
     849            // Ref: Spec: 9.1.1 (1) 
     850            uksort( $params, 'strcmp' ); 
     851 
     852            $pairs = array(); 
     853            foreach ( $params as $parameter => $value ) { 
     854                if ( is_array( $value ) ) { 
     855                    // If two or more parameters share the same name, they are sorted by their value 
     856                    // Ref: Spec: 9.1.1 (1) 
     857                    natsort( $value ); 
     858                    foreach ( $value as $duplicate_value ) { 
     859                        $pairs[] = $parameter . '=' . $duplicate_value; 
     860                    } 
     861                } else { 
     862                    $pairs[] = $parameter . '=' . $value; 
     863                } 
     864            } 
     865            // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61) 
     866            // Each name-value pair is separated by an '&' character (ASCII code 38) 
     867            return implode( '&', $pairs ); 
     868        } 
     869    } 
     870} 
  • wp-trello/trunk/includes/trello.php

    r650600 r1479964  
    11<?php 
    22 
    3 require_once('oauth.php'); 
     3require_once( 'oauth.php' ); 
    44 
    55/** 
     
    77 */ 
    88class trello_oauth { 
     9 
    910    /* Contains the last HTTP status code returned. */ 
    1011    public $http_code; 
     
    1213    public $url; 
    1314    /* Set up the API root URL. */ 
    14     public  $host = 'https://api.trello.com/1/'; 
     15    public $host = 'https://api.trello.com/1/'; 
    1516    /* Set timeout default. */ 
    1617    public $timeout = 30; 
    1718    /* Set connect timeout. */ 
    18     public $connecttimeout = 30;  
     19    public $connecttimeout = 30; 
    1920    /* Verify SSL Cert. */ 
    20     public $ssl_verifypeer = FALSE; 
     21    public $ssl_verifypeer = false; 
    2122    /* Respons format. */ 
    22     public  $format = 'json'; 
     23    public $format = 'json'; 
    2324    /* Decode returned json data. */ 
    24     public $decode_json = TRUE; 
     25    public $decode_json = true; 
    2526    /* Contains the last HTTP headers returned. */ 
    2627    public $http_info; 
     
    3435    private $authenticate_token_url = ''; 
    3536    private $app_name = 'WP Trello'; 
    36      
     37 
    3738    private $consumer_key = '21b4a1e4f755637319c979849147076e'; 
    3839    private $consumer_secret = '7d5ab8655e15582041cab97459d1c6d9fca51e690247df4fb5214f2691ba786c'; 
    3940 
    40   /** 
    41    * Set API URLS 
    42    */ 
    43   function accessTokenURL()  { return $this->access_token_url; } 
    44   function authenticateURL() { return $this->authorize_url; } 
    45   function authorizeURL()    { return $this->authorize_url; } 
    46   function requestTokenURL() { return $this->request_token_url; } 
    47  
    48   /** 
    49    * Debug helpers 
    50    */ 
    51   function lastStatusCode() { return $this->http_status; } 
    52   function lastAPICall() { return $this->last_api_call; } 
    53  
    54   /** 
    55    * construct Provider oAuth object 
    56    */ 
    57   function __construct( $oauth_token = NULL,  
    58                         $oauth_token_secret = NULL 
    59                         ) { 
    60      
    61     $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); 
    62     $this->consumer = new OAuthConsumer($this->consumer_key, $this->consumer_secret); 
    63     //print 'oauth_token:' . $oauth_token; 
    64     //print 'oauth_token_secret:' . $oauth_token_secret; 
    65     if (!empty($oauth_token) && !empty($oauth_token_secret)) { 
    66       $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret); 
    67     } else { 
    68       $this->token = NULL; 
    69     } 
    70   } 
    71  
    72   function get_authorise_url($callback = '', $source = '') { 
    73    
    74     $request_token = $this->getRequestToken($callback); 
    75  
    76     $_SESSION[$source .'_oauth_token'] = $token = $request_token['oauth_token']; 
    77     $_SESSION[$source .'_oauth_token_secret'] = $request_token['oauth_token_secret']; 
    78  
    79     $url = '#'; 
    80     switch ($this->http_code) { 
    81       case 200: 
    82         $url = $this->getAuthorizeURL($token); 
    83         return $url; 
    84         break; 
    85     } 
    86  
    87   } 
    88   /** 
    89    * Get a request_token from Provider 
    90    * 
    91    * @returns a key/value array containing oauth_token and oauth_token_secret 
    92    */ 
    93   function getRequestToken($oauth_callback = NULL) { 
    94     $parameters = array(); 
    95     if (!empty($oauth_callback)) { 
    96       $parameters['oauth_callback'] = $oauth_callback; 
    97     }   
    98     $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters); 
    99     $token = OAuthUtil::parse_parameters($request); 
    100     $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
    101     return $token; 
    102   } 
    103  
    104   /** 
    105    * Get the authorize URL 
    106    * 
    107    * @returns a string 
    108    */ 
    109   function getAuthorizeURL($token, $sign_in_with_twitter = TRUE) { 
    110     if (is_array($token)) { 
    111       $token = $token['oauth_token']; 
    112     } 
    113     $app_name = isset($this->app_name) ? '&name='. urlencode($this->app_name) : ''; 
    114     if (empty($sign_in_with_twitter)) { 
    115       return $this->authorizeURL() . "?oauth_token={$token}&expiration=never". $app_name; 
    116     } else { 
    117        return $this->authenticateURL() . "?oauth_token={$token}&expiration=never". $app_name; 
    118     } 
    119   } 
    120  
    121   /** 
    122    * Exchange request token and secret for an access token and 
    123    * secret, to sign API calls. 
    124    * 
    125    */ 
    126   function getAccessToken($oauth_verifier = FALSE, $return_uri = NULL) { 
    127     $parameters = array(); 
    128     if (!empty($oauth_verifier)) { 
    129       $parameters['oauth_verifier'] = $oauth_verifier; 
    130     } 
    131     $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters); 
    132     $token = OAuthUtil::parse_parameters($request); 
    133     $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
    134     return $token; 
    135   } 
    136  
    137   /** 
    138    * One time exchange of username and password for access token and secret. 
    139    * 
    140    */   
    141   function getXAuthToken($username, $password) { 
    142     $parameters = array(); 
    143     $parameters['x_auth_username'] = $username; 
    144     $parameters['x_auth_password'] = $password; 
    145     $parameters['x_auth_mode'] = 'client_auth'; 
    146     $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters); 
    147     $token = OAuthUtil::parse_parameters($request); 
    148     $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
    149     return $token; 
    150   } 
    151  
    152   /** 
    153    * GET wrapper for oAuthRequest. 
    154    */ 
    155   function get($url, $parameters = array()) { 
    156     $response = $this->oAuthRequest($url, 'GET', $parameters);   
    157     if ($this->format === 'json' && $this->decode_json) { 
    158       return json_decode($response); 
    159     } 
    160     return $response; 
    161   } 
    162    
    163   /** 
    164    * POST wrapper for oAuthRequest. 
    165    */ 
    166   function post($url, $parameters = array()) { 
    167     $response = $this->oAuthRequest($url, 'POST', $parameters); 
    168     if ($this->format === 'json' && $this->decode_json) { 
    169       return json_decode($response); 
    170     } 
    171     return $response; 
    172   } 
    173  
    174   /** 
    175    * DELETE wrapper for oAuthReqeust. 
    176    */ 
    177   function delete($url, $parameters = array()) { 
    178     $response = $this->oAuthRequest($url, 'DELETE', $parameters); 
    179     if ($this->format === 'json' && $this->decode_json) { 
    180       return json_decode($response); 
    181     } 
    182     return $response; 
    183   } 
    184  
    185   function getFormat($url) { return "{$this->host}{$url}"; } 
    186    
    187   /** 
    188    * Format and sign an OAuth / API request 
    189    */ 
    190   function oAuthRequest($url, $method, $parameters) { 
    191     if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) { 
    192       $url = $this->getFormat($url); 
    193     } 
    194     $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters); 
    195     $request->sign_request($this->sha1_method, $this->consumer, $this->token); 
    196     switch ($method) { 
    197     case 'GET': 
    198       return $this->http($request->to_url(), 'GET'); 
    199     default: 
    200       return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata()); 
    201     } 
    202   } 
    203    
    204    
    205   /** 
    206    * Format and sign an OAuth / API request 
    207    */ 
    208   function oAuthRequest2($url, $method, $parameters) { 
    209     if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) { 
    210       $url = $this->getFormat($url); 
    211     } 
    212     $defaults = array(); 
    213     $token = $this->token; 
    214     $defaults['access_token'] = $token->key; 
    215     $parameters = array_merge($defaults, $parameters); 
    216     $request = new OAuthRequest($method, $url, $parameters); 
    217     switch ($method) { 
    218     case 'GET': 
    219       return $this->http($request->to_url(), 'GET'); 
    220     default: 
    221       return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata()); 
    222     } 
    223   } 
    224  
    225  
    226   /** 
    227    * Make an HTTP request 
    228    * 
    229    * @return API results 
    230    */ 
    231   function http($url, $method, $postfields = NULL) { 
    232     $this->http_info = array(); 
    233     $ci = curl_init(); 
    234     /* Curl settings */ 
    235     curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent); 
    236     curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout); 
    237     curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout); 
    238     curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE); 
    239     curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:')); 
    240     curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer); 
    241     curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader')); 
    242     curl_setopt($ci, CURLOPT_HEADER, FALSE); 
    243  
    244     switch ($method) { 
    245       case 'POST': 
    246         curl_setopt($ci, CURLOPT_POST, TRUE); 
    247         if (!empty($postfields)) { 
    248           curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); 
    249         } 
    250         break; 
    251       case 'DELETE': 
    252         curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE'); 
    253         if (!empty($postfields)) { 
    254           $url = "{$url}?{$postfields}"; 
    255         } 
    256     } 
    257     curl_setopt($ci, CURLOPT_URL, $url); 
    258     $response = curl_exec($ci); 
    259     $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); 
    260     $this->http_info = array_merge($this->http_info, curl_getinfo($ci)); 
    261     $this->url = $url; 
    262     curl_close ($ci); 
    263     return $response; 
    264   } 
    265  
    266   /** 
    267    * Get the header info to store. 
    268    */ 
    269   function getHeader($ch, $header) { 
    270     $i = strpos($header, ':'); 
    271     if (!empty($i)) { 
    272       $key = str_replace('-', '_', strtolower(substr($header, 0, $i))); 
    273       $value = trim(substr($header, $i + 2)); 
    274       $this->http_header[$key] = $value; 
    275     } 
    276     return strlen($header); 
    277   } 
    278    
    279   /** 
    280    * filter text 
    281    */    
    282    function filter_text($text) { return trim(filter_var($text, FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_LOW)); } 
    283     
    284    public function show_details() { return $this->settings; } 
    285     
    286    function getMember() { 
    287         $params = array(); 
    288         $member = $this->get('members/my/', $params, 0); 
     41    /** 
     42     * Set API URLS 
     43     */ 
     44    function accessTokenURL() { 
     45        return $this->access_token_url; 
     46    } 
     47 
     48    function authenticateURL() { 
     49        return $this->authorize_url; 
     50    } 
     51 
     52    function authorizeURL() { 
     53        return $this->authorize_url; 
     54    } 
     55 
     56    function requestTokenURL() { 
     57        return $this->request_token_url; 
     58    } 
     59 
     60    /** 
     61     * Debug helpers 
     62     */ 
     63    function lastStatusCode() { 
     64        return $this->http_status; 
     65    } 
     66 
     67    function lastAPICall() { 
     68        return $this->last_api_call; 
     69    } 
     70 
     71    /** 
     72     * construct Provider oAuth object 
     73     */ 
     74    function __construct( $oauth_token = null, $oauth_token_secret = null ) { 
     75 
     76        $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); 
     77        $this->consumer    = new OAuthConsumer( $this->consumer_key, $this->consumer_secret ); 
     78        //print 'oauth_token:' . $oauth_token; 
     79        //print 'oauth_token_secret:' . $oauth_token_secret; 
     80        if ( ! empty( $oauth_token ) && ! empty( $oauth_token_secret ) ) { 
     81            $this->token = new OAuthConsumer( $oauth_token, $oauth_token_secret ); 
     82        } else { 
     83            $this->token = null; 
     84        } 
     85    } 
     86 
     87    function get_authorise_url( $callback = '', $source = '' ) { 
     88 
     89        $request_token = $this->getRequestToken( $callback ); 
     90 
     91        $_SESSION[ $source . '_oauth_token' ]        = $token = $request_token['oauth_token']; 
     92        $_SESSION[ $source . '_oauth_token_secret' ] = $request_token['oauth_token_secret']; 
     93 
     94        $url = '#'; 
     95        switch ( $this->http_code ) { 
     96            case 200: 
     97                $url = $this->getAuthorizeURL( $token ); 
     98 
     99                return $url; 
     100                break; 
     101        } 
     102 
     103    } 
     104 
     105    /** 
     106     * Get a request_token from Provider 
     107     * 
     108     * @returns a key/value array containing oauth_token and oauth_token_secret 
     109     */ 
     110    function getRequestToken( $oauth_callback = null ) { 
     111        $parameters = array(); 
     112        if ( ! empty( $oauth_callback ) ) { 
     113            $parameters['oauth_callback'] = $oauth_callback; 
     114        } 
     115        $request     = $this->oAuthRequest( $this->requestTokenURL(), 'GET', $parameters ); 
     116        $token       = OAuthUtil::parse_parameters( $request ); 
     117        $this->token = new OAuthConsumer( $token['oauth_token'], $token['oauth_token_secret'] ); 
     118 
     119        return $token; 
     120    } 
     121 
     122    /** 
     123     * Get the authorize URL 
     124     * 
     125     * @returns a string 
     126     */ 
     127    function getAuthorizeURL( $token, $sign_in_with_twitter = true ) { 
     128        if ( is_array( $token ) ) { 
     129            $token = $token['oauth_token']; 
     130        } 
     131        $app_name = isset( $this->app_name ) ? '&name=' . urlencode( $this->app_name ) : ''; 
     132        if ( empty( $sign_in_with_twitter ) ) { 
     133            return $this->authorizeURL() . "?oauth_token={$token}&expiration=never" . $app_name; 
     134        } else { 
     135            return $this->authenticateURL() . "?oauth_token={$token}&expiration=never" . $app_name; 
     136        } 
     137    } 
     138 
     139    /** 
     140     * Exchange request token and secret for an access token and 
     141     * secret, to sign API calls. 
     142     * 
     143     */ 
     144    function getAccessToken( $oauth_verifier = false, $return_uri = null ) { 
     145        $parameters = array(); 
     146        if ( ! empty( $oauth_verifier ) ) { 
     147            $parameters['oauth_verifier'] = $oauth_verifier; 
     148        } 
     149        $request     = $this->oAuthRequest( $this->accessTokenURL(), 'GET', $parameters ); 
     150        $token       = OAuthUtil::parse_parameters( $request ); 
     151        $this->token = new OAuthConsumer( $token['oauth_token'], $token['oauth_token_secret'] ); 
     152 
     153        return $token; 
     154    } 
     155 
     156    /** 
     157     * One time exchange of username and password for access token and secret. 
     158     * 
     159     */ 
     160    function getXAuthToken( $username, $password ) { 
     161        $parameters                    = array(); 
     162        $parameters['x_auth_username'] = $username; 
     163        $parameters['x_auth_password'] = $password; 
     164        $parameters['x_auth_mode']     = 'client_auth'; 
     165        $request                       = $this->oAuthRequest( $this->accessTokenURL(), 'POST', $parameters ); 
     166        $token                         = OAuthUtil::parse_parameters( $request ); 
     167        $this->token                   = new OAuthConsumer( $token['oauth_token'], $token['oauth_token_secret'] ); 
     168 
     169        return $token; 
     170    } 
     171 
     172    /** 
     173     * GET wrapper for oAuthRequest. 
     174     */ 
     175    function get( $url, $parameters = array() ) { 
     176        $response = $this->oAuthRequest( $url, 'GET', $parameters ); 
     177        if ( $this->format === 'json' && $this->decode_json ) { 
     178            return json_decode( $response ); 
     179        } 
     180 
     181        return $response; 
     182    } 
     183 
     184    /** 
     185     * POST wrapper for oAuthRequest. 
     186     */ 
     187    function post( $url, $parameters = array() ) { 
     188        $response = $this->oAuthRequest( $url, 'POST', $parameters ); 
     189        if ( $this->format === 'json' && $this->decode_json ) { 
     190            return json_decode( $response ); 
     191        } 
     192 
     193        return $response; 
     194    } 
     195 
     196    /** 
     197     * DELETE wrapper for oAuthReqeust. 
     198     */ 
     199    function delete( $url, $parameters = array() ) { 
     200        $response = $this->oAuthRequest( $url, 'DELETE', $parameters ); 
     201        if ( $this->format === 'json' && $this->decode_json ) { 
     202            return json_decode( $response ); 
     203        } 
     204 
     205        return $response; 
     206    } 
     207 
     208    function getFormat( $url ) { 
     209        return "{$this->host}{$url}"; 
     210    } 
     211 
     212    /** 
     213     * Format and sign an OAuth / API request 
     214     */ 
     215    function oAuthRequest( $url, $method, $parameters ) { 
     216        if ( strrpos( $url, 'https://' ) !== 0 && strrpos( $url, 'http://' ) !== 0 ) { 
     217            $url = $this->getFormat( $url ); 
     218        } 
     219        $request = OAuthRequest::from_consumer_and_token( $this->consumer, $this->token, $method, $url, $parameters ); 
     220        $request->sign_request( $this->sha1_method, $this->consumer, $this->token ); 
     221        switch ( $method ) { 
     222            case 'GET': 
     223                return $this->http( $request->to_url(), 'GET' ); 
     224            default: 
     225                return $this->http( $request->get_normalized_http_url(), $method, $request->to_postdata() ); 
     226        } 
     227    } 
     228 
     229 
     230    /** 
     231     * Format and sign an OAuth / API request 
     232     */ 
     233    function oAuthRequest2( $url, $method, $parameters ) { 
     234        if ( strrpos( $url, 'https://' ) !== 0 && strrpos( $url, 'http://' ) !== 0 ) { 
     235            $url = $this->getFormat( $url ); 
     236        } 
     237        $defaults                 = array(); 
     238        $token                    = $this->token; 
     239        $defaults['access_token'] = $token->key; 
     240        $parameters               = array_merge( $defaults, $parameters ); 
     241        $request                  = new OAuthRequest( $method, $url, $parameters ); 
     242        switch ( $method ) { 
     243            case 'GET': 
     244                return $this->http( $request->to_url(), 'GET' ); 
     245            default: 
     246                return $this->http( $request->get_normalized_http_url(), $method, $request->to_postdata() ); 
     247        } 
     248    } 
     249 
     250 
     251    /** 
     252     * Make an HTTP request 
     253     * 
     254     * @return API results 
     255     */ 
     256    function http( $url, $method, $postfields = null ) { 
     257        $this->http_info = array(); 
     258        $ci              = curl_init(); 
     259        /* Curl settings */ 
     260        curl_setopt( $ci, CURLOPT_USERAGENT, $this->useragent ); 
     261        curl_setopt( $ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout ); 
     262        curl_setopt( $ci, CURLOPT_TIMEOUT, $this->timeout ); 
     263        curl_setopt( $ci, CURLOPT_RETURNTRANSFER, true ); 
     264        curl_setopt( $ci, CURLOPT_HTTPHEADER, array( 'Expect:' ) ); 
     265        curl_setopt( $ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer ); 
     266        curl_setopt( $ci, CURLOPT_HEADERFUNCTION, array( $this, 'getHeader' ) ); 
     267        curl_setopt( $ci, CURLOPT_HEADER, false ); 
     268 
     269        switch ( $method ) { 
     270            case 'POST': 
     271                curl_setopt( $ci, CURLOPT_POST, true ); 
     272                if ( ! empty( $postfields ) ) { 
     273                    curl_setopt( $ci, CURLOPT_POSTFIELDS, $postfields ); 
     274                } 
     275                break; 
     276            case 'DELETE': 
     277                curl_setopt( $ci, CURLOPT_CUSTOMREQUEST, 'DELETE' ); 
     278                if ( ! empty( $postfields ) ) { 
     279                    $url = "{$url}?{$postfields}"; 
     280                } 
     281        } 
     282        curl_setopt( $ci, CURLOPT_URL, $url ); 
     283        $response        = curl_exec( $ci ); 
     284        $this->http_code = curl_getinfo( $ci, CURLINFO_HTTP_CODE ); 
     285        $this->http_info = array_merge( $this->http_info, curl_getinfo( $ci ) ); 
     286        $this->url       = $url; 
     287        curl_close( $ci ); 
     288 
     289        return $response; 
     290    } 
     291 
     292    /** 
     293     * Get the header info to store. 
     294     */ 
     295    function getHeader( $ch, $header ) { 
     296        $i = strpos( $header, ':' ); 
     297        if ( ! empty( $i ) ) { 
     298            $key                       = str_replace( '-', '_', strtolower( substr( $header, 0, $i ) ) ); 
     299            $value                     = trim( substr( $header, $i + 2 ) ); 
     300            $this->http_header[ $key ] = $value; 
     301        } 
     302 
     303        return strlen( $header ); 
     304    } 
     305 
     306    /** 
     307     * filter text 
     308     */ 
     309    function filter_text( $text ) { 
     310        return trim( filter_var( $text, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW ) ); 
     311    } 
     312 
     313    public function show_details() { 
     314        return $this->settings; 
     315    } 
     316 
     317    function getMember() { 
     318        $params = array(); 
     319        $member = $this->get( 'members/my/', $params, 0 ); 
     320 
    289321        return $member; 
    290322    } 
    291      
    292    function getOrganizations($id = '') { 
    293         $params = array(); 
    294         $all_orgs = $this->get('members/my/organizations/', $params, 0); 
     323 
     324    function getOrganizations( $id = '' ) { 
     325        $params   = array(); 
     326        $all_orgs = $this->get( 'members/my/organizations/', $params, 0 ); 
     327 
    295328        return $all_orgs; 
    296329    } 
    297      
    298     function getOrganization($id) { 
    299         $params = array(); 
    300         $org = $this->get('organizations/'. $id, $params, 0); 
     330 
     331    function getOrganization( $id ) { 
     332        $params = array(); 
     333        $org    = $this->get( 'organizations/' . $id, $params, 0 ); 
     334 
    301335        return $org; 
    302336    } 
    303337 
    304     function getBoards($org) { 
    305         $params = array(); 
    306         if ($org != '1') { 
    307             $url = 'organizations/'. $org. '/boards/'; 
     338    function getBoards( $org ) { 
     339        $params = array(); 
     340        if ( $org != '1' ) { 
     341            $url = 'organizations/' . $org . '/boards/'; 
    308342        } else { 
    309             $url = 'members/my/boards/'; 
    310             $params = array('filter' => 'members'); 
    311         } 
    312          
    313         $all_boards = $this->get($url, $params, 0); 
     343            $url    = 'members/my/boards/'; 
     344            $params = array( 'filter' => 'members' ); 
     345        } 
     346 
     347        $all_boards = $this->get( $url, $params, 0 ); 
     348 
    314349        return $all_boards; 
    315350    } 
    316      
    317     function getBoard($id) { 
    318         $params = array(); 
    319         $board = $this->get('boards/'. $id, $params, 0); 
     351 
     352    function getBoard( $id ) { 
     353        $params = array(); 
     354        $board  = $this->get( 'boards/' . $id, $params, 0 ); 
     355 
    320356        return $board; 
    321357    } 
    322      
    323     function getLists($board) { 
    324         $params = array(); 
    325         $all_lists = $this->get('boards/'. $board .'/lists', $params, 0); 
     358 
     359    function getLists( $board ) { 
     360        $params    = array(); 
     361        $all_lists = $this->get( 'boards/' . $board . '/lists', $params, 0 ); 
     362 
    326363        return $all_lists; 
    327364    } 
    328      
    329     function getList($id) { 
    330         $params = array(); 
    331         $list = $this->get('lists/'. $id, $params, 0); 
     365 
     366    function getList( $id ) { 
     367        $params = array(); 
     368        $list   = $this->get( 'lists/' . $id, $params, 0 ); 
     369 
    332370        return $list; 
    333371    } 
    334      
    335     function getCards($list) { 
    336         $params = array(); 
    337         $all_cards = $this->get('lists/'. $list .'/cards/', $params, 0); 
     372 
     373    function getCards( $list ) { 
     374        $params    = array(); 
     375        $all_cards = $this->get( 'lists/' . $list . '/cards/', $params, 0 ); 
     376 
    338377        return $all_cards; 
    339378    } 
    340      
    341     function getCard($id) { 
    342         $params = array(); 
    343         $card = $this->get('cards/'. $id, $params, 0); 
     379 
     380    function getCard( $id ) { 
     381        $params = array(); 
     382        $card   = $this->get( 'cards/' . $id, $params, 0 ); 
     383 
    344384        return $card; 
    345385    } 
    346      
    347     function getDropdown($data, $object) { 
    348         $select[0] = 'Select '. ucfirst($object); 
    349         if ($object == 'organization') $select[1] = 'My Boards'; 
    350         foreach($data as $item) $select[$item->id] = isset($item->displayName) ? $item->displayName : $item->name; 
     386 
     387    function getDropdown( $data, $object ) { 
     388        $select   = array(); 
     389        $select[] = 'Select ' . ucfirst( $object ); 
     390        if ( empty( $data ) ) { 
     391            return $select; 
     392        } 
     393 
     394        if ( $object == 'organization' ) { 
     395            $select[] = 'My Boards'; 
     396        } 
     397 
     398        foreach ( $data as $item ) { 
     399            $select[ $item->id ] = isset( $item->displayName ) ? $item->displayName : $item->name; 
     400        } 
     401 
    351402        return $select; 
    352403    } 
    353  
    354404} 
  • wp-trello/trunk/includes/wp-settings-framework.php

    r650839 r1479964  
    22/** 
    33 * WordPress Settings Framework 
    4  *  
    5  * @author Gilbert Pellegrom 
    6  * @link https://github.com/gilbitron/WordPress-Settings-Framework 
     4 * 
     5 * @author  Gilbert Pellegrom 
     6 * @link    https://github.com/gilbitron/WordPress-Settings-Framework 
    77 * @version 1.4 
    88 * @license MIT 
    99 */ 
    1010 
    11 if( !class_exists('wpt_WordPressSettingsFramework') ){ 
    12     /** 
    13      * WordPressSettingsFramework class 
    14      */ 
    15     class wpt_WordPressSettingsFramework { 
    16      
    17         /** 
    18          * @access private 
    19          * @var string  
    20          */ 
    21         private $option_group; 
    22      
    23         /** 
    24          * Constructor 
    25          *  
    26          * @param string path to settings file 
    27          * @param string optional "option_group" override 
    28          */ 
    29         function __construct( $settings_file, $option_group = '' ) 
    30         { 
    31             if( !is_file( $settings_file ) ) return; 
    32             require_once( $settings_file ); 
    33              
    34             $this->option_group = preg_replace("/[^a-z0-9]+/i", "", basename( $settings_file, '.php' )); 
    35             if( $option_group ) $this->option_group = $option_group; 
    36               
    37             add_action('admin_init', array(&$this, 'admin_init')); 
    38             add_action('admin_notices', array(&$this, 'admin_notices')); 
    39             add_action('admin_enqueue_scripts', array(&$this, 'admin_enqueue_scripts')); 
    40         } 
    41          
    42         /** 
    43          * Get the option group for this instance 
    44          *  
    45          * @return string the "option_group" 
    46          */ 
    47         function get_option_group() 
    48         { 
    49             return $this->option_group; 
    50         } 
    51          
    52         /** 
    53          * Registers the internal WordPress settings 
    54          */ 
    55         function admin_init() 
    56         { 
    57             register_setting( $this->option_group, $this->option_group .'_settings', array(&$this, 'settings_validate') ); 
    58             $this->process_settings(); 
    59         } 
    60          
    61         /** 
    62          * Displays any errors from the WordPress settings API 
    63          */ 
    64         function admin_notices() 
    65         { 
    66             //settings_errors(); 
    67         } 
    68          
    69         /** 
    70          * Enqueue scripts and styles 
    71          */ 
    72         function admin_enqueue_scripts() 
    73         { 
    74             wp_enqueue_style('farbtastic'); 
    75             wp_enqueue_style('thickbox'); 
    76              
    77             wp_enqueue_script('jquery'); 
    78             wp_enqueue_script('farbtastic'); 
    79             wp_enqueue_script('media-upload'); 
    80             wp_enqueue_script('thickbox'); 
    81         } 
    82          
    83         /** 
    84          * Adds a filter for settings validation 
    85          *  
    86          * @param array the un-validated settings 
    87          * @return array the validated settings 
    88          */ 
    89         function settings_validate( $input ) 
    90         { 
    91             return apply_filters( $this->option_group .'_settings_validate', $input ); 
    92         } 
    93          
    94         /** 
    95          * Displays the "section_description" if speicified in $wptsf_settings 
    96          * 
    97          * @param array callback args from add_settings_section() 
    98          */ 
    99         function section_intro( $args ) 
    100         { 
    101             global $wptsf_settings; 
    102             if(!empty($wptsf_settings)){ 
    103                 foreach($wptsf_settings as $section){ 
    104                     if($section['section_id'] == $args['id']){ 
    105                         if(isset($section['section_description']) && $section['section_description']) echo '<p>'. $section['section_description'] .'</p>'; 
    106                         break; 
    107                     } 
    108                 } 
    109             } 
    110         } 
    111          
    112         /** 
    113          * Processes $wptsf_settings and adds the sections and fields via the WordPress settings API 
    114          */ 
    115         function process_settings() 
    116         { 
    117             global $wptsf_settings; 
    118             if(!empty($wptsf_settings)){ 
    119                 usort($wptsf_settings, array(&$this, 'sort_array')); 
    120                 foreach($wptsf_settings as $section){ 
    121                     if(isset($section['section_id']) && $section['section_id'] && isset($section['section_title'])){ 
    122                         add_settings_section( $section['section_id'], $section['section_title'], array(&$this, 'section_intro'), $this->option_group ); 
    123                         if(isset($section['fields']) && is_array($section['fields']) && !empty($section['fields'])){ 
    124                             foreach($section['fields'] as $field){ 
    125                                 if(isset($field['id']) && $field['id'] && isset($field['title'])){ 
    126                                     add_settings_field( $field['id'], $field['title'], array(&$this, 'generate_setting'), $this->option_group, $section['section_id'], array('section' => $section, 'field' => $field) ); 
    127                                 } 
    128                             } 
    129                         } 
    130                     } 
    131                 } 
    132             } 
    133         } 
    134          
    135         /** 
    136          * Usort callback. Sorts $wptsf_settings by "section_order" 
    137          *  
    138          * @param mixed section order a 
    139          * @param mixed section order b 
    140          * @return int order 
    141          */ 
    142         function sort_array( $a, $b ) 
    143         { 
    144             return $a['section_order'] > $b['section_order']; 
    145         } 
    146          
    147         /** 
    148          * Generates the HTML output of the settings fields 
    149          * 
    150          * @param array callback args from add_settings_field() 
    151          */ 
    152         function generate_setting( $args ) 
    153         { 
    154             $section = $args['section']; 
    155             $defaults = array( 
    156                 'id'      => 'default_field', 
    157                 'title'   => 'Default Field', 
    158                 'desc'    => '', 
    159                 'std'     => '', 
    160                 'type'    => 'text', 
    161                 'choices' => array(), 
    162                 'class'   => '' 
    163             ); 
    164             $defaults = apply_filters( 'wpsf_defaults', $defaults ); 
    165             extract( wp_parse_args( $args['field'], $defaults ) ); 
    166              
    167             $options = get_option( $this->option_group .'_settings' ); 
    168             $el_id = $this->option_group .'_'. $section['section_id'] .'_'. $id; 
    169             $val = (isset($options[$el_id])) ? $options[$el_id] : $std; 
    170              
    171             do_action('wpsf_before_field'); 
    172             do_action('wpsf_before_field_'. $el_id); 
    173             switch( $type ){ 
    174                 case 'text': 
    175                     $val = esc_attr(stripslashes($val)); 
    176                     echo '<input type="text" name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" value="'. $val .'" class="regular-text '. $class .'" />'; 
    177                     if($desc)  echo '<p class="description">'. $desc .'</p>'; 
    178                     break; 
    179                 case 'textarea': 
    180                     $val = esc_html(stripslashes($val)); 
    181                     echo '<textarea name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" rows="5" cols="60" class="'. $class .'">'. $val .'</textarea>'; 
    182                     if($desc)  echo '<p class="description">'. $desc .'</p>'; 
    183                     break; 
    184                 case 'select': 
    185                     $val = esc_html(esc_attr($val)); 
    186                     echo '<select name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" class="'. $class .'">'; 
    187                     foreach($choices as $ckey=>$cval){ 
    188                         echo '<option value="'. $ckey .'"'. (($ckey == $val) ? ' selected="selected"' : '') .'>'. $cval .'</option>'; 
    189                     } 
    190                     echo '</select>'; 
    191                     if($desc)  echo '<p class="description">'. $desc .'</p>'; 
    192                     break; 
    193                 case 'radio': 
    194                     $val = esc_html(esc_attr($val)); 
    195                     foreach($choices as $ckey=>$cval){ 
    196                         echo '<span><input type="radio" name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'_'. $ckey .'" value="'. $ckey .'" class="'. $class .'"'. (($ckey == $val) ? ' checked="checked"' : '') .' /> '. $cval .'</span><br />'; 
    197                     } 
    198                     if($desc)  echo '<p class="description">'. $desc .'</p>'; 
    199                     break; 
    200                 case 'checkbox': 
    201                     $val = esc_attr(stripslashes($val)); 
    202                     echo '<input type="hidden" name="'. $this->option_group .'_settings['. $el_id .']" value="0" />'; 
    203                     echo '<span><input type="checkbox" name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" value="1" class="'. $class .'"'. (($val) ? ' checked="checked"' : '') .' /> '. $desc .'</span>'; 
    204                     break; 
    205                 case 'checkboxes': 
    206                     foreach($choices as $ckey=>$cval){ 
    207                         $val = ''; 
    208                         if(isset($options[$el_id .'_'. $ckey])) $val = $options[$el_id .'_'. $ckey]; 
    209                         elseif(is_array($std) && in_array($ckey, $std)) $val = $ckey; 
    210                         $val = esc_html(esc_attr($val)); 
    211                         echo '<input type="hidden" name="'. $this->option_group .'_settings['. $el_id .'_'. $ckey .']" value="0" />'; 
    212                         echo '<span><input type="checkbox" name="'. $this->option_group .'_settings['. $el_id .'_'. $ckey .']" id="'. $el_id .'_'. $ckey .'" value="'. $ckey .'" class="'. $class .'"'. (($ckey == $val) ? ' checked="checked"' : '') .' /> '. $cval .'</span><br />'; 
    213                     } 
    214                     if($desc)  echo '<p class="description">'. $desc .'</p>'; 
    215                     break; 
    216                 case 'color': 
    217                     $val = esc_attr(stripslashes($val)); 
    218                     echo '<div style="position:relative;">'; 
    219                     echo '<input type="text" name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" value="'. $val .'" class="'. $class .'" />'; 
    220                     echo '<div id="'. $el_id .'_cp" style="position:absolute;top:0;left:190px;background:#fff;z-index:9999;"></div>'; 
    221                     if($desc)  echo '<p class="description">'. $desc .'</p>'; 
    222                     echo '<script type="text/javascript"> 
     11if ( ! class_exists( 'wpt_WordPressSettingsFramework' ) ) { 
     12    /** 
     13     * WordPressSettingsFramework class 
     14     */ 
     15    class wpt_WordPressSettingsFramework { 
     16 
     17        /** 
     18         * @access private 
     19         * @var string 
     20         */ 
     21        private $option_group; 
     22 
     23        /** 
     24         * Constructor 
     25         * 
     26         * @param string path to settings file 
     27         * @param string optional "option_group" override 
     28         */ 
     29        function __construct( $settings_file, $option_group = '' ) { 
     30            if ( ! is_file( $settings_file ) ) { 
     31                return; 
     32            } 
     33            require_once( $settings_file ); 
     34 
     35            $this->option_group = preg_replace( "/[^a-z0-9]+/i", "", basename( $settings_file, '.php' ) ); 
     36            if ( $option_group ) { 
     37                $this->option_group = $option_group; 
     38            } 
     39 
     40            add_action( 'admin_init', array( &$this, 'admin_init' ) ); 
     41            add_action( 'admin_notices', array( &$this, 'admin_notices' ) ); 
     42            add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) ); 
     43        } 
     44 
     45        /** 
     46         * Get the option group for this instance 
     47         * 
     48         * @return string the "option_group" 
     49         */ 
     50        function get_option_group() { 
     51            return $this->option_group; 
     52        } 
     53 
     54        /** 
     55         * Registers the internal WordPress settings 
     56         */ 
     57        function admin_init() { 
     58            register_setting( $this->option_group, $this->option_group . '_settings', array( 
     59                &$this, 
     60                'settings_validate', 
     61            ) ); 
     62            $this->process_settings(); 
     63        } 
     64 
     65        /** 
     66         * Displays any errors from the WordPress settings API 
     67         */ 
     68        function admin_notices() { 
     69            //settings_errors(); 
     70        } 
     71 
     72        /** 
     73         * Enqueue scripts and styles 
     74         */ 
     75        function admin_enqueue_scripts() { 
     76            wp_enqueue_style( 'farbtastic' ); 
     77            wp_enqueue_style( 'thickbox' ); 
     78 
     79            wp_enqueue_script( 'jquery' ); 
     80            wp_enqueue_script( 'farbtastic' ); 
     81            wp_enqueue_script( 'media-upload' ); 
     82            wp_enqueue_script( 'thickbox' ); 
     83        } 
     84 
     85        /** 
     86         * Adds a filter for settings validation 
     87         * 
     88         * @param array the un-validated settings 
     89         * 
     90         * @return array the validated settings 
     91         */ 
     92        function settings_validate( $input ) { 
     93            return apply_filters( $this->option_group . '_settings_validate', $input ); 
     94        } 
     95 
     96        /** 
     97         * Displays the "section_description" if speicified in $wptsf_settings 
     98         * 
     99         * @param array callback args from add_settings_section() 
     100         */ 
     101        function section_intro( $args ) { 
     102            global $wptsf_settings; 
     103            if ( ! empty( $wptsf_settings ) ) { 
     104                foreach ( $wptsf_settings as $section ) { 
     105                    if ( $section['section_id'] == $args['id'] ) { 
     106                        if ( isset( $section['section_description'] ) && $section['section_description'] ) { 
     107                            echo '<p>' . $section['section_description'] . '</p>'; 
     108                        } 
     109                        break; 
     110                    } 
     111                } 
     112            } 
     113        } 
     114 
     115        /** 
     116         * Processes $wptsf_settings and adds the sections and fields via the WordPress settings API 
     117         */ 
     118        function process_settings() { 
     119            global $wptsf_settings; 
     120            if ( ! empty( $wptsf_settings ) ) { 
     121                usort( $wptsf_settings, array( &$this, 'sort_array' ) ); 
     122                foreach ( $wptsf_settings as $section ) { 
     123                    if ( isset( $section['section_id'] ) && $section['section_id'] && isset( $section['section_title'] ) ) { 
     124                        add_settings_section( $section['section_id'], $section['section_title'], array( 
     125                            &$this, 
     126                            'section_intro', 
     127                        ), $this->option_group ); 
     128                        if ( isset( $section['fields'] ) && is_array( $section['fields'] ) && ! empty( $section['fields'] ) ) { 
     129                            foreach ( $section['fields'] as $field ) { 
     130                                if ( isset( $field['id'] ) && $field['id'] && isset( $field['title'] ) ) { 
     131                                    add_settings_field( $field['id'], $field['title'], array( 
     132                                        &$this, 
     133                                        'generate_setting', 
     134                                    ), $this->option_group, $section['section_id'], array( 
     135                                        'section' => $section, 
     136                                        'field'   => $field, 
     137                                    ) ); 
     138                                } 
     139                            } 
     140                        } 
     141                    } 
     142                } 
     143            } 
     144        } 
     145 
     146        /** 
     147         * Usort callback. Sorts $wptsf_settings by "section_order" 
     148         * 
     149         * @param mixed section order a 
     150         * @param mixed section order b 
     151         * 
     152         * @return int order 
     153         */ 
     154        function sort_array( $a, $b ) { 
     155            return $a['section_order'] > $b['section_order']; 
     156        } 
     157 
     158        /** 
     159         * Generates the HTML output of the settings fields 
     160         * 
     161         * @param array callback args from add_settings_field() 
     162         */ 
     163        function generate_setting( $args ) { 
     164            global $wp_trello; 
     165 
     166            $section  = $args['section']; 
     167            $defaults = array( 
     168                'id'      => 'default_field', 
     169                'title'   => 'Default Field', 
     170                'desc'    => '', 
     171                'std'     => '', 
     172                'type'    => 'text', 
     173                'choices' => array(), 
     174                'class'   => '', 
     175            ); 
     176            $defaults = apply_filters( 'wpsf_defaults', $defaults ); 
     177            extract( wp_parse_args( $args['field'], $defaults ) ); 
     178 
     179            $options = get_option( $this->option_group . '_settings' ); 
     180            $el_id   = $this->option_group . '_' . $section['section_id'] . '_' . $id; 
     181            $val     = ( isset( $options[ $el_id ] ) ) ? $options[ $el_id ] : $std; 
     182 
     183            do_action( 'wpsf_before_field' ); 
     184            do_action( 'wpsf_before_field_' . $el_id ); 
     185            switch ( $type ) { 
     186                case 'text': 
     187                    $val = esc_attr( stripslashes( $val ) ); 
     188                    echo '<input type="text" name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" value="' . $val . '" class="regular-text ' . $class . '" />'; 
     189                    if ( $desc ) { 
     190                        echo '<p class="description">' . $desc . '</p>'; 
     191                    } 
     192                    break; 
     193                case 'textarea': 
     194                    $val = esc_html( stripslashes( $val ) ); 
     195                    echo '<textarea name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" rows="5" cols="60" class="' . $class . '">' . $val . '</textarea>'; 
     196                    if ( $desc ) { 
     197                        echo '<p class="description">' . $desc . '</p>'; 
     198                    } 
     199                    break; 
     200                case 'select': 
     201                    $val = esc_html( esc_attr( $val ) ); 
     202                    echo '<select name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" class="' . $class . '">'; 
     203                    foreach ( $choices as $ckey => $cval ) { 
     204                        echo '<option value="' . $ckey . '"' . ( ( $ckey == $val ) ? ' selected="selected"' : '' ) . '>' . $cval . '</option>'; 
     205                    } 
     206                    echo '</select>'; 
     207                    if ( $desc ) { 
     208                        echo '<p class="description">' . $desc . '</p>'; 
     209                    } 
     210                    break; 
     211                case 'radio': 
     212                    $val = esc_html( esc_attr( $val ) ); 
     213                    foreach ( $choices as $ckey => $cval ) { 
     214                        echo '<span><input type="radio" name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '_' . $ckey . '" value="' . $ckey . '" class="' . $class . '"' . ( ( $ckey == $val ) ? ' checked="checked"' : '' ) . ' /> ' . $cval . '</span><br />'; 
     215                    } 
     216                    if ( $desc ) { 
     217                        echo '<p class="description">' . $desc . '</p>'; 
     218                    } 
     219                    break; 
     220                case 'checkbox': 
     221                    $val = esc_attr( stripslashes( $val ) ); 
     222                    echo '<input type="hidden" name="' . $this->option_group . '_settings[' . $el_id . ']" value="0" />'; 
     223                    echo '<span><input type="checkbox" name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" value="1" class="' . $class . '"' . ( ( $val ) ? ' checked="checked"' : '' ) . ' /> ' . $desc . '</span>'; 
     224                    break; 
     225                case 'checkboxes': 
     226                    foreach ( $choices as $ckey => $cval ) { 
     227                        $val = ''; 
     228                        if ( isset( $options[ $el_id . '_' . $ckey ] ) ) { 
     229                            $val = $options[ $el_id . '_' . $ckey ]; 
     230                        } elseif ( is_array( $std ) && in_array( $ckey, $std ) ) { 
     231                            $val = $ckey; 
     232                        } 
     233                        $val = esc_html( esc_attr( $val ) ); 
     234                        echo '<input type="hidden" name="' . $this->option_group . '_settings[' . $el_id . '_' . $ckey . ']" value="0" />'; 
     235                        echo '<span><input type="checkbox" name="' . $this->option_group . '_settings[' . $el_id . '_' . $ckey . ']" id="' . $el_id . '_' . $ckey . '" value="' . $ckey . '" class="' . $class . '"' . ( ( $ckey == $val ) ? ' checked="checked"' : '' ) . ' /> ' . $cval . '</span><br />'; 
     236                    } 
     237                    if ( $desc ) { 
     238                        echo '<p class="description">' . $desc . '</p>'; 
     239                    } 
     240                    break; 
     241                case 'color': 
     242                    $val = esc_attr( stripslashes( $val ) ); 
     243                    echo '<div style="position:relative;">'; 
     244                    echo '<input type="text" name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" value="' . $val . '" class="' . $class . '" />'; 
     245                    echo '<div id="' . $el_id . '_cp" style="position:absolute;top:0;left:190px;background:#fff;z-index:9999;"></div>'; 
     246                    if ( $desc ) { 
     247                        echo '<p class="description">' . $desc . '</p>'; 
     248                    } 
     249                    echo '<script type="text/javascript"> 
    223250                    jQuery(document).ready(function($){  
    224                         var colorPicker = $("#'. $el_id .'_cp"); 
    225                         colorPicker.farbtastic("#'. $el_id .'"); 
     251                        var colorPicker = $("#' . $el_id . '_cp"); 
     252                        colorPicker.farbtastic("#' . $el_id . '"); 
    226253                        colorPicker.hide(); 
    227                         $("#'. $el_id .'").live("focus", function(){ 
     254                        $("#' . $el_id . '").live("focus", function(){ 
    228255                            colorPicker.show(); 
    229256                        }); 
    230                         $("#'. $el_id .'").live("blur", function(){ 
     257                        $("#' . $el_id . '").live("blur", function(){ 
    231258                            colorPicker.hide(); 
    232259                            if($(this).val() == "") $(this).val("#"); 
     
    234261                    }); 
    235262                    </script></div>'; 
    236                     break; 
    237                 case 'file': 
    238                     $val = esc_attr($val); 
    239                     echo '<input type="text" name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" value="'. $val .'" class="regular-text '. $class .'" /> '; 
    240                     echo '<input type="button" class="button wpsf-browse" id="'. $el_id .'_button" value="Browse" />'; 
    241                     echo '<script type="text/javascript"> 
     263                    break; 
     264                case 'file': 
     265                    $val = esc_attr( $val ); 
     266                    echo '<input type="text" name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" value="' . $val . '" class="regular-text ' . $class . '" /> '; 
     267                    echo '<input type="button" class="button wpsf-browse" id="' . $el_id . '_button" value="Browse" />'; 
     268                    echo '<script type="text/javascript"> 
    242269                    jQuery(document).ready(function($){ 
    243                         $("#'. $el_id .'_button").click(function() { 
     270                        $("#' . $el_id . '_button").click(function() { 
    244271                            tb_show("", "media-upload.php?post_id=0&amp;type=image&amp;TB_iframe=true"); 
    245272                            window.original_send_to_editor = window.send_to_editor; 
    246273                            window.send_to_editor = function(html) { 
    247274                                var imgurl = $("img",html).attr("src"); 
    248                                 $("#'. $el_id .'").val(imgurl); 
     275                                $("#' . $el_id . '").val(imgurl); 
    249276                                tb_remove(); 
    250277                                window.send_to_editor = window.original_send_to_editor; 
     
    254281                    }); 
    255282                    </script>'; 
    256                     break; 
    257                 case 'editor': 
    258                     wp_editor( $val, $el_id, array( 'textarea_name' => $this->option_group .'_settings['. $el_id .']' ) ); 
    259                     if($desc)  echo '<p class="description">'. $desc .'</p>'; 
    260                     break; 
    261                 case 'custom': 
    262                     echo $std; 
    263                     break; 
    264                 case 'organizations': 
    265                     $access_token = wp_trello::get_access_token(); 
    266                     $disabled = ''; 
    267                     if ($access_token == '') { 
    268                         $choices = array(0 => 'Connect with Trello'); 
    269                         $disabled = ' disabled="disabled"'; 
    270                     } else { 
    271                         $trello = new trello_oauth($access_token['oauth_token'], $access_token['oauth_token_secret']); 
    272                         $orgs = $trello->getOrganizations(); 
    273                         $choices = $trello->getDropdown($orgs, 'organization'); 
    274                     } 
    275                     $val = esc_html(esc_attr($val)); 
    276                     echo '<select name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" class="'. $class .'"'. $disabled .'>'; 
    277                     foreach($choices as $ckey=>$cval){ 
    278                         echo '<option value="'. $ckey .'">'. $cval .'</option>'; 
    279                     } 
    280                     echo '</select>  ID: <span id="org-id"></span>'; 
    281                     if($desc)  echo '<p class="description">'. $desc .'</p>'; 
    282                     break; 
    283                 case 'boards': 
    284                     echo '<select name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" class="'. $class .'" disabled="disabled">'; 
    285                     echo '<option value="0">Select Board</option>'; 
    286                     echo '</select>  ID: <span id="board-id"></span>'; 
    287                     break; 
    288                 case 'lists': 
    289                     echo '<select name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" class="'. $class .'" disabled="disabled">'; 
    290                     echo '<option value="0">Select List</option>'; 
    291                     echo '</select>  ID: <span id="list-id"></span>'; 
    292                     break; 
    293                 case 'cards': 
    294                     echo '<select name="'. $this->option_group .'_settings['. $el_id .']" id="'. $el_id .'" class="'. $class .'" disabled="disabled">'; 
    295                     echo '<option value="0">Select Card</option>'; 
    296                     echo '</select>  ID: <span id="card-id"></span>'; 
    297                     break; 
    298  
    299                 default: 
    300                     break; 
    301             } 
    302             do_action('wpsf_after_field'); 
    303             do_action('wpsf_after_field_'. $el_id); 
    304         } 
    305      
    306         /** 
    307          * Output the settings form 
    308          */ 
    309         function settings() 
    310         { 
    311             do_action('wpsf_before_settings'); 
    312             ?> 
    313             <form action="options.php" method="post"> 
    314                 <?php do_action('wpsf_before_settings_fields'); ?> 
    315                 <?php settings_fields( $this->option_group ); ?> 
    316                 <?php do_settings_sections( $this->option_group ); ?> 
    317                 <p class="submit"><input type="submit" class="button-primary" value="<?php _e( 'Save Changes' ); ?>" /></p> 
     283                    break; 
     284                case 'editor': 
     285                    wp_editor( $val, $el_id, array( 'textarea_name' => $this->option_group . '_settings[' . $el_id . ']' ) ); 
     286                    if ( $desc ) { 
     287                        echo '<p class="description">' . $desc . '</p>'; 
     288                    } 
     289                    break; 
     290                case 'custom': 
     291                    echo $std; 
     292                    break; 
     293                case 'organizations': 
     294                    $access_token = $wp_trello->get_access_token(); 
     295                    $disabled     = ''; 
     296                    if ( $access_token == '' ) { 
     297                        $choices  = array( 0 => 'Connect with Trello' ); 
     298                        $disabled = ' disabled="disabled"'; 
     299                    } else { 
     300                        $trello  = new trello_oauth( $access_token['oauth_token'], $access_token['oauth_token_secret'] ); 
     301                        $orgs    = $trello->getOrganizations(); 
     302                        $choices = $trello->getDropdown( $orgs, 'organization' ); 
     303                    } 
     304                    $val = esc_html( esc_attr( $val ) ); 
     305                    echo '<select name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" class="' . $class . '"' . $disabled . '>'; 
     306                    foreach ( $choices as $ckey => $cval ) { 
     307                        echo '<option value="' . $ckey . '">' . $cval . '</option>'; 
     308                    } 
     309                    echo '</select>  ID: <span id="org-id"></span>'; 
     310                    if ( $desc ) { 
     311                        echo '<p class="description">' . $desc . '</p>'; 
     312                    } 
     313                    break; 
     314                case 'boards': 
     315                    echo '<select name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" class="' . $class . '" disabled="disabled">'; 
     316                    echo '<option value="0">Select Board</option>'; 
     317                    echo '</select>  ID: <span id="board-id"></span>'; 
     318                    break; 
     319                case 'lists': 
     320                    echo '<select name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" class="' . $class . '" disabled="disabled">'; 
     321                    echo '<option value="0">Select List</option>'; 
     322                    echo '</select>  ID: <span id="list-id"></span>'; 
     323                    break; 
     324                case 'cards': 
     325                    echo '<select name="' . $this->option_group . '_settings[' . $el_id . ']" id="' . $el_id . '" class="' . $class . '" disabled="disabled">'; 
     326                    echo '<option value="0">Select Card</option>'; 
     327                    echo '</select>  ID: <span id="card-id"></span>'; 
     328                    break; 
     329 
     330                default: 
     331                    break; 
     332            } 
     333            do_action( 'wpsf_after_field' ); 
     334            do_action( 'wpsf_after_field_' . $el_id ); 
     335        } 
     336 
     337        /** 
     338         * Output the settings form 
     339         */ 
     340        function settings() { 
     341            do_action( 'wpsf_before_settings' ); 
     342            ?> 
     343            <form action="options.php" method="post"> 
     344                <?php do_action( 'wpsf_before_settings_fields' ); ?> 
     345                <?php settings_fields( $this->option_group ); ?> 
     346                <?php do_settings_sections( $this->option_group ); ?> 
     347                <p class="submit"><input type="submit" class="button-primary" value="<?php _e( 'Save Changes' ); ?>" /> 
     348                </p> 
    318349            </form> 
    319             <?php 
    320             do_action('wpsf_after_settings'); 
    321         } 
    322      
    323     }    
     350            <?php 
     351            do_action( 'wpsf_after_settings' ); 
     352        } 
     353 
     354    } 
    324355} 
    325356 
    326 if( !function_exists('wpsf_get_option_group') ){ 
    327     /** 
    328      * Converts the settings file name to option group id 
    329      *  
    330      * @param string settings file 
    331      * @return string option group id 
    332      */ 
    333     function wpsf_get_option_group( $settings_file ){ 
    334         $option_group = preg_replace("/[^a-z0-9]+/i", "", basename( $settings_file, '.php' )); 
    335         return $option_group; 
    336     } 
     357if ( ! function_exists( 'wpsf_get_option_group' ) ) { 
     358    /** 
     359     * Converts the settings file name to option group id 
     360     * 
     361     * @param string settings file 
     362     * 
     363     * @return string option group id 
     364     */ 
     365    function wpsf_get_option_group( $settings_file ) { 
     366        $option_group = preg_replace( "/[^a-z0-9]+/i", "", basename( $settings_file, '.php' ) ); 
     367 
     368        return $option_group; 
     369    } 
    337370} 
    338371 
    339 if( !function_exists('wpsf_get_settings') ){ 
    340     /** 
    341      * Get the settings from a settings file/option group 
    342      *  
    343      * @param string path to settings file 
    344      * @param string optional "option_group" override 
    345      * @return array settings 
    346      */ 
    347     function wpsf_get_settings( $settings_file, $option_group = '' ){ 
    348         $opt_group = preg_replace("/[^a-z0-9]+/i", "", basename( $settings_file, '.php' )); 
    349         if( $option_group ) $opt_group = $option_group; 
    350         return get_option( $opt_group .'_settings' ); 
    351     } 
     372if ( ! function_exists( 'wpsf_get_settings' ) ) { 
     373    /** 
     374     * Get the settings from a settings file/option group 
     375     * 
     376     * @param string path to settings file 
     377     * @param string optional "option_group" override 
     378     * 
     379     * @return array settings 
     380     */ 
     381    function wpsf_get_settings( $settings_file, $option_group = '' ) { 
     382        $opt_group = preg_replace( "/[^a-z0-9]+/i", "", basename( $settings_file, '.php' ) ); 
     383        if ( $option_group ) { 
     384            $opt_group = $option_group; 
     385        } 
     386 
     387        return get_option( $opt_group . '_settings' ); 
     388    } 
    352389} 
    353390 
    354 if( !function_exists('wpsf_get_setting') ){ 
    355     /** 
    356      * Get a setting from an option group 
    357      *  
    358      * @param string option group id 
    359      * @param string section id 
    360      * @param string field id 
    361      * @return mixed setting or false if no setting exists 
    362      */ 
    363     function wpsf_get_setting( $option_group, $section_id, $field_id ){ 
    364         $options = get_option( $option_group .'_settings' ); 
    365         if(isset($options[$option_group .'_'. $section_id .'_'. $field_id])) return $options[$option_group .'_'. $section_id .'_'. $field_id]; 
    366         return false; 
    367     } 
     391if ( ! function_exists( 'wpsf_get_setting' ) ) { 
     392    /** 
     393     * Get a setting from an option group 
     394     * 
     395     * @param string option group id 
     396     * @param string section id 
     397     * @param string field id 
     398     * 
     399     * @return mixed setting or false if no setting exists 
     400     */ 
     401    function wpsf_get_setting( $option_group, $section_id, $field_id ) { 
     402        $options = get_option( $option_group . '_settings' ); 
     403        if ( isset( $options[ $option_group . '_' . $section_id . '_' . $field_id ] ) ) { 
     404            return $options[ $option_group . '_' . $section_id . '_' . $field_id ]; 
     405        } 
     406 
     407        return false; 
     408    } 
    368409} 
    369410 
    370 if( !function_exists('wpsf_delete_settings') ){ 
    371     /** 
    372      * Delete all the saved settings from a settings file/option group 
    373      *  
    374      * @param string path to settings file 
    375      * @param string optional "option_group" override 
    376      */ 
    377     function wpsf_delete_settings( $settings_file, $option_group = '' ){ 
    378         $opt_group = preg_replace("/[^a-z0-9]+/i", "", basename( $settings_file, '.php' )); 
    379         if( $option_group ) $opt_group = $option_group; 
    380         delete_option( $opt_group .'_settings' ); 
    381     } 
     411if ( ! function_exists( 'wpsf_delete_settings' ) ) { 
     412    /** 
     413     * Delete all the saved settings from a settings file/option group 
     414     * 
     415     * @param string path to settings file 
     416     * @param string optional "option_group" override 
     417     */ 
     418    function wpsf_delete_settings( $settings_file, $option_group = '' ) { 
     419        $opt_group = preg_replace( "/[^a-z0-9]+/i", "", basename( $settings_file, '.php' ) ); 
     420        if ( $option_group ) { 
     421            $opt_group = $option_group; 
     422        } 
     423        delete_option( $opt_group . '_settings' ); 
     424    } 
    382425} 
    383  
    384 ?> 
  • wp-trello/trunk/includes/wpt-settings.php

    r650839 r1479964  
    77// General Settings section 
    88$wptsf_settings[] = array( 
    9     'section_id' => 'general', 
    10     'section_title' => 'General Settings', 
    11     'section_order' => 1, 
    12     'fields' => array( 
    13         array( 
    14             'id' => 'target-blank', 
    15             'title' => __( 'Open Links in New Page', $plugin_l10n ), 
    16             'desc' => __( '', $plugin_l10n ), 
    17             'type' => 'checkbox', 
    18             'std' => false 
    19         ), 
    20         array( 
    21             'id' => 'output-css', 
    22             'title' => __( 'Custom CSS', $plugin_l10n ), 
    23             'desc' => __( 'Customise the output of the plugin with your own CSS.<br/><br/>You can use the following classes (replace [type] with board or card etc).<br/>.wpt-[type]-wrapper, ul.wpt-[type]-wrapper<br/>.wpt-[type], li.wpt-[type]<br/>.wpt-[type]-link', $plugin_l10n ), 
    24             'type' => 'textarea', 
    25             'std' => '' 
    26         ), 
    27         array( 
    28             'id' => 'link-love', 
    29             'title' => __( 'Link Love', $plugin_l10n ), 
    30             'desc' => __( 'Adds a link to the plugin page after the plugin output.', $plugin_l10n ), 
    31             'type' => 'checkbox', 
    32             'std' => false 
    33         ), 
     9    'section_id'    => 'general', 
     10    'section_title' => 'General Settings', 
     11    'section_order' => 1, 
     12    'fields'        => array( 
     13        array( 
     14            'id'    => 'target-blank', 
     15            'title' => __( 'Open Links in New Page', $plugin_l10n ), 
     16            'desc' => __( '', $plugin_l10n ), 
     17            'type' => 'checkbox', 
     18            'std'   => false, 
     19        ), 
     20        array( 
     21            'id'    => 'output-css', 
     22            'title' => __( 'Custom CSS', $plugin_l10n ), 
     23            'desc' => __( 'Customise the output of the plugin with your own CSS.<br/><br/>You can use the following classes (replace [type] with board or card etc).<br/>.wpt-[type]-wrapper, ul.wpt-[type]-wrapper<br/>.wpt-[type], li.wpt-[type]<br/>.wpt-[type]-link', $plugin_l10n ), 
     24            'type' => 'textarea', 
     25            'std'   => '', 
     26        ), 
     27        array( 
     28            'id'    => 'link-love', 
     29            'title' => __( 'Link Love', $plugin_l10n ), 
     30            'desc' => __( 'Adds a link to the plugin page after the plugin output.', $plugin_l10n ), 
     31            'type' => 'checkbox', 
     32            'std'   => false, 
     33        ), 
    3434 
    35     ) 
     35    ), 
    3636); 
    3737// API Helper section 
    3838$wptsf_settings[] = array( 
    39     'section_id' => 'helper', 
    40     'section_title' => 'API Helper', 
    41     'section_order' => 2, 
    42     'fields' => array( 
    43         array( 
    44             'id' => 'orgs', 
    45             'title' => __( 'Organizations', $plugin_l10n ), 
    46             'desc' => __( '', $plugin_l10n ), 
    47             'type' => 'organizations', 
    48             'choices' => array(), 
    49             'std' => '' 
    50         ), 
    51         array( 
    52             'id' => 'boards', 
    53             'title' => __( 'Boards', $plugin_l10n ), 
    54             'desc' => __( '', $plugin_l10n ), 
    55             'type' => 'boards', 
    56             'choices' => array(), 
    57             'std' => '' 
    58         ), 
    59         array( 
    60             'id' => 'lists', 
    61             'title' => __( 'Lists', $plugin_l10n ), 
    62             'desc' => __( '', $plugin_l10n ), 
    63             'type' => 'lists', 
    64             'choices' => array(), 
    65             'std' => '' 
    66         ), 
    67         array( 
    68             'id' => 'cards', 
    69             'title' => __( 'Cards', $plugin_l10n ), 
    70             'desc' => __( '', $plugin_l10n ), 
    71             'type' => 'cards', 
    72             'choices' => array(), 
    73             'std' => '' 
    74         ), 
    75     ) 
     39    'section_id'    => 'helper', 
     40    'section_title' => 'API Helper', 
     41    'section_order' => 2, 
     42    'fields'        => array( 
     43        array( 
     44            'id'      => 'orgs', 
     45            'title'  => __( 'Organizations', $plugin_l10n ), 
     46            'desc'    => __( '', $plugin_l10n ), 
     47            'type'    => 'organizations', 
     48            'choices' => array(), 
     49            'std'     => '', 
     50        ), 
     51        array( 
     52            'id'      => 'boards', 
     53            'title'  => __( 'Boards', $plugin_l10n ), 
     54            'desc'    => __( '', $plugin_l10n ), 
     55            'type'    => 'boards', 
     56            'choices' => array(), 
     57            'std'     => '', 
     58        ), 
     59        array( 
     60            'id'      => 'lists', 
     61            'title'  => __( 'Lists', $plugin_l10n ), 
     62            'desc'    => __( '', $plugin_l10n ), 
     63            'type'    => 'lists', 
     64            'choices' => array(), 
     65            'std'     => '', 
     66        ), 
     67        array( 
     68            'id'      => 'cards', 
     69            'title'  => __( 'Cards', $plugin_l10n ), 
     70            'desc'    => __( '', $plugin_l10n ), 
     71            'type'    => 'cards', 
     72            'choices' => array(), 
     73            'std'     => '', 
     74        ), 
     75    ), 
    7676); 
    77 ?> 
  • wp-trello/trunk/includes/wpt-widget.php

    r650600 r1479964  
    22 
    33class wpt_widget extends WP_Widget { 
    4      
     4 
    55    /* Register widget with WordPress. */ 
    66    public function __construct() { 
    7         parent::__construct( 
    8             'wpt_widget',  
    9             'WP Trello',  
    10             array( 'description' => __( 'A widget to display data from Trello', 'wp-trello' ), ) 
    11         ); 
     7        parent::__construct( 'wpt_widget', 'WP Trello', array( 'description' => __( 'A widget to display data from Trello', 'wp-trello' ), ) ); 
    128    } 
    13      
     9 
    1410    /* Front-end display of widget. */ 
    1511    public function widget( $args, $instance ) { 
    1612        extract( $args ); 
     13        global $wp_trello; 
     14 
    1715        $title = apply_filters( 'widget_title', $instance['title'] ); 
    18         $type = isset($instance['type']) ? $instance['type'] : false; 
    19         $id = isset($instance['id']) ? $instance['id'] : false; 
    20         $link = isset($instance['link']) ? $instance['link'] : false; 
    21      
     16        $type  = isset( $instance['type'] ) ? $instance['type'] : false; 
     17        $id    = isset( $instance['id'] ) ? $instance['id'] : false; 
     18        $link  = isset( $instance['link'] ) ? $instance['link'] : false; 
     19 
    2220        echo $before_widget; 
    23         if ( ! empty( $title ) ) 
     21        if ( ! empty( $title ) ) { 
    2422            echo $before_title . $title . $after_title; 
    25          
    26         $html = wp_trello::trello_output($type, $id, $link);     
     23        } 
     24 
     25        $html = $wp_trello->trello_output( $type, $id, $link ); 
    2726        echo $html; 
    2827        echo $after_widget; 
    2928    } 
    30      
     29 
    3130    /* Sanitize widget form values as they are saved. */ 
    3231    public function update( $new_instance, $old_instance ) { 
    33         $instance = $old_instance; 
     32        $instance          = $old_instance; 
    3433        $instance['title'] = strip_tags( $new_instance['title'] ); 
    35         $instance['type'] = strip_tags( $new_instance['type'] ); 
    36         $instance['id'] = strip_tags( $new_instance['id'] ); 
    37         $instance['link'] =  $new_instance['link'] ? 1 : 0;      
     34        $instance['type']  = strip_tags( $new_instance['type'] ); 
     35        $instance['id']    = strip_tags( $new_instance['id'] ); 
     36        $instance['link']  = $new_instance['link'] ? 1 : 0; 
     37 
    3838        return $instance; 
    3939    } 
    40      
     40 
    4141    /* Back-end widget form. */ 
    4242    public function form( $instance ) { 
    43         $defaults = array(  'title' => 'From Trello' ,  
    44                             'type' => 'cards',  
    45                             'id' => '', 
    46                             'link' => false); 
     43        $defaults = array( 
     44            'title' => 'From Trello', 
     45            'type'  => 'cards', 
     46            'id'    => '', 
     47            'link'  => false, 
     48        ); 
    4749 
    4850        $instance = wp_parse_args( (array) $instance, $defaults ); 
    49          
     51 
    5052        $title = strip_tags( $instance['title'] ); 
    51         $type = isset($instance['type']) ? $instance['type'] : false; 
    52         $id = isset($instance['id']) ? $instance['id'] : false; 
    53         $link = isset($instance['link']) ? $instance['link'] : false;        
     53        $type  = isset( $instance['type'] ) ? $instance['type'] : false; 
     54        $id    = isset( $instance['id'] ) ? $instance['id'] : false; 
     55        $link  = isset( $instance['link'] ) ? $instance['link'] : false; 
    5456        ?> 
    5557        <p> 
    56         <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'wp-trello' ); ?></label>  
    57         <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /> 
     58            <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'wp-trello' ); ?></label> 
     59            <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /> 
    5860        </p> 
    5961        <p> 
    60         <label for="<?php echo $this->get_field_id( 'type' ); ?>"><?php _e( 'Type:', 'wp-trello'); ?></label>  
    61         <select class="widefat" id="<?php echo $this->get_field_id( 'size' ); ?>" name="<?php echo $this->get_field_name( 'type' ); ?>"> 
    62             <option <?php selected('organizations', $type); ?> value="organizations">Organizations</option> 
    63             <option <?php selected('boards', $type); ?> value="boards">Boards</option> 
    64             <option <?php selected('lists', $type); ?> value="lists">Lists</option> 
    65             <option <?php selected('cards', $type); ?>value="cards">Cards</option> 
    66             <option <?php selected('card', $type); ?>value="card">Card</option> 
    67         </select> 
     62            <label for="<?php echo $this->get_field_id( 'type' ); ?>"><?php _e( 'Type:', 'wp-trello' ); ?></label> 
     63            <select class="widefat" id="<?php echo $this->get_field_id( 'size' ); ?>" name="<?php echo $this->get_field_name( 'type' ); ?>"> 
     64                <option <?php selected( 'organizations', $type ); ?> value="organizations">Organizations</option> 
     65                <option <?php selected( 'boards', $type ); ?> value="boards">Boards</option> 
     66                <option <?php selected( 'lists', $type ); ?> value="lists">Lists</option> 
     67                <option <?php selected( 'cards', $type ); ?>value="cards">Cards</option> 
     68                <option <?php selected( 'card', $type ); ?>value="card">Card</option> 
     69            </select> 
    6870        </p> 
    69         <label for="<?php echo $this->get_field_id( 'id' ); ?>"><?php _e( 'ID:', 'wp-trello'); ?></label>  
     71        <label for="<?php echo $this->get_field_id( 'id' ); ?>"><?php _e( 'ID:', 'wp-trello' ); ?></label> 
    7072        <input class="widefat" id="<?php echo $this->get_field_id( 'id' ); ?>" name="<?php echo $this->get_field_name( 'id' ); ?>" type="text" value="<?php echo $id; ?>" /> 
    7173        </p> 
    7274        <p> 
    73         <label for="<?php echo $this->get_field_id( 'link' ); ?>"><?php _e( 'Add Link', 'wp-trello'); ?></label>  
    74         <input class="checkbox" type="checkbox" <?php checked($link, true) ?> id="<?php echo $this->get_field_id('link'); ?>" name="<?php echo $this->get_field_name('link'); ?>" /> 
     75            <label for="<?php echo $this->get_field_id( 'link' ); ?>"><?php _e( 'Add Link', 'wp-trello' ); ?></label> 
     76            <input class="checkbox" type="checkbox" <?php checked( $link, true ) ?> id="<?php echo $this->get_field_id( 'link' ); ?>" name="<?php echo $this->get_field_name( 'link' ); ?>" /> 
    7577        </p> 
    76         <?php  
     78        <?php 
    7779    } 
    7880} 
  • wp-trello/trunk/readme.txt

    r833298 r1479964  
    66Tags: trello, cards, boards, lists, widget, shortcode, api, integration 
    77Requires at least: 3.0 
    8 Tested up to: 3.8 
    9 Stable tag: 1.0.6 
     8Tested up to: 4.6 
     9Stable tag: 1.0.7 
    1010License: GPLv2 or later 
    1111License URI: http://www.gnu.org/licenses/gpl-2.0.html 
     
    5151 
    5252== Changelog == 
     53 
     54= 1.0.7 2016-08-21 = 
     55 
     56* Fix - Compatibile with 4.6 
     57* Improvement - Code fixes 
    5358 
    5459= 1.0.6 = 
  • wp-trello/trunk/wp-trello.php

    r833301 r1479964  
    55Description: A plugin to display data from Trello in your WordPress site. 
    66Author: polevaultweb  
    7 Version: 1.0.6 
     7Version: 1.0.7 
    88Author URI: http://www.polevaultweb.com/ 
    99 
     
    2424 
    2525*/ 
    26 if ( !session_id() ) session_start(); 
    27 require_once ( plugin_dir_path( __FILE__ ) .'includes/wpt-widget.php' ); 
    28  
    29 new wp_trello(); 
     26if ( ! session_id() ) { 
     27    session_start(); 
     28} 
     29require_once( plugin_dir_path( __FILE__ ) . 'includes/wpt-widget.php' ); 
     30 
    3031class wp_trello { 
    3132 
    32     private $plugin_path; 
    33     private $plugin_url; 
     33    private $plugin_path; 
     34    private $plugin_url; 
    3435    private $plugin_version; 
    3536    private $plugin_l10n; 
    36      
     37 
    3738    private $wpsf; 
    38      
     39 
    3940    private $api_base = 'https://api.trello.com/1/'; 
    4041    private $request_token_url; 
    4142    private $authorize_url; 
    4243    private $access_token_url; 
    43          
     44 
    4445    private $app_name = 'WP Trello'; 
    4546    private $callback_url; 
    46      
    47     private $consumer; 
    48     private $token; 
    49     private $consumer_key = '21b4a1e4f755637319c979849147076e'; 
    50     private $consumer_secret = '7d5ab8655e15582041cab97459d1c6d9fca51e690247df4fb5214f2691ba786c'; 
    51      
    52     public $timeout = 30; 
    53     public $connecttimeout = 30;  
    54     public $ssl_verifypeer = FALSE; 
     47 
     48    private $consumer; 
     49    private $token; 
     50    private $consumer_key = '21b4a1e4f755637319c979849147076e'; 
     51    private $consumer_secret = '7d5ab8655e15582041cab97459d1c6d9fca51e690247df4fb5214f2691ba786c'; 
     52 
     53    public $timeout = 30; 
     54    public $connecttimeout = 30; 
     55    public $ssl_verifypeer = false; 
    5556    public $format; 
    56     public $decode_json = TRUE; 
     57    public $decode_json = true; 
    5758    public $http_info; 
    5859    public $useragent = 'Provider Oauth'; 
    5960 
    60     function __construct() {     
    61  
    62         $this->plugin_path = plugin_dir_path( __FILE__ ); 
    63         $this->plugin_url = plugin_dir_url( __FILE__ ); 
    64         $this->plugin_version = '1.0.6'; 
    65         $this->plugin_l10n = 'wp-trello'; 
    66          
    67         $this->request_token_url = $this->api_base .'OAuthGetRequestToken'; 
    68         $this->authorize_url = $this->api_base .'OAuthAuthorizeToken'; 
    69         $this->access_token_url = $this->api_base .'OAuthGetAccessToken'; 
    70          
     61    function __construct() { 
     62 
     63        $this->plugin_path    = plugin_dir_path( __FILE__ ); 
     64        $this->plugin_url    = plugin_dir_url( __FILE__ ); 
     65        $this->plugin_version = '1.0.7'; 
     66        $this->plugin_l10n    = 'wp-trello'; 
     67 
     68        $this->request_token_url = $this->api_base . 'OAuthGetRequestToken'; 
     69        $this->authorize_url     = $this->api_base . 'OAuthAuthorizeToken'; 
     70        $this->access_token_url  = $this->api_base . 'OAuthGetAccessToken'; 
     71 
    7172        $this->callback_url = get_admin_url() . 'options-general.php?page=wp-trello'; 
    72          
     73 
    7374        // Set up l10n 
    74         load_plugin_textdomain( $this->plugin_l10n, false, dirname( plugin_basename( __FILE__ ) ) . '/lang' ); 
    75          
    76         // Hooks and Filters 
    77         add_action( 'admin_enqueue_scripts', array( $this, 'add_admin_scripts' )); 
    78         add_action( 'admin_menu', array( $this, 'add_settings_menu' )); 
    79         add_action( 'admin_init', array( $this, 'trello_connect' )); 
    80         add_action( 'wp_ajax_wpt_get_objects', array($this,'wpt_get_objects')); 
    81         add_action( 'wp_ajax_wpt_disconnect', array($this, 'wpt_disconnect')); 
    82         add_filter( 'plugin_action_links', array($this, 'plugin_settings_link'), 10, 2 ); 
    83         add_action( 'wp_enqueue_scripts', array($this, 'custom_css')); 
    84  
    85         add_shortcode('wp-trello', array($this, 'trello_data') ); 
    86         if ($this->is_connected()) { 
    87             add_action( 'widgets_init', create_function( '', 'register_widget( "wpt_widget" );' ) ); 
    88         } 
    89                  
    90         // oAuth 
    91         require_once( $this->plugin_path .'includes/trello.php' ); 
    92             
    93         // Settings 
    94         require_once( $this->plugin_path .'includes/wp-settings-framework.php' ); 
    95         $this->wpsf = new wpt_WordPressSettingsFramework( $this->plugin_path .'includes/wpt-settings.php' ); 
    96         add_filter( $this->wpsf->get_option_group() .'_settings_validate', array(&$this, 'validate_settings') ); 
    97         $this->settings = wpsf_get_settings( $this->plugin_path .'includes/wpt-settings.php' ); 
    98          
    99     } 
    100      
     75        load_plugin_textdomain( $this->plugin_l10n, false, dirname( plugin_basename( __FILE__ ) ) . '/lang' ); 
     76 
     77        // Hooks and Filters 
     78        add_action( 'admin_enqueue_scripts', array( $this, 'add_admin_scripts' ) ); 
     79        add_action( 'admin_menu', array( $this, 'add_settings_menu' ) ); 
     80        add_action( 'admin_init', array( $this, 'trello_connect' ) ); 
     81        add_action( 'wp_ajax_wpt_get_objects', array( $this, 'wpt_get_objects' ) ); 
     82        add_action( 'wp_ajax_wpt_disconnect', array( $this, 'wpt_disconnect' ) ); 
     83        add_filter( 'plugin_action_links', array( $this, 'plugin_settings_link' ), 10, 2 ); 
     84        add_action( 'wp_enqueue_scripts', array( $this, 'custom_css' ) ); 
     85 
     86        add_shortcode( 'wp-trello', array( $this, 'trello_data' ) ); 
     87        if ( $this->is_connected() ) { 
     88            add_action( 'widgets_init', create_function( '', 'register_widget( "wpt_widget" );' ) ); 
     89        } 
     90 
     91        // oAuth 
     92        require_once( $this->plugin_path . 'includes/trello.php' ); 
     93 
     94        // Settings 
     95        require_once( $this->plugin_path . 'includes/wp-settings-framework.php' ); 
     96        $this->wpsf = new wpt_WordPressSettingsFramework( $this->plugin_path . 'includes/wpt-settings.php' ); 
     97        add_filter( $this->wpsf->get_option_group() . '_settings_validate', array( &$this, 'validate_settings' ) ); 
     98        $this->settings = wpsf_get_settings( $this->plugin_path . 'includes/wpt-settings.php' ); 
     99 
     100    } 
     101 
    101102    function add_admin_scripts() { 
    102         if (isset($_GET['page']) && $_GET['page'] == $this->plugin_l10n){    
     103        if ( isset( $_GET['page'] ) && $_GET['page'] == $this->plugin_l10n ) { 
    103104            // js 
    104             wp_register_script( 'wpt-admin-js', plugins_url('assets/js/wpt-admin.js' , __FILE__ ), array('jquery'), $this->plugin_version ); 
    105             wp_enqueue_script( 'wpt-admin-js' ); 
    106             wp_localize_script( 'wpt-admin-js', 'wp_trello', array(  'nonce' => wp_create_nonce('wp_trello') )); 
     105            wp_register_script( 'wpt-admin-js', plugins_url( 'assets/js/wpt-admin.js', __FILE__ ), array( 'jquery' ), $this->plugin_version ); 
     106            wp_enqueue_script( 'wpt-admin-js' ); 
     107            wp_localize_script( 'wpt-admin-js', 'wp_trello', array( 'nonce' => wp_create_nonce( 'wp_trello' ) ) ); 
    107108 
    108109            // css 
    109             wp_register_style( 'wpt-admin-css', plugins_url('assets/css/wpt-admin.css' , __FILE__ ), array(), $this->plugin_version); 
    110             wp_enqueue_style('wpt-admin-css'); 
    111         } 
    112     } 
    113      
     110            wp_register_style( 'wpt-admin-css', plugins_url( 'assets/css/wpt-admin.css', __FILE__ ), array(), $this->plugin_version ); 
     111            wp_enqueue_style( 'wpt-admin-css' ); 
     112        } 
     113    } 
     114 
    114115    function custom_css() { 
    115         $custom_css = $this->default_val($this->settings, 'wptsettings_general_output-css', ''); 
    116         if ($custom_css != '') { 
     116        $custom_css = $this->default_val( $this->settings, 'wptsettings_general_output-css', '' ); 
     117        if ( $custom_css != '' ) { 
    117118            $output = "<style type=\"text/css\">\n" . $custom_css . "\n</style>\n"; 
    118119            echo $output; 
    119120        } 
    120121    } 
    121      
     122 
    122123    function add_settings_menu() { 
    123         add_options_page( __('WP Trello', $this->plugin_l10n), __('WP Trello', $this->plugin_l10n), 'manage_options', $this->plugin_l10n, array( $this, 'settings_page' ) ); 
    124     } 
    125      
    126     function plugin_settings_link($links, $file) {   
    127         if ($file == plugin_basename(__FILE__)){ 
    128             $settings_link = '<a href="'. $this->callback_url .'">' . __('Settings', $this->plugin_l10n) . '</a>'; 
     124        add_options_page( __( 'WP Trello', $this->plugin_l10n ), __( 'WP Trello', $this->plugin_l10n ), 'manage_options', $this->plugin_l10n, array( 
     125            $this, 
     126            'settings_page', 
     127        ) ); 
     128    } 
     129 
     130    function plugin_settings_link( $links, $file ) { 
     131        if ( $file == plugin_basename( __FILE__ ) ) { 
     132            $settings_link = '<a href="' . $this->callback_url . '">' . __( 'Settings', $this->plugin_l10n ) . '</a>'; 
    129133            array_unshift( $links, $settings_link ); 
    130134        } 
    131         return $links;   
    132     } 
    133      
     135 
     136        return $links; 
     137    } 
     138 
    134139    function settings_page() { 
    135         if (!current_user_can('manage_options')) { 
    136             wp_die('You do not have sufficient permissions to access this page.'); 
    137         }  
     140        if ( ! current_user_can( 'manage_options' ) ) { 
     141            wp_die( 'You do not have sufficient permissions to access this page.' ); 
     142        } 
    138143        global $wptsf_settings; 
    139         $active_tab = isset($_GET['tab']) ? $_GET['tab'] : 'general';  
    140         $connected = $this->is_connected(); 
    141         $trello = new trello_oauth(); 
    142         $source = 'trello'; 
    143         $callback = $this->callback_url; 
    144         $url = $trello->get_authorise_url($callback, $source); 
    145     ?> 
     144        $active_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'general'; 
     145        $connected  = $this->is_connected(); 
     146        $trello     = new trello_oauth(); 
     147        $source     = 'trello'; 
     148        $callback   = $this->callback_url; 
     149        $url        = $trello->get_authorise_url( $callback, $source ); 
     150        ?> 
    146151        <div class="wrap"> 
    147           <div id="icon-options-general" class="icon32"></div> 
    148           <h2><?php _e('WP Trello Settings', $this->plugin_l10n) ?></h2> 
    149           <p> 
    150           <?php if(!$connected) { ?> 
    151             <a class="button button-primary" href=<?php echo $url; ?>>Connect with Trello</a></p> 
    152           <?php } ?> 
    153           <h2 class="nav-tab-wrapper"> 
    154               <?php foreach( $wptsf_settings as $tab ){ ?> 
    155                 <a href="?page=<?php echo $_GET['page']; ?>&tab=<?php echo $tab['section_id']; ?>" class="nav-tab<?php echo $active_tab == $tab['section_id'] ? ' nav-tab-active' : ''; ?>"><?php echo $tab['section_title']; ?></a> 
     152            <div id="icon-options-general" class="icon32"></div> 
     153            <h2><?php _e( 'WP Trello Settings', $this->plugin_l10n ) ?></h2> 
     154            <p> 
     155                <?php if ( ! $connected ) { ?> 
     156                <a class="button button-primary" href=<?php echo $url; ?>>Connect with Trello</a></p> 
     157            <?php } ?> 
     158            <h2 class="nav-tab-wrapper"> 
     159                <?php foreach ( $wptsf_settings as $tab ) { ?> 
     160                    <a href="?page=<?php echo $_GET['page']; ?>&tab=<?php echo $tab['section_id']; ?>" class="nav-tab<?php echo $active_tab == $tab['section_id'] ? ' nav-tab-active' : ''; ?>"><?php echo $tab['section_title']; ?></a> 
    156161                <?php } ?> 
    157                 <?php if($connected) {  
    158                     $member = $this->get_connected_member(); 
    159                     $fullname = ($member != '') ? $member->username : ''; 
    160                 ?> 
    161                     <p class="nav-tab"><strong><?php echo $fullname; ?></strong> <a id="wpt-disconnect" href="#" class="button">Disconnect</a></p> 
     162                <?php if ( $connected ) { 
     163                    $member   = $this->get_connected_member(); 
     164                    $fullname = ( $member != '' ) ? $member->username : ''; 
     165                    ?> 
     166                    <p class="nav-tab"><strong><?php echo $fullname; ?></strong> 
     167                        <a id="wpt-disconnect" href="#" class="button">Disconnect</a></p> 
    162168                <?php } ?> 
    163               </h2> 
    164           <form action="options.php" method="post"> 
     169            </h2> 
     170            <form action="options.php" method="post"> 
    165171                <?php settings_fields( $this->wpsf->get_option_group() ); ?> 
    166172                <?php $this->do_settings_sections( $this->wpsf->get_option_group() ); ?> 
    167                 <p class="submit"><input type="submit" class="button-primary" value="<?php _e( 'Save Changes', $this->plugin_l10n ); ?>" /></p> 
    168           </form> 
     173                <p class="submit"> 
     174                    <input type="submit" class="button-primary" value="<?php _e( 'Save Changes', $this->plugin_l10n ); ?>" /> 
     175                </p> 
     176            </form> 
    169177        </div> 
    170178        <?php 
    171179    } 
    172      
    173     function do_settings_sections($page) { 
    174         global $wp_settings_sections, $wp_settings_fields; 
    175         $active_tab = isset($_GET['tab']) ? $_GET['tab'] : 'general';  
    176         if ( !isset($wp_settings_sections) || !isset($wp_settings_sections[$page]) ) 
    177             return; 
    178         foreach ( (array) $wp_settings_sections[$page] as $section ) { 
    179             echo '<div id="section-'. $section['id'] .'"class="wpt-section'. ($active_tab == $section['id'] ? ' wpt-section-active' : '') .'">'; 
    180             call_user_func($section['callback'], $section); 
    181             if ( !isset($wp_settings_fields) || !isset($wp_settings_fields[$page]) || !isset($wp_settings_fields[$page][$section['id']]) ) 
    182                     continue; 
    183             echo '<table class="form-table">'; 
    184             do_settings_fields($page, $section['id']); 
    185             echo '</table> 
     180 
     181    function do_settings_sections( $page ) { 
     182        global $wp_settings_sections, $wp_settings_fields; 
     183        $active_tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'general'; 
     184        if ( ! isset( $wp_settings_sections ) || ! isset( $wp_settings_sections[ $page ] ) ) { 
     185            return; 
     186        } 
     187        foreach ( (array) $wp_settings_sections[ $page ] as $section ) { 
     188            echo '<div id="section-' . $section['id'] . '"class="wpt-section' . ( $active_tab == $section['id'] ? ' wpt-section-active' : '' ) . '">'; 
     189            call_user_func( $section['callback'], $section ); 
     190            if ( ! isset( $wp_settings_fields ) || ! isset( $wp_settings_fields[ $page ] ) || ! isset( $wp_settings_fields[ $page ][ $section['id'] ] ) ) { 
     191                continue; 
     192            } 
     193            echo '<table class="form-table">'; 
     194            do_settings_fields( $page, $section['id'] ); 
     195            echo '</table> 
    186196            </div>'; 
    187         } 
    188     } 
    189      
    190     function validate_settings( $input ) { return $input; } 
    191      
    192     function default_val( $options, $value, $default = '' ){ 
    193         if( !isset($options[$value]) ) return $default; 
    194         else return $options[$value]; 
    195     } 
    196      
     197        } 
     198    } 
     199 
     200    function validate_settings( $input ) { 
     201        return $input; 
     202    } 
     203 
     204    function default_val( $options, $value, $default = '' ) { 
     205        if ( ! isset( $options[ $value ] ) ) { 
     206            return $default; 
     207        } else { 
     208            return $options[ $value ]; 
     209        } 
     210    } 
     211 
    197212    function trello_connect() { 
    198         if(isset($_GET['page']) && $_GET['page'] == 'wp-trello' && isset($_GET['oauth_token']) && isset($_GET['oauth_verifier'])) { 
    199             $auth_token = $_SESSION['trello_oauth_token']; 
    200             $auth_token_secret = $_SESSION['trello_oauth_token_secret'];             
    201             $callback = $this->callback_url; 
    202             $request_code = $_GET['oauth_verifier']; 
    203              
    204             $trello = new trello_oauth($auth_token, $auth_token_secret); 
    205             $token = $trello->getAccessToken($request_code, $callback); 
    206             $member = $trello->getMember(); 
    207             $trello_data['token'] = $token; 
     213        if ( isset( $_GET['page'] ) && $_GET['page'] == 'wp-trello' && isset( $_GET['oauth_token'] ) && isset( $_GET['oauth_verifier'] ) ) { 
     214            $auth_token        = $_SESSION['trello_oauth_token']; 
     215            $auth_token_secret = $_SESSION['trello_oauth_token_secret']; 
     216            $callback          = $this->callback_url; 
     217            $request_code      = $_GET['oauth_verifier']; 
     218 
     219            $trello                = new trello_oauth( $auth_token, $auth_token_secret ); 
     220            $token                 = $trello->getAccessToken( $request_code, $callback ); 
     221            $member                = $trello->getMember(); 
     222            $trello_data['token']  = $token; 
    208223            $trello_data['member'] = $member; 
    209              
    210             update_option('wptsettings_trello', $trello_data); 
    211             header( 'Location: '. $this->callback_url ); 
    212         } 
    213     } 
    214      
    215     function is_connected() {        
    216         return (get_option('wptsettings_trello')) ? true : false; 
    217     } 
    218      
    219     function get_connected_member() {        
    220         $trello_data = get_option('wptsettings_trello'); 
    221         return isset($trello_data['member']) ? $trello_data['member'] : ''; 
    222     } 
    223      
    224     function get_access_token() {        
    225         $trello_data = get_option('wptsettings_trello'); 
    226         return isset($trello_data['token']) ? $trello_data['token'] : ''; 
    227     } 
    228      
    229     function trello_data($atts, $content = null) { 
    230         extract(shortcode_atts(array(   'type' => 'cards', 
    231                                         'id' => '', 
    232                                         'link' => false, 
    233                                         ), $atts)); 
    234          
    235         if (!$this->is_connected()) return '';                       
    236         return $this->trello_output($type, $id, $link);      
    237     } 
    238      
    239     function trello_output($type, $id, $link) { 
    240         $wp_trello = new wp_trello(); 
    241          
    242         $data = $wp_trello->get_data($type, $id); 
    243         $parent = $wp_trello->get_parent($type, $id); 
    244         $singular = substr($type, 0, -1); 
    245         $target_blank = $wp_trello->default_val($wp_trello->settings, 'wptsettings_general_target-blank', ''); 
    246         $target = ''; 
    247         if($target_blank == 1) $target = ' target="_blank"'; 
    248         if (is_array($data)) { 
    249             $html = '<ul class="wpt-'. $singular .'-wrapper">'; 
    250             foreach ($data as $item) { 
    251                 $html .= '<li class="wpt-'. $singular .'">'; 
    252                 if ($link && strtolower($link) == 'yes') { 
    253                     $url = (isset($item->url)) ? $item->url : '#'; 
    254                     $html .= '<a class="wpt-'. $singular .'-link" href="'. $url .'"'. $target .'>'. $item->name .'</a>'; 
    255                 } else $html .= make_clickable($item->name); 
    256                 $html .= '</li>';        
     224 
     225            update_option( 'wptsettings_trello', $trello_data ); 
     226            header( 'Location: ' . $this->callback_url ); 
     227        } 
     228    } 
     229 
     230    function is_connected() { 
     231        return ( get_option( 'wptsettings_trello' ) ) ? true : false; 
     232    } 
     233 
     234    function get_connected_member() { 
     235        $trello_data = get_option( 'wptsettings_trello' ); 
     236 
     237        return isset( $trello_data['member'] ) ? $trello_data['member'] : ''; 
     238    } 
     239 
     240    function get_access_token() { 
     241        $trello_data = get_option( 'wptsettings_trello' ); 
     242 
     243        return isset( $trello_data['token'] ) ? $trello_data['token'] : ''; 
     244    } 
     245 
     246    function trello_data( $atts, $content = null ) { 
     247        extract( shortcode_atts( array( 
     248            'type' => 'cards', 
     249            'id'   => '', 
     250            'link' => false, 
     251        ), $atts ) ); 
     252 
     253        if ( ! $this->is_connected() ) { 
     254            return ''; 
     255        } 
     256 
     257        return $this->trello_output( $type, $id, $link ); 
     258    } 
     259 
     260    function trello_output( $type, $id, $link ) { 
     261        $data         = $this->get_data( $type, $id ); 
     262        $parent       = $this->get_parent( $type, $id ); 
     263        $singular     = substr( $type, 0, -1 ); 
     264        $target_blank = $this->default_val( $this->settings, 'wptsettings_general_target-blank', '' ); 
     265        $target       = ''; 
     266        if ( $target_blank == 1 ) { 
     267            $target = ' target="_blank"'; 
     268        } 
     269        if ( is_array( $data ) ) { 
     270            $html = '<ul class="wpt-' . $singular . '-wrapper">'; 
     271            foreach ( $data as $item ) { 
     272                $html .= '<li class="wpt-' . $singular . '">'; 
     273                if ( $link && strtolower( $link ) == 'yes' ) { 
     274                    $url = ( isset( $item->url ) ) ? $item->url : '#'; 
     275                    $html .= '<a class="wpt-' . $singular . '-link" href="' . $url . '"' . $target . '>' . $item->name . '</a>'; 
     276                } else { 
     277                    $html .= make_clickable( $item->name ); 
     278                } 
     279                $html .= '</li>'; 
    257280            } 
    258281            $html .= '</ul>'; 
    259282        } else { 
    260             $html = '<div class="wpt-'. $singular .'-wrapper">'; 
    261             $html .= '<div class="wpt-'. $singular .'">'; 
    262             if ($link && strtolower($link) == 'yes') { 
    263                 $url = (isset($data->url)) ? $data->url : '#'; 
    264                 $html .= '<a class="wpt-'. $singular .'-link" href="'. $url .'"'. $target .'>'. $data->name .'</a>'; 
    265             } else $html .= (isset($data->name)) ? make_clickable($data->name) : ''; 
     283            $html = '<div class="wpt-' . $singular . '-wrapper">'; 
     284            $html .= '<div class="wpt-' . $singular . '">'; 
     285            if ( $link && strtolower( $link ) == 'yes' ) { 
     286                $url = ( isset( $data->url ) ) ? $data->url : '#'; 
     287                $html .= '<a class="wpt-' . $singular . '-link" href="' . $url . '"' . $target . '>' . $data->name . '</a>'; 
     288            } else { 
     289                $html .= ( isset( $data->name ) ) ? make_clickable( $data->name ) : ''; 
     290            } 
    266291            $html .= '</div>'; 
    267             $html .= '</div>';   
    268         } 
    269         $link_love = $wp_trello->default_val($wp_trello->settings, 'wptsettings_general_link-love', ''); 
    270         if($link_love == 1) $html .= 'Trello data served by <a href="http://wordpress.org/extend/plugins/wp-trello/" target="_blank">WP Trello</a>'; 
     292            $html .= '</div>'; 
     293        } 
     294        $link_love = $this->default_val( $this->settings, 'wptsettings_general_link-love', '' ); 
     295        if ( $link_love == 1 ) { 
     296            $html .= 'Trello data served by <a href="http://wordpress.org/extend/plugins/wp-trello/" target="_blank">WP Trello</a>'; 
     297        } 
     298 
    271299        return $html; 
    272300    } 
    273      
    274     function get_data($object, $id) { 
    275         $trello_data = get_option('wptsettings_trello'); 
    276         $access_token = isset($trello_data['token']) ? $trello_data['token'] : ''; 
    277         $trello = new trello_oauth($access_token['oauth_token'], $access_token['oauth_token_secret']); 
    278         $method = 'get'. ucfirst($object); 
    279         $data = call_user_func(array($trello, $method), $id); 
    280         return $data;         
    281     } 
    282  
    283     function get_dropdown_data($object, $id) { 
    284         $trello_data = get_option('wptsettings_trello'); 
    285         $access_token = isset($trello_data['token']) ? $trello_data['token'] : ''; 
    286         $trello = new trello_oauth($access_token['oauth_token'], $access_token['oauth_token_secret']); 
    287         $method = 'get'. ucfirst($object); 
    288         $data = call_user_func(array($trello, $method), $id); 
    289         $data = $trello->getDropdown($data, substr($object, 0, -1)); 
    290         return $data;         
    291     } 
    292      
    293     function get_parent($object, $id) { 
    294         $trello_objects = array(    0 => 'organization', 
    295                                     1 => 'board', 
    296                                     2 => 'list', 
    297                                     3 => 'card' 
    298                                 );               
    299         $singular = substr($object, 0, -1); 
    300         $child_object = array_search($singular, $trello_objects);  
    301         if ($child_object == 0) return; 
    302         $parent_object = $trello_objects[$child_object - 1]; 
    303         $parent = wp_trello::get_data($parent_object, $id); 
     301 
     302    function get_data( $object, $id ) { 
     303        $trello_data  = get_option( 'wptsettings_trello' ); 
     304        $access_token = isset( $trello_data['token'] ) ? $trello_data['token'] : ''; 
     305        $trello       = new trello_oauth( $access_token['oauth_token'], $access_token['oauth_token_secret'] ); 
     306        $method       = 'get' . ucfirst( $object ); 
     307        $data         = call_user_func( array( $trello, $method ), $id ); 
     308 
     309        return $data; 
     310    } 
     311 
     312    function get_dropdown_data( $object, $id ) { 
     313        $trello_data  = get_option( 'wptsettings_trello' ); 
     314        $access_token = isset( $trello_data['token'] ) ? $trello_data['token'] : ''; 
     315        $trello       = new trello_oauth( $access_token['oauth_token'], $access_token['oauth_token_secret'] ); 
     316        $method       = 'get' . ucfirst( $object ); 
     317        $data         = call_user_func( array( $trello, $method ), $id ); 
     318        $data         = $trello->getDropdown( $data, substr( $object, 0, -1 ) ); 
     319 
     320        return $data; 
     321    } 
     322 
     323    function get_parent( $object, $id ) { 
     324        $trello_objects = array( 
     325            0 => 'organization', 
     326            1 => 'board', 
     327            2 => 'list', 
     328            3 => 'card', 
     329        ); 
     330        $singular       = substr( $object, 0, -1 ); 
     331        $child_object   = array_search( $singular, $trello_objects ); 
     332        if ( $child_object == 0 ) { 
     333            return; 
     334        } 
     335        $parent_object = $trello_objects[ $child_object - 1 ]; 
     336        $parent        = $this->get_data( $parent_object, $id ); 
     337 
    304338        return $parent; 
    305339    } 
    306      
     340 
    307341    function wpt_get_objects() { 
    308         if ( !isset($_POST['nonce']) || !wp_verify_nonce( $_POST['nonce'], 'wp_trello' )) 
    309             return 0; 
    310         if ( !isset($_POST['type']) || !isset($_POST['id'])) 
    311             return 0; 
    312         $response['error'] = false; 
    313         $response['message'] = ''; 
    314         $objects = $this->get_dropdown_data($_POST['type'], $_POST['id']);  
    315         $response['objects'] = $objects; 
    316         $response['message'] = 'success'; 
    317         echo json_encode($response); 
    318         die; 
    319     } 
    320      
     342        if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'wp_trello' ) ) { 
     343            return 0; 
     344        } 
     345        if ( ! isset( $_POST['type'] ) || ! isset( $_POST['id'] ) ) { 
     346            return 0; 
     347        } 
     348        $response['error']   = false; 
     349        $response['message'] = ''; 
     350        $objects             = $this->get_dropdown_data( $_POST['type'], $_POST['id'] ); 
     351        $response['objects'] = $objects; 
     352        $response['message'] = 'success'; 
     353        echo json_encode( $response ); 
     354        die; 
     355    } 
     356 
    321357    function wpt_disconnect() { 
    322         if ( !isset($_POST['nonce']) || !wp_verify_nonce( $_POST['nonce'], 'wp_trello' )) 
    323             return 0; 
    324         $response['error'] = false; 
    325         $response['message'] = ''; 
    326         $response['redirect'] = ''; 
    327         $delete = delete_option('wptsettings_trello'); 
    328         $response['redirect'] = $this->callback_url;  
    329         $response['message'] = 'success'; 
    330         $response['error'] = $delete; 
    331         echo json_encode($response); 
    332         die; 
     358        if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( $_POST['nonce'], 'wp_trello' ) ) { 
     359            return 0; 
     360        } 
     361        $response['error']    = false; 
     362        $response['message']  = ''; 
     363        $response['redirect'] = ''; 
     364        $delete               = delete_option( 'wptsettings_trello' ); 
     365        $response['redirect'] = $this->callback_url; 
     366        $response['message']  = 'success'; 
     367        $response['error']    = $delete; 
     368        echo json_encode( $response ); 
     369        die; 
    333370    } 
    334371} 
    335 ?> 
     372 
     373global $wp_trello; 
     374 
     375$wp_trello = new wp_trello(); 
Note: See TracChangeset for help on using the changeset viewer.