Add initial iOS application

This is already in a working state, but is still missing a few things.
For example, there is no proper progress indication during generation
and the UI just hangs and there's no way to delete a site yet.
This commit is contained in:
Jonathan Schleifer 2016-10-09 17:53:41 +02:00
parent aae80c85e1
commit 43adab7b39
No known key found for this signature in database
GPG key ID: 338C3541DB54E169
17 changed files with 1735 additions and 0 deletions

35
iOS/AddSiteController.h Normal file
View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import UIKit;
#import "MainViewController.h"
@interface AddSiteController: UITableViewController
@property (retain, nonatomic) IBOutlet UITextField *nameField;
@property (retain, nonatomic) IBOutlet UITextField *lengthField;
@property (retain, nonatomic) IBOutlet UISwitch *legacySwitch;
@property (retain) MainViewController *mainViewController;
- (IBAction)done: (id)sender;
- (IBAction)cancel: (id)sender;
@end

102
iOS/AddSiteController.m Normal file
View file

@ -0,0 +1,102 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import ObjFW_Bridge;
#import "AddSiteController.h"
static void
showAlert(UIViewController *controller, NSString *title, NSString *message)
{
UIAlertController *alert = [UIAlertController
alertControllerWithTitle: title
message: message
preferredStyle: UIAlertControllerStyleAlert];
[alert addAction:
[UIAlertAction actionWithTitle: @"OK"
style: UIAlertActionStyleDefault
handler: nil]];
[controller presentViewController: alert
animated: YES
completion: nil];
}
@implementation AddSiteController
- (void)dealloc
{
[_nameField release];
[_lengthField release];
[_legacySwitch release];
[_mainViewController release];
[super dealloc];
}
- (IBAction)done: (id)sender
{
OFString *name = [self.nameField.text OFObject];
OFString *lengthStr = [self.lengthField.text OFObject];
bool lengthValid = true;
size_t length;
if ([name length] == 0) {
showAlert(self, @"Name missing", @"Please enter a name.");
return;
}
@try {
length = (size_t)[lengthStr decimalValue];
if (length < 3 || length > 64)
lengthValid = false;
} @catch (OFInvalidFormatException *e) {
lengthValid = false;
}
if (!lengthValid) {
showAlert(self, @"Invalid length",
@"Please enter a number between 3 and 64.");
return;
}
if ([self.mainViewController.siteStorage hasSite: name]) {
showAlert(self, @"Site Already Exists",
@"Please pick a name that does not exist yet.");
return;
}
[self.mainViewController.siteStorage
setSite: name
length: length
legacy: self.legacySwitch.enabled];
[self.mainViewController.tableView reloadData];
[self.navigationController popViewControllerAnimated: YES];
}
- (IBAction)cancel: (id)sender
{
[self.navigationController popViewControllerAnimated: YES];
}
@end

27
iOS/AppDelegate.h Normal file
View file

@ -0,0 +1,27 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import UIKit;
@interface AppDelegate: UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

26
iOS/AppDelegate.m Normal file
View file

@ -0,0 +1,26 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#import "AppDelegate.h"
@implementation AppDelegate
@end

View file

@ -0,0 +1,48 @@
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View file

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
<viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<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="scrypt-pwgen" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GvW-cV-5uf">
<frame key="frameInset" minY="20" width="375" height="610"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" weight="black" pointSize="37"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
<size key="shadowOffset" width="2" height="2"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Copyright © 2016, Jonathan Schleifer" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8gr-rl-2PJ">
<frame key="frameInset" minY="638" width="375" height="21"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="52" y="374.66266866566718"/>
</scene>
</scenes>
</document>

View file

@ -0,0 +1,418 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BN3-Y7-zvx">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Navigation Controller-->
<scene sceneID="edE-sY-0Cv">
<objects>
<navigationController id="BN3-Y7-zvx" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="K8n-wn-irC">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="P19-6i-fpd" kind="relationship" relationship="rootViewController" id="izn-Ct-ivZ"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="xSr-8M-yKj" userLabel="First Responder" sceneMemberID="firstResponder"/>
<navigationItem title="Sites" id="DOX-2W-uZP">
<barButtonItem key="rightBarButtonItem" systemItem="add" id="mYi-wP-8f8"/>
</navigationItem>
</objects>
<point key="canvasLocation" x="262" y="-515"/>
</scene>
<!--Sites-->
<scene sceneID="raj-gx-00d">
<objects>
<viewController id="P19-6i-fpd" customClass="MainViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="XVy-9K-Bul"/>
<viewControllerLayoutGuide type="bottom" id="TZK-mv-9Bn"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="5FM-eD-86d">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<searchBar contentMode="redraw" translatesAutoresizingMaskIntoConstraints="NO" id="CMc-ZN-RAn">
<textInputTraits key="textInputTraits"/>
</searchBar>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="eoq-EJ-t3s">
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<connections>
<outlet property="dataSource" destination="P19-6i-fpd" id="1sa-qY-oQx"/>
<outlet property="delegate" destination="P19-6i-fpd" id="Iv1-4B-R74"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="CMc-ZN-RAn" firstAttribute="leading" secondItem="5FM-eD-86d" secondAttribute="leading" id="7Bh-lK-dcW"/>
<constraint firstItem="CMc-ZN-RAn" firstAttribute="trailing" secondItem="eoq-EJ-t3s" secondAttribute="trailing" id="GIn-iQ-Hld"/>
<constraint firstItem="CMc-ZN-RAn" firstAttribute="leading" secondItem="eoq-EJ-t3s" secondAttribute="leading" id="dX2-j8-GBM"/>
<constraint firstAttribute="trailing" secondItem="CMc-ZN-RAn" secondAttribute="trailing" id="gby-v5-orN"/>
<constraint firstItem="CMc-ZN-RAn" firstAttribute="top" secondItem="XVy-9K-Bul" secondAttribute="bottom" id="kKV-JV-olG"/>
<constraint firstItem="eoq-EJ-t3s" firstAttribute="top" secondItem="CMc-ZN-RAn" secondAttribute="bottom" id="qee-o3-5Zj"/>
<constraint firstItem="eoq-EJ-t3s" firstAttribute="bottom" secondItem="TZK-mv-9Bn" secondAttribute="top" id="t45-br-Q2m"/>
</constraints>
</view>
<navigationItem key="navigationItem" title="Sites" id="yTB-Ks-uRL">
<barButtonItem key="rightBarButtonItem" systemItem="add" id="p8C-bd-BZ5">
<connections>
<segue destination="mTn-Td-fIF" kind="show" identifier="addSite" id="M4C-yt-H0Q"/>
</connections>
</barButtonItem>
</navigationItem>
<connections>
<outlet property="tableView" destination="eoq-EJ-t3s" id="CE8-oa-Eud"/>
<segue destination="ayJ-fs-aIU" kind="show" identifier="showDetails" id="Gsx-Js-7aN"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="yxW-Ki-6KI" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1060" y="-516"/>
</scene>
<!--Add Site Controller-->
<scene sceneID="IxZ-dn-p6h">
<objects>
<tableViewController id="mTn-Td-fIF" customClass="AddSiteController" 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="cum-L6-K1B">
<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="Whg-Qc-bTG">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="En5-ry-3SM">
<rect key="frame" x="0.0" y="99" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="En5-ry-3SM" id="fh3-TO-M9D">
<frame key="frameInset" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Yq7-aM-PNl">
<constraints>
<constraint firstAttribute="width" constant="100" id="nTn-vs-RDo"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" placeholder="apple.com" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="AXY-MA-LhE">
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<textInputTraits key="textInputTraits" returnKeyType="next"/>
</textField>
</subviews>
<constraints>
<constraint firstItem="AXY-MA-LhE" firstAttribute="leading" secondItem="Yq7-aM-PNl" secondAttribute="trailing" constant="8" symbolic="YES" id="0YS-Qe-KVC"/>
<constraint firstItem="Yq7-aM-PNl" firstAttribute="leading" secondItem="fh3-TO-M9D" secondAttribute="leadingMargin" id="2Yo-ac-oCM"/>
<constraint firstItem="AXY-MA-LhE" firstAttribute="trailing" secondItem="fh3-TO-M9D" secondAttribute="trailingMargin" id="D7h-pW-gHb"/>
<constraint firstItem="AXY-MA-LhE" firstAttribute="centerY" secondItem="fh3-TO-M9D" secondAttribute="centerY" id="arJ-g5-xSi"/>
<constraint firstItem="Yq7-aM-PNl" firstAttribute="centerY" secondItem="AXY-MA-LhE" secondAttribute="centerY" id="rry-Ey-x0y"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="GI4-iS-21j">
<rect key="frame" x="0.0" y="143" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="GI4-iS-21j" id="zSC-vR-CCb">
<frame key="frameInset" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Length" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eFJ-jF-rxJ">
<constraints>
<constraint firstAttribute="width" constant="100" id="4bi-Kp-8mJ"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="16" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="KQA-JL-1zl">
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<textInputTraits key="textInputTraits" keyboardType="numberPad" returnKeyType="next"/>
</textField>
</subviews>
<constraints>
<constraint firstItem="KQA-JL-1zl" firstAttribute="leading" secondItem="eFJ-jF-rxJ" secondAttribute="trailing" constant="8" symbolic="YES" id="hHI-nW-gN4"/>
<constraint firstItem="KQA-JL-1zl" firstAttribute="centerY" secondItem="zSC-vR-CCb" secondAttribute="centerY" id="hJp-yJ-254"/>
<constraint firstItem="eFJ-jF-rxJ" firstAttribute="leading" secondItem="zSC-vR-CCb" secondAttribute="leadingMargin" id="hWD-AV-9XL"/>
<constraint firstItem="KQA-JL-1zl" firstAttribute="trailing" secondItem="zSC-vR-CCb" secondAttribute="trailingMargin" id="mie-wy-xNb"/>
<constraint firstItem="eFJ-jF-rxJ" firstAttribute="centerY" secondItem="KQA-JL-1zl" secondAttribute="centerY" id="ovV-Mb-hCG"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection id="wRX-mn-ahM">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="jgd-dy-HQH">
<rect key="frame" x="0.0" y="223" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="jgd-dy-HQH" id="eqZ-BJ-5O0">
<frame key="frameInset" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Legacy" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SVA-v8-zP8">
<constraints>
<constraint firstAttribute="width" constant="100" id="KzI-6Z-fGE"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="jcs-6K-Sbe"/>
</subviews>
<constraints>
<constraint firstItem="jcs-6K-Sbe" firstAttribute="trailing" secondItem="eqZ-BJ-5O0" secondAttribute="trailingMargin" id="JvE-mo-ax9"/>
<constraint firstItem="SVA-v8-zP8" firstAttribute="centerY" secondItem="jcs-6K-Sbe" secondAttribute="centerY" id="NGb-0A-N0b"/>
<constraint firstItem="SVA-v8-zP8" firstAttribute="leading" secondItem="eqZ-BJ-5O0" secondAttribute="leadingMargin" id="QZr-gB-8NO"/>
<constraint firstItem="SVA-v8-zP8" firstAttribute="centerY" secondItem="eqZ-BJ-5O0" secondAttribute="centerY" id="QhS-hk-7e0"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="mTn-Td-fIF" id="lRR-7B-Rbz"/>
<outlet property="delegate" destination="mTn-Td-fIF" id="UJl-VI-MdQ"/>
</connections>
</tableView>
<toolbarItems/>
<navigationItem key="navigationItem" id="J31-Gi-K4T">
<barButtonItem key="leftBarButtonItem" systemItem="cancel" id="3KI-rs-foM">
<connections>
<action selector="cancel:" destination="mTn-Td-fIF" id="v8I-jq-oIa"/>
</connections>
</barButtonItem>
<barButtonItem key="rightBarButtonItem" systemItem="done" id="CYY-ws-1nV">
<connections>
<action selector="done:" destination="mTn-Td-fIF" id="OfX-Jt-hUG"/>
</connections>
</barButtonItem>
</navigationItem>
<simulatedToolbarMetrics key="simulatedBottomBarMetrics"/>
<connections>
<outlet property="legacySwitch" destination="jcs-6K-Sbe" id="sCo-l6-9n7"/>
<outlet property="lengthField" destination="KQA-JL-1zl" id="tdI-mj-8Ng"/>
<outlet property="nameField" destination="AXY-MA-LhE" id="Noo-It-VNV"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="6ti-F1-srK" userLabel="First Responder" sceneMemberID="firstResponder"/>
<tableViewSection id="s3j-z4-wEb">
<cells/>
</tableViewSection>
</objects>
<point key="canvasLocation" x="1994" y="-1102"/>
</scene>
<!--Show Details Controller-->
<scene sceneID="rn9-fJ-mg7">
<objects>
<tableViewController id="ayJ-fs-aIU" customClass="ShowDetailsController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="vWS-Yc-qQ5">
<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="pum-yC-c7w">
<cells>
<tableViewCell clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="LQ8-yL-l4p">
<rect key="frame" x="0.0" y="99" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="LQ8-yL-l4p" id="Drc-sv-gqn">
<frame key="frameInset" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SAI-3c-VBt">
<constraints>
<constraint firstAttribute="width" constant="100" id="9uC-jX-ZTa"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="4Le-mO-AdY">
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<textInputTraits key="textInputTraits"/>
</textField>
</subviews>
<constraints>
<constraint firstItem="SAI-3c-VBt" firstAttribute="leading" secondItem="Drc-sv-gqn" secondAttribute="leadingMargin" id="1S9-wd-uDV"/>
<constraint firstItem="4Le-mO-AdY" firstAttribute="centerY" secondItem="Drc-sv-gqn" secondAttribute="centerY" id="6Za-fn-Qo5"/>
<constraint firstItem="4Le-mO-AdY" firstAttribute="leading" secondItem="SAI-3c-VBt" secondAttribute="trailing" constant="8" symbolic="YES" id="dVc-fd-hD7"/>
<constraint firstItem="SAI-3c-VBt" firstAttribute="centerY" secondItem="4Le-mO-AdY" secondAttribute="centerY" id="vKI-o6-Tub"/>
<constraint firstItem="4Le-mO-AdY" firstAttribute="trailing" secondItem="Drc-sv-gqn" secondAttribute="trailingMargin" id="z0g-4S-25H"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="6NO-g9-dsf">
<rect key="frame" x="0.0" y="143" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="6NO-g9-dsf" id="UWL-vW-ZHk">
<frame key="frameInset" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Length" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="EKx-FZ-XDX">
<constraints>
<constraint firstAttribute="width" constant="100" id="ZLB-KT-EH6"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" enabled="NO" contentHorizontalAlignment="left" contentVerticalAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="Lp1-jC-8cn">
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<textInputTraits key="textInputTraits" keyboardType="numberPad"/>
</textField>
</subviews>
<constraints>
<constraint firstItem="EKx-FZ-XDX" firstAttribute="centerY" secondItem="Lp1-jC-8cn" secondAttribute="centerY" id="EZm-yW-Ckn"/>
<constraint firstItem="Lp1-jC-8cn" firstAttribute="trailing" secondItem="UWL-vW-ZHk" secondAttribute="trailingMargin" id="Utp-sk-Xha"/>
<constraint firstItem="Lp1-jC-8cn" firstAttribute="leading" secondItem="EKx-FZ-XDX" secondAttribute="trailing" constant="8" symbolic="YES" id="YcO-Bd-KzB"/>
<constraint firstItem="EKx-FZ-XDX" firstAttribute="leading" secondItem="UWL-vW-ZHk" secondAttribute="leadingMargin" id="kea-OP-Z8G"/>
<constraint firstItem="Lp1-jC-8cn" firstAttribute="centerY" secondItem="UWL-vW-ZHk" secondAttribute="centerY" id="mwE-RM-Z8P"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection id="52O-Rg-UgA">
<cells>
<tableViewCell clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="b0f-WS-wGd">
<rect key="frame" x="0.0" y="223" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="b0f-WS-wGd" id="Tej-UW-yK7">
<frame key="frameInset" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Legacy" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sLx-Wk-oJm">
<constraints>
<constraint firstAttribute="width" constant="100" id="47g-NW-zSf"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" enabled="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="qW3-51-hZP"/>
</subviews>
<constraints>
<constraint firstItem="sLx-Wk-oJm" firstAttribute="centerY" secondItem="qW3-51-hZP" secondAttribute="centerY" id="D1R-xs-cHg"/>
<constraint firstItem="sLx-Wk-oJm" firstAttribute="centerY" secondItem="Tej-UW-yK7" secondAttribute="centerY" id="D8l-CY-P1l"/>
<constraint firstItem="sLx-Wk-oJm" firstAttribute="leading" secondItem="Tej-UW-yK7" secondAttribute="leadingMargin" id="p4T-Nx-CZ7"/>
<constraint firstItem="qW3-51-hZP" firstAttribute="trailing" secondItem="Tej-UW-yK7" secondAttribute="trailingMargin" id="ze1-Zm-Lsu"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection id="pLW-Tc-sKf">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="HHm-l0-c0d">
<rect key="frame" x="0.0" y="303" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="HHm-l0-c0d" id="4qT-tm-wo7">
<frame key="frameInset" width="375" height="43"/>
<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="fAW-aP-GN9">
<constraints>
<constraint firstAttribute="width" constant="100" id="wRI-ys-67O"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" highlighted="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="DJv-Ey-Hka">
<nil key="textColor"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<textInputTraits key="textInputTraits" returnKeyType="done" secureTextEntry="YES"/>
<connections>
<outlet property="delegate" destination="ayJ-fs-aIU" id="IuL-Kw-qIq"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstItem="DJv-Ey-Hka" firstAttribute="trailing" secondItem="4qT-tm-wo7" secondAttribute="trailingMargin" id="Ojn-rK-34A"/>
<constraint firstItem="fAW-aP-GN9" firstAttribute="centerY" secondItem="DJv-Ey-Hka" secondAttribute="centerY" id="dLR-Jj-Sxg"/>
<constraint firstItem="fAW-aP-GN9" firstAttribute="leading" secondItem="4qT-tm-wo7" secondAttribute="leadingMargin" id="syQ-7j-dym"/>
<constraint firstItem="DJv-Ey-Hka" firstAttribute="centerY" secondItem="4qT-tm-wo7" secondAttribute="centerY" id="y6e-z3-TCc"/>
<constraint firstItem="DJv-Ey-Hka" firstAttribute="leading" secondItem="fAW-aP-GN9" secondAttribute="trailing" constant="8" symbolic="YES" id="yhk-xE-L6d"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection id="3SB-Gu-7Nb">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="zL5-5B-O5f">
<rect key="frame" x="0.0" y="383" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="zL5-5B-O5f" id="WMu-8w-qhO">
<frame key="frameInset" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Generate and Copy to Clipboard" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sss-5e-vm2">
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="sss-5e-vm2" firstAttribute="leading" secondItem="WMu-8w-qhO" secondAttribute="leadingMargin" id="Gm5-eD-xPi"/>
<constraint firstItem="sss-5e-vm2" firstAttribute="centerY" secondItem="WMu-8w-qhO" secondAttribute="centerY" id="OXC-y2-7gS"/>
<constraint firstItem="sss-5e-vm2" firstAttribute="top" secondItem="WMu-8w-qhO" secondAttribute="topMargin" id="joe-t9-o2R"/>
<constraint firstItem="sss-5e-vm2" firstAttribute="trailing" secondItem="WMu-8w-qhO" secondAttribute="trailingMargin" id="r2a-xm-CaS"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="ojF-JZ-yCg">
<rect key="frame" x="0.0" y="427" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="ojF-JZ-yCg" id="bbw-fx-dOK">
<frame key="frameInset" width="375" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Generate and Show" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Tib-hU-gDm">
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="Tib-hU-gDm" firstAttribute="centerY" secondItem="bbw-fx-dOK" secondAttribute="centerY" id="BBD-RX-b7u"/>
<constraint firstItem="Tib-hU-gDm" firstAttribute="trailing" secondItem="bbw-fx-dOK" secondAttribute="trailingMargin" id="F5B-kd-c7f"/>
<constraint firstItem="Tib-hU-gDm" firstAttribute="leading" secondItem="bbw-fx-dOK" secondAttribute="leadingMargin" id="Oz0-mR-aCn"/>
<constraint firstItem="Tib-hU-gDm" firstAttribute="top" secondItem="bbw-fx-dOK" secondAttribute="topMargin" id="stq-PT-3DW"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="ayJ-fs-aIU" id="kaj-Eg-sHs"/>
<outlet property="delegate" destination="ayJ-fs-aIU" id="af9-4J-p1D"/>
</connections>
</tableView>
<navigationItem key="navigationItem" id="xhc-og-4ho"/>
<connections>
<outlet property="legacySwitch" destination="qW3-51-hZP" id="NsI-F3-hVQ"/>
<outlet property="lengthField" destination="Lp1-jC-8cn" id="05B-m5-JnB"/>
<outlet property="nameField" destination="4Le-mO-AdY" id="kSd-Rz-Zai"/>
<outlet property="passphraseField" destination="DJv-Ey-Hka" id="zkA-6v-zc1"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="o5r-z3-hVF" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1992.8" y="-265.81709145427288"/>
</scene>
</scenes>
</document>

38
iOS/Info.plist Normal file
View file

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

31
iOS/MainViewController.h Normal file
View file

@ -0,0 +1,31 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import UIKit;
#import "SiteStorage.h"
@interface MainViewController: UIViewController <UITableViewDelegate,
UITableViewDataSource>
@property (retain) SiteStorage *siteStorage;
@property (retain, nonatomic) IBOutlet UITableView *tableView;
@end

80
iOS/MainViewController.m Normal file
View file

@ -0,0 +1,80 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import ObjFW_Bridge;
#import "MainViewController.h"
#import "AddSiteController.h"
#import "ShowDetailsController.h"
@implementation MainViewController
- (void)viewDidLoad
{
_siteStorage = [[SiteStorage alloc] init];
}
- (void)dealloc
{
[_siteStorage release];
[_tableView release];
[super dealloc];
}
- (NSInteger)tableView: (UITableView*)tableView
numberOfRowsInSection: (NSInteger)section
{
return [self.siteStorage sitesCount];
}
- (UITableViewCell*)tableView: (UITableView*)tableView
cellForRowAtIndexPath: (NSIndexPath*)indexPath
{
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier: @"site"];
if (cell == nil)
cell = [[[UITableViewCell alloc]
initWithStyle: UITableViewCellStyleDefault
reuseIdentifier: @"site"] autorelease];
cell.textLabel.text = [self.siteStorage.sites[indexPath.row] NSObject];
return cell;
}
- (void)tableView: (UITableView*)tableView
didSelectRowAtIndexPath: (NSIndexPath*)indexPath
{
[self performSegueWithIdentifier: @"showDetails"
sender: self];
}
- (void)prepareForSegue: (UIStoryboardSegue*)segue
sender: (id)sender
{
if ([segue.identifier isEqual: @"addSite"] ||
[segue.identifier isEqual: @"showDetails"])
[segue.destinationViewController setMainViewController: self];
}
@end

View file

@ -0,0 +1,40 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import UIKit;
#import "MainViewController.h"
@interface ShowDetailsController: UITableViewController <UITableViewDelegate,
UITextFieldDelegate>
{
OFString *_name;
size_t _length;
bool _legacy;
}
@property (retain, nonatomic) IBOutlet UITextField *nameField;
@property (retain, nonatomic) IBOutlet UITextField *lengthField;
@property (retain, nonatomic) IBOutlet UISwitch *legacySwitch;
@property (retain, nonatomic) IBOutlet UITextField *passphraseField;
@property (retain) MainViewController *mainViewController;
@end

186
iOS/ShowDetailsController.m Normal file
View file

@ -0,0 +1,186 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import ObjFW;
@import ObjFW_Bridge;
#import "ShowDetailsController.h"
#import "SiteStorage.h"
#import "PasswordGenerator.h"
#import "NewPasswordGenerator.h"
#import "LegacyPasswordGenerator.h"
@interface ShowDetailsController ()
- (NSMutableString*)_generate;
- (void)_generateAndCopy;
- (void)_generateAndShow;
@end
static void
clearNSMutableString(NSMutableString *string)
{
/*
* NSMutableString does not offer a way to zero the string.
* This is in the hope that setting a single character at an index just
* replaces that character in memory, and thus allows us to zero the
* password.
*/
for (NSUInteger i = 0 ; i < string.length; i++)
[string replaceCharactersInRange: NSMakeRange(i, 1)
withString: @" "];
}
@implementation ShowDetailsController
- (void)dealloc
{
[_name release];
[_nameField release];
[_lengthField release];
[_legacySwitch release];
[_passphraseField release];
[super dealloc];
}
- (void)viewWillAppear: (BOOL)animated
{
SiteStorage *siteStorage = self.mainViewController.siteStorage;
NSInteger row =
self.mainViewController.tableView.indexPathForSelectedRow.row;
[_name release];
_name = [siteStorage.sites[row] retain];
_length = [siteStorage lengthForSite: _name];
_legacy = [siteStorage isSiteLegacy: _name];
self.nameField.text = [_name NSObject];
self.lengthField.text = [NSString stringWithFormat: @"%zu", _length];
self.legacySwitch.enabled = _legacy;
}
- (void)viewDidAppear: (BOOL)animated
{
[self.passphraseField becomeFirstResponder];
}
- (BOOL)textFieldShouldReturn: (UITextField*)textField
{
[textField resignFirstResponder];
return NO;
}
- (void)tableView: (UITableView*)tableView
didSelectRowAtIndexPath: (NSIndexPath*)indexPath
{
[self.passphraseField resignFirstResponder];
[tableView deselectRowAtIndexPath: indexPath
animated: YES];
if (indexPath.section == 3) {
switch (indexPath.row) {
case 0:
[self _generateAndCopy];
break;
case 1:
[self _generateAndShow];
break;
}
}
}
- (void)_generateAndCopy
{
NSMutableString *password = [self _generate];
UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];
pasteBoard.string = password;
clearNSMutableString(password);
UIAlertController *alert = [UIAlertController
alertControllerWithTitle: @"Password Generated"
message: @"The password has been copied into the "
@"clipboard."
preferredStyle: UIAlertControllerStyleAlert];
[alert addAction:
[UIAlertAction actionWithTitle: @"OK"
style: UIAlertActionStyleDefault
handler: nil]];
[self presentViewController: alert
animated: YES
completion: nil];
}
- (void)_generateAndShow
{
NSMutableString *password = [self _generate];
UIAlertController *alert = [UIAlertController
alertControllerWithTitle: @"Generated Passphrase"
message: password
preferredStyle: UIAlertControllerStyleAlert];
[alert addAction:
[UIAlertAction actionWithTitle: @"OK"
style: UIAlertActionStyleDefault
handler: nil]];
[self presentViewController: alert
animated: YES
completion: ^ {
clearNSMutableString(password);
}];
}
- (NSMutableString*)_generate
{
id <PasswordGenerator> generator;
char *passphrase;
if (_legacy)
generator = [LegacyPasswordGenerator generator];
else
generator = [NewPasswordGenerator generator];
generator.site = _name;
generator.length = _length;
passphrase = of_strdup([self.passphraseField.text UTF8String]);
@try {
self.passphraseField.text = @"";
generator.passphrase = passphrase;
[generator derivePassword];
} @finally {
of_explicit_memset(passphrase, 0, strlen(passphrase));
free(passphrase);
}
NSMutableString *password = [NSMutableString
stringWithUTF8String: (char*)generator.output];
of_explicit_memset(generator.output, 0,
strlen((char*)generator.output));
return password;
}
@end

42
iOS/SiteStorage.h Normal file
View file

@ -0,0 +1,42 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import ObjFW;
@interface SiteStorage: OFObject
{
OFString *_path;
OFMutableDictionary <OFString*, OFDictionary <OFNumber*, OFNumber*>*>
*_storage;
OFArray *_sites;
}
- (OFArray*)sites;
- (size_t)sitesCount;
- (bool)hasSite: (OFString*)name;
- (size_t)lengthForSite: (OFString*)name;
- (bool)isSiteLegacy: (OFString*)name;
- (void)setSite: (OFString*)site
length: (size_t)length
legacy: (bool)legacy;
- (void)removeSite: (OFString*)name;
@end

159
iOS/SiteStorage.m Normal file
View file

@ -0,0 +1,159 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import ObjFW;
/* For literals and boxing. */
@compatibility_alias NSDictionary OFDictionary;
@compatibility_alias NSNumber OFNumber;
#import "SiteStorage.h"
@interface SiteStorage ()
- (void)_update;
@end
static OFNumber *lengthField, *legacyField;
@implementation SiteStorage
+ (void)initialize
{
lengthField = [@(UINT8_C(0)) retain];
legacyField = [@(UINT8_C(1)) retain];
}
- init
{
self = [super init];
@try {
void *pool = objc_autoreleasePoolPush();
OFFileManager *fileManager = [OFFileManager defaultManager];
OFString *userDataPath = [OFSystemInfo userDataPath];
if (![fileManager directoryExistsAtPath: userDataPath])
[fileManager createDirectoryAtPath: userDataPath];
_path = [[userDataPath stringByAppendingPathComponent:
@"sites.msgpack"] retain];
@try {
_storage = [[[OFDataArray
dataArrayWithContentsOfFile: _path]
messagePackValue] mutableCopy];
} @catch (id e) {
_storage = [[OFMutableDictionary alloc] init];
}
_sites = [[[_storage allKeys] sortedArray] retain];
objc_autoreleasePoolPop(pool);
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
- (void)dealloc
{
[_path release];
[_storage release];
[_sites release];
[super dealloc];
}
- (OFArray*)sites
{
void *pool = objc_autoreleasePoolPush();
OFArray *sites = [[_storage allKeys] sortedArray];
[sites retain];
objc_autoreleasePoolPop(pool);
return [sites autorelease];
}
- (size_t)sitesCount
{
return [_storage count];
}
- (bool)hasSite: (OFString*)name
{
return (_storage[name] != nil);
}
- (size_t)lengthForSite: (OFString*)name
{
OFDictionary *site = _storage[name];
if (site == nil)
@throw [OFInvalidArgumentException exception];
return [site[lengthField] sizeValue];
}
- (bool)isSiteLegacy: (OFString*)name
{
OFDictionary *site = _storage[name];
if (site == nil)
@throw [OFInvalidArgumentException exception];
return [site[legacyField] boolValue];
}
- (void)setSite: (OFString*)site
length: (size_t)length
legacy: (bool)legacy
{
void *pool = objc_autoreleasePoolPush();
_storage[site] = @{
lengthField: @(length),
legacyField: @(legacy)
};
[self _update];
objc_autoreleasePoolPop(pool);
}
- (void)removeSite: (OFString*)name
{
[_storage removeObjectForKey: name];
[self _update];
}
- (void)_update
{
void *pool = objc_autoreleasePoolPush();
[[_storage messagePackRepresentation] writeToFile: _path];
[_sites release];
_sites = [[[_storage allKeys] sortedArray] retain];
objc_autoreleasePoolPop(pool);
}
@end

49
iOS/main.m Normal file
View file

@ -0,0 +1,49 @@
/*
* Copyright (c) 2016, Jonathan Schleifer <js@heap.zone>
*
* https://heap.zone/git/?p=scrypt-pwgen.git
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice is present in all copies.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
@import ObjFW;
@import UIKit;
#import "AppDelegate.h"
@interface OFAppDelegate: OFObject <OFApplicationDelegate>
@end
OF_APPLICATION_DELEGATE(OFAppDelegate)
@implementation OFAppDelegate
- (void)applicationDidFinishLaunching
{
int *argc;
char ***argv;
int status;
[[OFApplication sharedApplication]
getArgumentCount: &argc
andArgumentValues: &argv];
status = UIApplicationMain(*argc, *argv, nil,
NSStringFromClass([AppDelegate class]));
[OFApplication terminateWithStatus: status];
}
@end

View file

@ -0,0 +1,404 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
4B0719251DAA78D80065997A /* ShowDetailsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B0719241DAA78D80065997A /* ShowDetailsController.m */; };
4B2E52E11DA942840040D091 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E52E01DA942840040D091 /* main.m */; };
4B2E52E41DA942840040D091 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E52E31DA942840040D091 /* AppDelegate.m */; };
4B2E52E71DA942840040D091 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E52E61DA942840040D091 /* MainViewController.m */; };
4B2E52EA1DA942840040D091 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4B2E52E81DA942840040D091 /* Main.storyboard */; };
4B2E52EC1DA942840040D091 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4B2E52EB1DA942840040D091 /* Assets.xcassets */; };
4B2E52EF1DA942840040D091 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4B2E52ED1DA942840040D091 /* LaunchScreen.storyboard */; };
4BA115D21DA9432D007ED4EA /* LegacyPasswordGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BA115CE1DA9432D007ED4EA /* LegacyPasswordGenerator.m */; settings = {COMPILER_FLAGS = "-fconstant-string-class=OFConstantString -fno-constant-cfstrings"; }; };
4BA115D31DA9432D007ED4EA /* NewPasswordGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BA115D01DA9432D007ED4EA /* NewPasswordGenerator.m */; settings = {COMPILER_FLAGS = "-fconstant-string-class=OFConstantString -fno-constant-cfstrings"; }; };
4BA115D61DA94390007ED4EA /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BA115D51DA94390007ED4EA /* UIKit.framework */; };
4BB3CDF41DA967C100FEE5ED /* ObjFW.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BB3CDF31DA967C100FEE5ED /* ObjFW.framework */; };
4BB3CDF51DA967C100FEE5ED /* ObjFW.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4BB3CDF31DA967C100FEE5ED /* ObjFW.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4BB3CDFD1DA9764300FEE5ED /* AddSiteController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BB3CDFC1DA9764300FEE5ED /* AddSiteController.m */; };
4BF4ADEA1DA9A3DB0073B995 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BF4ADE91DA9A3DB0073B995 /* Foundation.framework */; };
4BF4ADED1DA9A6B00073B995 /* SiteStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BF4ADEC1DA9A6B00073B995 /* SiteStorage.m */; settings = {COMPILER_FLAGS = "-fconstant-string-class=OFConstantString -fno-constant-cfstrings"; }; };
4BF720731DA9C6E3001340C3 /* ObjFW_Bridge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BF720721DA9C6E3001340C3 /* ObjFW_Bridge.framework */; };
4BF720741DA9C6E3001340C3 /* ObjFW_Bridge.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4BF720721DA9C6E3001340C3 /* ObjFW_Bridge.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
4BB3CDF61DA967C100FEE5ED /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
4BF720741DA9C6E3001340C3 /* ObjFW_Bridge.framework in Embed Frameworks */,
4BB3CDF51DA967C100FEE5ED /* ObjFW.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
4B0719231DAA78D80065997A /* ShowDetailsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShowDetailsController.h; sourceTree = "<group>"; };
4B0719241DAA78D80065997A /* ShowDetailsController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ShowDetailsController.m; sourceTree = "<group>"; };
4B2E52DC1DA942840040D091 /* scrypt-pwgen.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "scrypt-pwgen.app"; sourceTree = BUILT_PRODUCTS_DIR; };
4B2E52E01DA942840040D091 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
4B2E52E21DA942840040D091 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
4B2E52E31DA942840040D091 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
4B2E52E51DA942840040D091 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = "<group>"; };
4B2E52E61DA942840040D091 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainViewController.m; sourceTree = "<group>"; };
4B2E52E91DA942840040D091 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
4B2E52EB1DA942840040D091 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
4B2E52EE1DA942840040D091 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
4B2E52F01DA942840040D091 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
4BA115CD1DA9432D007ED4EA /* LegacyPasswordGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LegacyPasswordGenerator.h; path = ../LegacyPasswordGenerator.h; sourceTree = "<group>"; };
4BA115CE1DA9432D007ED4EA /* LegacyPasswordGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LegacyPasswordGenerator.m; path = ../LegacyPasswordGenerator.m; sourceTree = "<group>"; };
4BA115CF1DA9432D007ED4EA /* NewPasswordGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NewPasswordGenerator.h; path = ../NewPasswordGenerator.h; sourceTree = "<group>"; };
4BA115D01DA9432D007ED4EA /* NewPasswordGenerator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NewPasswordGenerator.m; path = ../NewPasswordGenerator.m; sourceTree = "<group>"; };
4BA115D11DA9432D007ED4EA /* PasswordGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PasswordGenerator.h; path = ../PasswordGenerator.h; sourceTree = "<group>"; };
4BA115D51DA94390007ED4EA /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
4BB3CDF31DA967C100FEE5ED /* ObjFW.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ObjFW.framework; sourceTree = "<group>"; };
4BB3CDFB1DA9764300FEE5ED /* AddSiteController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AddSiteController.h; sourceTree = "<group>"; };
4BB3CDFC1DA9764300FEE5ED /* AddSiteController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AddSiteController.m; sourceTree = "<group>"; };
4BF4ADE91DA9A3DB0073B995 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
4BF4ADEB1DA9A6B00073B995 /* SiteStorage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SiteStorage.h; sourceTree = "<group>"; };
4BF4ADEC1DA9A6B00073B995 /* SiteStorage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SiteStorage.m; sourceTree = "<group>"; };
4BF720721DA9C6E3001340C3 /* ObjFW_Bridge.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ObjFW_Bridge.framework; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
4B2E52D91DA942840040D091 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4BF4ADEA1DA9A3DB0073B995 /* Foundation.framework in Frameworks */,
4BA115D61DA94390007ED4EA /* UIKit.framework in Frameworks */,
4BB3CDF41DA967C100FEE5ED /* ObjFW.framework in Frameworks */,
4BF720731DA9C6E3001340C3 /* ObjFW_Bridge.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
4B2E52D31DA942840040D091 = {
isa = PBXGroup;
children = (
4BA115CC1DA9431D007ED4EA /* scrypt-pwgen */,
4B2E52DE1DA942840040D091 /* iOS */,
4B2E52DD1DA942840040D091 /* Products */,
4BA115D41DA94390007ED4EA /* Frameworks */,
);
sourceTree = "<group>";
};
4B2E52DD1DA942840040D091 /* Products */ = {
isa = PBXGroup;
children = (
4B2E52DC1DA942840040D091 /* scrypt-pwgen.app */,
);
name = Products;
sourceTree = "<group>";
};
4B2E52DE1DA942840040D091 /* iOS */ = {
isa = PBXGroup;
children = (
4B2E52EB1DA942840040D091 /* Assets.xcassets */,
4BB3CDFB1DA9764300FEE5ED /* AddSiteController.h */,
4BB3CDFC1DA9764300FEE5ED /* AddSiteController.m */,
4B2E52E21DA942840040D091 /* AppDelegate.h */,
4B2E52E31DA942840040D091 /* AppDelegate.m */,
4B2E52F01DA942840040D091 /* Info.plist */,
4B2E52ED1DA942840040D091 /* LaunchScreen.storyboard */,
4B2E52E81DA942840040D091 /* Main.storyboard */,
4B2E52E51DA942840040D091 /* MainViewController.h */,
4B2E52E61DA942840040D091 /* MainViewController.m */,
4B0719231DAA78D80065997A /* ShowDetailsController.h */,
4B0719241DAA78D80065997A /* ShowDetailsController.m */,
4BF4ADEB1DA9A6B00073B995 /* SiteStorage.h */,
4BF4ADEC1DA9A6B00073B995 /* SiteStorage.m */,
4B2E52E01DA942840040D091 /* main.m */,
);
name = iOS;
sourceTree = "<group>";
};
4BA115CC1DA9431D007ED4EA /* scrypt-pwgen */ = {
isa = PBXGroup;
children = (
4BA115CD1DA9432D007ED4EA /* LegacyPasswordGenerator.h */,
4BA115CE1DA9432D007ED4EA /* LegacyPasswordGenerator.m */,
4BA115CF1DA9432D007ED4EA /* NewPasswordGenerator.h */,
4BA115D01DA9432D007ED4EA /* NewPasswordGenerator.m */,
4BA115D11DA9432D007ED4EA /* PasswordGenerator.h */,
);
name = "scrypt-pwgen";
sourceTree = "<group>";
};
4BA115D41DA94390007ED4EA /* Frameworks */ = {
isa = PBXGroup;
children = (
4BB3CDF31DA967C100FEE5ED /* ObjFW.framework */,
4BF720721DA9C6E3001340C3 /* ObjFW_Bridge.framework */,
4BF4ADE91DA9A3DB0073B995 /* Foundation.framework */,
4BA115D51DA94390007ED4EA /* UIKit.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
4B2E52DB1DA942840040D091 /* scrypt-pwgen */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4B2E52F31DA942840040D091 /* Build configuration list for PBXNativeTarget "scrypt-pwgen" */;
buildPhases = (
4B2E52D81DA942840040D091 /* Sources */,
4B2E52D91DA942840040D091 /* Frameworks */,
4B2E52DA1DA942840040D091 /* Resources */,
4BB3CDF61DA967C100FEE5ED /* Embed Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = "scrypt-pwgen";
productName = "scrypt-pwgen";
productReference = 4B2E52DC1DA942840040D091 /* scrypt-pwgen.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
4B2E52D41DA942840040D091 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Jonathan Schleifer";
TargetAttributes = {
4B2E52DB1DA942840040D091 = {
CreatedOnToolsVersion = 8.0;
DevelopmentTeam = MXKNFCKFL6;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 4B2E52D71DA942840040D091 /* Build configuration list for PBXProject "scrypt-pwgen" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 4B2E52D31DA942840040D091;
productRefGroup = 4B2E52DD1DA942840040D091 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
4B2E52DB1DA942840040D091 /* scrypt-pwgen */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
4B2E52DA1DA942840040D091 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4B2E52EF1DA942840040D091 /* LaunchScreen.storyboard in Resources */,
4B2E52EC1DA942840040D091 /* Assets.xcassets in Resources */,
4B2E52EA1DA942840040D091 /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
4B2E52D81DA942840040D091 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4BB3CDFD1DA9764300FEE5ED /* AddSiteController.m in Sources */,
4B2E52E41DA942840040D091 /* AppDelegate.m in Sources */,
4BA115D21DA9432D007ED4EA /* LegacyPasswordGenerator.m in Sources */,
4B2E52E71DA942840040D091 /* MainViewController.m in Sources */,
4BA115D31DA9432D007ED4EA /* NewPasswordGenerator.m in Sources */,
4B0719251DAA78D80065997A /* ShowDetailsController.m in Sources */,
4BF4ADED1DA9A6B00073B995 /* SiteStorage.m in Sources */,
4B2E52E11DA942840040D091 /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
4B2E52E81DA942840040D091 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
4B2E52E91DA942840040D091 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
4B2E52ED1DA942840040D091 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
4B2E52EE1DA942840040D091 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
4B2E52F11DA942840040D091 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVES = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
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 = 10.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
4B2E52F21DA942840040D091 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_CONSTANT_CONVERSION = 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_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_SUSPICIOUS_MOVES = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
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 = 10.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
4B2E52F41DA942840040D091 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_OBJC_ARC = NO;
DEVELOPMENT_TEAM = MXKNFCKFL6;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
);
INFOPLIST_FILE = Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "zone.heap.scrypt-pwgen";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Debug;
};
4B2E52F51DA942840040D091 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_OBJC_ARC = NO;
DEVELOPMENT_TEAM = MXKNFCKFL6;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
);
INFOPLIST_FILE = Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "zone.heap.scrypt-pwgen";
PRODUCT_NAME = "$(TARGET_NAME)";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4B2E52D71DA942840040D091 /* Build configuration list for PBXProject "scrypt-pwgen" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4B2E52F11DA942840040D091 /* Debug */,
4B2E52F21DA942840040D091 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4B2E52F31DA942840040D091 /* Build configuration list for PBXNativeTarget "scrypt-pwgen" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4B2E52F41DA942840040D091 /* Debug */,
4B2E52F51DA942840040D091 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 4B2E52D41DA942840040D091 /* Project object */;
}