From 0fb2c2649f9c0e4dd8d62382e915605da31207c2 Mon Sep 17 00:00:00 2001 From: M66B Date: Thu, 29 Jul 2021 15:50:13 +0200 Subject: [PATCH] Added basic K9 account import --- .../java/eu/faircode/email/ActivitySetup.java | 169 +++++++++++++++++- 1 file changed, 168 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/eu/faircode/email/ActivitySetup.java b/app/src/main/java/eu/faircode/email/ActivitySetup.java index 4daf86bc97..f02df17589 100644 --- a/app/src/main/java/eu/faircode/email/ActivitySetup.java +++ b/app/src/main/java/eu/faircode/email/ActivitySetup.java @@ -72,6 +72,8 @@ import org.bouncycastle.util.io.pem.PemReader; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserFactory; import java.io.BufferedInputStream; import java.io.BufferedReader; @@ -748,8 +750,25 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac } private void handleImport(Intent data) { + Uri uri = data.getData(); + + if (uri != null) + try { + DocumentFile df = DocumentFile.fromSingleUri(this, uri); + if (df != null) { + String name = df.getName(); + String ext = Helper.getExtension(name); + if ("k9s".equals(ext)) { + handleK9Import(uri); + return; + } + } + } catch (Throwable ex) { + Log.w(ex); + } + Bundle args = new Bundle(); - args.putParcelable("uri", data.getData()); + args.putParcelable("uri", uri); args.putString("password", this.password); args.putBoolean("import_accounts", this.import_accounts); args.putBoolean("import_rules", this.import_rules); @@ -1165,6 +1184,154 @@ public class ActivitySetup extends ActivityBase implements FragmentManager.OnBac }.execute(this, args, "setup:import"); } + private void handleK9Import(Uri uri) { + Bundle args = new Bundle(); + args.putParcelable("uri", uri); + + new SimpleTask() { + @Override + protected Void onExecute(Context context, Bundle args) throws Throwable { + Uri uri = args.getParcelable("uri"); + + DB db = DB.getInstance(context); + ContentResolver resolver = context.getContentResolver(); + try (InputStream is = new BufferedInputStream(resolver.openInputStream(uri))) { + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + XmlPullParser xml = factory.newPullParser(); + xml.setInput(new InputStreamReader(is)); + + EntityAccount account = null; + EntityIdentity identity = null; + + int eventType = xml.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_TAG) { + String name = xml.getName(); + switch (name) { + case "incoming-server": + String itype = xml.getAttributeValue(null, "type"); + if ("IMAP".equals(itype)) { + account = new EntityAccount(); + account.protocol = EntityAccount.TYPE_IMAP; + account.auth_type = ServiceAuthenticator.AUTH_TYPE_PASSWORD; + account.password = ""; + account.synchronize = false; + account.primary = false; + } else if ("POP3".equals(itype)) { + account = new EntityAccount(); + account.protocol = EntityAccount.TYPE_POP; + account.auth_type = ServiceAuthenticator.AUTH_TYPE_PASSWORD; + account.password = ""; + account.synchronize = false; + account.primary = false; + } + break; + case "outgoing-server": + String otype = xml.getAttributeValue(null, "type"); + if ("SMTP".equals(otype)) { + identity = new EntityIdentity(); + identity.auth_type = ServiceAuthenticator.AUTH_TYPE_PASSWORD; + identity.password = ""; + identity.synchronize = false; + identity.primary = false; + } + break; + case "host": + eventType = xml.next(); + if (eventType == XmlPullParser.TEXT) { + String host = xml.getText(); + if (identity != null) + identity.host = host; + else if (account != null) + account.host = host; + } + break; + case "port": + eventType = xml.next(); + if (eventType == XmlPullParser.TEXT) { + int port = Integer.parseInt(xml.getText()); + if (identity != null) + identity.port = port; + else if (account != null) + account.port = port; + } + break; + case "connection-security": + eventType = xml.next(); + if (eventType == XmlPullParser.TEXT) { + String etype = xml.getText(); + + int encryption; + if ("STARTTLS_REQUIRED".equals(etype)) + encryption = EmailService.ENCRYPTION_STARTTLS; + else if ("SSL_TLS_REQUIRED".equals(etype)) + encryption = EmailService.ENCRYPTION_SSL; + else + encryption = EmailService.ENCRYPTION_NONE; + + if (identity != null) + identity.encryption = encryption; + else if (account != null) + account.encryption = encryption; + } + break; + case "username": + eventType = xml.next(); + if (eventType == XmlPullParser.TEXT) { + String user = xml.getText(); + if (identity != null) { + identity.name = "K9/" + user; + identity.email = user; + identity.user = user; + } else if (account != null) { + account.name = "K9/" + user; + account.user = user; + } + } + break; + } + + } else if (eventType == XmlPullParser.END_TAG) { + String name = xml.getName(); + if ("account".equals(name)) { + if (account != null && identity != null) { + try { + db.beginTransaction(); + + account.id = db.account().insertAccount(account); + identity.account = account.id; + identity.id = db.identity().insertIdentity(identity); + + db.setTransactionSuccessful(); + } finally { + account = null; + identity = null; + db.endTransaction(); + } + } + } + } + + eventType = xml.next(); + } + + } + + return null; + } + + @Override + protected void onExecuted(Bundle args, Void data) { + ToastEx.makeText(ActivitySetup.this, R.string.title_setup_imported, Toast.LENGTH_LONG).show(); + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getSupportFragmentManager(), ex); + } + }.execute(this, args, "setup:k9"); + } + private void handleImportCertificate(Intent data) { Uri uri = data.getData(); if (uri != null) {