瀏覽代碼

Logout on 401

Vishnu Mohandas 4 年之前
父節點
當前提交
017d26acbd

+ 3 - 1
lib/core/errors.dart

@@ -10,4 +10,6 @@ class StorageLimitExceededError extends Error {}
 
 class SilentlyCancelUploadsError extends Error {}
 
-class LockAlreadyAcquiredError extends Error{}
+class LockAlreadyAcquiredError extends Error {}
+
+class UnauthorizedError extends Error {}

+ 3 - 0
lib/events/trigger_logout_event.dart

@@ -0,0 +1,3 @@
+import 'event.dart';
+
+class TriggerLogoutEvent extends Event {}

+ 18 - 13
lib/services/collections_service.dart

@@ -7,6 +7,7 @@ import 'package:flutter_sodium/flutter_sodium.dart';
 import 'package:logging/logging.dart';
 
 import 'package:photos/core/configuration.dart';
+import 'package:photos/core/errors.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/network.dart';
 import 'package:photos/db/collections_db.dart';
@@ -211,18 +212,17 @@ class CollectionsService {
     }
   }
 
-  Future<List<Collection>> _fetchCollections(int sinceTime) {
-    return _dio
-        .get(
-      Configuration.instance.getHttpEndpoint() + "/collections",
-      queryParameters: {
-        "sinceTime": sinceTime,
-      },
-      options:
-          Options(headers: {"X-Auth-Token": Configuration.instance.getToken()}),
-    )
-        .then((response) {
-      final collections = List<Collection>();
+  Future<List<Collection>> _fetchCollections(int sinceTime) async {
+    try {
+      final response = await _dio.get(
+        Configuration.instance.getHttpEndpoint() + "/collections",
+        queryParameters: {
+          "sinceTime": sinceTime,
+        },
+        options: Options(
+            headers: {"X-Auth-Token": Configuration.instance.getToken()}),
+      );
+      final List<Collection> collections = [];
       if (response != null) {
         final c = response.data["collections"];
         for (final collection in c) {
@@ -230,7 +230,12 @@ class CollectionsService {
         }
       }
       return collections;
-    });
+    } catch (e) {
+      if (e is DioError && e.response?.statusCode == 401) {
+        throw UnauthorizedError();
+      }
+      throw e;
+    }
   }
 
   Collection getCollectionByID(int collectionID) {

+ 4 - 0
lib/services/sync_service.dart

@@ -15,6 +15,7 @@ import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/permission_granted_event.dart';
 import 'package:photos/events/sync_status_update_event.dart';
 import 'package:photos/events/subscription_purchased_event.dart';
+import 'package:photos/events/trigger_logout_event.dart';
 import 'package:photos/models/file_type.dart';
 import 'package:photos/services/billing_service.dart';
 import 'package:photos/services/collections_service.dart';
@@ -117,6 +118,9 @@ class SyncService {
     } on StorageLimitExceededError {
       Bus.instance.fire(SyncStatusUpdate(SyncStatus.error,
           error: StorageLimitExceededError()));
+    } on UnauthorizedError {
+      _logger.info("Logging user out");
+      Bus.instance.fire(TriggerLogoutEvent());
     } catch (e, s) {
       if (e is DioError && e.type == DioErrorType.DEFAULT) {
         final errorCode = e.error?.osError?.errorCode;

+ 35 - 0
lib/ui/home_widget.dart

@@ -10,6 +10,7 @@ import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/permission_granted_event.dart';
 import 'package:photos/events/subscription_purchased_event.dart';
 import 'package:photos/events/tab_changed_event.dart';
+import 'package:photos/events/trigger_logout_event.dart';
 import 'package:photos/events/user_logged_out_event.dart';
 import 'package:photos/models/filters/important_items_filter.dart';
 import 'package:photos/models/file.dart';
@@ -30,6 +31,7 @@ import 'package:photos/ui/shared_collections_gallery.dart';
 import 'package:logging/logging.dart';
 import 'package:photos/ui/sign_in_header_widget.dart';
 import 'package:photos/ui/sync_indicator.dart';
+import 'package:photos/utils/dialog_util.dart';
 import 'package:uni_links/uni_links.dart';
 
 class HomeWidget extends StatefulWidget {
@@ -57,6 +59,7 @@ class _HomeWidgetState extends State<HomeWidget> {
   StreamSubscription<TabChangedEvent> _tabChangedEventSubscription;
   StreamSubscription<PermissionGrantedEvent> _permissionGrantedEvent;
   StreamSubscription<SubscriptionPurchasedEvent> _subscriptionPurchaseEvent;
+  StreamSubscription<TriggerLogoutEvent> _triggerLogoutEvent;
   StreamSubscription<UserLoggedOutEvent> _loggedOutEvent;
 
   @override
@@ -90,6 +93,37 @@ class _HomeWidgetState extends State<HomeWidget> {
         Bus.instance.on<SubscriptionPurchasedEvent>().listen((event) {
       setState(() {});
     });
+    _triggerLogoutEvent =
+        Bus.instance.on<TriggerLogoutEvent>().listen((event) async {
+      AlertDialog alert = AlertDialog(
+        title: Text("session expired"),
+        content: Text("please login again"),
+        actions: [
+          TextButton(
+            child: Text(
+              "ok",
+              style: TextStyle(
+                color: Theme.of(context).buttonColor,
+              ),
+            ),
+            onPressed: () async {
+              Navigator.of(context).pop();
+              final dialog = createProgressDialog(context, "logging out...");
+              await dialog.show();
+              await Configuration.instance.logout();
+              await dialog.hide();
+            },
+          ),
+        ],
+      );
+
+      showDialog(
+        context: context,
+        builder: (BuildContext context) {
+          return alert;
+        },
+      );
+    });
     _loggedOutEvent = Bus.instance.on<UserLoggedOutEvent>().listen((event) {
       setState(() {});
     });
@@ -276,6 +310,7 @@ class _HomeWidgetState extends State<HomeWidget> {
     _photosUpdatedEvent.cancel();
     _permissionGrantedEvent.cancel();
     _subscriptionPurchaseEvent.cancel();
+    _triggerLogoutEvent.cancel();
     _loggedOutEvent.cancel();
     super.dispose();
   }