Add logic for more customizable password generator
This commit is contained in:
parent
49a371d495
commit
ff014a5699
10 changed files with 352 additions and 131 deletions
|
|
@ -20,7 +20,7 @@ public enum GitAuthenticationMethod: String, DefaultsSerializable {
|
|||
}
|
||||
|
||||
extension SearchBarScope: DefaultsSerializable {}
|
||||
extension PasswordGeneratorFlavor: DefaultsSerializable {}
|
||||
extension PasswordGenerator: DefaultsSerializable {}
|
||||
|
||||
public extension DefaultsKeys {
|
||||
var pgpKeySource: DefaultsKey<KeySource?> { .init("pgpKeySource") }
|
||||
|
|
@ -53,7 +53,7 @@ public extension DefaultsKeys {
|
|||
var isShowFolderOn: DefaultsKey<Bool> { .init("isShowFolderOn", defaultValue: true) }
|
||||
var isHidePasswordImagesOn: DefaultsKey<Bool> { .init("isHidePasswordImagesOn", defaultValue: false) }
|
||||
var searchDefault: DefaultsKey<SearchBarScope?> { .init("searchDefault", defaultValue: .all) }
|
||||
var passwordGeneratorFlavor: DefaultsKey<PasswordGeneratorFlavor> { .init("passwordGeneratorFlavor", defaultValue: .apple) }
|
||||
var passwordGenerator: DefaultsKey<PasswordGenerator> { .init("passwordGenerator", defaultValue: PasswordGenerator()) }
|
||||
|
||||
var encryptInArmored: DefaultsKey<Bool> { .init("encryptInArmored", defaultValue: false) }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,86 +0,0 @@
|
|||
//
|
||||
// PasswordGeneratorFlavor.swift
|
||||
// passKit
|
||||
//
|
||||
// Created by Danny Moesch on 28.11.18.
|
||||
// Copyright © 2018 Bob Sun. All rights reserved.
|
||||
//
|
||||
|
||||
import KeychainAccess
|
||||
|
||||
public enum PasswordGeneratorFlavor: String {
|
||||
case apple = "Apple"
|
||||
case random = "Random"
|
||||
case xkcd = "XKCD"
|
||||
|
||||
private static let words: [String] = {
|
||||
let bundle = Bundle(identifier: Globals.passKitBundleIdentifier)!
|
||||
return ["eff_long_wordlist", "eff_short_wordlist"]
|
||||
.map { name -> String in
|
||||
guard let asset = NSDataAsset(name: name, bundle: bundle),
|
||||
let data = String(data: asset.data, encoding: .utf8) else {
|
||||
return ""
|
||||
}
|
||||
return data
|
||||
}
|
||||
.joined(separator: "\n")
|
||||
.splitByNewline()
|
||||
}()
|
||||
|
||||
public var localized: String {
|
||||
return rawValue.localize()
|
||||
}
|
||||
|
||||
public var longNameLocalized: String {
|
||||
switch self {
|
||||
case .apple:
|
||||
return "ApplesKeychainStyle".localize()
|
||||
case .random:
|
||||
return "RandomString".localize()
|
||||
case .xkcd:
|
||||
return "XKCDStyle".localize()
|
||||
}
|
||||
}
|
||||
|
||||
public var defaultLength: (min: Int, max: Int, def: Int) {
|
||||
switch self {
|
||||
case .apple:
|
||||
return (15, 15, 15)
|
||||
case .random:
|
||||
return (4, 64, 16)
|
||||
case .xkcd:
|
||||
return (2, 5, 3)
|
||||
}
|
||||
}
|
||||
|
||||
public func generate(length: Int) -> String {
|
||||
switch self {
|
||||
case .apple:
|
||||
return Keychain.generatePassword()
|
||||
case .random:
|
||||
return Self.generateRandom(length: length)
|
||||
case .xkcd:
|
||||
return Self.generateXKCD(length: length)
|
||||
}
|
||||
}
|
||||
|
||||
private static func generateRandom(length: Int) -> String {
|
||||
let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*_+-="
|
||||
return String((0..<length).map { _ in chars.randomElement()! })
|
||||
}
|
||||
|
||||
private static func generateXKCD(length: Int) -> String {
|
||||
let delimiters = "0123456789!@#$%^&*_+-="
|
||||
var password = ""
|
||||
(0..<length).forEach { _ in
|
||||
var word = words.randomElement()!
|
||||
if Bool.random() {
|
||||
word = word.uppercased()
|
||||
}
|
||||
password += word + String(delimiters.randomElement()!)
|
||||
}
|
||||
return password
|
||||
}
|
||||
}
|
||||
|
||||
extension PasswordGeneratorFlavor: CaseIterable {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue