@@ -38,6 +38,12 @@ enum LoginActions {
38
38
proceed,
39
39
}
40
40
41
+ enum AuthState {
42
+ updateRequired,
43
+ loggedIn,
44
+ loggedOut,
45
+ }
46
+
41
47
class AuthProvider with ChangeNotifier {
42
48
final _logger = Logger ('AuthProvider' );
43
49
@@ -46,6 +52,7 @@ class AuthProvider with ChangeNotifier {
46
52
String ? serverVersion;
47
53
PackageInfo ? applicationVersion;
48
54
Map <String , String > metadata = {};
55
+ AuthState state = AuthState .loggedOut;
49
56
50
57
static const MIN_APP_VERSION_URL = 'min-app-version' ;
51
58
static const SERVER_VERSION_URL = 'version' ;
@@ -54,7 +61,7 @@ class AuthProvider with ChangeNotifier {
54
61
55
62
late http.Client client;
56
63
57
- AuthProvider ([http.Client ? client, bool ? checkMetadata ]) {
64
+ AuthProvider ([http.Client ? client]) {
58
65
this .client = client ?? http.Client ();
59
66
}
60
67
@@ -83,23 +90,16 @@ class AuthProvider with ChangeNotifier {
83
90
}
84
91
85
92
/// Checking if there is a new version of the application.
86
- Future <bool > applicationUpdateRequired ([
87
- String ? version,
88
- Map <String , String >? metadata,
89
- ]) async {
90
- metadata ?? = this .metadata;
91
-
92
- if (! metadata.containsKey (MANIFEST_KEY_CHECK_UPDATE ) ||
93
- metadata[MANIFEST_KEY_CHECK_UPDATE ] == 'false' ) {
94
- return false ;
95
- }
96
-
93
+ Future <bool > applicationUpdateRequired ([String ? version]) async {
97
94
final applicationCurrentVersion = version ?? applicationVersion! .version;
98
95
final response = await client.get (makeUri (serverUrl! , MIN_APP_VERSION_URL ));
99
96
final currentVersion = Version .parse (applicationCurrentVersion);
100
97
final requiredAppVersion = Version .parse (jsonDecode (response.body));
101
98
102
- return requiredAppVersion > currentVersion;
99
+ final result = requiredAppVersion > currentVersion;
100
+ _logger.fine ('Application update required: $result ' );
101
+
102
+ return result;
103
103
}
104
104
105
105
/// Registers a new user
@@ -160,15 +160,13 @@ class AuthProvider with ChangeNotifier {
160
160
await initVersions (serverUrl);
161
161
162
162
// If update is required don't log in user
163
- if (await applicationUpdateRequired (
164
- applicationVersion! .version,
165
- {MANIFEST_KEY_CHECK_UPDATE : 'true' },
166
- )) {
163
+ if (await applicationUpdateRequired ()) {
167
164
return {'action' : LoginActions .update};
168
165
}
169
166
170
167
// Log user in
171
168
token = responseData['token' ];
169
+ state = AuthState .loggedIn;
172
170
notifyListeners ();
173
171
174
172
// store login data in shared preferences
@@ -195,30 +193,66 @@ class AuthProvider with ChangeNotifier {
195
193
return userData['serverUrl' ] as String ;
196
194
}
197
195
198
- Future <bool > tryAutoLogin () async {
196
+ /// Tries to auto-login the user with the stored token
197
+ Future <void > tryAutoLogin () async {
199
198
final prefs = await SharedPreferences .getInstance ();
200
199
if (! prefs.containsKey (PREFS_USER )) {
201
- _logger.info ('autologin failed' );
202
- return false ;
200
+ _logger.info ('autologin failed, no saved user data' );
201
+ state = AuthState .loggedOut;
202
+ return ;
203
+ }
204
+
205
+ final userData = json.decode (prefs.getString (PREFS_USER )! );
206
+
207
+ if (! userData.containsKey ('token' ) || ! userData.containsKey ('serverUrl' )) {
208
+ _logger.info ('autologin failed, no token or serverUrl' );
209
+ state = AuthState .loggedOut;
210
+ return ;
211
+ }
212
+
213
+ token = userData['token' ];
214
+ serverUrl = userData['serverUrl' ];
215
+
216
+ if (token == null || serverUrl == null ) {
217
+ _logger.info ('autologin failed, token or serverUrl is null' );
218
+ state = AuthState .loggedOut;
219
+ return ;
203
220
}
204
- final extractedUserData = json.decode (prefs.getString (PREFS_USER )! );
205
221
206
- token = extractedUserData['token' ];
207
- serverUrl = extractedUserData['serverUrl' ];
222
+ // // Try to talk to a URL using the token, if this doesn't work, log out
223
+ final response = await client.head (
224
+ makeUri (serverUrl! , 'routine' ),
225
+ headers: {
226
+ HttpHeaders .contentTypeHeader: 'application/json; charset=UTF-8' ,
227
+ HttpHeaders .userAgentHeader: getAppNameHeader (),
228
+ HttpHeaders .authorizationHeader: 'Token $token '
229
+ },
230
+ );
231
+ if (response.statusCode != 200 ) {
232
+ _logger.info ('autologin failed, statusCode: ${response .statusCode }' );
233
+ await logout ();
234
+ return ;
235
+ }
236
+
237
+ await initVersions (serverUrl! );
238
+
239
+ // If update is required don't log in user
240
+ if (await applicationUpdateRequired ()) {
241
+ state = AuthState .updateRequired;
242
+ } else {
243
+ state = AuthState .loggedIn;
244
+ _logger.info ('autologin successful' );
245
+ }
208
246
209
- _logger.info ('autologin successful' );
210
- setApplicationVersion ();
211
- setServerVersion ();
212
247
notifyListeners ();
213
- //_autoLogout();
214
- return true ;
215
248
}
216
249
217
250
Future <void > logout ({bool shouldNotify = true }) async {
218
251
_logger.fine ('logging out' );
219
252
token = null ;
220
253
serverUrl = null ;
221
254
dataInit = false ;
255
+ state = AuthState .loggedOut;
222
256
223
257
if (shouldNotify) {
224
258
notifyListeners ();
@@ -236,7 +270,8 @@ class AuthProvider with ChangeNotifier {
236
270
if (applicationVersion != null ) {
237
271
out = '/${applicationVersion !.version } '
238
272
'(${applicationVersion !.packageName }; '
239
- 'build: ${applicationVersion !.buildNumber })' ;
273
+ 'build: ${applicationVersion !.buildNumber })'
274
+ ' - https://github.com/wger-project' ;
240
275
}
241
276
return 'wger App$out ' ;
242
277
}
0 commit comments