Twitter with OAuth Example.\\ see also http://www.soramimi.jp/twicpp/index.html
Dependencies: mbed HTTPClient NTPClient_NetServices EthernetNetIf
oauth.h@1:c3f74457cad4, 2012-11-15 (annotated)
- Committer:
- soramimi
- Date:
- Thu Nov 15 00:51:45 2012 +0000
- Revision:
- 1:c3f74457cad4
- Parent:
- 0:7ddb56bfde0c
Twitter API address changed.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
soramimi | 0:7ddb56bfde0c | 1 | /** |
soramimi | 0:7ddb56bfde0c | 2 | * @brief OAuth.net implementation in POSIX-C. |
soramimi | 0:7ddb56bfde0c | 3 | * @file oauth.h |
soramimi | 0:7ddb56bfde0c | 4 | * @author Robin Gareus <robin@gareus.org> |
soramimi | 0:7ddb56bfde0c | 5 | * |
soramimi | 0:7ddb56bfde0c | 6 | * Copyright 2007-2010 Robin Gareus <robin@gareus.org> |
soramimi | 0:7ddb56bfde0c | 7 | * |
soramimi | 0:7ddb56bfde0c | 8 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
soramimi | 0:7ddb56bfde0c | 9 | * of this software and associated documentation files (the "Software"), to deal |
soramimi | 0:7ddb56bfde0c | 10 | * in the Software without restriction, including without limitation the rights |
soramimi | 0:7ddb56bfde0c | 11 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
soramimi | 0:7ddb56bfde0c | 12 | * copies of the Software, and to permit persons to whom the Software is |
soramimi | 0:7ddb56bfde0c | 13 | * furnished to do so, subject to the following conditions: |
soramimi | 0:7ddb56bfde0c | 14 | * |
soramimi | 0:7ddb56bfde0c | 15 | * The above copyright notice and this permission notice shall be included in |
soramimi | 0:7ddb56bfde0c | 16 | * all copies or substantial portions of the Software. |
soramimi | 0:7ddb56bfde0c | 17 | * |
soramimi | 0:7ddb56bfde0c | 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
soramimi | 0:7ddb56bfde0c | 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
soramimi | 0:7ddb56bfde0c | 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
soramimi | 0:7ddb56bfde0c | 21 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
soramimi | 0:7ddb56bfde0c | 22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
soramimi | 0:7ddb56bfde0c | 23 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
soramimi | 0:7ddb56bfde0c | 24 | * THE SOFTWARE. |
soramimi | 0:7ddb56bfde0c | 25 | * |
soramimi | 0:7ddb56bfde0c | 26 | */ |
soramimi | 0:7ddb56bfde0c | 27 | #ifndef _OAUTH_H |
soramimi | 0:7ddb56bfde0c | 28 | #define _OAUTH_H 1 |
soramimi | 0:7ddb56bfde0c | 29 | |
soramimi | 0:7ddb56bfde0c | 30 | #include <vector> |
soramimi | 0:7ddb56bfde0c | 31 | #include <string> |
soramimi | 0:7ddb56bfde0c | 32 | |
soramimi | 0:7ddb56bfde0c | 33 | #include <stdlib.h> |
soramimi | 0:7ddb56bfde0c | 34 | |
soramimi | 0:7ddb56bfde0c | 35 | #ifndef DOXYGEN_IGNORE |
soramimi | 0:7ddb56bfde0c | 36 | // liboauth version |
soramimi | 0:7ddb56bfde0c | 37 | #define LIBOAUTH_VERSION "0.8.9" |
soramimi | 0:7ddb56bfde0c | 38 | #define LIBOAUTH_VERSION_MAJOR 0 |
soramimi | 0:7ddb56bfde0c | 39 | #define LIBOAUTH_VERSION_MINOR 8 |
soramimi | 0:7ddb56bfde0c | 40 | #define LIBOAUTH_VERSION_MICRO 9 |
soramimi | 0:7ddb56bfde0c | 41 | |
soramimi | 0:7ddb56bfde0c | 42 | //interface revision number |
soramimi | 0:7ddb56bfde0c | 43 | //http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html |
soramimi | 0:7ddb56bfde0c | 44 | #define LIBOAUTH_CUR 7 |
soramimi | 0:7ddb56bfde0c | 45 | #define LIBOAUTH_REV 0 |
soramimi | 0:7ddb56bfde0c | 46 | #define LIBOAUTH_AGE 7 |
soramimi | 0:7ddb56bfde0c | 47 | #endif |
soramimi | 0:7ddb56bfde0c | 48 | |
soramimi | 0:7ddb56bfde0c | 49 | #ifdef __GNUC__ |
soramimi | 0:7ddb56bfde0c | 50 | # define OA_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > x || __GNUC__ == x && __GNUC_MINOR__ >= y) |
soramimi | 0:7ddb56bfde0c | 51 | #else |
soramimi | 0:7ddb56bfde0c | 52 | # define OA_GCC_VERSION_AT_LEAST(x,y) 0 |
soramimi | 0:7ddb56bfde0c | 53 | #endif |
soramimi | 0:7ddb56bfde0c | 54 | |
soramimi | 0:7ddb56bfde0c | 55 | #ifndef attribute_deprecated |
soramimi | 0:7ddb56bfde0c | 56 | #if OA_GCC_VERSION_AT_LEAST(3,1) |
soramimi | 0:7ddb56bfde0c | 57 | # define attribute_deprecated __attribute__((deprecated)) |
soramimi | 0:7ddb56bfde0c | 58 | #else |
soramimi | 0:7ddb56bfde0c | 59 | # define attribute_deprecated |
soramimi | 0:7ddb56bfde0c | 60 | #endif |
soramimi | 0:7ddb56bfde0c | 61 | #endif |
soramimi | 0:7ddb56bfde0c | 62 | |
soramimi | 0:7ddb56bfde0c | 63 | /** \enum OAuthMethod |
soramimi | 0:7ddb56bfde0c | 64 | * signature method to used for signing the request. |
soramimi | 0:7ddb56bfde0c | 65 | */ |
soramimi | 0:7ddb56bfde0c | 66 | typedef enum { |
soramimi | 0:7ddb56bfde0c | 67 | OA_HMAC=0, ///< use HMAC-SHA1 request signing method |
soramimi | 0:7ddb56bfde0c | 68 | OA_RSA, ///< use RSA signature |
soramimi | 0:7ddb56bfde0c | 69 | OA_PLAINTEXT ///< use plain text signature (for testing only) |
soramimi | 0:7ddb56bfde0c | 70 | } OAuthMethod; |
soramimi | 0:7ddb56bfde0c | 71 | |
soramimi | 0:7ddb56bfde0c | 72 | /** |
soramimi | 0:7ddb56bfde0c | 73 | * Base64 encode and return size data in 'src'. The caller must free the |
soramimi | 0:7ddb56bfde0c | 74 | * returned string. |
soramimi | 0:7ddb56bfde0c | 75 | * |
soramimi | 0:7ddb56bfde0c | 76 | * @param size The size of the data in src |
soramimi | 0:7ddb56bfde0c | 77 | * @param src The data to be base64 encode |
soramimi | 0:7ddb56bfde0c | 78 | * @return encoded string otherwise NULL |
soramimi | 0:7ddb56bfde0c | 79 | */ |
soramimi | 0:7ddb56bfde0c | 80 | std::string oauth_encode_base64(const unsigned char *src, int size); |
soramimi | 0:7ddb56bfde0c | 81 | |
soramimi | 0:7ddb56bfde0c | 82 | /** |
soramimi | 0:7ddb56bfde0c | 83 | * Decode the base64 encoded string 'src' into the memory pointed to by |
soramimi | 0:7ddb56bfde0c | 84 | * 'dest'. |
soramimi | 0:7ddb56bfde0c | 85 | * |
soramimi | 0:7ddb56bfde0c | 86 | * @param dest Pointer to memory for holding the decoded string. |
soramimi | 0:7ddb56bfde0c | 87 | * Must be large enough to receive the decoded string. |
soramimi | 0:7ddb56bfde0c | 88 | * @param src A base64 encoded string. |
soramimi | 0:7ddb56bfde0c | 89 | * @return the length of the decoded string if decode |
soramimi | 0:7ddb56bfde0c | 90 | * succeeded otherwise 0. |
soramimi | 0:7ddb56bfde0c | 91 | */ |
soramimi | 0:7ddb56bfde0c | 92 | std::string oauth_decode_base64(const char *src); |
soramimi | 0:7ddb56bfde0c | 93 | |
soramimi | 0:7ddb56bfde0c | 94 | /** |
soramimi | 0:7ddb56bfde0c | 95 | * Escape 'string' according to RFC3986 and |
soramimi | 0:7ddb56bfde0c | 96 | * http://oauth.net/core/1.0/#encoding_parameters. |
soramimi | 0:7ddb56bfde0c | 97 | * |
soramimi | 0:7ddb56bfde0c | 98 | * @param string The data to be encoded |
soramimi | 0:7ddb56bfde0c | 99 | * @return encoded string otherwise NULL |
soramimi | 0:7ddb56bfde0c | 100 | * The caller must free the returned string. |
soramimi | 0:7ddb56bfde0c | 101 | */ |
soramimi | 0:7ddb56bfde0c | 102 | std::string oauth_url_escape(const char *string); |
soramimi | 0:7ddb56bfde0c | 103 | |
soramimi | 0:7ddb56bfde0c | 104 | /** |
soramimi | 0:7ddb56bfde0c | 105 | * Parse RFC3986 encoded 'string' back to unescaped version. |
soramimi | 0:7ddb56bfde0c | 106 | * |
soramimi | 0:7ddb56bfde0c | 107 | * @param string The data to be unescaped |
soramimi | 0:7ddb56bfde0c | 108 | * @param olen unless NULL the length of the returned string is stored there. |
soramimi | 0:7ddb56bfde0c | 109 | * @return decoded string or NULL |
soramimi | 0:7ddb56bfde0c | 110 | * The caller must free the returned string. |
soramimi | 0:7ddb56bfde0c | 111 | */ |
soramimi | 0:7ddb56bfde0c | 112 | std::string oauth_url_unescape(const char *string); |
soramimi | 0:7ddb56bfde0c | 113 | |
soramimi | 0:7ddb56bfde0c | 114 | |
soramimi | 0:7ddb56bfde0c | 115 | /** |
soramimi | 0:7ddb56bfde0c | 116 | * returns base64 encoded HMAC-SHA1 signature for |
soramimi | 0:7ddb56bfde0c | 117 | * given message and key. |
soramimi | 0:7ddb56bfde0c | 118 | * both data and key need to be urlencoded. |
soramimi | 0:7ddb56bfde0c | 119 | * |
soramimi | 0:7ddb56bfde0c | 120 | * the returned string needs to be freed by the caller |
soramimi | 0:7ddb56bfde0c | 121 | * |
soramimi | 0:7ddb56bfde0c | 122 | * @param m message to be signed |
soramimi | 0:7ddb56bfde0c | 123 | * @param k key used for signing |
soramimi | 0:7ddb56bfde0c | 124 | * @return signature string. |
soramimi | 0:7ddb56bfde0c | 125 | */ |
soramimi | 0:7ddb56bfde0c | 126 | std::string oauth_sign_hmac_sha1 (const char *m, const char *k); |
soramimi | 0:7ddb56bfde0c | 127 | |
soramimi | 0:7ddb56bfde0c | 128 | /** |
soramimi | 0:7ddb56bfde0c | 129 | * same as \ref oauth_sign_hmac_sha1 but allows |
soramimi | 0:7ddb56bfde0c | 130 | * to specify length of message and key (in case they contain null chars). |
soramimi | 0:7ddb56bfde0c | 131 | * |
soramimi | 0:7ddb56bfde0c | 132 | * @param m message to be signed |
soramimi | 0:7ddb56bfde0c | 133 | * @param ml length of message |
soramimi | 0:7ddb56bfde0c | 134 | * @param k key used for signing |
soramimi | 0:7ddb56bfde0c | 135 | * @param kl length of key |
soramimi | 0:7ddb56bfde0c | 136 | * @return signature string. |
soramimi | 0:7ddb56bfde0c | 137 | */ |
soramimi | 0:7ddb56bfde0c | 138 | std::string oauth_sign_hmac_sha1_raw(const char *m, const size_t ml, const char *k, const size_t kl); |
soramimi | 0:7ddb56bfde0c | 139 | |
soramimi | 0:7ddb56bfde0c | 140 | /** |
soramimi | 0:7ddb56bfde0c | 141 | * returns plaintext signature for the given key. |
soramimi | 0:7ddb56bfde0c | 142 | * |
soramimi | 0:7ddb56bfde0c | 143 | * the returned string needs to be freed by the caller |
soramimi | 0:7ddb56bfde0c | 144 | * |
soramimi | 0:7ddb56bfde0c | 145 | * @param m message to be signed |
soramimi | 0:7ddb56bfde0c | 146 | * @param k key used for signing |
soramimi | 0:7ddb56bfde0c | 147 | * @return signature string |
soramimi | 0:7ddb56bfde0c | 148 | */ |
soramimi | 0:7ddb56bfde0c | 149 | std::string oauth_sign_plaintext(const char *m, const char *k); |
soramimi | 0:7ddb56bfde0c | 150 | |
soramimi | 0:7ddb56bfde0c | 151 | /** |
soramimi | 0:7ddb56bfde0c | 152 | * returns RSA-SHA1 signature for given data. |
soramimi | 0:7ddb56bfde0c | 153 | * the returned signature needs to be freed by the caller. |
soramimi | 0:7ddb56bfde0c | 154 | * |
soramimi | 0:7ddb56bfde0c | 155 | * @param m message to be signed |
soramimi | 0:7ddb56bfde0c | 156 | * @param k private-key PKCS and Base64-encoded |
soramimi | 0:7ddb56bfde0c | 157 | * @return base64 encoded signature string. |
soramimi | 0:7ddb56bfde0c | 158 | */ |
soramimi | 0:7ddb56bfde0c | 159 | //std::string oauth_sign_rsa_sha1 (const char *m, const char *k); |
soramimi | 0:7ddb56bfde0c | 160 | |
soramimi | 0:7ddb56bfde0c | 161 | /** |
soramimi | 0:7ddb56bfde0c | 162 | * verify RSA-SHA1 signature. |
soramimi | 0:7ddb56bfde0c | 163 | * |
soramimi | 0:7ddb56bfde0c | 164 | * returns the output of EVP_VerifyFinal() for a given message, |
soramimi | 0:7ddb56bfde0c | 165 | * cert/pubkey and signature. |
soramimi | 0:7ddb56bfde0c | 166 | * |
soramimi | 0:7ddb56bfde0c | 167 | * @param m message to be verified |
soramimi | 0:7ddb56bfde0c | 168 | * @param c public-key or x509 certificate |
soramimi | 0:7ddb56bfde0c | 169 | * @param s base64 encoded signature |
soramimi | 0:7ddb56bfde0c | 170 | * @return 1 for a correct signature, 0 for failure and -1 if some other error occurred |
soramimi | 0:7ddb56bfde0c | 171 | */ |
soramimi | 0:7ddb56bfde0c | 172 | int oauth_verify_rsa_sha1(const char *m, const char *c, const char *s); |
soramimi | 0:7ddb56bfde0c | 173 | |
soramimi | 0:7ddb56bfde0c | 174 | /** |
soramimi | 0:7ddb56bfde0c | 175 | * url-escape strings and concatenate with '&' separator. |
soramimi | 0:7ddb56bfde0c | 176 | * The number of strings to be concatenated must be |
soramimi | 0:7ddb56bfde0c | 177 | * given as first argument. |
soramimi | 0:7ddb56bfde0c | 178 | * all arguments thereafter must be of type (char *) |
soramimi | 0:7ddb56bfde0c | 179 | * |
soramimi | 0:7ddb56bfde0c | 180 | * @param len the number of arguments to follow this parameter |
soramimi | 0:7ddb56bfde0c | 181 | * |
soramimi | 0:7ddb56bfde0c | 182 | * @return pointer to memory holding the concatenated |
soramimi | 0:7ddb56bfde0c | 183 | * strings - needs to be free(d) by the caller. or NULL |
soramimi | 0:7ddb56bfde0c | 184 | * in case we ran out of memory. |
soramimi | 0:7ddb56bfde0c | 185 | */ |
soramimi | 0:7ddb56bfde0c | 186 | std::string oauth_catenc(int len, ...); |
soramimi | 0:7ddb56bfde0c | 187 | |
soramimi | 0:7ddb56bfde0c | 188 | /** |
soramimi | 0:7ddb56bfde0c | 189 | * splits the given url into a parameter array. |
soramimi | 0:7ddb56bfde0c | 190 | * (see \ref oauth_serialize_url and \ref oauth_serialize_url_parameters for the reverse) |
soramimi | 0:7ddb56bfde0c | 191 | * (see \ref oauth_split_post_paramters for a more generic version) |
soramimi | 0:7ddb56bfde0c | 192 | * |
soramimi | 0:7ddb56bfde0c | 193 | * @param url the url or query-string to parse; may be NULL |
soramimi | 0:7ddb56bfde0c | 194 | * @param argv pointer to a (char *) array where the results are stored. |
soramimi | 0:7ddb56bfde0c | 195 | * The array is re-allocated to match the number of parameters and each |
soramimi | 0:7ddb56bfde0c | 196 | * parameter-string is allocated with strdup. - The memory needs to be freed |
soramimi | 0:7ddb56bfde0c | 197 | * by the caller. |
soramimi | 0:7ddb56bfde0c | 198 | * |
soramimi | 0:7ddb56bfde0c | 199 | * @return number of parameter(s) in array. |
soramimi | 0:7ddb56bfde0c | 200 | */ |
soramimi | 0:7ddb56bfde0c | 201 | void oauth_split_url_parameters(const char *url, char ***argv); |
soramimi | 0:7ddb56bfde0c | 202 | |
soramimi | 0:7ddb56bfde0c | 203 | /** |
soramimi | 0:7ddb56bfde0c | 204 | * splits the given url into a parameter array. |
soramimi | 0:7ddb56bfde0c | 205 | * (see \ref oauth_serialize_url and \ref oauth_serialize_url_parameters for the reverse) |
soramimi | 0:7ddb56bfde0c | 206 | * |
soramimi | 0:7ddb56bfde0c | 207 | * @param url the url or query-string to parse. |
soramimi | 0:7ddb56bfde0c | 208 | * @param argv pointer to a (char *) array where the results are stored. |
soramimi | 0:7ddb56bfde0c | 209 | * The array is re-allocated to match the number of parameters and each |
soramimi | 0:7ddb56bfde0c | 210 | * parameter-string is allocated with strdup. - The memory needs to be freed |
soramimi | 0:7ddb56bfde0c | 211 | * by the caller. |
soramimi | 0:7ddb56bfde0c | 212 | * @param qesc use query parameter escape (vs post-param-escape) - if set |
soramimi | 0:7ddb56bfde0c | 213 | * to 1 all '+' are treated as spaces ' ' |
soramimi | 0:7ddb56bfde0c | 214 | * |
soramimi | 0:7ddb56bfde0c | 215 | * @return number of parameter(s) in array. |
soramimi | 0:7ddb56bfde0c | 216 | */ |
soramimi | 0:7ddb56bfde0c | 217 | void oauth_split_post_paramters(const char *url, char ***argv, short qesc); |
soramimi | 0:7ddb56bfde0c | 218 | |
soramimi | 0:7ddb56bfde0c | 219 | /** |
soramimi | 0:7ddb56bfde0c | 220 | * build a url query string from an array. |
soramimi | 0:7ddb56bfde0c | 221 | * |
soramimi | 0:7ddb56bfde0c | 222 | * @param argc the total number of elements in the array |
soramimi | 0:7ddb56bfde0c | 223 | * @param start element in the array at which to start concatenating. |
soramimi | 0:7ddb56bfde0c | 224 | * @param argv parameter-array to concatenate. |
soramimi | 0:7ddb56bfde0c | 225 | * @return url string needs to be freed by the caller. |
soramimi | 0:7ddb56bfde0c | 226 | * |
soramimi | 0:7ddb56bfde0c | 227 | */ |
soramimi | 0:7ddb56bfde0c | 228 | std::string oauth_serialize_url (std::vector<std::string> const &argv, int start); |
soramimi | 0:7ddb56bfde0c | 229 | |
soramimi | 0:7ddb56bfde0c | 230 | /** |
soramimi | 0:7ddb56bfde0c | 231 | * encode query parameters from an array. |
soramimi | 0:7ddb56bfde0c | 232 | * |
soramimi | 0:7ddb56bfde0c | 233 | * @param argc the total number of elements in the array |
soramimi | 0:7ddb56bfde0c | 234 | * @param start element in the array at which to start concatenating. |
soramimi | 0:7ddb56bfde0c | 235 | * @param argv parameter-array to concatenate. |
soramimi | 0:7ddb56bfde0c | 236 | * @param sep separator for parameters (usually "&") |
soramimi | 0:7ddb56bfde0c | 237 | * @param mod - bitwise modifiers: |
soramimi | 0:7ddb56bfde0c | 238 | * 1: skip all values that start with "oauth_" |
soramimi | 0:7ddb56bfde0c | 239 | * 2: skip all values that don't start with "oauth_" |
soramimi | 0:7ddb56bfde0c | 240 | * 4: double quotation marks are added around values (use with sep ", " for HTTP Authorization header). |
soramimi | 0:7ddb56bfde0c | 241 | * @return url string needs to be freed by the caller. |
soramimi | 0:7ddb56bfde0c | 242 | */ |
soramimi | 0:7ddb56bfde0c | 243 | std::string oauth_serialize_url_sep (std::vector<std::string> const &argv, int start, char const *sep, int mod); |
soramimi | 0:7ddb56bfde0c | 244 | |
soramimi | 0:7ddb56bfde0c | 245 | /** |
soramimi | 0:7ddb56bfde0c | 246 | * build a query parameter string from an array. |
soramimi | 0:7ddb56bfde0c | 247 | * |
soramimi | 0:7ddb56bfde0c | 248 | * This function is a shortcut for \ref oauth_serialize_url (argc, 1, argv). |
soramimi | 0:7ddb56bfde0c | 249 | * It strips the leading host/path, which is usually the first |
soramimi | 0:7ddb56bfde0c | 250 | * element when using oauth_split_url_parameters on an URL. |
soramimi | 0:7ddb56bfde0c | 251 | * |
soramimi | 0:7ddb56bfde0c | 252 | * @param argc the total number of elements in the array |
soramimi | 0:7ddb56bfde0c | 253 | * @param argv parameter-array to concatenate. |
soramimi | 0:7ddb56bfde0c | 254 | * @return url string needs to be freed by the caller. |
soramimi | 0:7ddb56bfde0c | 255 | */ |
soramimi | 0:7ddb56bfde0c | 256 | std::string oauth_serialize_url_parameters (std::vector<std::string> const &argv); |
soramimi | 0:7ddb56bfde0c | 257 | |
soramimi | 0:7ddb56bfde0c | 258 | /** |
soramimi | 0:7ddb56bfde0c | 259 | * generate a random string between 15 and 32 chars length |
soramimi | 0:7ddb56bfde0c | 260 | * and return a pointer to it. The value needs to be freed by the |
soramimi | 0:7ddb56bfde0c | 261 | * caller |
soramimi | 0:7ddb56bfde0c | 262 | * |
soramimi | 0:7ddb56bfde0c | 263 | * @return zero terminated random string. |
soramimi | 0:7ddb56bfde0c | 264 | */ |
soramimi | 0:7ddb56bfde0c | 265 | std::string oauth_gen_nonce(); |
soramimi | 0:7ddb56bfde0c | 266 | |
soramimi | 0:7ddb56bfde0c | 267 | /** |
soramimi | 0:7ddb56bfde0c | 268 | * string compare function for oauth parameters. |
soramimi | 0:7ddb56bfde0c | 269 | * |
soramimi | 0:7ddb56bfde0c | 270 | * used with qsort. needed to normalize request parameters. |
soramimi | 0:7ddb56bfde0c | 271 | * see http://oauth.net/core/1.0/#anchor14 |
soramimi | 0:7ddb56bfde0c | 272 | */ |
soramimi | 0:7ddb56bfde0c | 273 | int oauth_cmpstringp(const void *p1, const void *p2); |
soramimi | 0:7ddb56bfde0c | 274 | |
soramimi | 0:7ddb56bfde0c | 275 | |
soramimi | 0:7ddb56bfde0c | 276 | /** |
soramimi | 0:7ddb56bfde0c | 277 | * search array for parameter key. |
soramimi | 0:7ddb56bfde0c | 278 | * @param argv length of array to search |
soramimi | 0:7ddb56bfde0c | 279 | * @param argc parameter array to search |
soramimi | 0:7ddb56bfde0c | 280 | * @param key key of parameter to check. |
soramimi | 0:7ddb56bfde0c | 281 | * |
soramimi | 0:7ddb56bfde0c | 282 | * @return FALSE (0) if array does not contain a parameter with given key, TRUE (1) otherwise. |
soramimi | 0:7ddb56bfde0c | 283 | */ |
soramimi | 0:7ddb56bfde0c | 284 | bool oauth_param_exists(std::vector<std::string> const &argv, char const *key); |
soramimi | 0:7ddb56bfde0c | 285 | |
soramimi | 0:7ddb56bfde0c | 286 | /** |
soramimi | 0:7ddb56bfde0c | 287 | * free array args |
soramimi | 0:7ddb56bfde0c | 288 | * |
soramimi | 0:7ddb56bfde0c | 289 | * @param argcp pointer to array length int |
soramimi | 0:7ddb56bfde0c | 290 | * @param argvp pointer to array values to be free()d |
soramimi | 0:7ddb56bfde0c | 291 | */ |
soramimi | 0:7ddb56bfde0c | 292 | void oauth_free_array(int *argcp, std::vector<std::string> *argvp); |
soramimi | 0:7ddb56bfde0c | 293 | |
soramimi | 0:7ddb56bfde0c | 294 | /** |
soramimi | 0:7ddb56bfde0c | 295 | * calculate OAuth-signature for a given HTTP request URL, parameters and oauth-tokens. |
soramimi | 0:7ddb56bfde0c | 296 | * |
soramimi | 0:7ddb56bfde0c | 297 | * if 'postargs' is NULL a "GET" request is signed and the |
soramimi | 0:7ddb56bfde0c | 298 | * signed URL is returned. Else this fn will modify 'postargs' |
soramimi | 0:7ddb56bfde0c | 299 | * to point to memory that contains the signed POST-variables |
soramimi | 0:7ddb56bfde0c | 300 | * and returns the base URL. |
soramimi | 0:7ddb56bfde0c | 301 | * |
soramimi | 0:7ddb56bfde0c | 302 | * both, the return value and (if given) 'postargs' need to be freed |
soramimi | 0:7ddb56bfde0c | 303 | * by the caller. |
soramimi | 0:7ddb56bfde0c | 304 | * |
soramimi | 0:7ddb56bfde0c | 305 | * @param url The request URL to be signed. append all GET or POST |
soramimi | 0:7ddb56bfde0c | 306 | * query-parameters separated by either '?' or '&' to this parameter. |
soramimi | 0:7ddb56bfde0c | 307 | * |
soramimi | 0:7ddb56bfde0c | 308 | * @param postargs This parameter points to an area where the return value |
soramimi | 0:7ddb56bfde0c | 309 | * is stored. If 'postargs' is NULL, no value is stored. |
soramimi | 0:7ddb56bfde0c | 310 | * |
soramimi | 0:7ddb56bfde0c | 311 | * @param method specify the signature method to use. It is of type |
soramimi | 0:7ddb56bfde0c | 312 | * \ref OAuthMethod and most likely \ref OA_HMAC. |
soramimi | 0:7ddb56bfde0c | 313 | * |
soramimi | 0:7ddb56bfde0c | 314 | * @param http_method The HTTP request method to use (ie "GET", "PUT",..) |
soramimi | 0:7ddb56bfde0c | 315 | * If NULL is given as 'http_method' this defaults to "GET" when |
soramimi | 0:7ddb56bfde0c | 316 | * 'postargs' is also NULL and when postargs is not NULL "POST" is used. |
soramimi | 0:7ddb56bfde0c | 317 | * |
soramimi | 0:7ddb56bfde0c | 318 | * @param c_key consumer key |
soramimi | 0:7ddb56bfde0c | 319 | * @param c_secret consumer secret |
soramimi | 0:7ddb56bfde0c | 320 | * @param t_key token key |
soramimi | 0:7ddb56bfde0c | 321 | * @param t_secret token secret |
soramimi | 0:7ddb56bfde0c | 322 | * |
soramimi | 0:7ddb56bfde0c | 323 | * @return the signed url or NULL if an error occurred. |
soramimi | 0:7ddb56bfde0c | 324 | * |
soramimi | 0:7ddb56bfde0c | 325 | */ |
soramimi | 0:7ddb56bfde0c | 326 | std::string oauth_sign_url2 (const char *url, std::string *postargs, |
soramimi | 0:7ddb56bfde0c | 327 | OAuthMethod method, |
soramimi | 0:7ddb56bfde0c | 328 | const char *http_method, //< HTTP request method |
soramimi | 0:7ddb56bfde0c | 329 | const char *c_key, //< consumer key - posted plain text |
soramimi | 0:7ddb56bfde0c | 330 | const char *c_secret, //< consumer secret - used as 1st part of secret-key |
soramimi | 0:7ddb56bfde0c | 331 | const char *t_key, //< token key - posted plain text in URL |
soramimi | 0:7ddb56bfde0c | 332 | const char *t_secret //< token secret - used as 2st part of secret-key |
soramimi | 0:7ddb56bfde0c | 333 | ); |
soramimi | 0:7ddb56bfde0c | 334 | |
soramimi | 0:7ddb56bfde0c | 335 | /** |
soramimi | 0:7ddb56bfde0c | 336 | * @deprecated Use oauth_sign_url2() instead. |
soramimi | 0:7ddb56bfde0c | 337 | */ |
soramimi | 0:7ddb56bfde0c | 338 | std::string oauth_sign_url (const char *url, std::string *postargs, |
soramimi | 0:7ddb56bfde0c | 339 | OAuthMethod method, |
soramimi | 0:7ddb56bfde0c | 340 | const char *c_key, //< consumer key - posted plain text |
soramimi | 0:7ddb56bfde0c | 341 | const char *c_secret, //< consumer secret - used as 1st part of secret-key |
soramimi | 0:7ddb56bfde0c | 342 | const char *t_key, //< token key - posted plain text in URL |
soramimi | 0:7ddb56bfde0c | 343 | const char *t_secret //< token secret - used as 2st part of secret-key |
soramimi | 0:7ddb56bfde0c | 344 | ) attribute_deprecated; |
soramimi | 0:7ddb56bfde0c | 345 | |
soramimi | 0:7ddb56bfde0c | 346 | |
soramimi | 0:7ddb56bfde0c | 347 | /** |
soramimi | 0:7ddb56bfde0c | 348 | * the back-end behind by /ref oauth_sign_array2. |
soramimi | 0:7ddb56bfde0c | 349 | * however it does not serialize the signed URL again. |
soramimi | 0:7ddb56bfde0c | 350 | * The user needs to call /ref oauth_serialize_url (oA) |
soramimi | 0:7ddb56bfde0c | 351 | * and /ref oauth_free_array to do so. |
soramimi | 0:7ddb56bfde0c | 352 | * |
soramimi | 0:7ddb56bfde0c | 353 | * This allows to split parts of the URL to be used for |
soramimi | 0:7ddb56bfde0c | 354 | * OAuth HTTP Authorization header: |
soramimi | 0:7ddb56bfde0c | 355 | * see http://oauth.net/core/1.0a/#consumer_req_param |
soramimi | 0:7ddb56bfde0c | 356 | * the oauthtest2 example code does so. |
soramimi | 0:7ddb56bfde0c | 357 | * |
soramimi | 0:7ddb56bfde0c | 358 | * |
soramimi | 0:7ddb56bfde0c | 359 | * @param argcp pointer to array length int |
soramimi | 0:7ddb56bfde0c | 360 | * @param argvp pointer to array values |
soramimi | 0:7ddb56bfde0c | 361 | * (argv[0]="http://example.org:80/" argv[1]="first=QueryParamater" .. |
soramimi | 0:7ddb56bfde0c | 362 | * the array is modified: fi. oauth_ parameters are added) |
soramimi | 0:7ddb56bfde0c | 363 | * These arrays can be generated with /ref oauth_split_url_parameters |
soramimi | 0:7ddb56bfde0c | 364 | * or /ref oauth_split_post_paramters. |
soramimi | 0:7ddb56bfde0c | 365 | * |
soramimi | 0:7ddb56bfde0c | 366 | * @param postargs This parameter points to an area where the return value |
soramimi | 0:7ddb56bfde0c | 367 | * is stored. If 'postargs' is NULL, no value is stored. |
soramimi | 0:7ddb56bfde0c | 368 | * |
soramimi | 0:7ddb56bfde0c | 369 | * @param method specify the signature method to use. It is of type |
soramimi | 0:7ddb56bfde0c | 370 | * \ref OAuthMethod and most likely \ref OA_HMAC. |
soramimi | 0:7ddb56bfde0c | 371 | * |
soramimi | 0:7ddb56bfde0c | 372 | * @param http_method The HTTP request method to use (ie "GET", "PUT",..) |
soramimi | 0:7ddb56bfde0c | 373 | * If NULL is given as 'http_method' this defaults to "GET" when |
soramimi | 0:7ddb56bfde0c | 374 | * 'postargs' is also NULL and when postargs is not NULL "POST" is used. |
soramimi | 0:7ddb56bfde0c | 375 | * |
soramimi | 0:7ddb56bfde0c | 376 | * @param c_key consumer key |
soramimi | 0:7ddb56bfde0c | 377 | * @param c_secret consumer secret |
soramimi | 0:7ddb56bfde0c | 378 | * @param t_key token key |
soramimi | 0:7ddb56bfde0c | 379 | * @param t_secret token secret |
soramimi | 0:7ddb56bfde0c | 380 | * |
soramimi | 0:7ddb56bfde0c | 381 | * @return void |
soramimi | 0:7ddb56bfde0c | 382 | * |
soramimi | 0:7ddb56bfde0c | 383 | */ |
soramimi | 0:7ddb56bfde0c | 384 | void oauth_sign_array2_process (std::vector<std::string> *argvp, |
soramimi | 0:7ddb56bfde0c | 385 | std::string *postargs, |
soramimi | 0:7ddb56bfde0c | 386 | OAuthMethod method, |
soramimi | 0:7ddb56bfde0c | 387 | const char *http_method, //< HTTP request method |
soramimi | 0:7ddb56bfde0c | 388 | const char *c_key, //< consumer key - posted plain text |
soramimi | 0:7ddb56bfde0c | 389 | const char *c_secret, //< consumer secret - used as 1st part of secret-key |
soramimi | 0:7ddb56bfde0c | 390 | const char *t_key, //< token key - posted plain text in URL |
soramimi | 0:7ddb56bfde0c | 391 | const char *t_secret //< token secret - used as 2st part of secret-key |
soramimi | 0:7ddb56bfde0c | 392 | ); |
soramimi | 0:7ddb56bfde0c | 393 | |
soramimi | 0:7ddb56bfde0c | 394 | /** |
soramimi | 0:7ddb56bfde0c | 395 | * same as /ref oauth_sign_url |
soramimi | 0:7ddb56bfde0c | 396 | * with the url already split into parameter array |
soramimi | 0:7ddb56bfde0c | 397 | * |
soramimi | 0:7ddb56bfde0c | 398 | * @param argcp pointer to array length int |
soramimi | 0:7ddb56bfde0c | 399 | * @param argvp pointer to array values |
soramimi | 0:7ddb56bfde0c | 400 | * (argv[0]="http://example.org:80/" argv[1]="first=QueryParamater" .. |
soramimi | 0:7ddb56bfde0c | 401 | * the array is modified: fi. oauth_ parameters are added) |
soramimi | 0:7ddb56bfde0c | 402 | * These arrays can be generated with /ref oauth_split_url_parameters |
soramimi | 0:7ddb56bfde0c | 403 | * or /ref oauth_split_post_paramters. |
soramimi | 0:7ddb56bfde0c | 404 | * |
soramimi | 0:7ddb56bfde0c | 405 | * @param postargs This parameter points to an area where the return value |
soramimi | 0:7ddb56bfde0c | 406 | * is stored. If 'postargs' is NULL, no value is stored. |
soramimi | 0:7ddb56bfde0c | 407 | * |
soramimi | 0:7ddb56bfde0c | 408 | * @param method specify the signature method to use. It is of type |
soramimi | 0:7ddb56bfde0c | 409 | * \ref OAuthMethod and most likely \ref OA_HMAC. |
soramimi | 0:7ddb56bfde0c | 410 | * |
soramimi | 0:7ddb56bfde0c | 411 | * @param http_method The HTTP request method to use (ie "GET", "PUT",..) |
soramimi | 0:7ddb56bfde0c | 412 | * If NULL is given as 'http_method' this defaults to "GET" when |
soramimi | 0:7ddb56bfde0c | 413 | * 'postargs' is also NULL and when postargs is not NULL "POST" is used. |
soramimi | 0:7ddb56bfde0c | 414 | * |
soramimi | 0:7ddb56bfde0c | 415 | * @param c_key consumer key |
soramimi | 0:7ddb56bfde0c | 416 | * @param c_secret consumer secret |
soramimi | 0:7ddb56bfde0c | 417 | * @param t_key token key |
soramimi | 0:7ddb56bfde0c | 418 | * @param t_secret token secret |
soramimi | 0:7ddb56bfde0c | 419 | * |
soramimi | 0:7ddb56bfde0c | 420 | * @return the signed url or NULL if an error occurred. |
soramimi | 0:7ddb56bfde0c | 421 | */ |
soramimi | 0:7ddb56bfde0c | 422 | std::string oauth_sign_array2 (std::vector<std::string> *argvp, |
soramimi | 0:7ddb56bfde0c | 423 | std::string *postargs, |
soramimi | 0:7ddb56bfde0c | 424 | OAuthMethod method, |
soramimi | 0:7ddb56bfde0c | 425 | const char *http_method, //< HTTP request method |
soramimi | 0:7ddb56bfde0c | 426 | const char *c_key, //< consumer key - posted plain text |
soramimi | 0:7ddb56bfde0c | 427 | const char *c_secret, //< consumer secret - used as 1st part of secret-key |
soramimi | 0:7ddb56bfde0c | 428 | const char *t_key, //< token key - posted plain text in URL |
soramimi | 0:7ddb56bfde0c | 429 | const char *t_secret //< token secret - used as 2st part of secret-key |
soramimi | 0:7ddb56bfde0c | 430 | ); |
soramimi | 0:7ddb56bfde0c | 431 | |
soramimi | 0:7ddb56bfde0c | 432 | /** |
soramimi | 0:7ddb56bfde0c | 433 | * @deprecated Use oauth_sign_array2() instead. |
soramimi | 0:7ddb56bfde0c | 434 | */ |
soramimi | 0:7ddb56bfde0c | 435 | char *oauth_sign_array( |
soramimi | 0:7ddb56bfde0c | 436 | std::vector<std::string> *argvp, |
soramimi | 0:7ddb56bfde0c | 437 | char **postargs, |
soramimi | 0:7ddb56bfde0c | 438 | OAuthMethod method, |
soramimi | 0:7ddb56bfde0c | 439 | const char *c_key, //< consumer key - posted plain text |
soramimi | 0:7ddb56bfde0c | 440 | const char *c_secret, //< consumer secret - used as 1st part of secret-key |
soramimi | 0:7ddb56bfde0c | 441 | const char *t_key, //< token key - posted plain text in URL |
soramimi | 0:7ddb56bfde0c | 442 | const char *t_secret //< token secret - used as 2st part of secret-key |
soramimi | 0:7ddb56bfde0c | 443 | ) attribute_deprecated; |
soramimi | 0:7ddb56bfde0c | 444 | |
soramimi | 0:7ddb56bfde0c | 445 | /** |
soramimi | 0:7ddb56bfde0c | 446 | * do a HTTP POST request, wait for it to finish |
soramimi | 0:7ddb56bfde0c | 447 | * and return the content of the reply. |
soramimi | 0:7ddb56bfde0c | 448 | * (requires libcurl or a command-line HTTP client) |
soramimi | 0:7ddb56bfde0c | 449 | * |
soramimi | 0:7ddb56bfde0c | 450 | * If compiled <b>without</b> libcurl this function calls |
soramimi | 0:7ddb56bfde0c | 451 | * a command-line executable defined in the environment variable |
soramimi | 0:7ddb56bfde0c | 452 | * OAUTH_HTTP_CMD - it defaults to |
soramimi | 0:7ddb56bfde0c | 453 | * <tt>curl -sA 'liboauth-agent/0.1' -d '%%p' '%%u'</tt> |
soramimi | 0:7ddb56bfde0c | 454 | * where %%p is replaced with the postargs and %%u is replaced with |
soramimi | 0:7ddb56bfde0c | 455 | * the URL. |
soramimi | 0:7ddb56bfde0c | 456 | * |
soramimi | 0:7ddb56bfde0c | 457 | * bash & wget example: |
soramimi | 0:7ddb56bfde0c | 458 | * <tt>export OAUTH_HTTP_CMD="wget -q -U 'liboauth-agent/0.1' --post-data='%p' '%u' "</tt> |
soramimi | 0:7ddb56bfde0c | 459 | * |
soramimi | 0:7ddb56bfde0c | 460 | * NOTE: This function uses the curl's default HTTP-POST Content-Type: |
soramimi | 0:7ddb56bfde0c | 461 | * application/x-www-form-urlencoded which is the only option allowed |
soramimi | 0:7ddb56bfde0c | 462 | * by oauth core 1.0 spec. Experimental code can use the Environment variable |
soramimi | 0:7ddb56bfde0c | 463 | * to transmit custom HTTP headers or parameters. |
soramimi | 0:7ddb56bfde0c | 464 | * |
soramimi | 0:7ddb56bfde0c | 465 | * WARNING: this is a tentative function. it's convenient and handy for testing |
soramimi | 0:7ddb56bfde0c | 466 | * or developing OAuth code. But don't rely on this function |
soramimi | 0:7ddb56bfde0c | 467 | * to become a stable part of this API. It does not do |
soramimi | 0:7ddb56bfde0c | 468 | * much error checking for one thing.. |
soramimi | 0:7ddb56bfde0c | 469 | * |
soramimi | 0:7ddb56bfde0c | 470 | * @param u url to query |
soramimi | 0:7ddb56bfde0c | 471 | * @param p postargs to send along with the HTTP request. |
soramimi | 0:7ddb56bfde0c | 472 | * @return replied content from HTTP server. needs to be freed by caller. |
soramimi | 0:7ddb56bfde0c | 473 | */ |
soramimi | 0:7ddb56bfde0c | 474 | std::string oauth_http_post(const char *u, const char *p); |
soramimi | 0:7ddb56bfde0c | 475 | |
soramimi | 0:7ddb56bfde0c | 476 | #endif |