change a lot, the structure will be stable this time

This commit is contained in:
Bob Sun 2017-01-22 01:42:36 +08:00
parent 8e997cc868
commit 36bf40741c
No known key found for this signature in database
GPG key ID: 1F86BA2052FED3B4
14 changed files with 579 additions and 208 deletions

View file

@ -1,2 +1,3 @@
github "SwiftGit2/SwiftGit2"
github "SVProgressHUD/SVProgressHUD"
github "radex/SwiftyUserDefaults"

3
Podfile Normal file
View file

@ -0,0 +1,3 @@
target 'pass' do
pod 'ObjectivePGP'
end

View file

@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
94BA784B85E071D25EE89B59 /* libPods-pass.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ADCE7A5C3CCC67D7D21BB3C4 /* libPods-pass.a */; };
DC3DC8391E2F63240062A988 /* PasswordDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC3DC8381E2F63240062A988 /* PasswordDetailViewController.swift */; };
DC917BD71E2E8231000FDF54 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC917BD61E2E8231000FDF54 /* AppDelegate.swift */; };
DC917BDC1E2E8231000FDF54 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DC917BDA1E2E8231000FDF54 /* Main.storyboard */; };
@ -15,7 +16,11 @@
DC917BEF1E2F38C5000FDF54 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC917BEE1E2F38C5000FDF54 /* Result.framework */; };
DC917BF11E2F38C9000FDF54 /* SwiftGit2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC917BF01E2F38C9000FDF54 /* SwiftGit2.framework */; };
DC917BF31E2F3B42000FDF54 /* PasswordTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC917BF21E2F3B42000FDF54 /* PasswordTableViewController.swift */; };
DC9C451C1E2F8CA7005845CA /* ChangeGitRepositoryTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC9C451B1E2F8CA7005845CA /* ChangeGitRepositoryTableViewController.swift */; };
DCA049961E3357E000522E8F /* SwiftyUserDefaults.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA049951E3357E000522E8F /* SwiftyUserDefaults.framework */; };
DCA049981E33586A00522E8F /* DefaultKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA049971E33586A00522E8F /* DefaultKeys.swift */; };
DCA0499A1E335CC800522E8F /* GitServerSettingTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA049991E335CC800522E8F /* GitServerSettingTableViewController.swift */; };
DCA0499C1E3362F400522E8F /* PGPKeySettingTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA0499B1E3362F400522E8F /* PGPKeySettingTableViewController.swift */; };
DCA0499E1E33BAC100522E8F /* Globals.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA0499D1E33BAC100522E8F /* Globals.swift */; };
DCAAF7451E2FA66800AB94BC /* SettingsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCAAF7441E2FA66800AB94BC /* SettingsTableViewController.swift */; };
DCC277D21E30D6EA00402246 /* pass.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DCC408C81E30BA1300F29B0E /* pass.xcdatamodeld */; };
DCC408A41E2FCC9E00F29B0E /* PasswordStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCC408A31E2FCC9E00F29B0E /* PasswordStore.swift */; };
@ -23,7 +28,11 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
274CCFCF32444A2FF46BE7F4 /* Pods-pass.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pass.debug.xcconfig"; path = "Pods/Target Support Files/Pods-pass/Pods-pass.debug.xcconfig"; sourceTree = "<group>"; };
ADCE7A5C3CCC67D7D21BB3C4 /* libPods-pass.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-pass.a"; sourceTree = BUILT_PRODUCTS_DIR; };
AEAD6B31EAF5D061447A68CC /* Pods-pass.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-pass.release.xcconfig"; path = "Pods/Target Support Files/Pods-pass/Pods-pass.release.xcconfig"; sourceTree = "<group>"; };
DC3DC8381E2F63240062A988 /* PasswordDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordDetailViewController.swift; sourceTree = "<group>"; };
DC4A746D1E30FBDE00E8EB18 /* Objective-CBridgingHeader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Objective-CBridgingHeader.h"; sourceTree = "<group>"; };
DC917BD31E2E8231000FDF54 /* pass.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = pass.app; sourceTree = BUILT_PRODUCTS_DIR; };
DC917BD61E2E8231000FDF54 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
DC917BDB1E2E8231000FDF54 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
@ -33,7 +42,11 @@
DC917BEE1E2F38C5000FDF54 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Result.framework; path = Carthage/Build/iOS/Result.framework; sourceTree = "<group>"; };
DC917BF01E2F38C9000FDF54 /* SwiftGit2.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftGit2.framework; path = Carthage/Build/iOS/SwiftGit2.framework; sourceTree = "<group>"; };
DC917BF21E2F3B42000FDF54 /* PasswordTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordTableViewController.swift; sourceTree = "<group>"; };
DC9C451B1E2F8CA7005845CA /* ChangeGitRepositoryTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChangeGitRepositoryTableViewController.swift; sourceTree = "<group>"; };
DCA049951E3357E000522E8F /* SwiftyUserDefaults.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyUserDefaults.framework; path = Carthage/Build/iOS/SwiftyUserDefaults.framework; sourceTree = "<group>"; };
DCA049971E33586A00522E8F /* DefaultKeys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DefaultKeys.swift; sourceTree = "<group>"; };
DCA049991E335CC800522E8F /* GitServerSettingTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GitServerSettingTableViewController.swift; sourceTree = "<group>"; };
DCA0499B1E3362F400522E8F /* PGPKeySettingTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PGPKeySettingTableViewController.swift; sourceTree = "<group>"; };
DCA0499D1E33BAC100522E8F /* Globals.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Globals.swift; sourceTree = "<group>"; };
DCAAF7441E2FA66800AB94BC /* SettingsTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsTableViewController.swift; sourceTree = "<group>"; };
DCC408A31E2FCC9E00F29B0E /* PasswordStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordStore.swift; sourceTree = "<group>"; };
DCC408C61E307DBB00F29B0E /* SVProgressHUD.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SVProgressHUD.framework; path = Carthage/Build/iOS/SVProgressHUD.framework; sourceTree = "<group>"; };
@ -48,18 +61,30 @@
DC917BEF1E2F38C5000FDF54 /* Result.framework in Frameworks */,
DC917BF11E2F38C9000FDF54 /* SwiftGit2.framework in Frameworks */,
DCC408C71E307DBB00F29B0E /* SVProgressHUD.framework in Frameworks */,
DCA049961E3357E000522E8F /* SwiftyUserDefaults.framework in Frameworks */,
94BA784B85E071D25EE89B59 /* libPods-pass.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
A51B01737D08DB47BB58F85A /* Pods */ = {
isa = PBXGroup;
children = (
274CCFCF32444A2FF46BE7F4 /* Pods-pass.debug.xcconfig */,
AEAD6B31EAF5D061447A68CC /* Pods-pass.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
DC917BCA1E2E8231000FDF54 = {
isa = PBXGroup;
children = (
DC917BD51E2E8231000FDF54 /* pass */,
DC917BD41E2E8231000FDF54 /* Products */,
DC917BED1E2F38C4000FDF54 /* Frameworks */,
A51B01737D08DB47BB58F85A /* Pods */,
);
sourceTree = "<group>";
};
@ -74,17 +99,21 @@
DC917BD51E2E8231000FDF54 /* pass */ = {
isa = PBXGroup;
children = (
DC4A746D1E30FBDE00E8EB18 /* Objective-CBridgingHeader.h */,
DC917BF21E2F3B42000FDF54 /* PasswordTableViewController.swift */,
DC917BD61E2E8231000FDF54 /* AppDelegate.swift */,
DC917BDA1E2E8231000FDF54 /* Main.storyboard */,
DCA0499B1E3362F400522E8F /* PGPKeySettingTableViewController.swift */,
DCA049991E335CC800522E8F /* GitServerSettingTableViewController.swift */,
DCAAF7441E2FA66800AB94BC /* SettingsTableViewController.swift */,
DCC408C81E30BA1300F29B0E /* pass.xcdatamodeld */,
DC9C451B1E2F8CA7005845CA /* ChangeGitRepositoryTableViewController.swift */,
DC3DC8381E2F63240062A988 /* PasswordDetailViewController.swift */,
DC917BDD1E2E8231000FDF54 /* Assets.xcassets */,
DC917BDF1E2E8231000FDF54 /* LaunchScreen.storyboard */,
DC917BE21E2E8231000FDF54 /* Info.plist */,
DCC408A31E2FCC9E00F29B0E /* PasswordStore.swift */,
DCA049971E33586A00522E8F /* DefaultKeys.swift */,
DCA0499D1E33BAC100522E8F /* Globals.swift */,
);
path = pass;
sourceTree = "<group>";
@ -92,9 +121,11 @@
DC917BED1E2F38C4000FDF54 /* Frameworks */ = {
isa = PBXGroup;
children = (
DCA049951E3357E000522E8F /* SwiftyUserDefaults.framework */,
DCC408C61E307DBB00F29B0E /* SVProgressHUD.framework */,
DC917BF01E2F38C9000FDF54 /* SwiftGit2.framework */,
DC917BEE1E2F38C5000FDF54 /* Result.framework */,
ADCE7A5C3CCC67D7D21BB3C4 /* libPods-pass.a */,
);
name = Frameworks;
sourceTree = "<group>";
@ -106,10 +137,13 @@
isa = PBXNativeTarget;
buildConfigurationList = DC917BE51E2E8231000FDF54 /* Build configuration list for PBXNativeTarget "pass" */;
buildPhases = (
68560E350F5EA82DA480749C /* [CP] Check Pods Manifest.lock */,
DC917BCF1E2E8231000FDF54 /* Sources */,
DC917BD01E2E8231000FDF54 /* Frameworks */,
DC917BD11E2E8231000FDF54 /* Resources */,
DC917BEC1E2F3659000FDF54 /* ShellScript */,
58F20B5DB8A41D610AF2145E /* [CP] Embed Pods Frameworks */,
D5AA0953A6BB441CE2390DE3 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@ -169,6 +203,51 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
58F20B5DB8A41D610AF2145E /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-pass/Pods-pass-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
68560E350F5EA82DA480749C /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../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";
showEnvVarsInLog = 0;
};
D5AA0953A6BB441CE2390DE3 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-pass/Pods-pass-resources.sh\"\n";
showEnvVarsInLog = 0;
};
DC917BEC1E2F3659000FDF54 /* ShellScript */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 12;
@ -178,6 +257,7 @@
"$(SRCROOT)/Carthage/Build/iOS/SwiftGit2.framework",
"$(SRCROOT)/Carthage/Build/iOS/Result.framework",
"$(SRCROOT)/Carthage/Build/iOS/SVProgressHUD.framework",
"$(SRCROOT)/Carthage/Build/iOS/SwiftyUserDefaults.framework",
);
outputPaths = (
);
@ -194,11 +274,14 @@
files = (
DC917BF31E2F3B42000FDF54 /* PasswordTableViewController.swift in Sources */,
DCC408A41E2FCC9E00F29B0E /* PasswordStore.swift in Sources */,
DCA0499C1E3362F400522E8F /* PGPKeySettingTableViewController.swift in Sources */,
DCAAF7451E2FA66800AB94BC /* SettingsTableViewController.swift in Sources */,
DCA0499A1E335CC800522E8F /* GitServerSettingTableViewController.swift in Sources */,
DCC277D21E30D6EA00402246 /* pass.xcdatamodeld in Sources */,
DC917BD71E2E8231000FDF54 /* AppDelegate.swift in Sources */,
DCA049981E33586A00522E8F /* DefaultKeys.swift in Sources */,
DCA0499E1E33BAC100522E8F /* Globals.swift in Sources */,
DC3DC8391E2F63240062A988 /* PasswordDetailViewController.swift in Sources */,
DC9C451C1E2F8CA7005845CA /* ChangeGitRepositoryTableViewController.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -317,8 +400,10 @@
};
DC917BE61E2E8231000FDF54 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 274CCFCF32444A2FF46BE7F4 /* Pods-pass.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEFINES_MODULE = NO;
DEVELOPMENT_TEAM = 779BQYPRCF;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -328,14 +413,17 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = me.mssun.pass;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "/Users/mssun/Code/XcodeProjects/pass/pass/Objective-CBridgingHeader.h";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
DC917BE71E2E8231000FDF54 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = AEAD6B31EAF5D061447A68CC /* Pods-pass.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEFINES_MODULE = NO;
DEVELOPMENT_TEAM = 779BQYPRCF;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
@ -345,6 +433,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = me.mssun.pass;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "/Users/mssun/Code/XcodeProjects/pass/pass/Objective-CBridgingHeader.h";
SWIFT_VERSION = 3.0;
};
name = Release;

View file

@ -36,7 +36,7 @@
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="Jts-IV-D1A" kind="show" id="i0a-rZ-Bqd"/>
<segue destination="Jts-IV-D1A" kind="show" identifier="showPasswordDetail" id="i0a-rZ-Bqd"/>
</connections>
</tableViewCell>
</prototypes>
@ -46,97 +46,150 @@
<outlet property="delegate" destination="vGH-8E-Zez" id="EG1-wX-VRt"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="All" id="2I8-8c-JEA"/>
<navigationItem key="navigationItem" title="All" id="2I8-8c-JEA">
<barButtonItem key="rightBarButtonItem" systemItem="refresh" id="JLS-BH-aaR"/>
</navigationItem>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="CHd-Vz-2cA" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2573.5999999999999" y="174.96251874062969"/>
</scene>
<!--Settings-->
<scene sceneID="nsc-pJ-wyw">
<scene sceneID="d9R-gZ-ywG">
<objects>
<tableViewController id="YoJ-QG-vxx" customClass="SettingsTableViewController" customModule="pass" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="gtM-Vg-miF">
<tableViewController id="h1X-0d-XeE" customClass="SettingsTableViewController" customModule="pass" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="l4i-8x-Bl1">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<sections>
<tableViewSection id="v5Z-yg-wbs">
<tableViewSection id="5gp-bg-o3n">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="Dxt-Zc-V1O" detailTextLabel="b8R-Sr-vDS" style="IBUITableViewCellStyleSubtitle" id="m0U-Ux-y4t">
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="Nuw-cs-qZN" style="IBUITableViewCellStyleDefault" id="W3D-XV-i9c">
<rect key="frame" x="0.0" y="35" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="m0U-Ux-y4t" id="stt-IU-aEQ">
<rect key="frame" x="0.0" y="0.0" width="342" height="43.5"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="W3D-XV-i9c" id="W9C-sq-ric">
<rect key="frame" x="0.0" y="0.0" width="342" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Git Repository" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Dxt-Zc-V1O">
<rect key="frame" x="15" y="5" width="108.5" height="20.5"/>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Git Server" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Nuw-cs-qZN">
<rect key="frame" x="15" y="0.0" width="325" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="https://github.com/mssun/public-password-store.git" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="b8R-Sr-vDS">
<rect key="frame" x="15" y="25.5" width="297" height="14.5"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="SGu-Tc-C19" kind="showDetail" id="lK2-tW-xaM"/>
<segue destination="K0b-qZ-UOk" kind="show" id="lTe-xz-AE8"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="39M-pD-G4c" style="IBUITableViewCellStyleDefault" id="D5Y-70-cIk">
<rect key="frame" x="0.0" y="79" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="D5Y-70-cIk" id="j3q-u1-biY">
<rect key="frame" x="0.0" y="0.0" width="342" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="SSH Key" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="39M-pD-G4c">
<rect key="frame" x="15" y="0.0" width="325" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="bpx-3k-TJW" kind="show" id="yND-Ti-cyf"/>
</connections>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection id="3cS-Ls-IQU">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="9z4-m8-sRO" detailTextLabel="eUn-QA-sUA" style="IBUITableViewCellStyleValue1" id="x7b-p5-sQR">
<rect key="frame" x="0.0" y="159" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="x7b-p5-sQR" id="wqT-nH-PgF">
<rect key="frame" x="0.0" y="0.0" width="342" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="PGP Key" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="9z4-m8-sRO">
<rect key="frame" x="15" y="11" width="66" height="21"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Not Set" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="eUn-QA-sUA">
<rect key="frame" x="282" y="11" width="58" height="21"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="ZUt-x1-TJu" kind="show" id="irU-Jw-XOS"/>
</connections>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="YoJ-QG-vxx" id="1vs-dq-AQt"/>
<outlet property="delegate" destination="YoJ-QG-vxx" id="1cj-Ko-lZe"/>
<outlet property="dataSource" destination="h1X-0d-XeE" id="fLr-S4-22Y"/>
<outlet property="delegate" destination="h1X-0d-XeE" id="EmA-3e-7xK"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Settings" id="Dmx-d6-hjL"/>
<navigationItem key="navigationItem" title="Settings" id="WH4-7R-4TQ"/>
<connections>
<outlet property="gitRepositoryTableViewCell" destination="m0U-Ux-y4t" id="CBU-Jj-dK0"/>
<outlet property="pgpKeyTableViewCell" destination="x7b-p5-sQR" id="VqA-p1-Ldh"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="LjA-Ne-PyF" userLabel="First Responder" sceneMemberID="firstResponder"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="leR-cc-QPW" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2574" y="913"/>
<point key="canvasLocation" x="2574" y="2265"/>
</scene>
<!--Change Git Repository-->
<scene sceneID="xnx-9L-bCV">
<!--Git Server-->
<scene sceneID="Obl-ql-ILG">
<objects>
<tableViewController id="4cL-li-vzc" customClass="ChangeGitRepositoryTableViewController" customModule="pass" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="9h6-Ga-agw">
<tableViewController id="ynQ-64-MfA" customClass="GitServerSettingTableViewController" customModule="pass" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="62X-tb-qYf">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<sections>
<tableViewSection headerTitle="Git Repository" id="6ZR-IS-6HM">
<tableViewSection id="pbe-W6-w4V">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="Uf8-Mp-2hU">
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
<tableViewCell clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="52" id="FRr-pf-aPO">
<rect key="frame" x="0.0" y="35" width="375" height="52"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" contentMode="center" tableViewCell="Uf8-Mp-2hU" id="PHY-pV-bc1">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="FRr-pf-aPO" id="60A-PS-qGe">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="https://github.com/mssun/public-password-store.git" textAlignment="natural" minimumFontSize="17" clearButtonMode="whileEditing" translatesAutoresizingMaskIntoConstraints="NO" id="8mS-VD-Cap">
<rect key="frame" x="8" y="-1" width="359" height="44"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Git Repository URL" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ugx-bs-r9H">
<rect key="frame" x="15" y="8" width="108" height="15"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleCaption1"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="https://" textAlignment="natural" minimumFontSize="17" clearButtonMode="unlessEditing" translatesAutoresizingMaskIntoConstraints="NO" id="EVT-VU-sCi">
<rect key="frame" x="15" y="23" width="352" height="21"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="URL" returnKeyType="done"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="URL"/>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="8mS-VD-Cap" secondAttribute="bottom" id="2et-i1-1ls"/>
<constraint firstItem="8mS-VD-Cap" firstAttribute="centerY" secondItem="PHY-pV-bc1" secondAttribute="centerY" id="a7Z-qH-geK"/>
<constraint firstItem="8mS-VD-Cap" firstAttribute="trailing" secondItem="PHY-pV-bc1" secondAttribute="trailingMargin" id="rlP-fB-6hF"/>
<constraint firstItem="8mS-VD-Cap" firstAttribute="leading" secondItem="PHY-pV-bc1" secondAttribute="leadingMargin" id="uSJ-3n-i28"/>
<constraint firstAttribute="topMargin" secondItem="ugx-bs-r9H" secondAttribute="top" id="0EC-tf-FLo"/>
<constraint firstItem="EVT-VU-sCi" firstAttribute="leading" secondItem="ugx-bs-r9H" secondAttribute="leading" id="10D-EY-js2"/>
<constraint firstItem="ugx-bs-r9H" firstAttribute="leading" secondItem="60A-PS-qGe" secondAttribute="leadingMargin" constant="7" id="gEl-oB-2ZJ"/>
<constraint firstAttribute="trailingMargin" secondItem="EVT-VU-sCi" secondAttribute="trailing" id="sVy-ww-qSo"/>
<constraint firstItem="EVT-VU-sCi" firstAttribute="top" secondItem="ugx-bs-r9H" secondAttribute="bottom" id="v0W-ie-gou"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
@ -144,30 +197,159 @@
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="4cL-li-vzc" id="Tgy-pO-pUk"/>
<outlet property="delegate" destination="4cL-li-vzc" id="313-Ji-k69"/>
<outlet property="dataSource" destination="ynQ-64-MfA" id="q89-h8-Hqq"/>
<outlet property="delegate" destination="ynQ-64-MfA" id="vAd-8X-GrK"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Change Git Repository" id="Sk1-FY-8vi">
<barButtonItem key="leftBarButtonItem" systemItem="cancel" id="VWm-Vs-kHL">
<toolbarItems/>
<navigationItem key="navigationItem" title="Git Server" id="gXX-yl-9oj">
<barButtonItem key="leftBarButtonItem" systemItem="cancel" id="LuU-Np-eBg">
<connections>
<segue destination="sQU-ax-3Ie" kind="unwind" identifier="" unwindAction="cancelWithSegue:" id="q7x-B2-fBi"/>
<segue destination="7K9-cE-9qq" kind="unwind" unwindAction="cancelWithSegue:" id="OcN-oi-fqj"/>
</connections>
</barButtonItem>
<barButtonItem key="rightBarButtonItem" systemItem="save" id="hfp-fF-TOL">
<barButtonItem key="rightBarButtonItem" style="done" systemItem="save" id="sgQ-zB-rxv">
<connections>
<segue destination="sQU-ax-3Ie" kind="unwind" identifier="save" unwindAction="saveWithSegue:" id="kk2-Dn-WsY"/>
<segue destination="7K9-cE-9qq" kind="unwind" unwindAction="saveWithSegue:" id="hvX-Fk-F21"/>
</connections>
</barButtonItem>
</navigationItem>
<simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
<connections>
<outlet property="gitRepositoryURLTextField" destination="EVT-VU-sCi" id="2EH-Uq-tbU"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="7c1-c7-Qyp" userLabel="First Responder" sceneMemberID="firstResponder"/>
<exit id="7K9-cE-9qq" userLabel="Exit" sceneMemberID="exit"/>
</objects>
<point key="canvasLocation" x="4375" y="1593"/>
</scene>
<!--Table View Controller-->
<scene sceneID="JQn-WF-Ogb">
<objects>
<tableViewController id="bpx-3k-TJW" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" id="F0z-Sl-kCE">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="zAx-8x-oje">
<rect key="frame" x="0.0" y="28" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="zAx-8x-oje" id="17r-45-oPf">
<rect key="frame" x="0.0" y="0.0" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
</tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="bpx-3k-TJW" id="Jdk-Bc-f8d"/>
<outlet property="delegate" destination="bpx-3k-TJW" id="hA4-dp-c9G"/>
</connections>
</tableView>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="c4I-2w-ZPw" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="3422" y="2301"/>
</scene>
<!--PGP Key-->
<scene sceneID="8Hi-tl-elT">
<objects>
<tableViewController id="3WR-HY-zYj" customClass="PGPKeySettingTableViewController" customModule="pass" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" allowsSelection="NO" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="B51-hW-xc5">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<sections>
<tableViewSection id="Mfu-PE-VT0">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="52" id="BYZ-9g-xZy">
<rect key="frame" x="0.0" y="35" width="375" height="52"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="BYZ-9g-xZy" id="Zfn-rK-sN1">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="PGP Key URL" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dWi-eh-7Eq">
<rect key="frame" x="15" y="8" width="76" height="15"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleCaption1"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="https://" minimumFontSize="17" clearButtonMode="unlessEditing" translatesAutoresizingMaskIntoConstraints="NO" id="Rb8-zs-TGa">
<rect key="frame" x="15" y="22.5" width="352" height="21"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="URL"/>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="topMargin" secondItem="dWi-eh-7Eq" secondAttribute="top" id="F3U-6L-Igh"/>
<constraint firstItem="dWi-eh-7Eq" firstAttribute="leading" secondItem="Zfn-rK-sN1" secondAttribute="leadingMargin" constant="7" id="Pid-Pf-x4j"/>
<constraint firstItem="Rb8-zs-TGa" firstAttribute="leading" secondItem="dWi-eh-7Eq" secondAttribute="leading" id="Qsy-wU-9pS"/>
<constraint firstItem="Rb8-zs-TGa" firstAttribute="top" secondItem="dWi-eh-7Eq" secondAttribute="bottom" id="cq2-xy-12a"/>
<constraint firstAttribute="trailingMargin" secondItem="Rb8-zs-TGa" secondAttribute="trailing" id="dRB-Ba-E2u"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="52" id="qrQ-bd-sV8">
<rect key="frame" x="0.0" y="87" width="375" height="52"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="qrQ-bd-sV8" id="7ts-YH-1tP">
<rect key="frame" x="0.0" y="0.0" width="375" height="51"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Passphrase" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KFQ-DQ-XNg">
<rect key="frame" x="15" y="8" width="66" height="15"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleCaption1"/>
<color key="textColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="this_is_passphrase" minimumFontSize="17" clearButtonMode="unlessEditing" translatesAutoresizingMaskIntoConstraints="NO" id="Nkx-gN-jNA">
<rect key="frame" x="15" y="22.5" width="352" height="21"/>
<nil key="textColor"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<textInputTraits key="textInputTraits" autocorrectionType="no" spellCheckingType="no" keyboardType="alphabet" keyboardAppearance="alert" secureTextEntry="YES"/>
</textField>
</subviews>
<constraints>
<constraint firstItem="KFQ-DQ-XNg" firstAttribute="leading" secondItem="7ts-YH-1tP" secondAttribute="leadingMargin" constant="7" id="8H6-K8-z3a"/>
<constraint firstAttribute="topMargin" secondItem="KFQ-DQ-XNg" secondAttribute="top" id="LMX-Ji-1fs"/>
<constraint firstItem="Nkx-gN-jNA" firstAttribute="leading" secondItem="KFQ-DQ-XNg" secondAttribute="leading" id="YIH-ym-IK8"/>
<constraint firstItem="Nkx-gN-jNA" firstAttribute="top" secondItem="KFQ-DQ-XNg" secondAttribute="bottom" id="g1V-z9-oxI"/>
<constraint firstAttribute="trailingMargin" secondItem="Nkx-gN-jNA" secondAttribute="trailing" id="mNq-3i-gRx"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="3WR-HY-zYj" id="RFP-cF-WkO"/>
<outlet property="delegate" destination="3WR-HY-zYj" id="kqI-mx-f0D"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="PGP Key" id="eK3-bb-419">
<barButtonItem key="leftBarButtonItem" systemItem="cancel" id="LOw-J5-SOn">
<connections>
<segue destination="jjl-Xi-fkn" kind="unwind" unwindAction="cancelWithSegue:" id="kaP-3V-UYx"/>
</connections>
</barButtonItem>
<barButtonItem key="rightBarButtonItem" systemItem="done" id="TNt-ne-l7W">
<connections>
<segue destination="jjl-Xi-fkn" kind="unwind" unwindAction="saveWithSegue:" id="aKP-AF-lfv"/>
</connections>
</barButtonItem>
</navigationItem>
<connections>
<outlet property="gitRepositoryURLTextField" destination="8mS-VD-Cap" id="RUK-V5-ci6"/>
<outlet property="pgpKeyPassphraseTextField" destination="Nkx-gN-jNA" id="ylV-LG-ibS"/>
<outlet property="pgpKeyURLTextField" destination="Rb8-zs-TGa" id="A6a-ny-iuX"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="PuF-lo-JTb" userLabel="First Responder" sceneMemberID="firstResponder"/>
<exit id="sQU-ax-3Ie" userLabel="Exit" sceneMemberID="exit"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="hbx-RC-qg1" userLabel="First Responder" sceneMemberID="firstResponder"/>
<exit id="jjl-Xi-fkn" userLabel="Exit" sceneMemberID="exit"/>
</objects>
<point key="canvasLocation" x="4472.8000000000002" y="909.89505247376314"/>
<point key="canvasLocation" x="4440.8000000000002" y="3145.2773613193408"/>
</scene>
<!--Password Detail View Controller-->
<scene sceneID="9b5-fu-vx9">
@ -181,20 +363,23 @@
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Password: 1234567890" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xry-JW-IEp">
<rect key="frame" x="16" y="72" width="182" height="21"/>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Password: 1234567890" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Xry-JW-IEp">
<rect key="frame" x="16" y="72" width="338" height="538"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<fontDescription key="fontDescription" name=".AppleSystemUIFont" family=".AppleSystemUIFont" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
<connections>
<outlet property="passwordLabel" destination="Xry-JW-IEp" id="RP5-VK-P2A"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="ek1-Cw-dZH" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="3422" y="175"/>
<point key="canvasLocation" x="3421.5999999999999" y="174.96251874062969"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="ACd-rk-Zf3">
@ -227,49 +412,67 @@
</tabBar>
<connections>
<segue destination="5ZN-vm-3gw" kind="relationship" relationship="viewControllers" id="VZu-vG-Fum"/>
<segue destination="gD9-d9-fB7" kind="relationship" relationship="viewControllers" id="ust-LA-VtZ"/>
<segue destination="ZmJ-0Z-N04" kind="relationship" relationship="viewControllers" id="6Yh-qG-26e"/>
</connections>
</tabBarController>
<placeholder placeholderIdentifier="IBFirstResponder" id="h18-hY-pkk" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="654" y="565"/>
<point key="canvasLocation" x="215" y="1137"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="rsO-Qo-dfa">
<!--Settings-->
<scene sceneID="sdr-gl-b19">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="gD9-d9-fB7" sceneMemberID="viewController">
<tabBarItem key="tabBarItem" systemItem="more" id="hvf-Rq-ETT"/>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="ZmJ-0Z-N04" sceneMemberID="viewController">
<tabBarItem key="tabBarItem" title="Settings" id="6Xa-be-Z8g"/>
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="BbW-Nu-3Oq">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="wWs-15-HDi">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="YoJ-QG-vxx" kind="relationship" relationship="rootViewController" id="XQj-Ua-n9c"/>
<segue destination="h1X-0d-XeE" kind="relationship" relationship="rootViewController" id="uOn-pO-uOP"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="mEM-ZA-sXv" userLabel="First Responder" sceneMemberID="firstResponder"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="RRZ-ZB-th2" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1634" y="913"/>
<point key="canvasLocation" x="1775" y="2243"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="1BG-v6-p5d">
<scene sceneID="yn4-1A-RA2">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="SGu-Tc-C19" sceneMemberID="viewController">
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="K0b-qZ-UOk" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="RX0-TZ-T9b">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="Ber-5V-jaE">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="4cL-li-vzc" kind="relationship" relationship="rootViewController" id="KD6-82-zA2"/>
<segue destination="ynQ-64-MfA" kind="relationship" relationship="rootViewController" id="NgW-Jg-n2e"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="s3T-Zx-nmR" userLabel="First Responder" sceneMemberID="firstResponder"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="kr5-iH-doj" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="3533.5999999999999" y="909.89505247376314"/>
<point key="canvasLocation" x="3421.5" y="1593.5"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="GfH-IU-wIW">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="ZUt-x1-TJu" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="Jq6-Yd-xYR">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="3WR-HY-zYj" kind="relationship" relationship="rootViewController" id="eSZ-oh-IHf"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="bVY-G2-9Ud" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="3422" y="3145"/>
</scene>
</scenes>
</document>

View file

@ -1,42 +0,0 @@
//
// ChangeGitRepositoryTableViewController.swift
// pass
//
// Created by Mingshen Sun on 18/1/2017.
// Copyright © 2017 Bob Sun. All rights reserved.
//
import UIKit
import CoreData
import SVProgressHUD
class ChangeGitRepositoryTableViewController: UITableViewController {
let userDefaults = UserDefaults.standard
var gitRepositoryURL: String?
@IBOutlet weak var gitRepositoryURLTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
if let url = userDefaults.string(forKey: "gitRepositoryURL") {
gitRepositoryURLTextField.text = url
} else {
gitRepositoryURLTextField.text = "https://github.com/mssun/public-password-store.git"
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
gitRepositoryURLTextField.becomeFirstResponder()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
view.endEditing(true)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "save" {
gitRepositoryURL = gitRepositoryURLTextField.text!
}
}
}

20
pass/DefaultKeys.swift Normal file
View file

@ -0,0 +1,20 @@
//
// DefaultKeys.swift
// pass
//
// Created by Mingshen Sun on 21/1/2017.
// Copyright © 2017 Bob Sun. All rights reserved.
//
import Foundation
import SwiftyUserDefaults
extension DefaultsKeys {
static let pgpKeyURL = DefaultsKey<URL?>("pgpKeyURL")
static let pgpKeyPassphrase = DefaultsKey<String>("pgpKeyPassphrase")
static let pgpKeyID = DefaultsKey<String>("pgpKeyID")
static let pgpKeyUserID = DefaultsKey<String>("pgpKeyUserID")
static let gitRepositoryURL = DefaultsKey<URL?>("gitRepositoryURL")
}

View file

@ -0,0 +1,31 @@
//
// GitServerSettingTableViewController.swift
// pass
//
// Created by Mingshen Sun on 21/1/2017.
// Copyright © 2017 Bob Sun. All rights reserved.
//
import UIKit
import SwiftyUserDefaults
class GitServerSettingTableViewController: UITableViewController {
@IBOutlet weak var gitRepositoryURLTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
if let url = Defaults[.gitRepositoryURL] {
gitRepositoryURLTextField.text = url.absoluteString
}
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
gitRepositoryURLTextField.becomeFirstResponder()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
view.endEditing(true)
}
}

16
pass/Globals.swift Normal file
View file

@ -0,0 +1,16 @@
//
// Globals.swift
// pass
//
// Created by Mingshen Sun on 21/1/2017.
// Copyright © 2017 Bob Sun. All rights reserved.
//
import Foundation
class Globals {
static let shared = Globals()
let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0];
let secringPath = "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/secring.gpg"
private init() { }
}

View file

@ -0,0 +1,14 @@
//
// Objective-CBridgingHeader.h
// pass
//
// Created by Mingshen Sun on 19/1/2017.
// Copyright © 2017 Bob Sun. All rights reserved.
//
#ifndef Objective_CBridgingHeader_h
#define Objective_CBridgingHeader_h
#import <ObjectivePGP/ObjectivePGP.h>
#endif /* Objective_CBridgingHeader_h */

View file

@ -0,0 +1,22 @@
//
// PGPKeySettingTableViewController.swift
// pass
//
// Created by Mingshen Sun on 21/1/2017.
// Copyright © 2017 Bob Sun. All rights reserved.
//
import UIKit
import SwiftyUserDefaults
class PGPKeySettingTableViewController: UITableViewController {
@IBOutlet weak var pgpKeyURLTextField: UITextField!
@IBOutlet weak var pgpKeyPassphraseTextField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
pgpKeyURLTextField.text = Defaults[.pgpKeyURL]?.absoluteString
pgpKeyPassphraseTextField.text = Defaults[.pgpKeyPassphrase]
}
}

View file

@ -7,29 +7,34 @@
//
import UIKit
import SwiftyUserDefaults
class PasswordDetailViewController: UIViewController {
@IBOutlet weak var passwordLabel: UILabel!
var passwordEntity: PasswordEntity?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let encryptedDataURL = URL(fileURLWithPath: "\(Globals.shared.documentPath)/\(passwordEntity!.rawPath!)")
let fm = FileManager.default
if fm.fileExists(atPath: encryptedDataURL.path){
print("file exist")
} else {
print("file doesnt exist")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
do {
let encryptedData = try Data(contentsOf: encryptedDataURL)
let decryptedData = try PasswordStore.shared.pgp.decryptData(encryptedData, passphrase: Defaults[.pgpKeyPassphrase])
let plain = String(data: decryptedData, encoding: .ascii) ?? ""
print(plain)
passwordLabel.text = plain
} catch let error as NSError {
print(error.debugDescription)
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destinationViewController.
// Pass the selected object to the new view controller.
passwordLabel.sizeToFit()
}
*/
}

View file

@ -11,12 +11,14 @@ import SwiftGit2
import Result
import CoreData
import UIKit
import SwiftyUserDefaults
class PasswordStore {
static let shared = PasswordStore()
let storeURL = URL(fileURLWithPath: "\(NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0])/password-store")
let storeURL = URL(fileURLWithPath: "\(Globals.shared.documentPath)/password-store")
var storeRepo: Repository?
let pgp: ObjectivePGP = ObjectivePGP()
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
@ -26,9 +28,31 @@ class PasswordStore {
if case .success(let r) = result {
storeRepo = r
}
if Defaults[.pgpKeyID] != "" {
pgp.importKeys(fromFile: Globals.shared.secringPath, allowDuplicates: false)
}
}
func cloneRemoteRepo(remoteRepoURL: URL) -> Bool{
func initPGP(pgpKeyURL: URL, pgpKeyLocalPath: String) -> Bool {
do {
let pgpData = try Data(contentsOf: pgpKeyURL)
try pgpData.write(to: URL(fileURLWithPath: pgpKeyLocalPath), options: .atomic)
pgp.importKeys(fromFile: pgpKeyLocalPath, allowDuplicates: false)
let key = pgp.keys[0]
Defaults[.pgpKeyID] = key.keyID!.shortKeyString
if let gpgUser = key.users[0] as? PGPUser {
Defaults[.pgpKeyUserID] = gpgUser.userID
}
return true
} catch {
print("error")
return false
}
}
func cloneRemoteRepo(remoteRepoURL: URL) -> Bool {
print("start cloning remote repo")
let fm = FileManager.default
if (storeRepo != nil) {
@ -67,7 +91,7 @@ class PasswordStore {
if url.pathExtension == "gpg" {
let entity = PasswordEntity(context: context)
entity.name = url.lastPathComponent
entity.rawPath = url.path
entity.rawPath = "password-store/\(url.absoluteString)"
}
}
})

View file

@ -12,53 +12,12 @@ import Result
import SVProgressHUD
class PasswordTableViewController: UITableViewController {
private var passwordNameArray = [String]()
private var passwordEntities: [PasswordEntity]?
func temporaryURL(forPurpose purpose: String) -> URL {
let globallyUniqueString = ProcessInfo.processInfo.globallyUniqueString
let path = "\(NSTemporaryDirectory())\(globallyUniqueString)_\(purpose)"
print("\(NSHomeDirectory())/vault")
return URL(fileURLWithPath: path)
}
override func viewDidLoad() {
super.viewDidLoad()
passwordEntities = PasswordStore.shared.fetchPasswordEntityCoreData()
NotificationCenter.default.addObserver(self, selector: #selector(PasswordTableViewController.actOnPasswordUpdatedNotification), name: NSNotification.Name(rawValue: "passwordUpdated"), object: nil)
// SVProgressHUD.setDefaultMaskType(SVProgressHUDMaskType.black)
// SVProgressHUD.show(withStatus: "Cloning Password Repository")
//
// let remoteRepoURL = URL(string: "https://github.com/mssun/public-password-store.git")
// let localURL = self.temporaryURL(forPurpose: "public-remote-clone")
// DispatchQueue.global(qos: .userInitiated).async {
// let cloneResult = Repository.clone(from: remoteRepoURL!, to: localURL)
// if case .success(let clonedRepo) = cloneResult {
// let latestCommit: Result<Commit, NSError> = clonedRepo
// .HEAD()
// .flatMap { clonedRepo.commit($0.oid) }
// print("localURL \(localURL.path)")
// if let commit = latestCommit.value {
// print("Latest Commit: \(commit.message) by \(commit.author.name)")
// } else {
// print("Could not get commit: \(latestCommit.error)")
// }
// let fd = FileManager.default
// fd.enumerator(atPath: localURL.path)?.forEach({ (e) in
// if let e = e as? String, let url = URL(string: e) {
// if url.pathExtension == "gpg" {
// self.passwordNameArray.append(url.lastPathComponent);
// }
// }
// })
// }
// DispatchQueue.main.async {
// SVProgressHUD.dismiss()
// self.tableView.reloadData()
// }
//
// }
}
func actOnPasswordUpdatedNotification() {
@ -71,11 +30,19 @@ class PasswordTableViewController: UITableViewController {
return passwordEntities!.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "passwordTableViewCell", for: indexPath)
cell.textLabel?.text = passwordEntities![indexPath.row].name
return cell
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showPasswordDetail" {
if let viewController = segue.destination as? PasswordDetailViewController {
let selectedRow = tableView.indexPathForSelectedRow!.row
viewController.passwordEntity = passwordEntities![selectedRow]
}
}
}
}

View file

@ -9,49 +9,67 @@
import UIKit
import SVProgressHUD
import CoreData
import SwiftyUserDefaults
class SettingsTableViewController: UITableViewController {
@IBOutlet weak var gitRepositoryTableViewCell: UITableViewCell!
@IBOutlet weak var pgpKeyTableViewCell: UITableViewCell!
@IBAction func cancel(segue: UIStoryboardSegue) {
}
@IBAction func save(segue: UIStoryboardSegue) {
if let changeGitRepositoryTableViewController = segue.source as? ChangeGitRepositoryTableViewController {
if let gitRepositoryURL = changeGitRepositoryTableViewController.gitRepositoryURL {
if gitRepositoryTableViewCell.detailTextLabel?.text != gitRepositoryURL {
UserDefaults.standard.set(gitRepositoryURL, forKey: "gitRepositoryURL")
gitRepositoryTableViewCell.detailTextLabel?.text = gitRepositoryURL
}
if let controller = segue.source as? GitServerSettingTableViewController {
if Defaults[.gitRepositoryURL] == nil || controller.gitRepositoryURLTextField.text != Defaults[.gitRepositoryURL]!.absoluteString {
Defaults[.gitRepositoryURL] = URL(string: controller.gitRepositoryURLTextField.text!)
SVProgressHUD.setDefaultMaskType(.black)
SVProgressHUD.show(withStatus: "Cloning Remote Repository")
DispatchQueue.global(qos: .userInitiated).async {
let ret = PasswordStore.shared.cloneRemoteRepo(remoteRepoURL: URL(string: gitRepositoryURL)!)
if ret {
let ret = PasswordStore.shared.cloneRemoteRepo(remoteRepoURL: Defaults[.gitRepositoryURL]!)
DispatchQueue.main.async {
if ret {
SVProgressHUD.dismiss()
SVProgressHUD.setMaximumDismissTimeInterval(1)
SVProgressHUD.showSuccess(withStatus: "Success")
NotificationCenter.default.post(Notification(name: Notification.Name("passwordUpdated")))
}
} else {
DispatchQueue.main.async {
SVProgressHUD.showError(withStatus: "Error")
}
}
}
}
} else if let controller = segue.source as? PGPKeySettingTableViewController {
if Defaults[.pgpKeyURL] != URL(string: controller.pgpKeyURLTextField.text!) {
Defaults[.pgpKeyURL] = URL(string: controller.pgpKeyURLTextField.text!)
Defaults[.pgpKeyPassphrase] = controller.pgpKeyPassphraseTextField.text!
SVProgressHUD.setDefaultMaskType(.black)
SVProgressHUD.show(withStatus: "Fetching PGP Key")
DispatchQueue.global(qos: .userInitiated).async {
let ret = PasswordStore.shared.initPGP(pgpKeyURL: Defaults[.pgpKeyURL]!, pgpKeyLocalPath: Globals.shared.secringPath)
DispatchQueue.main.async {
if ret {
SVProgressHUD.showSuccess(withStatus: "Success")
} else {
SVProgressHUD.showError(withStatus: "Error")
}
}
}
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
if let url = UserDefaults.standard.string(forKey: "gitRepositoryURL") {
gitRepositoryTableViewCell.detailTextLabel?.text = url
if Defaults[.pgpKeyID] == "" {
pgpKeyTableViewCell.detailTextLabel?.text = "Not Set"
} else {
gitRepositoryTableViewCell.detailTextLabel?.text = "Not set"
pgpKeyTableViewCell.detailTextLabel?.text = Defaults[.pgpKeyID]
}
}
}