1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
|
/*
+----------------------------------------------------------------------+
| See LICENSE file for further copyright information |
+----------------------------------------------------------------------+
| Authors: John Jawed <jawed@php.net> |
| Felipe Pena <felipe@php.net> |
| Rasmus Lerdorf <rasmus@php.net> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#ifndef PHP_OAUTH_H
#define PHP_OAUTH_H
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#ifdef PHP_WIN32
#include "win32/time.h"
#endif
#include "SAPI.h"
#include "zend_API.h"
#include "zend_variables.h"
#include "ext/standard/head.h"
#include "php_globals.h"
#include "php_main.h"
#include "php_ini.h"
#include "ext/standard/php_string.h"
#include "ext/standard/php_rand.h"
#include "ext/standard/php_smart_string.h"
#include "ext/standard/info.h"
#include "ext/standard/php_string.h"
#include "ext/standard/php_versioning.h"
#include "ext/standard/url.h"
#include "php_variables.h"
#include "zend_exceptions.h"
#include "zend_interfaces.h"
#include "php_globals.h"
#include "ext/standard/file.h"
#include "ext/standard/base64.h"
#include "ext/standard/php_lcg.h"
#include "ext/pcre/php_pcre.h"
#include "php_network.h"
#if OAUTH_USE_CURL
#include <curl/curl.h>
#define CLEANUP_CURL_AND_FORM(f,h) \
curl_easy_cleanup(h); \
curl_formfree(f);
#endif
#define PHP_OAUTH_VERSION 2.0.2
#define __stringify_1(x) #x
#define __stringify(x) __stringify_1(x)
#define __OAUTH_EXT_VER PHP_OAUTH_VERSION
#define OAUTH_EXT_VER __stringify(__OAUTH_EXT_VER)
#define OAUTH_USER_AGENT "PECL-OAuth/" __stringify(__OAUTH_EXT_VER)
#define OAUTH_HTTP_PORT 80
#define OAUTH_HTTPS_PORT 443
#define OAUTH_MAX_REDIRS 4L
#define OAUTH_MAX_HEADER_LEN 512L
#define OAUTH_AUTH_TYPE_URI 0x01
#define OAUTH_AUTH_TYPE_FORM 0x02
#define OAUTH_AUTH_TYPE_AUTHORIZATION 0x03
#define OAUTH_AUTH_TYPE_NONE 0x04
#define OAUTH_SIG_METHOD_HMACSHA1 "HMAC-SHA1"
#define OAUTH_SIG_METHOD_HMACSHA256 "HMAC-SHA256"
#define OAUTH_SIG_METHOD_RSASHA1 "RSA-SHA1"
#define OAUTH_SIG_METHOD_PLAINTEXT "PLAINTEXT"
extern zend_module_entry oauth_module_entry;
#define phpext_oauth_ptr &oauth_module_entry
#define PHP_OAUTH_API
#define OAUTH_ATTR_CONSUMER_KEY "oauth_consumer_key"
#define OAUTH_ATTR_CONSUMER_SECRET "oauth_consumer_secret"
#define OAUTH_ATTR_ACCESS_TOKEN "oauth_access_token"
#define OAUTH_RAW_LAST_RES "oauth_last_response_raw"
#define OAUTH_ATTR_LAST_RES_INFO "oauth_last_response_info"
#define OAUTH_ATTR_SIGMETHOD "oauth_sig_method"
#define OAUTH_ATTR_TOKEN "oauth_token"
#define OAUTH_ATTR_TOKEN_SECRET "oauth_token_secret"
#define OAUTH_ATTR_AUTHMETHOD "oauth_auth_method"
#define OAUTH_ATTR_OAUTH_VERSION "oauth_version"
#define OAUTH_ATTR_OAUTH_NONCE "oauth_nonce"
#define OAUTH_ATTR_OAUTH_USER_NONCE "oauth_user_nonce"
#define OAUTH_ATTR_CA_PATH "oauth_ssl_ca_path"
#define OAUTH_ATTR_CA_INFO "oauth_ssl_ca_info"
#define OAUTH_HTTP_METHOD_GET "GET"
#define OAUTH_HTTP_METHOD_POST "POST"
#define OAUTH_HTTP_METHOD_PUT "PUT"
#define OAUTH_HTTP_METHOD_HEAD "HEAD"
#define OAUTH_HTTP_METHOD_DELETE "DELETE"
#define OAUTH_REQENGINE_STREAMS 1
#define OAUTH_REQENGINE_CURL 2
#define OAUTH_FETCH_USETOKEN 1
#define OAUTH_FETCH_SIGONLY 2
#define OAUTH_FETCH_HEADONLY 4
#define OAUTH_OVERRIDE_HTTP_METHOD 8
#define OAUTH_SSLCHECK_NONE 0
#define OAUTH_SSLCHECK_HOST 1
#define OAUTH_SSLCHECK_PEER 2
#define OAUTH_SSLCHECK_BOTH (OAUTH_SSLCHECK_HOST | OAUTH_SSLCHECK_PEER)
#define OAUTH_DEFAULT_VERSION "1.0"
/* errors */
#define OAUTH_ERR_CONTENT_TYPE "invalidcontentttype"
#define OAUTH_ERR_BAD_REQUEST 400
#define OAUTH_ERR_BAD_AUTH 401
#define OAUTH_ERR_INTERNAL_ERROR 503
/* params */
#define OAUTH_PARAM_CONSUMER_KEY "oauth_consumer_key"
#define OAUTH_PARAM_SIGNATURE "oauth_signature"
#define OAUTH_PARAM_SIGNATURE_METHOD "oauth_signature_method"
#define OAUTH_PARAM_TIMESTAMP "oauth_timestamp"
#define OAUTH_PARAM_NONCE "oauth_nonce"
#define OAUTH_PARAM_VERSION "oauth_version"
#define OAUTH_PARAM_TOKEN "oauth_token"
#define OAUTH_PARAM_ASH "oauth_session_handle"
#define OAUTH_PARAM_VERIFIER "oauth_verifier"
#define OAUTH_PARAM_CALLBACK "oauth_callback"
/* values */
#define OAUTH_CALLBACK_OOB "oob"
#define OAUTH_PARAM_PREFIX "oauth_"
#define OAUTH_PARAM_PREFIX_LEN 6
#ifdef ZTS
#include "TSRM.h"
#endif
PHP_MINIT_FUNCTION(oauth);
PHP_MSHUTDOWN_FUNCTION(oauth);
PHP_MINFO_FUNCTION(oauth);
#ifdef ZTS
#define OAUTH(v) TSRMG(oauth_globals_id, zend_oauth_globals *, v)
#else
#define OAUTH(v) (oauth_globals.v)
#endif
typedef enum { OAUTH_SIGCTX_TYPE_NONE, OAUTH_SIGCTX_TYPE_HMAC, OAUTH_SIGCTX_TYPE_RSA, OAUTH_SIGCTX_TYPE_PLAIN } oauth_sigctx_type;
typedef struct {
oauth_sigctx_type type;
char *hash_algo;
zval privatekey;
} oauth_sig_context;
#define OAUTH_SIGCTX_INIT(ctx) { \
(ctx) = emalloc(sizeof(*(ctx))); \
(ctx)->type = OAUTH_SIGCTX_TYPE_NONE; \
(ctx)->hash_algo = NULL; \
ZVAL_UNDEF(&ctx->privatekey); \
}
#define OAUTH_SIGCTX_HMAC(ctx, algo) { \
(ctx)->type = OAUTH_SIGCTX_TYPE_HMAC; \
(ctx)->hash_algo = algo; \
}
#define OAUTH_SIGCTX_PLAIN(ctx) { \
(ctx)->type = OAUTH_SIGCTX_TYPE_PLAIN; \
}
#define OAUTH_SIGCTX_FREE_PRIVATEKEY(ctx) { \
if (Z_TYPE(ctx->privatekey) != IS_UNDEF) { \
oauth_free_privatekey(&ctx->privatekey); \
ZVAL_UNDEF(&ctx->privatekey); \
} \
}
#define OAUTH_SIGCTX_SET_PRIVATEKEY(ctx, privkey) { \
OAUTH_SIGCTX_FREE_PRIVATEKEY(ctx) \
ZVAL_DUP(&ctx->privatekey, &privkey); \
}
#define OAUTH_SIGCTX_RSA(ctx, algo) { \
(ctx)->type = OAUTH_SIGCTX_TYPE_RSA; \
(ctx)->hash_algo = algo; \
}
#define OAUTH_SIGCTX_FREE(ctx) { \
if (ctx) { \
OAUTH_SIGCTX_FREE_PRIVATEKEY(ctx) \
efree((ctx)); \
} \
}
typedef struct {
zend_string *sbs;
smart_string headers_in;
smart_string headers_out;
smart_string body_in;
smart_string body_out;
smart_string curl_info;
} php_so_debug;
typedef struct {
HashTable *properties;
smart_string lastresponse;
smart_string headers_in;
smart_string headers_out;
char last_location_header[OAUTH_MAX_HEADER_LEN];
uint redirects;
uint multipart_files_num;
uint sslcheck; /* whether we check for SSL verification or not */
uint debug; /* verbose output */
uint follow_redirects; /* follow and sign redirects? */
uint reqengine; /* streams or curl */
long timeout; /* timeout in milliseconds */
char *nonce;
char *timestamp;
zend_string *signature;
zval *this_ptr;
zval debugArr;
oauth_sig_context *sig_ctx;
php_so_debug *debug_info;
char **multipart_files;
char **multipart_params;
uint is_multipart;
void ***thread_ctx;
zend_object zo;
} php_so_object;
static inline php_so_object *so_object_from_obj(zend_object *obj) /* {{{ */ {
return (php_so_object*)((char*)(obj) - XtOffsetOf(php_so_object, zo));
}
/* }}} */
static inline php_so_object *Z_SOO_P(zval *zv) /* {{{ */ {
php_so_object *soo = so_object_from_obj(Z_OBJ_P((zv)));
soo->this_ptr = zv;
return soo;
}
/* }}} */
#ifndef zend_parse_parameters_none
#define zend_parse_parameters_none() \
zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "")
#endif
void soo_handle_error(php_so_object *soo, long errorCode, char *msg, char *response, char *additional_info TSRMLS_DC);
zend_string *oauth_generate_sig_base(php_so_object *soo, const char *http_method, const char *uri, HashTable *post_args, HashTable *extra_args TSRMLS_DC);
#ifndef zend_hash_quick_del
#define HASH_DEL_KEY_QUICK 2
#define zend_hash_quick_del(ht, arKey, nKeyLength, h) \
zend_hash_del_key_or_index(ht, arKey, nKeyLength, h, HASH_DEL_KEY_QUICK)
#endif
#define SO_ME(func, arg_info, flags) PHP_ME(oauth, func, arg_info, flags)
#define SO_MALIAS(func, alias, arg_info, flags) PHP_MALIAS(oauth, func, alias, arg_info, flags)
#define SO_METHOD(func) PHP_METHOD(oauth, func)
#define FREE_ARGS_HASH(a) \
if (a) { \
zend_hash_destroy(a); \
FREE_HASHTABLE(a); \
}
#define INIT_smart_string(a) \
(a).len = 0; \
(a).c = NULL;
#define HTTP_IS_REDIRECT(http_response_code) \
(http_response_code > 300 && http_response_code < 304)
#define INIT_DEBUG_INFO(a) \
INIT_smart_string((a)->headers_out); \
INIT_smart_string((a)->body_in); \
INIT_smart_string((a)->body_out); \
INIT_smart_string((a)->curl_info);
#define FREE_DEBUG_INFO(a) \
smart_string_free(&(a)->headers_out); \
smart_string_free(&(a)->body_in); \
smart_string_free(&(a)->body_out); \
smart_string_free(&(a)->curl_info);
/* this and code that uses it is from ext/curl/interface.c */
#define CAAL(s, v) add_assoc_long_ex(&info, s, sizeof(s), (long) v);
#define CAAD(s, v) add_assoc_double_ex(&info, s, sizeof(s), (double) v);
#define CAAS(s, v) add_assoc_string_ex(&info, s, sizeof(s), (char *) (v ? v : ""));
#define ADD_DEBUG_INFO(a, k, s, t) \
if(s.len) { \
smart_string_0(&(s)); \
if(t) { \
zend_string *tmp, *s_zstr = zend_string_init((s).c, (s).len, 0); \
tmp = php_trim(s_zstr, NULL, 0, 3); \
add_assoc_string((a), k, ZSTR_VAL(tmp)); \
zend_string_release(tmp); \
zend_string_release(s_zstr); \
} else { \
add_assoc_string((a), k, (s).c); \
} \
}
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif
#define OAUTH_OK SUCCESS
#if OAUTH_USE_CURL
long make_req_curl(php_so_object *soo, const char *url, const smart_string *payload, const char *http_method, HashTable *request_headers TSRMLS_DC);
#if LIBCURL_VERSION_NUM >= 0x071304
#define OAUTH_PROTOCOLS_ALLOWED CURLPROTO_HTTP | CURLPROTO_HTTPS
#endif
#endif
void oauth_free_privatekey(zval *privatekey TSRMLS_DC);
zend_string *soo_sign(php_so_object *soo, char *message, zval *cs, zval *ts, const oauth_sig_context *ctx TSRMLS_DC);
oauth_sig_context *oauth_create_sig_context(const char *sigmethod);
zend_string *oauth_url_encode(char *url, int url_len);
#endif
/**
* Local Variables:
* c-basic-offset: 4
* tab-width: 4
* indent-tabs-mode: t
* End:
* vim600: fdm=marker
* vim: noet sw=4 ts=4 noexpandtab
*/
|