Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Manage Private Email Addresses #1319

Merged
merged 125 commits into from
Aug 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
5385581
Fetch Status on Loading Login
afterxleep Jun 5, 2023
bdbdcc8
Display Private Email Actions
afterxleep Jun 6, 2023
c482420
Cancel active request if any
afterxleep Jun 6, 2023
dbe360d
Email Status Fetching
afterxleep Jun 7, 2023
e7d425d
Merge branch 'develop' into daniel/manage-private-duck-address
afterxleep Jun 7, 2023
a2d8b86
Reverted comment and import
afterxleep Jun 7, 2023
dc7600d
No need for the additional decodeData function anymore
afterxleep Jun 7, 2023
b2f7cca
Indentaion and spacing
afterxleep Jun 7, 2023
05b9e71
Added Icons and update spacing
afterxleep Jun 8, 2023
7ad2a5e
Updated Copy
afterxleep Jun 8, 2023
df3c736
Add confirmation Dialog and button action
afterxleep Jun 8, 2023
9277c8f
Add Cancel String
afterxleep Jun 8, 2023
22f0eab
Initial functionality complete
afterxleep Jun 8, 2023
28e609d
Merge branch 'develop' into daniel/manage-private-duck-address
afterxleep Jun 12, 2023
4130833
Warn user when removing a private email
afterxleep Jun 12, 2023
23b3cd5
Trailing whitespace removal
afterxleep Jun 12, 2023
13a1cfb
Do not display edit confirmation on errors
afterxleep Jun 12, 2023
1adee76
Make sure Both alerts are shown when needed
afterxleep Jun 12, 2023
bf65f99
Updated message
afterxleep Jun 14, 2023
68b7f74
Use Staging endpoints
afterxleep Jun 16, 2023
990deca
Point to BSK branch
afterxleep Jun 16, 2023
dd2bf5e
Update BSK deps
afterxleep Jun 16, 2023
9d07c3c
Remove icon container
afterxleep Jun 20, 2023
3aeb1fd
Copy updates
afterxleep Jun 20, 2023
0f96ab7
Disable Email protection Alert
afterxleep Jun 20, 2023
97b640c
Manage Account Action (Private Email)
afterxleep Jun 20, 2023
a81f764
Manage Private Email Account
afterxleep Jun 20, 2023
8ff5605
Move Endpoints to PROD
afterxleep Jun 20, 2023
b91716e
Fix logic for logged out account
afterxleep Jun 20, 2023
ce6a66e
Update Copy
afterxleep Jun 20, 2023
577dfe6
Update copy
afterxleep Jun 20, 2023
39e3804
Update Message Layout
afterxleep Jun 20, 2023
166999e
Move font to subheadline
afterxleep Jun 20, 2023
14fe900
Open Email Protection Signup from Menu
afterxleep Jun 21, 2023
c6c4b89
Opens email protection login from Login Management
afterxleep Jun 21, 2023
16bbe06
Use Attributed String on macOS 12+
afterxleep Jun 21, 2023
3f349ca
Add hand icon on hover
afterxleep Jun 21, 2023
54ef9d9
Show a timer only if needed
afterxleep Jun 21, 2023
582fada
0.3s timer
afterxleep Jun 21, 2023
3efa339
Hide username/password icons when value is empty
afterxleep Jun 22, 2023
34601cc
Update text
afterxleep Jun 22, 2023
2c11c45
Update Packages
afterxleep Jun 26, 2023
bb58d7c
Initial Changes for Autofill partial saving
afterxleep Jun 28, 2023
efdd74c
Point to the right branch, and update autofill save settings
afterxleep Jun 29, 2023
cfd9fb4
Remove activity indicator
afterxleep Jun 29, 2023
c5e1bfe
Merge branch 'daniel/manage-private-duck-address' into daniel/private…
afterxleep Jun 29, 2023
3a3eeea
Use Correct autofill branch
afterxleep Jun 29, 2023
7998840
Use Correct Autofill branch
afterxleep Jun 29, 2023
c8c16aa
Package updated
afterxleep Jun 30, 2023
4442bd8
Fetch Status on Loading Login
afterxleep Jun 5, 2023
f1fb6bd
Display Private Email Actions
afterxleep Jun 6, 2023
b773da4
Cancel active request if any
afterxleep Jun 6, 2023
f1063bc
Email Status Fetching
afterxleep Jun 7, 2023
b4e6c36
Reverted comment and import
afterxleep Jun 7, 2023
3c77b1d
No need for the additional decodeData function anymore
afterxleep Jun 7, 2023
b61084b
Indentaion and spacing
afterxleep Jun 7, 2023
9d5c048
Added Icons and update spacing
afterxleep Jun 8, 2023
fc6df85
Updated Copy
afterxleep Jun 8, 2023
a0db878
Add confirmation Dialog and button action
afterxleep Jun 8, 2023
4a03d8f
Add Cancel String
afterxleep Jun 8, 2023
b44f265
Initial functionality complete
afterxleep Jun 8, 2023
e987844
Warn user when removing a private email
afterxleep Jun 12, 2023
be80130
Trailing whitespace removal
afterxleep Jun 12, 2023
28489bc
Do not display edit confirmation on errors
afterxleep Jun 12, 2023
020ed0c
Make sure Both alerts are shown when needed
afterxleep Jun 12, 2023
e727672
Updated message
afterxleep Jun 14, 2023
4033dae
Use Staging endpoints
afterxleep Jun 16, 2023
c9608ef
Update BSK deps
afterxleep Jun 16, 2023
1d32e02
Remove icon container
afterxleep Jun 20, 2023
adda415
Copy updates
afterxleep Jun 20, 2023
4e0dffe
Disable Email protection Alert
afterxleep Jun 20, 2023
a760bf9
Manage Account Action (Private Email)
afterxleep Jun 20, 2023
ebfd011
Manage Private Email Account
afterxleep Jun 20, 2023
5891353
Move Endpoints to PROD
afterxleep Jun 20, 2023
369ad5b
Fix logic for logged out account
afterxleep Jun 20, 2023
68cafa3
Update Copy
afterxleep Jun 20, 2023
66e3b68
Update copy
afterxleep Jun 20, 2023
d0aab10
Update Message Layout
afterxleep Jun 20, 2023
1e2cc02
Move font to subheadline
afterxleep Jun 20, 2023
3f858b2
Open Email Protection Signup from Menu
afterxleep Jun 21, 2023
64a5305
Opens email protection login from Login Management
afterxleep Jun 21, 2023
9f073b2
Use Attributed String on macOS 12+
afterxleep Jun 21, 2023
37c574e
Add hand icon on hover
afterxleep Jun 21, 2023
67370b9
Show a timer only if needed
afterxleep Jun 21, 2023
099028c
0.3s timer
afterxleep Jun 21, 2023
ef1af46
Hide username/password icons when value is empty
afterxleep Jun 22, 2023
9b7b407
Update text
afterxleep Jun 22, 2023
f08de80
Update Packages
afterxleep Jun 26, 2023
fbb2046
Initial Changes for Autofill partial saving
afterxleep Jun 28, 2023
40f1737
Point to the right branch, and update autofill save settings
afterxleep Jun 29, 2023
8ecba79
Remove activity indicator
afterxleep Jun 29, 2023
2b14313
Use Correct autofill branch
afterxleep Jun 29, 2023
2d5f023
Merge branch 'daniel/private-email-autofill' of github.com:duckduckgo…
afterxleep Jun 30, 2023
8977998
Point to BSK Development branch
afterxleep Jun 30, 2023
fca683e
Lint issue
afterxleep Jun 30, 2023
fc4222b
Private Email Autofill
afterxleep Jul 3, 2023
c9f49f6
Add email address to confirmation dialog
afterxleep Jul 4, 2023
193a410
Updated copy
afterxleep Jul 4, 2023
01bea26
Remove address message
afterxleep Jul 4, 2023
578f389
Remove the returnCode (Causes a crash in SwiftUI alerts)
afterxleep Jul 4, 2023
cf905a7
Revert "Remove address message"
afterxleep Jul 4, 2023
09c5839
Restore deleted messages
afterxleep Jul 4, 2023
6b87b07
Merge branch 'develop' into daniel/private-email-autofill
afterxleep Jul 5, 2023
0d947eb
Update from develop
afterxleep Jul 5, 2023
ec90aa3
Point to proper BSK branch
afterxleep Jul 5, 2023
9c7a853
Fix issue causing the removal alert not showing up
afterxleep Jul 6, 2023
f9f531d
Use a toggle to manage addresses
afterxleep Jul 10, 2023
32b0c1e
Fix indentation
afterxleep Jul 10, 2023
b86a3c5
Move display logic to the model
afterxleep Jul 10, 2023
b05888f
Updated Copy + Lint issue
afterxleep Jul 10, 2023
85b5448
Cleanup
afterxleep Jul 10, 2023
1dfc710
Animate status
afterxleep Jul 10, 2023
bedf670
Remove error message + missing dot
afterxleep Jul 11, 2023
79381ae
Point to New Autofill branch
afterxleep Jul 12, 2023
94e9af1
Removed unused methods
afterxleep Jul 17, 2023
f0fbbc2
BSK branch
afterxleep Jul 17, 2023
e55bb5d
BSK Branch
afterxleep Jul 17, 2023
daf8cad
Merge branch 'develop' into daniel/private-email-autofill
afterxleep Jul 19, 2023
5a72b43
Point to Email capitalization branch
afterxleep Jul 19, 2023
dbbf269
Autofill 8.0.0 bump via BSK
afterxleep Jul 21, 2023
fcf6cdb
Merge branch 'develop' into daniel/private-email-autofill
afterxleep Aug 3, 2023
f8ba826
Merge branch 'develop' into daniel/private-email-autofill
afterxleep Aug 3, 2023
4511865
Point to BSK release tag
afterxleep Aug 3, 2023
087179d
Point to latest BSK
afterxleep Aug 3, 2023
83666fa
Merge branch 'develop' into daniel/private-email-autofill
afterxleep Aug 3, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DuckDuckGo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -10137,7 +10137,7 @@
repositoryURL = "https://github.com/duckduckgo/BrowserServicesKit";
requirement = {
kind = exactVersion;
version = 71.3.0;
version = 71.4.1;
};
};
AA06B6B52672AF8100F541C5 /* XCRemoteSwiftPackageReference "Sparkle" */ = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/duckduckgo/BrowserServicesKit",
"state" : {
"revision" : "005949a099121192f55b4b5d33ed5d7ce4a12934",
"version" : "71.3.0"
"revision" : "aa10614509aa838d11b0b7540615eab7bd47e851",
"version" : "71.4.1"
}
},
{
Expand All @@ -32,8 +32,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/duckduckgo/duckduckgo-autofill.git",
"state" : {
"revision" : "44cd844b6bb5d8ccfefbd6e025817d800c26ad76",
"version" : "7.2.0"
"revision" : "b1160df954eea20cd4cdf9356afc369751981b16",
"version" : "8.0.0"
}
},
{
Expand Down Expand Up @@ -129,7 +129,7 @@
{
"identity" : "trackerradarkit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/duckduckgo/TrackerRadarKit.git",
"location" : "https://github.com/duckduckgo/TrackerRadarKit",
"state" : {
"revision" : "4684440d03304e7638a2c8086895367e90987463",
"version" : "1.2.1"
Expand Down
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Alert-Color-16.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
12 changes: 12 additions & 0 deletions DuckDuckGo/Assets.xcassets/Images/Email-16.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Email-16.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Email-Deactivate-16.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "[email protected]@1x.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Email-Warning-16.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "Identity-16.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"template-rendering-intent" : "template"
}
}
Binary file not shown.
12 changes: 3 additions & 9 deletions DuckDuckGo/Autofill/ContentOverlayViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,9 @@
return true
}

public func secureVaultManager(_: SecureVaultManager, promptUserToStoreAutofillData data: AutofillData, hasGeneratedPassword generatedPassword: Bool, withTrigger trigger: AutofillUserScript.GetTriggerType?) {
public func secureVaultManager(_: SecureVaultManager,

Check failure on line 231 in DuckDuckGo/Autofill/ContentOverlayViewController.swift

View workflow job for this annotation

GitHub Actions / SwiftLint

Trailing Whitespace Violation: Lines should not have trailing whitespace (trailing_whitespace)
promptUserToStoreAutofillData data: AutofillData,
withTrigger trigger: AutofillUserScript.GetTriggerType?) {
// No-op, the content overlay view controller should not be prompting the user to store data
}

Expand All @@ -250,14 +252,6 @@
Pixel.fire(.formAutofilled(kind: type.formAutofillKind))
}

public func secureVaultManagerShouldAutomaticallyUpdateCredentialsWithoutUsername(_: SecureVaultManager, shouldSilentlySave: Bool) -> Bool {
return true
}

public func secureVaultManagerShouldSilentlySaveGeneratedPassword(_: SecureVaultManager) -> Bool {
return false
}

public func secureVaultManager(_: SecureVaultManager, didRequestAuthenticationWithCompletionHandler handler: @escaping (Bool) -> Void) {
DeviceAuthenticator.shared.authenticateUser(reason: .autofill) { authenticationResult in
handler(authenticationResult.authenticated)
Expand Down
10 changes: 10 additions & 0 deletions DuckDuckGo/Common/Extensions/NSAlertExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,16 @@ extension NSAlert {
return alert
}

static func disableEmailProtection() -> NSAlert {
let alert = NSAlert()
alert.messageText = UserText.disableEmailProtectionTitle
alert.informativeText = UserText.disableEmailProtectionMessage
alert.alertStyle = .warning
alert.addButton(withTitle: UserText.disable)
alert.addButton(withTitle: UserText.cancel)
return alert
}

@discardableResult
func runModal() async -> NSApplication.ModalResponse {
await withCheckedContinuation { continuation in
Expand Down
1 change: 1 addition & 0 deletions DuckDuckGo/Common/Extensions/URLExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@ extension URL {
}

static var duckDuckGoEmail = URL(string: "https://duckduckgo.com/email-protection")!
static var duckDuckGoEmailLogin = URL(string: "https://duckduckgo.com/email")!

static var duckDuckGoMorePrivacyInfo = URL(string: "https://help.duckduckgo.com/duckduckgo-help-pages/privacy/atb/")!

Expand Down
12 changes: 11 additions & 1 deletion DuckDuckGo/Common/Localizables/UserText.swift
Original file line number Diff line number Diff line change
Expand Up @@ -236,9 +236,10 @@ struct UserText {

static let emailOptionsMenuItem = NSLocalizedString("email.optionsMenu", value: "Email Protection", comment: "Menu item email feature")
static let emailOptionsMenuCreateAddressSubItem = NSLocalizedString("email.optionsMenu.createAddress", value: "Generate Private Duck Address", comment: "Create an email alias sub menu item")
static let emailOptionsMenuTurnOffSubItem = NSLocalizedString("email.optionsMenu.turnOff", value: "Disable Email Protection", comment: "Disable email sub menu item")
static let emailOptionsMenuTurnOffSubItem = NSLocalizedString("email.optionsMenu.turnOff", value: "Disable Email Protection Autofill", comment: "Disable email sub menu item")
static let emailOptionsMenuTurnOnSubItem = NSLocalizedString("email.optionsMenu.turnOn", value: "Enable Email Protection", comment: "Enable email sub menu item")
static let privateEmailCopiedToClipboard = NSLocalizedString("email.copied", value: "New address copied to your clipboard", comment: "Private email address was copied to clipboard message")
static let emailOptionsMenuManageAccountSubItem = NSLocalizedString("email.optionsMenu.manageAccount", value: "Manage Account", comment: "Manage private email account sub menu item")

static let newFolder = NSLocalizedString("folder.optionsMenu.newFolder", value: "New Folder", comment: "Option for creating a new folder")
static let renameFolder = NSLocalizedString("folder.optionsMenu.renameFolder", value: "Rename Folder", comment: "Option for renaming a folder")
Expand Down Expand Up @@ -788,5 +789,14 @@ struct UserText {
static let burnerHomepageDescription2 = NSLocalizedString("burner.homepage.description.2", value: "Sign in to a site with a different account", comment: "")
static let burnerHomepageDescription3 = NSLocalizedString("burner.homepage.description.3", value: "Troubleshoot websites", comment: "")
static let burnerHomepageDescription4 = NSLocalizedString("burner.homepage.description.4", value: "Fire windows are isolated from other browser data, and their data is burned when you close them. They have the same tracking protection as other windows.", comment: "")

// Email Protection Management
static let disableEmailProtectionTitle = NSLocalizedString("disable.email.protection.title", value: "Disable Email Protection Autofill?", comment: "Title for alert shown when user disables email protection")
static let disableEmailProtectionMessage = NSLocalizedString("disable.email.protection.mesage", value: "This will only disable Autofill for Duck Addresses in this browser. \n\n You can still manually enter Duck Addresses and continue to receive forwarded email.", comment: "Message for alert shown when user disables email protection")
static let disable = NSLocalizedString("disable", value: "Disable", comment: "Email protection Disable button text")




}

18 changes: 15 additions & 3 deletions DuckDuckGo/Email/EmailManagerRequestDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,29 @@ import BrowserServicesKit

extension EmailManagerRequestDelegate {

public var activeTask: URLSessionTask? {
get { return nil }
set {}
}

// swiftlint:disable function_parameter_count
func emailManager(_ emailManager: EmailManager, requested url: URL, method: String, headers: [String: String], parameters: [String: String]?, httpBody: Data?, timeoutInterval: TimeInterval) async throws -> Data {

let finalURL = url.appendingParameters(parameters ?? [:])

var request = URLRequest(url: finalURL, timeoutInterval: timeoutInterval)
request.allHTTPHeaderFields = headers
request.httpMethod = method
request.httpBody = httpBody

return try await URLSession.default.data(for: request).0
activeTask?.cancel() // Cancel active request (if any)

let (data, response) = try await URLSession.shared.data(for: request)
activeTask = URLSession.shared.dataTask(with: request)

if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode >= 300 {
throw EmailManagerRequestDelegateError.serverError(statusCode: httpResponse.statusCode)
}

return data
}
// swiftlint:enable function_parameter_count

Expand Down
5 changes: 5 additions & 0 deletions DuckDuckGo/Email/EmailUrlExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ extension EmailUrls {
private struct Url {
static let emailProtectionLink = "https://duckduckgo.com/email"
static let emailProtectionInContextSignupLink = "https://duckduckgo.com/email/start-incontext"
static let emailProtectionAccountLink = "https://duckduckgo.com/email/settings/account"
}

var emailProtectionLink: URL {
Expand All @@ -34,6 +35,10 @@ extension EmailUrls {
return URL(string: Url.emailProtectionInContextSignupLink)!
}

var emailProtectionAccountLink: URL {
return URL(string: Url.emailProtectionAccountLink)!
}

func isDuckDuckGoEmailProtection(url: URL) -> Bool {
return url.absoluteString.starts(with: Url.emailProtectionLink)
}
Expand Down
10 changes: 10 additions & 0 deletions DuckDuckGo/Menus/MainMenuActions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,16 @@ extension AppDelegate {
@IBAction func fireButtonAction(_ sender: NSButton) {
FireCoordinator.fireButtonAction()
}

@IBAction func navigateToPrivateEmail(_ sender: Any?) {
guard let window = NSApplication.shared.keyWindow,
let windowController = window.windowController as? MainWindowController else {
assertionFailure("No reference to main window controller")
return
}
windowController.mainViewController.browserTabViewController.openNewTab(with: .url(URL.duckDuckGoEmailLogin))
}

}

extension MainViewController {
Expand Down
19 changes: 17 additions & 2 deletions DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -341,9 +341,15 @@ final class EmailOptionsButtonSubMenu: NSMenu {
.targetting(self)
.withImage(NSImage(named: "OptionsButtonMenuEmailGenerateAddress"))

addItem(withTitle: UserText.emailOptionsMenuManageAccountSubItem, action: #selector(manageAccountAction(_:)), keyEquivalent: "")
.targetting(self)
.withImage(NSImage(named: "Identity-16"))

addItem(.separator())

addItem(withTitle: UserText.emailOptionsMenuTurnOffSubItem, action: #selector(turnOffEmailAction(_:)), keyEquivalent: "")
.targetting(self)
.withImage(NSImage(named: "OptionsButtonMenuEmailDisabled"))
.withImage(NSImage(named: "Email-Disabled-16"))

} else {
addItem(withTitle: UserText.emailOptionsMenuTurnOnSubItem, action: #selector(turnOnEmailAction(_:)), keyEquivalent: "")
Expand All @@ -353,6 +359,11 @@ final class EmailOptionsButtonSubMenu: NSMenu {
}
}

@objc func manageAccountAction(_ sender: NSMenuItem) {
let tab = Tab(content: .url(EmailUrls().emailProtectionAccountLink), shouldLoadInBackground: true, burnerMode: tabCollectionViewModel.burnerMode)
tabCollectionViewModel.append(tab: tab)
}

@objc func createAddressAction(_ sender: NSMenuItem) {
assert(emailManager.requestDelegate != nil, "No requestDelegate on emailManager")

Expand All @@ -374,7 +385,11 @@ final class EmailOptionsButtonSubMenu: NSMenu {
}

@objc func turnOffEmailAction(_ sender: NSMenuItem) {
emailManager.signOut()
let alert = NSAlert.disableEmailProtection()
let response = alert.runModal()
if response == .alertFirstButtonReturn {
emailManager.signOut()
}
}

@objc func turnOnEmailAction(_ sender: NSMenuItem) {
Expand Down
16 changes: 16 additions & 0 deletions DuckDuckGo/SecureVault/Extensions/UserText+PasswordManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,22 @@ extension UserText {
static let pmLoginAdded = NSLocalizedString("pm.added", value: "Added", comment: "Label for login added data")
static let pmLoginLastUpdated = NSLocalizedString("pm.last.updated", value: "Last Updated", comment: "Label for last updated edit field")

static let pmDeactivateAddress = NSLocalizedString("pm.deactivate.private.email", value: "Deactivate Duck Address", comment: "Deactivate private email address button")
static let pmActivateAddress = NSLocalizedString("pm.activate.private.email", value: "Reactivate Duck Address", comment: "Activate private email address button")
static let pmDeactivate = NSLocalizedString("pm.deactivate", value: "Deactivate", comment: "Deactivate button")
static let pmActivate = NSLocalizedString("pm.activate", value: "Reactivate", comment: "Activate button")
static let pmEmailMessageActive = NSLocalizedString("pm.private.email.mesage.active", value: "Duck Address Active", comment: "Mesasage displayed when a private email address is active")
static let pmEmailMessageInactive = NSLocalizedString("pm.private.email.mesage.inactive", value: "Duck Address Deactivated", comment: "Mesasage displayed when a private email address is inactive")
static let pmEmailMessageError = NSLocalizedString("pm.private.email.mesage.error", value: "Management of this address is temporarily unavailable.", comment: "Mesasage displayed when a user tries to manage a private email address but the service is not available, returns an error or network is down")
static let pmEmailActivateConfirmTitle = NSLocalizedString("pm.private.email.mesage.activate.confirm.title", value: "Reactivate Private Duck Address?", comment: "Title for the confirmation message displayed when a user tries activate a Private Email Address")
static let pmEmailActivateConfirmContent = NSLocalizedString("pm.private.email.mesage.activate.confirm.content", value: "Emails sent to %@ will again be forwarded to your inbox.", comment: "Text for the confirmation message displayed when a user tries activate a Private Email Address")
static let pmEmailDeactivateConfirmTitle = NSLocalizedString("pm.private.email.mesage.deactivate.confirm.title", value: "Deactivate Private Duck Address?", comment: "Title for the confirmation message displayed when a user tries deactivate a Private Email Address")
static let pmEmailDeactivateConfirmContent = NSLocalizedString("pm.private.email.mesage.deactivate.confirm.content", value: "Emails sent to %@ will no longer be forwarded to your inbox.", comment: "Text for the confirmation message displayed when a user tries deactivate a Private Email Address")
static let pmRemovedDuckAddressTitle = NSLocalizedString("pm.removed.duck.address.title", value: "Private Duck Address username was removed", comment: "Title for the alert dialog telling the user an updated username is no longer a private email address")
static let pmRemovedDuckAddressContent = NSLocalizedString("pm.removed.duck.address.content", value: "You can still manage this Duck Address from emails received from it in your personal inbox.", comment: "Content for the alert dialog telling the user an updated username is no longer a private email address")
static let pmRemovedDuckAddressButton = NSLocalizedString("pm.removed.duck.address.button", value: "Got it", comment: "Button text for the alert dialog telling the user an updated username is no longer a private email address")
static let pmSignInToManageEmail = NSLocalizedString("pm.signin.to.manage", value: "%@ to manage your Duck Addresses on this device.", comment: "Message displayed to the user when they are logged out of Email protection.")
static let pmEnableEmailProtection = NSLocalizedString("pm.enable.email.protection", value: "Enable Email Protection", comment: "Text link to email protection website")
static let pmCardNumber = NSLocalizedString("pm.card.number", value: "Card Number", comment: "Label for card number title")
static let pmCardholderName = NSLocalizedString("pm.card.cardholder-name", value: "Cardholder Name", comment: "Label for cardholder name title")
static let pmCardVerificationValue = NSLocalizedString("pm.card.cvv", value: "CVV", comment: "Label for CVV title")
Expand Down
Loading
Loading