From a22e872a8c91ec1107e687a88d4e8c073604f18b Mon Sep 17 00:00:00 2001 From: Mingshen Sun Date: Wed, 22 Mar 2023 18:49:47 -0700 Subject: [PATCH 01/37] Version bump to 0.15.0 --- pass.xcodeproj/project.pbxproj | 30 +++++++++++++++--------------- passAutoFillExtension/Info.plist | 14 +++++++------- passExtension/Info.plist | 20 ++++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/pass.xcodeproj/project.pbxproj b/pass.xcodeproj/project.pbxproj index 9d6a3fb5..6fe21cb6 100644 --- a/pass.xcodeproj/project.pbxproj +++ b/pass.xcodeproj/project.pbxproj @@ -1872,7 +1872,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = me.mssun.passforios.shortcuts; @@ -1907,7 +1907,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = me.mssun.passforios.shortcuts; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -2004,7 +2004,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "${inherited}"; OTHER_SWIFT_FLAGS = "$(inherited)"; @@ -2065,7 +2065,7 @@ "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; OTHER_CFLAGS = "$(inherited)"; OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).find-login-action-extension"; @@ -2100,7 +2100,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MODULEMAP_FILE = ""; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; @@ -2165,7 +2165,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = "me.mssun.passforiosbeta.auto-fill-credential-extension"; @@ -2201,7 +2201,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MTL_FAST_MATH = YES; OTHER_SWIFT_FLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = me.mssun.passforiosbeta.shortcuts; @@ -2236,7 +2236,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "me.mssun.passforios.auto-fill-credential-extension"; @@ -2272,7 +2272,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = "me.mssun.passforios.auto-fill-credential-extension"; PRODUCT_NAME = passAutoFillExtension; @@ -2305,7 +2305,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MODULEMAP_FILE = ""; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; @@ -2345,7 +2345,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; MODULEMAP_FILE = ""; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "$(inherited)"; @@ -2429,7 +2429,7 @@ "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; OTHER_CFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).find-login-action-extension"; PRODUCT_NAME = passExtension; @@ -2464,7 +2464,7 @@ "@executable_path/../../Frameworks", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; OTHER_CFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER).find-login-action-extension"; PRODUCT_NAME = passExtension; @@ -2679,7 +2679,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "${inherited}"; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; @@ -2713,7 +2713,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = "$(inherited)"; - MARKETING_VERSION = 0.14.0; + MARKETING_VERSION = 0.15.0; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = "${inherited}"; OTHER_SWIFT_FLAGS = ""; diff --git a/passAutoFillExtension/Info.plist b/passAutoFillExtension/Info.plist index 68e7c785..7034b87f 100644 --- a/passAutoFillExtension/Info.plist +++ b/passAutoFillExtension/Info.plist @@ -2,13 +2,6 @@ - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - CFBundleDevelopmentRegion en CFBundleDisplayName @@ -36,5 +29,12 @@ NSFaceIDUsageDescription Enable access to Face ID to unlock Pass. + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + diff --git a/passExtension/Info.plist b/passExtension/Info.plist index 11d61d59..be88bbf6 100644 --- a/passExtension/Info.plist +++ b/passExtension/Info.plist @@ -2,13 +2,6 @@ - UIApplicationSceneManifest - - UISceneConfigurations - - UIApplicationSupportsMultipleScenes - - CFBundleDevelopmentRegion en CFBundleDisplayName @@ -38,9 +31,9 @@ SUBQUERY ( $extensionItem.attachments, $attachment, - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.find-login-action" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" || - ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.find-login-action" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url" || + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" ).@count == $extensionItem.attachments.@count ).@count == 1 NSExtensionJavaScriptPreprocessingFile @@ -53,5 +46,12 @@ NSFaceIDUsageDescription Enable access to Face ID to unlock Pass. + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + From d9bd0f30148ca22e2c4b50dca0839e579f80887e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Sun, 23 Apr 2023 22:01:37 +0200 Subject: [PATCH 02/37] Update SwiftLint and SwiftFormat (#613) * Update Swift version used by SwiftFormat * Update SwiftLint version * Rely on new virtual 'all' rule in SwiftLint * Enable SwiftLint rule 'direct_return' rule and fix all violations * Enable SwiftLint rule 'shorthand_optional_binding' rule and fix all violations * Enable SwiftLint rule 'blanket_disable_command' rule and fix all violations --- .swift-version | 2 +- .swiftlint.yml | 257 +++--------------- pass/AppDelegate.swift | 5 +- .../AboutRepositoryTableViewController.swift | 5 +- .../AdvancedSettingsTableViewController.swift | 2 +- .../PGPKeyFIleImportTableViewController.swift | 4 +- .../PGPKeyURLImportTableViewController.swift | 4 +- .../PasswordDetailTableViewController.swift | 11 +- .../PasswordNavigationViewController.swift | 4 +- pass/Controllers/QRScannerController.swift | 2 +- .../SSHKeyFileImportTableViewController.swift | 2 +- .../SettingsTableViewController.swift | 2 +- pass/Views/UICodeHighlightingLabel.swift | 2 +- .../PasscodeLockViewController.swift | 2 +- passKit/Crypto/GopenPGPInterface.swift | 4 +- passKit/Crypto/PGPAgent.swift | 6 +- passKit/Helpers/FileManagerExtension.swift | 2 +- passKit/Helpers/YubiKeyAPDU.swift | 6 +- passKit/Models/Password.swift | 2 +- passKit/Models/PasswordEntity.swift | 2 +- passKit/Models/PasswordStore.swift | 30 +- passKit/Protocols/AlertPresenting.swift | 2 +- passKitTests/Models/GitCredentialTest.swift | 2 +- scripts/swiftlint.sh | 2 +- 24 files changed, 90 insertions(+), 272 deletions(-) diff --git a/.swift-version b/.swift-version index c7cb1311..3659ea2f 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -5.3.1 +5.8 diff --git a/.swiftlint.yml b/.swiftlint.yml index 61d2a402..88159664 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -10,219 +10,50 @@ excluded: ## Active rules -only_rules: - - accessibility_label_for_image -# - anonymous_argument_in_multiline_closure - - anyobject_protocol - - array_init - - attributes -# - balanced_xctest_lifecycle - - block_based_kvo - - capture_variable - - class_delegate_protocol - - closing_brace - - closure_body_length - - closure_end_indentation - - closure_parameter_position - - closure_spacing - - collection_alignment - - colon - - comma - - comma_inheritance - - comment_spacing - - compiler_protocol_init - - computed_accessors_order - - conditional_returns_on_newline - - contains_over_filter_count - - contains_over_filter_is_empty - - contains_over_first_not_nil - - contains_over_range_nil_comparison - - control_statement - - convenience_type - - custom_rules - - cyclomatic_complexity - - deployment_target - - discarded_notification_center_observer - - discouraged_assert - - discouraged_direct_init -# - discouraged_none_name -# - discouraged_object_literal - - discouraged_optional_boolean -# - discouraged_optional_collection # Too many false positives in implementations of system protocols. - - duplicated_key_in_dictionary_literal - - duplicate_enum_cases - - duplicate_imports - - dynamic_inline - - empty_collection_literal -# - empty_count # Too many false positives for variables named 'count'. - - empty_enum_arguments - - empty_parameters - - empty_parentheses_with_trailing_closure - - empty_string - - empty_xctest_method - - enum_case_associated_values_count - - expiring_todo -# - explicit_acl -# - explicit_enum_raw_value # Disabled in favor of 'redundant_string_enum_value'. - - explicit_init - - explicit_self -# - explicit_top_level_acl -# - explicit_type_interface -# - extension_access_modifier - - fallthrough - - fatal_error_message -# - file_header -# - file_length -# - file_name - - file_name_no_space -# - file_types_order - - first_where - - flatmap_over_map_reduce - - for_where -# - force_cast -# - force_try -# - force_unwrapping -# - function_body_length - - function_default_parameter_at_end - - function_parameter_count - - generic_type_name - - ibinspectable_in_extension - - identical_operands - - identifier_name - - implicit_getter - - implicit_return -# - implicitly_unwrapped_optional - - inclusive_language -# - indentation_width - - inert_defer - - is_disjoint - - joined_default_parameter - - large_tuple - - last_where - - leading_whitespace -# - legacy_objc_type - - legacy_cggeometry_functions - - legacy_constant - - legacy_constructor - - legacy_hashing - - legacy_multiple - - legacy_nsgeometry_functions - - legacy_random - - let_var_whitespace -# - line_length - - literal_expression_end_indentation - - lower_acl_than_parent - - mark -# - missing_docs - - modifier_order - - multiline_arguments - - multiline_arguments_brackets - - multiline_function_chains - - multiline_literal_brackets - - multiline_parameters - - multiline_parameters_brackets - - multiple_closures_with_trailing_closure - - nesting - - nimble_operator -# - no_extension_access_modifier - - no_fallthrough_only -# - no_grouping_extension - - no_space_in_method_call - - notification_center_detachment - - nslocalizedstring_key - - nslocalizedstring_require_bundle - - nsobject_prefer_isequal -# - number_separator # Contradicts with SwiftFormat rule 'decimalgrouping'. There are not many numbers anyway in the source code. - - object_literal - - opening_brace - - operator_usage_whitespace - - operator_whitespace - - optional_enum_case_matching - - orphaned_doc_comment - - overridden_super_call - - override_in_extension - - pattern_matching_keywords -# - prefer_nimble - - prefer_self_in_static_references - - prefer_self_type_over_type_of_self - - prefer_zero_over_explicit_init -# - prefixed_toplevel_constant # Violations are mostly in test code. - - private_action -# - private_outlet - - private_over_fileprivate - - private_subject - - private_unit_test -# - prohibited_interface_builder -# - prohibited_super_call - - protocol_property_accessors_order - - quick_discouraged_call - - quick_discouraged_focused_test - - quick_discouraged_pending_test - - raw_value_for_camel_cased_codable_enum - - reduce_boolean - - reduce_into - - redundant_discardable_let - - redundant_nil_coalescing - - redundant_objc_attribute - - redundant_optional_initialization - - redundant_set_access_control - - redundant_string_enum_value - - redundant_type_annotation - - redundant_void_return -# - required_deinit - - required_enum_case - - return_arrow_whitespace - - return_value_from_void_function - - self_in_property_initialization - - shorthand_operator - - single_test_class - - sorted_first_last -# - sorted_imports # Managed by SwiftFormat. - - statement_position - - static_operator - - strict_fileprivate - - strong_iboutlet - - superfluous_disable_command - - switch_case_alignment - - switch_case_on_newline - - syntactic_sugar - - test_case_accessibility - - todo - - toggle_bool - - trailing_closure - - trailing_comma - - trailing_newline - - trailing_semicolon - - trailing_whitespace -# - type_body_length -# - type_contents_order - - type_name - - unavailable_condition - - unavailable_function - - unneeded_break_in_switch - - unneeded_parentheses_in_closure_argument -# - unowned_variable_capture - - untyped_error_in_catch - - unused_capture_list - - unused_closure_parameter - - unused_control_flow_label - - unused_declaration - - unused_enumerated - - unused_import - - unused_optional_binding - - unused_setter_value - - valid_ibinspectable - - vertical_parameter_alignment - - vertical_parameter_alignment_on_call - - vertical_whitespace -# - vertical_whitespace_between_cases # Additional whitespace not needed because of visible indentation. - - vertical_whitespace_closing_braces - - vertical_whitespace_opening_braces - - void_return - - weak_delegate - - xct_specific_matcher - - xctfail_message - - yoda_condition +opt_in_rules: + - all + +disabled_rules: + - anonymous_argument_in_multiline_closure + - balanced_xctest_lifecycle + - discouraged_none_name + - discouraged_object_literal + - discouraged_optional_collection # Too many false positives in implementations of system protocols. + - empty_count # Too many false positives for variables named 'count'. + - explicit_acl + - explicit_enum_raw_value # Disabled in favor of 'redundant_string_enum_value'. + - explicit_top_level_acl + - explicit_type_interface + - extension_access_modifier + - file_header + - file_length + - file_name + - file_types_order + - force_cast + - force_try + - force_unwrapping + - function_body_length + - implicitly_unwrapped_optional + - indentation_width + - legacy_objc_type + - line_length + - missing_docs + - no_extension_access_modifier + - no_grouping_extension + - no_magic_numbers # Causes a lot of violations in tests. + - number_separator # Contradicts with SwiftFormat rule 'decimalgrouping'. There are not many numbers anyway in the source code. + - prefer_nimble + - prefixed_toplevel_constant # Violations are mostly in test code. + - private_outlet + - prohibited_interface_builder + - prohibited_super_call + - required_deinit + - self_binding + - sorted_imports # Managed by SwiftFormat. + - type_body_length + - type_contents_order + - unowned_variable_capture + - vertical_whitespace_between_cases # Additional whitespace not needed because of visible indentation. ## Configuration for specific rules diff --git a/pass/AppDelegate.swift b/pass/AppDelegate.swift index 4412adaf..40965f1d 100644 --- a/pass/AppDelegate.swift +++ b/pass/AppDelegate.swift @@ -20,10 +20,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - lazy var passcodeLockPresenter: PasscodeLockPresenter = { - let presenter = PasscodeLockPresenter(mainWindow: self.window) - return presenter - }() + lazy var passcodeLockPresenter: PasscodeLockPresenter = .init(mainWindow: self.window) func application(_: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. diff --git a/pass/Controllers/AboutRepositoryTableViewController.swift b/pass/Controllers/AboutRepositoryTableViewController.swift index 80f7f4c5..2d60ed69 100644 --- a/pass/Controllers/AboutRepositoryTableViewController.swift +++ b/pass/Controllers/AboutRepositoryTableViewController.swift @@ -13,10 +13,7 @@ class AboutRepositoryTableViewController: BasicStaticTableViewController { private static let VALUE_NOT_AVAILABLE = "ValueNotAvailable".localize() private var needRefresh = false - private var indicator: UIActivityIndicatorView = { - let indicator = UIActivityIndicatorView(style: .medium) - return indicator - }() + private var indicator: UIActivityIndicatorView = .init(style: .medium) private let passwordStore = PasswordStore.shared diff --git a/pass/Controllers/AdvancedSettingsTableViewController.swift b/pass/Controllers/AdvancedSettingsTableViewController.swift index dca815f0..246c6160 100644 --- a/pass/Controllers/AdvancedSettingsTableViewController.swift +++ b/pass/Controllers/AdvancedSettingsTableViewController.swift @@ -80,7 +80,7 @@ class AdvancedSettingsTableViewController: UITableViewController { present(alert, animated: true, completion: nil) } else if tableView.cellForRow(at: indexPath) == clearSuggestionsTableViewCell { ASCredentialIdentityStore.shared.removeAllCredentialIdentities { _, error in - if let error = error { + if let error { SVProgressHUD.showError(withStatus: "FailedToClearQuickTypeSuggestions".localize(error)) SVProgressHUD.dismiss(withDelay: 1) } else { diff --git a/pass/Controllers/PGPKeyFIleImportTableViewController.swift b/pass/Controllers/PGPKeyFIleImportTableViewController.swift index 90d5cbfc..74d95aba 100644 --- a/pass/Controllers/PGPKeyFIleImportTableViewController.swift +++ b/pass/Controllers/PGPKeyFIleImportTableViewController.swift @@ -83,10 +83,10 @@ extension PGPKeyFileImportTableViewController: PGPKeyImporter { } func importKeys() throws { - if let publicKey = publicKey { + if let publicKey { try KeyFileManager.PublicPGP.importKey(from: publicKey) } - if let privateKey = privateKey { + if let privateKey { try KeyFileManager.PrivatePGP.importKey(from: privateKey) } } diff --git a/pass/Controllers/PGPKeyURLImportTableViewController.swift b/pass/Controllers/PGPKeyURLImportTableViewController.swift index 30c3deca..168f1438 100644 --- a/pass/Controllers/PGPKeyURLImportTableViewController.swift +++ b/pass/Controllers/PGPKeyURLImportTableViewController.swift @@ -43,12 +43,12 @@ extension PGPKeyURLImportTableViewController: PGPKeyImporter { } func importKeys() throws { - if let pgpPrivateKeyURL = pgpPrivateKeyURL { + if let pgpPrivateKeyURL { Defaults.pgpPrivateKeyURL = pgpPrivateKeyURL try KeyFileManager.PrivatePGP.importKey(from: pgpPrivateKeyURL) } - if let pgpPublicKeyURL = pgpPublicKeyURL { + if let pgpPublicKeyURL { Defaults.pgpPublicKeyURL = pgpPublicKeyURL try KeyFileManager.PublicPGP.importKey(from: pgpPublicKeyURL) } diff --git a/pass/Controllers/PasswordDetailTableViewController.swift b/pass/Controllers/PasswordDetailTableViewController.swift index ac81c625..2b6c23b9 100644 --- a/pass/Controllers/PasswordDetailTableViewController.swift +++ b/pass/Controllers/PasswordDetailTableViewController.swift @@ -30,10 +30,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni // preserve path so it can be reloaded even if the passwordEntity is deleted during the update process private var passwordPath: String? - private lazy var editUIBarButtonItem: UIBarButtonItem = { - let uiBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(pressEdit)) - return uiBarButtonItem - }() + private lazy var editUIBarButtonItem: UIBarButtonItem = .init(barButtonSystemItem: .edit, target: self, action: #selector(pressEdit)) private struct TableSection { var type: PasswordDetailTableViewControllerSectionType @@ -112,7 +109,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni } private func decryptThenShowPasswordLocalKey(keyID: String? = nil) { - guard let passwordEntity = passwordEntity else { + guard let passwordEntity else { Utils.alert(title: "CannotShowPassword".localize(), message: "PasswordDoesNotExist".localize(), controller: self, completion: { self.navigationController!.popViewController(animated: true) }) @@ -259,7 +256,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni // main section section = TableSection(type: .main) - let password = self.password! + let password = password! if let username = password.username { section.item.append(Constants.USERNAME_KEYWORD => username) } @@ -607,7 +604,7 @@ extension PasswordDetailTableViewController { } private func decryptThenShowPasswordYubiKey() { - guard let passwordEntity = passwordEntity else { + guard let passwordEntity else { handleError(error: AppError.other(message: "PasswordDoesNotExist")) return } diff --git a/pass/Controllers/PasswordNavigationViewController.swift b/pass/Controllers/PasswordNavigationViewController.swift index 339b35ee..81c92826 100644 --- a/pass/Controllers/PasswordNavigationViewController.swift +++ b/pass/Controllers/PasswordNavigationViewController.swift @@ -254,7 +254,7 @@ class PasswordNavigationViewController: UIViewController { if gesture.state == UIGestureRecognizer.State.began { let touchPoint = gesture.location(in: tableView) if let indexPath = tableView.indexPathForRow(at: touchPoint) { - guard let dataSource = dataSource else { + guard let dataSource else { return } let passwordTableEntry = dataSource.getPasswordTableEntry(at: indexPath) @@ -283,7 +283,7 @@ class PasswordNavigationViewController: UIViewController { extension PasswordNavigationViewController: UITableViewDelegate { func tableView(_: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) - guard let dataSource = dataSource else { + guard let dataSource else { return } let entry = dataSource.getPasswordTableEntry(at: indexPath) diff --git a/pass/Controllers/QRScannerController.swift b/pass/Controllers/QRScannerController.swift index cd9bc1b0..69efa7d6 100644 --- a/pass/Controllers/QRScannerController.swift +++ b/pass/Controllers/QRScannerController.swift @@ -75,7 +75,7 @@ class QRScannerController: UIViewController, AVCaptureMetadataOutputObjectsDeleg // Initialize QR Code Frame to highlight the QR code qrCodeFrameView = UIView() - if let qrCodeFrameView = qrCodeFrameView { + if let qrCodeFrameView { qrCodeFrameView.layer.borderColor = UIColor.green.cgColor qrCodeFrameView.layer.borderWidth = 2 view.addSubview(qrCodeFrameView) diff --git a/pass/Controllers/SSHKeyFileImportTableViewController.swift b/pass/Controllers/SSHKeyFileImportTableViewController.swift index 4483794a..232c2043 100644 --- a/pass/Controllers/SSHKeyFileImportTableViewController.swift +++ b/pass/Controllers/SSHKeyFileImportTableViewController.swift @@ -70,7 +70,7 @@ extension SSHKeyFileImportTableViewController: KeyImporter { } func importKeys() throws { - guard let privateKey = privateKey else { + guard let privateKey else { return } try KeyFileManager.PrivateSSH.importKey(from: privateKey) diff --git a/pass/Controllers/SettingsTableViewController.swift b/pass/Controllers/SettingsTableViewController.swift index 4505e204..b715069a 100644 --- a/pass/Controllers/SettingsTableViewController.swift +++ b/pass/Controllers/SettingsTableViewController.swift @@ -241,7 +241,7 @@ class SettingsTableViewController: UITableViewController, UITabBarControllerDele @objc func alertTextFieldDidChange(_ sender: UITextField) { // check whether we should enable the Save button in setPasscodeLockAlert - if let setPasscodeLockAlert = setPasscodeLockAlert, + if let setPasscodeLockAlert, let setPasscodeLockAlertTextFields0 = setPasscodeLockAlert.textFields?[0], let setPasscodeLockAlertTextFields1 = setPasscodeLockAlert.textFields?[1] { if sender == setPasscodeLockAlertTextFields0 || sender == setPasscodeLockAlertTextFields1 { diff --git a/pass/Views/UICodeHighlightingLabel.swift b/pass/Views/UICodeHighlightingLabel.swift index 208168c0..c48f5c3c 100644 --- a/pass/Views/UICodeHighlightingLabel.swift +++ b/pass/Views/UICodeHighlightingLabel.swift @@ -15,7 +15,7 @@ class UICodeHighlightingLabel: UILocalizedLabel { override func awakeFromNib() { super.awakeFromNib() - guard let text = text else { + guard let text else { return } attributedText = formatCode(in: text) diff --git a/passKit/Controllers/PasscodeLockViewController.swift b/passKit/Controllers/PasscodeLockViewController.swift index 1e4d20ef..9a75b506 100644 --- a/passKit/Controllers/PasscodeLockViewController.swift +++ b/passKit/Controllers/PasscodeLockViewController.swift @@ -129,7 +129,7 @@ open class PasscodeLockViewController: UIViewController, UITextFieldDelegate { override open func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) - if let biometryAuthButton = biometryAuthButton { + if let biometryAuthButton { bioButtonPressedAction(biometryAuthButton) } } diff --git a/passKit/Crypto/GopenPGPInterface.swift b/passKit/Crypto/GopenPGPInterface.swift index 7a6a815e..bfd38bbc 100644 --- a/passKit/Crypto/GopenPGPInterface.swift +++ b/passKit/Crypto/GopenPGPInterface.swift @@ -72,7 +72,7 @@ struct GopenPGPInterface: PGPInterface { func decrypt(encryptedData: Data, keyID: String?, passphrase: String) throws -> Data? { let key: CryptoKey? = { - if let keyID = keyID { + if let keyID { return privateKeys.first(where: { key, _ in key.hasSuffix(keyID.lowercased()) })?.value } return privateKeys.first?.value @@ -109,7 +109,7 @@ struct GopenPGPInterface: PGPInterface { func encrypt(plainData: Data, keyID: String?) throws -> Data { let key: CryptoKey? = { - if let keyID = keyID { + if let keyID { return publicKeys.first(where: { key, _ in key.hasSuffix(keyID.lowercased()) })?.value } return publicKeys.first?.value diff --git a/passKit/Crypto/PGPAgent.swift b/passKit/Crypto/PGPAgent.swift index 2278ada0..66fbbed6 100644 --- a/passKit/Crypto/PGPAgent.swift +++ b/passKit/Crypto/PGPAgent.swift @@ -47,7 +47,7 @@ public class PGPAgent { public func decrypt(encryptedData: Data, keyID: String, requestPGPKeyPassphrase: @escaping (String) -> String) throws -> Data? { // Init keys. try checkAndInit() - guard let pgpInterface = pgpInterface else { + guard let pgpInterface else { throw AppError.decryption } @@ -82,7 +82,7 @@ public class PGPAgent { public func encrypt(plainData: Data, keyID: String) throws -> Data { try checkAndInit() - guard let pgpInterface = pgpInterface else { + guard let pgpInterface else { throw AppError.encryption } var keyID = keyID @@ -120,7 +120,7 @@ public class PGPAgent { public func encrypt(plainData: Data) throws -> Data { try checkAndInit() - guard let pgpInterface = pgpInterface else { + guard let pgpInterface else { throw AppError.encryption } return try pgpInterface.encrypt(plainData: plainData, keyID: nil) diff --git a/passKit/Helpers/FileManagerExtension.swift b/passKit/Helpers/FileManagerExtension.swift index e91620aa..3ab3cd44 100644 --- a/passKit/Helpers/FileManagerExtension.swift +++ b/passKit/Helpers/FileManagerExtension.swift @@ -37,7 +37,7 @@ public extension FileManager { } // We have to enumerate all directory contents, including subdirectories. - let enumerator = self.enumerator( + let enumerator = enumerator( at: directoryURL, includingPropertiesForKeys: prefetchedProperties, options: Self.DirectoryEnumerationOptions(), diff --git a/passKit/Helpers/YubiKeyAPDU.swift b/passKit/Helpers/YubiKeyAPDU.swift index 1e38870b..26c0cbb8 100644 --- a/passKit/Helpers/YubiKeyAPDU.swift +++ b/passKit/Helpers/YubiKeyAPDU.swift @@ -9,8 +9,7 @@ import YubiKit public enum YubiKeyAPDU { public static func selectOpenPGPApplication() -> YKFSelectApplicationAPDU { - let selectOpenPGPAPDU = YKFSelectApplicationAPDU(data: Data([0xD2, 0x76, 0x00, 0x01, 0x24, 0x01]))! - return selectOpenPGPAPDU + YKFSelectApplicationAPDU(data: Data([0xD2, 0x76, 0x00, 0x01, 0x24, 0x01]))! } public static func verify(password: String) -> YKFAPDU { @@ -22,8 +21,7 @@ public enum YubiKeyAPDU { apdu += [0x82] // P2: PW1 apdu += withUnsafeBytes(of: UInt8(pw1.count).bigEndian, Array.init) apdu += pw1 - let verifyApdu = YKFAPDU(data: Data(apdu))! - return verifyApdu + return YKFAPDU(data: Data(apdu))! } public static func decipherExtended(data: Data) -> [YKFAPDU] { diff --git a/passKit/Models/Password.swift b/passKit/Models/Password.swift index a9dab8c8..d261dfde 100644 --- a/passKit/Models/Password.swift +++ b/passKit/Models/Password.swift @@ -113,7 +113,7 @@ public class Password { private func checkPasswordForOtpToken() { let (key, value) = Parser.getKeyValuePair(from: password) - if let key = key, Constants.isOtpKeyword(key) { + if let key, Constants.isOtpKeyword(key) { firstLineIsOTPField = true additions.append(key => value) } else { diff --git a/passKit/Models/PasswordEntity.swift b/passKit/Models/PasswordEntity.swift index bbeb8616..6cd1060b 100644 --- a/passKit/Models/PasswordEntity.swift +++ b/passKit/Models/PasswordEntity.swift @@ -11,7 +11,7 @@ import SwiftyUserDefaults public extension PasswordEntity { var nameWithCategory: String { - if let path = path { + if let path { if path.hasSuffix(".gpg") { return String(path.prefix(upTo: path.index(path.endIndex, offsetBy: -4))) } diff --git a/passKit/Models/PasswordStore.swift b/passKit/Models/PasswordStore.swift index 01dac525..5025a026 100644 --- a/passKit/Models/PasswordStore.swift +++ b/passKit/Models/PasswordStore.swift @@ -199,7 +199,7 @@ public class PasswordStore { } private func checkoutAndChangeBranch(withName localBranchName: String, progressBlock: @escaping (String, UInt, UInt) -> Void) throws { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } let remoteBranchName = "origin/\(localBranchName)" @@ -218,7 +218,7 @@ public class PasswordStore { options: [String: Any], progressBlock: @escaping (UnsafePointer, UnsafeMutablePointer) -> Void = { _, _ in } ) throws { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } let remote = try GTRemote(name: "origin", in: storeRepository) @@ -284,7 +284,7 @@ public class PasswordStore { } public func getRecentCommits(count: Int) throws -> [GTCommit] { - guard let storeRepository = storeRepository else { + guard let storeRepository else { return [] } var commits = [GTCommit]() @@ -328,8 +328,7 @@ public class PasswordStore { let passwordEntityFetchRequest = NSFetchRequest(entityName: "PasswordEntity") passwordEntityFetchRequest.predicate = NSPredicate(format: "synced = %i", 0) do { - let passwordEntities = try context.fetch(passwordEntityFetchRequest) as! [PasswordEntity] - return passwordEntities + return try context.fetch(passwordEntityFetchRequest) as! [PasswordEntity] } catch { fatalError("FailedToFetchPasswords".localize(error)) } @@ -357,7 +356,7 @@ public class PasswordStore { } public func getLatestUpdateInfo(filename: String) -> String { - guard let storeRepository = storeRepository else { + guard let storeRepository else { return "Unknown".localize() } guard let blameHunks = try? storeRepository.blame(withFile: filename, options: nil).hunks else { @@ -374,7 +373,7 @@ public class PasswordStore { } private func gitAdd(path: String) throws { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } try storeRepository.index().addFile(path) @@ -382,7 +381,7 @@ public class PasswordStore { } private func gitRm(path: String) throws { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } let url = storeURL.appendingPathComponent(path) @@ -417,7 +416,7 @@ public class PasswordStore { } private func gitCommit(message: String) throws -> GTCommit? { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } let newTree = try storeRepository.index().writeTree() @@ -428,12 +427,11 @@ public class PasswordStore { guard let signature = gitSignatureForNow else { throw AppError.gitCreateSignature } - let commit = try storeRepository.createCommit(with: newTree, message: message, author: signature, committer: signature, parents: [parent], updatingReferenceNamed: headReference.name) - return commit + return try storeRepository.createCommit(with: newTree, message: message, author: signature, committer: signature, parents: [parent], updatingReferenceNamed: headReference.name) } private func getLocalBranch(withName branchName: String) throws -> GTBranch? { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } let reference = GTBranch.localNamePrefix().appending(branchName) @@ -445,7 +443,7 @@ public class PasswordStore { options: [String: Any], transferProgressBlock: @escaping (UInt32, UInt32, Int, UnsafeMutablePointer) -> Void = { _, _, _, _ in } ) throws { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } if let branch = try getLocalBranch(withName: Defaults.gitBranchName) { @@ -588,7 +586,7 @@ public class PasswordStore { } public func updateImage(passwordEntity: PasswordEntity, image: Data?) { - guard let image = image else { + guard let image else { return } let privateMOC = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) @@ -638,7 +636,7 @@ public class PasswordStore { // return the number of discarded commits public func reset() throws -> Int { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } // get a list of local commits @@ -662,7 +660,7 @@ public class PasswordStore { } private func getLocalCommits() throws -> [GTCommit] { - guard let storeRepository = storeRepository else { + guard let storeRepository else { throw AppError.repositoryNotSet } // get the remote branch diff --git a/passKit/Protocols/AlertPresenting.swift b/passKit/Protocols/AlertPresenting.swift index ec745da5..a743f1aa 100644 --- a/passKit/Protocols/AlertPresenting.swift +++ b/passKit/Protocols/AlertPresenting.swift @@ -24,7 +24,7 @@ public extension AlertPresenting where Self: UIViewController { ) } - // swiftlint:disable function_default_parameter_at_end + // swiftlint:disable:next function_default_parameter_at_end func presentFailureAlert(title: String? = nil, message: String, action: AlertAction? = nil) { let title = title ?? "Error" presentAlert( diff --git a/passKitTests/Models/GitCredentialTest.swift b/passKitTests/Models/GitCredentialTest.swift index 3dfbde5b..bfc47480 100644 --- a/passKitTests/Models/GitCredentialTest.swift +++ b/passKitTests/Models/GitCredentialTest.swift @@ -59,7 +59,7 @@ class GitCredentialTest: XCTestCase { func testPasswordCredentialProvider() { let password = GitCredential.from(authenticationMethod: .password, userName: "user", keyStore: keyStore) - let expectation = self.expectation(description: "Password is requested.") + let expectation = expectation(description: "Password is requested.") expectation.assertForOverFulfill = true expectation.expectedFulfillmentCount = 3 let options = password.getCredentialOptions { _, _ in diff --git a/scripts/swiftlint.sh b/scripts/swiftlint.sh index 7118e4de..cd3a6ce4 100755 --- a/scripts/swiftlint.sh +++ b/scripts/swiftlint.sh @@ -1,6 +1,6 @@ export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}" -SWIFTLINT_VERSION="0.50.*" +SWIFTLINT_VERSION="0.51.*" if [[ "${CI}" == "true" ]]; then echo "Running in a Continuous Integration environment. Linting is skipped." From ba1a81170b372e5f6150c0d732d0eccaad010727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Sun, 25 Jun 2023 19:21:45 +0200 Subject: [PATCH 03/37] Update SwiftLint to version 0.52.x, fix new violations or disable them (#618) --- .swiftlint.yml | 8 ++++++++ pass/Controllers/PasswordDetailTableViewController.swift | 3 +-- pass/Controllers/PasswordEditorTableViewController.swift | 8 +++----- pass/Controllers/PasswordNavigationViewController.swift | 2 +- passExtension/Controllers/ExtensionViewController.swift | 3 ++- scripts/swiftlint.sh | 2 +- 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.swiftlint.yml b/.swiftlint.yml index 88159664..9ac39cff 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -15,6 +15,7 @@ opt_in_rules: disabled_rules: - anonymous_argument_in_multiline_closure + - anyobject_protocol # Deprecated. - balanced_xctest_lifecycle - discouraged_none_name - discouraged_object_literal @@ -35,6 +36,7 @@ disabled_rules: - function_body_length - implicitly_unwrapped_optional - indentation_width + - inert_defer # Deprecated. - legacy_objc_type - line_length - missing_docs @@ -49,10 +51,12 @@ disabled_rules: - prohibited_super_call - required_deinit - self_binding + - sorted_enum_cases # Wait for an auto-fix. - sorted_imports # Managed by SwiftFormat. - type_body_length - type_contents_order - unowned_variable_capture + - unused_capture_list # Deprecated. - vertical_whitespace_between_cases # Additional whitespace not needed because of visible indentation. ## Configuration for specific rules @@ -73,3 +77,7 @@ trailing_closure: only_single_muted_parameter: true trailing_comma: mandatory_comma: true +xct_specific_matcher: + matchers: + - two-argument-asserts + diff --git a/pass/Controllers/PasswordDetailTableViewController.swift b/pass/Controllers/PasswordDetailTableViewController.swift index 2b6c23b9..e6a65389 100644 --- a/pass/Controllers/PasswordDetailTableViewController.swift +++ b/pass/Controllers/PasswordDetailTableViewController.swift @@ -491,9 +491,8 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni override func tableView(_: UITableView, heightForHeaderInSection section: Int) -> CGFloat { if tableData[section].header != nil { return 30 - } else { - return UITableView.automaticDimension } + return UITableView.automaticDimension } override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { diff --git a/pass/Controllers/PasswordEditorTableViewController.swift b/pass/Controllers/PasswordEditorTableViewController.swift index e7e14296..86876cfd 100644 --- a/pass/Controllers/PasswordEditorTableViewController.swift +++ b/pass/Controllers/PasswordEditorTableViewController.swift @@ -209,13 +209,11 @@ class PasswordEditorTableViewController: UITableViewController { if sectionHeaderTitles[section] != nil { if UIDevice.current.userInterfaceIdiom == .phone { return 30 - } else { - // Fix covered section header in macOS - return 36 } - } else { - return UITableView.automaticDimension + // Fix covered section header in macOS + return 36 } + return UITableView.automaticDimension } override func tableView(_: UITableView, heightForFooterInSection _: Int) -> CGFloat { diff --git a/pass/Controllers/PasswordNavigationViewController.swift b/pass/Controllers/PasswordNavigationViewController.swift index 81c92826..6722b0c8 100644 --- a/pass/Controllers/PasswordNavigationViewController.swift +++ b/pass/Controllers/PasswordNavigationViewController.swift @@ -59,7 +59,7 @@ class PasswordNavigationViewController: UIViewController { let addPasswordButton = UIButton(type: .system) let plusImage = UIImage(systemName: "plus.circle", withConfiguration: UIImage.SymbolConfiguration(weight: .regular)) addPasswordButton.setImage(plusImage, for: .normal) - addPasswordButton.addTarget(self, action: #selector(self.addPasswordAction), for: .touchDown) + addPasswordButton.addTarget(self, action: #selector(addPasswordAction), for: .touchDown) addPasswordUIBarButtonItem.customView = addPasswordButton return addPasswordUIBarButtonItem }() diff --git a/passExtension/Controllers/ExtensionViewController.swift b/passExtension/Controllers/ExtensionViewController.swift index 7877651b..cb84443b 100644 --- a/passExtension/Controllers/ExtensionViewController.swift +++ b/passExtension/Controllers/ExtensionViewController.swift @@ -105,7 +105,8 @@ extension NSDictionary { return host } return value - } else if let value = self[NSExtensionJavaScriptPreprocessingResultsKey] as? String { + } + if let value = self[NSExtensionJavaScriptPreprocessingResultsKey] as? String { if let host = URL(string: value)?.host { return host } diff --git a/scripts/swiftlint.sh b/scripts/swiftlint.sh index cd3a6ce4..a5c83a53 100755 --- a/scripts/swiftlint.sh +++ b/scripts/swiftlint.sh @@ -1,6 +1,6 @@ export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}" -SWIFTLINT_VERSION="0.51.*" +SWIFTLINT_VERSION="0.52.*" if [[ "${CI}" == "true" ]]; then echo "Running in a Continuous Integration environment. Linting is skipped." From 358908f16136d09187e04871a72fdc2af22238f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Wed, 21 Feb 2024 23:29:36 +0100 Subject: [PATCH 04/37] Update checkout actions --- .github/workflows/deploying.yml | 2 +- .github/workflows/linting.yml | 4 ++-- .github/workflows/testing.yml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploying.yml b/.github/workflows/deploying.yml index e1897d9d..a8fb4b44 100644 --- a/.github/workflows/deploying.yml +++ b/.github/workflows/deploying.yml @@ -13,7 +13,7 @@ jobs: matrix: channel: ['beta', 'release'] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: '2.7' diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 18a8bbe8..9cb9956a 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -6,7 +6,7 @@ jobs: swiftformat: runs-on: macos-12 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: '2.7' @@ -26,7 +26,7 @@ jobs: swiftlint: runs-on: macos-12 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: '2.7' diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 379528e2..c65ad3c6 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -6,7 +6,7 @@ jobs: testing: runs-on: macos-12 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: ruby-version: '2.7' @@ -15,7 +15,7 @@ jobs: run: | brew update brew install carthage swiftformat - brew install go || brew link --overwrite go + brew install go@1.20 || brew link --overwrite go brew install swiftlint || brew link --overwrite swiftlint gem install bundler - uses: actions/cache@v3 From 1bdf9d684be4ba39e7ecee50e02a673b166fc92e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Sun, 24 Nov 2024 13:14:38 +0100 Subject: [PATCH 05/37] Rely on SPM plugins to consume SwiftLint and SwiftFormat Use their latest releases and fix some violations and issues. # Conflicts: # .github/workflows/linting.yml # .github/workflows/testing.yml --- .github/workflows/deploying.yml | 3 +- .github/workflows/linting.yml | 45 --------------- .github/workflows/testing.yml | 5 +- .swiftformat | 13 ++++- .swiftlint.yml | 8 ++- README.md | 2 +- pass.xcodeproj/project.pbxproj | 30 ++++++++-- .../xcshareddata/swiftpm/Package.resolved | 21 ++++++- pass/AppDelegate.swift | 2 +- .../AboutRepositoryTableViewController.swift | 2 +- .../BasicStaticTableViewController.swift | 5 -- pass/Controllers/KeyImporter.swift | 6 +- .../PGPKeyFIleImportTableViewController.swift | 1 + pass/Controllers/PGPKeyImporter.swift | 2 +- .../PasswordDetailTableViewController.swift | 2 +- ... SSHKeyURLImportTableViewController.swift} | 0 .../PasswordDetailTitleTableViewCell.swift | 10 ---- passKit/Helpers/DefaultsKeys.swift | 56 +++++++++---------- passKit/Parser/Parser.swift | 1 + passKitTests/Crypto/CryptoFrameworkTest.swift | 5 +- passKitTests/Crypto/PGPAgentTest.swift | 4 +- .../Extensions/Array+SlicesTest.swift | 2 +- .../Extensions/String+UtilitiesTest.swift | 2 +- passKitTests/Helpers/KeyFileManagerTest.swift | 2 +- passKitTests/Models/GitCredentialTest.swift | 2 +- passKitTests/Models/PasswordStoreTest.swift | 2 +- .../Models/PasswordTableEntryTest.swift | 2 +- passKitTests/Models/PasswordTest.swift | 2 +- passKitTests/Parser/AdditionFieldTest.swift | 2 +- passKitTests/Parser/ConstantsTest.swift | 2 +- passKitTests/Parser/OTPTypeTest.swift | 4 +- passKitTests/Parser/ParserTest.swift | 2 +- passKitTests/Parser/TokenBuilderTest.swift | 2 +- .../PasswordGeneratorFlavorTest.swift | 2 +- .../Passwords/PasswordGeneratorTest.swift | 2 +- passKitTests/Testbase/TestPGPKeys.swift | 2 +- passTests/Models/QRKeyScannerTest.swift | 2 +- passTests/Models/ScannableKeyTypeTest.swift | 2 +- scripts/swiftformat.sh | 25 --------- scripts/swiftlint.sh | 26 --------- 40 files changed, 125 insertions(+), 185 deletions(-) delete mode 100644 .github/workflows/linting.yml rename pass/Controllers/{SSHKeyURLImportTableViewController..swift => SSHKeyURLImportTableViewController.swift} (100%) delete mode 100755 scripts/swiftformat.sh delete mode 100755 scripts/swiftlint.sh diff --git a/.github/workflows/deploying.yml b/.github/workflows/deploying.yml index a8fb4b44..77701c55 100644 --- a/.github/workflows/deploying.yml +++ b/.github/workflows/deploying.yml @@ -21,9 +21,8 @@ jobs: - name: Installing packages run: | brew update - brew install carthage swiftformat + brew install carthage brew install go || brew link --overwrite go - brew install swiftlint || brew link --overwrite swiftlint gem install bundler - uses: actions/cache@v3 id: carthage-cache diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml deleted file mode 100644 index 9cb9956a..00000000 --- a/.github/workflows/linting.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: Linting - -on: pull_request - -jobs: - swiftformat: - runs-on: macos-12 - steps: - - uses: actions/checkout@v4 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: '2.7' - bundler-cache: true - - name: Installing packages - run: | - brew update - if brew ls --version swiftformat > /dev/null; then - brew upgrade swiftformat - else - brew install swiftformat - fi - - name: Formatting code - run: | - swiftformat --lint . - - swiftlint: - runs-on: macos-12 - steps: - - uses: actions/checkout@v4 - - uses: ruby/setup-ruby@v1 - with: - ruby-version: '2.7' - bundler-cache: true - - name: Installing packages - run: | - brew update - if brew ls --version swiftlint > /dev/null; then - brew upgrade swiftlint - else - # For some reason the SwiftLint binary is kept at its location after shutdown. - brew install swiftlint || brew link --overwrite swiftlint - fi - - name: Linting code - run: | - swiftlint --strict diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index c65ad3c6..a25e0bed 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -14,9 +14,8 @@ jobs: - name: Installing packages run: | brew update - brew install carthage swiftformat - brew install go@1.20 || brew link --overwrite go - brew install swiftlint || brew link --overwrite swiftlint + brew install carthage + brew install go || brew link --overwrite go gem install bundler - uses: actions/cache@v3 id: carthage-cache diff --git a/.swiftformat b/.swiftformat index 88c88150..6bb5f80c 100644 --- a/.swiftformat +++ b/.swiftformat @@ -19,6 +19,7 @@ blankLinesAroundMark, \ blankLinesAtEndOfScope, \ blankLinesAtStartOfScope, \ + blankLinesBetweenChainedFunctions, \ # blankLinesBetweenImports, \ blankLinesBetweenScopes, \ blockComments, \ @@ -32,6 +33,7 @@ extensionAccessControl, \ fileHeader, \ # genericExtensions, \ + headerFileName, \ hoistPatternLet, \ indent, \ initCoderUnavailable, \ @@ -41,9 +43,11 @@ linebreaks, \ modifierOrder, \ # markTypes, \ + noExplicitOwnership, \ numberFormatting, \ # opaqueGenericParameters, \ # organizeDeclarations, \ +# preferForLoop, \ preferKeyPath, \ redundantBackticks, \ redundantBreak, \ @@ -52,6 +56,7 @@ redundantFileprivate, \ redundantGet, \ redundantInit, \ + redundantInternal, \ redundantLet, \ redundantLetError, \ redundantNilInit, \ @@ -62,11 +67,13 @@ redundantRawValues, \ redundantReturn, \ redundantSelf, \ + redundantStaticSelf, \ redundantType, \ redundantVoidReturnType, \ semicolons, \ - sortedImports, \ - sortedSwitchCases, \ + sortImports, \ + sortSwitchCases, \ + sortTypealiases, \ spaceAroundBraces, \ spaceAroundBrackets, \ spaceAroundComments, \ @@ -93,6 +100,8 @@ wrapAttributes, \ wrapConditionalBodies, \ # wrapEnumCases, \ + wrapLoopBodies, \ + wrapMultilineConditionalAssignment, \ # wrapMultilineStatementBraces, \ wrapSingleLineComments, \ # wrapSwitchCases, \ diff --git a/.swiftlint.yml b/.swiftlint.yml index 9ac39cff..5c9606b4 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -7,6 +7,7 @@ excluded: - go - Pods - vendor + - xcode ## Active rules @@ -15,8 +16,8 @@ opt_in_rules: disabled_rules: - anonymous_argument_in_multiline_closure - - anyobject_protocol # Deprecated. - balanced_xctest_lifecycle + - contrasted_opening_brace - discouraged_none_name - discouraged_object_literal - discouraged_optional_collection # Too many false positives in implementations of system protocols. @@ -40,10 +41,12 @@ disabled_rules: - legacy_objc_type - line_length - missing_docs + - no_empty_block # To be fixed later. - no_extension_access_modifier - no_grouping_extension - no_magic_numbers # Causes a lot of violations in tests. - number_separator # Contradicts with SwiftFormat rule 'decimalgrouping'. There are not many numbers anyway in the source code. + - one_declaration_per_file - prefer_nimble - prefixed_toplevel_constant # Violations are mostly in test code. - private_outlet @@ -66,6 +69,8 @@ attributes: closure_body_length: warning: 40 error: 60 +explicit_init: + include_bare_init: true identifier_name: excluded: ["id", "to", "Defaults"] allowed_symbols: ["_"] @@ -80,4 +85,3 @@ trailing_comma: xct_specific_matcher: matchers: - two-argument-asserts - diff --git a/README.md b/README.md index 775e59a9..e4b34f29 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ For more, please read the [wiki page](https://github.com/mssun/passforios/wiki). ## Building Pass for iOS -1. Install Carthage, Go, SwiftLint, and SwiftFormat: `brew install carthage go swiftlint swiftformat`. +1. Install Carthage and Go: `brew install carthage go`. 2. Install dependencies via Carthage. Therefore, execute `carthage bootstrap --platform iOS --use-xcframeworks` in the root directory of the project. 3. Run `./scripts/gopenpgp_build.sh` to build GopenPGP. 5. Open the `pass.xcodeproj` file in Xcode. diff --git a/pass.xcodeproj/project.pbxproj b/pass.xcodeproj/project.pbxproj index 6fe21cb6..69794314 100644 --- a/pass.xcodeproj/project.pbxproj +++ b/pass.xcodeproj/project.pbxproj @@ -199,7 +199,7 @@ DC4914961E434301007FF592 /* LabelTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4914941E434301007FF592 /* LabelTableViewCell.swift */; }; DC4914991E434600007FF592 /* PasswordDetailTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC4914981E434600007FF592 /* PasswordDetailTableViewController.swift */; }; DC5F385B1E56AADB00C69ACA /* PGPKeyArmorImportTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC5F385A1E56AADB00C69ACA /* PGPKeyArmorImportTableViewController.swift */; }; - DC8963C01E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift */; }; + DC8963C01E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift */; }; DC917BD71E2E8231000FDF54 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC917BD61E2E8231000FDF54 /* AppDelegate.swift */; }; DC917BDC1E2E8231000FDF54 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DC917BDA1E2E8231000FDF54 /* Main.storyboard */; }; DC917BDE1E2E8231000FDF54 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DC917BDD1E2E8231000FDF54 /* Assets.xcassets */; }; @@ -496,7 +496,7 @@ DC4914941E434301007FF592 /* LabelTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelTableViewCell.swift; sourceTree = ""; }; DC4914981E434600007FF592 /* PasswordDetailTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordDetailTableViewController.swift; sourceTree = ""; }; DC5F385A1E56AADB00C69ACA /* PGPKeyArmorImportTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PGPKeyArmorImportTableViewController.swift; sourceTree = ""; }; - DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHKeyURLImportTableViewController..swift; sourceTree = ""; }; + DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSHKeyURLImportTableViewController.swift; sourceTree = ""; }; DC917BD31E2E8231000FDF54 /* Pass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Pass.app; sourceTree = BUILT_PRODUCTS_DIR; }; DC917BD61E2E8231000FDF54 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; DC917BDB1E2E8231000FDF54 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; @@ -982,7 +982,7 @@ DC037CA91E4B8EAE00609409 /* SpecialThanksTableViewController.swift */, DCC441531E916382008A90C4 /* SSHKeyArmorImportTableViewController.swift */, 30650E7023F82AF8005CCD5E /* SSHKeyFileImportTableViewController.swift */, - DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift */, + DC8963BF1E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift */, ); path = Controllers; sourceTree = ""; @@ -1361,6 +1361,8 @@ 9A1F47F826E5CF4B000C0E01 /* XCRemoteSwiftPackageReference "OneTimePassword" */, 30ED1775276F8842009BA876 /* XCRemoteSwiftPackageReference "objective-git-swift-package" */, 9A2C7D802782CB2F00BD9AF3 /* XCRemoteSwiftPackageReference "yubikit-ios" */, + 307CA2312CF346D40099F6DE /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */, + 307CA2322CF348260099F6DE /* XCRemoteSwiftPackageReference "SwiftFormat" */, ); productRefGroup = DC917BD41E2E8231000FDF54 /* Products */; projectDirPath = ""; @@ -1478,7 +1480,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = ". \"${SRCROOT}/scripts/swiftformat.sh\"\n"; + shellScript = "SWIFT_PACKAGE_DIR=\"${BUILD_DIR%Build/*}SourcePackages/checkouts\"\nSWIFTFORMAT_CMD=\"$SWIFT_PACKAGE_DIR\"/SwiftFormat/CommandLineTool/swiftformat\n\nif [[ \"${CI}\" == \"true\" ]]; then\n echo \"Running in a Continuous Integration environment. Formatting is skipped.\"\n exit 0 \nfi\n\nif [[ \"${CONFIGURATION}\" == \"Release\" ]]; then\n echo \"Running during a release build. Formatting is skipped.\"\n exit 0\nfi\n\nif test -f \"$SWIFTFORMAT_CMD\" 2>&1\nthen\n \"$SWIFTFORMAT_CMD\" .\nelse\n echo \"warning: `swiftformat` command not found\"\nfi\n"; }; 308800C124EB0D3600E87ED3 /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; @@ -1497,7 +1499,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = ". \"${SRCROOT}/scripts/swiftlint.sh\"\n"; + shellScript = "SWIFT_PACKAGE_DIR=\"${BUILD_DIR%Build/*}SourcePackages/artifacts\"\nSWIFTLINT_CMD=$(ls \"$SWIFT_PACKAGE_DIR\"/swiftlintplugins/SwiftLintBinary/SwiftLintBinary.artifactbundle/swiftlint-*/bin/swiftlint | head -n 1)\n\nSTRICT_OPT=\n\nif [[ \"${CI}\" == \"true\" ]]; then\n echo \"Running in a Continuous Integration environment. Linting is strictly.\"\n STRICT_OPT=--strict\nfi\n\nif [[ \"${CONFIGURATION}\" == \"Release\" ]]; then\n echo \"Running during a release build. Linting is skipped.\"\n exit 0\nfi\n\nif test -f \"$SWIFTLINT_CMD\" 2>&1\nthen\n \"$SWIFTLINT_CMD\" lint --fix\n \"$SWIFTLINT_CMD\" lint $STRICT_OPT\nelse\n echo \"warning: `swiftlint` command not found\"\nfi\n"; }; 9A996C4726DDEAF100A4485D /* Remove SPM Duplicate Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -1661,7 +1663,7 @@ DCC441541E916382008A90C4 /* SSHKeyArmorImportTableViewController.swift in Sources */, 306D970E24091CDD006C0E2E /* SwitchTableViewCell.swift in Sources */, A2A61C201EEFABAD00CFE063 /* UtilsExtension.swift in Sources */, - DC8963C01E38EEB900828B09 /* SSHKeyURLImportTableViewController..swift in Sources */, + DC8963C01E38EEB900828B09 /* SSHKeyURLImportTableViewController.swift in Sources */, DC30F83829BED4E2001EB12B /* PasswordGeneratorUISwitch.swift in Sources */, 9AFC87F025B514AD008D6060 /* PasswordDecryptor.swift in Sources */, 3066AD6823EE0D6500F65535 /* PGPKeyImporter.swift in Sources */, @@ -2846,6 +2848,22 @@ minimumVersion = 0.99.2; }; }; + 30333B292CF922D9008A2EA2 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SimplyDanny/SwiftLintPlugins.git"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.57.1; + }; + }; + 307CA2322CF348260099F6DE /* XCRemoteSwiftPackageReference "SwiftFormat" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/nicklockwood/SwiftFormat"; + requirement = { + kind = upToNextMinorVersion; + minimumVersion = 0.55.2; + }; + }; 30A3000C26DA62F4002A734E /* XCRemoteSwiftPackageReference "Base32" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/mattrubin/Base32"; diff --git a/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8c99b560..d72048d3 100644 --- a/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "cfd99fa2de57765d4ea0531870a48806df8e3971c39177b2ec90b24da2c77efb", "pins" : [ { "identity" : "base32", @@ -53,6 +54,24 @@ "revision" : "8d59e4abba762d0f1e9aed161081f7b3fe21daa0" } }, + { + "identity" : "swiftformat", + "kind" : "remoteSourceControl", + "location" : "https://github.com/nicklockwood/SwiftFormat", + "state" : { + "revision" : "eb55d16245567e99d18ea871a7609befc8210c46", + "version" : "0.55.2" + } + }, + { + "identity" : "swiftlintplugins", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SimplyDanny/SwiftLintPlugins.git", + "state" : { + "revision" : "f9731bef175c3eea3a0ca960f1be78fcc2bc7853", + "version" : "0.57.1" + } + }, { "identity" : "swiftyuserdefaults", "kind" : "remoteSourceControl", @@ -72,5 +91,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/pass/AppDelegate.swift b/pass/AppDelegate.swift index 40965f1d..cb762742 100644 --- a/pass/AppDelegate.swift +++ b/pass/AppDelegate.swift @@ -20,7 +20,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - lazy var passcodeLockPresenter: PasscodeLockPresenter = .init(mainWindow: self.window) + lazy var passcodeLockPresenter = PasscodeLockPresenter(mainWindow: self.window) func application(_: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. diff --git a/pass/Controllers/AboutRepositoryTableViewController.swift b/pass/Controllers/AboutRepositoryTableViewController.swift index 2d60ed69..dd2b0386 100644 --- a/pass/Controllers/AboutRepositoryTableViewController.swift +++ b/pass/Controllers/AboutRepositoryTableViewController.swift @@ -13,7 +13,7 @@ class AboutRepositoryTableViewController: BasicStaticTableViewController { private static let VALUE_NOT_AVAILABLE = "ValueNotAvailable".localize() private var needRefresh = false - private var indicator: UIActivityIndicatorView = .init(style: .medium) + private var indicator = UIActivityIndicatorView(style: .medium) private let passwordStore = PasswordStore.shared diff --git a/pass/Controllers/BasicStaticTableViewController.swift b/pass/Controllers/BasicStaticTableViewController.swift index d77ae8fb..f6f2202e 100644 --- a/pass/Controllers/BasicStaticTableViewController.swift +++ b/pass/Controllers/BasicStaticTableViewController.swift @@ -38,11 +38,6 @@ class BasicStaticTableViewController: UITableViewController, MFMailComposeViewCo tableData[section].count } - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - override func tableView(_: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cellData = tableData[indexPath.section][indexPath.row] let cellDataStyle = cellData[CellDataKey.style] as? CellDataStyle diff --git a/pass/Controllers/KeyImporter.swift b/pass/Controllers/KeyImporter.swift index 8e8635c0..64d55552 100644 --- a/pass/Controllers/KeyImporter.swift +++ b/pass/Controllers/KeyImporter.swift @@ -24,13 +24,13 @@ protocol KeyImporter { extension KeyImporter { static var isCurrentKeySource: Bool { - Defaults.gitSSHKeySource == Self.keySource + Defaults.gitSSHKeySource == keySource } static var menuLabel: String { if isCurrentKeySource { - return "✓ \(Self.label)" + return "✓ \(label)" } - return Self.label + return label } } diff --git a/pass/Controllers/PGPKeyFIleImportTableViewController.swift b/pass/Controllers/PGPKeyFIleImportTableViewController.swift index 74d95aba..088ae4c7 100644 --- a/pass/Controllers/PGPKeyFIleImportTableViewController.swift +++ b/pass/Controllers/PGPKeyFIleImportTableViewController.swift @@ -16,6 +16,7 @@ class PGPKeyFileImportTableViewController: AutoCellHeightUITableViewController, private var privateKey: String? private enum KeyType { case none, `private`, `public` } + private var currentlyPicking = KeyType.none @IBAction diff --git a/pass/Controllers/PGPKeyImporter.swift b/pass/Controllers/PGPKeyImporter.swift index 4a3bd01a..65542778 100644 --- a/pass/Controllers/PGPKeyImporter.swift +++ b/pass/Controllers/PGPKeyImporter.swift @@ -14,7 +14,7 @@ protocol PGPKeyImporter: KeyImporter { extension PGPKeyImporter { static var isCurrentKeySource: Bool { - Defaults.pgpKeySource == Self.keySource + Defaults.pgpKeySource == keySource } func doAfterImport() {} diff --git a/pass/Controllers/PasswordDetailTableViewController.swift b/pass/Controllers/PasswordDetailTableViewController.swift index e6a65389..6f47fa83 100644 --- a/pass/Controllers/PasswordDetailTableViewController.swift +++ b/pass/Controllers/PasswordDetailTableViewController.swift @@ -30,7 +30,7 @@ class PasswordDetailTableViewController: UITableViewController, UIGestureRecogni // preserve path so it can be reloaded even if the passwordEntity is deleted during the update process private var passwordPath: String? - private lazy var editUIBarButtonItem: UIBarButtonItem = .init(barButtonSystemItem: .edit, target: self, action: #selector(pressEdit)) + private lazy var editUIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .edit, target: self, action: #selector(pressEdit)) private struct TableSection { var type: PasswordDetailTableViewControllerSectionType diff --git a/pass/Controllers/SSHKeyURLImportTableViewController..swift b/pass/Controllers/SSHKeyURLImportTableViewController.swift similarity index 100% rename from pass/Controllers/SSHKeyURLImportTableViewController..swift rename to pass/Controllers/SSHKeyURLImportTableViewController.swift diff --git a/pass/Views/PasswordDetailTitleTableViewCell.swift b/pass/Views/PasswordDetailTitleTableViewCell.swift index c45d4551..34679f77 100644 --- a/pass/Views/PasswordDetailTitleTableViewCell.swift +++ b/pass/Views/PasswordDetailTitleTableViewCell.swift @@ -14,14 +14,4 @@ class PasswordDetailTitleTableViewCell: UITableViewCell { @IBOutlet var passwordImageImageView: UIImageView! @IBOutlet var labelImageConstraint: NSLayoutConstraint! @IBOutlet var labelCellConstraint: NSLayoutConstraint! - - override func awakeFromNib() { - super.awakeFromNib() - } - - override func setSelected(_ selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - - // Configure the view for the selected state - } } diff --git a/passKit/Helpers/DefaultsKeys.swift b/passKit/Helpers/DefaultsKeys.swift index 1f31d3d4..7e2fdef8 100644 --- a/passKit/Helpers/DefaultsKeys.swift +++ b/passKit/Helpers/DefaultsKeys.swift @@ -35,39 +35,39 @@ extension SearchBarScope: DefaultsSerializable {} extension PasswordGenerator: DefaultsSerializable {} public extension DefaultsKeys { - var pgpKeySource: DefaultsKey { .init("pgpKeySource") } - var pgpPublicKeyURL: DefaultsKey { .init("pgpPublicKeyURL") } - var pgpPrivateKeyURL: DefaultsKey { .init("pgpPrivateKeyURL") } - var isYubiKeyEnabled: DefaultsKey { .init("isYubiKeyEnabled", defaultValue: false) } + var pgpKeySource: DefaultsKey { DefaultsKey("pgpKeySource") } + var pgpPublicKeyURL: DefaultsKey { DefaultsKey("pgpPublicKeyURL") } + var pgpPrivateKeyURL: DefaultsKey { DefaultsKey("pgpPrivateKeyURL") } + var isYubiKeyEnabled: DefaultsKey { DefaultsKey("isYubiKeyEnabled", defaultValue: false) } // Keep them for legacy reasons. - var pgpPublicKeyArmor: DefaultsKey { .init("pgpPublicKeyArmor") } - var pgpPrivateKeyArmor: DefaultsKey { .init("pgpPrivateKeyArmor") } - var gitSSHPrivateKeyArmor: DefaultsKey { .init("gitSSHPrivateKeyArmor") } - var passcodeKey: DefaultsKey { .init("passcodeKey") } + var pgpPublicKeyArmor: DefaultsKey { DefaultsKey("pgpPublicKeyArmor") } + var pgpPrivateKeyArmor: DefaultsKey { DefaultsKey("pgpPrivateKeyArmor") } + var gitSSHPrivateKeyArmor: DefaultsKey { DefaultsKey("gitSSHPrivateKeyArmor") } + var passcodeKey: DefaultsKey { DefaultsKey("passcodeKey") } - var gitURL: DefaultsKey { .init("gitURL", defaultValue: URL(string: "https://")!) } - var gitAuthenticationMethod: DefaultsKey { .init("gitAuthenticationMethod", defaultValue: GitAuthenticationMethod.password) } - var gitUsername: DefaultsKey { .init("gitUsername", defaultValue: "git") } - var gitBranchName: DefaultsKey { .init("gitBranchName", defaultValue: "master") } - var gitSSHPrivateKeyURL: DefaultsKey { .init("gitSSHPrivateKeyURL") } - var gitSSHKeySource: DefaultsKey { .init("gitSSHKeySource") } - var gitSignatureName: DefaultsKey { .init("gitSignatureName") } - var gitSignatureEmail: DefaultsKey { .init("gitSignatureEmail") } + var gitURL: DefaultsKey { DefaultsKey("gitURL", defaultValue: URL(string: "https://")!) } + var gitAuthenticationMethod: DefaultsKey { DefaultsKey("gitAuthenticationMethod", defaultValue: GitAuthenticationMethod.password) } + var gitUsername: DefaultsKey { DefaultsKey("gitUsername", defaultValue: "git") } + var gitBranchName: DefaultsKey { DefaultsKey("gitBranchName", defaultValue: "master") } + var gitSSHPrivateKeyURL: DefaultsKey { DefaultsKey("gitSSHPrivateKeyURL") } + var gitSSHKeySource: DefaultsKey { DefaultsKey("gitSSHKeySource") } + var gitSignatureName: DefaultsKey { DefaultsKey("gitSignatureName") } + var gitSignatureEmail: DefaultsKey { DefaultsKey("gitSignatureEmail") } - var lastSyncedTime: DefaultsKey { .init("lastSyncedTime") } + var lastSyncedTime: DefaultsKey { DefaultsKey("lastSyncedTime") } - var isHideUnknownOn: DefaultsKey { .init("isHideUnknownOn", defaultValue: false) } - var isHideOTPOn: DefaultsKey { .init("isHideOTPOn", defaultValue: false) } - var isRememberPGPPassphraseOn: DefaultsKey { .init("isRememberPGPPassphraseOn", defaultValue: false) } - var isRememberGitCredentialPassphraseOn: DefaultsKey { .init("isRememberGitCredentialPassphraseOn", defaultValue: false) } - var isEnableGPGIDOn: DefaultsKey { .init("isEnableGPGIDOn", defaultValue: false) } - var isShowFolderOn: DefaultsKey { .init("isShowFolderOn", defaultValue: true) } - var isHidePasswordImagesOn: DefaultsKey { .init("isHidePasswordImagesOn", defaultValue: false) } - var searchDefault: DefaultsKey { .init("searchDefault", defaultValue: .all) } - var passwordGenerator: DefaultsKey { .init("passwordGenerator", defaultValue: PasswordGenerator()) } + var isHideUnknownOn: DefaultsKey { DefaultsKey("isHideUnknownOn", defaultValue: false) } + var isHideOTPOn: DefaultsKey { DefaultsKey("isHideOTPOn", defaultValue: false) } + var isRememberPGPPassphraseOn: DefaultsKey { DefaultsKey("isRememberPGPPassphraseOn", defaultValue: false) } + var isRememberGitCredentialPassphraseOn: DefaultsKey { DefaultsKey("isRememberGitCredentialPassphraseOn", defaultValue: false) } + var isEnableGPGIDOn: DefaultsKey { DefaultsKey("isEnableGPGIDOn", defaultValue: false) } + var isShowFolderOn: DefaultsKey { DefaultsKey("isShowFolderOn", defaultValue: true) } + var isHidePasswordImagesOn: DefaultsKey { DefaultsKey("isHidePasswordImagesOn", defaultValue: false) } + var searchDefault: DefaultsKey { DefaultsKey("searchDefault", defaultValue: .all) } + var passwordGenerator: DefaultsKey { DefaultsKey("passwordGenerator", defaultValue: PasswordGenerator()) } - var encryptInArmored: DefaultsKey { .init("encryptInArmored", defaultValue: false) } + var encryptInArmored: DefaultsKey { DefaultsKey("encryptInArmored", defaultValue: false) } - var autoCopyOTP: DefaultsKey { .init("autoCopyOTP", defaultValue: false) } + var autoCopyOTP: DefaultsKey { DefaultsKey("autoCopyOTP", defaultValue: false) } } diff --git a/passKit/Parser/Parser.swift b/passKit/Parser/Parser.swift index 1dab852a..e521bf2c 100644 --- a/passKit/Parser/Parser.swift +++ b/passKit/Parser/Parser.swift @@ -48,6 +48,7 @@ class Parser { guard lineNumber < purgedAdditionalLines.count else { return result } + // swiftlint:disable:next unused_enumerated let numberInitialBlanks = purgedAdditionalLines[lineNumber].enumerated().first { $1 != Character(Constants.BLANK) }?.0 ?? purgedAdditionalLines[lineNumber].count diff --git a/passKitTests/Crypto/CryptoFrameworkTest.swift b/passKitTests/Crypto/CryptoFrameworkTest.swift index 8078c542..dc8fd445 100644 --- a/passKitTests/Crypto/CryptoFrameworkTest.swift +++ b/passKitTests/Crypto/CryptoFrameworkTest.swift @@ -8,11 +8,12 @@ import XCTest +@testable import Gopenpgp + // swiftformat:disable:next sortedImports @testable import passKit -@testable import Gopenpgp -class CryptoFrameworkTest: XCTestCase { +final class CryptoFrameworkTest: XCTestCase { private typealias MessageConverter = (CryptoPGPMessage, NSErrorPointer) -> CryptoPGPMessage? private let testText = "Hello World!" diff --git a/passKitTests/Crypto/PGPAgentTest.swift b/passKitTests/Crypto/PGPAgentTest.swift index 1acd37ed..8acb2bee 100644 --- a/passKitTests/Crypto/PGPAgentTest.swift +++ b/passKitTests/Crypto/PGPAgentTest.swift @@ -11,11 +11,11 @@ import XCTest @testable import passKit -class PGPAgentTest: XCTestCase { +final class PGPAgentTest: XCTestCase { private var keychain: KeyStore! private var pgpAgent: PGPAgent! - private let testData = "Hello World!".data(using: .utf8)! + private let testData = Data("Hello World!".utf8) override func setUp() { super.setUp() diff --git a/passKitTests/Extensions/Array+SlicesTest.swift b/passKitTests/Extensions/Array+SlicesTest.swift index 9c85c1f5..1162c2bd 100644 --- a/passKitTests/Extensions/Array+SlicesTest.swift +++ b/passKitTests/Extensions/Array+SlicesTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class ArraySlicesTest: XCTestCase { +final class ArraySlicesTest: XCTestCase { func testZeroCount() { XCTAssertEqual([1, 2, 3].slices(count: 0), []) } diff --git a/passKitTests/Extensions/String+UtilitiesTest.swift b/passKitTests/Extensions/String+UtilitiesTest.swift index ad2e9e3b..40350c42 100644 --- a/passKitTests/Extensions/String+UtilitiesTest.swift +++ b/passKitTests/Extensions/String+UtilitiesTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class StringUtilitiesTest: XCTestCase { +final class StringUtilitiesTest: XCTestCase { func testTrimmed() { [ (" ", ""), diff --git a/passKitTests/Helpers/KeyFileManagerTest.swift b/passKitTests/Helpers/KeyFileManagerTest.swift index 3e6a61fb..56acf4b7 100644 --- a/passKitTests/Helpers/KeyFileManagerTest.swift +++ b/passKitTests/Helpers/KeyFileManagerTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class KeyFileManagerTest: XCTestCase { +final class KeyFileManagerTest: XCTestCase { private static let filePath = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("test.txt").path private static let keyFileManager = KeyFileManager(keyType: PGPKey.PUBLIC, keyPath: filePath) { _, _ in } diff --git a/passKitTests/Models/GitCredentialTest.swift b/passKitTests/Models/GitCredentialTest.swift index bfc47480..9a0d3e84 100644 --- a/passKitTests/Models/GitCredentialTest.swift +++ b/passKitTests/Models/GitCredentialTest.swift @@ -12,7 +12,7 @@ import ObjectiveGit import SwiftyUserDefaults @testable import passKit -class GitCredentialTest: XCTestCase { +final class GitCredentialTest: XCTestCase { private static let defaultsID = "SharedDefaultsForGitCredentialTest" private let keyStore = DictBasedKeychain() diff --git a/passKitTests/Models/PasswordStoreTest.swift b/passKitTests/Models/PasswordStoreTest.swift index 5ea205d2..78ffa782 100644 --- a/passKitTests/Models/PasswordStoreTest.swift +++ b/passKitTests/Models/PasswordStoreTest.swift @@ -12,7 +12,7 @@ import XCTest @testable import passKit -class PasswordStoreTest: XCTestCase { +final class PasswordStoreTest: XCTestCase { private let remoteRepoURL = URL(string: "https://github.com/mssun/passforios-password-store.git")! func testCloneAndDecryptMultiKeys() throws { diff --git a/passKitTests/Models/PasswordTableEntryTest.swift b/passKitTests/Models/PasswordTableEntryTest.swift index a7da5073..f84f18c9 100644 --- a/passKitTests/Models/PasswordTableEntryTest.swift +++ b/passKitTests/Models/PasswordTableEntryTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class PasswordTableEntryTest: XCTestCase { +final class PasswordTableEntryTest: XCTestCase { func testExample() { let nameWithCategoryList = [ "github", diff --git a/passKitTests/Models/PasswordTest.swift b/passKitTests/Models/PasswordTest.swift index 6ee05a03..7b73b720 100644 --- a/passKitTests/Models/PasswordTest.swift +++ b/passKitTests/Models/PasswordTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class PasswordTest: XCTestCase { +final class PasswordTest: XCTestCase { func testURL() { let password = getPasswordObjectWith(content: "") diff --git a/passKitTests/Parser/AdditionFieldTest.swift b/passKitTests/Parser/AdditionFieldTest.swift index 42d408ce..34ae7912 100644 --- a/passKitTests/Parser/AdditionFieldTest.swift +++ b/passKitTests/Parser/AdditionFieldTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class AdditionFieldTest: XCTestCase { +final class AdditionFieldTest: XCTestCase { func testAdditionField() { let field1 = AdditionField(title: "key", content: "value") let field2 = AdditionField(title: "no content") diff --git a/passKitTests/Parser/ConstantsTest.swift b/passKitTests/Parser/ConstantsTest.swift index b1b3d3fb..ceca88d0 100644 --- a/passKitTests/Parser/ConstantsTest.swift +++ b/passKitTests/Parser/ConstantsTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class ConstantsTest: XCTestCase { +final class ConstantsTest: XCTestCase { func testIsOtpRelated() { XCTAssert(Constants.isOtpRelated(line: "otpauth://something")) XCTAssert(Constants.isOtpRelated(line: "otp_algorithm: algorithm")) diff --git a/passKitTests/Parser/OTPTypeTest.swift b/passKitTests/Parser/OTPTypeTest.swift index 8c69bba4..9d785b69 100644 --- a/passKitTests/Parser/OTPTypeTest.swift +++ b/passKitTests/Parser/OTPTypeTest.swift @@ -11,9 +11,9 @@ import XCTest @testable import passKit -class OTPTypeTest: XCTestCase { +final class OTPTypeTest: XCTestCase { func testInitFromToken() { - let secret = "secret".data(using: .utf8)! + let secret = Data("secret".utf8) let totpGenerator = Generator(factor: .timer(period: 30.0), secret: secret, algorithm: .sha1, digits: 6)! let totpToken = Token(name: "", issuer: "", generator: totpGenerator) diff --git a/passKitTests/Parser/ParserTest.swift b/passKitTests/Parser/ParserTest.swift index 1e4f867a..24a797e4 100644 --- a/passKitTests/Parser/ParserTest.swift +++ b/passKitTests/Parser/ParserTest.swift @@ -9,7 +9,7 @@ import XCTest @testable import passKit -class ParserTest: XCTestCase { +final class ParserTest: XCTestCase { func testInit() { [ ("", "", "", []), diff --git a/passKitTests/Parser/TokenBuilderTest.swift b/passKitTests/Parser/TokenBuilderTest.swift index 58777042..726d1565 100644 --- a/passKitTests/Parser/TokenBuilderTest.swift +++ b/passKitTests/Parser/TokenBuilderTest.swift @@ -12,7 +12,7 @@ import XCTest @testable import passKit -class TokenBuilderTest: XCTestCase { +final class TokenBuilderTest: XCTestCase { private let SECRET = "secret" private let DIGITS = Constants.DEFAULT_DIGITS private let TIMER = Generator.Factor.timer(period: Constants.DEFAULT_PERIOD) diff --git a/passKitTests/Passwords/PasswordGeneratorFlavorTest.swift b/passKitTests/Passwords/PasswordGeneratorFlavorTest.swift index f2f7f289..78acc467 100644 --- a/passKitTests/Passwords/PasswordGeneratorFlavorTest.swift +++ b/passKitTests/Passwords/PasswordGeneratorFlavorTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class PasswordGeneratorFlavorTest: XCTestCase { +final class PasswordGeneratorFlavorTest: XCTestCase { func testLengthLimits() { // Ensure properly chosen length limits. So this check no longer needs to be performed in the code. PasswordGeneratorFlavor.allCases.map(\.lengthLimits).forEach { diff --git a/passKitTests/Passwords/PasswordGeneratorTest.swift b/passKitTests/Passwords/PasswordGeneratorTest.swift index 8b4f68e2..08cefbeb 100644 --- a/passKitTests/Passwords/PasswordGeneratorTest.swift +++ b/passKitTests/Passwords/PasswordGeneratorTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import passKit -class PasswordGeneratorTest: XCTestCase { +final class PasswordGeneratorTest: XCTestCase { func testLimitedLength() { [ PasswordGenerator(length: 15), diff --git a/passKitTests/Testbase/TestPGPKeys.swift b/passKitTests/Testbase/TestPGPKeys.swift index d7951a79..da2177c2 100644 --- a/passKitTests/Testbase/TestPGPKeys.swift +++ b/passKitTests/Testbase/TestPGPKeys.swift @@ -11,7 +11,7 @@ import XCTest @testable import passKit struct PGPTestSet { - fileprivate static var ALL_TEST_SETS: [String: PGPTestSet] = [:] // swiftlint:disable:this strict_fileprivate + fileprivate static var ALL_TEST_SETS: [String: Self] = [:] // swiftlint:disable:this strict_fileprivate let publicKey: String let privateKey: String diff --git a/passTests/Models/QRKeyScannerTest.swift b/passTests/Models/QRKeyScannerTest.swift index 21153c7c..3f9d3b22 100644 --- a/passTests/Models/QRKeyScannerTest.swift +++ b/passTests/Models/QRKeyScannerTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import Pass -class QRKeyScannerTest: XCTestCase { +final class QRKeyScannerTest: XCTestCase { private let header = "-----BEGIN PGP PUBLIC KEY BLOCK-----" private let body = "key body" private let footer = "-----END PGP PUBLIC KEY BLOCK-----" diff --git a/passTests/Models/ScannableKeyTypeTest.swift b/passTests/Models/ScannableKeyTypeTest.swift index e53c8a60..b390f71b 100644 --- a/passTests/Models/ScannableKeyTypeTest.swift +++ b/passTests/Models/ScannableKeyTypeTest.swift @@ -10,7 +10,7 @@ import XCTest @testable import Pass -class ScannableKeyTypeTest: XCTestCase { +final class ScannableKeyTypeTest: XCTestCase { func testPGPPublicKey() { let type = ScannableKeyType.pgpPublic diff --git a/scripts/swiftformat.sh b/scripts/swiftformat.sh deleted file mode 100755 index 01bb9700..00000000 --- a/scripts/swiftformat.sh +++ /dev/null @@ -1,25 +0,0 @@ -export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}" -SWIFTFORMAT_VERSION="0.51.*" - -if [[ "${CI}" == "true" ]]; then - echo "Running in a Continuous Integration environment. Formatting is skipped." - exit 0 -fi - -if [[ "${CONFIGURATION}" == "Release" ]]; then - echo "Running during a release build. Formatting is skipped." - exit 0 -fi - -if which swiftformat > /dev/null; then - if [[ "$(swiftformat --version)" == $SWIFTFORMAT_VERSION ]]; then - swiftformat . - else - echo "Failure: SwiftFormat $SWIFTFORMAT_VERSION is required. Install it or update the build script to use a newer version." - exit 1 - fi -else - echo "Failure: SwiftFormat not installed. Get it via 'brew install swiftformat'." - exit 2 -fi - diff --git a/scripts/swiftlint.sh b/scripts/swiftlint.sh deleted file mode 100755 index a5c83a53..00000000 --- a/scripts/swiftlint.sh +++ /dev/null @@ -1,26 +0,0 @@ -export PATH="/opt/homebrew/bin:/opt/homebrew/sbin${PATH+:$PATH}" - -SWIFTLINT_VERSION="0.52.*" - -if [[ "${CI}" == "true" ]]; then - echo "Running in a Continuous Integration environment. Linting is skipped." - exit 0 -fi - -if [[ "${CONFIGURATION}" == "Release" ]]; then - echo "Running during a release build. Linting is skipped." - exit 0 -fi - -if which swiftlint > /dev/null; then - if [[ "$(swiftlint version)" == $SWIFTLINT_VERSION ]]; then - swiftlint --strict - else - echo "Failure: SwiftLint $SWIFTLINT_VERSION is required. Install it or update the build script to use a newer version." - exit 1 - fi -else - echo "Failure: SwiftLint not installed. Get it via 'brew install swiftlint'." - exit 2 -fi - From 7e2930cc853537f1d132b5b6a753de56aedaa800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Thu, 28 Nov 2024 22:44:48 +0100 Subject: [PATCH 06/37] Build on latest macOS release Homebrew supports officially --- .github/workflows/deploying.yml | 2 +- .github/workflows/testing.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploying.yml b/.github/workflows/deploying.yml index 77701c55..82424001 100644 --- a/.github/workflows/deploying.yml +++ b/.github/workflows/deploying.yml @@ -8,7 +8,7 @@ on: jobs: build: - runs-on: macos-12 + runs-on: macos-13 strategy: matrix: channel: ['beta', 'release'] diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index a25e0bed..5bc56f2d 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: testing: - runs-on: macos-12 + runs-on: macos-13 steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 From ed724871d6256dfbd894b8e1aacff46541d283d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Thu, 28 Nov 2024 22:48:15 +0100 Subject: [PATCH 07/37] Stop installing packages that are already there --- .github/workflows/deploying.yml | 7 ++++--- .github/workflows/testing.yml | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/deploying.yml b/.github/workflows/deploying.yml index 82424001..e9a4c625 100644 --- a/.github/workflows/deploying.yml +++ b/.github/workflows/deploying.yml @@ -18,11 +18,12 @@ jobs: with: ruby-version: '2.7' bundler-cache: true + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: '1.23.x' - name: Installing packages run: | - brew update - brew install carthage - brew install go || brew link --overwrite go gem install bundler - uses: actions/cache@v3 id: carthage-cache diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 5bc56f2d..15bcc64e 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -11,11 +11,12 @@ jobs: with: ruby-version: '2.7' bundler-cache: true + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: '1.23.x' - name: Installing packages run: | - brew update - brew install carthage - brew install go || brew link --overwrite go gem install bundler - uses: actions/cache@v3 id: carthage-cache From 025ef069cccead2d8da951ed5e95264dc8b0c801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Thu, 28 Nov 2024 22:57:04 +0100 Subject: [PATCH 08/37] Update Ruby and Gemfile dependencies --- .github/workflows/deploying.yml | 2 +- .github/workflows/testing.yml | 2 +- Gemfile.lock | 149 +++++++++++++++++--------------- 3 files changed, 79 insertions(+), 74 deletions(-) diff --git a/.github/workflows/deploying.yml b/.github/workflows/deploying.yml index e9a4c625..ef8fa766 100644 --- a/.github/workflows/deploying.yml +++ b/.github/workflows/deploying.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: - ruby-version: '2.7' + ruby-version: '3.3' bundler-cache: true - name: Setup Go uses: actions/setup-go@v5 diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 15bcc64e..c1142109 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -9,7 +9,7 @@ jobs: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 with: - ruby-version: '2.7' + ruby-version: '3.3' bundler-cache: true - name: Setup Go uses: actions/setup-go@v5 diff --git a/Gemfile.lock b/Gemfile.lock index 7c3e6e9c..a679b119 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,43 +1,45 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - addressable (2.8.1) - public_suffix (>= 2.0.2, < 6.0) - artifactory (3.0.15) + addressable (2.8.7) + public_suffix (>= 2.0.2, < 7.0) + artifactory (3.0.17) atomos (0.1.3) - aws-eventstream (1.2.0) - aws-partitions (1.723.0) - aws-sdk-core (3.170.0) - aws-eventstream (~> 1, >= 1.0.2) - aws-partitions (~> 1, >= 1.651.0) - aws-sigv4 (~> 1.5) + aws-eventstream (1.3.0) + aws-partitions (1.1014.0) + aws-sdk-core (3.214.0) + aws-eventstream (~> 1, >= 1.3.0) + aws-partitions (~> 1, >= 1.992.0) + aws-sigv4 (~> 1.9) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.63.0) - aws-sdk-core (~> 3, >= 3.165.0) - aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.119.1) - aws-sdk-core (~> 3, >= 3.165.0) + aws-sdk-kms (1.96.0) + aws-sdk-core (~> 3, >= 3.210.0) + aws-sigv4 (~> 1.5) + aws-sdk-s3 (1.174.0) + aws-sdk-core (~> 3, >= 3.210.0) aws-sdk-kms (~> 1) - aws-sigv4 (~> 1.4) - aws-sigv4 (1.5.2) + aws-sigv4 (~> 1.5) + aws-sigv4 (1.10.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) + base64 (0.2.0) claide (1.1.0) colored (1.2) colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) declarative (0.0.20) - digest-crc (0.6.4) + digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) + domain_name (0.6.20240107) dotenv (2.8.1) emoji_regex (3.2.3) - excon (0.99.0) - faraday (1.10.3) + excon (0.112.0) + faraday (1.10.4) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -58,22 +60,22 @@ GEM faraday-httpclient (1.0.1) faraday-multipart (1.0.4) multipart-post (~> 2) - faraday-net_http (1.0.1) + faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) - faraday_middleware (1.2.0) + faraday_middleware (1.2.1) faraday (~> 1.0) - fastimage (2.2.6) - fastlane (2.212.1) + fastimage (2.3.1) + fastlane (2.225.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) babosa (>= 1.0.3, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) - colored + colored (~> 1.2) commander (~> 4.6) dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 4.0) @@ -82,33 +84,38 @@ GEM faraday-cookie_jar (~> 0.0.6) faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) + fastlane-sirp (>= 1.0.0) gh_inspector (>= 1.1.2, < 2.0.0) google-apis-androidpublisher_v3 (~> 0.3) google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-env (>= 1.6.0, < 2.0.0) google-cloud-storage (~> 1.31) highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) - multipart-post (~> 2.0.0) + multipart-post (>= 2.0.0, < 3.0.0) naturally (~> 2.2) - optparse (~> 0.1.1) + optparse (>= 0.1.1, < 1.0.0) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) - security (= 0.1.3) + security (= 0.1.5) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) + xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) + fastlane-sirp (1.0.0) + sysrandom (~> 1.0) gh_inspector (1.1.3) - google-apis-androidpublisher_v3 (0.35.0) + google-apis-androidpublisher_v3 (0.54.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-core (0.11.0) + google-apis-core (0.11.3) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -116,58 +123,59 @@ GEM representable (~> 3.0) retriable (>= 2.0, < 4.a) rexml - webrick google-apis-iamcredentials_v1 (0.17.0) google-apis-core (>= 0.11.0, < 2.a) google-apis-playcustomapp_v1 (0.13.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-storage_v1 (0.19.0) - google-apis-core (>= 0.9.0, < 2.a) - google-cloud-core (1.6.0) - google-cloud-env (~> 1.0) + google-apis-storage_v1 (0.31.0) + google-apis-core (>= 0.11.0, < 2.a) + google-cloud-core (1.7.1) + google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.3.1) - google-cloud-storage (1.44.0) + google-cloud-errors (1.4.0) + google-cloud-storage (1.47.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.19.0) + google-apis-storage_v1 (~> 0.31.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.3.0) + googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) http-accept (1.7.0) - http-cookie (1.0.5) + http-cookie (1.0.7) domain_name (~> 0.5) httpclient (2.8.3) jmespath (1.6.2) - json (2.6.3) - jwt (2.7.0) - memoist (0.16.2) - mime-types (3.4.1) + json (2.8.2) + jwt (2.9.3) + base64 + logger (1.6.1) + mime-types (3.6.0) + logger mime-types-data (~> 3.2015) - mime-types-data (3.2022.0105) - mini_magick (4.12.0) - mini_mime (1.1.2) + mime-types-data (3.2024.1105) + mini_magick (4.13.2) + mini_mime (1.1.5) multi_json (1.15.0) - multipart-post (2.0.0) - nanaimo (0.3.0) + multipart-post (2.4.1) + nanaimo (0.4.0) naturally (2.2.1) netrc (0.11.0) - optparse (0.1.1) + nkf (0.2.0) + optparse (0.6.0) os (1.1.4) - plist (3.7.0) - public_suffix (5.0.1) - rake (13.0.6) + plist (3.7.1) + public_suffix (6.0.1) + rake (13.2.1) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) @@ -178,12 +186,12 @@ GEM mime-types (>= 1.16, < 4.0) netrc (~> 0.8) retriable (3.1.2) - rexml (3.2.5) + rexml (3.3.9) rouge (2.0.7) ruby2_keywords (0.0.5) rubyzip (2.3.2) - security (0.1.3) - signet (0.17.0) + security (0.1.5) + signet (0.19.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) @@ -191,28 +199,25 @@ GEM simctl (1.6.10) CFPropertyList naturally + sysrandom (1.0.5) terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) trailblazer-option (0.1.2) tty-cursor (0.7.1) - tty-screen (0.8.1) + tty-screen (0.8.2) tty-spinner (0.9.3) tty-cursor (~> 0.7) uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.8.2) - unicode-display_width (1.8.0) - webrick (1.8.1) + unicode-display_width (2.6.0) word_wrap (1.0.0) - xcodeproj (1.22.0) + xcodeproj (1.27.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) colored2 (~> 3.1) - nanaimo (~> 0.3.0) - rexml (~> 3.2.4) + nanaimo (~> 0.4.0) + rexml (>= 3.3.6, < 4.0) xcpretty (0.3.0) rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) From e297ef9086dcd07b651182466885cbe0c6561d40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Thu, 28 Nov 2024 23:20:36 +0100 Subject: [PATCH 09/37] Consume SVProgressHUD via SPM getting rid of Carthage --- .github/workflows/deploying.yml | 11 ------- .github/workflows/testing.yml | 11 ------- .gitignore | 6 ---- .swiftformat | 1 - .swiftlint.yml | 1 - Cartfile | 1 - Cartfile.resolved | 1 - README.md | 9 +++--- pass.xcodeproj/project.pbxproj | 31 ++++++++++++++++--- .../xcshareddata/swiftpm/Package.resolved | 11 ++++++- 10 files changed, 40 insertions(+), 43 deletions(-) delete mode 100644 Cartfile delete mode 100644 Cartfile.resolved diff --git a/.github/workflows/deploying.yml b/.github/workflows/deploying.yml index ef8fa766..b8a5076a 100644 --- a/.github/workflows/deploying.yml +++ b/.github/workflows/deploying.yml @@ -25,13 +25,6 @@ jobs: - name: Installing packages run: | gem install bundler - - uses: actions/cache@v3 - id: carthage-cache - with: - path: Carthage - key: ${{ runner.os }}-carthage-${{ secrets.CACHE_VERSION }}-${{ hashFiles('**/Cartfile.resolved') }} - restore-keys: | - ${{ runner.os }}-carthage-${{ secrets.CACHE_VERSION }}- - uses: actions/cache@v3 id: gopenpgp-cache with: @@ -43,10 +36,6 @@ jobs: run: | bundle config path vendor/bundle bundle install --jobs 4 --retry 3 - - name: Carthage - if: ${{ steps.carthage-cache.outputs.cache-hit == false }} - run: | - carthage bootstrap --no-use-binaries --cache-builds --use-xcframeworks - name: GopenPGP if: ${{ steps.gopenpgp-cache.outputs.cache-hit == false }} run: | diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index c1142109..db0310cb 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -18,13 +18,6 @@ jobs: - name: Installing packages run: | gem install bundler - - uses: actions/cache@v3 - id: carthage-cache - with: - path: Carthage - key: ${{ runner.os }}-carthage-${{ secrets.CACHE_VERSION }}-${{ hashFiles('**/Cartfile.resolved') }} - restore-keys: | - ${{ runner.os }}-carthage-${{ secrets.CACHE_VERSION }}- - uses: actions/cache@v3 id: gopenpgp-cache with: @@ -36,10 +29,6 @@ jobs: run: | bundle config path vendor/bundle bundle install --jobs 4 --retry 3 - - name: Carthage - if: ${{ steps.carthage-cache.outputs.cache-hit == false }} - run: | - carthage bootstrap --no-use-binaries --cache-builds --use-xcframeworks - name: GopenPGP if: ${{ steps.gopenpgp-cache.outputs.cache-hit == false }} run: ./scripts/gopenpgp_build.sh diff --git a/.gitignore b/.gitignore index 9b583233..19942320 100644 --- a/.gitignore +++ b/.gitignore @@ -46,12 +46,6 @@ playground.xcworkspace Pods/ Podfile.lock -# Carthage -# -# Add this line if you want to avoid checking in source code from Carthage dependencies. -Carthage/Checkouts -Carthage/Build - # Go Mobile Build results and dependency sources go/ diff --git a/.swiftformat b/.swiftformat index 6bb5f80c..ca7d580e 100644 --- a/.swiftformat +++ b/.swiftformat @@ -3,7 +3,6 @@ ## Excluded folders --exclude \ - Carthage, \ go, \ Pods, \ vendor diff --git a/.swiftlint.yml b/.swiftlint.yml index 5c9606b4..74aa64c8 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -3,7 +3,6 @@ ## Folders to exclude from linting excluded: - - Carthage - go - Pods - vendor diff --git a/Cartfile b/Cartfile deleted file mode 100644 index 93393ac2..00000000 --- a/Cartfile +++ /dev/null @@ -1 +0,0 @@ -github "SVProgressHUD/SVProgressHUD" "master" diff --git a/Cartfile.resolved b/Cartfile.resolved deleted file mode 100644 index 46eb4064..00000000 --- a/Cartfile.resolved +++ /dev/null @@ -1 +0,0 @@ -github "SVProgressHUD/SVProgressHUD" "de1d4dba816a19454329031156b8788692bcfa2c" diff --git a/README.md b/README.md index e4b34f29..3161a219 100644 --- a/README.md +++ b/README.md @@ -47,11 +47,10 @@ For more, please read the [wiki page](https://github.com/mssun/passforios/wiki). ## Building Pass for iOS -1. Install Carthage and Go: `brew install carthage go`. -2. Install dependencies via Carthage. Therefore, execute `carthage bootstrap --platform iOS --use-xcframeworks` in the root directory of the project. -3. Run `./scripts/gopenpgp_build.sh` to build GopenPGP. -5. Open the `pass.xcodeproj` file in Xcode. -6. Build & Run. +1. Install Go: `brew install go`. +1. Run `./scripts/gopenpgp_build.sh` to build GopenPGP. +1. Open the `pass.xcodeproj` file in Xcode. +1. Build & Run. ## License diff --git a/pass.xcodeproj/project.pbxproj b/pass.xcodeproj/project.pbxproj index 69794314..cf137b0f 100644 --- a/pass.xcodeproj/project.pbxproj +++ b/pass.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ 3032328E22CBD4CD009EBD9C /* CryptographicKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3032328D22CBD4CD009EBD9C /* CryptographicKeys.swift */; }; 3032DA5426DAF4C200A7728C /* ObjectivePGP in Frameworks */ = {isa = PBXBuildFile; productRef = 3032DA5326DAF4C200A7728C /* ObjectivePGP */; }; 3032DA5626DAF4E500A7728C /* ObjectivePGP in Frameworks */ = {isa = PBXBuildFile; productRef = 3032DA5526DAF4E500A7728C /* ObjectivePGP */; }; + 30333B2B2CF924DC008A2EA2 /* SVProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 30333B2A2CF924DC008A2EA2 /* SVProgressHUD */; }; + 30333B2D2CF9252E008A2EA2 /* SVProgressHUD in Frameworks */ = {isa = PBXBuildFile; productRef = 30333B2C2CF9252E008A2EA2 /* SVProgressHUD */; }; 30650E7123F82AF8005CCD5E /* SSHKeyFileImportTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30650E7023F82AF8005CCD5E /* SSHKeyFileImportTableViewController.swift */; }; 30650E7323F847FC005CCD5E /* KeyImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30650E7223F847FC005CCD5E /* KeyImporter.swift */; }; 306623332406F1A8000E2AD6 /* PasswordGeneratorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 306623322406F1A7000E2AD6 /* PasswordGeneratorTest.swift */; }; @@ -141,8 +143,6 @@ 9A5D070225A5769A00FA59D4 /* PasswordTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A8F9EE1259EDD520027CE15 /* PasswordTableViewCell.swift */; }; 9A652414244BB33300DA0A41 /* UIAlertActionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A652413244BB33300DA0A41 /* UIAlertActionExtension.swift */; }; 9A74D2E0277D2F8C00F7BC44 /* UIAlertControllerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A74D2DF277D2F8C00F7BC44 /* UIAlertControllerExtension.swift */; }; - 9A78A7CC277BECE80093222D /* SVProgressHUD.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30F6C1B327664C7200BE5AB2 /* SVProgressHUD.xcframework */; }; - 9A78A7CD277BECE80093222D /* SVProgressHUD.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 30F6C1B327664C7200BE5AB2 /* SVProgressHUD.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9A8F9EBD259EA4C50027CE15 /* PasswordsTableDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A8F9EBC259EA4C50027CE15 /* PasswordsTableDataSource.swift */; }; 9A8F9ECC259ECB410027CE15 /* PasswordSelectionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A8F9ECB259ECB410027CE15 /* PasswordSelectionDelegate.swift */; }; 9A8F9F4025A1A91F0027CE15 /* CredentialProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A8F9F3F25A1A91F0027CE15 /* CredentialProvider.swift */; }; @@ -309,7 +309,6 @@ dstSubfolderSpec = 10; files = ( 9A996C5926DEB0D200A4485D /* passKit.framework in Embed Frameworks */, - 9A78A7CD277BECE80093222D /* SVProgressHUD.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -549,6 +548,7 @@ 30A3001426DA6692002A734E /* KeychainAccess in Frameworks */, 9A996C5726DDF65900A4485D /* Base32 in Frameworks */, 9A1D1CE526E5D1CE0052028E /* OneTimePassword in Frameworks */, + 30333B2D2CF9252E008A2EA2 /* SVProgressHUD in Frameworks */, 30A3001626DA6697002A734E /* SwiftyUserDefaults in Frameworks */, 3032DA5626DAF4E500A7728C /* ObjectivePGP in Frameworks */, 9A2C7D862783FF9600BD9AF3 /* YubiKit in Frameworks */, @@ -591,10 +591,10 @@ files = ( 5F9D7B0D27AF6F7500A8AB22 /* CryptoTokenKit.framework in Frameworks */, 3010CB6026DA4F87008964D2 /* SwiftyUserDefaults in Frameworks */, + 30333B2B2CF924DC008A2EA2 /* SVProgressHUD in Frameworks */, 3010CB6326DA4FE9008964D2 /* FavIcon in Frameworks */, 9A1F47FA26E5CF4B000C0E01 /* OneTimePassword in Frameworks */, 9A996C5326DDF61F00A4485D /* Base32 in Frameworks */, - 9A78A7CC277BECE80093222D /* SVProgressHUD.xcframework in Frameworks */, 3032DA5426DAF4C200A7728C /* ObjectivePGP in Frameworks */, 9A2C7D822782CB2F00BD9AF3 /* YubiKit in Frameworks */, 3010CB6626DA500F008964D2 /* KeychainAccess in Frameworks */, @@ -1154,6 +1154,7 @@ 9A996C5626DDF65900A4485D /* Base32 */, 9A1D1CE426E5D1CE0052028E /* OneTimePassword */, 9A2C7D852783FF9600BD9AF3 /* YubiKit */, + 30333B2C2CF9252E008A2EA2 /* SVProgressHUD */, ); productName = passKit; productReference = A26075781EEC6F34005DB03E /* passKit.framework */; @@ -1256,6 +1257,7 @@ 9A1F47F926E5CF4B000C0E01 /* OneTimePassword */, 30ED1776276F8842009BA876 /* ObjectiveGit */, 9A2C7D812782CB2F00BD9AF3 /* YubiKit */, + 30333B2A2CF924DC008A2EA2 /* SVProgressHUD */, ); productName = pass; productReference = DC917BD31E2E8231000FDF54 /* Pass.app */; @@ -1361,8 +1363,9 @@ 9A1F47F826E5CF4B000C0E01 /* XCRemoteSwiftPackageReference "OneTimePassword" */, 30ED1775276F8842009BA876 /* XCRemoteSwiftPackageReference "objective-git-swift-package" */, 9A2C7D802782CB2F00BD9AF3 /* XCRemoteSwiftPackageReference "yubikit-ios" */, - 307CA2312CF346D40099F6DE /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */, 307CA2322CF348260099F6DE /* XCRemoteSwiftPackageReference "SwiftFormat" */, + 307CB7522CF9219100D0931F /* XCRemoteSwiftPackageReference "SVProgressHUD" */, + 30333B292CF922D9008A2EA2 /* XCRemoteSwiftPackageReference "SwiftLintPlugins" */, ); productRefGroup = DC917BD41E2E8231000FDF54 /* Products */; projectDirPath = ""; @@ -2864,6 +2867,14 @@ minimumVersion = 0.55.2; }; }; + 307CB7522CF9219100D0931F /* XCRemoteSwiftPackageReference "SVProgressHUD" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SVProgressHUD/SVProgressHUD"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.3.1; + }; + }; 30A3000C26DA62F4002A734E /* XCRemoteSwiftPackageReference "Base32" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/mattrubin/Base32"; @@ -2924,6 +2935,16 @@ package = 3032DA5226DAF4C200A7728C /* XCRemoteSwiftPackageReference "ObjectivePGP" */; productName = ObjectivePGP; }; + 30333B2A2CF924DC008A2EA2 /* SVProgressHUD */ = { + isa = XCSwiftPackageProductDependency; + package = 307CB7522CF9219100D0931F /* XCRemoteSwiftPackageReference "SVProgressHUD" */; + productName = SVProgressHUD; + }; + 30333B2C2CF9252E008A2EA2 /* SVProgressHUD */ = { + isa = XCSwiftPackageProductDependency; + package = 307CB7522CF9219100D0931F /* XCRemoteSwiftPackageReference "SVProgressHUD" */; + productName = SVProgressHUD; + }; 30A3001326DA6692002A734E /* KeychainAccess */ = { isa = XCSwiftPackageProductDependency; package = 3010CB6426DA500F008964D2 /* XCRemoteSwiftPackageReference "KeychainAccess" */; diff --git a/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index d72048d3..e49473d1 100644 --- a/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "cfd99fa2de57765d4ea0531870a48806df8e3971c39177b2ec90b24da2c77efb", + "originHash" : "de205d1658853b135e2fee45e9118ceb0bbe55870b93f6b78a0eaf19a36af915", "pins" : [ { "identity" : "base32", @@ -54,6 +54,15 @@ "revision" : "8d59e4abba762d0f1e9aed161081f7b3fe21daa0" } }, + { + "identity" : "svprogresshud", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SVProgressHUD/SVProgressHUD", + "state" : { + "revision" : "c33f7c775ba7feea6047a1fc3257f2e5863b44f7", + "version" : "2.3.1" + } + }, { "identity" : "swiftformat", "kind" : "remoteSourceControl", From 0d7e6fd6c6648eda583d00b0db3d3995d8904edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Thu, 28 Nov 2024 23:34:40 +0100 Subject: [PATCH 10/37] Update to latest package versions --- pass.xcodeproj/project.pbxproj | 4 ++-- .../xcshareddata/swiftpm/Package.resolved | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pass.xcodeproj/project.pbxproj b/pass.xcodeproj/project.pbxproj index cf137b0f..e4acc4a2 100644 --- a/pass.xcodeproj/project.pbxproj +++ b/pass.xcodeproj/project.pbxproj @@ -2879,8 +2879,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/mattrubin/Base32"; requirement = { - branch = "1.1.2+spm"; - kind = branch; + kind = upToNextMajorVersion; + minimumVersion = 1.2.0; }; }; 30ED1775276F8842009BA876 /* XCRemoteSwiftPackageReference "objective-git-swift-package" */ = { diff --git a/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index e49473d1..48c96d63 100644 --- a/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/pass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "de205d1658853b135e2fee45e9118ceb0bbe55870b93f6b78a0eaf19a36af915", + "originHash" : "057d32000b3ab83e442b489c5bd052eed01930beee0100cb576baf0e541800df", "pins" : [ { "identity" : "base32", @@ -42,8 +42,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/krzyzanowskim/ObjectivePGP", "state" : { - "revision" : "0dc7ca7ffe193095dc37456b0c75be167a2026f4", - "version" : "0.99.2" + "revision" : "5629d849ec6c8f8ec733dffa9949c507468ec0b4", + "version" : "0.99.4" } }, { @@ -68,8 +68,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/nicklockwood/SwiftFormat", "state" : { - "revision" : "eb55d16245567e99d18ea871a7609befc8210c46", - "version" : "0.55.2" + "revision" : "2d5a2b6bde636c1feae2c852ab9a50f221e98c66", + "version" : "0.55.3" } }, { @@ -95,8 +95,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/Yubico/yubikit-ios", "state" : { - "revision" : "0d8c74a99d634b048a0a3ded32f8382e989079c5", - "version" : "4.3.0" + "revision" : "1ea9c97010780499001ac8552d6440235d947686", + "version" : "4.6.0" } } ], From 09d4b705665483de92f6ffb12c359a56dbe9aa31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Thu, 28 Nov 2024 23:44:27 +0100 Subject: [PATCH 11/37] Build on macOS version with at least Xcode 15.3 due to SPM incompatibilities --- .github/workflows/deploying.yml | 2 +- .github/workflows/testing.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploying.yml b/.github/workflows/deploying.yml index b8a5076a..526e3e2c 100644 --- a/.github/workflows/deploying.yml +++ b/.github/workflows/deploying.yml @@ -8,7 +8,7 @@ on: jobs: build: - runs-on: macos-13 + runs-on: macos-14 strategy: matrix: channel: ['beta', 'release'] diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index db0310cb..ea2c1496 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: testing: - runs-on: macos-13 + runs-on: macos-14 steps: - uses: actions/checkout@v4 - uses: ruby/setup-ruby@v1 From 00b43012d30654a49d0691675da96e87754c3796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Danny=20M=C3=B6sch?= Date: Fri, 29 Nov 2024 00:26:19 +0100 Subject: [PATCH 12/37] Update localization and fix typo (#633) --- pass/Base.lproj/Main.storyboard | 2 +- pass/de.lproj/Main.strings | 22 +++++++++++++++++----- pass/en.lproj/Main.strings | Bin 20750 -> 21726 bytes 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/pass/Base.lproj/Main.storyboard b/pass/Base.lproj/Main.storyboard index 5500362b..343d9255 100644 --- a/pass/Base.lproj/Main.storyboard +++ b/pass/Base.lproj/Main.storyboard @@ -1140,7 +1140,7 @@ Secret Question 1: What is your childhood best friend's most bizarre superhero f -