@@ -3,6 +3,7 @@ import 'dart:convert';
3
3
import 'dart:io' ;
4
4
5
5
import 'package:shared_preferences/shared_preferences.dart' ;
6
+ import 'package:supertokens_flutter/src/logger.dart' ;
6
7
7
8
class SuperTokensCookieStore {
8
9
static Map <Uri , List <Cookie >>? _allCookies;
@@ -24,10 +25,12 @@ class SuperTokensCookieStore {
24
25
25
26
/// Loads all cookies stored in shared preferences into the in memory map [_allCookies]
26
27
static Future <void > _loadFromPersistence () async {
28
+ logDebugMessage ('SuperTokensCookieStore._loadFromPersistence: Trying to load cookies from memory' );
27
29
_allCookies = {};
28
30
String cookiesStringInStorage =
29
31
_sharedPreferences? .getString (_cookieSharedPrefsKey) ?? "{}" ;
30
32
Map <String , dynamic > cookiesInStorage = jsonDecode (cookiesStringInStorage);
33
+ logDebugMessage ('SuperTokensCookieStore._loadFromPersistence: cookies found: ${jsonEncode (cookiesInStorage )}' );
31
34
cookiesInStorage.forEach ((key, value) {
32
35
Uri uri = Uri .parse (key);
33
36
List <String > cookieStrings = List .from (value);
@@ -49,8 +52,11 @@ class SuperTokensCookieStore {
49
52
///
50
53
/// If you are trying to store cookies from a "set-cookie" header response, consider using the [saveFromSetCookieHeader] utility method which parses the header string.
51
54
Future <void > saveFromResponse (Uri uri, List <Cookie > cookies) async {
55
+ logDebugMessage ('SuperTokensCookieStore.saveFromResponse: Saving cookies against: ${uri }' );
56
+ logDebugMessage ('SuperTokensCookieStore.saveFromResponse: Passed cookies: ${jsonEncode (cookies )}' );
52
57
await Future .forEach <Cookie >(cookies, (element) async {
53
58
Uri uriToStore = await _getCookieUri (uri, element);
59
+ logDebugMessage ('SuperTokensCookieStore.saveFromResponse: Setting based on uriToStore: ${uriToStore }' );
54
60
List <Cookie > currentCookies = _allCookies? [uriToStore] ?? List .from ([]);
55
61
currentCookies = currentCookies
56
62
// ignore: unnecessary_null_comparison
@@ -68,6 +74,7 @@ class SuperTokensCookieStore {
68
74
_allCookies? [uriToStore] = currentCookies;
69
75
});
70
76
77
+ logDebugMessage ('SuperTokensCookieStore.saveFromResponse: Removing empty cookies' );
71
78
_allCookies? .removeWhere ((key, value) => value.isEmpty);
72
79
73
80
await _updatePersistentStorage ();
@@ -76,14 +83,17 @@ class SuperTokensCookieStore {
76
83
77
84
/// Returns a Uri to use when saving the cookie
78
85
Future <Uri > _getCookieUri (Uri requestUri, Cookie cookie) async {
86
+ logDebugMessage ('SuperTokensCookieStore._getCookieUri: Creating cookie uri from: ${requestUri }' );
79
87
Uri cookieUri = Uri .parse (
80
88
// ignore: unnecessary_null_comparison
81
89
"${requestUri .scheme == null ? "http" : requestUri .scheme }://${requestUri .host }${cookie .path == null ? "" : cookie .path }" );
82
90
83
91
if (cookie.domain != null ) {
84
92
String domain = cookie.domain ?? "" ;
93
+ logDebugMessage ('SuperTokensCookiesStore._getCookieUri: got domain: ${domain }' );
85
94
if (domain[0 ] == "." ) {
86
95
domain = domain.substring (1 );
96
+ logDebugMessage ('SuperTokensCookiesStore._getCookieUri: Using domain substring: ${domain }' );
87
97
}
88
98
89
99
try {
@@ -98,22 +108,27 @@ class SuperTokensCookieStore {
98
108
}
99
109
}
100
110
111
+ logDebugMessage ('Generated cookie uri: ${cookieUri }' );
101
112
return cookieUri;
102
113
}
103
114
104
115
/// Uses the [_allCookies] map to update values in shared preferences.
105
116
///
106
117
/// Strips expired cookies before storing in shared preferences
107
118
Future <void > _updatePersistentStorage () async {
119
+ logDebugMessage ('SuperTokensCookieStore._updatePersistentStorage: Updating persistent storage with cookies' );
108
120
Map <String , List <String >> mapToStore = {};
109
121
_allCookies? .forEach ((key, value) {
110
122
String uriString = key.toString ();
111
123
List <String > cookieStrings =
112
124
List .from (value.map ((e) => e.toString ()).toList ());
125
+ logDebugMessage ('SuperTokensCookieStore._updatePersistentStorage: Setting to ${uriString }' );
126
+ logDebugMessage ('SuperTokensCookieStore._updatePersistentStorage: Setting value ${cookieStrings }' );
113
127
mapToStore[uriString] = cookieStrings;
114
128
});
115
129
116
130
String stringToStore = jsonEncode (mapToStore);
131
+ logDebugMessage ('SuperTokensCookieStore._updatePersistentStorage: Storing preferences: ${stringToStore }' );
117
132
await _sharedPreferences? .setString (_cookieSharedPrefsKey, stringToStore);
118
133
}
119
134
@@ -123,10 +138,12 @@ class SuperTokensCookieStore {
123
138
///
124
139
/// If you are trying to add cookies to a "cookie" header for a network call, consider using the [getCookieHeaderStringForRequest] which creates a semi-colon separated cookie string for a given Uri.
125
140
Future <List <Cookie >> getForRequest (Uri uri) async {
141
+ logDebugMessage ('SuperTokensCookieStore.getForRequest: Getting cookies for request from uri: ${uri }' );
126
142
List <Cookie > cookiesToReturn = [];
127
143
List <Cookie > allValidCookies = [];
128
144
129
145
if (_allCookies == null ) {
146
+ logDebugMessage ('SuperTokensCookieStore.getForRequest: No cookies found' );
130
147
return cookiesToReturn;
131
148
}
132
149
@@ -137,6 +154,7 @@ class SuperTokensCookieStore {
137
154
allValidCookies.addAll (storedCookies);
138
155
}
139
156
}
157
+ logDebugMessage ('SuperTokensCookieStore.getForRequest: Valid cookies found: ${allValidCookies .length }' );
140
158
141
159
if (allValidCookies.isNotEmpty) {
142
160
List <Cookie > cookiesToRemoveFromStorage = [];
@@ -150,21 +168,29 @@ class SuperTokensCookieStore {
150
168
}
151
169
});
152
170
171
+ logDebugMessage ('SuperTokensCookieStore.getForRequest: Total cookies to remove: ${cookiesToRemoveFromStorage .length }' );
153
172
if (cookiesToRemoveFromStorage.isNotEmpty) {
154
173
await _removeFromPersistence (uri, cookiesToRemoveFromStorage);
155
174
}
156
175
}
157
176
177
+ logDebugMessage ('SuperTokensCookieStore.getForRequest: Total cookies found ${cookiesToReturn .length }' );
158
178
return cookiesToReturn;
159
179
}
160
180
161
181
/// Checks whether a network request's domain can be considered valid for a cookie to be sent
162
182
bool _doesDomainMatch (String cookieHost, String requestHost) {
183
+ logDebugMessage ('SuperTokensCookieStore._doesDomainMatch: Determining if domain matches' );
184
+ logDebugMessage ('SuperTokensCookieStore._doesDomainMatch: cookiesHost: ${cookieHost }' );
185
+ logDebugMessage ('SuperTokensCookieStore._doesDomainMatch: requestHost: ${requestHost }' );
163
186
return requestHost == cookieHost || requestHost.endsWith (".$cookieHost " );
164
187
}
165
188
166
189
/// Checks whether a network request's path can be considered valid for a cookie to be sent
167
190
bool _doesPathMatch (String cookiePath, String requestPath) {
191
+ logDebugMessage ('SuperTokensCookieStore._doesPathMatch: Determining if path matches' );
192
+ logDebugMessage ('SuperTokensCookieStore._doesPathMatch: cookiePath: ${cookiePath }' );
193
+ logDebugMessage ('SuperTokensCookieStore._doesPathMatch: requestPath: ${requestPath }' );
168
194
return (requestPath == cookiePath) ||
169
195
(requestPath.startsWith (cookiePath) &&
170
196
cookiePath[cookiePath.length - 1 ] == "/" ) ||
@@ -175,9 +201,13 @@ class SuperTokensCookieStore {
175
201
/// Removes a list of cookies from persistent storage
176
202
Future <void > _removeFromPersistence (
177
203
Uri uri, List <Cookie > cookiesToRemove) async {
204
+ logDebugMessage ('SuperTokensCookieStore._removeFromPersistence: Removing cookies from persistent storage' );
205
+ logDebugMessage ('SuperTokensCookieStore._removeFromPersistence: Total cookies to remove: ${cookiesToRemove .length }' );
206
+ logDebugMessage ('SuperTokensCookieStore._removeFromPersistence: uri: ${uri }' );
178
207
List <Cookie > _cookiesToRemove = List .from (cookiesToRemove);
179
208
List <Cookie > currentCookies = _allCookies? [uri] ?? List .from ([]);
180
209
210
+ logDebugMessage ('SuperTokensCookieStore._removeFromPersistence: Removing each cookie' );
181
211
_cookiesToRemove.forEach ((element) {
182
212
currentCookies.remove (element);
183
213
});
@@ -192,7 +222,9 @@ class SuperTokensCookieStore {
192
222
///
193
223
/// Does not return expired cookies and will remove them from persistent storage if any are found.
194
224
Future <String > getCookieHeaderStringForRequest (Uri uri) async {
225
+ logDebugMessage ('SuperTokensCookieStore.getCookieHeaderStringForRequest: Getting cookie header for request from uri: ${uri }' );
195
226
List <Cookie > cookies = await getForRequest (uri);
227
+ logDebugMessage ('SuperTokensCookieStore.getCookieHeaderStringForRequest: Total cookies found: ${cookies .length }' );
196
228
// ignore: unnecessary_null_comparison
197
229
if (cookies != null && cookies.isNotEmpty) {
198
230
List <String > cookiesStringList =
@@ -201,6 +233,7 @@ class SuperTokensCookieStore {
201
233
return cookieHeaderString;
202
234
}
203
235
236
+ logDebugMessage ('SuperTokensCookieStore.getCookieHeaderStringForRequest: Returning empty value' );
204
237
return "" ;
205
238
}
206
239
@@ -214,16 +247,19 @@ class SuperTokensCookieStore {
214
247
///
215
248
/// Expired cookies are not saved.
216
249
Future <void > saveFromSetCookieHeader (Uri uri, String ? setCookieHeader) async {
250
+ logDebugMessage ('SuperTokensCookieStore.saveFromSetCookieHeader: Saving cookie from header against uri: ${uri }' );
217
251
if (setCookieHeader != null ) {
218
252
await saveFromResponse (uri, getCookieListFromHeader (setCookieHeader));
219
253
}
220
254
}
221
255
222
256
static List <Cookie > getCookieListFromHeader (String setCookieHeader) {
257
+ logDebugMessage ('SuperTokensCookieStore.getCookieListFromHeader: Getting cookie list from header: ${setCookieHeader }' );
223
258
List <String > setCookiesStringList =
224
259
setCookieHeader.split (RegExp (r',(?=[^ ])' ));
225
260
List <Cookie > setCookiesList =
226
261
setCookiesStringList.map ((e) => Cookie .fromSetCookieValue (e)).toList ();
262
+ logDebugMessage ('SuperTokensCookieStore.getCookieListFromHeader: Total cookies found in header: ${setCookiesList .length }' );
227
263
return setCookiesList;
228
264
}
229
265
}
0 commit comments