diff --git a/enzevalos_iphone/AppDelegate.swift b/enzevalos_iphone/AppDelegate.swift index bcc279832635f0f39822d16ce40542f3a2451701..b47b9dc081a5f1b983c66cea6813ddab7fd8bc33 100644 --- a/enzevalos_iphone/AppDelegate.swift +++ b/enzevalos_iphone/AppDelegate.swift @@ -45,7 +45,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func credentialsFailed(){ Onboarding.credentialFails += 1 - if Onboarding.credentialFails >= 3 { + if Onboarding.credentialFails >= 1/*3*/ { self.window?.rootViewController = Onboarding.detailOnboarding(self.credentialCheck) } else { diff --git a/enzevalos_iphone/ContactViewController.swift b/enzevalos_iphone/ContactViewController.swift index 0f1736874df82063a3b462c4bba27437756788bc..11004f618527a4a2e89ace533e16984a5de43957 100644 --- a/enzevalos_iphone/ContactViewController.swift +++ b/enzevalos_iphone/ContactViewController.swift @@ -13,6 +13,7 @@ import ContactsUI class ContactViewController: UIViewController { var keyRecord: KeyRecord? = nil + var hasKey: Bool = false var highlightEmail: String? = nil private var uiContact: CNContact? = nil private var vc: CNContactViewController? = nil @@ -34,6 +35,8 @@ class ContactViewController: UIViewController { self.navigationController?.navigationBar.barTintColor = ThemeManager.defaultColor if let con = keyRecord { + hasKey = EnzevalosEncryptionHandler.hasKey(con.ezContact) + let myAddress = UserManager.loadUserValue(Attribute.userAddr) as! String if con.addresses.contains(where: { $0.mailAddress.lowercased() == myAddress }) { @@ -206,6 +209,8 @@ extension ContactViewController: UITableViewDataSource { cell.contactStatus.text = NSLocalizedString("notVerified", comment: "Contact is not verified jet") } else if (otherRecords?.filter({ $0.hasKey }).count ?? 0) > 0 { cell.contactStatus.text = NSLocalizedString("otherEncryption", comment: "Contact is using encryption, this is the unsecure collection") + } else if hasKey { + cell.contactStatus.text = NSLocalizedString("hasKeyButNoMail", comment: "We have a key to this contact but haven't received an encrypted mail jet") } else { cell.contactStatus.text = NSLocalizedString("noEncryption", comment: "Contact is not jet using encryption") } @@ -216,6 +221,8 @@ extension ContactViewController: UITableViewDataSource { actionCell.Button.setTitle(NSLocalizedString("verifyNow", comment: "Verify now"), for: UIControlState()) } else if (otherRecords?.filter({ $0.hasKey }).count ?? 0) > 0 { actionCell.Button.setTitle(NSLocalizedString("toEncrypted", comment: "switch to encrypted"), for: UIControlState()) + } else if hasKey { + actionCell.Button.setTitle(NSLocalizedString("verifyNow", comment: "Verify now"), for: UIControlState()) } else { actionCell.Button.setTitle(NSLocalizedString("invite", comment: "Invide contact to use encryption"), for: UIControlState()) } diff --git a/enzevalos_iphone/Onboarding.swift b/enzevalos_iphone/Onboarding.swift index 221de9643783c18f6fa0ab2a72848b288b54d8dd..17335a26a35df5a4279f2a03f51a71ff263f11f5 100644 --- a/enzevalos_iphone/Onboarding.swift +++ b/enzevalos_iphone/Onboarding.swift @@ -21,6 +21,7 @@ class Onboarding: NSObject { static var mailaddress = UITextField.init() static var username = UITextField.init() static var password = UITextField.init() + static var credentials: UIView? = nil static var imapServer = UITextField.init() static var smtpServer = UITextField.init() static var imapPort = UITextField.init() @@ -106,52 +107,55 @@ class Onboarding: NSObject { //Content let page1 = OnboardingContentViewController.content(withTitle: NSLocalizedString("Hello", comment: "Welcome"), body: NSLocalizedString("InterestedInSecureMail", comment: "commendation to user for using secure mail"), image: nil, buttonText: nil, action: nil) - - mailaddress = UITextField.init() - mailaddress.textColor = textColor - mailaddress.attributedPlaceholder = NSAttributedString.init(string: NSLocalizedString("Address", comment: ""), attributes: [NSForegroundColorAttributeName: textColor]) - mailaddress.tintColor = textColor - mailaddress.borderStyle = UITextBorderStyle.none - mailaddress.keyboardType = UIKeyboardType.emailAddress - mailaddress.returnKeyType = UIReturnKeyType.next - mailaddress.autocorrectionType = UITextAutocorrectionType.no - mailaddress.frame = CGRect.init(x: 0, y: /*mailaddressLabel.frame.height+padding*/ 0, width: 50, height: 30) - mailaddress.isUserInteractionEnabled = true - mailaddress.delegate = textDelegate - - let mailaddressUnderline = UIView.init(frame: CGRect.init(x: 0, y: mailaddress.frame.maxY, width: mailaddress.frame.width, height: 0.5)) - mailaddressUnderline.backgroundColor = textColor - - //let page2 = OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertMailAddress", comment: ""), videoURL: nil, inputView: mailaddress, buttonText: nil, actionBlock: nil) - - password = UITextField.init() - password.textColor = textColor - password.tintColor = textColor - password.borderStyle = UITextBorderStyle.none - password.isSecureTextEntry = true - password.returnKeyType = UIReturnKeyType.done - password.frame = CGRect.init(x: 0, y: mailaddress.frame.height + padding + mailaddressUnderline.frame.height, width: 50, height: 30) - password.attributedPlaceholder = NSAttributedString.init(string: NSLocalizedString("Password", comment: ""), attributes: [NSForegroundColorAttributeName: textColor]) - password.delegate = textDelegate - - let passwordUnderline = UIView.init(frame: CGRect.init(x: 0, y: mailaddress.frame.height + padding + mailaddressUnderline.frame.height + password.frame.height, width: password.frame.width, height: 0.5)) - passwordUnderline.backgroundColor = textColor - - let keyboardToolbar = UIToolbar() - keyboardToolbar.sizeToFit() - keyboardToolbar.barTintColor = defaultColor - keyboardToolbar.backgroundColor = defaultColor - let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) - let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.dismissKeyboard)) - keyboardToolbar.items = [flexBarButton, doneBarButton] - mailaddress.inputAccessoryView = keyboardToolbar - password.inputAccessoryView = keyboardToolbar - - let credentials = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 50, height: mailaddress.frame.height + mailaddressUnderline.frame.height + padding + password.frame.height + passwordUnderline.frame.height)) - credentials.addSubview(mailaddress) - credentials.addSubview(mailaddressUnderline) - credentials.addSubview(password) - credentials.addSubview(passwordUnderline) + + if let tmpCredentials = credentials {} + else { + mailaddress = UITextField.init() + mailaddress.textColor = textColor + mailaddress.attributedPlaceholder = NSAttributedString.init(string: NSLocalizedString("Address", comment: ""), attributes: [NSForegroundColorAttributeName: textColor]) + mailaddress.tintColor = textColor + mailaddress.borderStyle = UITextBorderStyle.none + mailaddress.keyboardType = UIKeyboardType.emailAddress + mailaddress.returnKeyType = UIReturnKeyType.next + mailaddress.autocorrectionType = UITextAutocorrectionType.no + mailaddress.frame = CGRect.init(x: 0, y: /*mailaddressLabel.frame.height+padding*/ 0, width: 50, height: 30) + mailaddress.isUserInteractionEnabled = true + mailaddress.delegate = textDelegate + + let mailaddressUnderline = UIView.init(frame: CGRect.init(x: 0, y: mailaddress.frame.maxY, width: mailaddress.frame.width, height: 0.5)) + mailaddressUnderline.backgroundColor = textColor + + //let page2 = OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertMailAddress", comment: ""), videoURL: nil, inputView: mailaddress, buttonText: nil, actionBlock: nil) + + password = UITextField.init() + password.textColor = textColor + password.tintColor = textColor + password.borderStyle = UITextBorderStyle.none + password.isSecureTextEntry = true + password.returnKeyType = UIReturnKeyType.done + password.frame = CGRect.init(x: 0, y: mailaddress.frame.height + padding + mailaddressUnderline.frame.height, width: 50, height: 30) + password.attributedPlaceholder = NSAttributedString.init(string: NSLocalizedString("Password", comment: ""), attributes: [NSForegroundColorAttributeName: textColor]) + password.delegate = textDelegate + + let passwordUnderline = UIView.init(frame: CGRect.init(x: 0, y: mailaddress.frame.height + padding + mailaddressUnderline.frame.height + password.frame.height, width: password.frame.width, height: 0.5)) + passwordUnderline.backgroundColor = textColor + + let keyboardToolbar = UIToolbar() + keyboardToolbar.sizeToFit() + keyboardToolbar.barTintColor = defaultColor + keyboardToolbar.backgroundColor = defaultColor + let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) + let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.dismissKeyboard)) + keyboardToolbar.items = [flexBarButton, doneBarButton] + mailaddress.inputAccessoryView = keyboardToolbar + password.inputAccessoryView = keyboardToolbar + + credentials = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 50, height: mailaddress.frame.height + mailaddressUnderline.frame.height + padding + password.frame.height + passwordUnderline.frame.height)) + credentials?.addSubview(mailaddress) + credentials?.addSubview(mailaddressUnderline) + credentials?.addSubview(password) + credentials?.addSubview(passwordUnderline) + } var bodyText = NSLocalizedString("InsertMailAddressAndPassword", comment: "") if self.credentialFails > 0 { @@ -257,21 +261,29 @@ class Onboarding: NSObject { let start = OnboardingContentViewController.content(withTitle: NSLocalizedString("WhatAShame", comment: ""), body: NSLocalizedString("CouldNotConnect", comment: ""), videoURL: nil, inputView: nil, buttonText: nil, actionBlock: nil) - let email = OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertMailAddress", comment: ""), videoURL: nil, inputView: mailaddress, buttonText: nil, actionBlock: nil) + let email = OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertMailAddressAndPassword", comment: ""), videoURL: nil, inputView: credentials, buttonText: nil, actionBlock: callback)//OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertMailAddress", comment: ""), videoURL: nil, inputView: mailaddress, buttonText: nil, actionBlock: nil) username = UITextField.init() //text.textColor = UIColor.whiteColor() //text.tintColor = UIColor.whiteColor() - username.borderStyle = UITextBorderStyle.roundedRect + username.borderStyle = UITextBorderStyle.none username.keyboardType = UIKeyboardType.emailAddress username.autocorrectionType = UITextAutocorrectionType.no username.frame = CGRect.init(x: 0, y: 0, width: 50, height: 30) username.placeholder = NSLocalizedString("Username", comment: "") username.text = UserManager.loadUserValue(Attribute.userName) as? String + username.textColor = textColor - let user = OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertUsername", comment: ""), videoURL: nil, inputView: username, buttonText: nil, actionBlock: nil) + let usernameUnderline = UIView.init(frame: CGRect.init(x: 0, y: username.frame.maxY, width: username.frame.width, height: 0.5)) + usernameUnderline.backgroundColor = textColor + + let userView = UIView.init(frame: CGRect.init(x: 0, y: 0, width: 50, height: username.frame.height + usernameUnderline.frame.height)) + userView.addSubview(username) + userView.addSubview(usernameUnderline) + + let user = OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertUsername", comment: ""), videoURL: nil, inputView: userView, buttonText: nil, actionBlock: nil) - let passwd = OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertPassword", comment: ""), videoURL: nil, inputView: password, buttonText: nil, actionBlock: nil) + //let passwd = OnboardingContentViewController.content(withTitle: nil, body: NSLocalizedString("InsertPassword", comment: ""), videoURL: nil, inputView: password, buttonText: nil, actionBlock: nil) imapServer.borderStyle = UITextBorderStyle.roundedRect imapServer.frame = CGRect.init(x: 0, y: 0, width: 50, height: 30) @@ -424,7 +436,7 @@ class Onboarding: NSObject { let last = OnboardingContentViewController.content(withTitle: NSLocalizedString("EverythingCorrect", comment: ""), body: nil, videoURL: nil, inputView: nil, buttonText: NSLocalizedString("next", comment: ""), actionBlock: callback) - let vc = Onboard.OnboardingViewController(backgroundImage: background, contents: [start, email, user, passwd, imap1, imap2, smtp1, smtp2, last]) + let vc = Onboard.OnboardingViewController(backgroundImage: background, contents: [start, email, user, /*passwd,*/ imap1, imap2, smtp1, smtp2, last]) vc?.view.backgroundColor = defaultColor return vc! } @@ -450,7 +462,9 @@ class Onboarding: NSObject { static func checkConfig(_ fail: @escaping () -> (), work: @escaping () -> ()) -> Bool { smtpCheckDone = false imapCheckDone = false - manualSet = true + if credentialFails > 2 { + manualSet = true + } self.work = work self.fail = fail //AppDelegate.getAppDelegate().mailHandler.checkSMTP(smtpCompletion) diff --git a/enzevalos_iphone/de.lproj/Localizable.strings b/enzevalos_iphone/de.lproj/Localizable.strings index 4f7f79caef6c8075ba69d9b87c72c8a10dcca0f1..a8e916cc233d6873441a4b25e29a74140c05d1d9 100644 --- a/enzevalos_iphone/de.lproj/Localizable.strings +++ b/enzevalos_iphone/de.lproj/Localizable.strings @@ -108,6 +108,7 @@ "notVerified" = "Kontakt ist noch nicht verifiziert"; "noEncryption" = "Kontakt nutzt noch keine Verschlüsselung"; "otherEncryption" = "Dies ist die unsichere Ablage dieses Kontakt"; +"hasKeyButNoMail" = "Kontakt nutzt verschlüsselung, hat dir aber noch keine sichere E-Mail gesendet"; "Verified" = "Kontakt ist verifiziert"; "verifyNow" = "Jetzt verifizieren"; "toEncrypted" = "Zur sicheren Ablage"; diff --git a/enzevalos_iphone/en.lproj/Localizable.strings b/enzevalos_iphone/en.lproj/Localizable.strings index 25bf5ffd468206b9eea6bbe049d0c5f5c7cfb7f5..3ee832d0b4402c5f3e7f8959b34bed6f49a1ee85 100644 --- a/enzevalos_iphone/en.lproj/Localizable.strings +++ b/enzevalos_iphone/en.lproj/Localizable.strings @@ -107,6 +107,7 @@ "notVerified" = "Contact is not verified jet"; "noEncryption" = "Contact is not jet using encryption"; "otherEncryption" = "This is the unsafe tray with this Contact"; +"hasKeyButNoMail" = "Contact has a key, but you haven't received a safe email jet."; "Verified" = "Contact is verified"; "verifyNow" = "Verify now"; "toEncrypted" = "Switch to secure tray"; diff --git a/enzevalos_iphone/keys/bob-private.gpg b/enzevalos_iphone/keys/bob-private.gpg new file mode 100644 index 0000000000000000000000000000000000000000..8bf00c2b8de375c5a5e34c18d8d5cf01ec1a0f85 --- /dev/null +++ b/enzevalos_iphone/keys/bob-private.gpg @@ -0,0 +1,57 @@ +-----BEGIN PGP PRIVATE KEY BLOCK----- + +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 +=lhe/ +-----END PGP PRIVATE KEY BLOCK----- diff --git a/enzevalos_iphone/keys/bob-public.gpg b/enzevalos_iphone/keys/bob-public.gpg new file mode 100644 index 0000000000000000000000000000000000000000..d0e87fd150b0565415e2ee5d495ebe0b8d5fba3a --- /dev/null +++ b/enzevalos_iphone/keys/bob-public.gpg @@ -0,0 +1,31 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFjbbUoBCADTFXIlOj26s885DihtomLyNtBMWtU0TZcw6C4q24VdfG1q+tqb +N2/hok2ZZJHqxr/71qS/eOuUPLkFNE5xaDWbkqrcvjdBvZPhcoglBIGU0O6I6e/c +dVJCNhefNU62bT1+YXthR+3LXBKHfxLAOCP8JiNwfkaIFoXtJEY8wRMXdryxXpcf +1z9Nj+apXLbyU90Grd+gSAHo61JQEELJLEOVqOFUqt9OTBFBjOXoGTYKCPfOTfkf +IV5DMXTDVXrtUmkvtdjP3Yfcm09k/hJTt98cOpPGfkHwFDytt34val4hHq7UO158 +TeWa1WZ3Z/ELbpmd6IYzOu7Isw05NMX/CKUTABEBAAG0GEJvYjIwMDUgPGJvYjIw +MDVAd2ViLmRlPokBVAQTAQoAPhYhBBsweEPkMhbvYxPCUdbx4JpU8n2nBQJY221K +AhsDBQkHhh+ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJENbx4JpU8n2nA4sI +AMVVVJXbnSQoP4wFFwBbVcJc0zKs23dT7ps4HkdLViF14FD6b+rl0Yinibvy55v7 +w/AgIsiV/jPw8Fp5d4X+NRDx+wXSKo5pHN9fJh69F7fKydPV0WEYe+q5zxDjeJza +u8+5IP2oXG8UZ+mOpN7rkXcceJljTjvqvdpvpVNvS1+qIGLqka2OZCdz1TLJvJ74 +hfVrXhpUo84k11wAJCBRhwDaYgoQcVGTLpcpGGtimEXvtiMyGPSgWS2ygNbHGAT0 +8EilNQ9RLQh4AYzVTsO9/Z0RvkivTlE/RA6VFrUtid/W33tu79c/b6tEr6+vIK8g +/ep750ex5EF2/jgVNBtokqy5AQ0EWNttSgEIALw3Cz5zSLC9D/b69U6Bpqr8tQCo +rKfgC/Jp+UxFhf/4nN2kGN8JP8cVJ0/V0ziozTI8OFvilZplZB/8LkFI09aHGwv5 +rzEVrFSx5r7ZjaURCd2aDLm9eHD4gKM8+dtvDTF2dTw2uNQDqhCGp9qh5Q7C6wfe +OQdBAhwi4mUKWCPjTM5sFV1/8sExAzwNJz2CPnGQH7Uibia5lGPr91llslnu1BGO +YAe8I8hT3kL5H+tcsWKh+dn5lg08yRK9IBG1vD96E0WV2gnyrREa4aG3AKV/pxPn +bR//vmexz9RuKP/3IBcWnI2s1xYHS9dpBLtl0qph10p5NurLwi+L6WLjDWEAEQEA +AYkBPAQYAQoAJhYhBBsweEPkMhbvYxPCUdbx4JpU8n2nBQJY221KAhsMBQkHhh+A +AAoJENbx4JpU8n2nNpMIALCW9QRDqsXL4903WaZxNcTENDuzuodldX5AC6/Wbn9w +zzDWUP6rQzqYFrRNAN2YDpucSeDMAwj0j4QQUb7G7FNR70Ros6muCvfdVMD+QfKb +KazDwB6WtA+gS2NG65mnxAPl1RbBvjanOE1w/elIIdtaVlYJUe/rWpxZsoL8n0WA +GP4Q3+7+R3O/PHBjyIpS9bPHlDbMABaFPD1Axvzw212sqJ8I2/wsHcm6ConRkINc +NpQqBYcRIGXC5/MFvQ+2rnI5mxQodKhxClz9LYU8pCD5IYBn2gmRNAr80bHPGTr5 +U+cAbd9jFhgFliNLgf+jMJfNJxlAh9ydpcuFfImy6yg= +=XZSC +-----END PGP PUBLIC KEY BLOCK----- +