mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-08-05 16:58:59 +00:00
215 lines
9.3 KiB
C
215 lines
9.3 KiB
C
![]() |
/*
|
|||
|
|
|||
|
Copyright 2011 TweetDeck Inc. All rights reserved.
|
|||
|
|
|||
|
Redistribution and use in source and binary forms, with or without
|
|||
|
modification, are permitted provided that the following conditions are met:
|
|||
|
|
|||
|
1. Redistributions of source code must retain the above copyright notice,
|
|||
|
this list of conditions and the following disclaimer.
|
|||
|
|
|||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
|||
|
this list of conditions and the following disclaimer in the documentation
|
|||
|
and/or other materials provided with the distribution.
|
|||
|
|
|||
|
THIS SOFTWARE IS PROVIDED BY TWEETDECK INC. ``AS IS'' AND ANY EXPRESS OR
|
|||
|
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|||
|
EVENT SHALL TWEETDECK INC. OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|||
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|||
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|||
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|||
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|||
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|||
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
|
|
|||
|
The views and conclusions contained in the software and documentation are
|
|||
|
those of the authors and should not be interpreted as representing official
|
|||
|
policies, either expressed or implied, of TweetDeck Inc.
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
#import <Foundation/Foundation.h>
|
|||
|
|
|||
|
/*
|
|||
|
This OAuth implementation doesn't cover the whole spec (eg. it’s HMAC only).
|
|||
|
But you'll find it works with almost all the OAuth implementations you need
|
|||
|
to interact with in the wild. How ace is that?!
|
|||
|
*/
|
|||
|
@interface GCOAuth : NSObject {
|
|||
|
@private
|
|||
|
NSString *signatureSecret;
|
|||
|
NSDictionary *OAuthParameters;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
Set the user agent to be used for all requests.
|
|||
|
*/
|
|||
|
+ (void)setUserAgent:(NSString *)agent;
|
|||
|
|
|||
|
/*
|
|||
|
Set the time offset to be used for timestamp calculations.
|
|||
|
*/
|
|||
|
+ (void)setTimeStampOffset:(time_t)offset;
|
|||
|
|
|||
|
/*
|
|||
|
Control HTTPS cookie storage for all generated requests
|
|||
|
*/
|
|||
|
+ (void)setHTTPShouldHandleCookies:(BOOL)handle;
|
|||
|
|
|||
|
/**
|
|||
|
Creates and returns a URL request that will perform an HTTP operation for the given method. All
|
|||
|
of the appropriate fields will be parameter encoded as necessary so do not
|
|||
|
encode them yourself. The contents of the parameters dictionary must be string
|
|||
|
key/value pairs. You are contracted to consume the NSURLRequest *immediately*.
|
|||
|
*/
|
|||
|
+ (NSURLRequest *)URLRequestForPath:(NSString *)path
|
|||
|
HTTPMethod:(NSString *)HTTPMethod
|
|||
|
parameters:(NSDictionary *)parameters
|
|||
|
scheme:(NSString *)scheme
|
|||
|
host:(NSString *)host
|
|||
|
consumerKey:(NSString *)consumerKey
|
|||
|
consumerSecret:(NSString *)consumerSecret
|
|||
|
accessToken:(NSString *)accessToken
|
|||
|
tokenSecret:(NSString *)tokenSecret;
|
|||
|
|
|||
|
/*
|
|||
|
Creates and returns a URL request that will perform a GET HTTP operation. All
|
|||
|
of the appropriate fields will be parameter encoded as necessary so do not
|
|||
|
encode them yourself. The contents of the parameters dictionary must be string
|
|||
|
key/value pairs. You are contracted to consume the NSURLRequest *immediately*.
|
|||
|
*/
|
|||
|
+ (NSURLRequest *)URLRequestForPath:(NSString *)path
|
|||
|
GETParameters:(NSDictionary *)parameters
|
|||
|
host:(NSString *)host
|
|||
|
consumerKey:(NSString *)consumerKey
|
|||
|
consumerSecret:(NSString *)consumerSecret
|
|||
|
accessToken:(NSString *)accessToken
|
|||
|
tokenSecret:(NSString *)tokenSecret;
|
|||
|
|
|||
|
/*
|
|||
|
Performs the same operation as the above method but allows a customizable URL
|
|||
|
scheme, e.g. HTTPS.
|
|||
|
*/
|
|||
|
+ (NSURLRequest *)URLRequestForPath:(NSString *)path
|
|||
|
GETParameters:(NSDictionary *)parameters
|
|||
|
scheme:(NSString *)scheme
|
|||
|
host:(NSString *)host
|
|||
|
consumerKey:(NSString *)consumerKey
|
|||
|
consumerSecret:(NSString *)consumerSecret
|
|||
|
accessToken:(NSString *)accessToken
|
|||
|
tokenSecret:(NSString *)tokenSecret;
|
|||
|
|
|||
|
/*
|
|||
|
Creates and returns a URL request that will perform a DELETE HTTP operation. All
|
|||
|
of the appropriate fields will be parameter encoded as necessary so do not
|
|||
|
encode them yourself. The contents of the parameters dictionary must be string
|
|||
|
key/value pairs. You are contracted to consume the NSURLRequest *immediately*.
|
|||
|
*/
|
|||
|
+ (NSURLRequest *)URLRequestForPath:(NSString *)path
|
|||
|
DELETEParameters:(NSDictionary *)parameters
|
|||
|
host:(NSString *)host
|
|||
|
consumerKey:(NSString *)consumerKey
|
|||
|
consumerSecret:(NSString *)consumerSecret
|
|||
|
accessToken:(NSString *)accessToken
|
|||
|
tokenSecret:(NSString *)tokenSecret;
|
|||
|
|
|||
|
/*
|
|||
|
Performs the same operation as the above method but allows a customizable URL
|
|||
|
scheme, e.g. HTTPS.
|
|||
|
*/
|
|||
|
+ (NSURLRequest *)URLRequestForPath:(NSString *)path
|
|||
|
DELETEParameters:(NSDictionary *)parameters
|
|||
|
scheme:(NSString *)scheme
|
|||
|
host:(NSString *)host
|
|||
|
consumerKey:(NSString *)consumerKey
|
|||
|
consumerSecret:(NSString *)consumerSecret
|
|||
|
accessToken:(NSString *)accessToken
|
|||
|
tokenSecret:(NSString *)tokenSecret;
|
|||
|
|
|||
|
/*
|
|||
|
Creates and returns a URL request that will perform a POST HTTP operation. All
|
|||
|
data will be sent as form URL encoded. Restrictions on the arguments to this
|
|||
|
method are the same as the GET request methods.
|
|||
|
*/
|
|||
|
+ (NSURLRequest *)URLRequestForPath:(NSString *)path
|
|||
|
POSTParameters:(NSDictionary *)parameters
|
|||
|
host:(NSString *)host
|
|||
|
consumerKey:(NSString *)consumerKey
|
|||
|
consumerSecret:(NSString *)consumerSecret
|
|||
|
accessToken:(NSString *)accessToken
|
|||
|
tokenSecret:(NSString *)tokenSecret;
|
|||
|
|
|||
|
/*
|
|||
|
Performs the same operation as the above method but allows a customizable URL
|
|||
|
scheme, e.g. HTTPS.
|
|||
|
*/
|
|||
|
+ (NSURLRequest *)URLRequestForPath:(NSString *)path
|
|||
|
POSTParameters:(NSDictionary *)parameters
|
|||
|
scheme:(NSString *)scheme
|
|||
|
host:(NSString *)host
|
|||
|
consumerKey:(NSString *)consumerKey
|
|||
|
consumerSecret:(NSString *)consumerSecret
|
|||
|
accessToken:(NSString *)accessToken
|
|||
|
tokenSecret:(NSString *)tokenSecret;
|
|||
|
@end
|
|||
|
|
|||
|
@interface NSString (GCOAuthAdditions)
|
|||
|
|
|||
|
// better percent escape
|
|||
|
- (NSString *)pcen;
|
|||
|
@end
|
|||
|
|
|||
|
@interface NSURL (GCOAuthURL)
|
|||
|
|
|||
|
/*
|
|||
|
Get host:port from URL unless port is 80 or 443 (http://tools.ietf.org/html/rfc5849#section-3.4.1.2). Otherwis reurn only host.
|
|||
|
*/
|
|||
|
- (NSString *)hostAndPort;
|
|||
|
@end
|
|||
|
/*
|
|||
|
|
|||
|
XAuth example (because you may otherwise be scratching your head):
|
|||
|
|
|||
|
NSURLRequest *xauth = [GCOAuth URLRequestForPath:@"/oauth/access_token"
|
|||
|
POSTParameters:[NSDictionary dictionaryWithObjectsAndKeys:
|
|||
|
username, @"x_auth_username",
|
|||
|
password, @"x_auth_password",
|
|||
|
@"client_auth", @"x_auth_mode",
|
|||
|
nil]
|
|||
|
host:@"api.twitter.com"
|
|||
|
consumerKey:CONSUMER_KEY
|
|||
|
consumerSecret:CONSUMER_SECRET
|
|||
|
accessToken:nil
|
|||
|
tokenSecret:nil];
|
|||
|
|
|||
|
OAuth Echo example (we have found that some consumers require HTTPS for the
|
|||
|
echo, so to be safe we always do it):
|
|||
|
|
|||
|
NSURLRequest *echo = [GCOAuth URLRequestForPath:@"/1/account/verify_credentials.json"
|
|||
|
GETParameters:nil
|
|||
|
scheme:@"https"
|
|||
|
host:@"api.twitter.com"
|
|||
|
consumerKey:CONSUMER_KEY
|
|||
|
consumerSecret:CONSUMER_SECRET
|
|||
|
accessToken:accessToken
|
|||
|
tokenSecret:tokenSecret];
|
|||
|
NSMutableURLRequest *rq = [NSMutableURLRequest new];
|
|||
|
[rq setValue:[[echo URL] absoluteString] forHTTPHeaderField:@"X-Auth-Service-Provider"];
|
|||
|
[rq setValue:[echo valueForHTTPHeaderField:@"Authorization"] forHTTPHeaderField:@"X-Verify-Credentials-Authorization"];
|
|||
|
// Now consume rq with an NSURLConnection
|
|||
|
[rq release];
|
|||
|
|
|||
|
|
|||
|
Suggested usage would be to make some categories for this class that
|
|||
|
automatically adds both secrets, both tokens and host information. This
|
|||
|
makes usage less cumbersome. Eg:
|
|||
|
|
|||
|
[TwitterOAuth GET:@"/1/statuses/home_timeline.json"];
|
|||
|
[TwitterOAuth GET:@"/1/statuses/home_timeline.json" queryParameters:dictionary];
|
|||
|
|
|||
|
At TweetDeck we have TDAccount classes that represent separate user logins
|
|||
|
for different services when instantiated.
|
|||
|
|
|||
|
*/
|