hank
2017-06-14 a0a84333e64f1e94ae9d0f69545037c60e781842
commit | author | age
a0a843 1 //
H 2 //  TWTRSessionStore.h
3 //  TwitterCore
4 //
5 //  Copyright (c) 2015 Twitter Inc. All rights reserved.
6 //
7
8 @class TWTRAuthConfig;
9 @class TWTRGuestSession;
10 @class TWTRSession;
11 @protocol TWTRAuthSession;
12 @protocol TWTRAPIServiceConfig;
13 @protocol TWTRErrorLogger;
14
15 NS_ASSUME_NONNULL_BEGIN
16
17 #pragma mark - TWTRSessionRefreshingStore Protocol
18
19 /**
20  *  Completion block called when a session refresh succeeds or fails.
21  *
22  *  @param refreshedSession The refreshed session
23  *  @param error            Error that will be non nil if the refresh request failed
24  */
25 typedef void (^TWTRSessionStoreRefreshCompletion)(id _Nullable refreshedSession, NSError *_Nullable error);
26
27 /**
28  *  Protocol for session stores that can refresh expired sessions.
29  */
30 @protocol TWTRSessionRefreshingStore <NSObject>
31
32 /**
33  *  Refresh an expired session.
34  *
35  *  @param sessionClass The class of the session
36  *  @param sessionID    ID of the session wherever applicable e.g. `userID` if it's a user session.
37  *  @param completion   The completion block to call when the refresh request succeeds or fails.
38  */
39 - (void)refreshSessionClass:(Class)sessionClass sessionID:(nullable NSString *)sessionID completion:(TWTRSessionStoreRefreshCompletion)completion;
40
41 /**
42  *  Determines whether the given session has expired.
43  *
44  *  @param session  The session to check for expiration
45  *  @param response API request response to check for expiration
46  *
47  *  @return Whether the session has expired.
48  */
49 - (BOOL)isExpiredSession:(id)session response:(NSHTTPURLResponse *)response;
50
51 /**
52  *  Determines whether the given session has expired based on a given error.
53  *
54  *  @param session  The session to check for expiration
55  *  @param error API request error to check for expiration
56  *
57  *  @return Whether the session has expired.
58  */
59 - (BOOL)isExpiredSession:(id)session error:(NSError *)error;
60
61 @end
62
63 #pragma mark - TWTRUserSessionStore Protocol
64
65 /**
66  *  Completion block called when a user session saved to the session store or fails.
67  *
68  *  @param session The saved session
69  *  @param error   Error that will be non nil if the save request fails.
70  */
71 typedef void (^TWTRSessionStoreSaveCompletion)(id<TWTRAuthSession> _Nullable session, NSError *_Nullable error);
72
73 /**
74  *  Completion block called when fetching all stored user sessions completes or fails.
75  *
76  *  @param sessions All stored user sessions or empty array if there are no user sessions found.
77  */
78 typedef void (^TWTRSessionStoreBatchFetchCompletion)(NSArray *sessions);
79
80 /**
81  *  Completion block to call when the session is deleted or fails.
82  *
83  *  @param session The deleted session or nil if none was found for the user.
84  */
85 typedef void (^TWTRSessionStoreDeleteCompletion)(id<TWTRAuthSession> _Nullable session);
86
87 /**
88  *  Protocol for session store that manages user sessions.
89  */
90 @protocol TWTRUserSessionStore <NSObject>
91
92 /**
93  *  Saves the existing session to the store after validations.
94  *
95  *  @param session    The user session to save
96  *  @param completion Completion block to call when the save request succeeds or fails
97  */
98 - (void)saveSession:(id<TWTRAuthSession>)session completion:(TWTRSessionStoreSaveCompletion)completion;
99
100 /**
101  *  Fetches the user session for for the given auth tokens and saves it to the store after validations.
102  *
103  *  @param authToken       The existing authToken to use for authentication.
104  *  @param authTokenSecret The existing authTokenSecret to use for authentication.
105  *  @param completion      Completion block to call when the save request succeeds or fails
106  */
107 - (void)saveSessionWithAuthToken:(NSString *)authToken authTokenSecret:(NSString *)authTokenSecret completion:(TWTRSessionStoreSaveCompletion)completion;
108
109 /**
110  *  Checks to see if the user is logged in and has a saved session.
111  *
112  *  @param userID   The user ID to fetch session for.
113  */
114 - (nullable id<TWTRAuthSession>)sessionForUserID:(NSString *)userID;
115
116 /**
117  *  Retrieve all logged in user sessions in ascending order of last saved date
118  *
119  *  @note This is a blocking call.
120  */
121 - (NSArray *)existingUserSessions;
122
123 - (BOOL)hasLoggedInUsers;
124
125 /**
126  *  Retrieves the last logged in user session.
127  *
128  *  @return The last logged in user session.
129  */
130 - (nullable id<TWTRAuthSession>)session;
131
132 /**
133  *  Deletes the local Twitter user session from this app. This will not remove the system Twitter account nor make a network request to invalidate the session.
134  *
135  *  @param userID ID of the user to log out
136  */
137 - (void)logOutUserID:(NSString *)userID;
138
139 @end
140
141 #pragma mark - TWTRGuestSessionStore Protocol
142
143 /**
144  *  Completion block called when retrieving a guest session succeeds or fails.
145  *
146  *  @param guestSession The retrieved guest session
147  *  @param error        Error that will be non nil if the save request fails.
148  */
149 typedef void (^TWTRSessionGuestLogInCompletion)(TWTRGuestSession *_Nullable guestSession, NSError *_Nullable error);
150
151 /**
152  *  Protocol for session stores that can manage guest sessions.
153  */
154 @protocol TWTRGuestSessionStore <NSObject>
155
156 /**
157  *  Log in as a guest user and return the guest session. This can be used when the user is not a Twitter user.
158  *
159  *  @param completion Completion block to call when the authentication succeeds or fails.
160  *
161  *  @warning This method assumes your application, as indicated by the `consumerKey` and `consumerSecret` in the `authConfig`, has been whitelisted for guest authentication.
162  */
163 - (void)fetchGuestSessionWithCompletion:(TWTRSessionGuestLogInCompletion)completion;
164
165 @end
166
167 #pragma mark - Composite TWTRSessionStore Protocol
168
169 /**
170  *  Convenience composite protocol of a store that handles user, guest, and refreshable sessions.
171  */
172 @protocol TWTRSessionStore <TWTRUserSessionStore, TWTRGuestSessionStore, TWTRSessionRefreshingStore>
173
174 /**
175  *  Returns the store's auth config.
176  */
177 @property (nonatomic, readonly) TWTRAuthConfig *authConfig;
178
179 @end
180
181 #pragma mark - Concrete Session Store Class
182
183 /**
184  *  Concrete implementation of <TWTRSessionStore>. This session store supports fetching and storage of
185  *  user and guest sessions. In addition, the session store also supports refreshing of such sessions when they expire.
186  *
187  *  @warning Instances of the session manager at the same path are not synchronized. The session store
188  *  will simply choose the latest version in the case of conflicts.
189  */
190 @interface TWTRSessionStore : NSObject <TWTRSessionStore>
191
192 - (instancetype)init NS_UNAVAILABLE;
193
194 /**
195  * Provides a mechanism for reloading the session store. This method will force the session store
196  * to find any sessions that may have been saved by another session store or application that is
197  * using the same keychain access groups.
198  *
199  * Most applications will not need to call this method. You may need to call this method if you are
200  * using multiple stores within your application and you need to synchronize when one writes to the
201  * store. The more likely case for needing to call this method is if you are sharing credentials
202  * between applications. In this situation you will want to call this method when the application
203  * comes back to the foreground.
204  *
205  * This method does not need to be called when the store is created because this process happens
206  * by default at time of instantiation.
207  *
208  * You should avoid calling this method if you do not have a specific reason to do so, like the reasons
209  * mentioned above as this method does cause disk I/O and multiple calls can cause performance problems.
210  */
211 - (void)reloadSessionStore;
212
213 @end
214
215 NS_ASSUME_NONNULL_END