Skip to content

Commit 2a24ce6

Browse files
committed
Added authentication options
1 parent 312b61f commit 2a24ce6

13 files changed

Lines changed: 177 additions & 77 deletions

lib/api/api_client.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import 'package:cookie_jar/cookie_jar.dart';
44
import 'package:dio/adapter.dart';
55
import 'package:dio/dio.dart';
66
import 'package:dio_cookie_manager/dio_cookie_manager.dart';
7+
import 'package:piwigo_ng/services/preferences_service.dart';
78

89
import 'api_interceptor.dart';
910

@@ -23,8 +24,10 @@ class ApiClient {
2324
}
2425

2526
static bool piwigoSSLBypass(X509Certificate cert, String host, int port) {
26-
// todo: accept certs
27-
return true;
27+
if (appPreferences.getBool(Preferences.enableSSLKey) ?? false) {
28+
return true;
29+
}
30+
return false;
2831
}
2932

3033
static Future<Response> get({

lib/api/api_interceptor.dart

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,48 @@
1+
import 'dart:convert';
2+
13
import 'package:dio/dio.dart';
24
import 'package:flutter/material.dart';
35
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
46
import 'package:piwigo_ng/app.dart';
57
import 'package:piwigo_ng/components/snackbars.dart';
68
import 'package:piwigo_ng/services/preferences_service.dart';
79
import 'package:piwigo_ng/utils/localizations.dart';
10+
import 'package:shared_preferences/shared_preferences.dart';
811

912
class ApiInterceptor extends Interceptor {
1013
@override
1114
void onRequest(
1215
RequestOptions options, RequestInterceptorHandler handler) async {
13-
print('[${options.method}] ${options.queryParameters['method']}');
16+
print("[${options.method}] ${options.queryParameters['method']}");
1417
FlutterSecureStorage secureStorage = const FlutterSecureStorage();
18+
SharedPreferences prefs = await SharedPreferences.getInstance();
1519
options.baseUrl =
1620
(await secureStorage.read(key: Preferences.serverUrlKey))!;
21+
if (prefs.getBool(Preferences.enableBasicAuthKey) ?? false) {
22+
String? username =
23+
appPreferences.getString(Preferences.basicUsernameKey) ??
24+
await secureStorage.read(key: Preferences.usernameKey);
25+
String? password =
26+
appPreferences.getString(Preferences.basicPasswordKey) ??
27+
await secureStorage.read(key: Preferences.passwordKey);
28+
String basicAuth =
29+
"Basic ${base64.encode(utf8.encode('$username:$password'))}";
30+
options.headers['authorization'] = basicAuth;
31+
}
1732
return super.onRequest(options, handler);
1833
}
1934

2035
@override
2136
void onResponse(Response response, ResponseInterceptorHandler handler) async {
22-
print(
23-
'[${response.statusCode}] ${response.requestOptions.queryParameters['method']}');
37+
debugPrint(
38+
"[${response.statusCode}] ${response.requestOptions.queryParameters['method']}");
2439
return super.onResponse(response, handler);
2540
}
2641

2742
@override
2843
void onError(DioError err, ErrorInterceptorHandler handler) async {
2944
debugPrint(
30-
'[${err.response?.statusCode}] ${err.requestOptions.queryParameters['method']}');
45+
"[${err.response?.statusCode}] ${err.requestOptions.queryParameters['method']}");
3146
debugPrint('${err.error}\n${err.stackTrace}');
3247
switch (err.response?.statusCode) {
3348
case null:

lib/app.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'package:piwigo_ng/utils/overscroll_behavior.dart';
88
import 'package:piwigo_ng/utils/themes.dart';
99
import 'package:piwigo_ng/views/album/album_view_page.dart';
1010
import 'package:piwigo_ng/views/album/root_album_view_page.dart';
11+
import 'package:piwigo_ng/views/authentication/login_settings_page.dart';
1112
import 'package:piwigo_ng/views/authentication/login_view_page.dart';
1213
import 'package:piwigo_ng/views/image/edit_image_page.dart';
1314
import 'package:piwigo_ng/views/image/image_favorites_page.dart';
@@ -102,6 +103,11 @@ Route<dynamic> generateRoute(RouteSettings settings) {
102103
builder: (_) => const LoginViewPage(),
103104
settings: settings,
104105
);
106+
case LoginSettingsPage.routeName:
107+
return MaterialPageRoute(
108+
builder: (_) => LoginSettingsPage(),
109+
settings: settings,
110+
);
105111
case RootAlbumViewPage.routeName:
106112
return MaterialPageRoute(
107113
builder: (_) => RootAlbumViewPage(

lib/components/cards/tag_chip.dart

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,29 +41,6 @@ class SelectTagChip extends StatelessWidget {
4141
selected: selected,
4242
onSelected: (_) => onTap?.call(),
4343
);
44-
return GestureDetector(
45-
onTap: onTap,
46-
child: Container(
47-
padding: const EdgeInsets.all(2.0),
48-
decoration: ShapeDecoration(
49-
shape: StadiumBorder(),
50-
color: Theme.of(context).chipTheme.backgroundColor,
51-
),
52-
child: Row(
53-
mainAxisSize: MainAxisSize.min,
54-
children: [
55-
Padding(
56-
padding: const EdgeInsets.symmetric(horizontal: 8.0),
57-
child: Text(
58-
tag.name,
59-
style: Theme.of(context).textTheme.bodyMedium,
60-
),
61-
),
62-
if (icon != null) icon!,
63-
],
64-
),
65-
),
66-
);
6744
}
6845
}
6946

lib/components/dialogs/image_comment_dialog.dart

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -95,46 +95,5 @@ class _ImageCommentDialogState extends State<ImageCommentDialog> {
9595
),
9696
),
9797
);
98-
return Center(
99-
child: ConstrainedBox(
100-
constraints: BoxConstraints(
101-
maxWidth: Settings.modalMaxWidth,
102-
),
103-
child: GestureDetector(
104-
onTap: () => Navigator.of(context).pop(),
105-
child: SingleChildScrollView(
106-
physics: const BouncingScrollPhysics(),
107-
padding: EdgeInsets.symmetric(
108-
vertical: 32.0,
109-
horizontal: 32.0,
110-
),
111-
child: Column(
112-
crossAxisAlignment: CrossAxisAlignment.stretch,
113-
children: [
114-
Text(
115-
widget.image.name,
116-
textAlign: TextAlign.center,
117-
style: TextStyle(
118-
fontSize: 24,
119-
color: Colors.white,
120-
),
121-
),
122-
Divider(
123-
color: Colors.white,
124-
),
125-
Text(
126-
// "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas tempor, eros eget ultrices tincidunt, lacus quam tempor neque, eu venenatis tellus nulla sit amet lectus. Praesent lacus orci, fermentum a elit vitae, cursus iaculis sapien. Sed ac ipsum ante. In efficitur urna sed pulvinar accumsan. Aliquam et condimentum ex. Quisque eleifend ipsum vitae magna gravida, eget maximus nisi posuere. Maecenas a dui et est posuere sollicitudin ac eget tellus. In quis est purus. Cras eget vestibulum justo. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Sed vel elit in sapien bibendum porta. In eget felis auctor, tincidunt lectus sed, placerat lectus. Vivamus ac mauris sit amet turpis mollis tempor.Donec metus nunc, ultricies id lobortis sed, accumsan varius nunc. Duis et posuere ex. Donec ante urna, ornare non elit ac, egestas condimentum ex. Curabitur aliquam nec purus a hendrerit. Nam metus massa, aliquam eu ligula a, pretium maximus orci. Morbi eros arcu, egestas et lorem et, mattis posuere ex. In at lacus erat. Mauris aliquam lectus eget dui pretium faucibus. Ut mollis elit at orci tempor rutrum. Fusce tincidunt libero nisi, nec efficitur odio laoreet in. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aliquam consequat massa feugiat, rutrum eros sed, blandit nunc. Duis ac eleifend turpis. Interdum et malesuada fames ac ante ipsum primis in faucibus. Etiam malesuada scelerisque purus vitae auctor. Etiam ut rhoncus eros.Pellentesque eget velit vel massa ultricies vestibulum quis in orci. Vivamus porttitor libero at elit dignissim, ut iaculis lorem placerat. Vivamus sed nisl turpis. Sed dictum enim a rhoncus lacinia. Pellentesque non finibus massa. Aenean leo diam, elementum et turpis a, placerat laoreet libero. Proin eu euismod felis, at laoreet augue. Vestibulum lobortis sapien ac scelerisque hendrerit.Etiam lacinia tempus erat, sed semper turpis ultrices ut. Aliquam erat volutpat. Aenean semper venenatis rhoncus. Cras sollicitudin ullamcorper ante, id placerat lacus facilisis id. Donec a metus consequat, accumsan ipsum a, tincidunt mi. Donec ullamcorper rhoncus augue, sed dapibus urna. Ut sed interdum arcu. Aliquam sagittis pulvinar feugiat. Maecenas sed auctor lectus, quis dapibus nisi. Etiam ac ullamcorper nulla, eget porttitor eros. Mauris varius lorem magna, eget ultrices lacus vestibulum in. Sed magna nulla, bibendum et orci et, placerat ultricies orci. Morbi consequat arcu odio, eget tristique purus porttitor non. Mauris ac egestas dolor. Nulla nec aliquam quam. Suspendisse consectetur ex non elementum maximus.Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas accumsan ante mattis nisi maximus, in feugiat metus pretium. Nam at porttitor purus, a cursus dolor. Etiam luctus eleifend hendrerit. Phasellus at mauris vulputate, volutpat neque vitae, laoreet massa. Nullam feugiat felis nec mi feugiat mollis. Phasellus consequat luctus dictum. Aliquam erat volutpat. In hac habitasse platea dictumst. Donec fringilla eleifend lorem. Aliquam erat volutpat. Pellentesque in elit vitae arcu maximus viverra. Donec accumsan lectus non bibendum pretium.",
127-
widget.image.comment!,
128-
style: TextStyle(
129-
fontSize: 14,
130-
color: Colors.white,
131-
),
132-
),
133-
],
134-
),
135-
),
136-
),
137-
),
138-
);
13998
}
14099
}

lib/components/fields/settings_field.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class SettingsField extends StatelessWidget {
2828
controller: controller,
2929
focusNode: focusNode,
3030
keyboardType: keyboardType,
31-
textAlign: TextAlign.end,
31+
textAlign: TextAlign.start,
3232
onChanged: onChanged,
3333
onFieldSubmitted: onFieldSubmitted,
3434
style: Theme.of(context).textTheme.bodyMedium,

lib/components/sections/settings_section.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ class _SettingsSectionItemFieldState extends State<SettingsSectionItemField> {
428428
@override
429429
Widget build(BuildContext context) {
430430
return SettingsSectionItem(
431-
title: widget.title,
431+
// title: widget.title,
432432
expandedChild: true,
433433
child: SettingsField(
434434
controller: _controller,

lib/generated_plugin_registrant.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,13 @@
77
// ignore_for_file: depend_on_referenced_packages
88

99
import 'package:flutter_secure_storage_web/flutter_secure_storage_web.dart';
10-
import 'package:package_info_plus_web/package_info_plus_web.dart';
10+
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
1111
import 'package:shared_preferences_web/shared_preferences_web.dart';
1212
import 'package:url_launcher_web/url_launcher_web.dart';
1313

14-
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
15-
1614
// ignore: public_member_api_docs
1715
void registerPlugins(Registrar registrar) {
1816
FlutterSecureStorageWeb.registerWith(registrar);
19-
PackageInfoPlugin.registerWith(registrar);
2017
SharedPreferencesPlugin.registerWith(registrar);
2118
UrlLauncherPlugin.registerWith(registrar);
2219
registrar.registerMessageHandler();

lib/services/auto_upload_manager.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:flutter_secure_storage/flutter_secure_storage.dart';
1010
import 'package:image_picker/image_picker.dart';
1111
import 'package:piwigo_ng/api/api_client.dart';
1212
import 'package:piwigo_ng/api/api_error.dart';
13+
import 'package:piwigo_ng/api/api_interceptor.dart';
1314
import 'package:piwigo_ng/api/upload.dart';
1415
import 'package:piwigo_ng/models/album_model.dart';
1516
import 'package:piwigo_ng/models/status_model.dart';
@@ -28,6 +29,7 @@ class AutoUploadManager {
2829
static final CookieJar cookieJar = CookieJar();
2930
static final Dio dio = Dio(BaseOptions())
3031
..interceptors.add(CookieManager(cookieJar))
32+
..interceptors.add(ApiInterceptor())
3133
..httpClientAdapter = ApiClient.sslHttpClientAdapter;
3234

3335
AutoUploadManager() {

lib/services/preferences_service.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ class Preferences {
2323
static const String accountUsernameKey = 'ACCOUNT_USERNAME';
2424
static const String userStatusKey = 'USER_STATUS';
2525

26+
static const String enableSSLKey = 'ENABLE_SSL';
27+
static const String enableBasicAuthKey = 'ENABLE_BASIC_AUTH';
28+
static const String basicUsernameKey = 'BASIC_USERNAME';
29+
static const String basicPasswordKey = 'BASIC_PASSWORD';
30+
2631
static String get getUserStatus {
2732
return appPreferences.getString(userStatusKey) ?? 'guest';
2833
}

0 commit comments

Comments
 (0)