import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'dart:developer'; import 'package:crypto/crypto.dart'; import 'package:fast_rsa/fast_rsa.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import '../api/mhsl/notify/register/notifyRegister.dart'; import '../api/mhsl/notify/register/notifyRegisterParams.dart'; import '../model/accountData.dart'; import '../model/endpointData.dart'; import '../storage/base/settingsProvider.dart'; import '../widget/confirmDialog.dart'; class NotifyUpdater { static ConfirmDialog enableAfterDisclaimer(SettingsProvider settings) { return ConfirmDialog( title: "Warnung", icon: Icons.warning_amber, content: "" "Die Push-Benachrichtigungen werden durch mhsl.eu versendet.\n\n" "Durch das aktivieren dieser Funktion wird dein Nutzername, dein Password und eine Geräte-ID von mhsl dauerhaft gespeichert und verarbeitet.\n\n" "Für mehr Informationen drücke lange auf die Einstellungsoption!", confirmButton: "Aktivieren", onConfirm: () { FirebaseMessaging.instance.requestPermission( provisional: false ); settings.val(write: true).notificationSettings.enabled = true; NotifyUpdater.registerToServer(); }, ); } static void registerToServer() async { String? fcmToken = await FirebaseMessaging.instance.getToken(); if(fcmToken == null) throw Exception("Failed to register push notification because there is no FBC token!"); NotifyRegister( NotifyRegisterParams( username: AccountData().getUsername(), password: AccountData().getPassword(), fcmToken: fcmToken, ), ).run(); } static Future registerNcPush() async { log("Starting"); log("Generate keys"); final rsaKey = await RSA.generate(2048); final devicePrivateKey = rsaKey.privateKey.toString(); final devicePublicKey = rsaKey.publicKey.toString(); log("Private: \n$devicePrivateKey"); log("Public: \n$devicePublicKey"); final pushToken = await FirebaseMessaging.instance.getToken(); log("PushToken: $pushToken}"); final pushTokenHash = sha512.convert(utf8.encode(pushToken!)); log("PushTokenHash: $pushTokenHash"); final requestMap = { "format": "json", "pushTokenHash": pushTokenHash.toString(), "devicePublicKey": devicePublicKey.replaceAll("\n", "").replaceAll("-----END RSA PUBLIC KEY-----", "").replaceAll("-----BEGIN RSA PUBLIC KEY-----", "").toString(), "proxyServer": "https://push-notifications.nextcloud.com/devices" }; log(jsonEncode(requestMap)); http.post( //${AccountData().buildHttpAuthString()}@ Uri.parse("https://${EndpointData().nextcloud().full()}/ocs/v2.php/apps/notifications/api/v2/push"), headers: { "OCS-APIRequest": "true", "Content-Type": "application/json", "Accept": "application/json", "Authorization": "Bearer Fv3g7g9jW91FXNjZLaJmyprClfy8pX1jEM3hJGbXjPEFcx4oGIEVcpwEnuT4mPs39D9xT063" }, body: jsonEncode(requestMap), ).then((response) { log("Response: ${response.statusCode}\n${response.body}"); }); } }