From 7bb2c921a29112badb5852c37ba9825c64975416 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sat, 6 Apr 2024 13:54:44 -0500 Subject: [PATCH 01/21] Fix - Added more configs like dev and prod to separate env variables for running and testing out At this stage, we can now begin to add env variable for dev and prod environment. --- LibrePass.xcodeproj/project.pbxproj | 272 ++++++++++++++++-- .../xcschemes/LibrePass(Dev).xcscheme | 78 +++++ .../xcschemes/LibrePass(Prod).xcscheme | 78 +++++ .../xcshareddata/WorkspaceSettings.xcsettings | 5 - LibrePass/Environment.swift | 26 ++ LibrePass/Info.plist | 5 +- LibrePass/LibrePassRegistrationWindow.swift | 6 +- 7 files changed, 434 insertions(+), 36 deletions(-) create mode 100644 LibrePass.xcodeproj/xcshareddata/xcschemes/LibrePass(Dev).xcscheme create mode 100644 LibrePass.xcodeproj/xcshareddata/xcschemes/LibrePass(Prod).xcscheme delete mode 100644 LibrePass.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 LibrePass/Environment.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 0348a81..5c1c439 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 176A30622BC1C103005C143E /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* Environment.swift */; }; 3975184DC26DCD2D852A7C08 /* Pods_LibrePass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A927B022513678BA42B54FCF /* Pods_LibrePass.framework */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; @@ -34,7 +35,10 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 2816A09CADE280F72E52A29A /* Pods-LibrePass.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release.xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release.xcconfig"; sourceTree = ""; }; + 176A30612BC1C103005C143E /* Environment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Environment.swift; sourceTree = ""; }; + 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug(dev).xcconfig"; sourceTree = ""; }; + 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release(dev).xcconfig"; sourceTree = ""; }; A927B022513678BA42B54FCF /* Pods_LibrePass.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LibrePass.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B23D44F72BA62C6B00097960 /* OATH.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OATH.swift; sourceTree = ""; }; B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassAccountSettings.swift; sourceTree = ""; }; @@ -62,7 +66,8 @@ B2D91A1C2B8393C70004561A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; B2D91A1F2B8393C70004561A /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = ""; }; - F596AB355AB5D89D17A58912 /* Pods-LibrePass.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug.xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug.xcconfig"; sourceTree = ""; }; + C8B00C4C0AD732FFFB50F596 /* Pods-LibrePass.debug(prod).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug(prod).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug(prod).xcconfig"; sourceTree = ""; }; + D34431269757FABB868039F0 /* Pods-LibrePass.release(prod).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release(prod).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release(prod).xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -126,19 +131,21 @@ B2D91A172B8393C60004561A /* LibrePass */ = { isa = PBXGroup; children = ( + 176A306A2BC1C8D8005C143E /* Info.plist */, B2D444772B87CFF00031A685 /* API */, + B2D91A1C2B8393C70004561A /* Assets.xcassets */, + 176A30612BC1C103005C143E /* Environment.swift */, + B253F1E22B8394EE00D048F9 /* LibrePass-Bridging-Header.h */, + B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */, B253F1D22B83942B00D048F9 /* LibrePassApp.swift */, - B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */, - B253F1CE2B83942B00D048F9 /* LibrePassLoginWindow.swift */, + B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */, B253F1CD2B83942B00D048F9 /* LibrePassLocalLogin.swift */, + B253F1CE2B83942B00D048F9 /* LibrePassLoginWindow.swift */, B253F1CF2B83942B00D048F9 /* LibrePassManagerWindow.swift */, - B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */, - B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */, + B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */, B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */, - B28E061F2B8BBD1900F48661 /* Utils.swift */, - B253F1E22B8394EE00D048F9 /* LibrePass-Bridging-Header.h */, - B2D91A1C2B8393C70004561A /* Assets.xcassets */, B2D91A1E2B8393C70004561A /* Preview Content */, + B28E061F2B8BBD1900F48661 /* Utils.swift */, ); path = LibrePass; sourceTree = ""; @@ -162,8 +169,10 @@ C4BF8AE2A13C542780EBE854 /* Pods */ = { isa = PBXGroup; children = ( - F596AB355AB5D89D17A58912 /* Pods-LibrePass.debug.xcconfig */, - 2816A09CADE280F72E52A29A /* Pods-LibrePass.release.xcconfig */, + 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */, + C8B00C4C0AD732FFFB50F596 /* Pods-LibrePass.debug(prod).xcconfig */, + 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */, + D34431269757FABB868039F0 /* Pods-LibrePass.release(prod).xcconfig */, ); path = Pods; sourceTree = ""; @@ -301,6 +310,7 @@ B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */, B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */, + 176A30622BC1C103005C143E /* Environment.swift in Sources */, B253F1E12B83942B00D048F9 /* LibrePassEncryptedCipher.swift in Sources */, B253F1DB2B83942B00D048F9 /* CredentialsDatabase.swift in Sources */, B253F1DA2B83942B00D048F9 /* LibrePassManagerWindow.swift in Sources */, @@ -310,8 +320,209 @@ /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ - B2D91A212B8393C70004561A /* Debug */ = { + 176A30632BC1C4D6005C143E /* Debug(Prod) */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C8B00C4C0AD732FFFB50F596 /* Pods-LibrePass.debug(prod).xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = "Debug(Prod)"; + }; + 176A30642BC1C4D6005C143E /* Debug(Prod) */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C8B00C4C0AD732FFFB50F596 /* Pods-LibrePass.debug(prod).xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"LibrePass/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = LibrePass/Info.plist; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.2.0; + PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "LibrePass/LibrePass-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = "Debug(Prod)"; + }; + 176A30652BC1C4D9005C143E /* Release(Prod) */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D34431269757FABB868039F0 /* Pods-LibrePass.release(prod).xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = "Release(Prod)"; + }; + 176A30662BC1C4D9005C143E /* Release(Prod) */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D34431269757FABB868039F0 /* Pods-LibrePass.release(prod).xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"LibrePass/Preview Content\""; + DEVELOPMENT_TEAM = ""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = LibrePass/Info.plist; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.2.0; + PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "LibrePass/LibrePass-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = "Release(Prod)"; + }; + B2D91A212B8393C70004561A /* Debug(Dev) */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -371,10 +582,11 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; - name = Debug; + name = "Debug(Dev)"; }; - B2D91A222B8393C70004561A /* Release */ = { + B2D91A222B8393C70004561A /* Release(Dev) */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -427,11 +639,11 @@ SWIFT_COMPILATION_MODE = wholemodule; VALIDATE_PRODUCT = YES; }; - name = Release; + name = "Release(Dev)"; }; - B2D91A242B8393C70004561A /* Debug */ = { + B2D91A242B8393C70004561A /* Debug(Dev) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F596AB355AB5D89D17A58912 /* Pods-LibrePass.debug.xcconfig */; + baseConfigurationReference = 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -442,6 +654,7 @@ DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = LibrePass/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -466,11 +679,11 @@ SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; - name = Debug; + name = "Debug(Dev)"; }; - B2D91A252B8393C70004561A /* Release */ = { + B2D91A252B8393C70004561A /* Release(Dev) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2816A09CADE280F72E52A29A /* Pods-LibrePass.release.xcconfig */; + baseConfigurationReference = 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -481,6 +694,7 @@ DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = LibrePass/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; @@ -504,7 +718,7 @@ SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; - name = Release; + name = "Release(Dev)"; }; /* End XCBuildConfiguration section */ @@ -512,20 +726,24 @@ B2D91A102B8393C60004561A /* Build configuration list for PBXProject "LibrePass" */ = { isa = XCConfigurationList; buildConfigurations = ( - B2D91A212B8393C70004561A /* Debug */, - B2D91A222B8393C70004561A /* Release */, + B2D91A212B8393C70004561A /* Debug(Dev) */, + 176A30632BC1C4D6005C143E /* Debug(Prod) */, + B2D91A222B8393C70004561A /* Release(Dev) */, + 176A30652BC1C4D9005C143E /* Release(Prod) */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; + defaultConfigurationName = "Release(Dev)"; }; B2D91A232B8393C70004561A /* Build configuration list for PBXNativeTarget "LibrePass" */ = { isa = XCConfigurationList; buildConfigurations = ( - B2D91A242B8393C70004561A /* Debug */, - B2D91A252B8393C70004561A /* Release */, + B2D91A242B8393C70004561A /* Debug(Dev) */, + 176A30642BC1C4D6005C143E /* Debug(Prod) */, + B2D91A252B8393C70004561A /* Release(Dev) */, + 176A30662BC1C4D9005C143E /* Release(Prod) */, ); defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; + defaultConfigurationName = "Release(Dev)"; }; /* End XCConfigurationList section */ }; diff --git a/LibrePass.xcodeproj/xcshareddata/xcschemes/LibrePass(Dev).xcscheme b/LibrePass.xcodeproj/xcshareddata/xcschemes/LibrePass(Dev).xcscheme new file mode 100644 index 0000000..b8bd2eb --- /dev/null +++ b/LibrePass.xcodeproj/xcshareddata/xcschemes/LibrePass(Dev).xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LibrePass.xcodeproj/xcshareddata/xcschemes/LibrePass(Prod).xcscheme b/LibrePass.xcodeproj/xcshareddata/xcschemes/LibrePass(Prod).xcscheme new file mode 100644 index 0000000..28421f9 --- /dev/null +++ b/LibrePass.xcodeproj/xcshareddata/xcschemes/LibrePass(Prod).xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/LibrePass.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/LibrePass.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index 0c67376..0000000 --- a/LibrePass.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/LibrePass/Environment.swift b/LibrePass/Environment.swift new file mode 100644 index 0000000..f5c20e5 --- /dev/null +++ b/LibrePass/Environment.swift @@ -0,0 +1,26 @@ +// +// Environment.swift +// LibrePass +// +// Created by Nish on 2024-04-06. +// + +import Foundation + +public enum Environment { + private static let infoDictionary: [String: Any] = { + guard let dict = Bundle.main.infoDictionary else { + fatalError("Plist file not found") + } + return dict + }() + + static let rootURL: String = { + guard let rootURLstring = Environment.infoDictionary["ROOT_URL"] as? String else { + fatalError("Root URL not set in plist for this environment") + } + + return rootURLstring + }() +} + diff --git a/LibrePass/Info.plist b/LibrePass/Info.plist index 0c67376..ae847ca 100644 --- a/LibrePass/Info.plist +++ b/LibrePass/Info.plist @@ -1,5 +1,8 @@ - + + ROOT_URL + ${ROOT_URL} + diff --git a/LibrePass/LibrePassRegistrationWindow.swift b/LibrePass/LibrePassRegistrationWindow.swift index 68be982..a76e620 100644 --- a/LibrePass/LibrePassRegistrationWindow.swift +++ b/LibrePass/LibrePassRegistrationWindow.swift @@ -8,11 +8,11 @@ import SwiftUI struct LibrePassRegistrationWindow: View { - @Environment(\.presentationMode) var presentationMode +// @Environment(\.presentationMode) var presentationMode @Binding var lClient: LibrePassClient - @State var apiServer = "https://api.librepass.org" + @State var apiServer = Environment.rootURL @State var email = String() @State var password = String() @State var confirmPassword = String() @@ -62,7 +62,7 @@ struct LibrePassRegistrationWindow: View { Button("OK", role: .cancel) { if self.registered { self.registered = false - self.presentationMode.wrappedValue.dismiss() +// self.presentationMode.wrappedValue.dismiss() } } } From 45bbe33e127827a05bb5bd19cc2e919ba9df3266 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sat, 6 Apr 2024 14:13:40 -0500 Subject: [PATCH 02/21] Fix - Changed Environment file name to CustomEnvironment that resolve the issue of dismiss view due to conflicts of keywords --- LibrePass.xcodeproj/project.pbxproj | 8 ++++---- LibrePass/{Environment.swift => CustomEnvironment.swift} | 4 ++-- LibrePass/LibrePassRegistrationWindow.swift | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) rename LibrePass/{Environment.swift => CustomEnvironment.swift} (78%) diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 5c1c439..0efe77f 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 176A30622BC1C103005C143E /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* Environment.swift */; }; + 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; 3975184DC26DCD2D852A7C08 /* Pods_LibrePass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A927B022513678BA42B54FCF /* Pods_LibrePass.framework */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; @@ -35,7 +35,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 176A30612BC1C103005C143E /* Environment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Environment.swift; sourceTree = ""; }; + 176A30612BC1C103005C143E /* CustomEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEnvironment.swift; sourceTree = ""; }; 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug(dev).xcconfig"; sourceTree = ""; }; 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release(dev).xcconfig"; sourceTree = ""; }; @@ -134,7 +134,7 @@ 176A306A2BC1C8D8005C143E /* Info.plist */, B2D444772B87CFF00031A685 /* API */, B2D91A1C2B8393C70004561A /* Assets.xcassets */, - 176A30612BC1C103005C143E /* Environment.swift */, + 176A30612BC1C103005C143E /* CustomEnvironment.swift */, B253F1E22B8394EE00D048F9 /* LibrePass-Bridging-Header.h */, B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */, B253F1D22B83942B00D048F9 /* LibrePassApp.swift */, @@ -310,7 +310,7 @@ B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */, B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */, - 176A30622BC1C103005C143E /* Environment.swift in Sources */, + 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */, B253F1E12B83942B00D048F9 /* LibrePassEncryptedCipher.swift in Sources */, B253F1DB2B83942B00D048F9 /* CredentialsDatabase.swift in Sources */, B253F1DA2B83942B00D048F9 /* LibrePassManagerWindow.swift in Sources */, diff --git a/LibrePass/Environment.swift b/LibrePass/CustomEnvironment.swift similarity index 78% rename from LibrePass/Environment.swift rename to LibrePass/CustomEnvironment.swift index f5c20e5..bd06658 100644 --- a/LibrePass/Environment.swift +++ b/LibrePass/CustomEnvironment.swift @@ -7,7 +7,7 @@ import Foundation -public enum Environment { +public enum CustomEnvironment { private static let infoDictionary: [String: Any] = { guard let dict = Bundle.main.infoDictionary else { fatalError("Plist file not found") @@ -16,7 +16,7 @@ public enum Environment { }() static let rootURL: String = { - guard let rootURLstring = Environment.infoDictionary["ROOT_URL"] as? String else { + guard let rootURLstring = CustomEnvironment.infoDictionary["ROOT_URL"] as? String else { fatalError("Root URL not set in plist for this environment") } diff --git a/LibrePass/LibrePassRegistrationWindow.swift b/LibrePass/LibrePassRegistrationWindow.swift index a76e620..796c4a0 100644 --- a/LibrePass/LibrePassRegistrationWindow.swift +++ b/LibrePass/LibrePassRegistrationWindow.swift @@ -8,11 +8,11 @@ import SwiftUI struct LibrePassRegistrationWindow: View { -// @Environment(\.presentationMode) var presentationMode + @Environment(\.presentationMode) var presentationMode @Binding var lClient: LibrePassClient - @State var apiServer = Environment.rootURL + @State var apiServer = CustomEnvironment.rootURL @State var email = String() @State var password = String() @State var confirmPassword = String() @@ -62,7 +62,7 @@ struct LibrePassRegistrationWindow: View { Button("OK", role: .cancel) { if self.registered { self.registered = false -// self.presentationMode.wrappedValue.dismiss() + self.presentationMode.wrappedValue.dismiss() } } } From 775d67c46309f6b50b4214b7ea13b10b7c62d212 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sat, 6 Apr 2024 14:37:36 -0500 Subject: [PATCH 03/21] Fix - Refactored main method, content view and NetworkMonitor However other changes of network monitor still left to do, at this stage just called them to make it work and build the project --- LibrePass.xcodeproj/project.pbxproj | 34 ++++++++- LibrePass/API/LibrePassAPI.swift | 2 + LibrePass/App/LibrePassApp.swift | 18 +++++ LibrePass/{ => App}/NetworkMonitor.swift | 2 + LibrePass/LibrePassApp.swift | 88 ------------------------ LibrePass/LibrePassLocalLogin.swift | 2 +- LibrePass/LibrePassManagerWindow.swift | 2 +- 7 files changed, 55 insertions(+), 93 deletions(-) create mode 100644 LibrePass/App/LibrePassApp.swift rename LibrePass/{ => App}/NetworkMonitor.swift (92%) delete mode 100644 LibrePass/LibrePassApp.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 0efe77f..a4d5430 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; + 179E98172BC1DB2C00D71ACA /* MainWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E98162BC1DB2C00D71ACA /* MainWindow.swift */; }; 3975184DC26DCD2D852A7C08 /* Pods_LibrePass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A927B022513678BA42B54FCF /* Pods_LibrePass.framework */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; @@ -37,6 +38,7 @@ /* Begin PBXFileReference section */ 176A30612BC1C103005C143E /* CustomEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEnvironment.swift; sourceTree = ""; }; 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 179E98162BC1DB2C00D71ACA /* MainWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MainWindow.swift; path = ../../../../../.Trash/Core/Root/MainWindow.swift; sourceTree = ""; }; 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug(dev).xcconfig"; sourceTree = ""; }; 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release(dev).xcconfig"; sourceTree = ""; }; A927B022513678BA42B54FCF /* Pods_LibrePass.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LibrePass.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -82,6 +84,31 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 179E98132BC1DAB900D71ACA /* App */ = { + isa = PBXGroup; + children = ( + B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */, + B253F1D22B83942B00D048F9 /* LibrePassApp.swift */, + ); + path = App; + sourceTree = ""; + }; + 179E98142BC1DAC200D71ACA /* Core */ = { + isa = PBXGroup; + children = ( + 179E98152BC1DB1B00D71ACA /* Root */, + ); + path = Core; + sourceTree = ""; + }; + 179E98152BC1DB1B00D71ACA /* Root */ = { + isa = PBXGroup; + children = ( + 179E98162BC1DB2C00D71ACA /* MainWindow.swift */, + ); + path = Root; + sourceTree = ""; + }; 1CCFA11845A6091810429252 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -131,19 +158,19 @@ B2D91A172B8393C60004561A /* LibrePass */ = { isa = PBXGroup; children = ( - 176A306A2BC1C8D8005C143E /* Info.plist */, B2D444772B87CFF00031A685 /* API */, + 179E98132BC1DAB900D71ACA /* App */, B2D91A1C2B8393C70004561A /* Assets.xcassets */, + 179E98142BC1DAC200D71ACA /* Core */, 176A30612BC1C103005C143E /* CustomEnvironment.swift */, + 176A306A2BC1C8D8005C143E /* Info.plist */, B253F1E22B8394EE00D048F9 /* LibrePass-Bridging-Header.h */, B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */, - B253F1D22B83942B00D048F9 /* LibrePassApp.swift */, B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */, B253F1CD2B83942B00D048F9 /* LibrePassLocalLogin.swift */, B253F1CE2B83942B00D048F9 /* LibrePassLoginWindow.swift */, B253F1CF2B83942B00D048F9 /* LibrePassManagerWindow.swift */, B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */, - B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */, B2D91A1E2B8393C70004561A /* Preview Content */, B28E061F2B8BBD1900F48661 /* Utils.swift */, ); @@ -307,6 +334,7 @@ B2780F062B8A43C200835EE3 /* LibrePassRegistrationWindow.swift in Sources */, B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */, B28E06202B8BBD1900F48661 /* Utils.swift in Sources */, + 179E98172BC1DB2C00D71ACA /* MainWindow.swift in Sources */, B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */, B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */, diff --git a/LibrePass/API/LibrePassAPI.swift b/LibrePass/API/LibrePassAPI.swift index a8e3e2f..8a2e3d6 100644 --- a/LibrePass/API/LibrePassAPI.swift +++ b/LibrePass/API/LibrePassAPI.swift @@ -12,6 +12,8 @@ struct LibrePassClient { var credentialsDatabase: LibrePassCredentialsDatabase? var vault: LibrePassDecryptedVault + let networkMonitor = NetworkMonitor.shared + init(apiUrl: String) { self.client = ApiClient(apiUrl: apiUrl) self.vault = LibrePassDecryptedVault(lastSync: 0) diff --git a/LibrePass/App/LibrePassApp.swift b/LibrePass/App/LibrePassApp.swift new file mode 100644 index 0000000..235c57e --- /dev/null +++ b/LibrePass/App/LibrePassApp.swift @@ -0,0 +1,18 @@ +// +// LibrePassApp.swift +// LibrePass +// +// Created by Zapomnij on 17/02/2024. +// + +import SwiftUI + +@main +struct LibrePassApp: App { + + var body: some Scene { + WindowGroup { + MainWindow() + } + } +} diff --git a/LibrePass/NetworkMonitor.swift b/LibrePass/App/NetworkMonitor.swift similarity index 92% rename from LibrePass/NetworkMonitor.swift rename to LibrePass/App/NetworkMonitor.swift index 7dc37da..c29dc64 100644 --- a/LibrePass/NetworkMonitor.swift +++ b/LibrePass/App/NetworkMonitor.swift @@ -9,6 +9,8 @@ import Foundation import Network class NetworkMonitor: ObservableObject { + static let shared = NetworkMonitor() + private let monitor = NWPathMonitor() private let dispatchQueue = DispatchQueue(label: "Monitor") diff --git a/LibrePass/LibrePassApp.swift b/LibrePass/LibrePassApp.swift deleted file mode 100644 index b90c3ff..0000000 --- a/LibrePass/LibrePassApp.swift +++ /dev/null @@ -1,88 +0,0 @@ -// -// LibrePassApp.swift -// LibrePass -// -// Created by Zapomnij on 17/02/2024. -// - -import SwiftUI - -@main -struct LibrePassApp: App { - - var body: some Scene { - WindowGroup { - MainWindow() - } - } -} - -var networkMonitor = NetworkMonitor() - -struct MainWindow: View { - @State var lClient: LibrePassClient = LibrePassClient(apiUrl: "") - - @State var localLogIn = false - @State var loggedIn = false - - @State var showAbout = false - - var body: some View { - HStack { - if self.loggedIn { - LibrePassManagerWindow(lClient: $lClient, loggedIn: $loggedIn, locallyLoggedIn: $localLogIn) - } else if self.localLogIn { - LibrePassLocalLogin(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn) - } else { - NavigationView { - List { - NavigationLink(destination: LibrePassLoginWindow(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn)) { - Text("Log in") - } - NavigationLink(destination: LibrePassRegistrationWindow(lClient: $lClient)) { - Text("Register") - } - } - - .navigationTitle("Welcome to LibrePass!") - .toolbar { - Button(action: { self.showAbout = true }) { - Image(systemName: "info.circle") - } - } - } - } - } - - .onAppear { - self.localLogIn = LibrePassCredentialsDatabase.isLocallyLoggedIn() - } - - .sheet(isPresented: self.$showAbout) { - VStack { - Image("Icon") - .resizable() - .cornerRadius(5.0) - .frame(width: 100, height: 100) - .padding() - - Text("Copyright © 2024 LibrePass Team") - Text("LibrePass server: Medzik (Oskar) and contributors") - Text("LibrePass app for iOS: aeoliux (Jacek)") - Text("App is licensed under GPL v3 license") - - Link("See on Github", destination: URL(string: "https://github.com/LibrePass")!) - .padding() - - Link("See website", destination: URL(string: "https://librepass.org")!) - .padding() - } - .padding() - } - } -} - - -//#Preview { -// MainWindow() -//} diff --git a/LibrePass/LibrePassLocalLogin.swift b/LibrePass/LibrePassLocalLogin.swift index 15c0e44..c329cf9 100644 --- a/LibrePass/LibrePassLocalLogin.swift +++ b/LibrePass/LibrePassLocalLogin.swift @@ -39,7 +39,7 @@ struct LibrePassLocalLogin: View { } func clearVault() throws { - if networkMonitor.isConnected { + if NetworkMonitor.shared.isConnected { let credentials = try LibrePassCredentialsDatabase.load() self.lClient = try LibrePassClient(credentials: credentials, password: self.password) diff --git a/LibrePass/LibrePassManagerWindow.swift b/LibrePass/LibrePassManagerWindow.swift index aa87adb..74b7721 100644 --- a/LibrePass/LibrePassManagerWindow.swift +++ b/LibrePass/LibrePassManagerWindow.swift @@ -116,7 +116,7 @@ struct LibrePassManagerWindow: View { } func syncVault() throws { - if networkMonitor.isConnected { + if NetworkMonitor.shared.isConnected { try self.lClient.syncVault() } } From ff3aca12714aa41bc1f3344666423ab7e9820014 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sat, 6 Apr 2024 14:54:48 -0500 Subject: [PATCH 04/21] Just saving at this stage --- LibrePass.xcodeproj/project.pbxproj | 40 +++++++++++++++++-- .../Core/Auth/ViewModel/AuthViewModel.swift | 8 ++++ 2 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 LibrePass/Core/Auth/ViewModel/AuthViewModel.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index a4d5430..29b6ebc 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; 179E98172BC1DB2C00D71ACA /* MainWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E98162BC1DB2C00D71ACA /* MainWindow.swift */; }; + 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; 3975184DC26DCD2D852A7C08 /* Pods_LibrePass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A927B022513678BA42B54FCF /* Pods_LibrePass.framework */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; @@ -39,6 +40,7 @@ 176A30612BC1C103005C143E /* CustomEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEnvironment.swift; sourceTree = ""; }; 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 179E98162BC1DB2C00D71ACA /* MainWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MainWindow.swift; path = ../../../../../.Trash/Core/Root/MainWindow.swift; sourceTree = ""; }; + 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewModel.swift; sourceTree = ""; }; 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug(dev).xcconfig"; sourceTree = ""; }; 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release(dev).xcconfig"; sourceTree = ""; }; A927B022513678BA42B54FCF /* Pods_LibrePass.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LibrePass.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -96,6 +98,7 @@ 179E98142BC1DAC200D71ACA /* Core */ = { isa = PBXGroup; children = ( + 179E98182BC1DCEC00D71ACA /* Auth */, 179E98152BC1DB1B00D71ACA /* Root */, ); path = Core; @@ -109,6 +112,30 @@ path = Root; sourceTree = ""; }; + 179E98182BC1DCEC00D71ACA /* Auth */ = { + isa = PBXGroup; + children = ( + 179E981A2BC1DD2000D71ACA /* ViewModel */, + 179E98192BC1DD1A00D71ACA /* Views */, + ); + path = Auth; + sourceTree = ""; + }; + 179E98192BC1DD1A00D71ACA /* Views */ = { + isa = PBXGroup; + children = ( + ); + path = Views; + sourceTree = ""; + }; + 179E981A2BC1DD2000D71ACA /* ViewModel */ = { + isa = PBXGroup; + children = ( + 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; 1CCFA11845A6091810429252 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -339,6 +366,7 @@ B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */, 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */, + 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */, B253F1E12B83942B00D048F9 /* LibrePassEncryptedCipher.swift in Sources */, B253F1DB2B83942B00D048F9 /* CredentialsDatabase.swift in Sources */, B253F1DA2B83942B00D048F9 /* LibrePassManagerWindow.swift in Sources */, @@ -419,7 +447,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"LibrePass/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -440,6 +468,7 @@ MARKETING_VERSION = 1.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -516,7 +545,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"LibrePass/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -537,6 +566,7 @@ MARKETING_VERSION = 1.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -676,7 +706,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"LibrePass/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -697,6 +727,7 @@ MARKETING_VERSION = 1.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -716,7 +747,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"LibrePass/Preview Content\""; DEVELOPMENT_TEAM = ""; @@ -737,6 +768,7 @@ MARKETING_VERSION = 1.2.0; PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift new file mode 100644 index 0000000..e06e050 --- /dev/null +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -0,0 +1,8 @@ +// +// AuthViewModel.swift +// LibrePass +// +// Created by Nish on 2024-04-06. +// + +import Foundation From 36000d2a9b51e21f3340247a588d20fd3ffebb20 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sat, 6 Apr 2024 15:03:10 -0500 Subject: [PATCH 05/21] Added MainWindow as root view for the app --- LibrePass.xcodeproj/project.pbxproj | 8 ++--- LibrePass/Core/Root/MainWindow.swift | 47 ++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 LibrePass/Core/Root/MainWindow.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 29b6ebc..e51cac1 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 17349C0D2BC1E19D00452814 /* MainWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0C2BC1E19D00452814 /* MainWindow.swift */; }; 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; - 179E98172BC1DB2C00D71ACA /* MainWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E98162BC1DB2C00D71ACA /* MainWindow.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; 3975184DC26DCD2D852A7C08 /* Pods_LibrePass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A927B022513678BA42B54FCF /* Pods_LibrePass.framework */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; @@ -37,9 +37,9 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 17349C0C2BC1E19D00452814 /* MainWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainWindow.swift; sourceTree = ""; }; 176A30612BC1C103005C143E /* CustomEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEnvironment.swift; sourceTree = ""; }; 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 179E98162BC1DB2C00D71ACA /* MainWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MainWindow.swift; path = ../../../../../.Trash/Core/Root/MainWindow.swift; sourceTree = ""; }; 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewModel.swift; sourceTree = ""; }; 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug(dev).xcconfig"; sourceTree = ""; }; 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release(dev).xcconfig"; sourceTree = ""; }; @@ -107,7 +107,7 @@ 179E98152BC1DB1B00D71ACA /* Root */ = { isa = PBXGroup; children = ( - 179E98162BC1DB2C00D71ACA /* MainWindow.swift */, + 17349C0C2BC1E19D00452814 /* MainWindow.swift */, ); path = Root; sourceTree = ""; @@ -361,8 +361,8 @@ B2780F062B8A43C200835EE3 /* LibrePassRegistrationWindow.swift in Sources */, B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */, B28E06202B8BBD1900F48661 /* Utils.swift in Sources */, - 179E98172BC1DB2C00D71ACA /* MainWindow.swift in Sources */, B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */, + 17349C0D2BC1E19D00452814 /* MainWindow.swift in Sources */, B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */, 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */, diff --git a/LibrePass/Core/Root/MainWindow.swift b/LibrePass/Core/Root/MainWindow.swift new file mode 100644 index 0000000..f8b0fff --- /dev/null +++ b/LibrePass/Core/Root/MainWindow.swift @@ -0,0 +1,47 @@ +// +// MainWindow.swift +// LibrePass +// +// Created by Nish on 2024-04-06. +// + +import SwiftUI + +struct MainWindow: View { + @State var lClient: LibrePassClient = LibrePassClient(apiUrl: "") + + @State var localLogIn = false + @State var loggedIn = false + + var body: some View { + HStack { + if self.loggedIn { + LibrePassManagerWindow(lClient: $lClient, loggedIn: $loggedIn, locallyLoggedIn: $localLogIn) + } else if self.localLogIn { + LibrePassLocalLogin(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn) + } else { + NavigationView { + List { + NavigationLink(destination: LibrePassLoginWindow(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn)) { + Text("Log in") + } + NavigationLink(destination: LibrePassRegistrationWindow(lClient: $lClient)) { + Text("Register") + } + } + + .navigationTitle("Welcome to LibrePass!") + } + } + } + + .onAppear { + self.localLogIn = LibrePassCredentialsDatabase.isLocallyLoggedIn() + } + } +} + + +//#Preview { +// MainWindow() +//} From c846c2b8b025e3d2313a40193de675abacdb2227 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sun, 7 Apr 2024 13:09:35 -0500 Subject: [PATCH 06/21] Added Content View that acts as welcome screen Currently the code was not following MVVM and yet other changes left. --- LibrePass.xcodeproj/project.pbxproj | 16 +++-- LibrePass/App/LibrePassApp.swift | 2 +- .../Core/Auth/ViewModel/AuthViewModel.swift | 31 ++++++++ LibrePass/Core/Auth/Views/LoginView.swift | 18 +++++ LibrePass/Core/Auth/Views/SignupView.swift | 18 +++++ LibrePass/Core/Root/ContentView.swift | 71 +++++++++++++++++++ LibrePass/Core/Root/MainWindow.swift | 47 ------------ 7 files changed, 151 insertions(+), 52 deletions(-) create mode 100644 LibrePass/Core/Auth/Views/LoginView.swift create mode 100644 LibrePass/Core/Auth/Views/SignupView.swift create mode 100644 LibrePass/Core/Root/ContentView.swift delete mode 100644 LibrePass/Core/Root/MainWindow.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index e51cac1..f318724 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -7,7 +7,9 @@ objects = { /* Begin PBXBuildFile section */ - 17349C0D2BC1E19D00452814 /* MainWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0C2BC1E19D00452814 /* MainWindow.swift */; }; + 17349C0D2BC1E19D00452814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0C2BC1E19D00452814 /* ContentView.swift */; }; + 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0E2BC1E4A100452814 /* LoginView.swift */; }; + 17349C112BC1E4B300452814 /* SignupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C102BC1E4B300452814 /* SignupView.swift */; }; 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; 3975184DC26DCD2D852A7C08 /* Pods_LibrePass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A927B022513678BA42B54FCF /* Pods_LibrePass.framework */; }; @@ -37,7 +39,9 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 17349C0C2BC1E19D00452814 /* MainWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainWindow.swift; sourceTree = ""; }; + 17349C0C2BC1E19D00452814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 17349C0E2BC1E4A100452814 /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = ""; }; + 17349C102BC1E4B300452814 /* SignupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupView.swift; sourceTree = ""; }; 176A30612BC1C103005C143E /* CustomEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEnvironment.swift; sourceTree = ""; }; 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewModel.swift; sourceTree = ""; }; @@ -107,7 +111,7 @@ 179E98152BC1DB1B00D71ACA /* Root */ = { isa = PBXGroup; children = ( - 17349C0C2BC1E19D00452814 /* MainWindow.swift */, + 17349C0C2BC1E19D00452814 /* ContentView.swift */, ); path = Root; sourceTree = ""; @@ -124,6 +128,8 @@ 179E98192BC1DD1A00D71ACA /* Views */ = { isa = PBXGroup; children = ( + 17349C0E2BC1E4A100452814 /* LoginView.swift */, + 17349C102BC1E4B300452814 /* SignupView.swift */, ); path = Views; sourceTree = ""; @@ -357,12 +363,13 @@ B253F1D72B83942B00D048F9 /* LibrePassCipherView.swift in Sources */, B253F1DF2B83942B00D048F9 /* Crypto.swift in Sources */, B253F1DE2B83942B00D048F9 /* ApiClient.swift in Sources */, + 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */, B2D4447B2B87D0DF0031A685 /* Vault.swift in Sources */, B2780F062B8A43C200835EE3 /* LibrePassRegistrationWindow.swift in Sources */, B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */, B28E06202B8BBD1900F48661 /* Utils.swift in Sources */, B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */, - 17349C0D2BC1E19D00452814 /* MainWindow.swift in Sources */, + 17349C0D2BC1E19D00452814 /* ContentView.swift in Sources */, B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */, 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */, @@ -370,6 +377,7 @@ B253F1E12B83942B00D048F9 /* LibrePassEncryptedCipher.swift in Sources */, B253F1DB2B83942B00D048F9 /* CredentialsDatabase.swift in Sources */, B253F1DA2B83942B00D048F9 /* LibrePassManagerWindow.swift in Sources */, + 17349C112BC1E4B300452814 /* SignupView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/LibrePass/App/LibrePassApp.swift b/LibrePass/App/LibrePassApp.swift index 235c57e..3fd61b3 100644 --- a/LibrePass/App/LibrePassApp.swift +++ b/LibrePass/App/LibrePassApp.swift @@ -12,7 +12,7 @@ struct LibrePassApp: App { var body: some Scene { WindowGroup { - MainWindow() + ContentView() } } } diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift index e06e050..9b9d3fd 100644 --- a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -6,3 +6,34 @@ // import Foundation + +class AuthViewModel: ObservableObject { + @Published var isLoggedIn = false +// +// @State var lClient: LibrePassClient = LibrePassClient(apiUrl: "") +// +// @State var localLogIn = false +// @State var loggedIn = false + +// HStack { +// if self.loggedIn { +// LibrePassManagerWindow(lClient: $lClient, loggedIn: $loggedIn, locallyLoggedIn: $localLogIn) +// } else if self.localLogIn { +// LibrePassLocalLogin(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn) +// } else { +// NavigationView { +// List { +// NavigationLink(destination: LibrePassLoginWindow(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn)) { +// Text("Log in") +// } +// NavigationLink(destination: LibrePassRegistrationWindow(lClient: $lClient)) { +// Text("Register") +// } +// } +// +// .navigationTitle("Welcome to LibrePass!") +// } + +// .onAppear { +// self.localLogIn = LibrePassCredentialsDatabase.isLocallyLoggedIn() +} diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift new file mode 100644 index 0000000..9c543d7 --- /dev/null +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -0,0 +1,18 @@ +// +// LoginView.swift +// LibrePass +// +// Created by Nish on 2024-04-06. +// + +import SwiftUI + +struct LoginView: View { + var body: some View { + Text("Login View") + } +} + +#Preview { + LoginView() +} diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift new file mode 100644 index 0000000..3eb3692 --- /dev/null +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -0,0 +1,18 @@ +// +// SignupView.swift +// LibrePass +// +// Created by Nish on 2024-04-06. +// + +import SwiftUI + +struct SignupView: View { + var body: some View { + Text("Sign up View") + } +} + +#Preview { + SignupView() +} diff --git a/LibrePass/Core/Root/ContentView.swift b/LibrePass/Core/Root/ContentView.swift new file mode 100644 index 0000000..dd0f1b7 --- /dev/null +++ b/LibrePass/Core/Root/ContentView.swift @@ -0,0 +1,71 @@ +// +// MainWindow.swift +// LibrePass +// +// Created by Nish on 2024-04-06. +// + +import SwiftUI + +struct ContentView: View { + + @State private var isRegisterButtonTapped = false + @State private var isLoginButtonTapped = false + + var body: some View { + NavigationStack { + VStack { + Image(uiImage: UIImage(named: AppIconProvider.appIcon())!) + .resizable() + .frame(width: 128, height: 128) + .clipShape(RoundedRectangle(cornerRadius: 20)) + + Text("Welcome to LibrePass") + .padding(.top, 20) + + NavigationLink(destination: SignupView()) { + Text("Register") + .padding() + .frame(maxWidth: .infinity) + .background(Color.blue) + .foregroundColor(.white) + .cornerRadius(8) + } + .padding(.horizontal, 90) + .padding(.top, 20) + + NavigationLink(destination: LoginView()) { + Text("Login") + .padding() + .frame(maxWidth: .infinity) + .foregroundColor(.blue) + .overlay( + RoundedRectangle(cornerRadius: 8) + .stroke(Color.blue, lineWidth: 1) + ) + .cornerRadius(8) + } + .padding(.horizontal, 90) + .padding(.top, 8) + } + } + } +} + + +enum AppIconProvider { + static func appIcon(in bundle: Bundle = .main) -> String { + guard let icons = bundle.object(forInfoDictionaryKey: "CFBundleIcons") as? [String: Any], + let primaryIcon = icons["CFBundlePrimaryIcon"] as? [String: Any], + let iconFiles = primaryIcon["CFBundleIconFiles"] as? [String], + let iconFileName = iconFiles.last else { + fatalError("Could not find icons in bundle") + } + return iconFileName + } +} + + +#Preview { + ContentView() +} diff --git a/LibrePass/Core/Root/MainWindow.swift b/LibrePass/Core/Root/MainWindow.swift deleted file mode 100644 index f8b0fff..0000000 --- a/LibrePass/Core/Root/MainWindow.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// MainWindow.swift -// LibrePass -// -// Created by Nish on 2024-04-06. -// - -import SwiftUI - -struct MainWindow: View { - @State var lClient: LibrePassClient = LibrePassClient(apiUrl: "") - - @State var localLogIn = false - @State var loggedIn = false - - var body: some View { - HStack { - if self.loggedIn { - LibrePassManagerWindow(lClient: $lClient, loggedIn: $loggedIn, locallyLoggedIn: $localLogIn) - } else if self.localLogIn { - LibrePassLocalLogin(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn) - } else { - NavigationView { - List { - NavigationLink(destination: LibrePassLoginWindow(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn)) { - Text("Log in") - } - NavigationLink(destination: LibrePassRegistrationWindow(lClient: $lClient)) { - Text("Register") - } - } - - .navigationTitle("Welcome to LibrePass!") - } - } - } - - .onAppear { - self.localLogIn = LibrePassCredentialsDatabase.isLocallyLoggedIn() - } - } -} - - -//#Preview { -// MainWindow() -//} From b244cf0220af75dbf10937b40594a4336af3275d Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Fri, 12 Apr 2024 23:02:13 -0500 Subject: [PATCH 07/21] Added Configs, SignupView and LoginView Refactored ContentView as the root (Welcome Screen), plus added signupview UI and left with loginView. AuthViewModel logic left yet to code but saving the progress --- LibrePass.xcodeproj/project.pbxproj | 153 ++-- .../xcshareddata/swiftpm/Package.resolved | 24 + .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - LibrePass/API/Crypto.swift | 21 +- LibrePass/API/OATH.swift | 248 +++--- LibrePass/Configs/Dev.xcconfig | 11 + LibrePass/Configs/Prod.xcconfig | 11 + .../Core/Auth/ViewModel/AuthViewModel.swift | 4 + LibrePass/Core/Auth/Views/SignupView.swift | 153 +++- LibrePass/Core/Root/ContentView.swift | 4 +- LibrePass/Info.plist | 2 + LibrePass/LibrePassCipherView.swift | 770 +++++++++--------- LibrePass/LibrePassManagerWindow.swift | 14 +- Makefile | 14 - Podfile | 11 - Podfile.lock | 20 - README.md | 14 - readme/VaultScreenshot.png | Bin 581474 -> 0 bytes 19 files changed, 791 insertions(+), 701 deletions(-) create mode 100644 LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved delete mode 100644 LibrePass.xcworkspace/contents.xcworkspacedata delete mode 100644 LibrePass.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 LibrePass/Configs/Dev.xcconfig create mode 100644 LibrePass/Configs/Prod.xcconfig delete mode 100644 Makefile delete mode 100644 Podfile delete mode 100644 Podfile.lock delete mode 100644 README.md delete mode 100644 readme/VaultScreenshot.png diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index f318724..3075ea4 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -10,12 +10,11 @@ 17349C0D2BC1E19D00452814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0C2BC1E19D00452814 /* ContentView.swift */; }; 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0E2BC1E4A100452814 /* LoginView.swift */; }; 17349C112BC1E4B300452814 /* SignupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C102BC1E4B300452814 /* SignupView.swift */; }; + 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 174EA0972BC3609E00084D2C /* Argon2Swift */; }; 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; - 3975184DC26DCD2D852A7C08 /* Pods_LibrePass.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A927B022513678BA42B54FCF /* Pods_LibrePass.framework */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; - B25257BF2B91341D0028ABF3 /* vaultScreenshot.png in Resources */ = {isa = PBXBuildFile; fileRef = B25257BE2B91341D0028ABF3 /* vaultScreenshot.png */; }; B253F1D72B83942B00D048F9 /* LibrePassCipherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */; }; B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CD2B83942B00D048F9 /* LibrePassLocalLogin.swift */; }; B253F1D92B83942B00D048F9 /* LibrePassLoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CE2B83942B00D048F9 /* LibrePassLoginWindow.swift */; }; @@ -28,7 +27,6 @@ B253F1E02B83942B00D048F9 /* LibrePassCipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D52B83942B00D048F9 /* LibrePassCipher.swift */; }; B253F1E12B83942B00D048F9 /* LibrePassEncryptedCipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D62B83942B00D048F9 /* LibrePassEncryptedCipher.swift */; }; B253F1E52B83976900D048F9 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B253F1E32B83976900D048F9 /* LICENSE */; }; - B253F1E62B83976900D048F9 /* README.md in Resources */ = {isa = PBXBuildFile; fileRef = B253F1E42B83976900D048F9 /* README.md */; }; B2780F062B8A43C200835EE3 /* LibrePassRegistrationWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */; }; B28808912B9254E300A526C6 /* PasswordGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B28808902B9254E300A526C6 /* PasswordGenerator.swift */; }; B28E06202B8BBD1900F48661 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = B28E061F2B8BBD1900F48661 /* Utils.swift */; }; @@ -42,15 +40,13 @@ 17349C0C2BC1E19D00452814 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 17349C0E2BC1E4A100452814 /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = ""; }; 17349C102BC1E4B300452814 /* SignupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupView.swift; sourceTree = ""; }; + 1742993E2BC9D09B008B639D /* Dev.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Dev.xcconfig; sourceTree = ""; }; + 1742993F2BC9D0B6008B639D /* Prod.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Prod.xcconfig; sourceTree = ""; }; 176A30612BC1C103005C143E /* CustomEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEnvironment.swift; sourceTree = ""; }; 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewModel.swift; sourceTree = ""; }; - 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug(dev).xcconfig"; sourceTree = ""; }; - 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release(dev).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release(dev).xcconfig"; sourceTree = ""; }; - A927B022513678BA42B54FCF /* Pods_LibrePass.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LibrePass.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B23D44F72BA62C6B00097960 /* OATH.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OATH.swift; sourceTree = ""; }; B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassAccountSettings.swift; sourceTree = ""; }; - B25257BE2B91341D0028ABF3 /* vaultScreenshot.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = vaultScreenshot.png; sourceTree = ""; }; B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassCipherView.swift; sourceTree = ""; }; B253F1CD2B83942B00D048F9 /* LibrePassLocalLogin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassLocalLogin.swift; sourceTree = ""; }; B253F1CE2B83942B00D048F9 /* LibrePassLoginWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassLoginWindow.swift; sourceTree = ""; }; @@ -64,18 +60,14 @@ B253F1D62B83942B00D048F9 /* LibrePassEncryptedCipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassEncryptedCipher.swift; sourceTree = ""; }; B253F1E22B8394EE00D048F9 /* LibrePass-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "LibrePass-Bridging-Header.h"; sourceTree = ""; }; B253F1E32B83976900D048F9 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - B253F1E42B83976900D048F9 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassRegistrationWindow.swift; sourceTree = ""; }; B28808902B9254E300A526C6 /* PasswordGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordGenerator.swift; sourceTree = ""; }; - B28DFDBD2B8B6DC1007D5837 /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = ""; }; B28E061F2B8BBD1900F48661 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; B2D4447A2B87D0DF0031A685 /* Vault.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vault.swift; sourceTree = ""; }; B2D91A152B8393C60004561A /* LibrePass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LibrePass.app; sourceTree = BUILT_PRODUCTS_DIR; }; B2D91A1C2B8393C70004561A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; B2D91A1F2B8393C70004561A /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = ""; }; - C8B00C4C0AD732FFFB50F596 /* Pods-LibrePass.debug(prod).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.debug(prod).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.debug(prod).xcconfig"; sourceTree = ""; }; - D34431269757FABB868039F0 /* Pods-LibrePass.release(prod).xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LibrePass.release(prod).xcconfig"; path = "Target Support Files/Pods-LibrePass/Pods-LibrePass.release(prod).xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -83,13 +75,22 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3975184DC26DCD2D852A7C08 /* Pods_LibrePass.framework in Frameworks */, + 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1742993D2BC9D070008B639D /* Configs */ = { + isa = PBXGroup; + children = ( + 1742993E2BC9D09B008B639D /* Dev.xcconfig */, + 1742993F2BC9D0B6008B639D /* Prod.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; 179E98132BC1DAB900D71ACA /* App */ = { isa = PBXGroup; children = ( @@ -142,14 +143,6 @@ path = ViewModel; sourceTree = ""; }; - 1CCFA11845A6091810429252 /* Frameworks */ = { - isa = PBXGroup; - children = ( - A927B022513678BA42B54FCF /* Pods_LibrePass.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; B2D444772B87CFF00031A685 /* API */ = { isa = PBXGroup; children = ( @@ -170,13 +163,8 @@ isa = PBXGroup; children = ( B2D91A172B8393C60004561A /* LibrePass */, - B2DD90722B8D3F0E003D84B7 /* readme */, - B28DFDBD2B8B6DC1007D5837 /* Makefile */, B253F1E32B83976900D048F9 /* LICENSE */, - B253F1E42B83976900D048F9 /* README.md */, B2D91A162B8393C60004561A /* Products */, - C4BF8AE2A13C542780EBE854 /* Pods */, - 1CCFA11845A6091810429252 /* Frameworks */, ); sourceTree = ""; }; @@ -191,6 +179,7 @@ B2D91A172B8393C60004561A /* LibrePass */ = { isa = PBXGroup; children = ( + 1742993D2BC9D070008B639D /* Configs */, B2D444772B87CFF00031A685 /* API */, 179E98132BC1DAB900D71ACA /* App */, B2D91A1C2B8393C70004561A /* Assets.xcassets */, @@ -218,25 +207,6 @@ path = "Preview Content"; sourceTree = ""; }; - B2DD90722B8D3F0E003D84B7 /* readme */ = { - isa = PBXGroup; - children = ( - B25257BE2B91341D0028ABF3 /* vaultScreenshot.png */, - ); - path = readme; - sourceTree = ""; - }; - C4BF8AE2A13C542780EBE854 /* Pods */ = { - isa = PBXGroup; - children = ( - 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */, - C8B00C4C0AD732FFFB50F596 /* Pods-LibrePass.debug(prod).xcconfig */, - 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */, - D34431269757FABB868039F0 /* Pods-LibrePass.release(prod).xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -244,17 +214,18 @@ isa = PBXNativeTarget; buildConfigurationList = B2D91A232B8393C70004561A /* Build configuration list for PBXNativeTarget "LibrePass" */; buildPhases = ( - F7C85135F291197A1D751897 /* [CP] Check Pods Manifest.lock */, B2D91A112B8393C60004561A /* Sources */, B2D91A122B8393C60004561A /* Frameworks */, B2D91A132B8393C60004561A /* Resources */, - E2BF409140E7F75969234855 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); dependencies = ( ); name = LibrePass; + packageProductDependencies = ( + 174EA0972BC3609E00084D2C /* Argon2Swift */, + ); productName = LibrePass; productReference = B2D91A152B8393C60004561A /* LibrePass.app */; productType = "com.apple.product-type.application"; @@ -284,6 +255,9 @@ Base, ); mainGroup = B2D91A0C2B8393C60004561A; + packageReferences = ( + 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */, + ); productRefGroup = B2D91A162B8393C60004561A /* Products */; projectDirPath = ""; projectRoot = ""; @@ -300,56 +274,12 @@ files = ( B253F1E52B83976900D048F9 /* LICENSE in Resources */, B2D91A202B8393C70004561A /* Preview Assets.xcassets in Resources */, - B253F1E62B83976900D048F9 /* README.md in Resources */, B2D91A1D2B8393C70004561A /* Assets.xcassets in Resources */, - B25257BF2B91341D0028ABF3 /* vaultScreenshot.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - E2BF409140E7F75969234855 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-LibrePass/Pods-LibrePass-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-LibrePass/Pods-LibrePass-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-LibrePass/Pods-LibrePass-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - F7C85135F291197A1D751897 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-LibrePass-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ B2D91A112B8393C60004561A /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -386,7 +316,7 @@ /* Begin XCBuildConfiguration section */ 176A30632BC1C4D6005C143E /* Debug(Prod) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C8B00C4C0AD732FFFB50F596 /* Pods-LibrePass.debug(prod).xcconfig */; + baseConfigurationReference = 1742993F2BC9D0B6008B639D /* Prod.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -437,7 +367,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -450,7 +380,7 @@ }; 176A30642BC1C4D6005C143E /* Debug(Prod) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C8B00C4C0AD732FFFB50F596 /* Pods-LibrePass.debug(prod).xcconfig */; + baseConfigurationReference = 1742993F2BC9D0B6008B639D /* Prod.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -491,7 +421,7 @@ }; 176A30652BC1C4D9005C143E /* Release(Prod) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D34431269757FABB868039F0 /* Pods-LibrePass.release(prod).xcconfig */; + baseConfigurationReference = 1742993F2BC9D0B6008B639D /* Prod.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -536,7 +466,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -548,7 +478,7 @@ }; 176A30662BC1C4D9005C143E /* Release(Prod) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D34431269757FABB868039F0 /* Pods-LibrePass.release(prod).xcconfig */; + baseConfigurationReference = 1742993F2BC9D0B6008B639D /* Prod.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -588,7 +518,7 @@ }; B2D91A212B8393C70004561A /* Debug(Dev) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */; + baseConfigurationReference = 1742993E2BC9D09B008B639D /* Dev.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -639,7 +569,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -652,7 +582,7 @@ }; B2D91A222B8393C70004561A /* Release(Dev) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */; + baseConfigurationReference = 1742993E2BC9D09B008B639D /* Dev.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -697,7 +627,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -709,7 +639,7 @@ }; B2D91A242B8393C70004561A /* Debug(Dev) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 29FBE69442CBC35BD7E5388E /* Pods-LibrePass.debug(dev).xcconfig */; + baseConfigurationReference = 1742993E2BC9D09B008B639D /* Dev.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -750,7 +680,7 @@ }; B2D91A252B8393C70004561A /* Release(Dev) */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7F00EDC76A8230916D3D0E6C /* Pods-LibrePass.release(dev).xcconfig */; + baseConfigurationReference = 1742993E2BC9D09B008B639D /* Dev.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -814,6 +744,25 @@ defaultConfigurationName = "Release(Dev)"; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/tmthecoder/Argon2Swift"; + requirement = { + branch = main; + kind = branch; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 174EA0972BC3609E00084D2C /* Argon2Swift */ = { + isa = XCSwiftPackageProductDependency; + package = 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */; + productName = Argon2Swift; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = B2D91A0D2B8393C60004561A /* Project object */; } diff --git a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..4cb9ee5 --- /dev/null +++ b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,24 @@ +{ + "originHash" : "0e4ca2d36a723429907d5539d00f81a1320cc1f47a0249422d8645788a93eb20", + "pins" : [ + { + "identity" : "argon2swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/tmthecoder/Argon2Swift", + "state" : { + "branch" : "main", + "revision" : "53543623fefe68461b7eeea03d7f96677c2fd76d" + } + }, + { + "identity" : "phc-winner-argon2", + "kind" : "remoteSourceControl", + "location" : "https://github.com/P-H-C/phc-winner-argon2.git", + "state" : { + "branch" : "master", + "revision" : "f57e61e19229e23c4445b85494dbf7c07de721cb" + } + } + ], + "version" : 3 +} diff --git a/LibrePass.xcworkspace/contents.xcworkspacedata b/LibrePass.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 7f906f9..0000000 --- a/LibrePass.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/LibrePass.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/LibrePass.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/LibrePass.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/LibrePass/API/Crypto.swift b/LibrePass/API/Crypto.swift index 9ff24f0..33d87c2 100644 --- a/LibrePass/API/Crypto.swift +++ b/LibrePass/API/Crypto.swift @@ -6,7 +6,7 @@ // import Foundation -import SignalArgon2 +import Argon2Swift import CryptoKit struct Argon2IdOptions: Codable { @@ -17,9 +17,24 @@ struct Argon2IdOptions: Codable { } func argon2Hash(email: String, password: String, hashOptions: Argon2IdOptions) throws -> Data { - let (rawHash, _) = try Argon2.hash(iterations: UInt32(hashOptions.iterations), memoryInKiB: UInt32(hashOptions.memory), threads: UInt32(hashOptions.parallelism), password: password.data(using: .utf8)!, salt: email.data(using: .utf8)!, desiredLength: 32, variant: .id, version: .v13) +// let (rawHash, _) = try Argon2.hash(iterations: UInt32(hashOptions.iterations), memoryInKiB: UInt32(hashOptions.memory), threads: UInt32(hashOptions.parallelism), password: password.data(using: .utf8)!, salt: email.data(using: .utf8)!, desiredLength: 32, variant: .id, version: .v13) +// +// return rawHash - return rawHash + do { + let privateKeyData = try Argon2Swift.hashPasswordBytes(password: "pass".data(using: .utf8)!, salt: Salt(bytes: "ashdoahdfvo".data(using: .utf8)!), iterations: 3, memory: 65536, parallelism: 1, type: .id, version: .V13) + + let privatekey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: privateKeyData.hashData()) + let publickey = privatekey.publicKey + + + + + } catch { + print("Hash Error") + } + + return Data() } func dataToHexString(data: Data) -> String { diff --git a/LibrePass/API/OATH.swift b/LibrePass/API/OATH.swift index f951908..f3e1488 100644 --- a/LibrePass/API/OATH.swift +++ b/LibrePass/API/OATH.swift @@ -1,127 +1,127 @@ +//// +//// OATH.swift +//// LibrePass +//// +//// Created by Zapomnij on 16/03/2024. +//// // -// OATH.swift -// LibrePass +//import Foundation +//import SwiftUI +//import CryptoKit // -// Created by Zapomnij on 16/03/2024. +//extension String { +// func toOTPAlgorithm() -> SwiftOTP.OTPAlgorithm { +// switch self { +// case "SHA1": +// return .sha1 +// case "SHA256": +// return .sha256 +// case "SHA512": +// return .sha512 +// default: +// return .sha1 +// } +// } +//} // - -import Foundation -import SwiftOTP -import SwiftUI - -extension String { - func toOTPAlgorithm() -> SwiftOTP.OTPAlgorithm { - switch self { - case "SHA1": - return .sha1 - case "SHA256": - return .sha256 - case "SHA512": - return .sha512 - default: - return .sha1 - } - } -} - -extension SwiftOTP.OTPAlgorithm { - func toString() -> String { - switch self { - case .sha1: - return "SHA1" - case .sha256: - return "SHA256" - case .sha512: - return "SHA512" - } - } -} - -var stop = false -var running = false -struct OATHParams { - enum OATHType { - case TOTP - case HOTP - - func toString() -> String { - switch self { - case .TOTP: - return "totp" - case .HOTP: - return "htop" - } - } - } - - var uri: String - - var type: OATHType = .TOTP - var algorithm: SwiftOTP.OTPAlgorithm = .sha1 - var secret: Data = Data() - var digits: Int = 6 - var period: Int = 30 - var counter: Int = 0 - - init(uri: String) throws { - self.uri = uri - - if uri.starts(with: "otpauth://totp/") { - self.type = .TOTP - } else { - self.type = .HOTP - } - - let uriSplit = uri.components(separatedBy: "?")[1].components(separatedBy: "&") - - for keyVal in uriSplit { - let split = keyVal.components(separatedBy: "=") - let key = split[0], val = split[1] - - switch key { - case "secret": - guard let secret = base32Decode(val) else { - throw LibrePassApiErrors.WithMessage(message: "Bad 2FA secret") - } - self.secret = Data(secret) - break - case "algorithm": - self.algorithm = val.toOTPAlgorithm() - break - case "digits": - self.digits = Int(val) ?? 6 - break - case "counter": - self.counter = Int(val) ?? 0 - break - case "period": - self.period = Int(val) ?? 30 - break - default: - break - } - } - } - - func runTOTPCounter(callback: (_ oneTimePassword: String, _ timeLeft: Int) -> ()) async { - running = true - if let totp = TOTP(secret: self.secret, digits: self.digits, timeInterval: self.period, algorithm: self.algorithm) { - var counter = Int(Date().timeIntervalSince1970) % self.period - var password = totp.generate(time: Date()) ?? "" - while !stop { - if counter == 0 { - if let newPassword = totp.generate(time: Date()) { - password = newPassword - } - } - - callback(password, self.period - counter) - try? await Task.sleep(nanoseconds: UInt64(0.5 * 1000000000)) - counter = Int(Date().timeIntervalSince1970) % self.period - } - - stop = false - running = false - } - } -} +//extension SwiftOTP.OTPAlgorithm { +// func toString() -> String { +// switch self { +// case .sha1: +// return "SHA1" +// case .sha256: +// return "SHA256" +// case .sha512: +// return "SHA512" +// } +// } +//} +// +//var stop = false +//var running = false +//struct OATHParams { +// enum OATHType { +// case TOTP +// case HOTP +// +// func toString() -> String { +// switch self { +// case .TOTP: +// return "totp" +// case .HOTP: +// return "htop" +// } +// } +// } +// +// var uri: String +// +// var type: OATHType = .TOTP +// var algorithm: SwiftOTP.OTPAlgorithm = .sha1 +// var secret: Data = Data() +// var digits: Int = 6 +// var period: Int = 30 +// var counter: Int = 0 +// +// init(uri: String) throws { +// self.uri = uri +// +// if uri.starts(with: "otpauth://totp/") { +// self.type = .TOTP +// } else { +// self.type = .HOTP +// } +// +// let uriSplit = uri.components(separatedBy: "?")[1].components(separatedBy: "&") +// +// for keyVal in uriSplit { +// let split = keyVal.components(separatedBy: "=") +// let key = split[0], val = split[1] +// +// switch key { +// case "secret": +// guard let secret = base32Decode(val) else { +// throw LibrePassApiErrors.WithMessage(message: "Bad 2FA secret") +// } +// self.secret = Data(secret) +// break +// case "algorithm": +// self.algorithm = val.toOTPAlgorithm() +// break +// case "digits": +// self.digits = Int(val) ?? 6 +// break +// case "counter": +// self.counter = Int(val) ?? 0 +// break +// case "period": +// self.period = Int(val) ?? 30 +// break +// default: +// break +// } +// } +// } +// +// func runTOTPCounter(callback: (_ oneTimePassword: String, _ timeLeft: Int) -> ()) async { +// running = true +// if let totp = TOTP(secret: self.secret, digits: self.digits, timeInterval: self.period, algorithm: self.algorithm) { +// var counter = Int(Date().timeIntervalSince1970) % self.period +// var password = totp.generate(time: Date()) ?? "" +// while !stop { +// if counter == 0 { +// if let newPassword = totp.generate(time: Date()) { +// password = newPassword +// } +// } +// +// callback(password, self.period - counter) +// try? await Task.sleep(nanoseconds: UInt64(0.5 * 1000000000)) +// counter = Int(Date().timeIntervalSince1970) % self.period +// } +// +// stop = false +// running = false +// } +// } +//} diff --git a/LibrePass/Configs/Dev.xcconfig b/LibrePass/Configs/Dev.xcconfig new file mode 100644 index 0000000..29ce9ef --- /dev/null +++ b/LibrePass/Configs/Dev.xcconfig @@ -0,0 +1,11 @@ +// +// Dev.xcconfig +// LibrePass +// +// Created by Nish on 2024-04-12. +// + +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 + +ROOT_URL=https:/$()/api.test.librepass.medzik.dev diff --git a/LibrePass/Configs/Prod.xcconfig b/LibrePass/Configs/Prod.xcconfig new file mode 100644 index 0000000..f192e89 --- /dev/null +++ b/LibrePass/Configs/Prod.xcconfig @@ -0,0 +1,11 @@ +// +// Prod.xcconfig +// LibrePass +// +// Created by Nish on 2024-04-12. +// + +// Configuration settings file format documentation can be found at: +// https://help.apple.com/xcode/#/dev745c5c974 + +ROOT_URL=https:/$()/api.librepass.org diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift index 9b9d3fd..8e0cba4 100644 --- a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -7,6 +7,10 @@ import Foundation +protocol AuthenticationFormProtocol { + var formIsValid: Bool { get } +} + class AuthViewModel: ObservableObject { @Published var isLoggedIn = false // diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift index 3eb3692..c34fbe9 100644 --- a/LibrePass/Core/Auth/Views/SignupView.swift +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -8,8 +8,159 @@ import SwiftUI struct SignupView: View { + + @State private var email = "" + @State private var fullname = "" + @State private var password = "" + @State private var confirmPassword = "" + @State private var server = CustomEnvironment.rootURL + @State private var showSelfHostedView = false + @Environment(\.dismiss) var dismiss + @EnvironmentObject var viewModel: AuthViewModel + + var body: some View { - Text("Sign up View") + VStack { + Spacer() + + Image(uiImage: UIImage(named: AppIconProvider.appIcon())!) + .resizable() + .frame(width: 128, height: 128) + .clipShape(RoundedRectangle(cornerRadius: 20)) + + Spacer() + + VStack(spacing: 24) { + + InputView(text: $email, title: "Email Address", placeholder: "name@example.com") + .autocapitalization(.none) + + InputView(text: $password, title: "Password", placeholder: "Enter your password", isSecureField: true) + + ZStack(alignment: .trailing) { + InputView(text: $confirmPassword, title: "Confirm Password", placeholder: "Confirm your password", isSecureField: true) + + if !password.isEmpty && !confirmPassword.isEmpty { + if password == confirmPassword { + Image(systemName: "checkmark.circle.fill") + .imageScale(.large) + .fontWeight(.bold) + .foregroundColor(Color(.systemGreen)) + + } else { + Image(systemName: "xmark.circle.fill") + .imageScale(.large) + .fontWeight(.bold) + .foregroundColor(Color(.systemRed)) + } + } + } + + HStack { + Text ("Server Address") + .font(.footnote) + + Spacer() + + Picker("Server Address", selection: $server) { + Text("Official").tag(CustomEnvironment.rootURL) + Text("Self-Hosted").tag("") + } + .onChange(of: server) { newState in + if newState == "" { + showSelfHostedView = true + } + } + } + + } + .padding(.horizontal) + .padding(.top, 12) + + + Button { + Task { + + } + } label: { + HStack { + Text ("SIGN UP") + .fontWeight(.semibold) + Image(systemName: "arrow.right") + } + .foregroundColor(.white) + .frame(width: UIScreen.main.bounds.width - 32, height: 48) + } + .background(Color(.systemBlue)) + .disabled(!formIsValid) + .opacity(formIsValid ? 1.0 : 0.5 ) + .cornerRadius(10) + .padding() + } + .sheet(isPresented: $showSelfHostedView) { + NavigationStack { + ServerURLView(serverURL: $server, isPresented: $showSelfHostedView) + } + } + } +} + +extension SignupView: AuthenticationFormProtocol { + var formIsValid: Bool { + return !email.isEmpty + && email.contains("@") + && !password.isEmpty + && confirmPassword == password + && password.count > 7 + && !fullname.isEmpty + } +} + +struct InputView: View { + @Binding var text: String + let title: String + let placeholder: String + var isSecureField = false + + var body: some View { + VStack(alignment: .leading, spacing: 12) { + Text(title) + .foregroundColor(Color(.darkGray)) + .fontWeight(.semibold) + .font(.footnote) + + if isSecureField { + SecureField(placeholder, text: $text) + .font(.system(size: 16)) + } else { + TextField(placeholder, text: $text) + .font(.system(size: 16)) + } + + Divider() + + } + } +} + +struct ServerURLView: View { + @Binding var serverURL: String + @Binding var isPresented: Bool + + var body: some View { + NavigationStack { + VStack { + List { + TextField("Enter Server URL", text: $serverURL) + } + .background(Color(.systemGray6)) + } + .navigationTitle("Self-Hosted") + .navigationBarItems(trailing: Button("Done") { + isPresented.toggle() + }) + } + .background(Color(.systemGray6).ignoresSafeArea()) } } diff --git a/LibrePass/Core/Root/ContentView.swift b/LibrePass/Core/Root/ContentView.swift index dd0f1b7..02066fc 100644 --- a/LibrePass/Core/Root/ContentView.swift +++ b/LibrePass/Core/Root/ContentView.swift @@ -1,5 +1,5 @@ // -// MainWindow.swift +// ContentView.swift // LibrePass // // Created by Nish on 2024-04-06. @@ -20,7 +20,7 @@ struct ContentView: View { .frame(width: 128, height: 128) .clipShape(RoundedRectangle(cornerRadius: 20)) - Text("Welcome to LibrePass") + Text("LibrePass") .padding(.top, 20) NavigationLink(destination: SignupView()) { diff --git a/LibrePass/Info.plist b/LibrePass/Info.plist index ae847ca..f2b5544 100644 --- a/LibrePass/Info.plist +++ b/LibrePass/Info.plist @@ -4,5 +4,7 @@ ROOT_URL ${ROOT_URL} + + diff --git a/LibrePass/LibrePassCipherView.swift b/LibrePass/LibrePassCipherView.swift index 40ef717..1053126 100644 --- a/LibrePass/LibrePassCipherView.swift +++ b/LibrePass/LibrePassCipherView.swift @@ -1,388 +1,388 @@ +//// +//// LibrePassCipherView.swift +//// Librepass +//// +//// Created by Zapomnij on 19/02/2024. +//// // -// LibrePassCipherView.swift -// Librepass +//import SwiftUI // -// Created by Zapomnij on 19/02/2024. // - -import SwiftUI -import SwiftOTP - -struct CipherView: View { - @Binding var lClient: LibrePassClient - var cipher: LibrePassCipher - var index: Int - - func save(cipher: LibrePassCipher) { - do { - cipher.lastModified = Int64(Date().timeIntervalSince1970) - try lClient.put(cipher: cipher) - try lClient.syncVault() - } catch { - - } - } - - var body: some View { - switch self.cipher.type { - case LibrePassCipher.CipherType.Login: - CipherLoginDataView(cipher: self.cipher, index: index, save: save) - case LibrePassCipher.CipherType.SecureNote: - CipherSecureNoteView(cipher: self.cipher, index: index, save: save) - case LibrePassCipher.CipherType.Card: - CipherCardDataView(cipher: self.cipher, index: index, save: save) - } - } -} - -struct CipherLoginDataView: View { - var cipher: LibrePassCipher - var index: Int - var save: (_ save: LibrePassCipher) -> () - - @State var showPassword: Bool = false - @State var name = String() - @State var username = String() - @State var password = String() - @State var uris: [String] = [] - @State var notes = String() - @State var twoFactorUri: String? - - @State var passwordLength = 0 - @State var generatePasswordAlert = false - - @State var oneTimePassword = "" - @State var timeLeft = 0 - @State var editTwoFactor = false - - var body: some View { - List { - Section(header: Text("Login data")) { - TextField("Name", text: $name) - TextFieldWithCopyButton(text: "Username", textBind: self.$username) - SecureFieldWithCopyAndShowButton(text: "Password", textBind: self.$password) - Button("Generate random password") { self.generatePasswordAlert = true } - } - - Section(header: Text("URIs")) { - ForEach(self.uris.indices, id: \.self) { index in - HStack { - TextFieldWithCopyButton(text: "URI " + String(index + 1), textBind: self.$uris[index]) - } - } - .onDelete { index in - self.uris.remove(atOffsets: index) - } - - Button("Add") { - self.uris.append("") - } - } - - Section(header: Text("Two factor")) { - if let _ = self.twoFactorUri { - HStack { - Button(action: { - UIPasteboard.general.string = self.oneTimePassword - }, label: { - Image(systemName: "doc.on.doc") - }) - .buttonStyle(.plain) - Text(self.oneTimePassword) - Spacer() - Text(String(self.timeLeft)) - } - .onAppear { - runAuthenticatorJob() - } - .onDisappear { - stop = running - } - - Button("Edit 2FA") { - stop = running - self.editTwoFactor = true - } - - Button("Delete 2FA") { - stop = running - self.twoFactorUri = nil - } - - .alert("Incorrect 2FA configuration", isPresented: self.$twoFactorError) { - Button("OK", role: .cancel) { - self.twoFactorUri = nil - } - } - } else { - Button("Set up 2FA") { - self.editTwoFactor = true - } - } - } - - Section(header: Text("Notes")) { - TextField("Notes", text: self.$notes, axis: .vertical) - } - - Section { - ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) - } - } - - .alert("Length of password (must be longer or equal to 8)", isPresented: self.$generatePasswordAlert) { - TextField("Length", value: self.$passwordLength, formatter: NumberFormatter()) - Button("Generate") { - if let password = try? generatePassword(length: self.passwordLength) { - self.password = password - } - } - - Button("Cancel", role: .cancel) {} - } - - .onAppear { - self.name = self.cipher.loginData!.name - self.username = self.cipher.loginData!.username ?? "" - self.password = self.cipher.loginData!.password ?? "" - self.uris = self.cipher.loginData!.uris ?? [] - self.notes = self.cipher.loginData!.notes ?? "" - self.twoFactorUri = self.cipher.loginData!.twoFactor - } - - .sheet(isPresented: self.$editTwoFactor, onDismiss: { - runAuthenticatorJob() - }) { - List { - Section(header: Text("Manual configuration")) { - TextField("Secret", text: self.$twoFactorSecret) - Picker("Type", selection: self.$twoFactorType) { - Text("TOTP").tag(OATHParams.OATHType.TOTP) - } - TextField("Digits", value: self.$twoFactorDigits, formatter: NumberFormatter()) - if self.twoFactorType == .TOTP { - TextField("Period", value: self.$twoFactorPeriod, formatter: NumberFormatter()) - } else { - TextField("Counter", value: self.$twoFactorCounter, formatter: NumberFormatter()) - } - - Button("Apply") { - let split = self.twoFactorSecret.components(separatedBy: " ") - if split.count > 0 { - self.twoFactorSecret = "" - split.forEach { - if $0 != "" { - self.twoFactorSecret += $0 - } - } - } - - var str = "otpauth://" + self.twoFactorType.toString() - str += "/randomlabel?secret=" + self.twoFactorSecret - str += "&algorithm=" + self.twoFactorAlgorithm.toString() - str += "&digits=" + String(self.twoFactorDigits) - - if self.twoFactorType == .TOTP { - str += "&period=" + String(self.twoFactorPeriod) - } else { - str += "&counter=" + String(self.twoFactorCounter) - } - - self.twoFactorUri = str - - self.editTwoFactor = false - } - } - } - .onAppear { - do { - if let twoFactorUri = self.twoFactorUri { - let params = try OATHParams(uri: twoFactorUri) - self.twoFactorType = params.type - self.twoFactorAlgorithm = params.algorithm - self.twoFactorSecret = base32Encode(params.secret) - self.twoFactorDigits = params.digits - self.twoFactorPeriod = params.period - self.twoFactorCounter = params.counter - } - } catch { - self.twoFactorError = true - } - } - } - } - - @State var twoFactorType: OATHParams.OATHType = .TOTP - @State var twoFactorAlgorithm: SwiftOTP.OTPAlgorithm = .sha1 - @State var twoFactorSecret = String() - @State var twoFactorDigits = 6 - @State var twoFactorPeriod = 30 - @State var twoFactorCounter = 0 - @State var twoFactorError = false - - func runAuthenticatorJob() { - Task { - do { - if let twoFactorUri = self.twoFactorUri { - let engine = try OATHParams(uri: twoFactorUri) - switch engine.type { - case .TOTP: - await engine.runTOTPCounter { oneTimePassword, timeLeft in - self.oneTimePassword = oneTimePassword - self.timeLeft = timeLeft - } - break - case .HOTP: - break - } - } - } catch { - self.twoFactorError = true - } - } - } - - func saveCipher() throws { - self.cipher.loginData!.name = self.name - self.cipher.loginData!.username = self.username.emptyStringToNil() - self.cipher.loginData!.password = self.password.emptyStringToNil() - self.cipher.loginData!.uris = self.uris - self.cipher.loginData!.notes = self.notes.emptyStringToNil() - self.cipher.loginData!.twoFactor = self.twoFactorUri - - self.save(self.cipher) - } -} - -struct CipherSecureNoteView: View { - var cipher: LibrePassCipher - var index: Int - var save: (_ cipher: LibrePassCipher) -> () - @State var title: String = String() - @State var note: String = String() - - var body: some View { - List { - TextField("Title", text: self.$title) - TextField("Note", text: self.$note, axis: .vertical) - - ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) - } - - .onAppear { - self.title = self.cipher.secureNoteData!.title - self.note = self.cipher.secureNoteData!.note - } - } - - func saveCipher() throws { - self.cipher.secureNoteData!.title = title - self.cipher.secureNoteData!.note = note - self.save(self.cipher) - } -} - -struct CipherCardDataView: View { - var cipher: LibrePassCipher - var index: Int - var save: (_ cipher: LibrePassCipher) -> () - - @State var name = String() - @State var cardholderName = String() - @State var number = String() - @State var expMonth = String() - @State var expYear = String() - @State var code = String() - @State var notes = String() - - var body: some View { - List { - Section(header: Text("Card data")) { - TextField("Name", text: self.$name) - TextFieldWithCopyButton(text: "Cardholder name", textBind: self.$cardholderName) - SecureFieldWithCopyAndShowButton(text: "Card number", textBind: self.$number) - TextFieldWithCopyButton(text: "Expires in month", textBind: self.$expMonth) - TextFieldWithCopyButton(text: "Expires in year", textBind: self.$expYear) - SecureFieldWithCopyAndShowButton(text: "Security code", textBind: self.$code) - } - - Section(header: Text("Notes")) { - TextField("Note", text: self.$notes, axis: .vertical) - } - - Section { - ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) - } - } - - .onAppear { - self.name = self.cipher.cardData!.name - self.cardholderName = self.cipher.cardData!.cardholderName - self.number = self.cipher.cardData!.number - - if self.cipher.cardData!.expMonth == nil { - self.expMonth = "" - } else { - self.expMonth = String(self.cipher.cardData!.expMonth!) - } - - if self.cipher.cardData!.expYear == nil { - self.expYear = "" - } else { - self.expYear = String(self.cipher.cardData!.expYear!) - } - - self.code = self.cipher.cardData!.code ?? "" - self.notes = self.cipher.cardData!.notes ?? "" - } - } - - func saveCipher() throws { - self.cipher.cardData!.name = self.name - self.cipher.cardData!.cardholderName = self.cardholderName - self.cipher.cardData!.number = self.number - self.cipher.cardData!.expMonth = Int(self.expMonth) ?? nil - self.cipher.cardData!.expYear = Int(self.expYear) ?? nil - self.cipher.cardData!.code = self.code.emptyStringToNil() - self.cipher.cardData!.notes = self.notes.emptyStringToNil() - - self.save(self.cipher) - } -} - -struct CipherButton: View { - var cipher: LibrePassCipher - - var body: some View { - switch self.cipher.type { - case .Login: - HStack { - Image(systemName: "person.crop.circle.fill") - VStack { - HStack{ - Text(self.cipher.loginData!.name) - Spacer() - } - if let username = self.cipher.loginData!.username { - HStack { - Text(username) - Spacer() - } - } - } - } - case .SecureNote: - HStack { - Image(systemName: "note.text") - Text(self.cipher.secureNoteData!.title) - Spacer() - } - case .Card: - HStack { - Image(systemName: "creditcard") - Text(self.cipher.cardData!.name) - Spacer() - } - } - } -} +//struct CipherView: View { +// @Binding var lClient: LibrePassClient +// var cipher: LibrePassCipher +// var index: Int +// +// func save(cipher: LibrePassCipher) { +// do { +// cipher.lastModified = Int64(Date().timeIntervalSince1970) +// try lClient.put(cipher: cipher) +// try lClient.syncVault() +// } catch { +// +// } +// } +// +// var body: some View { +// switch self.cipher.type { +// case LibrePassCipher.CipherType.Login: +// CipherLoginDataView(cipher: self.cipher, index: index, save: save) +// case LibrePassCipher.CipherType.SecureNote: +// CipherSecureNoteView(cipher: self.cipher, index: index, save: save) +// case LibrePassCipher.CipherType.Card: +// CipherCardDataView(cipher: self.cipher, index: index, save: save) +// } +// } +//} +// +//struct CipherLoginDataView: View { +// var cipher: LibrePassCipher +// var index: Int +// var save: (_ save: LibrePassCipher) -> () +// +// @State var showPassword: Bool = false +// @State var name = String() +// @State var username = String() +// @State var password = String() +// @State var uris: [String] = [] +// @State var notes = String() +// @State var twoFactorUri: String? +// +// @State var passwordLength = 0 +// @State var generatePasswordAlert = false +// +// @State var oneTimePassword = "" +// @State var timeLeft = 0 +// @State var editTwoFactor = false +// +// var body: some View { +// List { +// Section(header: Text("Login data")) { +// TextField("Name", text: $name) +// TextFieldWithCopyButton(text: "Username", textBind: self.$username) +// SecureFieldWithCopyAndShowButton(text: "Password", textBind: self.$password) +// Button("Generate random password") { self.generatePasswordAlert = true } +// } +// +// Section(header: Text("URIs")) { +// ForEach(self.uris.indices, id: \.self) { index in +// HStack { +// TextFieldWithCopyButton(text: "URI " + String(index + 1), textBind: self.$uris[index]) +// } +// } +// .onDelete { index in +// self.uris.remove(atOffsets: index) +// } +// +// Button("Add") { +// self.uris.append("") +// } +// } +// +// Section(header: Text("Two factor")) { +// if let _ = self.twoFactorUri { +// HStack { +// Button(action: { +// UIPasteboard.general.string = self.oneTimePassword +// }, label: { +// Image(systemName: "doc.on.doc") +// }) +// .buttonStyle(.plain) +// Text(self.oneTimePassword) +// Spacer() +// Text(String(self.timeLeft)) +// } +// .onAppear { +// runAuthenticatorJob() +// } +// .onDisappear { +// stop = running +// } +// +// Button("Edit 2FA") { +// stop = running +// self.editTwoFactor = true +// } +// +// Button("Delete 2FA") { +// stop = running +// self.twoFactorUri = nil +// } +// +// .alert("Incorrect 2FA configuration", isPresented: self.$twoFactorError) { +// Button("OK", role: .cancel) { +// self.twoFactorUri = nil +// } +// } +// } else { +// Button("Set up 2FA") { +// self.editTwoFactor = true +// } +// } +// } +// +// Section(header: Text("Notes")) { +// TextField("Notes", text: self.$notes, axis: .vertical) +// } +// +// Section { +// ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) +// } +// } +// +// .alert("Length of password (must be longer or equal to 8)", isPresented: self.$generatePasswordAlert) { +// TextField("Length", value: self.$passwordLength, formatter: NumberFormatter()) +// Button("Generate") { +// if let password = try? generatePassword(length: self.passwordLength) { +// self.password = password +// } +// } +// +// Button("Cancel", role: .cancel) {} +// } +// +// .onAppear { +// self.name = self.cipher.loginData!.name +// self.username = self.cipher.loginData!.username ?? "" +// self.password = self.cipher.loginData!.password ?? "" +// self.uris = self.cipher.loginData!.uris ?? [] +// self.notes = self.cipher.loginData!.notes ?? "" +// self.twoFactorUri = self.cipher.loginData!.twoFactor +// } +// +// .sheet(isPresented: self.$editTwoFactor, onDismiss: { +// runAuthenticatorJob() +// }) { +// List { +// Section(header: Text("Manual configuration")) { +// TextField("Secret", text: self.$twoFactorSecret) +// Picker("Type", selection: self.$twoFactorType) { +// Text("TOTP").tag(OATHParams.OATHType.TOTP) +// } +// TextField("Digits", value: self.$twoFactorDigits, formatter: NumberFormatter()) +// if self.twoFactorType == .TOTP { +// TextField("Period", value: self.$twoFactorPeriod, formatter: NumberFormatter()) +// } else { +// TextField("Counter", value: self.$twoFactorCounter, formatter: NumberFormatter()) +// } +// +// Button("Apply") { +// let split = self.twoFactorSecret.components(separatedBy: " ") +// if split.count > 0 { +// self.twoFactorSecret = "" +// split.forEach { +// if $0 != "" { +// self.twoFactorSecret += $0 +// } +// } +// } +// +// var str = "otpauth://" + self.twoFactorType.toString() +// str += "/randomlabel?secret=" + self.twoFactorSecret +// str += "&algorithm=" + self.twoFactorAlgorithm.toString() +// str += "&digits=" + String(self.twoFactorDigits) +// +// if self.twoFactorType == .TOTP { +// str += "&period=" + String(self.twoFactorPeriod) +// } else { +// str += "&counter=" + String(self.twoFactorCounter) +// } +// +// self.twoFactorUri = str +// +// self.editTwoFactor = false +// } +// } +// } +// .onAppear { +// do { +// if let twoFactorUri = self.twoFactorUri { +// let params = try OATHParams(uri: twoFactorUri) +// self.twoFactorType = params.type +// self.twoFactorAlgorithm = params.algorithm +// self.twoFactorSecret = base32Encode(params.secret) +// self.twoFactorDigits = params.digits +// self.twoFactorPeriod = params.period +// self.twoFactorCounter = params.counter +// } +// } catch { +// self.twoFactorError = true +// } +// } +// } +// } +// +// @State var twoFactorType: OATHParams.OATHType = .TOTP +// @State var twoFactorAlgorithm: SwiftOTP.OTPAlgorithm = .sha1 +// @State var twoFactorSecret = String() +// @State var twoFactorDigits = 6 +// @State var twoFactorPeriod = 30 +// @State var twoFactorCounter = 0 +// @State var twoFactorError = false +// +// func runAuthenticatorJob() { +// Task { +// do { +// if let twoFactorUri = self.twoFactorUri { +// let engine = try OATHParams(uri: twoFactorUri) +// switch engine.type { +// case .TOTP: +// await engine.runTOTPCounter { oneTimePassword, timeLeft in +// self.oneTimePassword = oneTimePassword +// self.timeLeft = timeLeft +// } +// break +// case .HOTP: +// break +// } +// } +// } catch { +// self.twoFactorError = true +// } +// } +// } +// +// func saveCipher() throws { +// self.cipher.loginData!.name = self.name +// self.cipher.loginData!.username = self.username.emptyStringToNil() +// self.cipher.loginData!.password = self.password.emptyStringToNil() +// self.cipher.loginData!.uris = self.uris +// self.cipher.loginData!.notes = self.notes.emptyStringToNil() +// self.cipher.loginData!.twoFactor = self.twoFactorUri +// +// self.save(self.cipher) +// } +//} +// +//struct CipherSecureNoteView: View { +// var cipher: LibrePassCipher +// var index: Int +// var save: (_ cipher: LibrePassCipher) -> () +// @State var title: String = String() +// @State var note: String = String() +// +// var body: some View { +// List { +// TextField("Title", text: self.$title) +// TextField("Note", text: self.$note, axis: .vertical) +// +// ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) +// } +// +// .onAppear { +// self.title = self.cipher.secureNoteData!.title +// self.note = self.cipher.secureNoteData!.note +// } +// } +// +// func saveCipher() throws { +// self.cipher.secureNoteData!.title = title +// self.cipher.secureNoteData!.note = note +// self.save(self.cipher) +// } +//} +// +//struct CipherCardDataView: View { +// var cipher: LibrePassCipher +// var index: Int +// var save: (_ cipher: LibrePassCipher) -> () +// +// @State var name = String() +// @State var cardholderName = String() +// @State var number = String() +// @State var expMonth = String() +// @State var expYear = String() +// @State var code = String() +// @State var notes = String() +// +// var body: some View { +// List { +// Section(header: Text("Card data")) { +// TextField("Name", text: self.$name) +// TextFieldWithCopyButton(text: "Cardholder name", textBind: self.$cardholderName) +// SecureFieldWithCopyAndShowButton(text: "Card number", textBind: self.$number) +// TextFieldWithCopyButton(text: "Expires in month", textBind: self.$expMonth) +// TextFieldWithCopyButton(text: "Expires in year", textBind: self.$expYear) +// SecureFieldWithCopyAndShowButton(text: "Security code", textBind: self.$code) +// } +// +// Section(header: Text("Notes")) { +// TextField("Note", text: self.$notes, axis: .vertical) +// } +// +// Section { +// ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) +// } +// } +// +// .onAppear { +// self.name = self.cipher.cardData!.name +// self.cardholderName = self.cipher.cardData!.cardholderName +// self.number = self.cipher.cardData!.number +// +// if self.cipher.cardData!.expMonth == nil { +// self.expMonth = "" +// } else { +// self.expMonth = String(self.cipher.cardData!.expMonth!) +// } +// +// if self.cipher.cardData!.expYear == nil { +// self.expYear = "" +// } else { +// self.expYear = String(self.cipher.cardData!.expYear!) +// } +// +// self.code = self.cipher.cardData!.code ?? "" +// self.notes = self.cipher.cardData!.notes ?? "" +// } +// } +// +// func saveCipher() throws { +// self.cipher.cardData!.name = self.name +// self.cipher.cardData!.cardholderName = self.cardholderName +// self.cipher.cardData!.number = self.number +// self.cipher.cardData!.expMonth = Int(self.expMonth) ?? nil +// self.cipher.cardData!.expYear = Int(self.expYear) ?? nil +// self.cipher.cardData!.code = self.code.emptyStringToNil() +// self.cipher.cardData!.notes = self.notes.emptyStringToNil() +// +// self.save(self.cipher) +// } +//} +// +//struct CipherButton: View { +// var cipher: LibrePassCipher +// +// var body: some View { +// switch self.cipher.type { +// case .Login: +// HStack { +// Image(systemName: "person.crop.circle.fill") +// VStack { +// HStack{ +// Text(self.cipher.loginData!.name) +// Spacer() +// } +// if let username = self.cipher.loginData!.username { +// HStack { +// Text(username) +// Spacer() +// } +// } +// } +// } +// case .SecureNote: +// HStack { +// Image(systemName: "note.text") +// Text(self.cipher.secureNoteData!.title) +// Spacer() +// } +// case .Card: +// HStack { +// Image(systemName: "creditcard") +// Text(self.cipher.cardData!.name) +// Spacer() +// } +// } +// } +//} diff --git a/LibrePass/LibrePassManagerWindow.swift b/LibrePass/LibrePassManagerWindow.swift index 74b7721..2d78a15 100644 --- a/LibrePass/LibrePassManagerWindow.swift +++ b/LibrePass/LibrePassManagerWindow.swift @@ -30,13 +30,13 @@ struct LibrePassManagerWindow: View { ForEach(self.lClient.vault.vault, id: \.self.id) { cipher in let index = lClient.vault.vault.firstIndex(where: { vaultCipher in vaultCipher.id == cipher.id })! - NavigationLink(destination: CipherView(lClient: $lClient, cipher: cipher, index: index)) { - HStack { - CipherButton(cipher: cipher) - - Spacer() - } - } +// NavigationLink(destination: CipherView(lClient: $lClient, cipher: cipher, index: index)) { +// HStack { +// CipherButton(cipher: cipher) +// +// Spacer() +// } +// } } .onDelete { indexSet in self.toDelete = indexSet diff --git a/Makefile b/Makefile deleted file mode 100644 index 6ecab89..0000000 --- a/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -DESTDIR = Build/Release-iphoneos -XCODEBUILD ?= xcodebuild - -$(DESTDIR)/LibrePass.ipa: $(DESTDIR)/LibrePass.app - cd $(DESTDIR) && \ - mkdir -p Payload && \ - cp -pr LibrePass.app Payload && \ - zip -r LibrePass.ipa Payload - -$(DESTDIR)/LibrePass.app: - xcodebuild -workspace LibrePass.xcworkspace -scheme LibrePass -sdk iphoneos -configuration Release CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO SYMROOT=$(PWD)/Build - -clean: - rm -rf Build diff --git a/Podfile b/Podfile deleted file mode 100644 index 7522475..0000000 --- a/Podfile +++ /dev/null @@ -1,11 +0,0 @@ -# Uncomment the next line to define a global platform for your project -# platform :ios, '9.0' - -target 'LibrePass' do - # Comment the next line if you don't want to use dynamic frameworks - use_frameworks! - - # Pods for LibrePass - pod 'SignalArgon2' - pod 'SwiftOTP' -end diff --git a/Podfile.lock b/Podfile.lock deleted file mode 100644 index cbeb314..0000000 --- a/Podfile.lock +++ /dev/null @@ -1,20 +0,0 @@ -PODS: - - SignalArgon2 (1.3.2) - - SwiftOTP (3.0.0) - -DEPENDENCIES: - - SignalArgon2 - - SwiftOTP - -SPEC REPOS: - trunk: - - SignalArgon2 - - SwiftOTP - -SPEC CHECKSUMS: - SignalArgon2: 1c24183835ca861e6af06631c18b1671cdf35571 - SwiftOTP: ec3848f12a4541f29d96f6a0fe63dcbb8448d96f - -PODFILE CHECKSUM: 1da7a2cafcf08979a18d3ef0b1ddb528be0e2c71 - -COCOAPODS: 1.15.2 diff --git a/README.md b/README.md deleted file mode 100644 index 9ae4225..0000000 --- a/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# LibrePass-iOS - -LibrePass client for iOS. Written in SwiftUI. - -Vault screenshot - -### Update issues -If app crashes after update, you probably need to clear vault unfortunately. - -### Used libraries: -- SwiftUI -- Apple CryptoKit -- SignalArgon2 -- SwiftOTP diff --git a/readme/VaultScreenshot.png b/readme/VaultScreenshot.png deleted file mode 100644 index 36b49513ad9a040979e5321717fa9bee18e7f9b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 581474 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%0DrC*tKS0;Kc96>G9!s;$;9{Z@3e4?7rQ{m7J&_ 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
>U|hLN%UO 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 From a682f539c5f9521d8b24692a4c01a91a4d78a1db Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Fri, 12 Apr 2024 23:19:34 -0500 Subject: [PATCH 08/21] Fix - Updated ContentView and LoginView Removed the welcome screen part --- LibrePass.xcodeproj/project.pbxproj | 12 ++++ LibrePass/Core/Auth/Views/LoginView.swift | 78 +++++++++++++++++++++- LibrePass/Core/Auth/Views/SignupView.swift | 20 ++++-- LibrePass/Core/Home/HomeView.swift | 18 +++++ LibrePass/Core/Root/ContentView.swift | 58 ++-------------- 5 files changed, 130 insertions(+), 56 deletions(-) create mode 100644 LibrePass/Core/Home/HomeView.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 3075ea4..bce3280 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0E2BC1E4A100452814 /* LoginView.swift */; }; 17349C112BC1E4B300452814 /* SignupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C102BC1E4B300452814 /* SignupView.swift */; }; 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 174EA0972BC3609E00084D2C /* Argon2Swift */; }; + 175190532BCA3EEB0076460A /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175190522BCA3EEB0076460A /* HomeView.swift */; }; 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; @@ -42,6 +43,7 @@ 17349C102BC1E4B300452814 /* SignupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignupView.swift; sourceTree = ""; }; 1742993E2BC9D09B008B639D /* Dev.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Dev.xcconfig; sourceTree = ""; }; 1742993F2BC9D0B6008B639D /* Prod.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Prod.xcconfig; sourceTree = ""; }; + 175190522BCA3EEB0076460A /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; 176A30612BC1C103005C143E /* CustomEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEnvironment.swift; sourceTree = ""; }; 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewModel.swift; sourceTree = ""; }; @@ -91,6 +93,14 @@ path = Configs; sourceTree = ""; }; + 175190512BCA3EE00076460A /* Home */ = { + isa = PBXGroup; + children = ( + 175190522BCA3EEB0076460A /* HomeView.swift */, + ); + path = Home; + sourceTree = ""; + }; 179E98132BC1DAB900D71ACA /* App */ = { isa = PBXGroup; children = ( @@ -103,6 +113,7 @@ 179E98142BC1DAC200D71ACA /* Core */ = { isa = PBXGroup; children = ( + 175190512BCA3EE00076460A /* Home */, 179E98182BC1DCEC00D71ACA /* Auth */, 179E98152BC1DB1B00D71ACA /* Root */, ); @@ -306,6 +317,7 @@ 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */, B253F1E12B83942B00D048F9 /* LibrePassEncryptedCipher.swift in Sources */, B253F1DB2B83942B00D048F9 /* CredentialsDatabase.swift in Sources */, + 175190532BCA3EEB0076460A /* HomeView.swift in Sources */, B253F1DA2B83942B00D048F9 /* LibrePassManagerWindow.swift in Sources */, 17349C112BC1E4B300452814 /* SignupView.swift in Sources */, ); diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift index 9c543d7..7cbdb80 100644 --- a/LibrePass/Core/Auth/Views/LoginView.swift +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -8,8 +8,84 @@ import SwiftUI struct LoginView: View { + @State private var email = "" + @State private var password = "" + @EnvironmentObject var viewModel: AuthViewModel + var body: some View { - Text("Login View") + NavigationStack { + VStack { + Image(uiImage: UIImage(named: AppIconProvider.appIcon())!) + .resizable() + .frame(width: 128, height: 128) + .clipShape(RoundedRectangle(cornerRadius: 20)) + + Text("LibrePass") + .font(.title) + + VStack(spacing: 24) { + InputView(text: $email, title: "Email Address", placeholder: "name@example.com") + .autocapitalization(.none) + + InputView(text: $password, title: "Password", placeholder: "Enter your password", isSecureField: true) + } + .padding(.horizontal) + .padding(.top, 12) + } + + Button { + Task { +// try await viewModel.signIn(withEmail: email, password: password) + } + } label: { + HStack { + Text ("SIGN IN") + .fontWeight(.semibold) + Image(systemName: "arrow.right") + } + .foregroundColor(.white) + .frame(width: UIScreen.main.bounds.width - 32, height: 48) + } + .background(Color(.systemBlue)) + .disabled(!formIsValid) + .opacity(formIsValid ? 1.0 : 0.5 ) + .cornerRadius(10) + .padding(.top, 24) + + NavigationLink { + SignupView() + .navigationBarBackButtonHidden(true) + } label: { + HStack(spacing: 2) { + Text("Don't have an account?") + Text("Sign up") + .fontWeight(.bold) + } + .font(.system(size: 16)) + } + .padding() + } + } +} + +extension LoginView: AuthenticationFormProtocol { + var formIsValid: Bool { + return !email.isEmpty + && email.contains("@") + && !password.isEmpty + && password.count > 7 + } +} + +enum AppIconProvider { + static func appIcon(in bundle: Bundle = .main) -> String { + guard let icons = bundle.object(forInfoDictionaryKey: "CFBundleIcons") as? [String: Any], + let primaryIcon = icons["CFBundlePrimaryIcon"] as? [String: Any], + let iconFiles = primaryIcon["CFBundleIconFiles"] as? [String], + let iconFileName = iconFiles.last else { + fatalError("Could not find icons in bundle") + } + return iconFileName } } diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift index c34fbe9..9e5cf86 100644 --- a/LibrePass/Core/Auth/Views/SignupView.swift +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -21,17 +21,15 @@ struct SignupView: View { var body: some View { VStack { - Spacer() - Image(uiImage: UIImage(named: AppIconProvider.appIcon())!) .resizable() .frame(width: 128, height: 128) .clipShape(RoundedRectangle(cornerRadius: 20)) - Spacer() + Text("LibrePass") + .font(.title) VStack(spacing: 24) { - InputView(text: $email, title: "Email Address", placeholder: "name@example.com") .autocapitalization(.none) @@ -95,6 +93,20 @@ struct SignupView: View { .disabled(!formIsValid) .opacity(formIsValid ? 1.0 : 0.5 ) .cornerRadius(10) + .padding(.top, 24) + + Button { + dismiss() + + } label: { + HStack(spacing: 2) { + Text("Already have an account?") + Text("Sign in") + .fontWeight(.bold) + } + .font(.system(size: 16)) + + } .padding() } .sheet(isPresented: $showSelfHostedView) { diff --git a/LibrePass/Core/Home/HomeView.swift b/LibrePass/Core/Home/HomeView.swift new file mode 100644 index 0000000..b64bad4 --- /dev/null +++ b/LibrePass/Core/Home/HomeView.swift @@ -0,0 +1,18 @@ +// +// HomeView.swift +// LibrePass +// +// Created by Nish on 2024-04-12. +// + +import SwiftUI + +struct HomeView: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +#Preview { + HomeView() +} diff --git a/LibrePass/Core/Root/ContentView.swift b/LibrePass/Core/Root/ContentView.swift index 02066fc..2f5950e 100644 --- a/LibrePass/Core/Root/ContentView.swift +++ b/LibrePass/Core/Root/ContentView.swift @@ -8,64 +8,20 @@ import SwiftUI struct ContentView: View { - - @State private var isRegisterButtonTapped = false - @State private var isLoginButtonTapped = false + @EnvironmentObject var authViewModel: AuthViewModel var body: some View { - NavigationStack { - VStack { - Image(uiImage: UIImage(named: AppIconProvider.appIcon())!) - .resizable() - .frame(width: 128, height: 128) - .clipShape(RoundedRectangle(cornerRadius: 20)) - - Text("LibrePass") - .padding(.top, 20) - - NavigationLink(destination: SignupView()) { - Text("Register") - .padding() - .frame(maxWidth: .infinity) - .background(Color.blue) - .foregroundColor(.white) - .cornerRadius(8) - } - .padding(.horizontal, 90) - .padding(.top, 20) - - NavigationLink(destination: LoginView()) { - Text("Login") - .padding() - .frame(maxWidth: .infinity) - .foregroundColor(.blue) - .overlay( - RoundedRectangle(cornerRadius: 8) - .stroke(Color.blue, lineWidth: 1) - ) - .cornerRadius(8) - } - .padding(.horizontal, 90) - .padding(.top, 8) + Group { + if authViewModel.isLoggedIn { + HomeView() + } else { + LoginView() } } } } - -enum AppIconProvider { - static func appIcon(in bundle: Bundle = .main) -> String { - guard let icons = bundle.object(forInfoDictionaryKey: "CFBundleIcons") as? [String: Any], - let primaryIcon = icons["CFBundlePrimaryIcon"] as? [String: Any], - let iconFiles = primaryIcon["CFBundleIconFiles"] as? [String], - let iconFileName = iconFiles.last else { - fatalError("Could not find icons in bundle") - } - return iconFileName - } -} - - #Preview { ContentView() + .environmentObject(AuthViewModel()) } From 805ac3a9f715f14ce1defd7371d51bbae13af017 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sun, 14 Apr 2024 00:36:32 -0500 Subject: [PATCH 09/21] Fix - Added Login Logic to AuthViewModel --- LibrePass.xcodeproj/project.pbxproj | 49 +++++++--- .../xcshareddata/swiftpm/Package.resolved | 11 ++- LibrePass/App/LibrePassApp.swift | 3 + LibrePass/Configs/Dev.xcconfig | 2 +- .../Core/Auth/ViewModel/AuthViewModel.swift | 91 +++++++++++++------ .../Auth/ViewModel/PreLoginResponse.swift | 15 +++ LibrePass/Core/Auth/Views/LoginView.swift | 6 +- LibrePass/Core/Auth/Views/SignupView.swift | 3 +- 8 files changed, 136 insertions(+), 44 deletions(-) create mode 100644 LibrePass/Core/Auth/ViewModel/PreLoginResponse.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index bce3280..73a2b71 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -13,6 +13,9 @@ 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 174EA0972BC3609E00084D2C /* Argon2Swift */; }; 175190532BCA3EEB0076460A /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175190522BCA3EEB0076460A /* HomeView.swift */; }; 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; + 177B62CC2BCB14DF003EBC65 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 177B62CB2BCB14DF003EBC65 /* Alamofire */; }; + 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */; }; + 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; @@ -46,6 +49,7 @@ 175190522BCA3EEB0076460A /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; 176A30612BC1C103005C143E /* CustomEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomEnvironment.swift; sourceTree = ""; }; 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreLoginResponse.swift; sourceTree = ""; }; 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewModel.swift; sourceTree = ""; }; B23D44F72BA62C6B00097960 /* OATH.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OATH.swift; sourceTree = ""; }; B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassAccountSettings.swift; sourceTree = ""; }; @@ -60,7 +64,6 @@ B253F1D42B83942B00D048F9 /* Crypto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Crypto.swift; sourceTree = ""; }; B253F1D52B83942B00D048F9 /* LibrePassCipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassCipher.swift; sourceTree = ""; }; B253F1D62B83942B00D048F9 /* LibrePassEncryptedCipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassEncryptedCipher.swift; sourceTree = ""; }; - B253F1E22B8394EE00D048F9 /* LibrePass-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "LibrePass-Bridging-Header.h"; sourceTree = ""; }; B253F1E32B83976900D048F9 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassRegistrationWindow.swift; sourceTree = ""; }; B28808902B9254E300A526C6 /* PasswordGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordGenerator.swift; sourceTree = ""; }; @@ -78,6 +81,8 @@ buildActionMask = 2147483647; files = ( 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */, + 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */, + 177B62CC2BCB14DF003EBC65 /* Alamofire in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -150,6 +155,7 @@ isa = PBXGroup; children = ( 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */, + 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */, ); path = ViewModel; sourceTree = ""; @@ -190,14 +196,13 @@ B2D91A172B8393C60004561A /* LibrePass */ = { isa = PBXGroup; children = ( - 1742993D2BC9D070008B639D /* Configs */, B2D444772B87CFF00031A685 /* API */, 179E98132BC1DAB900D71ACA /* App */, B2D91A1C2B8393C70004561A /* Assets.xcassets */, + 1742993D2BC9D070008B639D /* Configs */, 179E98142BC1DAC200D71ACA /* Core */, 176A30612BC1C103005C143E /* CustomEnvironment.swift */, 176A306A2BC1C8D8005C143E /* Info.plist */, - B253F1E22B8394EE00D048F9 /* LibrePass-Bridging-Header.h */, B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */, B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */, B253F1CD2B83942B00D048F9 /* LibrePassLocalLogin.swift */, @@ -236,6 +241,8 @@ name = LibrePass; packageProductDependencies = ( 174EA0972BC3609E00084D2C /* Argon2Swift */, + 177B62CB2BCB14DF003EBC65 /* Alamofire */, + 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */, ); productName = LibrePass; productReference = B2D91A152B8393C60004561A /* LibrePass.app */; @@ -268,6 +275,7 @@ mainGroup = B2D91A0C2B8393C60004561A; packageReferences = ( 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */, + 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */, ); productRefGroup = B2D91A162B8393C60004561A /* Products */; projectDirPath = ""; @@ -298,6 +306,7 @@ files = ( B253F1E02B83942B00D048F9 /* LibrePassCipher.swift in Sources */, B28808912B9254E300A526C6 /* PasswordGenerator.swift in Sources */, + 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */, B2DD90712B8D10D4003D84B7 /* NetworkMonitor.swift in Sources */, B253F1DC2B83942B00D048F9 /* LibrePassAPI.swift in Sources */, B253F1D92B83942B00D048F9 /* LibrePassLoginWindow.swift in Sources */, @@ -419,7 +428,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -427,7 +436,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "LibrePass/LibrePass-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = "Debug(Prod)"; }; @@ -517,14 +526,14 @@ PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "LibrePass/LibrePass-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = "Release(Prod)"; }; @@ -678,7 +687,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -686,7 +695,7 @@ SWIFT_OBJC_BRIDGING_HEADER = "LibrePass/LibrePass-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = "Debug(Dev)"; }; @@ -719,14 +728,14 @@ PRODUCT_BUNDLE_IDENTIFIER = com.github.zapomnij.LibrePass; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "LibrePass/LibrePass-Bridging-Header.h"; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 1; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = "Release(Dev)"; }; @@ -766,6 +775,14 @@ kind = branch; }; }; + 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/Alamofire/Alamofire"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.9.1; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -774,6 +791,16 @@ package = 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */; productName = Argon2Swift; }; + 177B62CB2BCB14DF003EBC65 /* Alamofire */ = { + isa = XCSwiftPackageProductDependency; + package = 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */; + productName = Alamofire; + }; + 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */ = { + isa = XCSwiftPackageProductDependency; + package = 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */; + productName = AlamofireDynamic; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = B2D91A0D2B8393C60004561A /* Project object */; diff --git a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 4cb9ee5..184ef33 100644 --- a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,6 +1,15 @@ { - "originHash" : "0e4ca2d36a723429907d5539d00f81a1320cc1f47a0249422d8645788a93eb20", + "originHash" : "c09224b781d411647d4f31c8630bea423daf9dad1adcd3457e33fc3847a9fcbd", "pins" : [ + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire", + "state" : { + "revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a", + "version" : "5.9.1" + } + }, { "identity" : "argon2swift", "kind" : "remoteSourceControl", diff --git a/LibrePass/App/LibrePassApp.swift b/LibrePass/App/LibrePassApp.swift index 3fd61b3..837bdc8 100644 --- a/LibrePass/App/LibrePassApp.swift +++ b/LibrePass/App/LibrePassApp.swift @@ -10,9 +10,12 @@ import SwiftUI @main struct LibrePassApp: App { + @StateObject var authViewModel = AuthViewModel() + var body: some Scene { WindowGroup { ContentView() + .environmentObject(authViewModel) } } } diff --git a/LibrePass/Configs/Dev.xcconfig b/LibrePass/Configs/Dev.xcconfig index 29ce9ef..57b36eb 100644 --- a/LibrePass/Configs/Dev.xcconfig +++ b/LibrePass/Configs/Dev.xcconfig @@ -8,4 +8,4 @@ // Configuration settings file format documentation can be found at: // https://help.apple.com/xcode/#/dev745c5c974 -ROOT_URL=https:/$()/api.test.librepass.medzik.dev +ROOT_URL=https:/$()/localhost:8080 diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift index 8e0cba4..8df0028 100644 --- a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -6,6 +6,9 @@ // import Foundation +import Argon2Swift +import Alamofire +import CryptoKit protocol AuthenticationFormProtocol { var formIsValid: Bool { get } @@ -13,31 +16,65 @@ protocol AuthenticationFormProtocol { class AuthViewModel: ObservableObject { @Published var isLoggedIn = false -// -// @State var lClient: LibrePassClient = LibrePassClient(apiUrl: "") -// -// @State var localLogIn = false -// @State var loggedIn = false - -// HStack { -// if self.loggedIn { -// LibrePassManagerWindow(lClient: $lClient, loggedIn: $loggedIn, locallyLoggedIn: $localLogIn) -// } else if self.localLogIn { -// LibrePassLocalLogin(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn) -// } else { -// NavigationView { -// List { -// NavigationLink(destination: LibrePassLoginWindow(lClient: $lClient, loggedIn: $loggedIn, localLogIn: $localLogIn)) { -// Text("Log in") -// } -// NavigationLink(destination: LibrePassRegistrationWindow(lClient: $lClient)) { -// Text("Register") -// } -// } -// -// .navigationTitle("Welcome to LibrePass!") -// } - -// .onAppear { -// self.localLogIn = LibrePassCredentialsDatabase.isLocallyLoggedIn() + + + func signIn(withEmail email: String, password: String) async throws { + do { + let credentials = try await login(withEmail: email, password: password) + + } catch { + print("Debug: Failed to signIn with error: \(error.localizedDescription)") + } + } + + private func preLogin(email: String) async throws -> PreLoginResponse { + let endpoint = "/preLogin" + let parameters: [String: Any] = [ + "email" : email + ] + + return try await withCheckedThrowingContinuation { continuation in + AF.request(CustomEnvironment.rootURL + endpoint, parameters: parameters) + .responseDecodable(of: PreLoginResponse.self) { response in + switch response.result { + case let .success(data): + continuation.resume(returning: data) + case let .failure(error): + continuation.resume(throwing: error) + } + } + } + } + + private func login(withEmail email: String, password: String) async throws { + let preLoginData = try await preLogin(email: email) + + let passwordHash = try Argon2Swift.hashPasswordBytes( + password: password.data(using: .utf8)!, + salt: Salt(bytes: email.data(using: .utf8)!), + iterations: preLoginData.iterations, + memory: preLoginData.memory, + parallelism: preLoginData.parallelism, + type: .id, + version: .V13 + ) + + let serverPublicKey = try Curve25519.KeyAgreement.PublicKey(rawRepresentation: preLoginData.serverPublicKey.data(using: .utf8)!) + let privateKey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: passwordHash.hashData()) + let sharedSecretKey = try privateKey.sharedSecretFromKeyAgreement(with: serverPublicKey) + + } + + + + + // + // func createUser(withEmail email: String, password: String, fullname: String) async throws { + // do { + // + // + // } catch { + // print("DEBUG: Failed to create user with error: \(error.localizedDescription)") + // } + // } } diff --git a/LibrePass/Core/Auth/ViewModel/PreLoginResponse.swift b/LibrePass/Core/Auth/ViewModel/PreLoginResponse.swift new file mode 100644 index 0000000..1b42906 --- /dev/null +++ b/LibrePass/Core/Auth/ViewModel/PreLoginResponse.swift @@ -0,0 +1,15 @@ +// +// PreLoginResponse.swift +// LibrePass +// +// Created by Nish on 2024-04-13. +// + +import Argon2Swift + +struct PreLoginResponse: Decodable { + let parallelism: Int + let memory: Int + let iterations: Int + let serverPublicKey: String +} diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift index 7cbdb80..38209e1 100644 --- a/LibrePass/Core/Auth/Views/LoginView.swift +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -10,7 +10,7 @@ import SwiftUI struct LoginView: View { @State private var email = "" @State private var password = "" - @EnvironmentObject var viewModel: AuthViewModel + @EnvironmentObject var authViewModel: AuthViewModel var body: some View { NavigationStack { @@ -35,7 +35,7 @@ struct LoginView: View { Button { Task { -// try await viewModel.signIn(withEmail: email, password: password) + try await authViewModel.signIn(withEmail: email, password: password) } } label: { HStack { @@ -54,7 +54,6 @@ struct LoginView: View { NavigationLink { SignupView() - .navigationBarBackButtonHidden(true) } label: { HStack(spacing: 2) { Text("Don't have an account?") @@ -91,4 +90,5 @@ enum AppIconProvider { #Preview { LoginView() + .environmentObject(AuthViewModel()) } diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift index 9e5cf86..e641c4c 100644 --- a/LibrePass/Core/Auth/Views/SignupView.swift +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -16,7 +16,7 @@ struct SignupView: View { @State private var server = CustomEnvironment.rootURL @State private var showSelfHostedView = false @Environment(\.dismiss) var dismiss - @EnvironmentObject var viewModel: AuthViewModel + @EnvironmentObject var authViewModel: AuthViewModel var body: some View { @@ -109,6 +109,7 @@ struct SignupView: View { } .padding() } + .navigationTitle("Register") .sheet(isPresented: $showSelfHostedView) { NavigationStack { ServerURLView(serverURL: $server, isPresented: $showSelfHostedView) From 5ba71e8590e40c2d817f57c0639993bf7bf2d473 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Mon, 15 Apr 2024 17:58:02 -0500 Subject: [PATCH 10/21] Authentication works for login and signing up a user At this stage, added the logic to call the rest endpoints for register, preLogin and oauth and save the key into keychain. However, left with saving the credentials into db using swiftData --- LibrePass.xcodeproj/project.pbxproj | 55 +++- .../xcshareddata/swiftpm/Package.resolved | 11 +- LibrePass/App/LibrePassApp.swift | 11 +- LibrePass/Configs/Dev.xcconfig | 2 +- LibrePass/Core/Auth/Model/Credentials.swift | 46 ++++ LibrePass/Core/Auth/Model/LoginRequest.swift | 13 + .../PreLoginResponse.swift | 0 .../Core/Auth/Model/RegisterRequest.swift | 18 ++ .../Auth/Model/UserCredentialResponse.swift | 14 + .../Core/Auth/ViewModel/AuthViewModel.swift | 256 ++++++++++++++++-- LibrePass/Core/Auth/Views/LoginView.swift | 62 ++++- LibrePass/Core/Auth/Views/SignupView.swift | 3 +- LibrePass/Info.plist | 2 - 13 files changed, 456 insertions(+), 37 deletions(-) create mode 100644 LibrePass/Core/Auth/Model/Credentials.swift create mode 100644 LibrePass/Core/Auth/Model/LoginRequest.swift rename LibrePass/Core/Auth/{ViewModel => Model}/PreLoginResponse.swift (100%) create mode 100644 LibrePass/Core/Auth/Model/RegisterRequest.swift create mode 100644 LibrePass/Core/Auth/Model/UserCredentialResponse.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 73a2b71..13c44af 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -17,6 +17,11 @@ 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */; }; 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; + 17B4516B2BCC6E1C00C5E1AE /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */; }; + 17B4516D2BCC832900C5E1AE /* UserCredentialResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B4516C2BCC832900C5E1AE /* UserCredentialResponse.swift */; }; + 17B4516F2BCC8CE600C5E1AE /* LoginRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B4516E2BCC8CE600C5E1AE /* LoginRequest.swift */; }; + 17B451722BCD866900C5E1AE /* RegisterRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B451712BCD866900C5E1AE /* RegisterRequest.swift */; }; + 17B451742BCDB90B00C5E1AE /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B451732BCDB90B00C5E1AE /* Credentials.swift */; }; B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; B253F1D72B83942B00D048F9 /* LibrePassCipherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */; }; @@ -51,6 +56,10 @@ 176A306A2BC1C8D8005C143E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreLoginResponse.swift; sourceTree = ""; }; 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthViewModel.swift; sourceTree = ""; }; + 17B4516C2BCC832900C5E1AE /* UserCredentialResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserCredentialResponse.swift; sourceTree = ""; }; + 17B4516E2BCC8CE600C5E1AE /* LoginRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginRequest.swift; sourceTree = ""; }; + 17B451712BCD866900C5E1AE /* RegisterRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterRequest.swift; sourceTree = ""; }; + 17B451732BCDB90B00C5E1AE /* Credentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Credentials.swift; sourceTree = ""; }; B23D44F72BA62C6B00097960 /* OATH.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OATH.swift; sourceTree = ""; }; B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassAccountSettings.swift; sourceTree = ""; }; B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassCipherView.swift; sourceTree = ""; }; @@ -82,6 +91,7 @@ files = ( 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */, 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */, + 17B4516B2BCC6E1C00C5E1AE /* KeychainSwift in Frameworks */, 177B62CC2BCB14DF003EBC65 /* Alamofire in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -136,6 +146,7 @@ 179E98182BC1DCEC00D71ACA /* Auth */ = { isa = PBXGroup; children = ( + 17B451702BCD847D00C5E1AE /* Model */, 179E981A2BC1DD2000D71ACA /* ViewModel */, 179E98192BC1DD1A00D71ACA /* Views */, ); @@ -155,11 +166,22 @@ isa = PBXGroup; children = ( 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */, - 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */, ); path = ViewModel; sourceTree = ""; }; + 17B451702BCD847D00C5E1AE /* Model */ = { + isa = PBXGroup; + children = ( + 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */, + 17B4516C2BCC832900C5E1AE /* UserCredentialResponse.swift */, + 17B4516E2BCC8CE600C5E1AE /* LoginRequest.swift */, + 17B451712BCD866900C5E1AE /* RegisterRequest.swift */, + 17B451732BCDB90B00C5E1AE /* Credentials.swift */, + ); + path = Model; + sourceTree = ""; + }; B2D444772B87CFF00031A685 /* API */ = { isa = PBXGroup; children = ( @@ -243,6 +265,7 @@ 174EA0972BC3609E00084D2C /* Argon2Swift */, 177B62CB2BCB14DF003EBC65 /* Alamofire */, 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */, + 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */, ); productName = LibrePass; productReference = B2D91A152B8393C60004561A /* LibrePass.app */; @@ -276,6 +299,7 @@ packageReferences = ( 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */, 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */, + 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */, ); productRefGroup = B2D91A162B8393C60004561A /* Products */; projectDirPath = ""; @@ -304,8 +328,10 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 17B4516F2BCC8CE600C5E1AE /* LoginRequest.swift in Sources */, B253F1E02B83942B00D048F9 /* LibrePassCipher.swift in Sources */, B28808912B9254E300A526C6 /* PasswordGenerator.swift in Sources */, + 17B451742BCDB90B00C5E1AE /* Credentials.swift in Sources */, 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */, B2DD90712B8D10D4003D84B7 /* NetworkMonitor.swift in Sources */, B253F1DC2B83942B00D048F9 /* LibrePassAPI.swift in Sources */, @@ -316,10 +342,12 @@ 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */, B2D4447B2B87D0DF0031A685 /* Vault.swift in Sources */, B2780F062B8A43C200835EE3 /* LibrePassRegistrationWindow.swift in Sources */, + 17B4516D2BCC832900C5E1AE /* UserCredentialResponse.swift in Sources */, B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */, B28E06202B8BBD1900F48661 /* Utils.swift in Sources */, B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */, 17349C0D2BC1E19D00452814 /* ContentView.swift in Sources */, + 17B451722BCD866900C5E1AE /* RegisterRequest.swift in Sources */, B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */, 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */, @@ -414,12 +442,13 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = LibrePass/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_NSFaceIDUsageDescription = "We need you unlock your data."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -512,12 +541,13 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = LibrePass/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_NSFaceIDUsageDescription = "We need you unlock your data."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -673,12 +703,13 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = LibrePass/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_NSFaceIDUsageDescription = "We need you unlock your data."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -714,12 +745,13 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = LibrePass/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_NSFaceIDUsageDescription = "We need you unlock your data."; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 16.0; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -783,6 +815,14 @@ minimumVersion = 5.9.1; }; }; + 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/evgenyneu/keychain-swift"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 22.0.0; + }; + }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -801,6 +841,11 @@ package = 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */; productName = AlamofireDynamic; }; + 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */; + productName = KeychainSwift; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = B2D91A0D2B8393C60004561A /* Project object */; diff --git a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 184ef33..07efcad 100644 --- a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "c09224b781d411647d4f31c8630bea423daf9dad1adcd3457e33fc3847a9fcbd", + "originHash" : "d79071d8e42f5f73fb37c202e359f0f236e869e1a14ab406e5a15af3a5306cfb", "pins" : [ { "identity" : "alamofire", @@ -19,6 +19,15 @@ "revision" : "53543623fefe68461b7eeea03d7f96677c2fd76d" } }, + { + "identity" : "keychain-swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/evgenyneu/keychain-swift", + "state" : { + "revision" : "75677d8be3c50898c8ffd0d107f88aa2740301fc", + "version" : "22.0.0" + } + }, { "identity" : "phc-winner-argon2", "kind" : "remoteSourceControl", diff --git a/LibrePass/App/LibrePassApp.swift b/LibrePass/App/LibrePassApp.swift index 837bdc8..f77745a 100644 --- a/LibrePass/App/LibrePassApp.swift +++ b/LibrePass/App/LibrePassApp.swift @@ -6,16 +6,25 @@ // import SwiftUI +import SwiftData +import KeychainSwift @main struct LibrePassApp: App { - + let keychain = KeychainSwift() @StateObject var authViewModel = AuthViewModel() var body: some Scene { WindowGroup { ContentView() .environmentObject(authViewModel) + .modelContainer(for: Credentials.self) } } + + +} + +class KeychainManager { + static let shared = KeychainSwift() } diff --git a/LibrePass/Configs/Dev.xcconfig b/LibrePass/Configs/Dev.xcconfig index 57b36eb..26c1be0 100644 --- a/LibrePass/Configs/Dev.xcconfig +++ b/LibrePass/Configs/Dev.xcconfig @@ -8,4 +8,4 @@ // Configuration settings file format documentation can be found at: // https://help.apple.com/xcode/#/dev745c5c974 -ROOT_URL=https:/$()/localhost:8080 +ROOT_URL=http:/$()/localhost:8080 diff --git a/LibrePass/Core/Auth/Model/Credentials.swift b/LibrePass/Core/Auth/Model/Credentials.swift new file mode 100644 index 0000000..02b6916 --- /dev/null +++ b/LibrePass/Core/Auth/Model/Credentials.swift @@ -0,0 +1,46 @@ +// +// Credentials.swift +// LibrePass +// +// Created by Nish on 2024-04-15. +// + +import Foundation +import SwiftData + +@Model +class Credentials { + @Attribute(.unique) var userId: UUID + var email: String + var apiUrl: String? + var apiKey: String + var publicKey: String + var lastSync: Int64? + var memory: Int + var iterations: Int + var parallelism: Int + + init( + userId: UUID, + email: String, + apiUrl: String? = nil, + apiKey: String, + publicKey: String, + lastSync: Int64? = nil, + memory: Int, + iterations: Int, + parallelism: Int + ) { + self.userId = userId + self.email = email + self.apiUrl = apiUrl + self.apiKey = apiKey + self.publicKey = publicKey + self.lastSync = lastSync + self.memory = memory + self.iterations = iterations + self.parallelism = parallelism + } + +} + diff --git a/LibrePass/Core/Auth/Model/LoginRequest.swift b/LibrePass/Core/Auth/Model/LoginRequest.swift new file mode 100644 index 0000000..e4899fe --- /dev/null +++ b/LibrePass/Core/Auth/Model/LoginRequest.swift @@ -0,0 +1,13 @@ +// +// LoginRequest.swift +// LibrePass +// +// Created by Nish on 2024-04-14. +// + +import Foundation + +struct LoginRequest: Codable { + let email: String + let sharedKey: String +} diff --git a/LibrePass/Core/Auth/ViewModel/PreLoginResponse.swift b/LibrePass/Core/Auth/Model/PreLoginResponse.swift similarity index 100% rename from LibrePass/Core/Auth/ViewModel/PreLoginResponse.swift rename to LibrePass/Core/Auth/Model/PreLoginResponse.swift diff --git a/LibrePass/Core/Auth/Model/RegisterRequest.swift b/LibrePass/Core/Auth/Model/RegisterRequest.swift new file mode 100644 index 0000000..c6f4d4d --- /dev/null +++ b/LibrePass/Core/Auth/Model/RegisterRequest.swift @@ -0,0 +1,18 @@ +// +// RegisterRequest.swift +// LibrePass +// +// Created by Nish on 2024-04-15. +// + +import Foundation + +struct RegisterRequest: Codable { + let email: String + let passwordHint: String? + let sharedKey: String + let parallelism: Int + let memory: Int + let iterations: Int + let publicKey: String +} diff --git a/LibrePass/Core/Auth/Model/UserCredentialResponse.swift b/LibrePass/Core/Auth/Model/UserCredentialResponse.swift new file mode 100644 index 0000000..e3cb892 --- /dev/null +++ b/LibrePass/Core/Auth/Model/UserCredentialResponse.swift @@ -0,0 +1,14 @@ +// +// UserCredentialResponse.swift +// LibrePass +// +// Created by Nish on 2024-04-14. +// + +import Foundation + +class UserCredentialResponse: Decodable { + let userId: UUID + let apiKey: String + let verified: Bool +} diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift index 8df0028..ec8524b 100644 --- a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -6,9 +6,11 @@ // import Foundation +import CryptoKit import Argon2Swift import Alamofire -import CryptoKit +import KeychainSwift +import LocalAuthentication protocol AuthenticationFormProtocol { var formIsValid: Bool { get } @@ -16,25 +18,96 @@ protocol AuthenticationFormProtocol { class AuthViewModel: ObservableObject { @Published var isLoggedIn = false + let endpoint = "/api/auth" func signIn(withEmail email: String, password: String) async throws { do { - let credentials = try await login(withEmail: email, password: password) + _ = try await login(withEmail: email, password: password) } catch { print("Debug: Failed to signIn with error: \(error.localizedDescription)") } } + func signUp(withEmail email: String, password: String) async throws { + do { + let preLoginData = try await preLogin(email: "") + + let passwordHash = try Argon2Swift.hashPasswordBytes( + password: password.data(using: .utf8)!, + salt: Salt(bytes: email.data(using: .utf8)!), + iterations: preLoginData.iterations, + memory: preLoginData.memory, + parallelism: preLoginData.parallelism, + type: .id, + version: .V13 + ) + + let serverPublicKeyHex = Data(preLoginData.serverPublicKey.hexToBytes()!) + let serverPublicKey = try Curve25519.KeyAgreement.PublicKey(rawRepresentation: serverPublicKeyHex) + KeychainManager.shared.set(serverPublicKey.rawRepresentation, forKey: "serverPublicKey") + + let privateKey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: passwordHash.hashData()) + KeychainManager.shared.set(privateKey.rawRepresentation, forKey: "userPrivateKey") + + let sharedSecretKey = try privateKey.sharedSecretFromKeyAgreement(with: serverPublicKey) + let sharedSecretKeyHex = sharedSecretKey.withUnsafeBytes { bytes in + return Data(bytes).map { String(format: "%02hhx", $0) }.joined() + } + + let body = try JSONEncoder().encode(RegisterRequest( + email: email, + passwordHint: "", + sharedKey: sharedSecretKeyHex, + parallelism: preLoginData.parallelism, + memory: preLoginData.memory, + iterations: preLoginData.iterations, + publicKey: privateKey.publicKey.rawRepresentation.map { String(format: "%02hhx", $0) }.joined() + )) + + let url = URL(string: CustomEnvironment.rootURL + endpoint + "/register")! + var urlRequest = URLRequest(url: url) + urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") + urlRequest.httpMethod = "POST" + urlRequest.httpBody = body + + let (data, response) = try await URLSession.shared.data(for: urlRequest) + + guard let response = response as? HTTPURLResponse else { + throw NetworkError.invalidResponse + } + + guard (200...299).contains(response.statusCode) else { + throw NetworkError.statusCode(response.statusCode) + } + + do { + let resp = try JSONDecoder().decode(UserCredentialResponse.self, from: data) + } catch { + throw NetworkError.decodingError(error) + } + + + + + + } catch { + print("Debug: Failed to sigup with error: \(error.localizedDescription)") + } + } + private func preLogin(email: String) async throws -> PreLoginResponse { - let endpoint = "/preLogin" let parameters: [String: Any] = [ "email" : email ] + let headers: HTTPHeaders = [ + "Accept": "application/json" + ] + return try await withCheckedThrowingContinuation { continuation in - AF.request(CustomEnvironment.rootURL + endpoint, parameters: parameters) + AF.request(CustomEnvironment.rootURL + endpoint + "/preLogin", method: .get, parameters: parameters, headers: headers) .responseDecodable(of: PreLoginResponse.self) { response in switch response.result { case let .success(data): @@ -46,6 +119,8 @@ class AuthViewModel: ObservableObject { } } + + private func login(withEmail email: String, password: String) async throws { let preLoginData = try await preLogin(email: email) @@ -59,22 +134,171 @@ class AuthViewModel: ObservableObject { version: .V13 ) - let serverPublicKey = try Curve25519.KeyAgreement.PublicKey(rawRepresentation: preLoginData.serverPublicKey.data(using: .utf8)!) + let serverPublicKeyHex = Data(preLoginData.serverPublicKey.hexToBytes()!) + let serverPublicKey = try Curve25519.KeyAgreement.PublicKey(rawRepresentation: serverPublicKeyHex) + //check if there's an existing key in keychain + KeychainManager.shared.set(serverPublicKey.rawRepresentation, forKey: "serverPublicKey") + let privateKey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: passwordHash.hashData()) + KeychainManager.shared.set(privateKey.rawRepresentation, forKey: "userPrivateKey") + let sharedSecretKey = try privateKey.sharedSecretFromKeyAgreement(with: serverPublicKey) - + let sharedSecretKeyHex = sharedSecretKey.withUnsafeBytes { bytes in + return Data(bytes).map { String(format: "%02hhx", $0) }.joined() + } + + let body = try JSONEncoder().encode(LoginRequest(email: email, sharedKey: sharedSecretKeyHex)) + + let url = URL(string: CustomEnvironment.rootURL + endpoint + "/oauth?grantType=login")! + var urlRequest = URLRequest(url: url) + urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type") + urlRequest.httpMethod = "POST" + urlRequest.httpBody = body + + let (data, response) = try await URLSession.shared.data(for: urlRequest) + + guard let response = response as? HTTPURLResponse else { + throw NetworkError.invalidResponse + } + + guard (200...299).contains(response.statusCode) else { + throw NetworkError.statusCode(response.statusCode) + } + + do { + let resp = try JSONDecoder().decode(UserCredentialResponse.self, from: data) + } catch { + throw NetworkError.decodingError(error) + } + + self.isLoggedIn = true + + // let aesKey = try privateKey.sharedSecretFromKeyAgreement(with: privateKey.publicKey) + + } + func biometricType() -> BiometricType { + let authContext = LAContext() + let _ = authContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) + switch authContext.biometryType { + case .none: + return .none + case .touchID: + return .touch + case .faceID: + return .face + case .opticID: + return .optic + @unknown default: + return .none + } + } + + enum BiometricType { + case none + case face + case touch + case optic + } + func requestBiometricUnlock(completion: @escaping (Result) -> Void) { + let credentials: Credentials? = nil + + guard let credentials = credentials else { + completion(.failure(.credentialsNotSaved)) + return + } + + let context = LAContext() + var error: NSError? + let canEvalute = context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) + if let error = error { + switch error.code { + case -6: + completion(.failure(.deniedAccess)) + case -7: + if context.biometryType == .faceID { + completion(.failure(.noFaceIdEnrolled)) + } else { + completion(.failure(.noFingerprintEnrolled)) + } + default: + completion(.failure(.biometricError)) + } + return + } + + if canEvalute { + if context.biometryType != .none { + context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: "Need access to credentials.") { + success, error in + DispatchQueue.main.async { + if error != nil { + completion(.failure(.biometricError)) + } else { + completion(.success(credentials)) + } + } + } + } + } + } - - // - // func createUser(withEmail email: String, password: String, fullname: String) async throws { - // do { - // - // - // } catch { - // print("DEBUG: Failed to create user with error: \(error.localizedDescription)") - // } - // } + enum NetworkError: Error { + case invalidResponse + case statusCode(Int) + case decodingError(Error) + + var id: String { + self.localizedDescription + } + + // var errorDescription: String? { + // + // } + } + + enum AuthenticationError: Error, LocalizedError, Identifiable { + case invalidCredentials + case deniedAccess + case noFaceIdEnrolled + case noFingerprintEnrolled + case biometricError + case credentialsNotSaved + + var id: String { + self.localizedDescription + } + + var errorDescription: String? { + switch self { + case .invalidCredentials: + return NSLocalizedString("Either your email or password are incorrect. Please try again.", comment: "") + case .deniedAccess: + return NSLocalizedString("You have denied access. Please go to settings app and located this application and turn on Face ID.", comment: "") + case .noFaceIdEnrolled: + return NSLocalizedString("You have not registered any Face ID yet.", comment: "") + case .noFingerprintEnrolled: + return NSLocalizedString("You have not registered any fingerprint yet.", comment: "") + case .biometricError: + return NSLocalizedString("Your face or fingerprint were not recognized.", comment: "") + case .credentialsNotSaved: + return NSLocalizedString("You credentials have not been saved. Do you want to save them after the next successful login?", comment: "") + } + } + } +} + +extension String { + func hexToBytes() -> [UInt8]? { + var startIndex = self.startIndex + return (0..) in + switch result { + case .success(let credentials): + <#code#> + case .failure(let error): + <#code#> + } - NavigationLink { - SignupView() - } label: { - HStack(spacing: 2) { - Text("Don't have an account?") - Text("Sign up") - .fontWeight(.bold) + } label: { + Image(systemName: authViewModel.biometricType() == .face ? "faceid" : "touchid") + .resizable() + .frame(width: 50, height: 50) + .padding() + } + } + + NavigationLink { + SignupView() + } label: { + HStack(spacing: 2) { + Text("Don't have an account?") + Text("Sign up") + .fontWeight(.bold) + } + .font(.system(size: 16)) } - .font(.system(size: 16)) + .padding() } - .padding() + .sheet(isPresented: $showSelfHostedView) { + NavigationStack { + ServerURLView(serverURL: $server, isPresented: $showSelfHostedView) + } + } } } } diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift index e641c4c..5324cf2 100644 --- a/LibrePass/Core/Auth/Views/SignupView.swift +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -78,7 +78,7 @@ struct SignupView: View { Button { Task { - + try await authViewModel.signUp(withEmail: email, password: password) } } label: { HStack { @@ -125,7 +125,6 @@ extension SignupView: AuthenticationFormProtocol { && !password.isEmpty && confirmPassword == password && password.count > 7 - && !fullname.isEmpty } } diff --git a/LibrePass/Info.plist b/LibrePass/Info.plist index f2b5544..ae847ca 100644 --- a/LibrePass/Info.plist +++ b/LibrePass/Info.plist @@ -4,7 +4,5 @@ ROOT_URL ${ROOT_URL} - - From 07b84714132531f91ee43bc90b2240bd168ddc0f Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Mon, 15 Apr 2024 23:33:30 -0500 Subject: [PATCH 11/21] Added TouchID and FaceID logic to login view At this stage we could you use to login via local authentication into the app, though a small issue is left on how to store the credentials. The functionality is working... --- .../Core/Auth/ViewModel/AuthViewModel.swift | 15 ++++- LibrePass/Core/Auth/Views/LoginView.swift | 61 +++++++++++-------- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift index ec8524b..34d6f93 100644 --- a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -18,6 +18,8 @@ protocol AuthenticationFormProtocol { class AuthViewModel: ObservableObject { @Published var isLoggedIn = false + @Published var error: AuthenticationError? + let endpoint = "/api/auth" @@ -119,8 +121,6 @@ class AuthViewModel: ObservableObject { } } - - private func login(withEmail email: String, password: String) async throws { let preLoginData = try await preLogin(email: email) @@ -204,7 +204,16 @@ class AuthViewModel: ObservableObject { func requestBiometricUnlock(completion: @escaping (Result) -> Void) { let credentials: Credentials? = nil - +// let credentials: Credentials? = Credentials( +// userId: UUID(), +// email: "test", +// apiKey: "apikey", +// publicKey: "publickey", +// memory: 64950, +// iterations: 3, +// parallelism: 3 +// ) + guard let credentials = credentials else { completion(.failure(.credentialsNotSaved)) return diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift index f1b4f15..7a90ab1 100644 --- a/LibrePass/Core/Auth/Views/LoginView.swift +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -74,39 +74,52 @@ struct LoginView: View { if authViewModel.biometricType() != .none { Button { - authViewModel.requestBiometricUnlock { (result: Result) in + authViewModel.requestBiometricUnlock { + (result: Result) in switch result { case .success(let credentials): - <#code#> + authViewModel.isLoggedIn = true case .failure(let error): - <#code#> + authViewModel.error = error } - - } label: { - Image(systemName: authViewModel.biometricType() == .face ? "faceid" : "touchid") - .resizable() - .frame(width: 50, height: 50) - .padding() } - } - - NavigationLink { - SignupView() } label: { - HStack(spacing: 2) { - Text("Don't have an account?") - Text("Sign up") - .fontWeight(.bold) - } - .font(.system(size: 16)) + Image(systemName: authViewModel.biometricType() == .face ? "faceid" : "touchid") + .resizable() + .frame(width: 50, height: 50) + .padding() } - .padding() } - .sheet(isPresented: $showSelfHostedView) { - NavigationStack { - ServerURLView(serverURL: $server, isPresented: $showSelfHostedView) - } + + + NavigationLink { + SignupView() + } label: { + HStack(spacing: 2) { + Text("Don't have an account?") + Text("Sign up") + .fontWeight(.bold) } + .font(.system(size: 16)) + } + .padding() + } + .alert(item: $authViewModel.error) { error in + if error == .credentialsNotSaved { + return Alert( + title: Text("Credentials Not Saved"), + message: Text(error.localizedDescription), + primaryButton: .default(Text("OK"), action: {}), + secondaryButton: .cancel() + ) + } else { + return Alert(title: Text("Invalid Login"), message: Text(error.localizedDescription)) + } + } + .sheet(isPresented: $showSelfHostedView) { + NavigationStack { + ServerURLView(serverURL: $server, isPresented: $showSelfHostedView) + } } } } From 56e8df9b16028e6d388d238554e80467d0d59af5 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Tue, 16 Apr 2024 09:07:45 -0500 Subject: [PATCH 12/21] Fix - Picker Options shown correctly when state changes --- .../Core/Auth/ViewModel/AuthViewModel.swift | 5 +++ LibrePass/Core/Auth/Views/LoginView.swift | 27 +++++++++------ LibrePass/Core/Auth/Views/SignupView.swift | 34 +++++++++++++------ 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift index 34d6f93..9f21f48 100644 --- a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -18,6 +18,7 @@ protocol AuthenticationFormProtocol { class AuthViewModel: ObservableObject { @Published var isLoggedIn = false + @Published var isValidated = false @Published var error: AuthenticationError? let endpoint = "/api/auth" @@ -297,6 +298,10 @@ class AuthViewModel: ObservableObject { } } } + + func updateValidation(success: Bool) { + isValidated = success + } } extension String { diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift index 7a90ab1..5a99c3f 100644 --- a/LibrePass/Core/Auth/Views/LoginView.swift +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -10,8 +10,10 @@ import SwiftUI struct LoginView: View { @State private var email = "" @State private var password = "" - @State private var server = CustomEnvironment.rootURL - @State private var showSelfHostedView = false + @State private var customServerURL = "" + @State private var isShowingCustomURLSheet = false + @State private var selectedServerType: ServerType = .official + @EnvironmentObject var authViewModel: AuthViewModel var body: some View { @@ -37,15 +39,18 @@ struct LoginView: View { Spacer() - Picker("Server Address", selection: $server) { - Text("Official").tag(CustomEnvironment.rootURL) - Text("Self-Hosted").tag("") + Picker("Server Type", selection: $selectedServerType) { + Text("Official").tag(ServerType.official) + Text("Self-Hosted").tag(ServerType.selfHosted) } - .onChange(of: server) { newState in - if newState == "" { - showSelfHostedView = true + .padding() + .onChange(of: selectedServerType) { oldValue, newValue in + if newValue == .selfHosted { + isShowingCustomURLSheet = true + } else { + isShowingCustomURLSheet = false } - } + } } } .padding(.horizontal) @@ -116,9 +121,9 @@ struct LoginView: View { return Alert(title: Text("Invalid Login"), message: Text(error.localizedDescription)) } } - .sheet(isPresented: $showSelfHostedView) { + .sheet(isPresented: $isShowingCustomURLSheet) { NavigationStack { - ServerURLView(serverURL: $server, isPresented: $showSelfHostedView) + ServerURLView(serverURL: $customServerURL, isPresented: $isShowingCustomURLSheet) } } } diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift index 5324cf2..358b8af 100644 --- a/LibrePass/Core/Auth/Views/SignupView.swift +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -13,8 +13,10 @@ struct SignupView: View { @State private var fullname = "" @State private var password = "" @State private var confirmPassword = "" - @State private var server = CustomEnvironment.rootURL - @State private var showSelfHostedView = false + @State private var customServerURL = "" + @State private var isShowingCustomURLSheet = false + @State private var selectedServerType: ServerType = .official + @Environment(\.dismiss) var dismiss @EnvironmentObject var authViewModel: AuthViewModel @@ -60,13 +62,17 @@ struct SignupView: View { Spacer() - Picker("Server Address", selection: $server) { - Text("Official").tag(CustomEnvironment.rootURL) - Text("Self-Hosted").tag("") + Picker("Server Type", selection: $selectedServerType) { + Text("Official").tag(ServerType.official) + Text("Self-Hosted").tag(ServerType.selfHosted) } - .onChange(of: server) { newState in - if newState == "" { - showSelfHostedView = true + .padding() + .onChange(of: selectedServerType) { oldValue, newValue in + if newValue == .selfHosted { + isShowingCustomURLSheet = true + } else { + isShowingCustomURLSheet = false + customServerURL = CustomEnvironment.rootURL } } } @@ -110,9 +116,9 @@ struct SignupView: View { .padding() } .navigationTitle("Register") - .sheet(isPresented: $showSelfHostedView) { + .sheet(isPresented: $isShowingCustomURLSheet) { NavigationStack { - ServerURLView(serverURL: $server, isPresented: $showSelfHostedView) + ServerURLView(serverURL: $customServerURL, isPresented: $isShowingCustomURLSheet) } } } @@ -169,13 +175,19 @@ struct ServerURLView: View { } .navigationTitle("Self-Hosted") .navigationBarItems(trailing: Button("Done") { - isPresented.toggle() + UserDefaults.standard.set(serverURL, forKey: "SelfHostedURL") + isPresented = false }) } .background(Color(.systemGray6).ignoresSafeArea()) } } +enum ServerType { + case official + case selfHosted +} + #Preview { SignupView() } From fc982f6e86ea7106efa9cf431b6c1e4d6ec9df42 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Tue, 16 Apr 2024 09:22:42 -0500 Subject: [PATCH 13/21] Removed files that had redundant code --- LibrePass.xcodeproj/project.pbxproj | 8 --- LibrePass/LibrePassLocalLogin.swift | 75 ---------------------------- LibrePass/LibrePassLoginWindow.swift | 48 ------------------ 3 files changed, 131 deletions(-) delete mode 100644 LibrePass/LibrePassLocalLogin.swift delete mode 100644 LibrePass/LibrePassLoginWindow.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 13c44af..84b269d 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -25,8 +25,6 @@ B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; B253F1D72B83942B00D048F9 /* LibrePassCipherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */; }; - B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CD2B83942B00D048F9 /* LibrePassLocalLogin.swift */; }; - B253F1D92B83942B00D048F9 /* LibrePassLoginWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CE2B83942B00D048F9 /* LibrePassLoginWindow.swift */; }; B253F1DA2B83942B00D048F9 /* LibrePassManagerWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CF2B83942B00D048F9 /* LibrePassManagerWindow.swift */; }; B253F1DB2B83942B00D048F9 /* CredentialsDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D02B83942B00D048F9 /* CredentialsDatabase.swift */; }; B253F1DC2B83942B00D048F9 /* LibrePassAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D12B83942B00D048F9 /* LibrePassAPI.swift */; }; @@ -63,8 +61,6 @@ B23D44F72BA62C6B00097960 /* OATH.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OATH.swift; sourceTree = ""; }; B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassAccountSettings.swift; sourceTree = ""; }; B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassCipherView.swift; sourceTree = ""; }; - B253F1CD2B83942B00D048F9 /* LibrePassLocalLogin.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassLocalLogin.swift; sourceTree = ""; }; - B253F1CE2B83942B00D048F9 /* LibrePassLoginWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassLoginWindow.swift; sourceTree = ""; }; B253F1CF2B83942B00D048F9 /* LibrePassManagerWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassManagerWindow.swift; sourceTree = ""; }; B253F1D02B83942B00D048F9 /* CredentialsDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CredentialsDatabase.swift; sourceTree = ""; }; B253F1D12B83942B00D048F9 /* LibrePassAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassAPI.swift; sourceTree = ""; }; @@ -227,8 +223,6 @@ 176A306A2BC1C8D8005C143E /* Info.plist */, B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */, B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */, - B253F1CD2B83942B00D048F9 /* LibrePassLocalLogin.swift */, - B253F1CE2B83942B00D048F9 /* LibrePassLoginWindow.swift */, B253F1CF2B83942B00D048F9 /* LibrePassManagerWindow.swift */, B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */, B2D91A1E2B8393C70004561A /* Preview Content */, @@ -335,7 +329,6 @@ 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */, B2DD90712B8D10D4003D84B7 /* NetworkMonitor.swift in Sources */, B253F1DC2B83942B00D048F9 /* LibrePassAPI.swift in Sources */, - B253F1D92B83942B00D048F9 /* LibrePassLoginWindow.swift in Sources */, B253F1D72B83942B00D048F9 /* LibrePassCipherView.swift in Sources */, B253F1DF2B83942B00D048F9 /* Crypto.swift in Sources */, B253F1DE2B83942B00D048F9 /* ApiClient.swift in Sources */, @@ -345,7 +338,6 @@ 17B4516D2BCC832900C5E1AE /* UserCredentialResponse.swift in Sources */, B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */, B28E06202B8BBD1900F48661 /* Utils.swift in Sources */, - B253F1D82B83942B00D048F9 /* LibrePassLocalLogin.swift in Sources */, 17349C0D2BC1E19D00452814 /* ContentView.swift in Sources */, 17B451722BCD866900C5E1AE /* RegisterRequest.swift in Sources */, B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, diff --git a/LibrePass/LibrePassLocalLogin.swift b/LibrePass/LibrePassLocalLogin.swift deleted file mode 100644 index c329cf9..0000000 --- a/LibrePass/LibrePassLocalLogin.swift +++ /dev/null @@ -1,75 +0,0 @@ -// -// LibrePassLocalLogin.swift -// LibrePass -// -// Created by Zapomnij on 18/02/2024. -// - -import SwiftUI - -struct LibrePassLocalLogin: View { - @Binding var lClient: LibrePassClient - @Binding var loggedIn: Bool - @Binding var localLogIn: Bool - - @State private var password = String() - - @State private var showAlert = false - @State private var errorString = " " - @State private var tokenExpired = false - - var body: some View { - List { - Section(header: Text("Login")) { - SecureField("Password", text: $password) - .autocapitalization(.none) - ButtonWithSpinningWheel(text: "Unlock vault", task: self.login) - } - - Section(header: Text("WARNING! THIS WILL DELETE VAULT SAVED ON THE DISK, but can fix crashes")) { - ButtonWithSpinningWheel(text: "Clear vault", task: self.clearVault, color: Color.red) - } - } - - .alert("Token has expired. You must relogin to use LibrePass", isPresented: self.$tokenExpired) { - Button("OK", role: .cancel) { - self.localLogIn = false - } - } - } - - func clearVault() throws { - if NetworkMonitor.shared.isConnected { - let credentials = try LibrePassCredentialsDatabase.load() - self.lClient = try LibrePassClient(credentials: credentials, password: self.password) - - try self.lClient.fetchCiphers() - - self.lClient.unAuth() - } else { - throw LibrePassApiErrors.WithMessage(message: "Offline clearing vault can't be done") - } - } - - func login() throws { - let credentials = try LibrePassCredentialsDatabase.load() - self.lClient = try LibrePassClient(credentials: credentials, password: self.password) - do { - try self.lClient.syncVault() - } catch ApiClientErrors.StatusCodeNot200(let statusCode, let body) { - self.lClient.unAuth() - if statusCode == 401 && body.error == "InvalidToken" { - self.lClient.logOut() - self.tokenExpired = true - return - } else { - throw ApiClientErrors.StatusCodeNot200(statusCode: statusCode, body: body) - } - } catch { - self.lClient.unAuth() - throw error - } - - self.loggedIn = true - } -} diff --git a/LibrePass/LibrePassLoginWindow.swift b/LibrePass/LibrePassLoginWindow.swift deleted file mode 100644 index 07e1433..0000000 --- a/LibrePass/LibrePassLoginWindow.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// LibrePassLoginWindow.swift -// LibrePass -// -// Created by Zapomnij on 17/02/2024. -// - -import SwiftUI - -struct LibrePassLoginWindow: View { - @Binding var lClient: LibrePassClient - - @State private var email = String() - @State private var password = String() - @State private var apiServer = "https://api.librepass.org" - - @Binding var loggedIn: Bool - @Binding var localLogIn: Bool - - var body: some View { - List { - TextField("Email", text: $email) - .autocapitalization(.none) - SecureField("Password", text: $password) - .autocapitalization(.none) - TextField("API Server", text: $apiServer) - .autocapitalization(.none) - - ButtonWithSpinningWheel(text: "Log in", task: self.login) - } - - .navigationTitle("Log in to LibrePass") - } - - func login() throws { - if self.email.isEmpty || self.password.isEmpty || self.apiServer.isEmpty { - throw LibrePassApiErrors.WithMessage(message: "Empty fields") - } - - lClient.unAuth() - lClient.replaceApiClient(apiUrl: self.apiServer) - - try lClient.login(email: self.email, password: self.password) - try self.lClient.fetchCiphers() - self.loggedIn = true - self.localLogIn = true - } -} From 4349d1b9c85b42cf6ae8859dcf8a595a0e315de8 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Tue, 16 Apr 2024 23:00:34 -0500 Subject: [PATCH 14/21] Fix - Changed the way on how to correctly call icons into the view --- LibrePass/Core/Auth/Views/LoginView.swift | 20 ++++---------------- LibrePass/Core/Auth/Views/SignupView.swift | 9 +++++---- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift index 5a99c3f..3a6a5e2 100644 --- a/LibrePass/Core/Auth/Views/LoginView.swift +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -19,13 +19,12 @@ struct LoginView: View { var body: some View { NavigationStack { VStack { - Image(uiImage: UIImage(named: AppIconProvider.appIcon())!) + Image("Icon") .resizable() - .frame(width: 128, height: 128) + .frame(width: 170, height: 170) .clipShape(RoundedRectangle(cornerRadius: 20)) + .padding() - Text("LibrePass") - .font(.title) VStack(spacing: 24) { InputView(text: $email, title: "Email Address", placeholder: "name@example.com") @@ -96,6 +95,7 @@ struct LoginView: View { } } + Spacer() NavigationLink { SignupView() @@ -138,18 +138,6 @@ extension LoginView: AuthenticationFormProtocol { } } -enum AppIconProvider { - static func appIcon(in bundle: Bundle = .main) -> String { - guard let icons = bundle.object(forInfoDictionaryKey: "CFBundleIcons") as? [String: Any], - let primaryIcon = icons["CFBundlePrimaryIcon"] as? [String: Any], - let iconFiles = primaryIcon["CFBundleIconFiles"] as? [String], - let iconFileName = iconFiles.last else { - fatalError("Could not find icons in bundle") - } - return iconFileName - } -} - #Preview { LoginView() .environmentObject(AuthViewModel()) diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift index 358b8af..9ac8d51 100644 --- a/LibrePass/Core/Auth/Views/SignupView.swift +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -23,13 +23,12 @@ struct SignupView: View { var body: some View { VStack { - Image(uiImage: UIImage(named: AppIconProvider.appIcon())!) + Image("Icon") .resizable() - .frame(width: 128, height: 128) + .frame(width: 170, height: 170) .clipShape(RoundedRectangle(cornerRadius: 20)) + .padding() - Text("LibrePass") - .font(.title) VStack(spacing: 24) { InputView(text: $email, title: "Email Address", placeholder: "name@example.com") @@ -101,6 +100,8 @@ struct SignupView: View { .cornerRadius(10) .padding(.top, 24) + Spacer() + Button { dismiss() From c53a424b685dad31077b5bf50ad58a7ccb1f3889 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Wed, 17 Apr 2024 23:13:45 -0500 Subject: [PATCH 15/21] Fix - Removed all unecessary code --- LibrePass.xcodeproj/project.pbxproj | 64 --- LibrePass/API/ApiClient.swift | 67 ---- LibrePass/API/CredentialsDatabase.swift | 33 -- LibrePass/API/Crypto.swift | 66 ---- LibrePass/API/LibrePassAPI.swift | 356 ----------------- LibrePass/API/LibrePassCipher.swift | 123 ------ LibrePass/API/LibrePassEncryptedCipher.swift | 49 --- LibrePass/API/OATH.swift | 127 ------ LibrePass/API/PasswordGenerator.swift | 71 ---- LibrePass/API/Vault.swift | 89 ----- LibrePass/LibrePassAccountSettings.swift | 101 ----- LibrePass/LibrePassCipherView.swift | 388 ------------------- LibrePass/LibrePassManagerWindow.swift | 148 ------- LibrePass/LibrePassRegistrationWindow.swift | 71 ---- LibrePass/Utils.swift | 135 ------- 15 files changed, 1888 deletions(-) delete mode 100644 LibrePass/API/ApiClient.swift delete mode 100644 LibrePass/API/CredentialsDatabase.swift delete mode 100644 LibrePass/API/Crypto.swift delete mode 100644 LibrePass/API/LibrePassAPI.swift delete mode 100644 LibrePass/API/LibrePassCipher.swift delete mode 100644 LibrePass/API/LibrePassEncryptedCipher.swift delete mode 100644 LibrePass/API/OATH.swift delete mode 100644 LibrePass/API/PasswordGenerator.swift delete mode 100644 LibrePass/API/Vault.swift delete mode 100644 LibrePass/LibrePassAccountSettings.swift delete mode 100644 LibrePass/LibrePassCipherView.swift delete mode 100644 LibrePass/LibrePassManagerWindow.swift delete mode 100644 LibrePass/LibrePassRegistrationWindow.swift delete mode 100644 LibrePass/Utils.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 84b269d..f102143 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -22,22 +22,8 @@ 17B4516F2BCC8CE600C5E1AE /* LoginRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B4516E2BCC8CE600C5E1AE /* LoginRequest.swift */; }; 17B451722BCD866900C5E1AE /* RegisterRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B451712BCD866900C5E1AE /* RegisterRequest.swift */; }; 17B451742BCDB90B00C5E1AE /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B451732BCDB90B00C5E1AE /* Credentials.swift */; }; - B23D44F82BA62C6B00097960 /* OATH.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23D44F72BA62C6B00097960 /* OATH.swift */; }; - B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */; }; - B253F1D72B83942B00D048F9 /* LibrePassCipherView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */; }; - B253F1DA2B83942B00D048F9 /* LibrePassManagerWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1CF2B83942B00D048F9 /* LibrePassManagerWindow.swift */; }; - B253F1DB2B83942B00D048F9 /* CredentialsDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D02B83942B00D048F9 /* CredentialsDatabase.swift */; }; - B253F1DC2B83942B00D048F9 /* LibrePassAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D12B83942B00D048F9 /* LibrePassAPI.swift */; }; B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D22B83942B00D048F9 /* LibrePassApp.swift */; }; - B253F1DE2B83942B00D048F9 /* ApiClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D32B83942B00D048F9 /* ApiClient.swift */; }; - B253F1DF2B83942B00D048F9 /* Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D42B83942B00D048F9 /* Crypto.swift */; }; - B253F1E02B83942B00D048F9 /* LibrePassCipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D52B83942B00D048F9 /* LibrePassCipher.swift */; }; - B253F1E12B83942B00D048F9 /* LibrePassEncryptedCipher.swift in Sources */ = {isa = PBXBuildFile; fileRef = B253F1D62B83942B00D048F9 /* LibrePassEncryptedCipher.swift */; }; B253F1E52B83976900D048F9 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B253F1E32B83976900D048F9 /* LICENSE */; }; - B2780F062B8A43C200835EE3 /* LibrePassRegistrationWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */; }; - B28808912B9254E300A526C6 /* PasswordGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B28808902B9254E300A526C6 /* PasswordGenerator.swift */; }; - B28E06202B8BBD1900F48661 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = B28E061F2B8BBD1900F48661 /* Utils.swift */; }; - B2D4447B2B87D0DF0031A685 /* Vault.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2D4447A2B87D0DF0031A685 /* Vault.swift */; }; B2D91A1D2B8393C70004561A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2D91A1C2B8393C70004561A /* Assets.xcassets */; }; B2D91A202B8393C70004561A /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2D91A1F2B8393C70004561A /* Preview Assets.xcassets */; }; B2DD90712B8D10D4003D84B7 /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */; }; @@ -58,22 +44,8 @@ 17B4516E2BCC8CE600C5E1AE /* LoginRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginRequest.swift; sourceTree = ""; }; 17B451712BCD866900C5E1AE /* RegisterRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RegisterRequest.swift; sourceTree = ""; }; 17B451732BCDB90B00C5E1AE /* Credentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Credentials.swift; sourceTree = ""; }; - B23D44F72BA62C6B00097960 /* OATH.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OATH.swift; sourceTree = ""; }; - B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassAccountSettings.swift; sourceTree = ""; }; - B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassCipherView.swift; sourceTree = ""; }; - B253F1CF2B83942B00D048F9 /* LibrePassManagerWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassManagerWindow.swift; sourceTree = ""; }; - B253F1D02B83942B00D048F9 /* CredentialsDatabase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CredentialsDatabase.swift; sourceTree = ""; }; - B253F1D12B83942B00D048F9 /* LibrePassAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassAPI.swift; sourceTree = ""; }; B253F1D22B83942B00D048F9 /* LibrePassApp.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassApp.swift; sourceTree = ""; }; - B253F1D32B83942B00D048F9 /* ApiClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ApiClient.swift; sourceTree = ""; }; - B253F1D42B83942B00D048F9 /* Crypto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Crypto.swift; sourceTree = ""; }; - B253F1D52B83942B00D048F9 /* LibrePassCipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassCipher.swift; sourceTree = ""; }; - B253F1D62B83942B00D048F9 /* LibrePassEncryptedCipher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibrePassEncryptedCipher.swift; sourceTree = ""; }; B253F1E32B83976900D048F9 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibrePassRegistrationWindow.swift; sourceTree = ""; }; - B28808902B9254E300A526C6 /* PasswordGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordGenerator.swift; sourceTree = ""; }; - B28E061F2B8BBD1900F48661 /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; - B2D4447A2B87D0DF0031A685 /* Vault.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vault.swift; sourceTree = ""; }; B2D91A152B8393C60004561A /* LibrePass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LibrePass.app; sourceTree = BUILT_PRODUCTS_DIR; }; B2D91A1C2B8393C70004561A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; B2D91A1F2B8393C70004561A /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; @@ -178,22 +150,6 @@ path = Model; sourceTree = ""; }; - B2D444772B87CFF00031A685 /* API */ = { - isa = PBXGroup; - children = ( - B253F1D12B83942B00D048F9 /* LibrePassAPI.swift */, - B253F1D52B83942B00D048F9 /* LibrePassCipher.swift */, - B253F1D62B83942B00D048F9 /* LibrePassEncryptedCipher.swift */, - B253F1D02B83942B00D048F9 /* CredentialsDatabase.swift */, - B2D4447A2B87D0DF0031A685 /* Vault.swift */, - B253F1D42B83942B00D048F9 /* Crypto.swift */, - B253F1D32B83942B00D048F9 /* ApiClient.swift */, - B28808902B9254E300A526C6 /* PasswordGenerator.swift */, - B23D44F72BA62C6B00097960 /* OATH.swift */, - ); - path = API; - sourceTree = ""; - }; B2D91A0C2B8393C60004561A = { isa = PBXGroup; children = ( @@ -214,19 +170,13 @@ B2D91A172B8393C60004561A /* LibrePass */ = { isa = PBXGroup; children = ( - B2D444772B87CFF00031A685 /* API */, 179E98132BC1DAB900D71ACA /* App */, B2D91A1C2B8393C70004561A /* Assets.xcassets */, 1742993D2BC9D070008B639D /* Configs */, 179E98142BC1DAC200D71ACA /* Core */, 176A30612BC1C103005C143E /* CustomEnvironment.swift */, 176A306A2BC1C8D8005C143E /* Info.plist */, - B25257BA2B91149D0028ABF3 /* LibrePassAccountSettings.swift */, - B253F1CC2B83942B00D048F9 /* LibrePassCipherView.swift */, - B253F1CF2B83942B00D048F9 /* LibrePassManagerWindow.swift */, - B2780F052B8A43C200835EE3 /* LibrePassRegistrationWindow.swift */, B2D91A1E2B8393C70004561A /* Preview Content */, - B28E061F2B8BBD1900F48661 /* Utils.swift */, ); path = LibrePass; sourceTree = ""; @@ -323,31 +273,17 @@ buildActionMask = 2147483647; files = ( 17B4516F2BCC8CE600C5E1AE /* LoginRequest.swift in Sources */, - B253F1E02B83942B00D048F9 /* LibrePassCipher.swift in Sources */, - B28808912B9254E300A526C6 /* PasswordGenerator.swift in Sources */, 17B451742BCDB90B00C5E1AE /* Credentials.swift in Sources */, 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */, B2DD90712B8D10D4003D84B7 /* NetworkMonitor.swift in Sources */, - B253F1DC2B83942B00D048F9 /* LibrePassAPI.swift in Sources */, - B253F1D72B83942B00D048F9 /* LibrePassCipherView.swift in Sources */, - B253F1DF2B83942B00D048F9 /* Crypto.swift in Sources */, - B253F1DE2B83942B00D048F9 /* ApiClient.swift in Sources */, 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */, - B2D4447B2B87D0DF0031A685 /* Vault.swift in Sources */, - B2780F062B8A43C200835EE3 /* LibrePassRegistrationWindow.swift in Sources */, 17B4516D2BCC832900C5E1AE /* UserCredentialResponse.swift in Sources */, B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */, - B28E06202B8BBD1900F48661 /* Utils.swift in Sources */, 17349C0D2BC1E19D00452814 /* ContentView.swift in Sources */, 17B451722BCD866900C5E1AE /* RegisterRequest.swift in Sources */, - B23D44F82BA62C6B00097960 /* OATH.swift in Sources */, - B25257BB2B91149D0028ABF3 /* LibrePassAccountSettings.swift in Sources */, 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */, 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */, - B253F1E12B83942B00D048F9 /* LibrePassEncryptedCipher.swift in Sources */, - B253F1DB2B83942B00D048F9 /* CredentialsDatabase.swift in Sources */, 175190532BCA3EEB0076460A /* HomeView.swift in Sources */, - B253F1DA2B83942B00D048F9 /* LibrePassManagerWindow.swift in Sources */, 17349C112BC1E4B300452814 /* SignupView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/LibrePass/API/ApiClient.swift b/LibrePass/API/ApiClient.swift deleted file mode 100644 index adabbea..0000000 --- a/LibrePass/API/ApiClient.swift +++ /dev/null @@ -1,67 +0,0 @@ -import Foundation - -class ApiClient { - var accessToken: String? - var apiUrl: String - - init(apiUrl: String) { - self.apiUrl = apiUrl - } - - func request(path: String, body: Data?, method: String) throws -> Data { - let url = URL(string: self.apiUrl + path)! - var request = URLRequest(url: url) - request.setValue("application/json", forHTTPHeaderField: "Content-Type") - if let accessToken = self.accessToken { - request.setValue("Bearer " + accessToken, forHTTPHeaderField: "Authorization") - } - - request.httpMethod = method - if let body = body { - request.httpBody = body - } - - var responseBody = Data() - var errorToReturn: Error? - let group = DispatchGroup() - let task = URLSession.shared.dataTask(with: request) {(data, response, error) -> Void in - defer {group.leave()} - - if let error = error { - errorToReturn = error - } else if let response = response as? HTTPURLResponse { - if response.statusCode == 200 { - responseBody = data ?? Data() - } else if response.statusCode < 200 || response.statusCode >= 300 { - if let apiErrorData = try? JSONDecoder().decode(ApiErrorData.self, from: data ?? Data()) { - errorToReturn = ApiClientErrors.StatusCodeNot200(statusCode: response.statusCode, body: apiErrorData) - } else { - errorToReturn = ApiClientErrors.UnknownResponse - } - } - } else { - errorToReturn = ApiClientErrors.UnknownResponse - } - } - - group.enter() - task.resume() - group.wait() - - if let errorToReturn = errorToReturn { - throw errorToReturn - } - - return responseBody - } - - struct ApiErrorData: Codable { - var error: String - var status: Int - } -} - -enum ApiClientErrors: Error { - case StatusCodeNot200(statusCode: Int, body: ApiClient.ApiErrorData) - case UnknownResponse -} diff --git a/LibrePass/API/CredentialsDatabase.swift b/LibrePass/API/CredentialsDatabase.swift deleted file mode 100644 index da898ed..0000000 --- a/LibrePass/API/CredentialsDatabase.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// CredentialsDatabase.swift -// LibrePass -// -// Created by Zapomnij on 18/02/2024. -// - -import Foundation -import SwiftUI - -struct LibrePassCredentialsDatabase: Codable { - var userId: String - var email: String - var apiUrl: String - var accessToken: String - var publicKey: String - - var argon2idParams: Argon2IdOptions - - func save() throws { - let encoded = try? JSONEncoder().encode(self) - UserDefaults.standard.setValue(encoded, forKey: "credentialsDatabase") - } - - static func load() throws -> Self { - let data = UserDefaults.standard.data(forKey: "credentialsDatabase")! - return try JSONDecoder().decode(Self.self, from: data) - } - - static func isLocallyLoggedIn() -> Bool { - return UserDefaults.standard.data(forKey: "credentialsDatabase") != nil - } -} diff --git a/LibrePass/API/Crypto.swift b/LibrePass/API/Crypto.swift deleted file mode 100644 index 33d87c2..0000000 --- a/LibrePass/API/Crypto.swift +++ /dev/null @@ -1,66 +0,0 @@ -// -// crypto.swift -// LibrePass -// -// Created by Zapomnij on 17/02/2024. -// - -import Foundation -import Argon2Swift -import CryptoKit - -struct Argon2IdOptions: Codable { - var parallelism: Int - var memory: Int - var iterations: Int - var serverPublicKey: String -} - -func argon2Hash(email: String, password: String, hashOptions: Argon2IdOptions) throws -> Data { -// let (rawHash, _) = try Argon2.hash(iterations: UInt32(hashOptions.iterations), memoryInKiB: UInt32(hashOptions.memory), threads: UInt32(hashOptions.parallelism), password: password.data(using: .utf8)!, salt: email.data(using: .utf8)!, desiredLength: 32, variant: .id, version: .v13) -// -// return rawHash - - do { - let privateKeyData = try Argon2Swift.hashPasswordBytes(password: "pass".data(using: .utf8)!, salt: Salt(bytes: "ashdoahdfvo".data(using: .utf8)!), iterations: 3, memory: 65536, parallelism: 1, type: .id, version: .V13) - - let privatekey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: privateKeyData.hashData()) - let publickey = privatekey.publicKey - - - - - } catch { - print("Hash Error") - } - - return Data() -} - -func dataToHexString(data: Data) -> String { - return data.map { String(format: "%02X", $0) }.joined() -} - -func hexStringToData(string: String) -> Data? { - guard string.count.isMultiple(of: 2) else { - return nil - } - let chars = string.map { $0 } - let bytes = stride(from: 0, to: chars.count, by: 2) - .map { String(chars[$0]) + String(chars[$0 + 1]) } - .compactMap { UInt8($0, radix: 16) } - - guard string.count / bytes.count == 2 else { return nil } - - return Data(bytes) -} - -func aesGcmDecrypt(data: Data, key: SymmetricKey) throws -> Data { - let sealedBoxRestored = try AES.GCM.SealedBox(combined: data) - return try AES.GCM.open(sealedBoxRestored, using: key) -} - -func aesGcmEncrypt(data: Data, key: SymmetricKey) throws -> Data { - let sealed = try AES.GCM.seal(data, using: key) - return sealed.combined! -} diff --git a/LibrePass/API/LibrePassAPI.swift b/LibrePass/API/LibrePassAPI.swift deleted file mode 100644 index 8a2e3d6..0000000 --- a/LibrePass/API/LibrePassAPI.swift +++ /dev/null @@ -1,356 +0,0 @@ -// The Swift Programming Language -// https://docs.swift.org/swift-book - -import Foundation -import CryptoKit -import SwiftUI - -struct LibrePassClient { - var client: ApiClient - var loginData: LoginData? - var sharedKey: SymmetricKey? - var credentialsDatabase: LibrePassCredentialsDatabase? - var vault: LibrePassDecryptedVault - - let networkMonitor = NetworkMonitor.shared - - init(apiUrl: String) { - self.client = ApiClient(apiUrl: apiUrl) - self.vault = LibrePassDecryptedVault(lastSync: 0) - - if !LibrePassEncryptedVault.isVaultSavedLocally() { - _ = try? LibrePassEncryptedVault(lastSync: 0).saveVault() - } - } - - init(credentials: LibrePassCredentialsDatabase, password: String) throws { - self.init(apiUrl: credentials.apiUrl) - self.client.accessToken = credentials.accessToken - self.loginData = LoginData(userId: credentials.userId, apiKey: credentials.accessToken, verified: true) - - let publicKey = try Curve25519.KeyAgreement.PublicKey(rawRepresentation: hexStringToData(string: credentials.publicKey)!) - let privateKeyData = try argon2Hash(email: credentials.email, password: password, hashOptions: credentials.argon2idParams) - let privateKey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: privateKeyData) - if publicKey.rawRepresentation != privateKey.publicKey.rawRepresentation { - throw LibrePassApiErrors.WithMessage(message: "Invalid credentials") - } - - let serializedSharedKey = try privateKey.sharedSecretFromKeyAgreement(with: publicKey).withUnsafeBytes { - return Data(Array($0)) - } - - self.sharedKey = SymmetricKey(data: serializedSharedKey) - self.credentialsDatabase = credentials - self.vault.key = self.sharedKey! - } - - func getKeys(email: String, password: String, argon2options: Argon2IdOptions) throws -> (Data, Data, Data) { - let privateKeyData = try argon2Hash(email: email, password: password, hashOptions: argon2options) - - let privateKey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: privateKeyData) - - let sharedKey = try privateKey.sharedSecretFromKeyAgreement(with: try Curve25519.KeyAgreement.PublicKey(rawRepresentation: hexStringToData(string: argon2options.serverPublicKey)!)) - - let sharedKeyData = sharedKey.withUnsafeBytes { - return Data(Array($0)) - } - - let publicKeyData = privateKey.publicKey.rawRepresentation.withUnsafeBytes { - return Data(Array($0)) - } - - return (privateKeyData, publicKeyData, sharedKeyData) - } - - func preLogin(email: String) throws -> Argon2IdOptions { - let body = try self.client.request(path: "/api/auth/preLogin?email=" + email, body: nil, method: "GET") - - let decoder = JSONDecoder() - do { - return try decoder.decode(Argon2IdOptions.self, from: body) - } catch { - throw error - } - } - - func register(email: String, password: String, passwordHint: String) throws { - struct RegisterRequestBody: Encodable { - var email: String - var passwordHint: String - var sharedKey: String - var publicKey: String - var parallelism: Int - var memory: Int - var iterations: Int - } - - let preLogin = try self.preLogin(email: "") - let (_, publicKeyData, sharedKeyData) = try self.getKeys(email: email, password: password, argon2options: preLogin) - - let request = RegisterRequestBody(email: email, passwordHint: passwordHint, sharedKey: dataToHexString(data: sharedKeyData), publicKey: dataToHexString(data: publicKeyData), parallelism: preLogin.parallelism, memory: preLogin.memory, iterations: preLogin.iterations) - - let requestData = try JSONEncoder().encode(request) - - _ = try self.client.request(path: "/api/auth/register", body: requestData, method: "POST") - } - - mutating func login(email: String, password: String) throws { - struct LoginRequestBody: Encodable { - var email: String - var sharedKey: String - } - - let preLogin = try self.preLogin(email: email) - - let (privateKeyData, _, sharedKeyData) = try self.getKeys(email: email, password: password, argon2options: preLogin) - - let encoder = JSONEncoder() - let loginRequestData = LoginRequestBody(email: email, sharedKey: dataToHexString(data: sharedKeyData)) - let loginRequestBody = try encoder.encode(loginRequestData) - - let loginResponse = try self.client.request(path: "/api/auth/oauth?grantType=login", body: loginRequestBody, method: "POST") - - let decoder = JSONDecoder() - self.loginData = try decoder.decode(LoginData.self, from: loginResponse) - self.client.accessToken = self.loginData!.apiKey - - let privateKey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: privateKeyData) - let sharedKeySerialized = try privateKey.sharedSecretFromKeyAgreement(with: privateKey.publicKey).withUnsafeBytes { - return Data(Array($0)) - } - self.sharedKey = SymmetricKey(data: sharedKeySerialized) - - let privateKeySerialized = privateKey.publicKey.rawRepresentation.withUnsafeBytes { - return Data(Array($0)) - } - - self.credentialsDatabase = LibrePassCredentialsDatabase(userId: self.loginData!.userId, email: email, apiUrl: self.client.apiUrl, accessToken: self.client.accessToken!, publicKey: dataToHexString(data: privateKeySerialized), argon2idParams: preLogin) - try self.credentialsDatabase!.save() - } - - mutating func replaceApiClient(apiUrl: String) { - self.client = ApiClient(apiUrl: apiUrl) - } - - mutating func logOut() { - UserDefaults.standard.removeObject(forKey: "credentialsDatabase") - UserDefaults.standard.removeObject(forKey: "vault") - UserDefaults.standard.removeObject(forKey: "queue") - - self.unAuth() - } - - mutating func unAuth() { - self.client = ApiClient(apiUrl: self.client.apiUrl) - self.loginData = nil - self.sharedKey = nil - self.credentialsDatabase = nil - self.vault = LibrePassDecryptedVault(lastSync: 0) - } - - mutating func fetchCiphers() throws { - self.vault.key = self.sharedKey! - - let resp = try self.client.request(path: "/api/cipher", body: nil, method: "GET") - - var cryptedVault = LibrePassEncryptedVault(lastSync: Int64(Date().timeIntervalSince1970)) - cryptedVault.vault = try JSONDecoder().decode([LibrePassEncryptedCipher].self, from: resp) - for _ in cryptedVault.vault { - cryptedVault.toSync.append(false) - } - - try cryptedVault.saveVault() - - self.vault = try cryptedVault.decryptVault(key: self.sharedKey!) - } - - mutating func syncVault() throws { - struct SyncResponse: Codable { - var ids: [String] - var ciphers: [LibrePassEncryptedCipher] - } - - let encryptedVault = try LibrePassEncryptedVault.loadVault() - self.vault = try encryptedVault.decryptVault(key: self.sharedKey!) - - if networkMonitor.isConnected { - let resp = try self.client.request(path: "/api/cipher/sync?lastSync=" + String(self.vault.lastSync), body: nil, method: "GET") - - let updated = try JSONDecoder().decode(SyncResponse.self, from: resp) - - var newVaultToSync: [Bool] = [] - var newVault: [LibrePassCipher] = [] - for (i, j) in self.vault.vault.enumerated() { - if updated.ids.firstIndex(where: { id in j.id == id }) == nil && !self.vault.toSync[i] { - continue - } - - if let i2 = updated.ciphers.firstIndex(where: { cipher in cipher.id == j.id }) { - if let last1 = updated.ciphers[i2].lastModified, let last2 = j.lastModified { - if last1 > last2 || !self.vault.toSync[i] { - self.vault.vault[i] = try LibrePassCipher(encCipher: updated.ciphers[i2], key: self.sharedKey!) - self.vault.toSync[i] = false - } - } else if !self.vault.toSync[i] { - self.vault.vault[i] = try LibrePassCipher(encCipher: updated.ciphers[i2], key: self.sharedKey!) - self.vault.toSync[i] = false - } - } - - if self.vault.toSync[i] { - if let _ = try? self.put(cipher: self.vault.vault[i]) { - self.vault.toSync[i] = false - } - } - - newVault.append(self.vault.vault[i]) - newVaultToSync.append(false) - } - - for index in stride(from: self.vault.idstoDelete.count - 1, through: 0, by: -1) { - if let _ = try? self.delete(id: self.vault.idstoDelete[index]) { - if let _ = try? self.vault.remove(id: self.vault.idstoDelete[index], save: true) { - self.vault.idstoDelete.remove(at: index) - } - } - } - - for encCipher in updated.ciphers { - if self.vault.vault.firstIndex(where: { cipher in encCipher.id == cipher.id }) == nil { - newVault.append(try LibrePassCipher(encCipher: encCipher, key: self.sharedKey!)) - newVaultToSync.append(false) - } - } - - self.vault.vault = newVault - self.vault.toSync = newVaultToSync - self.vault.lastSync = Int64(Date().timeIntervalSince1970) - try self.vault.encryptVault().saveVault() - } - } - - mutating func put(encryptedCipher: LibrePassEncryptedCipher) throws { - try self.put(cipher: LibrePassCipher(encCipher: encryptedCipher, key: self.sharedKey!)) - } - - mutating func put(cipher: LibrePassCipher) throws { - let encrypted = try LibrePassEncryptedCipher(cipher: cipher, key: self.sharedKey!) - - var toSync = false - if networkMonitor.isConnected { - let req = try JSONEncoder().encode(encrypted) - - _ = try self.client.request(path: "/api/cipher", body: req, method: "PUT") - } else { - toSync = true - } - - try self.vault.addOrReplace(cipher: cipher, toSync: toSync, save: true) - } - - mutating func delete(id: String) throws { - if networkMonitor.isConnected { - _ = try self.client.request(path: "/api/cipher/" + id, body: nil, method: "DELETE") - } else { - self.vault.idstoDelete.append(id) - } - - try self.vault.remove(id: id, save: true) - } - - mutating func updateCredentials(email: String, password: String, passwordHint: String, oldSharedKey: String) throws { - struct CompactCipher: Codable { - var id: String - var data: String - } - - struct LibrePassChangeEmailRequest: Codable { - var newEmail: String - var oldSharedKey: String - var newPublicKey: String - var newSharedKey: String - var ciphers: [CompactCipher] - } - - struct LibrePassChangePasswordRequest: Codable { - var oldSharedKey: String - var newPublicKey: String - var newSharedKey: String - var passwordHint: String - var parallelism: Int - var memory: Int - var iterations: Int - var ciphers: [CompactCipher] - } - - let (newPrivateData, newPublicData, newSharedData) = try self.getKeys(email: email, password: password, argon2options: self.credentialsDatabase!.argon2idParams) - - let vaultEncryptionKey = try Curve25519.KeyAgreement.PrivateKey(rawRepresentation: newPrivateData).sharedSecretFromKeyAgreement(with: try Curve25519.KeyAgreement.PublicKey(rawRepresentation: newPublicData)).withUnsafeBytes { - return Data(Array($0)) - } - - var newVault = self.vault - newVault.key = SymmetricKey(data: vaultEncryptionKey) - - var encryptedVault = try newVault.encryptVault() - var compactCiphers: [CompactCipher] = [] - for j in encryptedVault.vault { - compactCiphers.append(CompactCipher(id: j.id, data: j.protectedData)) - } - - var requestBody: Data - var path: String - if email != self.credentialsDatabase!.email { - let requestStruct = LibrePassChangeEmailRequest(newEmail: email, oldSharedKey: oldSharedKey, newPublicKey: dataToHexString(data: newPublicData), newSharedKey: dataToHexString(data: newSharedData), ciphers: compactCiphers) - - requestBody = try JSONEncoder().encode(requestStruct) - path = "/api/user/email" - } else if dataToHexString(data: newSharedData) != oldSharedKey { - let requestStruct = LibrePassChangePasswordRequest(oldSharedKey: oldSharedKey, newPublicKey: dataToHexString(data: newPublicData), newSharedKey: dataToHexString(data: newSharedData), passwordHint: passwordHint, parallelism: self.credentialsDatabase!.argon2idParams.parallelism, memory: self.credentialsDatabase!.argon2idParams.memory, iterations: self.credentialsDatabase!.argon2idParams.iterations, ciphers: compactCiphers) - - requestBody = try JSONEncoder().encode(requestStruct) - path = "/api/user/password" - } else { - throw LibrePassApiErrors.WithMessage(message: "Nothing is to be changed") - } - - _ = try self.client.request(path: path, body: requestBody, method: "PATCH") - } - - func deleteAccount(password: String) throws { - struct LibrePassDeleteAccountRequest: Codable { - var sharedKey: String - var code: String - } - - let (oldPrivateData, oldPublicData, oldSharedData) = try self.getKeys(email: self.credentialsDatabase!.email, password: password, argon2options: self.credentialsDatabase!.argon2idParams) - - if dataToHexString(data: oldPublicData) != self.credentialsDatabase!.publicKey { - throw LibrePassApiErrors.WithMessage(message: "Invalid credentials") - } - - let request = LibrePassDeleteAccountRequest(sharedKey: dataToHexString(data: oldSharedData), code: "") - let requestBody = try JSONEncoder().encode(request) - - _ = try self.client.request(path: "/api/user/delete", body: requestBody, method: "DELETE") - } - - func generateId() -> String { - var uuid = UUID().uuidString.lowercased() - while self.vault.vault.firstIndex(where: { cipher in cipher.id == uuid }) != nil { - uuid = UUID().uuidString.lowercased() - } - - return uuid - } -} - -struct LoginData: Codable { - var userId: String - var apiKey: String - var verified: Bool -} - -enum LibrePassApiErrors: Error { - case WithMessage(message: String) -} diff --git a/LibrePass/API/LibrePassCipher.swift b/LibrePass/API/LibrePassCipher.swift deleted file mode 100644 index d949060..0000000 --- a/LibrePass/API/LibrePassCipher.swift +++ /dev/null @@ -1,123 +0,0 @@ -// -// LibrePassCipher.swift -// LibrePass -// -// Created by Zapomnij on 18/02/2024. -// - -import Foundation -import CryptoKit -import SwiftUI - -class LibrePassCipher: Codable { - var id: String - var owner: String - var type: CipherType - var loginData: CipherLoginData? - var secureNoteData: CipherSecureNoteData? - var cardData: CipherCardData? - var collection: String? - var favorite: Bool = false - var rePrompt: Bool = false - var version: Int = 1 - var created: Int64? - var lastModified: Int64? - - init(id: String, owner: String, type: CipherType) { - self.id = id - self.owner = owner - self.type = type - self.created = Int64(Date().timeIntervalSince1970) - self.lastModified = self.created - - switch self.type { - case .Login: - self.loginData = CipherLoginData(name: "New") - break - case .SecureNote: - self.secureNoteData = CipherSecureNoteData(title: "New", note: "") - break - case .Card: - self.cardData = CipherCardData(name: "New", cardholderName: "", number: "") - break - } - } - - convenience init(encCipher: LibrePassEncryptedCipher, key: SymmetricKey) throws { - self.init(id: encCipher.id, owner: encCipher.owner, type: CipherType.Card) - self.collection = encCipher.collection - self.favorite = encCipher.favorite - self.rePrompt = encCipher.rePrompt - self.version = encCipher.version - self.created = encCipher.created - self.lastModified = encCipher.lastModified - - let decoder = JSONDecoder() - switch encCipher.type { - case 0: - self.loginData = try decoder.decode(CipherLoginData.self, from: aesGcmDecrypt(data: hexStringToData(string: encCipher.protectedData)!, key: key)) - self.type = CipherType.Login - break - case 1: - self.secureNoteData = try decoder.decode(CipherSecureNoteData.self, from: aesGcmDecrypt(data: hexStringToData(string: encCipher.protectedData)!, key: key)) - self.type = CipherType.SecureNote - break - case 2: - self.cardData = try decoder.decode(CipherCardData.self, from: aesGcmDecrypt(data: hexStringToData(string: encCipher.protectedData)!, key: key)) - self.type = CipherType.Card - break - default: - break - } - } - - enum CipherType: Codable { - case Login - case SecureNote - case Card - } - - struct CipherLoginData: Codable { - var name: String - var username: String? - var password: String? - var passwordHistory: [PasswordHistory]? - var uris: [String]? - var twoFactor: String? - var notes: String? - var fields: [CustomField]? - } - - struct CipherSecureNoteData: Codable { - var title: String - var note: String - var fields: [CustomField]? - } - - struct CipherCardData: Codable { - var name: String - var cardholderName: String - var number: String - var expMonth: Int? - var expYear: Int? - var code: String? - var notes: String? - var fields: [CustomField]? - } - - struct CustomField: Codable { - var name: String - var type: CipherFieldType - var value: String - } - - enum CipherFieldType: Codable { - case Text - case Hidden - } - - struct PasswordHistory: Codable { - var password: String - var lastUsed: Int - } -} diff --git a/LibrePass/API/LibrePassEncryptedCipher.swift b/LibrePass/API/LibrePassEncryptedCipher.swift deleted file mode 100644 index 478f12a..0000000 --- a/LibrePass/API/LibrePassEncryptedCipher.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// LibrePassEncryptedCipher.swift -// LibrePass -// -// Created by Zapomnij on 18/02/2024. -// - -import Foundation -import CryptoKit - -class LibrePassEncryptedCipher: Codable { - var id: String - var owner: String - var type: Int - var protectedData: String - var collection: String? - var favorite: Bool - var rePrompt: Bool - var version: Int - var created: Int64? - var lastModified: Int64? - - init(cipher: LibrePassCipher, key: SymmetricKey) throws { - self.id = cipher.id - self.owner = cipher.owner - - switch cipher.type { - case .Login: - self.type = 0 - self.protectedData = dataToHexString(data: try aesGcmEncrypt(data: JSONEncoder().encode(cipher.loginData!), key: key)) - break - case .SecureNote: - self.type = 1 - self.protectedData = dataToHexString(data: try aesGcmEncrypt(data: JSONEncoder().encode(cipher.secureNoteData!), key: key)) - break - case .Card: - self.type = 2 - self.protectedData = dataToHexString(data: try aesGcmEncrypt(data: JSONEncoder().encode(cipher.cardData!), key: key)) - break - } - - self.collection = cipher.collection - self.favorite = cipher.favorite - self.rePrompt = cipher.rePrompt - self.version = cipher.version - self.created = cipher.created - self.lastModified = cipher.lastModified - } -} diff --git a/LibrePass/API/OATH.swift b/LibrePass/API/OATH.swift deleted file mode 100644 index f3e1488..0000000 --- a/LibrePass/API/OATH.swift +++ /dev/null @@ -1,127 +0,0 @@ -//// -//// OATH.swift -//// LibrePass -//// -//// Created by Zapomnij on 16/03/2024. -//// -// -//import Foundation -//import SwiftUI -//import CryptoKit -// -//extension String { -// func toOTPAlgorithm() -> SwiftOTP.OTPAlgorithm { -// switch self { -// case "SHA1": -// return .sha1 -// case "SHA256": -// return .sha256 -// case "SHA512": -// return .sha512 -// default: -// return .sha1 -// } -// } -//} -// -//extension SwiftOTP.OTPAlgorithm { -// func toString() -> String { -// switch self { -// case .sha1: -// return "SHA1" -// case .sha256: -// return "SHA256" -// case .sha512: -// return "SHA512" -// } -// } -//} -// -//var stop = false -//var running = false -//struct OATHParams { -// enum OATHType { -// case TOTP -// case HOTP -// -// func toString() -> String { -// switch self { -// case .TOTP: -// return "totp" -// case .HOTP: -// return "htop" -// } -// } -// } -// -// var uri: String -// -// var type: OATHType = .TOTP -// var algorithm: SwiftOTP.OTPAlgorithm = .sha1 -// var secret: Data = Data() -// var digits: Int = 6 -// var period: Int = 30 -// var counter: Int = 0 -// -// init(uri: String) throws { -// self.uri = uri -// -// if uri.starts(with: "otpauth://totp/") { -// self.type = .TOTP -// } else { -// self.type = .HOTP -// } -// -// let uriSplit = uri.components(separatedBy: "?")[1].components(separatedBy: "&") -// -// for keyVal in uriSplit { -// let split = keyVal.components(separatedBy: "=") -// let key = split[0], val = split[1] -// -// switch key { -// case "secret": -// guard let secret = base32Decode(val) else { -// throw LibrePassApiErrors.WithMessage(message: "Bad 2FA secret") -// } -// self.secret = Data(secret) -// break -// case "algorithm": -// self.algorithm = val.toOTPAlgorithm() -// break -// case "digits": -// self.digits = Int(val) ?? 6 -// break -// case "counter": -// self.counter = Int(val) ?? 0 -// break -// case "period": -// self.period = Int(val) ?? 30 -// break -// default: -// break -// } -// } -// } -// -// func runTOTPCounter(callback: (_ oneTimePassword: String, _ timeLeft: Int) -> ()) async { -// running = true -// if let totp = TOTP(secret: self.secret, digits: self.digits, timeInterval: self.period, algorithm: self.algorithm) { -// var counter = Int(Date().timeIntervalSince1970) % self.period -// var password = totp.generate(time: Date()) ?? "" -// while !stop { -// if counter == 0 { -// if let newPassword = totp.generate(time: Date()) { -// password = newPassword -// } -// } -// -// callback(password, self.period - counter) -// try? await Task.sleep(nanoseconds: UInt64(0.5 * 1000000000)) -// counter = Int(Date().timeIntervalSince1970) % self.period -// } -// -// stop = false -// running = false -// } -// } -//} diff --git a/LibrePass/API/PasswordGenerator.swift b/LibrePass/API/PasswordGenerator.swift deleted file mode 100644 index 8dfad2b..0000000 --- a/LibrePass/API/PasswordGenerator.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// PasswordGenerator.swift -// LibrePass -// -// Created by Zapomnij on 01/03/2024. -// - -import Foundation - -func generatePassword(length: Int) throws -> String { - if length < 8 { - throw LibrePassApiErrors.WithMessage(message: "Password length must be longer or equal to 8") - } - - let nOfNumbers = length / 4 - let nOfSpecial = length / 4 - let nOfLowercased = length / 4 - let nOfUppercased = length - nOfSpecial - nOfLowercased - nOfNumbers - - var password = [Character?](repeating: nil, count: length) - - func fill(from: Int, to: Int, times: Int) { - var filled = 0 - while filled < times { - let char = Character(UnicodeScalar(Int.random(in: from...to))!) - - if password.first(where: { ch in ch == char }) == nil { - while true { - let index = Int.random(in: 0...length - 1) - if password[index] == nil { - password[index] = char - filled += 1 - break - } - } - } - } - } - - for _ in stride(from: 0, to: nOfSpecial, by: 1) { - switch Int.random(in: 0...3) { - case 0: - fill(from: 32, to: 47, times: 1) - break - case 1: - fill(from: 58, to: 64, times: 1) - break - case 2: - fill(from: 91, to: 96, times: 1) - break - case 3: - fill(from: 123, to: 126, times: 1) - break - default: - print("This won't ever happen") - } - } - - fill(from: 48, to: 57, times: nOfNumbers) - fill(from: 97, to: 122, times: nOfLowercased) - fill(from: 65, to: 90, times: nOfUppercased) - - var string = "" - password.forEach { - if let char = $0 { - string += String(char) - } - } - - return string -} diff --git a/LibrePass/API/Vault.swift b/LibrePass/API/Vault.swift deleted file mode 100644 index d89d8f0..0000000 --- a/LibrePass/API/Vault.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// Vault.swift -// LibrePass -// -// Created by Zapomnij on 22/02/2024. -// - -import Foundation -import CryptoKit - -struct LibrePassEncryptedVault: Codable { - var vault: [LibrePassEncryptedCipher] = [] - var toSync: [Bool] = [] - var idsToDelete: [String] = [] - var lastSync: Int64 - - static func loadVault() throws -> Self { - let vaultJson = UserDefaults.standard.data(forKey: "vault")! - - return try JSONDecoder().decode(Self.self, from: vaultJson) - } - - func saveVault() throws { - let data = try JSONEncoder().encode(self) - - UserDefaults.standard.setValue(data, forKey: "vault") - } - - func decryptVault(key: SymmetricKey) throws -> LibrePassDecryptedVault { - var ciphers: LibrePassDecryptedVault = LibrePassDecryptedVault(toSync: self.toSync, idstoDelete: self.idsToDelete, lastSync: self.lastSync, key: key) - for (i, encCipher) in self.vault.enumerated() { - try ciphers.addOrReplace(cipher: try LibrePassCipher(encCipher: encCipher, key: key), toSync: self.toSync[i], save: false) - } - - return ciphers - } - - static func isVaultSavedLocally() -> Bool { - return UserDefaults.standard.data(forKey: "vault") != nil - } -} - -struct LibrePassDecryptedVault { - var vault: [LibrePassCipher] = [] - var toSync: [Bool] = [] - var idstoDelete: [String] = [] - var lastSync: Int64 - var key: SymmetricKey? - - mutating func addOrReplace(cipher: LibrePassCipher, toSync: Bool, save: Bool) throws { - if let idx = self.vault.firstIndex(where: { ciph in ciph.id == cipher.id }) { - self.vault[idx] = cipher - self.toSync[idx] = toSync - } else { - self.vault.append(cipher) - self.toSync.append(toSync) - } - - if save { - try self.encryptVault().saveVault() - } - } - - mutating func remove(id: String, save: Bool) throws { - if let cipher = self.vault.first(where: { cipher in cipher.id == id }) { - try self.remove(cipher: cipher, save: save) - } - } - - mutating func remove(cipher: LibrePassCipher, save: Bool) throws { - if let idx = self.vault.firstIndex(where: { ciph in ciph.id == cipher.id }) { - self.vault.remove(at: idx) - self.toSync.remove(at: idx) - - if save { - try self.encryptVault().saveVault() - } - } - } - - func encryptVault() throws -> LibrePassEncryptedVault { - var encCiphers: LibrePassEncryptedVault = LibrePassEncryptedVault(toSync: self.toSync, idsToDelete: self.idstoDelete, lastSync: self.lastSync) - for cipher in self.vault { - encCiphers.vault.append(try LibrePassEncryptedCipher(cipher: cipher, key: self.key!)) - } - - return encCiphers - } -} diff --git a/LibrePass/LibrePassAccountSettings.swift b/LibrePass/LibrePassAccountSettings.swift deleted file mode 100644 index 4ee66a1..0000000 --- a/LibrePass/LibrePassAccountSettings.swift +++ /dev/null @@ -1,101 +0,0 @@ -// -// LibrePassAccountSettings.swift -// LibrePass -// -// Created by Zapomnij on 29/02/2024. -// - -import SwiftUI -import CryptoKit - -struct LibrePassAccountSettings: View { - @Binding var lClient: LibrePassClient - @Binding var locallyLoggedIn: Bool - @Binding var loggedIn: Bool - - @State var password = String() - @State var email = String() - @State var newPassword = String() - @State var newPasswordConfirm = String() - @State var newPasswordHint = String() - - @State var done = false - - var body: some View { - List { - Section(header: Text("New password. Leave empty if you don't want to change")) { - SecureField("New password", text: self.$newPassword) - .autocapitalization(.none) - SecureField("Confirm password", text: self.$newPasswordConfirm) - .autocapitalization(.none) - TextField("Password hint", text: self.$newPasswordHint) - } - - Section(header: Text("Email")) { - TextField("Email", text: self.$email) - .autocapitalization(.none) - } - - Section(header: Text("Confirm action")) { - SecureField("Current password", text: self.$password) - .autocapitalization(.none) - ButtonWithSpinningWheel(text: "Update credentials", task: self.updateCredentials) - ButtonWithSpinningWheel(text: "Delete account", task: self.deleteAccount, color: Color.red) - } - - Section { - Button("Log out", role: .destructive) { - self.logOut() - } - } - } - - .alert("Operation is finished. You'll be logged out. If you've changed email address, check your mailbox and verify email address", isPresented: self.$done) { - Button("OK") { - self.locallyLoggedIn = false - self.loggedIn = false - } - } - - .onAppear { - self.email = self.lClient.credentialsDatabase!.email - } - } - - func deleteAccount() throws { - try self.lClient.deleteAccount(password: self.password) - self.logOut() - } - - func logOut() { - self.locallyLoggedIn = false - self.loggedIn = false - self.lClient.logOut() - } - - func updateCredentials() throws { - let (oldPrivateData, oldPublicData, oldSharedData) = try self.lClient.getKeys(email: self.lClient.credentialsDatabase!.email, password: self.password, argon2options: self.lClient.credentialsDatabase!.argon2idParams) - - if dataToHexString(data: oldPublicData) != self.lClient.credentialsDatabase!.publicKey { - throw LibrePassApiErrors.WithMessage(message: "Invalid credentials") - } - - if email != self.lClient.credentialsDatabase!.email && !self.newPassword.isEmpty { - throw LibrePassApiErrors.WithMessage(message: "Both settings (email and password) cannot be changed at the same time.") - } - - _ = try? self.lClient.syncVault() - - if self.newPassword != "" { - if self.newPassword != self.newPasswordConfirm { - throw LibrePassApiErrors.WithMessage(message: "Passwords doesn't match") - } - - self.password = self.newPassword - } - - try self.lClient.updateCredentials(email: self.email, password: self.password, passwordHint: self.newPasswordHint, oldSharedKey: dataToHexString(data: oldSharedData)) - - self.done = true - } -} diff --git a/LibrePass/LibrePassCipherView.swift b/LibrePass/LibrePassCipherView.swift deleted file mode 100644 index 1053126..0000000 --- a/LibrePass/LibrePassCipherView.swift +++ /dev/null @@ -1,388 +0,0 @@ -//// -//// LibrePassCipherView.swift -//// Librepass -//// -//// Created by Zapomnij on 19/02/2024. -//// -// -//import SwiftUI -// -// -//struct CipherView: View { -// @Binding var lClient: LibrePassClient -// var cipher: LibrePassCipher -// var index: Int -// -// func save(cipher: LibrePassCipher) { -// do { -// cipher.lastModified = Int64(Date().timeIntervalSince1970) -// try lClient.put(cipher: cipher) -// try lClient.syncVault() -// } catch { -// -// } -// } -// -// var body: some View { -// switch self.cipher.type { -// case LibrePassCipher.CipherType.Login: -// CipherLoginDataView(cipher: self.cipher, index: index, save: save) -// case LibrePassCipher.CipherType.SecureNote: -// CipherSecureNoteView(cipher: self.cipher, index: index, save: save) -// case LibrePassCipher.CipherType.Card: -// CipherCardDataView(cipher: self.cipher, index: index, save: save) -// } -// } -//} -// -//struct CipherLoginDataView: View { -// var cipher: LibrePassCipher -// var index: Int -// var save: (_ save: LibrePassCipher) -> () -// -// @State var showPassword: Bool = false -// @State var name = String() -// @State var username = String() -// @State var password = String() -// @State var uris: [String] = [] -// @State var notes = String() -// @State var twoFactorUri: String? -// -// @State var passwordLength = 0 -// @State var generatePasswordAlert = false -// -// @State var oneTimePassword = "" -// @State var timeLeft = 0 -// @State var editTwoFactor = false -// -// var body: some View { -// List { -// Section(header: Text("Login data")) { -// TextField("Name", text: $name) -// TextFieldWithCopyButton(text: "Username", textBind: self.$username) -// SecureFieldWithCopyAndShowButton(text: "Password", textBind: self.$password) -// Button("Generate random password") { self.generatePasswordAlert = true } -// } -// -// Section(header: Text("URIs")) { -// ForEach(self.uris.indices, id: \.self) { index in -// HStack { -// TextFieldWithCopyButton(text: "URI " + String(index + 1), textBind: self.$uris[index]) -// } -// } -// .onDelete { index in -// self.uris.remove(atOffsets: index) -// } -// -// Button("Add") { -// self.uris.append("") -// } -// } -// -// Section(header: Text("Two factor")) { -// if let _ = self.twoFactorUri { -// HStack { -// Button(action: { -// UIPasteboard.general.string = self.oneTimePassword -// }, label: { -// Image(systemName: "doc.on.doc") -// }) -// .buttonStyle(.plain) -// Text(self.oneTimePassword) -// Spacer() -// Text(String(self.timeLeft)) -// } -// .onAppear { -// runAuthenticatorJob() -// } -// .onDisappear { -// stop = running -// } -// -// Button("Edit 2FA") { -// stop = running -// self.editTwoFactor = true -// } -// -// Button("Delete 2FA") { -// stop = running -// self.twoFactorUri = nil -// } -// -// .alert("Incorrect 2FA configuration", isPresented: self.$twoFactorError) { -// Button("OK", role: .cancel) { -// self.twoFactorUri = nil -// } -// } -// } else { -// Button("Set up 2FA") { -// self.editTwoFactor = true -// } -// } -// } -// -// Section(header: Text("Notes")) { -// TextField("Notes", text: self.$notes, axis: .vertical) -// } -// -// Section { -// ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) -// } -// } -// -// .alert("Length of password (must be longer or equal to 8)", isPresented: self.$generatePasswordAlert) { -// TextField("Length", value: self.$passwordLength, formatter: NumberFormatter()) -// Button("Generate") { -// if let password = try? generatePassword(length: self.passwordLength) { -// self.password = password -// } -// } -// -// Button("Cancel", role: .cancel) {} -// } -// -// .onAppear { -// self.name = self.cipher.loginData!.name -// self.username = self.cipher.loginData!.username ?? "" -// self.password = self.cipher.loginData!.password ?? "" -// self.uris = self.cipher.loginData!.uris ?? [] -// self.notes = self.cipher.loginData!.notes ?? "" -// self.twoFactorUri = self.cipher.loginData!.twoFactor -// } -// -// .sheet(isPresented: self.$editTwoFactor, onDismiss: { -// runAuthenticatorJob() -// }) { -// List { -// Section(header: Text("Manual configuration")) { -// TextField("Secret", text: self.$twoFactorSecret) -// Picker("Type", selection: self.$twoFactorType) { -// Text("TOTP").tag(OATHParams.OATHType.TOTP) -// } -// TextField("Digits", value: self.$twoFactorDigits, formatter: NumberFormatter()) -// if self.twoFactorType == .TOTP { -// TextField("Period", value: self.$twoFactorPeriod, formatter: NumberFormatter()) -// } else { -// TextField("Counter", value: self.$twoFactorCounter, formatter: NumberFormatter()) -// } -// -// Button("Apply") { -// let split = self.twoFactorSecret.components(separatedBy: " ") -// if split.count > 0 { -// self.twoFactorSecret = "" -// split.forEach { -// if $0 != "" { -// self.twoFactorSecret += $0 -// } -// } -// } -// -// var str = "otpauth://" + self.twoFactorType.toString() -// str += "/randomlabel?secret=" + self.twoFactorSecret -// str += "&algorithm=" + self.twoFactorAlgorithm.toString() -// str += "&digits=" + String(self.twoFactorDigits) -// -// if self.twoFactorType == .TOTP { -// str += "&period=" + String(self.twoFactorPeriod) -// } else { -// str += "&counter=" + String(self.twoFactorCounter) -// } -// -// self.twoFactorUri = str -// -// self.editTwoFactor = false -// } -// } -// } -// .onAppear { -// do { -// if let twoFactorUri = self.twoFactorUri { -// let params = try OATHParams(uri: twoFactorUri) -// self.twoFactorType = params.type -// self.twoFactorAlgorithm = params.algorithm -// self.twoFactorSecret = base32Encode(params.secret) -// self.twoFactorDigits = params.digits -// self.twoFactorPeriod = params.period -// self.twoFactorCounter = params.counter -// } -// } catch { -// self.twoFactorError = true -// } -// } -// } -// } -// -// @State var twoFactorType: OATHParams.OATHType = .TOTP -// @State var twoFactorAlgorithm: SwiftOTP.OTPAlgorithm = .sha1 -// @State var twoFactorSecret = String() -// @State var twoFactorDigits = 6 -// @State var twoFactorPeriod = 30 -// @State var twoFactorCounter = 0 -// @State var twoFactorError = false -// -// func runAuthenticatorJob() { -// Task { -// do { -// if let twoFactorUri = self.twoFactorUri { -// let engine = try OATHParams(uri: twoFactorUri) -// switch engine.type { -// case .TOTP: -// await engine.runTOTPCounter { oneTimePassword, timeLeft in -// self.oneTimePassword = oneTimePassword -// self.timeLeft = timeLeft -// } -// break -// case .HOTP: -// break -// } -// } -// } catch { -// self.twoFactorError = true -// } -// } -// } -// -// func saveCipher() throws { -// self.cipher.loginData!.name = self.name -// self.cipher.loginData!.username = self.username.emptyStringToNil() -// self.cipher.loginData!.password = self.password.emptyStringToNil() -// self.cipher.loginData!.uris = self.uris -// self.cipher.loginData!.notes = self.notes.emptyStringToNil() -// self.cipher.loginData!.twoFactor = self.twoFactorUri -// -// self.save(self.cipher) -// } -//} -// -//struct CipherSecureNoteView: View { -// var cipher: LibrePassCipher -// var index: Int -// var save: (_ cipher: LibrePassCipher) -> () -// @State var title: String = String() -// @State var note: String = String() -// -// var body: some View { -// List { -// TextField("Title", text: self.$title) -// TextField("Note", text: self.$note, axis: .vertical) -// -// ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) -// } -// -// .onAppear { -// self.title = self.cipher.secureNoteData!.title -// self.note = self.cipher.secureNoteData!.note -// } -// } -// -// func saveCipher() throws { -// self.cipher.secureNoteData!.title = title -// self.cipher.secureNoteData!.note = note -// self.save(self.cipher) -// } -//} -// -//struct CipherCardDataView: View { -// var cipher: LibrePassCipher -// var index: Int -// var save: (_ cipher: LibrePassCipher) -> () -// -// @State var name = String() -// @State var cardholderName = String() -// @State var number = String() -// @State var expMonth = String() -// @State var expYear = String() -// @State var code = String() -// @State var notes = String() -// -// var body: some View { -// List { -// Section(header: Text("Card data")) { -// TextField("Name", text: self.$name) -// TextFieldWithCopyButton(text: "Cardholder name", textBind: self.$cardholderName) -// SecureFieldWithCopyAndShowButton(text: "Card number", textBind: self.$number) -// TextFieldWithCopyButton(text: "Expires in month", textBind: self.$expMonth) -// TextFieldWithCopyButton(text: "Expires in year", textBind: self.$expYear) -// SecureFieldWithCopyAndShowButton(text: "Security code", textBind: self.$code) -// } -// -// Section(header: Text("Notes")) { -// TextField("Note", text: self.$notes, axis: .vertical) -// } -// -// Section { -// ButtonWithSpinningWheel(text: "Save", task: self.saveCipher) -// } -// } -// -// .onAppear { -// self.name = self.cipher.cardData!.name -// self.cardholderName = self.cipher.cardData!.cardholderName -// self.number = self.cipher.cardData!.number -// -// if self.cipher.cardData!.expMonth == nil { -// self.expMonth = "" -// } else { -// self.expMonth = String(self.cipher.cardData!.expMonth!) -// } -// -// if self.cipher.cardData!.expYear == nil { -// self.expYear = "" -// } else { -// self.expYear = String(self.cipher.cardData!.expYear!) -// } -// -// self.code = self.cipher.cardData!.code ?? "" -// self.notes = self.cipher.cardData!.notes ?? "" -// } -// } -// -// func saveCipher() throws { -// self.cipher.cardData!.name = self.name -// self.cipher.cardData!.cardholderName = self.cardholderName -// self.cipher.cardData!.number = self.number -// self.cipher.cardData!.expMonth = Int(self.expMonth) ?? nil -// self.cipher.cardData!.expYear = Int(self.expYear) ?? nil -// self.cipher.cardData!.code = self.code.emptyStringToNil() -// self.cipher.cardData!.notes = self.notes.emptyStringToNil() -// -// self.save(self.cipher) -// } -//} -// -//struct CipherButton: View { -// var cipher: LibrePassCipher -// -// var body: some View { -// switch self.cipher.type { -// case .Login: -// HStack { -// Image(systemName: "person.crop.circle.fill") -// VStack { -// HStack{ -// Text(self.cipher.loginData!.name) -// Spacer() -// } -// if let username = self.cipher.loginData!.username { -// HStack { -// Text(username) -// Spacer() -// } -// } -// } -// } -// case .SecureNote: -// HStack { -// Image(systemName: "note.text") -// Text(self.cipher.secureNoteData!.title) -// Spacer() -// } -// case .Card: -// HStack { -// Image(systemName: "creditcard") -// Text(self.cipher.cardData!.name) -// Spacer() -// } -// } -// } -//} diff --git a/LibrePass/LibrePassManagerWindow.swift b/LibrePass/LibrePassManagerWindow.swift deleted file mode 100644 index 2d78a15..0000000 --- a/LibrePass/LibrePassManagerWindow.swift +++ /dev/null @@ -1,148 +0,0 @@ -// -// LibrePassManagerWindow.swift -// LibrePass -// -// Created by Zapomnij on 18/02/2024. -// - -import SwiftUI - -struct LibrePassManagerWindow: View { - @State private var errorString: String = " " - @State private var showAlert = false - @State private var new = false - - @Binding var lClient: LibrePassClient - - @Binding var loggedIn: Bool - @Binding var locallyLoggedIn: Bool - - @State var refreshIndicator: Bool = false - @State var deletionIndicator: Bool = false - - @State var toDelete: IndexSet = [] - - @State var accountSettings: Bool = false - - var body: some View { - NavigationView { - List { - ForEach(self.lClient.vault.vault, id: \.self.id) { cipher in - let index = lClient.vault.vault.firstIndex(where: { vaultCipher in vaultCipher.id == cipher.id })! - -// NavigationLink(destination: CipherView(lClient: $lClient, cipher: cipher, index: index)) { -// HStack { -// CipherButton(cipher: cipher) -// -// Spacer() -// } -// } - } - .onDelete { indexSet in - self.toDelete = indexSet - self.deletionIndicator = true - } - } - - .navigationTitle("Vault") - .toolbar { - HStack { - SpinningWheel(isPresented: self.$deletionIndicator, task: self.deleteCiphers) - SpinningWheel(isPresented: self.$refreshIndicator, task: self.syncVault) - - if !self.refreshIndicator && !self.deletionIndicator { - Button(action: { - self.refreshIndicator = true - }) { - Image(systemName: "arrow.clockwise") - } - - Menu { - Button(action: { - self.accountSettings = true - }) { - Image(systemName: "gearshape") - Text("Account settings") - } - - Button(action: { - self.lClient.unAuth() - self.loggedIn = false - }) { - Image(systemName: "lock") - Text("Lock vault") - } - - Button(action: { - self.new.toggle() - }) { - Image(systemName: "plus") - Text("New cipher") - } - } label: { - Image(systemName: ("ellipsis.circle")) - } - } - } - } - } - - .alert(self.errorString, isPresented: self.$showAlert) { - Button("OK", role: .cancel) { - lClient.unAuth() - self.loggedIn = false - } - } - - .alert("Select cipher type", isPresented: self.$new) { - Button("Login data") { - self.newCipher(type: .Login) - } - - Button("Secure note") { - self.newCipher(type: .SecureNote) - } - - Button("Card data") { - self.newCipher(type: .Card) - } - - Button("Cancel", role: .cancel) {} - } - - .sheet(isPresented: self.$accountSettings) { - LibrePassAccountSettings(lClient: self.$lClient, locallyLoggedIn: self.$locallyLoggedIn, loggedIn: self.$loggedIn) - } - } - - func syncVault() throws { - if NetworkMonitor.shared.isConnected { - try self.lClient.syncVault() - } - } - - func deleteCiphers() throws { - Task { - for index in self.toDelete { - try self.lClient.delete(id: self.lClient.vault.vault[index].id) - } - } - } - - func newCipher(type: LibrePassCipher.CipherType) { - Task { - let cipher = LibrePassCipher(id: lClient.generateId(), owner: lClient.credentialsDatabase!.userId, type: type) - - do { - try self.lClient.put(cipher: cipher) - try self.syncVault() - } catch ApiClientErrors.StatusCodeNot200(let statusCode, let body){ - self.errorString = String(statusCode) + ": " + body.error - self.showAlert = true - } catch { - self.errorString = error.localizedDescription - self.showAlert = true - } - } - } -} diff --git a/LibrePass/LibrePassRegistrationWindow.swift b/LibrePass/LibrePassRegistrationWindow.swift deleted file mode 100644 index 796c4a0..0000000 --- a/LibrePass/LibrePassRegistrationWindow.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// LibrePassRegistrationWindow.swift -// LibrePass -// -// Created by Zapomnij on 24/02/2024. -// - -import SwiftUI - -struct LibrePassRegistrationWindow: View { - @Environment(\.presentationMode) var presentationMode - - @Binding var lClient: LibrePassClient - - @State var apiServer = CustomEnvironment.rootURL - @State var email = String() - @State var password = String() - @State var confirmPassword = String() - @State var passwordHint = String() - @State var showAlert = false - @State var registered = false - - @State var errorString = " " - - var body: some View { - List { - TextField("Email", text: $email) - .autocapitalization(.none) - SecureField("Password", text: $password) - .autocapitalization(.none) - SecureField("Confirm password", text: $confirmPassword) - .autocapitalization(.none) - TextField("Password hint", text: $passwordHint) - TextField("API server", text: $apiServer) - .autocapitalization(.none) - - Button("Register") { - if self.confirmPassword != self.password { - self.confirmPassword = "" - - self.errorString = "Password doesn't match" - return - } - - do { - self.lClient.replaceApiClient(apiUrl: apiServer) - try self.lClient.register(email: self.email, password: self.password, passwordHint: self.passwordHint) - - self.errorString = "Check your mailbox, verify email and log in" - self.registered = true - self.showAlert = true - } catch { - self.errorString = error.localizedDescription - self.showAlert = true - } - } - } - - .navigationTitle("Registration") - - .alert(self.errorString, isPresented: self.$showAlert) { - Button("OK", role: .cancel) { - if self.registered { - self.registered = false - self.presentationMode.wrappedValue.dismiss() - } - } - } - } -} - diff --git a/LibrePass/Utils.swift b/LibrePass/Utils.swift deleted file mode 100644 index a76a25b..0000000 --- a/LibrePass/Utils.swift +++ /dev/null @@ -1,135 +0,0 @@ -// -// Utils.swift -// LibrePass -// -// Created by Zapomnij on 25/02/2024. -// - -import SwiftUI - -struct SpinningWheel: View { - @Binding var isPresented: Bool - var task: () throws -> () - - @State var showAlert: Bool = false - @State var errorString = String() - - var body: some View { - if self.isPresented { - ProgressView() - .progressViewStyle(CircularProgressViewStyle(tint: Color.secondary)) - .onAppear { - DispatchQueue.main.asyncAfter(deadline: .now()) { - do { - try self.task() - self.isPresented = false - } catch LibrePassApiErrors.WithMessage(let message) { - self.errorString = message - self.showAlert = true - } catch ApiClientErrors.StatusCodeNot200(let statusCode, let body) { - self.errorString = String(statusCode) + ": " + body.error - self.showAlert = true - } catch { - self.errorString = error.localizedDescription - self.showAlert = true - } - } - } - .alert(self.errorString, isPresented: self.$showAlert) { - Button("OK", role: .cancel) { - self.isPresented = false - } - } - } - } -} - -struct ButtonWithSpinningWheel: View { - var text: String - var task: () throws -> () - var color: Color? - - @State var isPresented = false - - var body: some View { - HStack { - if let color = self.color { - Button(text) { self.isPresented = true } - .foregroundStyle(color) - } else { - Button(text) { self.isPresented = true } - } - Spacer() - SpinningWheel(isPresented: self.$isPresented, task: self.task) - } - } -} - -struct TextFieldWithCopyButton: View { - var text: String - @Binding var textBind: String - - var body: some View { - HStack { - TextField(self.text, text: self.$textBind) - .autocapitalization(.none) - Spacer() - Button(action: { - UIPasteboard.general.string = self.textBind - }) { - Image(systemName: "doc.on.doc") - } - .buttonStyle(.plain) - } - } -} - -struct SecureFieldWithCopyAndShowButton: View { - var text: String - @Binding var textBind: String - - @State var showPassword = false - - var body: some View { - HStack { - if self.showPassword { - TextField(self.text, text: self.$textBind) - .autocapitalization(.none) - } else { - SecureField(self.text, text: self.$textBind) - .autocapitalization(.none) - } - - Spacer() - - Button(action: { - self.showPassword.toggle() - }) { - if self.showPassword { - Image(systemName: "eye") - } else { - Image(systemName: "eye.fill") - } - } - .buttonStyle(.plain) - - Button(action: { - UIPasteboard.general.string = self.textBind - }) { - Image(systemName: "doc.on.doc") - } - .buttonStyle(.plain) - } - } -} - - -extension String { - func emptyStringToNil() -> Self? { - if self.isEmpty { - return nil - } - - return self - } -} From 8c11ad350e6322ea21fdbbe1f4626b3fc51f0c34 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Wed, 17 Apr 2024 23:16:30 -0500 Subject: [PATCH 16/21] Fix - Deleted more files that were not required --- LibrePass.xcodeproj/project.pbxproj | 4 ---- LibrePass/API/CredentialsUpdate.swift | 24 ------------------------ LibrePass/App/NetworkMonitor.swift | 26 -------------------------- 3 files changed, 54 deletions(-) delete mode 100644 LibrePass/API/CredentialsUpdate.swift delete mode 100644 LibrePass/App/NetworkMonitor.swift diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index f102143..99843f5 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -26,7 +26,6 @@ B253F1E52B83976900D048F9 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B253F1E32B83976900D048F9 /* LICENSE */; }; B2D91A1D2B8393C70004561A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2D91A1C2B8393C70004561A /* Assets.xcassets */; }; B2D91A202B8393C70004561A /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2D91A1F2B8393C70004561A /* Preview Assets.xcassets */; }; - B2DD90712B8D10D4003D84B7 /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -49,7 +48,6 @@ B2D91A152B8393C60004561A /* LibrePass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LibrePass.app; sourceTree = BUILT_PRODUCTS_DIR; }; B2D91A1C2B8393C70004561A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; B2D91A1F2B8393C70004561A /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -87,7 +85,6 @@ 179E98132BC1DAB900D71ACA /* App */ = { isa = PBXGroup; children = ( - B2DD90702B8D10D4003D84B7 /* NetworkMonitor.swift */, B253F1D22B83942B00D048F9 /* LibrePassApp.swift */, ); path = App; @@ -275,7 +272,6 @@ 17B4516F2BCC8CE600C5E1AE /* LoginRequest.swift in Sources */, 17B451742BCDB90B00C5E1AE /* Credentials.swift in Sources */, 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */, - B2DD90712B8D10D4003D84B7 /* NetworkMonitor.swift in Sources */, 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */, 17B4516D2BCC832900C5E1AE /* UserCredentialResponse.swift in Sources */, B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */, diff --git a/LibrePass/API/CredentialsUpdate.swift b/LibrePass/API/CredentialsUpdate.swift deleted file mode 100644 index 7dadbbe..0000000 --- a/LibrePass/API/CredentialsUpdate.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// CredentialsUpdate.swift -// LibrePass -// -// Created by Zapomnij on 28/02/2024. -// - -import Foundation - -extension LibrePassClient { - struct LibrePassChangePasswordRequest: Codable { - var oldSharedKey: String - var newPublicKey: String - var newSharedKey: String - var newPasswordHint: String - var parallelism: Int - var memory: Int - var iterations: Int - } - - mutating func changePassword(currentPassword: String, newPassword: String, newPasswordHint: String) throws { - - } -} diff --git a/LibrePass/App/NetworkMonitor.swift b/LibrePass/App/NetworkMonitor.swift deleted file mode 100644 index c29dc64..0000000 --- a/LibrePass/App/NetworkMonitor.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// NetworkMonitor.swift -// LibrePass -// -// Created by Zapomnij on 26/02/2024. -// - -import Foundation -import Network - -class NetworkMonitor: ObservableObject { - static let shared = NetworkMonitor() - - private let monitor = NWPathMonitor() - private let dispatchQueue = DispatchQueue(label: "Monitor") - - var isConnected = true - - init() { - self.monitor.pathUpdateHandler = { path in - self.isConnected = path.status != .unsatisfied - } - - self.monitor.start(queue: self.dispatchQueue) - } -} From 62f7431dfcc3f36b3d7b31ae3dd19d92464de91c Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Wed, 17 Apr 2024 23:18:34 -0500 Subject: [PATCH 17/21] Fix - Updated gitignore to not push configs --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a9867ef..39f5b2a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ /Pods /**/.DS_Store /**/*.xcuserdatad + +/LibrePass/Configs From 2816da61d306d429f0dd527df3aaa3f6c96ce8a8 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Wed, 17 Apr 2024 23:26:11 -0500 Subject: [PATCH 18/21] Added alert for license conflict such that more devs are aware when contributing to project --- COPYING.IOS | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 COPYING.IOS diff --git a/COPYING.IOS b/COPYING.IOS new file mode 100644 index 0000000..66bd62a --- /dev/null +++ b/COPYING.IOS @@ -0,0 +1,13 @@ +The LibrePass iOS developers are aware that the terms of service that +apply to apps distributed via Apple's App Store services may conflict +with rights granted under the LibrePass iOS license, the GNU General +Public License, version 3 or (at your option) any later version. The +copyright holders of the LibrePass iOS app do not wish this conflict +to prevent the otherwise-compliant distribution of derived apps via +the App Store. Therefore, we have committed not to pursue any license +violation that results solely from the conflict between the GNU GPLv3 +or any later version and the Apple App Store terms of service. In +other words, as long as you comply with the GPL in all other respects, +including its requirements to provide users with source code and the +text of the license, we will not object to your distribution of the +LibrePass iOS app through the App Store. From c4e697e311a50663873604f06e1fc4cc1ebfb2ca Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sat, 20 Apr 2024 00:48:48 -0500 Subject: [PATCH 19/21] Fix - Removed almofire library as there no use of it Also added macos support however still need to fix the UI for it but starting small steps --- LibrePass.xcodeproj/project.pbxproj | 25 ----------- .../xcshareddata/swiftpm/Package.resolved | 11 +---- .../Core/Auth/ViewModel/AuthViewModel.swift | 24 +++++----- LibrePass/Core/Auth/Views/LoginView.swift | 16 +++++-- LibrePass/Core/Auth/Views/SignupView.swift | 45 ++++++++++++++++--- 5 files changed, 65 insertions(+), 56 deletions(-) diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 99843f5..a21ebd1 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -13,8 +13,6 @@ 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 174EA0972BC3609E00084D2C /* Argon2Swift */; }; 175190532BCA3EEB0076460A /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175190522BCA3EEB0076460A /* HomeView.swift */; }; 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; - 177B62CC2BCB14DF003EBC65 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 177B62CB2BCB14DF003EBC65 /* Alamofire */; }; - 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */; }; 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; 17B4516B2BCC6E1C00C5E1AE /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */; }; @@ -56,9 +54,7 @@ buildActionMask = 2147483647; files = ( 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */, - 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */, 17B4516B2BCC6E1C00C5E1AE /* KeychainSwift in Frameworks */, - 177B62CC2BCB14DF003EBC65 /* Alamofire in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -204,8 +200,6 @@ name = LibrePass; packageProductDependencies = ( 174EA0972BC3609E00084D2C /* Argon2Swift */, - 177B62CB2BCB14DF003EBC65 /* Alamofire */, - 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */, 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */, ); productName = LibrePass; @@ -239,7 +233,6 @@ mainGroup = B2D91A0C2B8393C60004561A; packageReferences = ( 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */, - 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */, 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */, ); productRefGroup = B2D91A162B8393C60004561A /* Products */; @@ -731,14 +724,6 @@ kind = branch; }; }; - 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/Alamofire/Alamofire"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 5.9.1; - }; - }; 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/evgenyneu/keychain-swift"; @@ -755,16 +740,6 @@ package = 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */; productName = Argon2Swift; }; - 177B62CB2BCB14DF003EBC65 /* Alamofire */ = { - isa = XCSwiftPackageProductDependency; - package = 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = Alamofire; - }; - 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */ = { - isa = XCSwiftPackageProductDependency; - package = 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */; - productName = AlamofireDynamic; - }; 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */ = { isa = XCSwiftPackageProductDependency; package = 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */; diff --git a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 07efcad..082f768 100644 --- a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,15 +1,6 @@ { - "originHash" : "d79071d8e42f5f73fb37c202e359f0f236e869e1a14ab406e5a15af3a5306cfb", + "originHash" : "947f1689b14ee5d6f4b0a0c371d0c2a7adac287c68881080b01d6c4647e460e1", "pins" : [ - { - "identity" : "alamofire", - "kind" : "remoteSourceControl", - "location" : "https://github.com/Alamofire/Alamofire", - "state" : { - "revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a", - "version" : "5.9.1" - } - }, { "identity" : "argon2swift", "kind" : "remoteSourceControl", diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift index 9f21f48..cac728c 100644 --- a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -109,17 +109,19 @@ class AuthViewModel: ObservableObject { "Accept": "application/json" ] - return try await withCheckedThrowingContinuation { continuation in - AF.request(CustomEnvironment.rootURL + endpoint + "/preLogin", method: .get, parameters: parameters, headers: headers) - .responseDecodable(of: PreLoginResponse.self) { response in - switch response.result { - case let .success(data): - continuation.resume(returning: data) - case let .failure(error): - continuation.resume(throwing: error) - } - } - } + return PreLoginResponse(parallelism: 1, memory: 1, iterations: 1, serverPublicKey: "asd") + +// return try await withCheckedThrowingContinuation { continuation in +// AF.request(CustomEnvironment.rootURL + endpoint + "/preLogin", method: .get, parameters: parameters, headers: headers) +// .responseDecodable(of: PreLoginResponse.self) { response in +// switch response.result { +// case let .success(data): +// continuation.resume(returning: data) +// case let .failure(error): +// continuation.resume(throwing: error) +// } +// } +// } } private func login(withEmail email: String, password: String) async throws { diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift index 3a6a5e2..6cabae5 100644 --- a/LibrePass/Core/Auth/Views/LoginView.swift +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -13,7 +13,7 @@ struct LoginView: View { @State private var customServerURL = "" @State private var isShowingCustomURLSheet = false @State private var selectedServerType: ServerType = .official - + @EnvironmentObject var authViewModel: AuthViewModel var body: some View { @@ -28,7 +28,9 @@ struct LoginView: View { VStack(spacing: 24) { InputView(text: $email, title: "Email Address", placeholder: "name@example.com") +#if os(iOS) .autocapitalization(.none) +#endif InputView(text: $password, title: "Password", placeholder: "Enter your password", isSecureField: true) @@ -49,7 +51,7 @@ struct LoginView: View { } else { isShowingCustomURLSheet = false } - } + } } } .padding(.horizontal) @@ -67,7 +69,7 @@ struct LoginView: View { Image(systemName: "arrow.right") } .foregroundColor(.white) - .frame(width: UIScreen.main.bounds.width - 32, height: 48) + .frame(width: screenWidth() - 32, height: 48) } .background(Color(.systemBlue)) .disabled(!formIsValid) @@ -127,6 +129,14 @@ struct LoginView: View { } } } + + private func screenWidth() -> CGFloat { +#if os(iOS) + return UIScreen.main.bounds.width +#elseif os(macOS) + return NSScreen.main?.visibleFrame.width ?? 0 +#endif + } } extension LoginView: AuthenticationFormProtocol { diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift index 9ac8d51..15bf105 100644 --- a/LibrePass/Core/Auth/Views/SignupView.swift +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -32,7 +32,9 @@ struct SignupView: View { VStack(spacing: 24) { InputView(text: $email, title: "Email Address", placeholder: "name@example.com") +#if os(iOS) .autocapitalization(.none) +#endif InputView(text: $password, title: "Password", placeholder: "Enter your password", isSecureField: true) @@ -92,7 +94,7 @@ struct SignupView: View { Image(systemName: "arrow.right") } .foregroundColor(.white) - .frame(width: UIScreen.main.bounds.width - 32, height: 48) + .frame(width: screenWidth() - 32, height: 48) } .background(Color(.systemBlue)) .disabled(!formIsValid) @@ -123,6 +125,14 @@ struct SignupView: View { } } } + + private func screenWidth() -> CGFloat { +#if os(iOS) + return UIScreen.main.bounds.width +#elseif os(macOS) + return NSScreen.main?.visibleFrame.width ?? 0 +#endif + } } extension SignupView: AuthenticationFormProtocol { @@ -172,16 +182,37 @@ struct ServerURLView: View { List { TextField("Enter Server URL", text: $serverURL) } - .background(Color(.systemGray6)) + .background(Color.systemGray6) } .navigationTitle("Self-Hosted") - .navigationBarItems(trailing: Button("Done") { - UserDefaults.standard.set(serverURL, forKey: "SelfHostedURL") - isPresented = false - }) +#if os(iOS) + .navigationBarItems(trailing: doneButton) +#endif + } + .background(Color.systemGray6.ignoresSafeArea()) + } + +#if os(iOS) + private var doneButton: some View { + Button("Done") { + UserDefaults.standard.set(serverURL, forKey: "SelfHostedURL") + isPresented = false } - .background(Color(.systemGray6).ignoresSafeArea()) } +#endif +} + + +extension Color { +#if os(iOS) + static var systemGray6: Color { + return Color(UIColor.systemGray6) + } +#elseif os(macOS) + static var systemGray6: Color { + return Color(NSColor(calibratedWhite: 0.6, alpha: 1.0)) + } +#endif } enum ServerType { From 9ba213cb214e8848b19426d502a7c895f1f5fe79 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sat, 20 Apr 2024 10:47:22 -0500 Subject: [PATCH 20/21] Revert "Fix - Removed almofire library as there no use of it" This reverts commit c4e697e311a50663873604f06e1fc4cc1ebfb2ca. --- LibrePass.xcodeproj/project.pbxproj | 25 +++++++++++ .../xcshareddata/swiftpm/Package.resolved | 11 ++++- .../Core/Auth/ViewModel/AuthViewModel.swift | 24 +++++----- LibrePass/Core/Auth/Views/LoginView.swift | 16 ++----- LibrePass/Core/Auth/Views/SignupView.swift | 45 +++---------------- 5 files changed, 56 insertions(+), 65 deletions(-) diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index a21ebd1..99843f5 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 174EA0972BC3609E00084D2C /* Argon2Swift */; }; 175190532BCA3EEB0076460A /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175190522BCA3EEB0076460A /* HomeView.swift */; }; 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176A30612BC1C103005C143E /* CustomEnvironment.swift */; }; + 177B62CC2BCB14DF003EBC65 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 177B62CB2BCB14DF003EBC65 /* Alamofire */; }; + 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */; }; 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; 17B4516B2BCC6E1C00C5E1AE /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */; }; @@ -54,7 +56,9 @@ buildActionMask = 2147483647; files = ( 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */, + 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */, 17B4516B2BCC6E1C00C5E1AE /* KeychainSwift in Frameworks */, + 177B62CC2BCB14DF003EBC65 /* Alamofire in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -200,6 +204,8 @@ name = LibrePass; packageProductDependencies = ( 174EA0972BC3609E00084D2C /* Argon2Swift */, + 177B62CB2BCB14DF003EBC65 /* Alamofire */, + 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */, 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */, ); productName = LibrePass; @@ -233,6 +239,7 @@ mainGroup = B2D91A0C2B8393C60004561A; packageReferences = ( 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */, + 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */, 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */, ); productRefGroup = B2D91A162B8393C60004561A /* Products */; @@ -724,6 +731,14 @@ kind = branch; }; }; + 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/Alamofire/Alamofire"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.9.1; + }; + }; 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/evgenyneu/keychain-swift"; @@ -740,6 +755,16 @@ package = 174EA0962BC3609E00084D2C /* XCRemoteSwiftPackageReference "Argon2Swift" */; productName = Argon2Swift; }; + 177B62CB2BCB14DF003EBC65 /* Alamofire */ = { + isa = XCSwiftPackageProductDependency; + package = 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */; + productName = Alamofire; + }; + 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */ = { + isa = XCSwiftPackageProductDependency; + package = 177B62CA2BCB14DF003EBC65 /* XCRemoteSwiftPackageReference "Alamofire" */; + productName = AlamofireDynamic; + }; 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */ = { isa = XCSwiftPackageProductDependency; package = 17B451692BCC6E1C00C5E1AE /* XCRemoteSwiftPackageReference "keychain-swift" */; diff --git a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 082f768..07efcad 100644 --- a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,6 +1,15 @@ { - "originHash" : "947f1689b14ee5d6f4b0a0c371d0c2a7adac287c68881080b01d6c4647e460e1", + "originHash" : "d79071d8e42f5f73fb37c202e359f0f236e869e1a14ab406e5a15af3a5306cfb", "pins" : [ + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire", + "state" : { + "revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a", + "version" : "5.9.1" + } + }, { "identity" : "argon2swift", "kind" : "remoteSourceControl", diff --git a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift index cac728c..9f21f48 100644 --- a/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift +++ b/LibrePass/Core/Auth/ViewModel/AuthViewModel.swift @@ -109,19 +109,17 @@ class AuthViewModel: ObservableObject { "Accept": "application/json" ] - return PreLoginResponse(parallelism: 1, memory: 1, iterations: 1, serverPublicKey: "asd") - -// return try await withCheckedThrowingContinuation { continuation in -// AF.request(CustomEnvironment.rootURL + endpoint + "/preLogin", method: .get, parameters: parameters, headers: headers) -// .responseDecodable(of: PreLoginResponse.self) { response in -// switch response.result { -// case let .success(data): -// continuation.resume(returning: data) -// case let .failure(error): -// continuation.resume(throwing: error) -// } -// } -// } + return try await withCheckedThrowingContinuation { continuation in + AF.request(CustomEnvironment.rootURL + endpoint + "/preLogin", method: .get, parameters: parameters, headers: headers) + .responseDecodable(of: PreLoginResponse.self) { response in + switch response.result { + case let .success(data): + continuation.resume(returning: data) + case let .failure(error): + continuation.resume(throwing: error) + } + } + } } private func login(withEmail email: String, password: String) async throws { diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift index 6cabae5..3a6a5e2 100644 --- a/LibrePass/Core/Auth/Views/LoginView.swift +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -13,7 +13,7 @@ struct LoginView: View { @State private var customServerURL = "" @State private var isShowingCustomURLSheet = false @State private var selectedServerType: ServerType = .official - + @EnvironmentObject var authViewModel: AuthViewModel var body: some View { @@ -28,9 +28,7 @@ struct LoginView: View { VStack(spacing: 24) { InputView(text: $email, title: "Email Address", placeholder: "name@example.com") -#if os(iOS) .autocapitalization(.none) -#endif InputView(text: $password, title: "Password", placeholder: "Enter your password", isSecureField: true) @@ -51,7 +49,7 @@ struct LoginView: View { } else { isShowingCustomURLSheet = false } - } + } } } .padding(.horizontal) @@ -69,7 +67,7 @@ struct LoginView: View { Image(systemName: "arrow.right") } .foregroundColor(.white) - .frame(width: screenWidth() - 32, height: 48) + .frame(width: UIScreen.main.bounds.width - 32, height: 48) } .background(Color(.systemBlue)) .disabled(!formIsValid) @@ -129,14 +127,6 @@ struct LoginView: View { } } } - - private func screenWidth() -> CGFloat { -#if os(iOS) - return UIScreen.main.bounds.width -#elseif os(macOS) - return NSScreen.main?.visibleFrame.width ?? 0 -#endif - } } extension LoginView: AuthenticationFormProtocol { diff --git a/LibrePass/Core/Auth/Views/SignupView.swift b/LibrePass/Core/Auth/Views/SignupView.swift index 15bf105..9ac8d51 100644 --- a/LibrePass/Core/Auth/Views/SignupView.swift +++ b/LibrePass/Core/Auth/Views/SignupView.swift @@ -32,9 +32,7 @@ struct SignupView: View { VStack(spacing: 24) { InputView(text: $email, title: "Email Address", placeholder: "name@example.com") -#if os(iOS) .autocapitalization(.none) -#endif InputView(text: $password, title: "Password", placeholder: "Enter your password", isSecureField: true) @@ -94,7 +92,7 @@ struct SignupView: View { Image(systemName: "arrow.right") } .foregroundColor(.white) - .frame(width: screenWidth() - 32, height: 48) + .frame(width: UIScreen.main.bounds.width - 32, height: 48) } .background(Color(.systemBlue)) .disabled(!formIsValid) @@ -125,14 +123,6 @@ struct SignupView: View { } } } - - private func screenWidth() -> CGFloat { -#if os(iOS) - return UIScreen.main.bounds.width -#elseif os(macOS) - return NSScreen.main?.visibleFrame.width ?? 0 -#endif - } } extension SignupView: AuthenticationFormProtocol { @@ -182,37 +172,16 @@ struct ServerURLView: View { List { TextField("Enter Server URL", text: $serverURL) } - .background(Color.systemGray6) + .background(Color(.systemGray6)) } .navigationTitle("Self-Hosted") -#if os(iOS) - .navigationBarItems(trailing: doneButton) -#endif - } - .background(Color.systemGray6.ignoresSafeArea()) - } - -#if os(iOS) - private var doneButton: some View { - Button("Done") { - UserDefaults.standard.set(serverURL, forKey: "SelfHostedURL") - isPresented = false + .navigationBarItems(trailing: Button("Done") { + UserDefaults.standard.set(serverURL, forKey: "SelfHostedURL") + isPresented = false + }) } + .background(Color(.systemGray6).ignoresSafeArea()) } -#endif -} - - -extension Color { -#if os(iOS) - static var systemGray6: Color { - return Color(UIColor.systemGray6) - } -#elseif os(macOS) - static var systemGray6: Color { - return Color(NSColor(calibratedWhite: 0.6, alpha: 1.0)) - } -#endif } enum ServerType { From 83e229af39c1fc3378681833624cf12f810df045 Mon Sep 17 00:00:00 2001 From: Nish Patel Date: Sat, 20 Apr 2024 10:47:27 -0500 Subject: [PATCH 21/21] Auto stash before revert of "Fix - Removed almofire library as there no use of it" --- LibrePass.xcodeproj/project.pbxproj | 8 +++- .../xcshareddata/swiftpm/Package.resolved | 42 ------------------- LibrePass/Core/Auth/Views/LoginView.swift | 1 + 3 files changed, 7 insertions(+), 44 deletions(-) delete mode 100644 LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/LibrePass.xcodeproj/project.pbxproj b/LibrePass.xcodeproj/project.pbxproj index 99843f5..ff82f31 100644 --- a/LibrePass.xcodeproj/project.pbxproj +++ b/LibrePass.xcodeproj/project.pbxproj @@ -8,7 +8,6 @@ /* Begin PBXBuildFile section */ 17349C0D2BC1E19D00452814 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0C2BC1E19D00452814 /* ContentView.swift */; }; - 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0E2BC1E4A100452814 /* LoginView.swift */; }; 17349C112BC1E4B300452814 /* SignupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C102BC1E4B300452814 /* SignupView.swift */; }; 174EA0982BC3609E00084D2C /* Argon2Swift in Frameworks */ = {isa = PBXBuildFile; productRef = 174EA0972BC3609E00084D2C /* Argon2Swift */; }; 175190532BCA3EEB0076460A /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 175190522BCA3EEB0076460A /* HomeView.swift */; }; @@ -17,6 +16,7 @@ 177B62CE2BCB14DF003EBC65 /* AlamofireDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = 177B62CD2BCB14DF003EBC65 /* AlamofireDynamic */; }; 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 177B62CF2BCB78B1003EBC65 /* PreLoginResponse.swift */; }; 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 179E981B2BC1DDBB00D71ACA /* AuthViewModel.swift */; }; + 17AABE232BD3913500B0AA8C /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17349C0E2BC1E4A100452814 /* LoginView.swift */; }; 17B4516B2BCC6E1C00C5E1AE /* KeychainSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 17B4516A2BCC6E1C00C5E1AE /* KeychainSwift */; }; 17B4516D2BCC832900C5E1AE /* UserCredentialResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B4516C2BCC832900C5E1AE /* UserCredentialResponse.swift */; }; 17B4516F2BCC8CE600C5E1AE /* LoginRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17B4516E2BCC8CE600C5E1AE /* LoginRequest.swift */; }; @@ -272,10 +272,10 @@ 17B4516F2BCC8CE600C5E1AE /* LoginRequest.swift in Sources */, 17B451742BCDB90B00C5E1AE /* Credentials.swift in Sources */, 177B62D02BCB78B1003EBC65 /* PreLoginResponse.swift in Sources */, - 17349C0F2BC1E4A100452814 /* LoginView.swift in Sources */, 17B4516D2BCC832900C5E1AE /* UserCredentialResponse.swift in Sources */, B253F1DD2B83942B00D048F9 /* LibrePassApp.swift in Sources */, 17349C0D2BC1E19D00452814 /* ContentView.swift in Sources */, + 17AABE232BD3913500B0AA8C /* LoginView.swift in Sources */, 17B451722BCD866900C5E1AE /* RegisterRequest.swift in Sources */, 176A30622BC1C103005C143E /* CustomEnvironment.swift in Sources */, 179E981C2BC1DDBB00D71ACA /* AuthViewModel.swift in Sources */, @@ -342,6 +342,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -442,6 +443,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -546,6 +548,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -604,6 +607,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 17.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; diff --git a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 07efcad..0000000 --- a/LibrePass.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,42 +0,0 @@ -{ - "originHash" : "d79071d8e42f5f73fb37c202e359f0f236e869e1a14ab406e5a15af3a5306cfb", - "pins" : [ - { - "identity" : "alamofire", - "kind" : "remoteSourceControl", - "location" : "https://github.com/Alamofire/Alamofire", - "state" : { - "revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a", - "version" : "5.9.1" - } - }, - { - "identity" : "argon2swift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/tmthecoder/Argon2Swift", - "state" : { - "branch" : "main", - "revision" : "53543623fefe68461b7eeea03d7f96677c2fd76d" - } - }, - { - "identity" : "keychain-swift", - "kind" : "remoteSourceControl", - "location" : "https://github.com/evgenyneu/keychain-swift", - "state" : { - "revision" : "75677d8be3c50898c8ffd0d107f88aa2740301fc", - "version" : "22.0.0" - } - }, - { - "identity" : "phc-winner-argon2", - "kind" : "remoteSourceControl", - "location" : "https://github.com/P-H-C/phc-winner-argon2.git", - "state" : { - "branch" : "master", - "revision" : "f57e61e19229e23c4445b85494dbf7c07de721cb" - } - } - ], - "version" : 3 -} diff --git a/LibrePass/Core/Auth/Views/LoginView.swift b/LibrePass/Core/Auth/Views/LoginView.swift index 3a6a5e2..20c7f86 100644 --- a/LibrePass/Core/Auth/Views/LoginView.swift +++ b/LibrePass/Core/Auth/Views/LoginView.swift @@ -106,6 +106,7 @@ struct LoginView: View { .fontWeight(.bold) } .font(.system(size: 16)) + } .padding() }