Compare commits
74 Commits
2.1-b2
...
2.1-appsto
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f173d7586 | ||
|
|
34be1eac70 | ||
|
|
e1a9c8194c | ||
|
|
e18dee2242 | ||
|
|
a38829c1e2 | ||
|
|
8615f6af5d | ||
|
|
d642cb1aee | ||
|
|
2be2a19fa0 | ||
|
|
0d5b51ed8d | ||
|
|
c781bcf10a | ||
|
|
1c45a0df4a | ||
|
|
6b16e4d606 | ||
|
|
e837752777 | ||
|
|
84c23fa7f6 | ||
|
|
2b0cc8ec7b | ||
|
|
6f77e1922b | ||
|
|
653f90c59c | ||
|
|
3076cc3de4 | ||
|
|
15c53c06c6 | ||
|
|
b3a886a6db | ||
|
|
41ae6a5de5 | ||
|
|
92bd2cd016 | ||
|
|
4b975b5b04 | ||
|
|
56f04a8924 | ||
|
|
3c2b5de4b8 | ||
|
|
33e1492b44 | ||
|
|
9384e27247 | ||
|
|
a95561dd50 | ||
|
|
9d809f34d9 | ||
|
|
fc21bd959f | ||
|
|
2de17384ff | ||
|
|
85dab50996 | ||
|
|
bb97e8f3e8 | ||
|
|
f3d0368a75 | ||
|
|
283d555d3b | ||
|
|
d909e64670 | ||
|
|
10f100186c | ||
|
|
2af2351ebf | ||
|
|
49b3fe7913 | ||
|
|
9d926be8ae | ||
|
|
c3474de2ff | ||
|
|
68b9b4e09a | ||
|
|
b810c1032b | ||
|
|
a4ab3c7bc9 | ||
|
|
039547b735 | ||
|
|
6f741f6f2f | ||
|
|
38d4b761b7 | ||
|
|
18f8ebb9dc | ||
|
|
794d064a99 | ||
|
|
090b274363 | ||
|
|
25ba87f119 | ||
|
|
f0b659a0c7 | ||
|
|
7736788920 | ||
|
|
e3be98f3ad | ||
|
|
d9b1b44de0 | ||
|
|
c3c2de5d14 | ||
|
|
6aa50bac04 | ||
|
|
5268039c3d | ||
|
|
0d66d4660e | ||
|
|
e981df3c8b | ||
|
|
543ebd4bac | ||
|
|
e6d21e1c1d | ||
|
|
a3ebcf0608 | ||
|
|
556d1d3d58 | ||
|
|
979d3a2a5a | ||
|
|
480e7f192a | ||
|
|
a18793b161 | ||
|
|
9b24efa65c | ||
|
|
3e217d5a69 | ||
|
|
c8ca1c80e6 | ||
|
|
88c18db010 | ||
|
|
f909cdbae4 | ||
|
|
8b8d5d325e | ||
|
|
c7670f47db |
6
.gitignore
vendored
@@ -16,6 +16,9 @@
|
|||||||
xcuserdata/
|
xcuserdata/
|
||||||
/DerivedData/
|
/DerivedData/
|
||||||
|
|
||||||
|
# Generated
|
||||||
|
MasterPassword/Resources/Media/Images.xcassets/
|
||||||
|
|
||||||
# Media
|
# Media
|
||||||
Press/Background.png
|
Press/Background.png
|
||||||
Press/Front-Page.png
|
Press/Front-Page.png
|
||||||
@@ -29,7 +32,10 @@ Press/MasterPassword_PressKit/MasterPassword_pressrelease_*.pdf
|
|||||||
MasterPassword/Java/**/target
|
MasterPassword/Java/**/target
|
||||||
|
|
||||||
# C
|
# C
|
||||||
|
MasterPassword/C/VERSION
|
||||||
MasterPassword/C/*.o
|
MasterPassword/C/*.o
|
||||||
|
MasterPassword/C/mpw-*.tar.gz
|
||||||
MasterPassword/C/mpw
|
MasterPassword/C/mpw
|
||||||
|
MasterPassword/C/mpw-bench
|
||||||
MasterPassword/C/lib/*/*
|
MasterPassword/C/lib/*/*
|
||||||
!MasterPassword/C/lib/*/.source
|
!MasterPassword/C/lib/*/.source
|
||||||
|
|||||||
12
.gitmodules
vendored
@@ -4,12 +4,18 @@
|
|||||||
[submodule "External/InAppSettingsKit"]
|
[submodule "External/InAppSettingsKit"]
|
||||||
path = External/InAppSettingsKit
|
path = External/InAppSettingsKit
|
||||||
url = git://github.com/lhunath/InAppSettingsKit.git
|
url = git://github.com/lhunath/InAppSettingsKit.git
|
||||||
[submodule "External/RHStatusItemView"]
|
|
||||||
path = External/RHStatusItemView
|
|
||||||
url = git://github.com/lhunath/RHStatusItemView.git
|
|
||||||
[submodule "External/KCOrderedAccessorFix"]
|
[submodule "External/KCOrderedAccessorFix"]
|
||||||
path = External/KCOrderedAccessorFix
|
path = External/KCOrderedAccessorFix
|
||||||
url = https://github.com/CFKevinRef/KCOrderedAccessorFix.git
|
url = https://github.com/CFKevinRef/KCOrderedAccessorFix.git
|
||||||
[submodule "External/AttributedMarkdown"]
|
[submodule "External/AttributedMarkdown"]
|
||||||
path = External/AttributedMarkdown
|
path = External/AttributedMarkdown
|
||||||
url = https://github.com/dreamwieber/AttributedMarkdown.git
|
url = https://github.com/dreamwieber/AttributedMarkdown.git
|
||||||
|
[submodule "External/uicolor-utilities"]
|
||||||
|
path = External/uicolor-utilities
|
||||||
|
url = git://github.com/lhunath/uicolor-utilities.git
|
||||||
|
[submodule "External/jrswizzle"]
|
||||||
|
path = External/jrswizzle
|
||||||
|
url = git://github.com/jonmarimba/jrswizzle.git
|
||||||
|
[submodule "Site/2013-05/mpw-js/js/mpw-js"]
|
||||||
|
path = Site/2013-05/mpw-js/js/mpw-js
|
||||||
|
url = https://github.com/Lyndir/mpw-js.git
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
language: objective-c
|
language: objective-c
|
||||||
xcode_workspace: MasterPassword.xcworkspace
|
xcode_project: MasterPassword/ObjC/iOS/MasterPassword-iOS.xcodeproj
|
||||||
xcode_scheme: MasterPassword iOS (Development)
|
xcode_scheme: MasterPassword iOS (Development)
|
||||||
xcode_sdk: iphonesimulator
|
xcode_sdk: iphonesimulator
|
||||||
git:
|
git:
|
||||||
submodules: false
|
submodules: true
|
||||||
before_install: ./Scripts/updateDependencies
|
|
||||||
|
|||||||
2
External/KCOrderedAccessorFix
vendored
1
External/Mac/Crashlytics.framework/Modules
vendored
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
Versions/Current/Modules
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
||||||
|
OBJC_EXTERN void CLSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -46,6 +47,8 @@ OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
||||||
|
OBJC_EXTERN void CLSNSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0);
|
||||||
|
|
||||||
|
|
||||||
@protocol CrashlyticsDelegate;
|
@protocol CrashlyticsDelegate;
|
||||||
|
|
||||||
|
|||||||
6
External/Mac/Crashlytics.framework/Versions/A/Modules/module.modulemap
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
framework module Crashlytics {
|
||||||
|
umbrella header "Crashlytics.h"
|
||||||
|
|
||||||
|
export *
|
||||||
|
module * { export * }
|
||||||
|
}
|
||||||
@@ -15,13 +15,13 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>FMWK</string>
|
<string>FMWK</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2.1.2</string>
|
<string>2.2.5</string>
|
||||||
<key>CFBundleSupportedPlatforms</key>
|
<key>CFBundleSupportedPlatforms</key>
|
||||||
<array>
|
<array>
|
||||||
<string>macosx</string>
|
<string>macosx</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>9</string>
|
<string>39</string>
|
||||||
<key>DTPlatformName</key>
|
<key>DTPlatformName</key>
|
||||||
<string>macosx</string>
|
<string>macosx</string>
|
||||||
<key>MinimumOSVersion</key>
|
<key>MinimumOSVersion</key>
|
||||||
|
|||||||
BIN
External/Mac/Crashlytics.framework/run
vendored
2
External/Pearl
vendored
1
External/RHStatusItemView
vendored
@@ -38,6 +38,7 @@
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
||||||
|
OBJC_EXTERN void CLSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@@ -46,6 +47,8 @@ OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
|||||||
*
|
*
|
||||||
**/
|
**/
|
||||||
OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
OBJC_EXTERN void CLSNSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
|
||||||
|
OBJC_EXTERN void CLSNSLogv(NSString *format, va_list args) NS_FORMAT_FUNCTION(1,0);
|
||||||
|
|
||||||
|
|
||||||
@protocol CrashlyticsDelegate;
|
@protocol CrashlyticsDelegate;
|
||||||
|
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>FMWK</string>
|
<string>FMWK</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2.2.4</string>
|
<string>2.2.5</string>
|
||||||
<key>CFBundleSupportedPlatforms</key>
|
<key>CFBundleSupportedPlatforms</key>
|
||||||
<array>
|
<array>
|
||||||
<string>iPhoneOS</string>
|
<string>iPhoneOS</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>38</string>
|
<string>40</string>
|
||||||
<key>DTPlatformName</key>
|
<key>DTPlatformName</key>
|
||||||
<string>iphoneos</string>
|
<string>iphoneos</string>
|
||||||
<key>MinimumOSVersion</key>
|
<key>MinimumOSVersion</key>
|
||||||
|
|||||||
BIN
External/iOS/Crashlytics.framework/run
vendored
BIN
External/iOS/Crashlytics.framework/submit
vendored
1
External/jrswizzle
vendored
Submodule
1
External/uicolor-utilities
vendored
Submodule
@@ -50,7 +50,7 @@
|
|||||||
<key>3E67FB08419C920516AAC3B00DAAF23073B8CF77</key>
|
<key>3E67FB08419C920516AAC3B00DAAF23073B8CF77</key>
|
||||||
<string>../External/RHStatusItemView</string>
|
<string>../External/RHStatusItemView</string>
|
||||||
<key>3ED8592497DB6A564366943C9AAD5A46341B5076</key>
|
<key>3ED8592497DB6A564366943C9AAD5A46341B5076</key>
|
||||||
<string>../External/AttributedMarkdown/</string>
|
<string>../External/AttributedMarkdown</string>
|
||||||
<key>4DDCFFD91B41F00326AD14553BD66CFD366ABD91</key>
|
<key>4DDCFFD91B41F00326AD14553BD66CFD366ABD91</key>
|
||||||
<string>../External/Pearl</string>
|
<string>../External/Pearl</string>
|
||||||
<key>8A15A8EA0B3D0B497C4883425BC74DF995224BB3</key>
|
<key>8A15A8EA0B3D0B497C4883425BC74DF995224BB3</key>
|
||||||
|
|||||||
@@ -1,9 +1,264 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Run with -DDEBUG to enable trace-level output.
|
#
|
||||||
|
# TROUBLESHOOTING
|
||||||
|
# - To enable verbose algorithm/implementation debugging, use ./build -DDEBUG
|
||||||
|
# - If you see 'undefined reference to `clock_gettime'',
|
||||||
|
# try ./build -lrt instead.
|
||||||
|
# - If you see 'x86.S:202: Error: junk at end of line, first unrecognized character is `,'',
|
||||||
|
# try commenting the line in lib/bcrypt/x86.S.
|
||||||
|
#
|
||||||
|
# BUGS
|
||||||
|
# masterpassword@lyndir.com
|
||||||
|
#
|
||||||
|
# AUTHOR
|
||||||
|
# Maarten Billemont
|
||||||
|
#
|
||||||
|
cd "${BASH_SOURCE%/*}"
|
||||||
|
shopt -s extglob
|
||||||
|
set -e
|
||||||
|
|
||||||
[[ -e lib/scrypt/scryptenc.o ]] || { echo >&2 "Missing scrypt. First get and build the scrypt source in lib/scrypt from <$(<lib/scrypt/.source)>.\n"; exit 1; }
|
|
||||||
|
|
||||||
deps=( -I"lib/scrypt/lib" -I"lib/scrypt/libcperciva" -l "crypto_aesctr.o" -l "sha256.o" -l "crypto_scrypt-nosse.o" -l "memlimit.o" -l "scryptenc_cpuperf.o" -l"scryptenc.o" -l"crypto" -L"." -L"lib/scrypt" )
|
### CONFIGURATION
|
||||||
|
|
||||||
gcc "${deps[@]}" -Qunused-arguments -c types.c -o types.o "$@"
|
# Targets to build.
|
||||||
gcc "${deps[@]}" -Qunused-arguments -l"types.o" mpw.c -o mpw "$@"
|
if [[ $targets ]]; then
|
||||||
|
read -ra targets <<< "$targets"
|
||||||
|
else
|
||||||
|
# Default targets.
|
||||||
|
# Modify here or override using targets='mpw mpw-bench' ./build
|
||||||
|
targets=(
|
||||||
|
mpw # C CLI version of Master Password.
|
||||||
|
#mpw-bench # C CLI Master Password benchmark utility.
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
### DEPENDENCIES
|
||||||
|
|
||||||
|
digest() {
|
||||||
|
openssl sha -sha256 -binary < "$1" | od -t x1 -An -v | tr -d '[:space:]'
|
||||||
|
}
|
||||||
|
fetch() {
|
||||||
|
if hash wget 2>/dev/null; then
|
||||||
|
wget -O "${1##*/}" "$1"
|
||||||
|
elif hash curl 2>/dev/null; then
|
||||||
|
curl "$1" > "${1##*/}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
unpack() {
|
||||||
|
if [[ $1 = *.tar.gz || $1 = *.tgz ]]; then
|
||||||
|
tar -xvzf "$1"
|
||||||
|
|
||||||
|
elif [[ $1 = *.tar.bz2 || $1 = *.tbz2 ]]; then
|
||||||
|
tar -xvjf "$1"
|
||||||
|
|
||||||
|
elif [[ $1 = *.tar ]]; then
|
||||||
|
tar -xvf "$1"
|
||||||
|
|
||||||
|
else
|
||||||
|
echo 2>&1 "Don't know how to unpack: $1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf 'Verifying package: %s, against digest: %s...' "$1" "$2"
|
||||||
|
[[ $(digest "$1") = $2 ]] || {
|
||||||
|
printf ' mismatch!\n'
|
||||||
|
echo 2>&1 "Downloaded package doesn't match digest."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
printf ' OK!\n'
|
||||||
|
|
||||||
|
files=( !("$1") )
|
||||||
|
if [[ -d $files ]] && (( ${#files[@]} == 1 )); then
|
||||||
|
mv "$files"/* .
|
||||||
|
rmdir "$files"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
fetchSource() (
|
||||||
|
source .source
|
||||||
|
|
||||||
|
if [[ $pkg && -e "${pkg##*/}" ]]; then
|
||||||
|
files=( !("${pkg##*/}") )
|
||||||
|
[[ -e $files ]] || {
|
||||||
|
echo
|
||||||
|
echo "Unpacking: ${PWD##*/}, using package..."
|
||||||
|
unpack "${pkg##*/}" "$pkg_sha256"
|
||||||
|
}
|
||||||
|
|
||||||
|
elif [[ $git ]] && hash git 2>/dev/null; then
|
||||||
|
[[ -e .git ]] || {
|
||||||
|
echo
|
||||||
|
echo "Fetching: ${PWD##*/}, using git..."
|
||||||
|
git clone "$svn" .
|
||||||
|
printf '%s' "$(git describe --always)" > "${PWD##*/}-version"
|
||||||
|
}
|
||||||
|
|
||||||
|
elif [[ $svn ]] && hash git 2>/dev/null && [[ -x "$(git --exec-path)/git-svn" ]]; then
|
||||||
|
[[ -e .git ]] || {
|
||||||
|
echo
|
||||||
|
echo "Fetching: ${PWD##*/}, using git-svn..."
|
||||||
|
git svn clone --prefix=origin/ --stdlayout "$svn" .
|
||||||
|
printf '%s' "$(git describe --always)" > "${PWD##*/}-version"
|
||||||
|
}
|
||||||
|
|
||||||
|
elif [[ $svn ]] && hash svn 2>/dev/null; then
|
||||||
|
[[ -e .svn ]] || {
|
||||||
|
echo
|
||||||
|
echo "Fetching: ${PWD##*/}, using svn..."
|
||||||
|
svn checkout "$svn/trunk" .
|
||||||
|
printf 'r%s' "$(svn info | awk '/^Revision:/{ print $2 }')" > "${PWD##*/}-version"
|
||||||
|
}
|
||||||
|
|
||||||
|
elif [[ $pkg ]]; then
|
||||||
|
files=( !("${pkg##*/}") )
|
||||||
|
[[ -e $files ]] || {
|
||||||
|
echo
|
||||||
|
echo "Fetching: ${PWD##*/}, using package..."
|
||||||
|
fetch "$pkg"
|
||||||
|
unpack "${pkg##*/}" "$pkg_sha256"
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
echo >&2 "error: Missing git-svn or svn."
|
||||||
|
echo >&2 "error: Please install either or manually check out the sources"
|
||||||
|
echo >&2 "error: from: $home"
|
||||||
|
echo >&2 "error: into: $PWD"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
)
|
||||||
|
depend() {
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Checking dependency: $1..."
|
||||||
|
[[ -e "lib/$1/.built" ]] && return
|
||||||
|
|
||||||
|
pushd "lib/$1"
|
||||||
|
fetchSource
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Configuring dependency: $1..."
|
||||||
|
if [[ -e configure.ac ]]; then
|
||||||
|
if [[ ! -e configure ]]; then
|
||||||
|
# create configure using autotools.
|
||||||
|
if ! hash aclocal || ! hash automake; then
|
||||||
|
echo >&2 "Need autotools to build $1. Please install automake and autoconf."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
aclocal
|
||||||
|
autoheader
|
||||||
|
autoconf
|
||||||
|
mkdir -p config.aux
|
||||||
|
automake --add-missing
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -e configure ]]; then
|
||||||
|
./configure
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Building dependency: $1..."
|
||||||
|
if [[ -e Makefile ]]; then
|
||||||
|
if ! hash make; then
|
||||||
|
echo >&2 "Need make to build $1. Please install GNU make."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
make
|
||||||
|
date > .built
|
||||||
|
else
|
||||||
|
echo >&2 "error: Don't know how to build: $1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
popd
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### MPW
|
||||||
|
mpw() {
|
||||||
|
depend scrypt
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Building target: $target..."
|
||||||
|
CFLAGS=(
|
||||||
|
# include paths
|
||||||
|
-I"lib/scrypt/lib" -I"lib/scrypt/libcperciva"
|
||||||
|
)
|
||||||
|
LDFLAGS=(
|
||||||
|
# library paths
|
||||||
|
-L"." -L"lib/scrypt"
|
||||||
|
# link libraries
|
||||||
|
-l"crypto"
|
||||||
|
# scrypt
|
||||||
|
"lib/scrypt/scrypt-crypto_aesctr.o"
|
||||||
|
"lib/scrypt/scrypt-sha256.o"
|
||||||
|
"lib/scrypt/scrypt-crypto_scrypt-nosse.o"
|
||||||
|
"lib/scrypt/scrypt-memlimit.o"
|
||||||
|
"lib/scrypt/scrypt-scryptenc_cpuperf.o"
|
||||||
|
"lib/scrypt/scrypt-scryptenc.o"
|
||||||
|
)
|
||||||
|
|
||||||
|
cc "${CFLAGS[@]}" -c types.c -o types.o "$@"
|
||||||
|
cc "${CFLAGS[@]}" "${LDFLAGS[@]}" "types.o" mpw.c -o mpw "$@"
|
||||||
|
echo "done! Now run ./install or use ./mpw"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### MPW-BENCH
|
||||||
|
mpw-bench() {
|
||||||
|
depend scrypt
|
||||||
|
depend bcrypt
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Building target: $target..."
|
||||||
|
CFLAGS=(
|
||||||
|
# include paths
|
||||||
|
-I"lib/scrypt/lib" -I"lib/scrypt/libcperciva"
|
||||||
|
-I"lib/bcrypt"
|
||||||
|
)
|
||||||
|
LDFLAGS=(
|
||||||
|
# library paths
|
||||||
|
-L"." -L"lib/scrypt"
|
||||||
|
-L"lib/bcrypt"
|
||||||
|
# libraries
|
||||||
|
-l"crypto"
|
||||||
|
# scrypt
|
||||||
|
"lib/scrypt/scrypt-crypto_aesctr.o"
|
||||||
|
"lib/scrypt/scrypt-sha256.o"
|
||||||
|
"lib/scrypt/scrypt-crypto_scrypt-nosse.o"
|
||||||
|
"lib/scrypt/scrypt-memlimit.o"
|
||||||
|
"lib/scrypt/scrypt-scryptenc_cpuperf.o"
|
||||||
|
"lib/scrypt/scrypt-scryptenc.o"
|
||||||
|
# bcrypt
|
||||||
|
"lib/bcrypt/crypt_blowfish.o"
|
||||||
|
"lib/bcrypt/crypt_gensalt.o"
|
||||||
|
"lib/bcrypt/wrapper.o"
|
||||||
|
"lib/bcrypt/x86.o"
|
||||||
|
)
|
||||||
|
|
||||||
|
cc "${CFLAGS[@]}" -c types.c -o types.o "$@"
|
||||||
|
cc "${CFLAGS[@]}" "${LDFLAGS[@]}" "types.o" mpw-bench.c -o mpw-bench "$@"
|
||||||
|
echo "done! Now use ./mpw-bench"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### TARGETS
|
||||||
|
|
||||||
|
cc() {
|
||||||
|
if hash llvm-gcc 2>/dev/null; then
|
||||||
|
llvm-gcc "$@"
|
||||||
|
elif hash gcc 2>/dev/null; then
|
||||||
|
gcc -std=gnu99 "$@"
|
||||||
|
elif hash clang 2>/dev/null; then
|
||||||
|
clang "$@"
|
||||||
|
else
|
||||||
|
echo >&2 "Need a compiler. Please install GCC or LLVM."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Will build targets: ${targets[*]}..."
|
||||||
|
for target in "${targets[@]}"; do
|
||||||
|
"$target" "$@"
|
||||||
|
done
|
||||||
|
|||||||
20
MasterPassword/C/distribute
Executable file
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
cd "${BASH_SOURCE%/*}"
|
||||||
|
tag=$(git describe)
|
||||||
|
commit=$(git describe --long --dirty)
|
||||||
|
[[ $tag && $commit = $tag-* ]] || exit 1
|
||||||
|
git show --show-signature --pretty=format:%H --quiet "$tag" > VERSION
|
||||||
|
|
||||||
|
mpwArchive=mpw-$commit.tar.gz
|
||||||
|
[[ -e $mpwArchive ]] && echo "WARNING: $mpwArchive already exists. Will overwrite."
|
||||||
|
read -n1 -p "Will prepare and release $mpwArchive. Press a key to continue or ^C to abort."
|
||||||
|
|
||||||
|
git ls-files -z . | xargs -0 tar -cvzf "$mpwArchive"
|
||||||
|
echo "$mpwArchive ready, SHA256: $(openssl sha -sha256 < "$mpwArchive")"
|
||||||
|
|
||||||
|
cd ../../Site/current
|
||||||
|
ln -sf "../../MasterPassword/C/$mpwArchive"
|
||||||
|
[[ -e $_ ]]
|
||||||
|
echo "Linked from site, please update your hyperlinks to point to http://masterpasswordapp.com/$mpwArchive"
|
||||||
3
MasterPassword/C/lib/bcrypt/.source
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
home=http://www.openwall.com/crypt/
|
||||||
|
pkg=http://www.openwall.com/crypt/crypt_blowfish-1.3.tar.gz
|
||||||
|
pkg_sha256=83fa01fca6996fe8d882b7f8e9ba0305a5664936100b01481ea3c6a8ce8d72fd
|
||||||
@@ -1 +1,4 @@
|
|||||||
https://code.google.com/p/scrypt/
|
home=https://code.google.com/p/scrypt/
|
||||||
|
svn=http://scrypt.googlecode.com/svn
|
||||||
|
pkg=http://masterpasswordapp.com/libscrypt-b12b554.tar.gz
|
||||||
|
pkg_sha256=c726daec68a345e420896f005394a948dc5a6924713ed94b684c856d4c247f0b
|
||||||
|
|||||||
187
MasterPassword/C/mpw-bench.c
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
#include <sys/time.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <alg/sha256.h>
|
||||||
|
#include <crypto/crypto_scrypt.h>
|
||||||
|
#include <ow-crypt.h>
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
#define MP_N 32768
|
||||||
|
#define MP_r 8
|
||||||
|
#define MP_p 2
|
||||||
|
#define MP_dkLen 64
|
||||||
|
#define MP_hash PearlHashSHA256
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char *const argv[]) {
|
||||||
|
|
||||||
|
char *userName = "Robert Lee Mitchel";
|
||||||
|
char *masterPassword = "banana colored duckling";
|
||||||
|
char *siteName = "masterpasswordapp.com";
|
||||||
|
uint32_t siteCounter = 1;
|
||||||
|
MPElementType siteType = MPElementTypeGeneratedLong;
|
||||||
|
|
||||||
|
// Start MP
|
||||||
|
struct timeval startTime;
|
||||||
|
if (gettimeofday(&startTime, NULL) != 0) {
|
||||||
|
fprintf(stderr, "Could not get time: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int iterations = 100;
|
||||||
|
for (int i = 0; i < iterations; ++i) {
|
||||||
|
// Calculate the master key salt.
|
||||||
|
char *mpNameSpace = "com.lyndir.masterpassword";
|
||||||
|
const uint32_t n_userNameLength = htonl(strlen(userName));
|
||||||
|
const size_t masterKeySaltLength = strlen(mpNameSpace) + sizeof(n_userNameLength) + strlen(userName);
|
||||||
|
char *masterKeySalt = malloc( masterKeySaltLength );
|
||||||
|
if (!masterKeySalt) {
|
||||||
|
fprintf(stderr, "Could not allocate master key salt: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *mKS = masterKeySalt;
|
||||||
|
memcpy(mKS, mpNameSpace, strlen(mpNameSpace)); mKS += strlen(mpNameSpace);
|
||||||
|
memcpy(mKS, &n_userNameLength, sizeof(n_userNameLength)); mKS += sizeof(n_userNameLength);
|
||||||
|
memcpy(mKS, userName, strlen(userName)); mKS += strlen(userName);
|
||||||
|
if (mKS - masterKeySalt != masterKeySaltLength)
|
||||||
|
abort();
|
||||||
|
trc("masterKeySalt ID: %s\n", IDForBuf(masterKeySalt, masterKeySaltLength));
|
||||||
|
|
||||||
|
// Calculate the master key.
|
||||||
|
uint8_t *masterKey = malloc( MP_dkLen );
|
||||||
|
if (!masterKey) {
|
||||||
|
fprintf(stderr, "Could not allocate master key: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (crypto_scrypt( (const uint8_t *)masterPassword, strlen(masterPassword), (const uint8_t *)masterKeySalt, masterKeySaltLength, MP_N, MP_r, MP_p, masterKey, MP_dkLen ) < 0) {
|
||||||
|
fprintf(stderr, "Could not generate master key: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
memset(masterKeySalt, 0, masterKeySaltLength);
|
||||||
|
free(masterKeySalt);
|
||||||
|
|
||||||
|
// Calculate the site seed.
|
||||||
|
const uint32_t n_siteNameLength = htonl(strlen(siteName));
|
||||||
|
const uint32_t n_siteCounter = htonl(siteCounter);
|
||||||
|
const size_t sitePasswordInfoLength = strlen(mpNameSpace) + sizeof(n_siteNameLength) + strlen(siteName) + sizeof(n_siteCounter);
|
||||||
|
char *sitePasswordInfo = malloc( sitePasswordInfoLength );
|
||||||
|
if (!sitePasswordInfo) {
|
||||||
|
fprintf(stderr, "Could not allocate site seed: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *sPI = sitePasswordInfo;
|
||||||
|
memcpy(sPI, mpNameSpace, strlen(mpNameSpace)); sPI += strlen(mpNameSpace);
|
||||||
|
memcpy(sPI, &n_siteNameLength, sizeof(n_siteNameLength)); sPI += sizeof(n_siteNameLength);
|
||||||
|
memcpy(sPI, siteName, strlen(siteName)); sPI += strlen(siteName);
|
||||||
|
memcpy(sPI, &n_siteCounter, sizeof(n_siteCounter)); sPI += sizeof(n_siteCounter);
|
||||||
|
if (sPI - sitePasswordInfo != sitePasswordInfoLength)
|
||||||
|
abort();
|
||||||
|
|
||||||
|
uint8_t sitePasswordSeed[32];
|
||||||
|
HMAC_SHA256_Buf(masterKey, MP_dkLen, sitePasswordInfo, sitePasswordInfoLength, sitePasswordSeed);
|
||||||
|
memset(masterKey, 0, MP_dkLen);
|
||||||
|
memset(sitePasswordInfo, 0, sitePasswordInfoLength);
|
||||||
|
free(masterKey);
|
||||||
|
free(sitePasswordInfo);
|
||||||
|
|
||||||
|
// Determine the cipher.
|
||||||
|
const char *cipher = CipherForType(siteType, sitePasswordSeed[0]);
|
||||||
|
trc("type %d, cipher: %s\n", siteType, cipher);
|
||||||
|
if (strlen(cipher) > 32)
|
||||||
|
abort();
|
||||||
|
|
||||||
|
// Encode the password from the seed using the cipher.
|
||||||
|
char *sitePassword = calloc(strlen(cipher) + 1, sizeof(char));
|
||||||
|
for (int c = 0; c < strlen(cipher); ++c) {
|
||||||
|
sitePassword[c] = CharacterFromClass(cipher[c], sitePasswordSeed[c + 1]);
|
||||||
|
trc("class %c, character: %c\n", cipher[c], sitePassword[c]);
|
||||||
|
}
|
||||||
|
memset(sitePasswordSeed, 0, sizeof(sitePasswordSeed));
|
||||||
|
|
||||||
|
if (i % 1 == 0)
|
||||||
|
fprintf( stderr, "\rmpw: iteration %d / %d..", i, iterations );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output timing results.
|
||||||
|
struct timeval endTime;
|
||||||
|
if (gettimeofday(&endTime, NULL) != 0) {
|
||||||
|
fprintf(stderr, "Could not get time: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
long long secs = (endTime.tv_sec - startTime.tv_sec);
|
||||||
|
long long usecs = (endTime.tv_usec - startTime.tv_usec);
|
||||||
|
double elapsed = secs + usecs / 1000000.0;
|
||||||
|
double mpwSpeed = iterations / elapsed;
|
||||||
|
fprintf( stdout, " done. %d iterations in %llds %lldµs -> %.2f/s\n", iterations, secs, usecs, mpwSpeed );
|
||||||
|
|
||||||
|
// Start SHA-256
|
||||||
|
if (gettimeofday(&startTime, NULL) != 0) {
|
||||||
|
fprintf(stderr, "Could not get time: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
iterations = 50000000;
|
||||||
|
uint8_t hash[32];
|
||||||
|
for (int i = 0; i < iterations; ++i) {
|
||||||
|
SHA256_Buf(masterPassword, strlen(masterPassword), hash);
|
||||||
|
|
||||||
|
if (i % 1000 == 0)
|
||||||
|
fprintf( stderr, "\rsha256: iteration %d / %d..", i, iterations );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output timing results.
|
||||||
|
if (gettimeofday(&endTime, NULL) != 0) {
|
||||||
|
fprintf(stderr, "Could not get time: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
secs = (endTime.tv_sec - startTime.tv_sec);
|
||||||
|
usecs = (endTime.tv_usec - startTime.tv_usec);
|
||||||
|
elapsed = secs + usecs / 1000000.0;
|
||||||
|
double sha256Speed = iterations / elapsed;
|
||||||
|
fprintf( stdout, " done. %d iterations in %llds %lldµs -> %.2f/s\n", iterations, secs, usecs, sha256Speed );
|
||||||
|
|
||||||
|
// Start BCrypt
|
||||||
|
if (gettimeofday(&startTime, NULL) != 0) {
|
||||||
|
fprintf(stderr, "Could not get time: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bcrypt_cost = 9;
|
||||||
|
iterations = 600;
|
||||||
|
for (int i = 0; i < iterations; ++i) {
|
||||||
|
crypt(masterPassword, crypt_gensalt("$2b$", bcrypt_cost, userName, strlen(userName)));
|
||||||
|
|
||||||
|
if (i % 10 == 0)
|
||||||
|
fprintf( stderr, "\rbcrypt (cost %d): iteration %d / %d..", bcrypt_cost, i, iterations );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Output timing results.
|
||||||
|
if (gettimeofday(&endTime, NULL) != 0) {
|
||||||
|
fprintf(stderr, "Could not get time: %d\n", errno);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
secs = (endTime.tv_sec - startTime.tv_sec);
|
||||||
|
usecs = (endTime.tv_usec - startTime.tv_usec);
|
||||||
|
elapsed = secs + usecs / 1000000.0;
|
||||||
|
double bcrypt9Speed = iterations / elapsed;
|
||||||
|
fprintf( stdout, " done. %d iterations in %llds %lldµs -> %.2f/s\n", iterations, secs, usecs, bcrypt9Speed );
|
||||||
|
|
||||||
|
// Summarize.
|
||||||
|
fprintf( stdout, "\n== SUMMARY ==\nOn this machine,\n" );
|
||||||
|
fprintf( stdout, "mpw is %f times slower than sha256\n", sha256Speed / mpwSpeed );
|
||||||
|
fprintf( stdout, "mpw is %f times slower than bcrypt (cost 9)\n", bcrypt9Speed / mpwSpeed );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#define _WITH_GETLINE
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@@ -23,6 +24,12 @@
|
|||||||
#include <crypto/crypto_scrypt.h>
|
#include <crypto/crypto_scrypt.h>
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
|
|
||||||
|
#if defined(READLINE)
|
||||||
|
#include <readline/readline.h>
|
||||||
|
#elif defined(EDITLINE)
|
||||||
|
#include <histedit.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MP_N 32768
|
#define MP_N 32768
|
||||||
#define MP_r 8
|
#define MP_r 8
|
||||||
#define MP_p 2
|
#define MP_p 2
|
||||||
@@ -52,7 +59,14 @@ void usage() {
|
|||||||
fprintf(stderr, " -v variant The kind of content to generate.\n"
|
fprintf(stderr, " -v variant The kind of content to generate.\n"
|
||||||
" Defaults to 'password'.\n"
|
" Defaults to 'password'.\n"
|
||||||
" p, password | The password to log in with.\n"
|
" p, password | The password to log in with.\n"
|
||||||
" l, login | The username to log in as.\n\n");
|
" l, login | The username to log in as.\n"
|
||||||
|
" a, answer | The answer to a security question.\n\n");
|
||||||
|
fprintf(stderr, " -C context A variant-specific context.\n"
|
||||||
|
" Defaults to empty.\n"
|
||||||
|
" -v p, password | Doesn't currently use a context.\n"
|
||||||
|
" -v l, login | Doesn't currently use a context.\n"
|
||||||
|
" -v a, answer | Empty for a universal site answer or\n"
|
||||||
|
" | the most significant word(s) of the question.\n\n");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,27 +108,30 @@ int main(int argc, char *const argv[]) {
|
|||||||
const char *siteTypeString = getenv( MP_env_sitetype );
|
const char *siteTypeString = getenv( MP_env_sitetype );
|
||||||
MPElementVariant siteVariant = MPElementVariantPassword;
|
MPElementVariant siteVariant = MPElementVariantPassword;
|
||||||
const char *siteVariantString = NULL;
|
const char *siteVariantString = NULL;
|
||||||
|
const char *siteContextString = NULL;
|
||||||
uint32_t siteCounter = 1;
|
uint32_t siteCounter = 1;
|
||||||
const char *siteCounterString = getenv( MP_env_sitecounter );
|
const char *siteCounterString = getenv( MP_env_sitecounter );
|
||||||
|
|
||||||
// Read the options.
|
// Read the options.
|
||||||
char opt;
|
for (int opt; (opt = getopt(argc, argv, "u:t:c:v:C:h")) != -1;)
|
||||||
while ((opt = getopt(argc, argv, "u:t:c:v:h")) != -1)
|
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'h':
|
|
||||||
usage();
|
|
||||||
break;
|
|
||||||
case 'u':
|
case 'u':
|
||||||
userName = optarg;
|
userName = optarg;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
siteTypeString = optarg;
|
siteTypeString = optarg;
|
||||||
break;
|
break;
|
||||||
|
case 'c':
|
||||||
|
siteCounterString = optarg;
|
||||||
|
break;
|
||||||
case 'v':
|
case 'v':
|
||||||
siteVariantString = optarg;
|
siteVariantString = optarg;
|
||||||
break;
|
break;
|
||||||
case 'c':
|
case 'C':
|
||||||
siteCounterString = optarg;
|
siteContextString = optarg;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
usage();
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
switch (optopt) {
|
switch (optopt) {
|
||||||
@@ -160,6 +177,8 @@ int main(int argc, char *const argv[]) {
|
|||||||
trc("siteVariant: %d (%s)\n", siteVariant, siteVariantString);
|
trc("siteVariant: %d (%s)\n", siteVariant, siteVariantString);
|
||||||
if (siteVariant == MPElementVariantLogin)
|
if (siteVariant == MPElementVariantLogin)
|
||||||
siteType = MPElementTypeGeneratedName;
|
siteType = MPElementTypeGeneratedName;
|
||||||
|
if (siteVariant == MPElementVariantAnswer)
|
||||||
|
siteType = MPElementTypeGeneratedPhrase;
|
||||||
if (siteTypeString)
|
if (siteTypeString)
|
||||||
siteType = TypeWithName( siteTypeString );
|
siteType = TypeWithName( siteTypeString );
|
||||||
trc("siteType: %d (%s)\n", siteType, siteTypeString);
|
trc("siteType: %d (%s)\n", siteType, siteTypeString);
|
||||||
@@ -172,31 +191,27 @@ int main(int argc, char *const argv[]) {
|
|||||||
}
|
}
|
||||||
trc("mpwConfigPath: %s\n", mpwConfigPath);
|
trc("mpwConfigPath: %s\n", mpwConfigPath);
|
||||||
FILE *mpwConfig = fopen(mpwConfigPath, "r");
|
FILE *mpwConfig = fopen(mpwConfigPath, "r");
|
||||||
if (!mpwConfig) {
|
|
||||||
fprintf(stderr, "Couldn't open configuration file: %s: %d\n", mpwConfigPath, errno);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
free(mpwConfigPath);
|
free(mpwConfigPath);
|
||||||
char *line = NULL;
|
if (mpwConfig) {
|
||||||
size_t linecap = 0;
|
char *line = NULL;
|
||||||
ssize_t linelen;
|
size_t linecap = 0;
|
||||||
while ((linelen = getline(&line, &linecap, mpwConfig)) > 0)
|
ssize_t linelen;
|
||||||
if (strcmp(strsep(&line, ":"), userName) == 0) {
|
while ((linelen = getline(&line, &linecap, mpwConfig)) > 0)
|
||||||
masterPassword = strsep(&line, "\n");
|
if (strcmp(strsep(&line, ":"), userName) == 0) {
|
||||||
break;
|
masterPassword = strsep(&line, "\n");
|
||||||
}
|
break;
|
||||||
if (!masterPassword) {
|
}
|
||||||
fprintf(stderr, "Missing master password for user: %s\n", userName);
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
while (!masterPassword)
|
||||||
|
masterPassword = getpass( "Your master password: " );
|
||||||
trc("masterPassword: %s\n", masterPassword);
|
trc("masterPassword: %s\n", masterPassword);
|
||||||
|
|
||||||
// Calculate the master key salt.
|
// Calculate the master key salt.
|
||||||
const char *mpKeyScope = ScopeForVariant(MPElementVariantPassword);
|
const char *mpKeyScope = ScopeForVariant(MPElementVariantPassword);
|
||||||
trc("key scope: %s\n", mpKeyScope);
|
trc("key scope: %s\n", mpKeyScope);
|
||||||
const uint32_t n_userNameLength = htonl(strlen(userName));
|
const uint32_t n_userNameLength = htonl(strlen(userName));
|
||||||
size_t masterKeySaltLength = strlen(mpKeyScope) + sizeof(n_userNameLength) + strlen(userName);
|
const size_t masterKeySaltLength = strlen(mpKeyScope) + sizeof(n_userNameLength) + strlen(userName);
|
||||||
char *masterKeySalt = malloc( masterKeySaltLength );
|
char *masterKeySalt = (char *)malloc( masterKeySaltLength );
|
||||||
if (!masterKeySalt) {
|
if (!masterKeySalt) {
|
||||||
fprintf(stderr, "Could not allocate master key salt: %d\n", errno);
|
fprintf(stderr, "Could not allocate master key salt: %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -211,7 +226,7 @@ int main(int argc, char *const argv[]) {
|
|||||||
trc("masterKeySalt ID: %s\n", IDForBuf(masterKeySalt, masterKeySaltLength));
|
trc("masterKeySalt ID: %s\n", IDForBuf(masterKeySalt, masterKeySaltLength));
|
||||||
|
|
||||||
// Calculate the master key.
|
// Calculate the master key.
|
||||||
uint8_t *masterKey = malloc( MP_dkLen );
|
uint8_t *masterKey = (uint8_t *)malloc( MP_dkLen );
|
||||||
if (!masterKey) {
|
if (!masterKey) {
|
||||||
fprintf(stderr, "Could not allocate master key: %d\n", errno);
|
fprintf(stderr, "Could not allocate master key: %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -228,11 +243,14 @@ int main(int argc, char *const argv[]) {
|
|||||||
|
|
||||||
// Calculate the site seed.
|
// Calculate the site seed.
|
||||||
const char *mpSiteScope = ScopeForVariant(siteVariant);
|
const char *mpSiteScope = ScopeForVariant(siteVariant);
|
||||||
trc("site scope: %s\n", mpSiteScope);
|
trc("site scope: %s, context: %s\n", mpSiteScope, siteContextString == NULL? "<empty>": siteContextString);
|
||||||
const uint32_t n_siteNameLength = htonl(strlen(siteName));
|
const uint32_t n_siteNameLength = htonl(strlen(siteName));
|
||||||
const uint32_t n_siteCounter = htonl(siteCounter);
|
const uint32_t n_siteCounter = htonl(siteCounter);
|
||||||
|
const uint32_t n_siteContextLength = siteContextString == NULL? 0: htonl(strlen(siteContextString));
|
||||||
size_t sitePasswordInfoLength = strlen(mpSiteScope) + sizeof(n_siteNameLength) + strlen(siteName) + sizeof(n_siteCounter);
|
size_t sitePasswordInfoLength = strlen(mpSiteScope) + sizeof(n_siteNameLength) + strlen(siteName) + sizeof(n_siteCounter);
|
||||||
char *sitePasswordInfo = malloc( sitePasswordInfoLength );
|
if (siteContextString)
|
||||||
|
sitePasswordInfoLength += sizeof(n_siteContextLength) + strlen(siteContextString);
|
||||||
|
char *sitePasswordInfo = (char *)malloc( sitePasswordInfoLength );
|
||||||
if (!sitePasswordInfo) {
|
if (!sitePasswordInfo) {
|
||||||
fprintf(stderr, "Could not allocate site seed: %d\n", errno);
|
fprintf(stderr, "Could not allocate site seed: %d\n", errno);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -243,9 +261,13 @@ int main(int argc, char *const argv[]) {
|
|||||||
memcpy(sPI, &n_siteNameLength, sizeof(n_siteNameLength)); sPI += sizeof(n_siteNameLength);
|
memcpy(sPI, &n_siteNameLength, sizeof(n_siteNameLength)); sPI += sizeof(n_siteNameLength);
|
||||||
memcpy(sPI, siteName, strlen(siteName)); sPI += strlen(siteName);
|
memcpy(sPI, siteName, strlen(siteName)); sPI += strlen(siteName);
|
||||||
memcpy(sPI, &n_siteCounter, sizeof(n_siteCounter)); sPI += sizeof(n_siteCounter);
|
memcpy(sPI, &n_siteCounter, sizeof(n_siteCounter)); sPI += sizeof(n_siteCounter);
|
||||||
|
if (siteContextString) {
|
||||||
|
memcpy(sPI, &n_siteContextLength, sizeof(n_siteContextLength)); sPI += sizeof(n_siteContextLength);
|
||||||
|
memcpy(sPI, siteContextString, strlen(siteContextString)); sPI += strlen(siteContextString);
|
||||||
|
}
|
||||||
if (sPI - sitePasswordInfo != sitePasswordInfoLength)
|
if (sPI - sitePasswordInfo != sitePasswordInfoLength)
|
||||||
abort();
|
abort();
|
||||||
trc("seed from: hmac-sha256(masterKey, %s | %s | %s | %s)\n", mpSiteScope, Hex(&n_siteNameLength, sizeof(n_siteNameLength)), siteName, Hex(&n_siteCounter, sizeof(n_siteCounter)));
|
trc("seed from: hmac-sha256(masterKey, %s | %s | %s | %s | %s | %s)\n", mpSiteScope, Hex(&n_siteNameLength, sizeof(n_siteNameLength)), siteName, Hex(&n_siteCounter, sizeof(n_siteCounter)), Hex(&n_siteContextLength, sizeof(n_siteContextLength)), siteContextString);
|
||||||
trc("sitePasswordInfo ID: %s\n", IDForBuf(sitePasswordInfo, sitePasswordInfoLength));
|
trc("sitePasswordInfo ID: %s\n", IDForBuf(sitePasswordInfo, sitePasswordInfoLength));
|
||||||
|
|
||||||
uint8_t sitePasswordSeed[32];
|
uint8_t sitePasswordSeed[32];
|
||||||
@@ -263,7 +285,7 @@ int main(int argc, char *const argv[]) {
|
|||||||
abort();
|
abort();
|
||||||
|
|
||||||
// Encode the password from the seed using the cipher.
|
// Encode the password from the seed using the cipher.
|
||||||
char *sitePassword = calloc(strlen(cipher) + 1, sizeof(char));
|
char *sitePassword = (char *)calloc(strlen(cipher) + 1, sizeof(char));
|
||||||
for (int c = 0; c < strlen(cipher); ++c) {
|
for (int c = 0; c < strlen(cipher); ++c) {
|
||||||
sitePassword[c] = CharacterFromClass(cipher[c], sitePasswordSeed[c + 1]);
|
sitePassword[c] = CharacterFromClass(cipher[c], sitePasswordSeed[c + 1]);
|
||||||
trc("class %c, character: %c\n", cipher[c], sitePassword[c]);
|
trc("class %c, character: %c\n", cipher[c], sitePassword[c]);
|
||||||
|
|||||||
@@ -50,19 +50,19 @@ const char *CipherForType(MPElementType type, uint8_t seedByte) {
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MPElementTypeGeneratedMaximum: {
|
case MPElementTypeGeneratedMaximum: {
|
||||||
char *ciphers[] = { "anoxxxxxxxxxxxxxxxxx", "axxxxxxxxxxxxxxxxxno" };
|
const char *ciphers[] = { "anoxxxxxxxxxxxxxxxxx", "axxxxxxxxxxxxxxxxxno" };
|
||||||
return ciphers[seedByte % 2];
|
return ciphers[seedByte % 2];
|
||||||
}
|
}
|
||||||
case MPElementTypeGeneratedLong: {
|
case MPElementTypeGeneratedLong: {
|
||||||
char *ciphers[] = { "CvcvnoCvcvCvcv", "CvcvCvcvnoCvcv", "CvcvCvcvCvcvno", "CvccnoCvcvCvcv", "CvccCvcvnoCvcv", "CvccCvcvCvcvno", "CvcvnoCvccCvcv", "CvcvCvccnoCvcv", "CvcvCvccCvcvno", "CvcvnoCvcvCvcc", "CvcvCvcvnoCvcc", "CvcvCvcvCvccno", "CvccnoCvccCvcv", "CvccCvccnoCvcv", "CvccCvccCvcvno", "CvcvnoCvccCvcc", "CvcvCvccnoCvcc", "CvcvCvccCvccno", "CvccnoCvcvCvcc", "CvccCvcvnoCvcc", "CvccCvcvCvccno" };
|
const char *ciphers[] = { "CvcvnoCvcvCvcv", "CvcvCvcvnoCvcv", "CvcvCvcvCvcvno", "CvccnoCvcvCvcv", "CvccCvcvnoCvcv", "CvccCvcvCvcvno", "CvcvnoCvccCvcv", "CvcvCvccnoCvcv", "CvcvCvccCvcvno", "CvcvnoCvcvCvcc", "CvcvCvcvnoCvcc", "CvcvCvcvCvccno", "CvccnoCvccCvcv", "CvccCvccnoCvcv", "CvccCvccCvcvno", "CvcvnoCvccCvcc", "CvcvCvccnoCvcc", "CvcvCvccCvccno", "CvccnoCvcvCvcc", "CvccCvcvnoCvcc", "CvccCvcvCvccno" };
|
||||||
return ciphers[seedByte % 21];
|
return ciphers[seedByte % 21];
|
||||||
}
|
}
|
||||||
case MPElementTypeGeneratedMedium: {
|
case MPElementTypeGeneratedMedium: {
|
||||||
char *ciphers[] = { "CvcnoCvc", "CvcCvcno" };
|
const char *ciphers[] = { "CvcnoCvc", "CvcCvcno" };
|
||||||
return ciphers[seedByte % 2];
|
return ciphers[seedByte % 2];
|
||||||
}
|
}
|
||||||
case MPElementTypeGeneratedBasic: {
|
case MPElementTypeGeneratedBasic: {
|
||||||
char *ciphers[] = { "aaanaaan", "aannaaan", "aaannaaa" };
|
const char *ciphers[] = { "aaanaaan", "aannaaan", "aaannaaa" };
|
||||||
return ciphers[seedByte % 3];
|
return ciphers[seedByte % 3];
|
||||||
}
|
}
|
||||||
case MPElementTypeGeneratedShort: {
|
case MPElementTypeGeneratedShort: {
|
||||||
@@ -75,7 +75,7 @@ const char *CipherForType(MPElementType type, uint8_t seedByte) {
|
|||||||
return "cvccvcvcv";
|
return "cvccvcvcv";
|
||||||
}
|
}
|
||||||
case MPElementTypeGeneratedPhrase: {
|
case MPElementTypeGeneratedPhrase: {
|
||||||
char *ciphers[] = { "cvcc cvc cvccvcv cvc", "cvc cvccvcvcv cvcv", "cv cvccv cvc cvcvccv" };
|
const char *ciphers[] = { "cvcc cvc cvccvcv cvc", "cvc cvccvcvcv cvcv", "cv cvccv cvc cvcvccv" };
|
||||||
return ciphers[seedByte % 3];
|
return ciphers[seedByte % 3];
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
@@ -95,6 +95,8 @@ const MPElementVariant VariantWithName(const char *variantName) {
|
|||||||
return MPElementVariantPassword;
|
return MPElementVariantPassword;
|
||||||
if (0 == strcmp(lowerVariantName, "l") || 0 == strcmp(lowerVariantName, "login"))
|
if (0 == strcmp(lowerVariantName, "l") || 0 == strcmp(lowerVariantName, "login"))
|
||||||
return MPElementVariantLogin;
|
return MPElementVariantLogin;
|
||||||
|
if (0 == strcmp(lowerVariantName, "a") || 0 == strcmp(lowerVariantName, "answer"))
|
||||||
|
return MPElementVariantAnswer;
|
||||||
|
|
||||||
fprintf(stderr, "Not a variant name: %s", lowerVariantName);
|
fprintf(stderr, "Not a variant name: %s", lowerVariantName);
|
||||||
abort();
|
abort();
|
||||||
@@ -108,6 +110,9 @@ const char *ScopeForVariant(MPElementVariant variant) {
|
|||||||
case MPElementVariantLogin: {
|
case MPElementVariantLogin: {
|
||||||
return "com.lyndir.masterpassword.login";
|
return "com.lyndir.masterpassword.login";
|
||||||
}
|
}
|
||||||
|
case MPElementVariantAnswer: {
|
||||||
|
return "com.lyndir.masterpassword.answer";
|
||||||
|
}
|
||||||
default: {
|
default: {
|
||||||
fprintf(stderr, "Unknown variant: %d", variant);
|
fprintf(stderr, "Unknown variant: %d", variant);
|
||||||
abort();
|
abort();
|
||||||
@@ -170,7 +175,7 @@ const char *IDForBuf(const void *buf, size_t length) {
|
|||||||
uint8_t hash[32];
|
uint8_t hash[32];
|
||||||
SHA256_Buf(buf, length, hash);
|
SHA256_Buf(buf, length, hash);
|
||||||
|
|
||||||
char *id = calloc(65, sizeof(char));
|
char *id = (char *)calloc(65, sizeof(char));
|
||||||
for (int kH = 0; kH < 32; kH++)
|
for (int kH = 0; kH < 32; kH++)
|
||||||
sprintf(&(id[kH * 2]), "%02X", hash[kH]);
|
sprintf(&(id[kH * 2]), "%02X", hash[kH]);
|
||||||
|
|
||||||
@@ -178,7 +183,7 @@ const char *IDForBuf(const void *buf, size_t length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const char *Hex(const void *buf, size_t length) {
|
const char *Hex(const void *buf, size_t length) {
|
||||||
char *id = calloc(length*2+1, sizeof(char));
|
char *id = (char *)calloc(length*2+1, sizeof(char));
|
||||||
for (int kH = 0; kH < length; kH++)
|
for (int kH = 0; kH < length; kH++)
|
||||||
sprintf(&(id[kH * 2]), "%02X", ((const uint8_t*)buf)[kH]);
|
sprintf(&(id[kH * 2]), "%02X", ((const uint8_t*)buf)[kH]);
|
||||||
return id;
|
return id;
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ typedef enum {
|
|||||||
MPElementVariantPassword,
|
MPElementVariantPassword,
|
||||||
/** Generate the login name to log in as. */
|
/** Generate the login name to log in as. */
|
||||||
MPElementVariantLogin,
|
MPElementVariantLogin,
|
||||||
|
/** Generate the answer to a security question. */
|
||||||
|
MPElementVariantAnswer,
|
||||||
} MPElementVariant;
|
} MPElementVariant;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|||||||
@@ -139,9 +139,9 @@ PearlAssociatedObjectProperty( NSMutableArray*, ProductObservers, productObserve
|
|||||||
case SKPaymentTransactionStatePurchased: {
|
case SKPaymentTransactionStatePurchased: {
|
||||||
inf( @"purchased: %@", transaction.payment.productIdentifier );
|
inf( @"purchased: %@", transaction.payment.productIdentifier );
|
||||||
if ([transaction.payment.productIdentifier isEqualToString:MPProductFuel]) {
|
if ([transaction.payment.productIdentifier isEqualToString:MPProductFuel]) {
|
||||||
float currentFuel = [[MPiOSConfig get].developmentFuel floatValue];
|
float currentFuel = [[MPiOSConfig get].developmentFuelRemaining floatValue];
|
||||||
float purchasedFuel = transaction.payment.quantity / MP_FUEL_HOURLY_RATE;
|
float purchasedFuel = transaction.payment.quantity / MP_FUEL_HOURLY_RATE;
|
||||||
[MPiOSConfig get].developmentFuel = @(currentFuel + purchasedFuel);
|
[MPiOSConfig get].developmentFuelRemaining = @(currentFuel + purchasedFuel);
|
||||||
if (![MPiOSConfig get].developmentFuelChecked || !currentFuel)
|
if (![MPiOSConfig get].developmentFuelChecked || !currentFuel)
|
||||||
[MPiOSConfig get].developmentFuelChecked = [NSDate date];
|
[MPiOSConfig get].developmentFuelChecked = [NSDate date];
|
||||||
}
|
}
|
||||||
@@ -169,6 +169,8 @@ PearlAssociatedObjectProperty( NSMutableArray*, ProductObservers, productObserve
|
|||||||
for (id<MPInAppDelegate> productObserver in self.productObservers)
|
for (id<MPInAppDelegate> productObserver in self.productObservers)
|
||||||
[productObserver updateWithTransaction:transaction];
|
[productObserver updateWithTransaction:transaction];
|
||||||
}
|
}
|
||||||
|
if (![[NSUserDefaults standardUserDefaults] synchronize])
|
||||||
|
wrn( @"Couldn't synchronize after transaction updates." );
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
|
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
|
||||||
|
|||||||
@@ -122,10 +122,8 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
|
|||||||
|
|
||||||
// No more methods left, fail if key still not known.
|
// No more methods left, fail if key still not known.
|
||||||
if (!tryKey) {
|
if (!tryKey) {
|
||||||
if (password) {
|
if (password)
|
||||||
inf( @"Login failed for: %@", user.userID );
|
inf( @"Login failed for: %@", user.userID );
|
||||||
MPCheckpoint( MPCheckpointSignInFailed, nil );
|
|
||||||
}
|
|
||||||
|
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
@@ -159,7 +157,6 @@ static NSDictionary *keyQuery(MPUserEntity *user) {
|
|||||||
}];
|
}];
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPSignedInNotification object:self];
|
[[NSNotificationCenter defaultCenter] postNotificationName:MPSignedInNotification object:self];
|
||||||
MPCheckpoint( MPCheckpointSignedIn, nil );
|
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
@property(strong, nonatomic, readonly) MPKey *key;
|
@property(strong, nonatomic, readonly) MPKey *key;
|
||||||
@property(strong, nonatomic, readonly) NSManagedObjectID *activeUserOID;
|
@property(strong, nonatomic, readonly) NSManagedObjectID *activeUserOID;
|
||||||
|
@property(strong, nonatomic, readonly) NSPersistentStoreCoordinator *storeCoordinator;
|
||||||
|
|
||||||
+ (instancetype)get;
|
+ (instancetype)get;
|
||||||
|
|
||||||
|
|||||||
@@ -6,15 +6,16 @@
|
|||||||
// Copyright (c) 2011 Lyndir. All rights reserved.
|
// Copyright (c) 2011 Lyndir. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import <StoreKit/StoreKit.h>
|
|
||||||
#import "MPAppDelegate_Shared.h"
|
#import "MPAppDelegate_Shared.h"
|
||||||
#import "MPAppDelegate_Store.h"
|
#import "MPAppDelegate_Store.h"
|
||||||
#import "MPAppDelegate_Key.h"
|
#import "MPAppDelegate_Key.h"
|
||||||
|
#import "NSManagedObjectModel+KCOrderedAccessorFix.h"
|
||||||
|
|
||||||
@interface MPAppDelegate_Shared ()
|
@interface MPAppDelegate_Shared ()
|
||||||
|
|
||||||
@property(strong, nonatomic) MPKey *key;
|
@property(strong, nonatomic) MPKey *key;
|
||||||
@property(strong, nonatomic) NSManagedObjectID *activeUserOID;
|
@property(strong, nonatomic) NSManagedObjectID *activeUserOID;
|
||||||
|
@property(strong, nonatomic) NSPersistentStoreCoordinator *storeCoordinator;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -31,6 +32,18 @@
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (instancetype)init {
|
||||||
|
|
||||||
|
if (!(self = [super init]))
|
||||||
|
return nil;
|
||||||
|
|
||||||
|
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
|
||||||
|
[model kc_generateOrderedSetAccessors];
|
||||||
|
self.storeCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
- (MPUserEntity *)activeUserForMainThread {
|
- (MPUserEntity *)activeUserForMainThread {
|
||||||
|
|
||||||
return [self activeUserInContext:[MPAppDelegate_Shared managedObjectContextForMainThreadIfReady]];
|
return [self activeUserInContext:[MPAppDelegate_Shared managedObjectContextForMainThreadIfReady]];
|
||||||
|
|||||||
@@ -7,8 +7,6 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "MPAppDelegate_Store.h"
|
#import "MPAppDelegate_Store.h"
|
||||||
#import "MPGeneratedSiteEntity.h"
|
|
||||||
#import "NSManagedObjectModel+KCOrderedAccessorFix.h"
|
|
||||||
|
|
||||||
#if TARGET_OS_IPHONE
|
#if TARGET_OS_IPHONE
|
||||||
#define STORE_OPTIONS NSPersistentStoreFileProtectionKey : NSFileProtectionComplete,
|
#define STORE_OPTIONS NSPersistentStoreFileProtectionKey : NSFileProtectionComplete,
|
||||||
@@ -16,7 +14,7 @@
|
|||||||
#define STORE_OPTIONS
|
#define STORE_OPTIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MPStoreMigrationLevelKey @"MPMigrationLevelLocalStoreKey"
|
#define MPMigrationLevelLocalStoreKey @"MPMigrationLevelLocalStoreKey"
|
||||||
|
|
||||||
typedef NS_ENUM( NSInteger, MPStoreMigrationLevel ) {
|
typedef NS_ENUM( NSInteger, MPStoreMigrationLevel ) {
|
||||||
MPStoreMigrationLevelV1,
|
MPStoreMigrationLevelV1,
|
||||||
@@ -27,9 +25,7 @@ typedef NS_ENUM( NSInteger, MPStoreMigrationLevel ) {
|
|||||||
|
|
||||||
@implementation MPAppDelegate_Shared(Store)
|
@implementation MPAppDelegate_Shared(Store)
|
||||||
|
|
||||||
PearlAssociatedObjectProperty( id, SaveObserver, saveObserver );
|
PearlAssociatedObjectProperty( NSOperationQueue *, StoreQueue, storeQueue );
|
||||||
|
|
||||||
PearlAssociatedObjectProperty( NSPersistentStoreCoordinator*, PersistentStoreCoordinator, persistentStoreCoordinator );
|
|
||||||
|
|
||||||
PearlAssociatedObjectProperty( NSManagedObjectContext*, PrivateManagedObjectContext, privateManagedObjectContext );
|
PearlAssociatedObjectProperty( NSManagedObjectContext*, PrivateManagedObjectContext, privateManagedObjectContext );
|
||||||
|
|
||||||
@@ -56,7 +52,12 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
return NO;
|
return NO;
|
||||||
|
|
||||||
[mainManagedObjectContext performBlock:^{
|
[mainManagedObjectContext performBlock:^{
|
||||||
mocBlock( mainManagedObjectContext );
|
@try {
|
||||||
|
mocBlock( mainManagedObjectContext );
|
||||||
|
}
|
||||||
|
@catch (NSException *exception) {
|
||||||
|
err( @"While performing managed block:\n%@", [exception fullDescription] );
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
@@ -69,7 +70,12 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
return NO;
|
return NO;
|
||||||
|
|
||||||
[mainManagedObjectContext performBlockAndWait:^{
|
[mainManagedObjectContext performBlockAndWait:^{
|
||||||
mocBlock( mainManagedObjectContext );
|
@try {
|
||||||
|
mocBlock( mainManagedObjectContext );
|
||||||
|
}
|
||||||
|
@catch (NSException *exception) {
|
||||||
|
err( @"While performing managed block:\n%@", [exception fullDescription] );
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
@@ -84,7 +90,12 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
||||||
moc.parentContext = privateManagedObjectContextIfReady;
|
moc.parentContext = privateManagedObjectContextIfReady;
|
||||||
[moc performBlock:^{
|
[moc performBlock:^{
|
||||||
mocBlock( moc );
|
@try {
|
||||||
|
mocBlock( moc );
|
||||||
|
}
|
||||||
|
@catch (NSException *exception) {
|
||||||
|
err( @"While performing managed block:\n%@", [exception fullDescription] );
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
@@ -99,7 +110,12 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
||||||
moc.parentContext = privateManagedObjectContextIfReady;
|
moc.parentContext = privateManagedObjectContextIfReady;
|
||||||
[moc performBlockAndWait:^{
|
[moc performBlockAndWait:^{
|
||||||
mocBlock( moc );
|
@try {
|
||||||
|
mocBlock( moc );
|
||||||
|
}
|
||||||
|
@catch (NSException *exception) {
|
||||||
|
err( @"While performing managed block:\n%@", [exception fullDescription] );
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
|
|
||||||
return YES;
|
return YES;
|
||||||
@@ -123,20 +139,28 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
inDomains:NSUserDomainMask] lastObject];
|
inDomains:NSUserDomainMask] lastObject];
|
||||||
return [[[applicationSupportURL
|
return [[[applicationSupportURL
|
||||||
URLByAppendingPathComponent:[NSBundle mainBundle].bundleIdentifier isDirectory:YES]
|
URLByAppendingPathComponent:[NSBundle mainBundle].bundleIdentifier isDirectory:YES]
|
||||||
URLByAppendingPathComponent:@"UbiquityStore" isDirectory:NO]
|
URLByAppendingPathComponent:@"MasterPassword" isDirectory:NO]
|
||||||
URLByAppendingPathExtension:@"sqlite"];
|
URLByAppendingPathExtension:@"sqlite"];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)loadStore {
|
- (void)loadStore {
|
||||||
|
|
||||||
@synchronized (self) {
|
static dispatch_once_t once = 0;
|
||||||
|
dispatch_once( &once, ^{
|
||||||
|
(self.storeQueue = [NSOperationQueue new]).maxConcurrentOperationCount = 1;
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Do nothing if already fully set up, otherwise (re-)load the store.
|
||||||
|
if (self.storeCoordinator && self.mainManagedObjectContext && self.privateManagedObjectContext)
|
||||||
|
return;
|
||||||
|
|
||||||
|
[self.storeQueue addOperationWithBlock:^{
|
||||||
// Do nothing if already fully set up, otherwise (re-)load the store.
|
// Do nothing if already fully set up, otherwise (re-)load the store.
|
||||||
if (self.persistentStoreCoordinator && self.saveObserver && self.mainManagedObjectContext && self.privateManagedObjectContext)
|
if (self.storeCoordinator && self.mainManagedObjectContext && self.privateManagedObjectContext)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Unregister any existing observers and contexts.
|
// Unregister any existing observers and contexts.
|
||||||
if (self.saveObserver)
|
PearlRemoveNotificationObserversFrom( self.mainManagedObjectContext );
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self.saveObserver];
|
|
||||||
[self.mainManagedObjectContext performBlockAndWait:^{
|
[self.mainManagedObjectContext performBlockAndWait:^{
|
||||||
[self.mainManagedObjectContext reset];
|
[self.mainManagedObjectContext reset];
|
||||||
self.mainManagedObjectContext = nil;
|
self.mainManagedObjectContext = nil;
|
||||||
@@ -153,13 +177,31 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
// Check if migration is necessary.
|
// Check if migration is necessary.
|
||||||
[self migrateStore];
|
[self migrateStore];
|
||||||
|
|
||||||
// Create a new store coordinator.
|
// Install managed object contexts and observers.
|
||||||
if (!self.persistentStoreCoordinator) {
|
self.privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
||||||
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
|
[self.privateManagedObjectContext performBlockAndWait:^{
|
||||||
[model kc_generateOrderedSetAccessors];
|
self.privateManagedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
|
||||||
self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
|
self.privateManagedObjectContext.persistentStoreCoordinator = self.storeCoordinator;
|
||||||
}
|
}];
|
||||||
|
|
||||||
|
self.mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
|
||||||
|
self.mainManagedObjectContext.parentContext = self.privateManagedObjectContext;
|
||||||
|
|
||||||
|
// When privateManagedObjectContext is saved, import the changes into mainManagedObjectContext.
|
||||||
|
PearlAddNotificationObserverTo( self.mainManagedObjectContext, NSManagedObjectContextDidSaveNotification,
|
||||||
|
self.privateManagedObjectContext, nil, ^(NSManagedObjectContext *mainManagedObjectContext, NSNotification *note) {
|
||||||
|
[mainManagedObjectContext performBlock:^{
|
||||||
|
@try {
|
||||||
|
[mainManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
|
||||||
|
}
|
||||||
|
@catch (NSException *exception) {
|
||||||
|
err( @"While merging changes:\n%@",[exception fullDescription] );
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
} );
|
||||||
|
|
||||||
|
|
||||||
|
// Create a new store coordinator.
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
NSURL *localStoreURL = [self localStoreURL];
|
NSURL *localStoreURL = [self localStoreURL];
|
||||||
if (![[NSFileManager defaultManager] createDirectoryAtURL:[localStoreURL URLByDeletingLastPathComponent]
|
if (![[NSFileManager defaultManager] createDirectoryAtURL:[localStoreURL URLByDeletingLastPathComponent]
|
||||||
@@ -167,12 +209,12 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
err( @"Couldn't create our application support directory: %@", [error fullDescription] );
|
err( @"Couldn't create our application support directory: %@", [error fullDescription] );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self localStoreURL]
|
if (![self.storeCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self localStoreURL]
|
||||||
options:@{
|
options:@{
|
||||||
NSMigratePersistentStoresAutomaticallyOption : @YES,
|
NSMigratePersistentStoresAutomaticallyOption : @YES,
|
||||||
NSInferMappingModelAutomaticallyOption : @YES,
|
NSInferMappingModelAutomaticallyOption : @YES,
|
||||||
STORE_OPTIONS
|
STORE_OPTIONS
|
||||||
} error:&error]) {
|
} error:&error]) {
|
||||||
err( @"Failed to open store: %@", [error fullDescription] );
|
err( @"Failed to open store: %@", [error fullDescription] );
|
||||||
self.storeCorrupted = @YES;
|
self.storeCorrupted = @YES;
|
||||||
[self handleCoordinatorError:error];
|
[self handleCoordinatorError:error];
|
||||||
@@ -180,25 +222,6 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
}
|
}
|
||||||
self.storeCorrupted = @NO;
|
self.storeCorrupted = @NO;
|
||||||
|
|
||||||
// Create our contexts and observer.
|
|
||||||
self.privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
|
|
||||||
[self.privateManagedObjectContext performBlockAndWait:^{
|
|
||||||
self.privateManagedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy;
|
|
||||||
self.privateManagedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator;
|
|
||||||
}];
|
|
||||||
|
|
||||||
self.mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
|
|
||||||
self.mainManagedObjectContext.parentContext = self.privateManagedObjectContext;
|
|
||||||
|
|
||||||
self.saveObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification
|
|
||||||
object:self.privateManagedObjectContext queue:nil usingBlock:
|
|
||||||
^(NSNotification *note) {
|
|
||||||
// When privateManagedObjectContext is saved, import the changes into mainManagedObjectContext.
|
|
||||||
[self.mainManagedObjectContext performBlock:^{
|
|
||||||
[self.mainManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
|
|
||||||
}];
|
|
||||||
}];
|
|
||||||
|
|
||||||
#if TARGET_OS_IPHONE
|
#if TARGET_OS_IPHONE
|
||||||
PearlAddNotificationObserver( UIApplicationWillTerminateNotification, UIApp, [NSOperationQueue mainQueue],
|
PearlAddNotificationObserver( UIApplicationWillTerminateNotification, UIApp, [NSOperationQueue mainQueue],
|
||||||
^(MPAppDelegate_Shared *self, NSNotification *note) {
|
^(MPAppDelegate_Shared *self, NSNotification *note) {
|
||||||
@@ -220,15 +243,14 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
[MPAppDelegate_Shared managedObjectContextPerformBlockAndWait:^(NSManagedObjectContext *context) {
|
[MPAppDelegate_Shared managedObjectContextPerformBlockAndWait:^(NSManagedObjectContext *context) {
|
||||||
[self findAndFixInconsistenciesSaveInContext:context];
|
[self findAndFixInconsistenciesSaveInContext:context];
|
||||||
}];
|
}];
|
||||||
}
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)deleteAndResetStore {
|
- (void)deleteAndResetStore {
|
||||||
|
|
||||||
@synchronized (self) {
|
@synchronized (self) {
|
||||||
// Unregister any existing observers and contexts.
|
// Unregister any existing observers and contexts.
|
||||||
if (self.saveObserver)
|
PearlRemoveNotificationObserversFrom( self.mainManagedObjectContext );
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self.saveObserver];
|
|
||||||
[self.mainManagedObjectContext performBlockAndWait:^{
|
[self.mainManagedObjectContext performBlockAndWait:^{
|
||||||
[self.mainManagedObjectContext reset];
|
[self.mainManagedObjectContext reset];
|
||||||
self.mainManagedObjectContext = nil;
|
self.mainManagedObjectContext = nil;
|
||||||
@@ -238,11 +260,10 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
self.privateManagedObjectContext = nil;
|
self.privateManagedObjectContext = nil;
|
||||||
}];
|
}];
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
for (NSPersistentStore *store in self.persistentStoreCoordinator.persistentStores) {
|
for (NSPersistentStore *store in self.storeCoordinator.persistentStores) {
|
||||||
if (![self.persistentStoreCoordinator removePersistentStore:store error:&error])
|
if (![self.storeCoordinator removePersistentStore:store error:&error])
|
||||||
err( @"Couldn't remove persistence store from coordinator: %@", [error fullDescription] );
|
err( @"Couldn't remove persistence store from coordinator: %@", [error fullDescription] );
|
||||||
}
|
}
|
||||||
self.persistentStoreCoordinator = nil;
|
|
||||||
if (![[NSFileManager defaultManager] removeItemAtURL:self.localStoreURL error:&error])
|
if (![[NSFileManager defaultManager] removeItemAtURL:self.localStoreURL error:&error])
|
||||||
err( @"Couldn't remove persistence store at URL %@: %@", self.localStoreURL, [error fullDescription] );
|
err( @"Couldn't remove persistence store at URL %@: %@", self.localStoreURL, [error fullDescription] );
|
||||||
|
|
||||||
@@ -287,23 +308,25 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
|
|
||||||
- (void)migrateStore {
|
- (void)migrateStore {
|
||||||
|
|
||||||
MPStoreMigrationLevel migrationLevel = (signed)[[NSUserDefaults standardUserDefaults] integerForKey:MPStoreMigrationLevelKey];
|
MPStoreMigrationLevel migrationLevel = (signed)[[NSUserDefaults standardUserDefaults] integerForKey:MPMigrationLevelLocalStoreKey];
|
||||||
if (migrationLevel >= MPStoreMigrationLevelCurrent)
|
if (migrationLevel >= MPStoreMigrationLevelCurrent)
|
||||||
// Local store up-to-date.
|
// Local store up-to-date.
|
||||||
return;
|
return;
|
||||||
|
|
||||||
inf( @"Local store migration level: %d (current %d)", (signed)migrationLevel, (signed)MPStoreMigrationLevelCurrent );
|
inf( @"Local store migration level: %d (current %d)", (signed)migrationLevel, (signed)MPStoreMigrationLevelCurrent );
|
||||||
if (migrationLevel == MPStoreMigrationLevelV1 && ![self migrateV1LocalStore]) {
|
if (migrationLevel <= MPStoreMigrationLevelV1 && ![self migrateV1LocalStore]) {
|
||||||
inf( @"Failed to migrate old V1 to new local store." );
|
inf( @"Failed to migrate old V1 to new local store." );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (migrationLevel == MPStoreMigrationLevelV2 && ![self migrateV2LocalStore]) {
|
if (migrationLevel <= MPStoreMigrationLevelV2 && ![self migrateV2LocalStore]) {
|
||||||
inf( @"Failed to migrate old V2 to new local store." );
|
inf( @"Failed to migrate old V2 to new local store." );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[NSUserDefaults standardUserDefaults] setInteger:MPStoreMigrationLevelCurrent forKey:MPStoreMigrationLevelKey];
|
[[NSUserDefaults standardUserDefaults] setInteger:MPStoreMigrationLevelCurrent forKey:MPMigrationLevelLocalStoreKey];
|
||||||
inf( @"Successfully migrated old to new local store." );
|
inf( @"Successfully migrated old to new local store." );
|
||||||
|
if (![[NSUserDefaults standardUserDefaults] synchronize])
|
||||||
|
wrn( @"Couldn't synchronize after store migration." );
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)migrateV1LocalStore {
|
- (BOOL)migrateV1LocalStore {
|
||||||
@@ -319,14 +342,16 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
|
|
||||||
inf( @"Migrating V1 local store" );
|
inf( @"Migrating V1 local store" );
|
||||||
NSURL *newLocalStoreURL = [self localStoreURL];
|
NSURL *newLocalStoreURL = [self localStoreURL];
|
||||||
NSError *error = nil;
|
if (![[NSFileManager defaultManager] fileExistsAtPath:newLocalStoreURL.path isDirectory:NULL]) {
|
||||||
if (![[NSFileManager defaultManager] createDirectoryAtURL:[newLocalStoreURL URLByDeletingLastPathComponent]
|
inf( @"New local store already exists." );
|
||||||
withIntermediateDirectories:YES attributes:nil error:&error]) {
|
return YES;
|
||||||
err( @"Couldn't create our application support directory: %@", [error fullDescription] );
|
|
||||||
return NO;
|
|
||||||
}
|
}
|
||||||
if (![[NSFileManager defaultManager] moveItemAtURL:oldLocalStoreURL toURL:newLocalStoreURL error:&error]) {
|
|
||||||
err( @"Couldn't move the old store to the new location: %@", [error fullDescription] );
|
NSError *error = nil;
|
||||||
|
if (![NSPersistentStore migrateStore:oldLocalStoreURL withOptions:@{ STORE_OPTIONS }
|
||||||
|
toStore:newLocalStoreURL withOptions:@{ STORE_OPTIONS }
|
||||||
|
model:nil error:&error]) {
|
||||||
|
err( @"Couldn't migrate the old store to the new location: %@", [error fullDescription] );
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,14 +383,22 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
|
|
||||||
inf( @"Migrating V2 local store" );
|
inf( @"Migrating V2 local store" );
|
||||||
NSURL *newLocalStoreURL = [self localStoreURL];
|
NSURL *newLocalStoreURL = [self localStoreURL];
|
||||||
NSError *error = nil;
|
if ([[NSFileManager defaultManager] fileExistsAtPath:newLocalStoreURL.path isDirectory:NULL]) {
|
||||||
if (![[NSFileManager defaultManager] createDirectoryAtURL:[newLocalStoreURL URLByDeletingLastPathComponent]
|
inf( @"New local store already exists." );
|
||||||
withIntermediateDirectories:YES attributes:nil error:&error]) {
|
return YES;
|
||||||
err( @"Couldn't create our application support directory: %@", [error fullDescription] );
|
|
||||||
return NO;
|
|
||||||
}
|
}
|
||||||
if (![[NSFileManager defaultManager] moveItemAtURL:oldLocalStoreURL toURL:newLocalStoreURL error:&error]) {
|
|
||||||
err( @"Couldn't move the old store to the new location: %@", [error fullDescription] );
|
NSError *error = nil;
|
||||||
|
if (![NSPersistentStore migrateStore:oldLocalStoreURL withOptions:@{
|
||||||
|
NSMigratePersistentStoresAutomaticallyOption : @YES,
|
||||||
|
NSInferMappingModelAutomaticallyOption : @YES,
|
||||||
|
STORE_OPTIONS
|
||||||
|
} toStore:newLocalStoreURL withOptions:@{
|
||||||
|
NSMigratePersistentStoresAutomaticallyOption : @YES,
|
||||||
|
NSInferMappingModelAutomaticallyOption : @YES,
|
||||||
|
STORE_OPTIONS
|
||||||
|
} model:nil error:&error]) {
|
||||||
|
err( @"Couldn't migrate the old store to the new location: %@", [error fullDescription] );
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -697,6 +730,10 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
|
|
||||||
// Create new site.
|
// Create new site.
|
||||||
NSString *typeEntityName = [MPAlgorithmForVersion( version ) classNameOfType:type];
|
NSString *typeEntityName = [MPAlgorithmForVersion( version ) classNameOfType:type];
|
||||||
|
if (!typeEntityName) {
|
||||||
|
err( @"Invalid site type in import file: %@ has type %lu", siteName, (long)type );
|
||||||
|
return MPImportResultInternalError;
|
||||||
|
}
|
||||||
MPSiteEntity *site = [NSEntityDescription insertNewObjectForEntityForName:typeEntityName inManagedObjectContext:context];
|
MPSiteEntity *site = [NSEntityDescription insertNewObjectForEntityForName:typeEntityName inManagedObjectContext:context];
|
||||||
site.name = siteName;
|
site.name = siteName;
|
||||||
site.loginName = loginName;
|
site.loginName = loginName;
|
||||||
@@ -721,7 +758,6 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
return MPImportResultInternalError;
|
return MPImportResultInternalError;
|
||||||
|
|
||||||
inf( @"Import completed successfully." );
|
inf( @"Import completed successfully." );
|
||||||
MPCheckpoint( MPCheckpointSitesImported, nil );
|
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPSitesImportedNotification object:nil userInfo:@{
|
[[NSNotificationCenter defaultCenter] postNotificationName:MPSitesImportedNotification object:nil userInfo:@{
|
||||||
MPSitesImportedNotificationUserKey : user
|
MPSitesImportedNotificationUserKey : user
|
||||||
@@ -789,10 +825,6 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
|||||||
[(loginName?: @"") UTF8String], [siteName UTF8String], content?: @""];
|
[(loginName?: @"") UTF8String], [siteName UTF8String], content?: @""];
|
||||||
}
|
}
|
||||||
|
|
||||||
MPCheckpoint( MPCheckpointSitesExported, @{
|
|
||||||
@"showPasswords" : @(revealPasswords)
|
|
||||||
} );
|
|
||||||
|
|
||||||
return export;
|
return export;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
}
|
}
|
||||||
@catch (NSException *exception) {
|
@catch (NSException *exception) {
|
||||||
success = NO;
|
success = NO;
|
||||||
err( @"While saving: %@", exception );
|
err( @"While saving: %@", [exception fullDescription] );
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
@@ -128,10 +128,15 @@
|
|||||||
|
|
||||||
- (NSString *)debugDescription {
|
- (NSString *)debugDescription {
|
||||||
|
|
||||||
return strf( @"{%@: name=%@, user=%@, type=%lu, uses=%ld, lastUsed=%@, version=%ld, loginName=%@, requiresExplicitMigration=%d}",
|
@try {
|
||||||
NSStringFromClass( [self class] ), self.name, self.user.name, (long)self.type, (long)self.uses, self.lastUsed,
|
return strf( @"{%@: name=%@, user=%@, type=%lu, uses=%ld, lastUsed=%@, version=%ld, loginName=%@, requiresExplicitMigration=%d}",
|
||||||
(long)self.version,
|
NSStringFromClass( [self class] ), self.name, self.user.name, (long)self.type, (long)self.uses, self.lastUsed,
|
||||||
self.loginName, self.requiresExplicitMigration );
|
(long)self.version,
|
||||||
|
self.loginName, self.requiresExplicitMigration );
|
||||||
|
} @catch (NSException *exception) {
|
||||||
|
return strf( @"{%@: inaccessible: %@}",
|
||||||
|
NSStringFromClass( [self class] ), [exception fullDescription] );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)tryMigrateExplicitly:(BOOL)explicit {
|
- (BOOL)tryMigrateExplicitly:(BOOL)explicit {
|
||||||
|
|||||||
@@ -47,35 +47,6 @@ typedef NS_ENUM(NSUInteger, MPSiteType) {
|
|||||||
|
|
||||||
#define MPErrorDomain @"MPErrorDomain"
|
#define MPErrorDomain @"MPErrorDomain"
|
||||||
|
|
||||||
#define MPCheckpointHelpChapter @"MPCheckpointHelpChapter"
|
|
||||||
#define MPCheckpointCopyToPasteboard @"MPCheckpointCopyToPasteboard"
|
|
||||||
#define MPCheckpointCopyLoginNameToPasteboard @"MPCheckpointCopyLoginNameToPasteboard"
|
|
||||||
#define MPCheckpointResetPasswordCounter @"MPCheckpointResetPasswordCounter"
|
|
||||||
#define MPCheckpointIncrementPasswordCounter @"MPCheckpointIncrementPasswordCounter"
|
|
||||||
#define MPCheckpointEditPassword @"MPCheckpointEditPassword"
|
|
||||||
#define MPCheckpointEditLoginName @"MPCheckpointEditLoginName"
|
|
||||||
#define MPCheckpointUseType @"MPCheckpointUseType"
|
|
||||||
#define MPCheckpointDeleteSite @"MPCheckpointDeleteSite"
|
|
||||||
#define MPCheckpointShowGuide @"MPCheckpointShowGuide"
|
|
||||||
#define MPCheckpointShowSetup @"MPCheckpointShowSetup"
|
|
||||||
#define MPCheckpointChangeMP @"MPCheckpointChangeMP"
|
|
||||||
#define MPCheckpointMPErrorUbiquity @"MPCheckpointMPErrorUbiquity"
|
|
||||||
#define MPCheckpointLocalStoreReset @"MPCheckpointLocalStoreReset"
|
|
||||||
#define MPCheckpointCloudStoreReset @"MPCheckpointCloudStoreReset"
|
|
||||||
#define MPCheckpointSignInFailed @"MPCheckpointSignInFailed"
|
|
||||||
#define MPCheckpointSignedIn @"MPCheckpointSignedIn"
|
|
||||||
#define MPCheckpointConfig @"MPCheckpointConfig"
|
|
||||||
#define MPCheckpointCloud @"MPCheckpointCloud"
|
|
||||||
#define MPCheckpointSitesImported @"MPCheckpointSitesImported"
|
|
||||||
#define MPCheckpointSitesExported @"MPCheckpointSitesExported"
|
|
||||||
#define MPCheckpointExplicitMigration @"MPCheckpointExplicitMigration"
|
|
||||||
#define MPCheckpointReview @"MPCheckpointReview"
|
|
||||||
#define MPCheckpointApps @"MPCheckpointApps"
|
|
||||||
#define MPCheckpointApp @"MPCheckpointApp"
|
|
||||||
#define MPCheckpointEmergencyGenerator @"MPCheckpointEmergencyGenerator"
|
|
||||||
#define MPCheckpointLogs @"MPCheckpointLogs"
|
|
||||||
#define MPCheckpointStarted @"MPCheckpointStarted"
|
|
||||||
|
|
||||||
#define MPSignedInNotification @"MPSignedInNotification"
|
#define MPSignedInNotification @"MPSignedInNotification"
|
||||||
#define MPSignedOutNotification @"MPSignedOutNotification"
|
#define MPSignedOutNotification @"MPSignedOutNotification"
|
||||||
#define MPKeyForgottenNotification @"MPKeyForgottenNotification"
|
#define MPKeyForgottenNotification @"MPKeyForgottenNotification"
|
||||||
@@ -86,8 +57,3 @@ typedef NS_ENUM(NSUInteger, MPSiteType) {
|
|||||||
|
|
||||||
#define MPSitesImportedNotificationUserKey @"MPSitesImportedNotificationUserKey"
|
#define MPSitesImportedNotificationUserKey @"MPSitesImportedNotificationUserKey"
|
||||||
#define MPInconsistenciesFixResultUserKey @"MPInconsistenciesFixResultUserKey"
|
#define MPInconsistenciesFixResultUserKey @"MPInconsistenciesFixResultUserKey"
|
||||||
|
|
||||||
static void MPCheckpoint(NSString *checkpoint, NSDictionary *attributes) {
|
|
||||||
|
|
||||||
inf(@"%@: %@", checkpoint, attributes);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -8,13 +8,12 @@
|
|||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
#import "MPAppDelegate_Shared.h"
|
#import "MPAppDelegate_Shared.h"
|
||||||
#import "RHStatusItemView.h"
|
|
||||||
#import "MPPasswordWindowController.h"
|
#import "MPPasswordWindowController.h"
|
||||||
#import "MPInitialWindowController.h"
|
#import "MPInitialWindowController.h"
|
||||||
|
|
||||||
@interface MPMacAppDelegate : MPAppDelegate_Shared<NSApplicationDelegate>
|
@interface MPMacAppDelegate : MPAppDelegate_Shared<NSApplicationDelegate>
|
||||||
|
|
||||||
@property(nonatomic, strong) RHStatusItemView *statusView;
|
@property(nonatomic, strong) NSStatusItem *statusView;
|
||||||
@property(nonatomic, strong) MPPasswordWindowController *passwordWindowController;
|
@property(nonatomic, strong) MPPasswordWindowController *passwordWindowController;
|
||||||
@property(nonatomic, strong) MPInitialWindowController *initialWindowController;
|
@property(nonatomic, strong) MPInitialWindowController *initialWindowController;
|
||||||
@property(nonatomic, weak) IBOutlet NSMenuItem *lockItem;
|
@property(nonatomic, weak) IBOutlet NSMenuItem *lockItem;
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
#import "MPMacAppDelegate.h"
|
#import "MPMacAppDelegate.h"
|
||||||
#import "MPAppDelegate_Key.h"
|
#import "MPAppDelegate_Key.h"
|
||||||
#import "MPAppDelegate_Store.h"
|
#import "MPAppDelegate_Store.h"
|
||||||
#import "MPPasswordWindowController.h"
|
|
||||||
#import "PearlProfiler.h"
|
|
||||||
#import <Carbon/Carbon.h>
|
#import <Carbon/Carbon.h>
|
||||||
#import <ServiceManagement/ServiceManagement.h>
|
#import <ServiceManagement/ServiceManagement.h>
|
||||||
|
|
||||||
@@ -75,29 +73,37 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
} forKeyPath:@"activeUser" options:0 context:nil];
|
} forKeyPath:@"activeUser" options:0 context:nil];
|
||||||
|
|
||||||
// Status item.
|
// Status item.
|
||||||
self.statusView = [[RHStatusItemView alloc] initWithStatusBarItem:
|
self.statusView = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength];
|
||||||
[[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength]];
|
|
||||||
self.statusView.image = [NSImage imageNamed:@"menu-icon"];
|
self.statusView.image = [NSImage imageNamed:@"menu-icon"];
|
||||||
|
self.statusView.image.template = YES;
|
||||||
self.statusView.menu = self.statusMenu;
|
self.statusView.menu = self.statusMenu;
|
||||||
self.statusView.target = self;
|
self.statusView.target = self;
|
||||||
self.statusView.action = @selector( showMenu );
|
self.statusView.action = @selector( showMenu );
|
||||||
|
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:USMStoreDidChangeNotification object:nil
|
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresWillChangeNotification, self.storeCoordinator, nil,
|
||||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
^(id self, NSNotification *note) {
|
||||||
[self updateUsers];
|
PearlMainQueue( ^{
|
||||||
}];
|
[self updateUsers];
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:USMStoreDidImportChangesNotification object:nil
|
} );
|
||||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
} );
|
||||||
[self updateUsers];
|
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresDidChangeNotification, self.storeCoordinator, nil,
|
||||||
}];
|
^(id self, NSNotification *note) {
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:MPCheckConfigNotification object:nil
|
PearlMainQueue( ^{
|
||||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
[self updateUsers];
|
||||||
NSString *key = note.object;
|
} );
|
||||||
if (!key || [key isEqualToString:NSStringFromSelector( @selector( hidePasswords ) )])
|
} );
|
||||||
self.hidePasswordsItem.state = [[MPConfig get].hidePasswords boolValue]? NSOnState: NSOffState;
|
PearlAddNotificationObserver( MPCheckConfigNotification, nil, nil,
|
||||||
if (!key || [key isEqualToString:NSStringFromSelector( @selector( rememberLogin ) )])
|
^(MPMacAppDelegate *self, NSNotification *note) {
|
||||||
self.rememberPasswordItem.state = [[MPConfig get].rememberLogin boolValue]? NSOnState: NSOffState;
|
PearlMainQueue( ^{
|
||||||
}];
|
NSString *key = note.object;
|
||||||
|
if (!key || [key isEqualToString:NSStringFromSelector( @
|
||||||
|
selector( hidePasswords ) )])
|
||||||
|
self.hidePasswordsItem.state = [[MPConfig get].hidePasswords boolValue]? NSOnState: NSOffState;
|
||||||
|
if (!key || [key isEqualToString:NSStringFromSelector( @
|
||||||
|
selector( rememberLogin ) )])
|
||||||
|
self.rememberPasswordItem.state = [[MPConfig get].rememberLogin boolValue]? NSOnState: NSOffState;
|
||||||
|
} );
|
||||||
|
} );
|
||||||
[self updateUsers];
|
[self updateUsers];
|
||||||
|
|
||||||
// Global hotkey.
|
// Global hotkey.
|
||||||
@@ -178,12 +184,9 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
NSArray *jobs = (__bridge_transfer NSArray *)SMCopyAllJobDictionaries( kSMDomainUserLaunchd );
|
NSArray *jobs = (__bridge_transfer NSArray *)SMCopyAllJobDictionaries( kSMDomainUserLaunchd );
|
||||||
|
|
||||||
for (NSDictionary *job in jobs)
|
for (NSDictionary *job in jobs)
|
||||||
if ([LOGIN_HELPER_BUNDLE_ID isEqualToString:[job objectForKey:@"Label"]]) {
|
if ([LOGIN_HELPER_BUNDLE_ID isEqualToString:job[@"Label"]])
|
||||||
dbg( @"loginItemEnabled: %@", @([[job objectForKey:@"OnDemand"] boolValue]) );
|
return [job[@"OnDemand"] boolValue];
|
||||||
return [[job objectForKey:@"OnDemand"] boolValue];
|
|
||||||
}
|
|
||||||
|
|
||||||
dbg( @"loginItemEnabled: not found" );
|
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,9 +308,9 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
- (IBAction)togglePreference:(id)sender {
|
- (IBAction)togglePreference:(id)sender {
|
||||||
|
|
||||||
if (sender == self.hidePasswordsItem)
|
if (sender == self.hidePasswordsItem)
|
||||||
[MPConfig get].hidePasswords = [NSNumber numberWithBool:![[MPConfig get].hidePasswords boolValue]];
|
[MPConfig get].hidePasswords = @(![[MPConfig get].hidePasswords boolValue]);
|
||||||
if (sender == self.rememberPasswordItem)
|
if (sender == self.rememberPasswordItem)
|
||||||
[MPConfig get].rememberLogin = [NSNumber numberWithBool:![[MPConfig get].rememberLogin boolValue]];
|
[MPConfig get].rememberLogin = @(![[MPConfig get].rememberLogin boolValue]);
|
||||||
if (sender == self.openAtLoginItem)
|
if (sender == self.openAtLoginItem)
|
||||||
[self setLoginItemEnabled:self.openAtLoginItem.state != NSOnState];
|
[self setLoginItemEnabled:self.openAtLoginItem.state != NSOnState];
|
||||||
if (sender == self.savePasswordItem) {
|
if (sender == self.savePasswordItem) {
|
||||||
@@ -391,7 +394,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
|
|
||||||
- (IBAction)showPopup:(id)sender {
|
- (IBAction)showPopup:(id)sender {
|
||||||
|
|
||||||
[self.statusView popUpMenu];
|
[self.statusView popUpStatusItemMenu:self.statusView.menu];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)showPasswordWindow:(id)sender {
|
- (IBAction)showPasswordWindow:(id)sender {
|
||||||
@@ -409,13 +412,10 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't show window if we weren't already running (ie. if we haven't been activated before).
|
// Don't show window if we weren't already running (ie. if we haven't been activated before).
|
||||||
PearlProfiler *profiler = [PearlProfiler profilerForTask:@"passwordWindowController"];
|
|
||||||
if (!self.passwordWindowController)
|
if (!self.passwordWindowController)
|
||||||
self.passwordWindowController = [[MPPasswordWindowController alloc] initWithWindowNibName:@"MPPasswordWindowController"];
|
self.passwordWindowController = [[MPPasswordWindowController alloc] initWithWindowNibName:@"MPPasswordWindowController"];
|
||||||
[profiler finishJob:@"init"];
|
|
||||||
|
|
||||||
[self.passwordWindowController showWindow:self];
|
[self.passwordWindowController showWindow:self];
|
||||||
[profiler finishJob:@"show"];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Private
|
#pragma mark - Private
|
||||||
@@ -463,12 +463,14 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
NSString *exportedSites = [self exportSitesRevealPasswords:revealPasswords];
|
NSString *exportedSites = [self exportSitesRevealPasswords:revealPasswords];
|
||||||
[[[NSFileCoordinator alloc] initWithFilePresenter:nil] coordinateWritingItemAtURL:savePanel.URL options:0 error:&coordinateError
|
[[[NSFileCoordinator alloc] initWithFilePresenter:nil] coordinateWritingItemAtURL:savePanel.URL options:0 error:&coordinateError
|
||||||
byAccessor:^(NSURL *newURL) {
|
byAccessor:^(NSURL *newURL) {
|
||||||
NSError *writeError = nil;
|
NSError *writeError = nil;
|
||||||
if (![exportedSites writeToURL:newURL atomically:NO encoding:NSUTF8StringEncoding error:&writeError])
|
if (![exportedSites writeToURL:newURL atomically:NO
|
||||||
PearlMainQueue( ^{
|
encoding:NSUTF8StringEncoding
|
||||||
[[NSAlert alertWithError:writeError] runModal];
|
error:&writeError])
|
||||||
} );
|
PearlMainQueue( ^{
|
||||||
}];
|
[[NSAlert alertWithError:writeError] runModal];
|
||||||
|
} );
|
||||||
|
}];
|
||||||
if (coordinateError)
|
if (coordinateError)
|
||||||
PearlMainQueue( ^{
|
PearlMainQueue( ^{
|
||||||
[[NSAlert alertWithError:coordinateError] runModal];
|
[[NSAlert alertWithError:coordinateError] runModal];
|
||||||
@@ -543,7 +545,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
|
|
||||||
[self updateMenuItems];
|
[self updateMenuItems];
|
||||||
|
|
||||||
[self.statusView popUpMenu];
|
[self.statusView popUpStatusItemMenu:self.statusView.menu];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateMenuItems {
|
- (void)updateMenuItems {
|
||||||
@@ -596,30 +598,6 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - UbiquityStoreManagerDelegate
|
|
||||||
|
|
||||||
- (void)ubiquityStoreManager:(UbiquityStoreManager *)manager didLoadStoreForCoordinator:(NSPersistentStoreCoordinator *)coordinator
|
|
||||||
isCloud:(BOOL)isCloudStore {
|
|
||||||
|
|
||||||
[super ubiquityStoreManager:manager didLoadStoreForCoordinator:coordinator isCloud:isCloudStore];
|
|
||||||
|
|
||||||
if (isCloudStore) {
|
|
||||||
NSAlert *alert = [NSAlert new];
|
|
||||||
alert.messageText = @"iCloud Support Deprecated";
|
|
||||||
alert.informativeText = @"Master Password is moving away from iCloud due to limited platform support and reliability issues. "
|
|
||||||
@"\n\nMaster Password's generated passwords do not require syncing. "
|
|
||||||
@"Your sites will always have the same passwords on all your devices. "
|
|
||||||
@"\n\niCloud continues to work for now but will be deactivated in a future update. "
|
|
||||||
@"Disable iCloud now to copy your iCloud sites to your device and avoid losing them when iCloud becomes discontinued.";
|
|
||||||
[alert addButtonWithTitle:@"Disable iCloud"];
|
|
||||||
[alert addButtonWithTitle:@"Ignore For Now"];
|
|
||||||
|
|
||||||
NSInteger response = [alert runModal];
|
|
||||||
if (response == NSAlertFirstButtonReturn)
|
|
||||||
[[self storeManager] migrateCloudToLocal];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark - PearlConfigDelegate
|
#pragma mark - PearlConfigDelegate
|
||||||
|
|
||||||
- (void)didUpdateConfigForKey:(SEL)configKey fromValue:(id)oldValue {
|
- (void)didUpdateConfigForKey:(SEL)configKey fromValue:(id)oldValue {
|
||||||
|
|||||||
23
MasterPassword/ObjC/Mac/MPNoStateButton.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||||
|
*
|
||||||
|
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||||
|
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||||
|
*
|
||||||
|
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||||
|
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// MPNoStateButton.h
|
||||||
|
// MPNoStateButton
|
||||||
|
//
|
||||||
|
// Created by lhunath on 14-10-27.
|
||||||
|
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
|
||||||
|
@interface MPNoStateButtonCell : NSButtonCell
|
||||||
|
@end
|
||||||
31
MasterPassword/ObjC/Mac/MPNoStateButton.m
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
|
||||||
|
*
|
||||||
|
* See the enclosed file LICENSE for license information (LGPLv3). If you did
|
||||||
|
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||||
|
*
|
||||||
|
* @author Maarten Billemont <lhunath@lyndir.com>
|
||||||
|
* @license http://www.gnu.org/licenses/lgpl-3.0.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
//
|
||||||
|
// MPNoStateButton.h
|
||||||
|
// MPNoStateButton
|
||||||
|
//
|
||||||
|
// Created by lhunath on 14-10-27.
|
||||||
|
// Copyright, lhunath (Maarten Billemont) 2014. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPNoStateButton.h"
|
||||||
|
|
||||||
|
|
||||||
|
@implementation MPNoStateButtonCell {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setState:(NSInteger)state {
|
||||||
|
|
||||||
|
[super setState:NSOnState];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -20,9 +20,7 @@
|
|||||||
#import "MPPasswordWindowController.h"
|
#import "MPPasswordWindowController.h"
|
||||||
#import "MPMacAppDelegate.h"
|
#import "MPMacAppDelegate.h"
|
||||||
#import "MPAppDelegate_Store.h"
|
#import "MPAppDelegate_Store.h"
|
||||||
#import "MPSiteModel.h"
|
|
||||||
#import "MPAppDelegate_Key.h"
|
#import "MPAppDelegate_Key.h"
|
||||||
#import "PearlProfiler.h"
|
|
||||||
|
|
||||||
#define MPAlertIncorrectMP @"MPAlertIncorrectMP"
|
#define MPAlertIncorrectMP @"MPAlertIncorrectMP"
|
||||||
#define MPAlertChangeMP @"MPAlertChangeMP"
|
#define MPAlertChangeMP @"MPAlertChangeMP"
|
||||||
@@ -34,11 +32,11 @@
|
|||||||
|
|
||||||
@interface MPPasswordWindowController()
|
@interface MPPasswordWindowController()
|
||||||
|
|
||||||
@property(nonatomic, copy) NSString *currentSiteText;
|
|
||||||
@property(nonatomic, strong) CAGradientLayer *siteGradient;
|
@property(nonatomic, strong) CAGradientLayer *siteGradient;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation MPPasswordWindowController { BOOL _skipTextChange; }
|
@implementation MPPasswordWindowController
|
||||||
|
|
||||||
#pragma mark - Life
|
#pragma mark - Life
|
||||||
|
|
||||||
@@ -56,31 +54,33 @@
|
|||||||
// }];
|
// }];
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidBecomeKeyNotification object:self.window
|
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowDidBecomeKeyNotification object:self.window
|
||||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||||
[self fadeIn];
|
[self fadeIn];
|
||||||
[self updateUser];
|
[self updateUser];
|
||||||
}];
|
}];
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification object:self.window
|
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification object:self.window
|
||||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||||
NSWindow *sheet = [self.window attachedSheet];
|
NSWindow *sheet = [self.window attachedSheet];
|
||||||
if (sheet)
|
if (sheet)
|
||||||
[NSApp endSheet:sheet];
|
[NSApp endSheet:sheet];
|
||||||
}];
|
}];
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:NSApplicationWillResignActiveNotification object:nil
|
[[NSNotificationCenter defaultCenter] addObserverForName:NSApplicationWillResignActiveNotification object:nil
|
||||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||||
|
#ifndef DEBUG
|
||||||
[self fadeOut];
|
[self fadeOut];
|
||||||
}];
|
#endif
|
||||||
|
}];
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:MPSignedInNotification object:nil
|
[[NSNotificationCenter defaultCenter] addObserverForName:MPSignedInNotification object:nil
|
||||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||||
[self updateUser];
|
[self updateUser];
|
||||||
}];
|
}];
|
||||||
[[NSNotificationCenter defaultCenter] addObserverForName:MPSignedOutNotification object:nil
|
[[NSNotificationCenter defaultCenter] addObserverForName:MPSignedOutNotification object:nil
|
||||||
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
|
||||||
[self updateUser];
|
[self updateUser];
|
||||||
}];
|
}];
|
||||||
[self observeKeyPath:@"sitesController.selection"
|
[self observeKeyPath:@"sitesController.selection"
|
||||||
withBlock:^(id from, id to, NSKeyValueChange cause, id _self) {
|
withBlock:^(id from, id to, NSKeyValueChange cause, id _self) {
|
||||||
[_self updateSelection];
|
[_self updateSelection];
|
||||||
}];
|
}];
|
||||||
|
|
||||||
NSSearchFieldCell *siteFieldCell = self.siteField.cell;
|
NSSearchFieldCell *siteFieldCell = self.siteField.cell;
|
||||||
siteFieldCell.searchButtonCell = nil;
|
siteFieldCell.searchButtonCell = nil;
|
||||||
@@ -118,7 +118,6 @@
|
|||||||
|
|
||||||
- (void)doCommandBySelector:(SEL)commandSelector {
|
- (void)doCommandBySelector:(SEL)commandSelector {
|
||||||
|
|
||||||
dbg( @"doCommandBySelector: %@", NSStringFromSelector( commandSelector ) );
|
|
||||||
[self handleCommand:commandSelector];
|
[self handleCommand:commandSelector];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,12 +125,9 @@
|
|||||||
|
|
||||||
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector {
|
- (BOOL)control:(NSControl *)control textView:(NSTextView *)fieldEditor doCommandBySelector:(SEL)commandSelector {
|
||||||
|
|
||||||
dbg( @"@control:%@ textView:%@ doCommandBySelector:%@", control, fieldEditor, NSStringFromSelector( commandSelector ) );
|
|
||||||
if (control == self.siteField) {
|
if (control == self.siteField) {
|
||||||
if ([NSStringFromSelector( commandSelector ) rangeOfString:@"delete"].location == 0) {
|
if ([NSStringFromSelector( commandSelector ) rangeOfString:@"delete"].location == 0)
|
||||||
_skipTextChange = YES;
|
|
||||||
return NO;
|
return NO;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (control == self.securePasswordField || control == self.revealPasswordField) {
|
if (control == self.securePasswordField || control == self.revealPasswordField) {
|
||||||
if (commandSelector == @selector( insertNewline: ))
|
if (commandSelector == @selector( insertNewline: ))
|
||||||
@@ -178,7 +174,6 @@
|
|||||||
|
|
||||||
- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
|
- (BOOL)textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector {
|
||||||
|
|
||||||
dbg( @"textView:%@doCommandBySelector:%@", textView, NSStringFromSelector( commandSelector ) );
|
|
||||||
return [self handleCommand:commandSelector];
|
return [self handleCommand:commandSelector];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,9 +226,9 @@
|
|||||||
// "Create" button.
|
// "Create" button.
|
||||||
[[MPMacAppDelegate get] addSiteNamed:[self.siteField stringValue] completion:
|
[[MPMacAppDelegate get] addSiteNamed:[self.siteField stringValue] completion:
|
||||||
^(MPSiteEntity *site, NSManagedObjectContext *context) {
|
^(MPSiteEntity *site, NSManagedObjectContext *context) {
|
||||||
if (site)
|
if (site)
|
||||||
PearlMainQueue( ^{ [self updateSites]; } );
|
PearlMainQueue( ^{ [self updateSites]; } );
|
||||||
}];
|
}];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -309,11 +304,6 @@
|
|||||||
|
|
||||||
#pragma mark - State
|
#pragma mark - State
|
||||||
|
|
||||||
- (NSString *)query {
|
|
||||||
|
|
||||||
return [self.siteField.stringValue stringByReplacingCharactersInRange:self.siteField.currentEditor.selectedRange withString:@""]?: @"";
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)insertObject:(MPSiteModel *)model inSitesAtIndex:(NSUInteger)index {
|
- (void)insertObject:(MPSiteModel *)model inSitesAtIndex:(NSUInteger)index {
|
||||||
|
|
||||||
[self.sites insertObject:model atIndex:index];
|
[self.sites insertObject:model atIndex:index];
|
||||||
@@ -343,7 +333,7 @@
|
|||||||
[alert addButtonWithTitle:@"Delete"];
|
[alert addButtonWithTitle:@"Delete"];
|
||||||
[alert addButtonWithTitle:@"Cancel"];
|
[alert addButtonWithTitle:@"Cancel"];
|
||||||
[alert setMessageText:@"Delete Site?"];
|
[alert setMessageText:@"Delete Site?"];
|
||||||
[alert setInformativeText:strf( @"Do you want to delete the site named:\n\n%@", self.selectedSite.siteName )];
|
[alert setInformativeText:strf( @"Do you want to delete the site named:\n\n%@", self.selectedSite.name )];
|
||||||
[alert beginSheetModalForWindow:self.window modalDelegate:self
|
[alert beginSheetModalForWindow:self.window modalDelegate:self
|
||||||
didEndSelector:@selector( alertDidEnd:returnCode:contextInfo: ) contextInfo:MPAlertDeleteSite];
|
didEndSelector:@selector( alertDidEnd:returnCode:contextInfo: ) contextInfo:MPAlertDeleteSite];
|
||||||
}
|
}
|
||||||
@@ -354,7 +344,7 @@
|
|||||||
[alert addButtonWithTitle:@"Save"];
|
[alert addButtonWithTitle:@"Save"];
|
||||||
[alert addButtonWithTitle:@"Cancel"];
|
[alert addButtonWithTitle:@"Cancel"];
|
||||||
[alert setMessageText:@"Change Login Name"];
|
[alert setMessageText:@"Change Login Name"];
|
||||||
[alert setInformativeText:strf( @"Enter the login name for: %@", self.selectedSite.siteName )];
|
[alert setInformativeText:strf( @"Enter the login name for: %@", self.selectedSite.name )];
|
||||||
NSTextField *loginField = [[NSTextField alloc] initWithFrame:NSMakeRect( 0, 0, 200, 22 )];
|
NSTextField *loginField = [[NSTextField alloc] initWithFrame:NSMakeRect( 0, 0, 200, 22 )];
|
||||||
loginField.stringValue = self.selectedSite.loginName?: @"";
|
loginField.stringValue = self.selectedSite.loginName?: @"";
|
||||||
[loginField selectText:self];
|
[loginField selectText:self];
|
||||||
@@ -388,7 +378,7 @@
|
|||||||
[alert addButtonWithTitle:@"Save"];
|
[alert addButtonWithTitle:@"Save"];
|
||||||
[alert addButtonWithTitle:@"Cancel"];
|
[alert addButtonWithTitle:@"Cancel"];
|
||||||
[alert setMessageText:@"Change Password"];
|
[alert setMessageText:@"Change Password"];
|
||||||
[alert setInformativeText:strf( @"Enter the new password for: %@", self.selectedSite.siteName )];
|
[alert setInformativeText:strf( @"Enter the new password for: %@", self.selectedSite.name )];
|
||||||
[alert setAccessoryView:[[NSSecureTextField alloc] initWithFrame:NSMakeRect( 0, 0, 200, 22 )]];
|
[alert setAccessoryView:[[NSSecureTextField alloc] initWithFrame:NSMakeRect( 0, 0, 200, 22 )]];
|
||||||
[alert layout];
|
[alert layout];
|
||||||
[alert beginSheetModalForWindow:self.window modalDelegate:self
|
[alert beginSheetModalForWindow:self.window modalDelegate:self
|
||||||
@@ -404,8 +394,9 @@
|
|||||||
MPSiteType type = [types[t] unsignedIntegerValue];
|
MPSiteType type = [types[t] unsignedIntegerValue];
|
||||||
NSString *title = [site.algorithm nameOfType:type];
|
NSString *title = [site.algorithm nameOfType:type];
|
||||||
if (type & MPSiteTypeClassGenerated)
|
if (type & MPSiteTypeClassGenerated)
|
||||||
title = [site.algorithm generatePasswordForSiteNamed:site.siteName ofType:type
|
title = [site.algorithm generatePasswordForSiteNamed:site.name ofType:type
|
||||||
withCounter:site.counter usingKey:[MPMacAppDelegate get].key];
|
withCounter:site.counter
|
||||||
|
usingKey:[MPMacAppDelegate get].key];
|
||||||
|
|
||||||
NSButtonCell *cell = [self.passwordTypesMatrix cellAtRow:(NSInteger)t column:0];
|
NSButtonCell *cell = [self.passwordTypesMatrix cellAtRow:(NSInteger)t column:0];
|
||||||
cell.tag = type;
|
cell.tag = type;
|
||||||
@@ -417,7 +408,7 @@
|
|||||||
[alert addButtonWithTitle:@"Save"];
|
[alert addButtonWithTitle:@"Save"];
|
||||||
[alert addButtonWithTitle:@"Cancel"];
|
[alert addButtonWithTitle:@"Cancel"];
|
||||||
[alert setMessageText:@"Change Password Type"];
|
[alert setMessageText:@"Change Password Type"];
|
||||||
[alert setInformativeText:strf( @"Choose a new password type for: %@", site.siteName )];
|
[alert setInformativeText:strf( @"Choose a new password type for: %@", site.name )];
|
||||||
[alert setAccessoryView:self.passwordTypesBox];
|
[alert setAccessoryView:self.passwordTypesBox];
|
||||||
[alert layout];
|
[alert layout];
|
||||||
[alert beginSheetModalForWindow:self.window modalDelegate:self
|
[alert beginSheetModalForWindow:self.window modalDelegate:self
|
||||||
@@ -460,9 +451,9 @@
|
|||||||
NSUserNotification *notification = [NSUserNotification new];
|
NSUserNotification *notification = [NSUserNotification new];
|
||||||
notification.title = @"Password Copied";
|
notification.title = @"Password Copied";
|
||||||
if (selectedSite.loginName.length)
|
if (selectedSite.loginName.length)
|
||||||
notification.subtitle = strf( @"%@ at %@", selectedSite.loginName, selectedSite.siteName );
|
notification.subtitle = strf( @"%@ at %@", selectedSite.loginName, selectedSite.name );
|
||||||
else
|
else
|
||||||
notification.subtitle = selectedSite.siteName;
|
notification.subtitle = selectedSite.name;
|
||||||
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification];
|
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -511,15 +502,24 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PearlProfiler *profiler = [PearlProfiler profilerForTask:@"updateSites"];
|
static NSRegularExpression *fuzzyRE;
|
||||||
NSString *query = [self query];
|
static dispatch_once_t once = 0;
|
||||||
[profiler finishJob:@"query"];
|
dispatch_once( &once, ^{
|
||||||
|
fuzzyRE = [NSRegularExpression regularExpressionWithPattern:@"(.)" options:0 error:nil];
|
||||||
|
} );
|
||||||
|
|
||||||
|
NSString *queryString = self.siteField.stringValue;
|
||||||
|
NSString *queryPattern = [queryString stringByReplacingMatchesOfExpression:fuzzyRE withTemplate:@"*$1*"];
|
||||||
|
NSMutableArray *fuzzyGroups = [NSMutableArray new];
|
||||||
|
[fuzzyRE enumerateMatchesInString:queryString options:0 range:NSMakeRange( 0, queryString.length )
|
||||||
|
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
|
||||||
|
[fuzzyGroups addObject:[queryString substringWithRange:result.range] ];
|
||||||
|
}];
|
||||||
[MPMacAppDelegate managedObjectContextPerformBlockAndWait:^(NSManagedObjectContext *context) {
|
[MPMacAppDelegate managedObjectContextPerformBlockAndWait:^(NSManagedObjectContext *context) {
|
||||||
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass( [MPSiteEntity class] )];
|
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass( [MPSiteEntity class] )];
|
||||||
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"lastUsed" ascending:NO]];
|
fetchRequest.sortDescriptors = @[ [[NSSortDescriptor alloc] initWithKey:@"lastUsed" ascending:NO] ];
|
||||||
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(%@ == '' OR name BEGINSWITH[cd] %@) AND user == %@",
|
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(%@ == '' OR name LIKE[cd] %@) AND user == %@",
|
||||||
query, query, [[MPMacAppDelegate get] activeUserInContext:context]];
|
queryPattern, queryPattern, [[MPMacAppDelegate get] activeUserInContext:context]];
|
||||||
[profiler finishJob:@"setup fetch"];
|
|
||||||
|
|
||||||
NSError *error = nil;
|
NSError *error = nil;
|
||||||
NSArray *siteResults = [context executeFetchRequest:fetchRequest error:&error];
|
NSArray *siteResults = [context executeFetchRequest:fetchRequest error:&error];
|
||||||
@@ -527,43 +527,17 @@
|
|||||||
err( @"While fetching sites for completion: %@", [error fullDescription] );
|
err( @"While fetching sites for completion: %@", [error fullDescription] );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
[profiler finishJob:@"do fetch"];
|
|
||||||
|
|
||||||
NSMutableArray *newSites = [NSMutableArray arrayWithCapacity:[siteResults count]];
|
NSMutableArray *newSites = [NSMutableArray arrayWithCapacity:[siteResults count]];
|
||||||
for (MPSiteEntity *site in siteResults)
|
for (MPSiteEntity *site in siteResults)
|
||||||
[newSites addObject:[[MPSiteModel alloc] initWithEntity:site]];
|
[newSites addObject:[[MPSiteModel alloc] initWithEntity:site fuzzyGroups:fuzzyGroups]];
|
||||||
[profiler finishJob:@"make models"];
|
|
||||||
self.sites = newSites;
|
self.sites = newSites;
|
||||||
[profiler finishJob:@"update sites"];
|
|
||||||
}];
|
}];
|
||||||
[profiler finishJob:@"done"];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateSelection {
|
- (void)updateSelection {
|
||||||
|
|
||||||
if (_skipTextChange) {
|
|
||||||
_skipTextChange = NO;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
NSString *siteName = self.selectedSite.siteName;
|
|
||||||
if (!siteName)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if ([self.window isKeyWindow] && [self.siteField isEqual:[self.window firstResponder]]) {
|
|
||||||
NSRange siteNameQueryRange = [siteName rangeOfString:[self query]];
|
|
||||||
self.siteField.stringValue = siteName;
|
|
||||||
|
|
||||||
if (siteNameQueryRange.location == 0)
|
|
||||||
self.siteField.currentEditor.selectedRange =
|
|
||||||
NSMakeRange( siteNameQueryRange.length, siteName.length - siteNameQueryRange.length );
|
|
||||||
}
|
|
||||||
|
|
||||||
[self.siteTable scrollRowToVisible:(NSInteger)self.sitesController.selectionIndex];
|
[self.siteTable scrollRowToVisible:(NSInteger)self.sitesController.selectionIndex];
|
||||||
[self updateGradient];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)updateGradient {
|
|
||||||
|
|
||||||
NSView *siteScrollView = self.siteTable.superview.superview;
|
NSView *siteScrollView = self.siteTable.superview.superview;
|
||||||
NSRect selectedCellFrame = [self.siteTable frameOfCellAtColumn:0 row:((NSInteger)self.sitesController.selectionIndex)];
|
NSRect selectedCellFrame = [self.siteTable frameOfCellAtColumn:0 row:((NSInteger)self.sitesController.selectionIndex)];
|
||||||
@@ -590,7 +564,7 @@
|
|||||||
|
|
||||||
- (void)copyContent:(NSString *)content {
|
- (void)copyContent:(NSString *)content {
|
||||||
|
|
||||||
[[NSPasteboard generalPasteboard] declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil];
|
[[NSPasteboard generalPasteboard] declareTypes:@[ NSStringPboardType ] owner:nil];
|
||||||
if (![[NSPasteboard generalPasteboard] setString:content forType:NSPasteboardTypeString]) {
|
if (![[NSPasteboard generalPasteboard] setString:content forType:NSPasteboardTypeString]) {
|
||||||
wrn( @"Couldn't copy password to pasteboard." );
|
wrn( @"Couldn't copy password to pasteboard." );
|
||||||
return;
|
return;
|
||||||
@@ -607,7 +581,6 @@
|
|||||||
if ([self.window isOnActiveSpace] && self.window.alphaValue)
|
if ([self.window isOnActiveSpace] && self.window.alphaValue)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PearlProfiler *profiler = [PearlProfiler profilerForTask:@"fadeIn"];
|
|
||||||
CGDirectDisplayID displayID = [self.window.screen.deviceDescription[@"NSScreenNumber"] unsignedIntValue];
|
CGDirectDisplayID displayID = [self.window.screen.deviceDescription[@"NSScreenNumber"] unsignedIntValue];
|
||||||
CGImageRef capturedImage = CGDisplayCreateImage( displayID );
|
CGImageRef capturedImage = CGDisplayCreateImage( displayID );
|
||||||
if (!capturedImage || CGImageGetWidth( capturedImage ) <= 1) {
|
if (!capturedImage || CGImageGetWidth( capturedImage ) <= 1) {
|
||||||
@@ -615,11 +588,9 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
[profiler finishJob:@"captured window: %d, on screen: %@", displayID, self.window.screen.deviceDescription];
|
|
||||||
NSImage *screenImage = [[NSImage alloc] initWithCGImage:capturedImage size:NSMakeSize(
|
NSImage *screenImage = [[NSImage alloc] initWithCGImage:capturedImage size:NSMakeSize(
|
||||||
CGImageGetWidth( capturedImage ) / self.window.backingScaleFactor,
|
CGImageGetWidth( capturedImage ) / self.window.backingScaleFactor,
|
||||||
CGImageGetHeight( capturedImage ) / self.window.backingScaleFactor )];
|
CGImageGetHeight( capturedImage ) / self.window.backingScaleFactor )];
|
||||||
[profiler finishJob:@"image size: %@, bytes: %ld", NSStringFromSize( screenImage.size ), screenImage.TIFFRepresentation.length];
|
|
||||||
|
|
||||||
NSImage *smallImage = [[NSImage alloc] initWithSize:NSMakeSize(
|
NSImage *smallImage = [[NSImage alloc] initWithSize:NSMakeSize(
|
||||||
CGImageGetWidth( capturedImage ) / 20,
|
CGImageGetWidth( capturedImage ) / 20,
|
||||||
@@ -631,16 +602,12 @@
|
|||||||
operation:NSCompositeSourceOver
|
operation:NSCompositeSourceOver
|
||||||
fraction:1.0];
|
fraction:1.0];
|
||||||
[smallImage unlockFocus];
|
[smallImage unlockFocus];
|
||||||
[profiler finishJob:@"small image size: %@, bytes: %ld", NSStringFromSize( screenImage.size ), screenImage.TIFFRepresentation.length];
|
|
||||||
|
|
||||||
self.blurView.image = smallImage;
|
self.blurView.image = smallImage;
|
||||||
[profiler finishJob:@"assigned image"];
|
|
||||||
|
|
||||||
[self.window setFrame:self.window.screen.frame display:YES];
|
[self.window setFrame:self.window.screen.frame display:YES];
|
||||||
[profiler finishJob:@"assigned frame"];
|
|
||||||
[NSAnimationContext currentContext].timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
|
[NSAnimationContext currentContext].timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
|
||||||
self.window.animator.alphaValue = 1.0;
|
self.window.animator.alphaValue = 1.0;
|
||||||
[profiler finishJob:@"animating window"];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)fadeOut {
|
- (void)fadeOut {
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13E28" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6250" systemVersion="14A389" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment defaultVersion="1080" identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6250"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="MPPasswordWindowController">
|
<customObject id="-2" userLabel="File's Owner" customClass="MPPasswordWindowController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="blurView" destination="Bwc-sd-6gm" id="wNV-0x-LJn"/>
|
<outlet property="blurView" destination="Bwc-sd-6gm" id="wNV-0x-LJn"/>
|
||||||
<outlet property="sitesController" destination="mcS-ik-b0n" id="cdF-BL-lfg"/>
|
|
||||||
<outlet property="inputLabel" destination="OnR-s6-d4P" id="p6G-Ut-cdu"/>
|
<outlet property="inputLabel" destination="OnR-s6-d4P" id="p6G-Ut-cdu"/>
|
||||||
<outlet property="passwordTypesBox" destination="bZe-7q-i6q" id="Ai3-pt-i6K"/>
|
<outlet property="passwordTypesBox" destination="bZe-7q-i6q" id="Ai3-pt-i6K"/>
|
||||||
<outlet property="passwordTypesMatrix" destination="3fr-Fd-pxx" id="T8g-mS-lxP"/>
|
<outlet property="passwordTypesMatrix" destination="3fr-Fd-pxx" id="T8g-mS-lxP"/>
|
||||||
@@ -17,11 +16,12 @@
|
|||||||
<outlet property="securePasswordField" destination="iGR-wo-ual" id="DGh-5i-3u4"/>
|
<outlet property="securePasswordField" destination="iGR-wo-ual" id="DGh-5i-3u4"/>
|
||||||
<outlet property="siteField" destination="CnS-iI-dhr" id="Ogo-lS-dcT"/>
|
<outlet property="siteField" destination="CnS-iI-dhr" id="Ogo-lS-dcT"/>
|
||||||
<outlet property="siteTable" destination="xvJ-5c-vDp" id="ClP-j8-DyI"/>
|
<outlet property="siteTable" destination="xvJ-5c-vDp" id="ClP-j8-DyI"/>
|
||||||
|
<outlet property="sitesController" destination="mcS-ik-b0n" id="cdF-BL-lfg"/>
|
||||||
<outlet property="window" destination="QvC-M9-y7g" id="dPy-F3-9rn"/>
|
<outlet property="window" destination="QvC-M9-y7g" id="dPy-F3-9rn"/>
|
||||||
</connections>
|
</connections>
|
||||||
</customObject>
|
</customObject>
|
||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
<window title="Master Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hasShadow="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MPPasswordWindow">
|
<window title="Master Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hasShadow="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="QvC-M9-y7g" customClass="MPPasswordWindow">
|
||||||
<windowCollectionBehavior key="collectionBehavior" transient="YES" ignoresCycle="YES" fullScreenAuxiliary="YES"/>
|
<windowCollectionBehavior key="collectionBehavior" transient="YES" ignoresCycle="YES" fullScreenAuxiliary="YES"/>
|
||||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" bottomStrut="YES"/>
|
<windowPositionMask key="initialPositionMask" leftStrut="YES" bottomStrut="YES"/>
|
||||||
@@ -32,18 +32,24 @@
|
|||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Bwc-sd-6gm" userLabel="Screen Capture">
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Bwc-sd-6gm" userLabel="Screen Capture">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="640" height="560"/>
|
<rect key="frame" x="-80" y="-80" width="800" height="720"/>
|
||||||
<contentFilters>
|
<contentFilters>
|
||||||
<ciFilter name="CIGaussianBlur">
|
<ciFilter name="CIGaussianBlur">
|
||||||
<configuration>
|
<configuration>
|
||||||
<null key="inputImage"/>
|
<null key="inputImage"/>
|
||||||
<real key="inputRadius" value="40"/>
|
<real key="inputRadius" value="30"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
</ciFilter>
|
</ciFilter>
|
||||||
<ciFilter name="CISepiaTone">
|
<ciFilter name="CISepiaTone">
|
||||||
<configuration>
|
<configuration>
|
||||||
<null key="inputImage"/>
|
<null key="inputImage"/>
|
||||||
<real key="inputIntensity" value="0.40000000000000002"/>
|
<real key="inputIntensity" value="0.20000000000000001"/>
|
||||||
|
</configuration>
|
||||||
|
</ciFilter>
|
||||||
|
<ciFilter name="CIExposureAdjust">
|
||||||
|
<configuration>
|
||||||
|
<real key="inputEV" value="0.0"/>
|
||||||
|
<null key="inputImage"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
</ciFilter>
|
</ciFilter>
|
||||||
</contentFilters>
|
</contentFilters>
|
||||||
@@ -51,13 +57,13 @@
|
|||||||
</imageView>
|
</imageView>
|
||||||
<secureTextField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iGR-wo-ual" userLabel="Secure Master Password">
|
<secureTextField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iGR-wo-ual" userLabel="Secure Master Password">
|
||||||
<rect key="frame" x="18" y="258" width="604" height="44"/>
|
<rect key="frame" x="18" y="258" width="604" height="44"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" focusRingType="none" alignment="center" usesSingleLineMode="YES" id="NcX-1Z-2OC">
|
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" focusRingType="none" alignment="center" usesSingleLineMode="YES" id="NcX-1Z-2OC">
|
||||||
<font key="font" metaFont="system" size="36"/>
|
<font key="font" metaFont="system" size="36"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
<allowedInputSourceLocales>
|
<allowedInputSourceLocales>
|
||||||
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
|
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
|
||||||
@@ -86,13 +92,13 @@
|
|||||||
</secureTextField>
|
</secureTextField>
|
||||||
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="v80-wd-hUR" userLabel="Reveal Master Password">
|
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="v80-wd-hUR" userLabel="Reveal Master Password">
|
||||||
<rect key="frame" x="18" y="258" width="604" height="44"/>
|
<rect key="frame" x="18" y="258" width="604" height="44"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" state="on" focusRingType="none" alignment="center" placeholderString="" usesSingleLineMode="YES" id="gRw-5C-YUN">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" state="on" focusRingType="none" alignment="center" placeholderString="" usesSingleLineMode="YES" id="gRw-5C-YUN">
|
||||||
<font key="font" metaFont="system" size="36"/>
|
<font key="font" metaFont="system" size="36"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||||
<allowedInputSourceLocales>
|
<allowedInputSourceLocales>
|
||||||
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
|
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
|
||||||
@@ -123,11 +129,11 @@
|
|||||||
<outlet property="delegate" destination="-2" id="2nK-Rc-uyR"/>
|
<outlet property="delegate" destination="-2" id="2nK-Rc-uyR"/>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="R46-fx-n14" userLabel="Reset Master Password">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="R46-fx-n14" userLabel="Reset Button">
|
||||||
<rect key="frame" x="242" y="19" width="156" height="20"/>
|
<rect key="frame" x="230" y="19" width="181" height="19"/>
|
||||||
<buttonCell key="cell" type="inline" title="Reset My Master Password" bezelStyle="inline" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="B7Z-72-fVP">
|
<buttonCell key="cell" type="recessed" title="Reset My Master Password" bezelStyle="recessed" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="B7Z-72-fVP" customClass="MPNoStateButtonCell">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
|
||||||
<font key="font" size="11" name="HelveticaNeue-Bold"/>
|
<font key="font" metaFont="systemBold" size="12"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="resetMasterPassword:" target="-2" id="kCy-X0-teH"/>
|
<action selector="resetMasterPassword:" target="-2" id="kCy-X0-teH"/>
|
||||||
@@ -144,11 +150,10 @@
|
|||||||
<rect key="frame" x="0.0" y="0.0" width="512" height="147"/>
|
<rect key="frame" x="0.0" y="0.0" width="512" height="147"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" selectionHighlightStyle="sourceList" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="33" rowSizeStyle="automatic" viewBased="YES" floatsGroupRows="NO" id="xvJ-5c-vDp" customClass="MPSitesTableView">
|
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="33" rowSizeStyle="automatic" viewBased="YES" floatsGroupRows="NO" id="xvJ-5c-vDp" customClass="MPSitesTableView">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="515" height="147"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<size key="intercellSpacing" width="3" height="2"/>
|
<size key="intercellSpacing" width="3" height="2"/>
|
||||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/>
|
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="deviceWhite"/>
|
||||||
<color key="gridColor" name="selectedControlColor" catalog="System" colorSpace="catalog"/>
|
<color key="gridColor" name="selectedControlColor" catalog="System" colorSpace="catalog"/>
|
||||||
<tableColumns>
|
<tableColumns>
|
||||||
<tableColumn editable="NO" width="512" minWidth="512" maxWidth="512" id="S71-gk-yF7">
|
<tableColumn editable="NO" width="512" minWidth="512" maxWidth="512" id="S71-gk-yF7">
|
||||||
@@ -170,17 +175,17 @@
|
|||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="ydd-Rv-tra">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="ydd-Rv-tra">
|
||||||
<rect key="frame" x="-2" y="2" width="516" height="29"/>
|
<rect key="frame" x="-2" y="2" width="516" height="29"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="0.80000000000000004" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="0.80000000000000004" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" alignment="center" title="apple.com" id="o0g-Zv-pH4">
|
<textFieldCell key="cell" lineBreakMode="truncatingTail" alignment="center" title="apple.com" id="o0g-Zv-pH4">
|
||||||
<font key="font" size="24" name="HelveticaNeue-Thin"/>
|
<font key="font" size="24" name="HelveticaNeue-Thin"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="alternateSelectedControlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
<binding destination="xQb-o5-M5U" name="value" keyPath="objectValue.siteName" id="CZi-gD-5Ec">
|
<binding destination="xQb-o5-M5U" name="value" keyPath="objectValue.displayedName" id="CZi-gD-5Ec">
|
||||||
<dictionary key="options">
|
<dictionary key="options">
|
||||||
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
|
<bool key="NSContinuouslyUpdatesValue" value="YES"/>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
@@ -195,11 +200,10 @@
|
|||||||
<constraint firstItem="ydd-Rv-tra" firstAttribute="top" secondItem="xQb-o5-M5U" secondAttribute="top" constant="2" id="eZT-Sd-wW5"/>
|
<constraint firstItem="ydd-Rv-tra" firstAttribute="top" secondItem="xQb-o5-M5U" secondAttribute="top" constant="2" id="eZT-Sd-wW5"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<backgroundFilters>
|
<backgroundFilters>
|
||||||
<ciFilter name="CIGloom">
|
<ciFilter name="CIGaussianBlur">
|
||||||
<configuration>
|
<configuration>
|
||||||
<null key="inputImage"/>
|
<null key="inputImage"/>
|
||||||
<real key="inputIntensity" value="1"/>
|
<real key="inputRadius" value="20"/>
|
||||||
<real key="inputRadius" value="10"/>
|
|
||||||
</configuration>
|
</configuration>
|
||||||
</ciFilter>
|
</ciFilter>
|
||||||
</backgroundFilters>
|
</backgroundFilters>
|
||||||
@@ -237,13 +241,13 @@
|
|||||||
</scrollView>
|
</scrollView>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OnR-s6-d4P" userLabel="Input Label">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OnR-s6-d4P" userLabel="Input Label">
|
||||||
<rect key="frame" x="209" y="310" width="223" height="20"/>
|
<rect key="frame" x="209" y="310" width="223" height="20"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="calibratedRGB"/>
|
<color key="color" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="calibratedRGB"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Maarten Billemont's password for:" id="1Lb-d0-fQD">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Maarten Billemont's password for:" id="1Lb-d0-fQD">
|
||||||
<font key="font" size="14" name="HelveticaNeue"/>
|
<font key="font" size="14" name="HelveticaNeue"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
@@ -252,14 +256,14 @@
|
|||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="512" id="rW7-Vq-4Xy"/>
|
<constraint firstAttribute="width" constant="512" id="rW7-Vq-4Xy"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="calibratedRGB"/>
|
<color key="color" red="0.0" green="0.0" blue="0.0" alpha="0.80000000000000004" colorSpace="calibratedRGB"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<searchFieldCell key="cell" selectable="YES" editable="YES" focusRingType="none" alignment="center" placeholderString="Site Name" sendsSearchStringImmediately="YES" id="ppl-2c-1E9">
|
<searchFieldCell key="cell" selectable="YES" editable="YES" focusRingType="none" alignment="center" placeholderString="Site Name" sendsSearchStringImmediately="YES" id="ppl-2c-1E9">
|
||||||
<font key="font" size="36" name="HelveticaNeue-Thin"/>
|
<font key="font" size="36" name="HelveticaNeue-Thin"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="0.0" colorSpace="calibratedRGB"/>
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
</searchFieldCell>
|
</searchFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="doSearchSites:" target="-2" id="NJO-iR-OXt"/>
|
<action selector="doSearchSites:" target="-2" id="NJO-iR-OXt"/>
|
||||||
@@ -268,10 +272,10 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</searchField>
|
</searchField>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vES-W5-m4x" userLabel="Type Button">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vES-W5-m4x" userLabel="Type Button">
|
||||||
<rect key="frame" x="253" y="19" width="135" height="20"/>
|
<rect key="frame" x="242" y="19" width="157" height="19"/>
|
||||||
<buttonCell key="cell" type="inline" title="Change Password Type" bezelStyle="inline" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Fom-sN-EtZ">
|
<buttonCell key="cell" type="recessed" title="Change Password Type" bezelStyle="recessed" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Fom-sN-EtZ" customClass="MPNoStateButtonCell">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
|
||||||
<font key="font" size="11" name="HelveticaNeue-Bold"/>
|
<font key="font" metaFont="systemBold" size="12"/>
|
||||||
<string key="keyEquivalent">t</string>
|
<string key="keyEquivalent">t</string>
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
@@ -285,7 +289,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="d3u-Ze-9uf" userLabel="Counter Container">
|
<customView translatesAutoresizingMaskIntoConstraints="NO" id="d3u-Ze-9uf" userLabel="Counter Container">
|
||||||
<rect key="frame" x="306" y="47" width="28" height="22"/>
|
<rect key="frame" x="306" y="46" width="28" height="22"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XgA-Vl-CKh" userLabel="Counter Stepper">
|
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XgA-Vl-CKh" userLabel="Counter Stepper">
|
||||||
<rect key="frame" x="-3" y="-3" width="19" height="27"/>
|
<rect key="frame" x="-3" y="-3" width="19" height="27"/>
|
||||||
@@ -296,13 +300,13 @@
|
|||||||
</stepper>
|
</stepper>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NvO-kt-eZ2" userLabel="Counter Field">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NvO-kt-eZ2" userLabel="Counter Field">
|
||||||
<rect key="frame" x="19" y="2" width="11" height="19"/>
|
<rect key="frame" x="19" y="2" width="11" height="19"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="1" id="dhQ-bJ-rn3">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="1" id="dhQ-bJ-rn3">
|
||||||
<font key="font" size="12" name="HelveticaNeue-Medium"/>
|
<font key="font" size="12" name="HelveticaNeue-Medium"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/>
|
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="calibratedRGB"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -338,10 +342,10 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</customView>
|
</customView>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1Qo-iG-CQt" userLabel="Login Button">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1Qo-iG-CQt" userLabel="Login Button">
|
||||||
<rect key="frame" x="149" y="19" width="96" height="20"/>
|
<rect key="frame" x="123" y="19" width="111" height="19"/>
|
||||||
<buttonCell key="cell" type="inline" title="Set Login Name" bezelStyle="inline" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="QFo-9y-aVe">
|
<buttonCell key="cell" type="recessed" title="Set Login Name" bezelStyle="recessed" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="QFo-9y-aVe" customClass="MPNoStateButtonCell">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
|
||||||
<font key="font" size="11" name="HelveticaNeue-Bold"/>
|
<font key="font" metaFont="systemBold" size="12"/>
|
||||||
<string key="keyEquivalent">l</string>
|
<string key="keyEquivalent">l</string>
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
@@ -352,7 +356,7 @@
|
|||||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</binding>
|
</binding>
|
||||||
<binding destination="mcS-ik-b0n" name="title" keyPath="selection.loginName" id="g1z-0F-hE9">
|
<binding destination="mcS-ik-b0n" name="title" keyPath="selection.loginName" id="uub-7k-XZ8">
|
||||||
<dictionary key="options">
|
<dictionary key="options">
|
||||||
<string key="NSNullPlaceholder">Set Login Name</string>
|
<string key="NSNullPlaceholder">Set Login Name</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
@@ -363,10 +367,10 @@
|
|||||||
<rect key="frame" x="312" y="524" width="16" height="16"/>
|
<rect key="frame" x="312" y="524" width="16" height="16"/>
|
||||||
</progressIndicator>
|
</progressIndicator>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XuF-Sp-6JD" userLabel="Delete Button">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XuF-Sp-6JD" userLabel="Delete Button">
|
||||||
<rect key="frame" x="396" y="19" width="70" height="20"/>
|
<rect key="frame" x="407" y="19" width="81" height="19"/>
|
||||||
<buttonCell key="cell" type="inline" title="Delete Site" bezelStyle="inline" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="26m-of-YMQ">
|
<buttonCell key="cell" type="recessed" title="Delete Site" bezelStyle="recessed" alignment="center" refusesFirstResponder="YES" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="26m-of-YMQ" customClass="MPNoStateButtonCell">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
|
||||||
<font key="font" size="11" name="HelveticaNeue-Bold"/>
|
<font key="font" metaFont="systemBold" size="12"/>
|
||||||
<string key="keyEquivalent">d</string>
|
<string key="keyEquivalent">d</string>
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
@@ -380,10 +384,10 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="brI-fg-Kav" userLabel="Password Button">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="brI-fg-Kav" userLabel="Password Button">
|
||||||
<rect key="frame" x="266" y="46" width="108" height="20"/>
|
<rect key="frame" x="258" y="45" width="125" height="19"/>
|
||||||
<buttonCell key="cell" type="inline" title="Change Password" bezelStyle="inline" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="FQu-fM-NWY">
|
<buttonCell key="cell" type="recessed" title="Change Password" bezelStyle="recessed" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="FQu-fM-NWY" customClass="MPNoStateButtonCell">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
|
||||||
<font key="font" size="11" name="HelveticaNeue-Bold"/>
|
<font key="font" metaFont="systemBold" size="12"/>
|
||||||
<string key="keyEquivalent">p</string>
|
<string key="keyEquivalent">p</string>
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
@@ -410,7 +414,7 @@
|
|||||||
<subviews>
|
<subviews>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XUV-zU-Y9c">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XUV-zU-Y9c">
|
||||||
<rect key="frame" x="298" y="41" width="4" height="97"/>
|
<rect key="frame" x="298" y="41" width="4" height="97"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
@@ -418,8 +422,8 @@
|
|||||||
<ciFilter name="CIGloom">
|
<ciFilter name="CIGloom">
|
||||||
<configuration>
|
<configuration>
|
||||||
<null key="inputImage"/>
|
<null key="inputImage"/>
|
||||||
<real key="inputIntensity" value="1"/>
|
<real key="inputIntensity" value="0.80000000000000004"/>
|
||||||
<real key="inputRadius" value="10"/>
|
<real key="inputRadius" value="8"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
</ciFilter>
|
</ciFilter>
|
||||||
</contentFilters>
|
</contentFilters>
|
||||||
@@ -434,18 +438,18 @@
|
|||||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</binding>
|
</binding>
|
||||||
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.contentDisplay" id="djg-i5-pwt"/>
|
<binding destination="mcS-ik-b0n" name="value" keyPath="selection.displayedContent" id="djg-i5-pwt"/>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ia6-7b-dFr">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ia6-7b-dFr">
|
||||||
<rect key="frame" x="114" y="82" width="372" height="14"/>
|
<rect key="frame" x="111" y="82" width="378" height="14"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="No password set. Click "Change Password" on the bottom to set one." id="eDQ-iz-97a">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="No password set. Click "Change Password" on the bottom to set one." id="eDQ-iz-97a">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -475,16 +479,21 @@
|
|||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OaQ-of-zmb">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OaQ-of-zmb">
|
||||||
<rect key="frame" x="39" y="142" width="522" height="23"/>
|
<rect key="frame" x="39" y="142" width="522" height="23"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Master Password generates passwords for your sites (and other things)." id="YyD-hd-wi3">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Master Password generates passwords for your sites (and other things)." id="YyD-hd-wi3">
|
||||||
<font key="font" size="16" name="HelveticaNeue"/>
|
<font key="font" size="16" name="HelveticaNeue"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
|
<binding destination="-2" name="hidden" keyPath="locked" id="I7S-x6-XZk">
|
||||||
|
<dictionary key="options">
|
||||||
|
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||||
|
</dictionary>
|
||||||
|
</binding>
|
||||||
<binding destination="-2" name="hidden2" keyPath="newUser" previousBinding="I7S-x6-XZk" id="HKK-Eu-1qV">
|
<binding destination="-2" name="hidden2" keyPath="newUser" previousBinding="I7S-x6-XZk" id="HKK-Eu-1qV">
|
||||||
<dictionary key="options">
|
<dictionary key="options">
|
||||||
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
||||||
@@ -494,16 +503,11 @@
|
|||||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</binding>
|
</binding>
|
||||||
<binding destination="-2" name="hidden" keyPath="locked" id="I7S-x6-XZk">
|
|
||||||
<dictionary key="options">
|
|
||||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
|
||||||
</dictionary>
|
|
||||||
</binding>
|
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sYt-eL-uwt">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sYt-eL-uwt">
|
||||||
<rect key="frame" x="46" y="44" width="508" height="90"/>
|
<rect key="frame" x="46" y="44" width="508" height="90"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
@@ -514,10 +518,15 @@
|
|||||||
— Your "site name" can be any name; we recommend the bare domain name (eg. apple.com).
|
— Your "site name" can be any name; we recommend the bare domain name (eg. apple.com).
|
||||||
— Make your new master password strong (eg. a short sentence) and tell *nobody*.
|
— Make your new master password strong (eg. a short sentence) and tell *nobody*.
|
||||||
— Share your site's password instead. You can change it if necessary.</string>
|
— Share your site's password instead. You can change it if necessary.</string>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
|
<binding destination="-2" name="hidden" keyPath="locked" id="yDL-cR-bDf">
|
||||||
|
<dictionary key="options">
|
||||||
|
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||||
|
</dictionary>
|
||||||
|
</binding>
|
||||||
<binding destination="-2" name="hidden2" keyPath="newUser" previousBinding="yDL-cR-bDf" id="fus-M7-S1J">
|
<binding destination="-2" name="hidden2" keyPath="newUser" previousBinding="yDL-cR-bDf" id="fus-M7-S1J">
|
||||||
<dictionary key="options">
|
<dictionary key="options">
|
||||||
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
||||||
@@ -527,11 +536,6 @@
|
|||||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
</binding>
|
</binding>
|
||||||
<binding destination="-2" name="hidden" keyPath="locked" id="yDL-cR-bDf">
|
|
||||||
<dictionary key="options">
|
|
||||||
<string key="NSValueTransformerName">NSNegateBoolean</string>
|
|
||||||
</dictionary>
|
|
||||||
</binding>
|
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
</subviews>
|
</subviews>
|
||||||
@@ -546,15 +550,15 @@
|
|||||||
<constraint firstAttribute="centerY" secondItem="sYt-eL-uwt" secondAttribute="centerY" id="zLS-QG-MKS"/>
|
<constraint firstAttribute="centerY" secondItem="sYt-eL-uwt" secondAttribute="centerY" id="zLS-QG-MKS"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</customView>
|
</customView>
|
||||||
<textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="npC-Kk-gUM">
|
<textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="npC-Kk-gUM">
|
||||||
<rect key="frame" x="140" y="235" width="359" height="15"/>
|
<rect key="frame" x="101" y="235" width="438" height="15"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="0.69999999999999996" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="0.69999999999999996" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Type the name of your site (eg. apple.com), then hit enter ⏎ to create a password for it." id="QTI-cz-Onx">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Type the name of your site (eg. apple.com), then hit enter ⏎ to create a password for it." id="QTI-cz-Onx">
|
||||||
<font key="font" size="11" name="HelveticaNeue"/>
|
<font key="font" size="11" name="HelveticaNeue"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -571,13 +575,13 @@
|
|||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rhm-sC-xFS">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rhm-sC-xFS">
|
||||||
<rect key="frame" x="37" y="235" width="566" height="15"/>
|
<rect key="frame" x="37" y="235" width="566" height="15"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="0.80000000000000004" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="0.80000000000000004" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Hit enter ⏎ to copy the password, then paste it using ⌘V. Use the arrows ⇅ to navigate the list or esc ⎋ to exit." id="n3W-XU-dya">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Hit enter ⏎ to copy the password, then paste it using ⌘V. Use the arrows ⇅ to navigate the list or esc ⎋ to exit." id="n3W-XU-dya">
|
||||||
<font key="font" size="11" name="HelveticaNeue"/>
|
<font key="font" size="11" name="HelveticaNeue"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -595,13 +599,13 @@
|
|||||||
</textField>
|
</textField>
|
||||||
<textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lW3-2z-cEa">
|
<textField hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lW3-2z-cEa">
|
||||||
<rect key="frame" x="190" y="235" width="260" height="15"/>
|
<rect key="frame" x="190" y="235" width="260" height="15"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="0.70000000000000007" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="0.70000000000000007" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Hold alt ⌥ to temporarily reveal what you've typed." id="4Ep-xX-Ky8">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="Hold alt ⌥ to temporarily reveal what you've typed." id="4Ep-xX-Ky8">
|
||||||
<font key="font" size="11" name="HelveticaNeue"/>
|
<font key="font" size="11" name="HelveticaNeue"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -612,7 +616,7 @@
|
|||||||
</binding>
|
</binding>
|
||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="Aue-Zx-6Mf">
|
<button translatesAutoresizingMaskIntoConstraints="NO" id="Aue-Zx-6Mf" userLabel="Settings Button">
|
||||||
<rect key="frame" x="588" y="508" width="32" height="32"/>
|
<rect key="frame" x="588" y="508" width="32" height="32"/>
|
||||||
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="icon_gear" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="i8r-9N-vcQ">
|
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="icon_gear" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="i8r-9N-vcQ">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
@@ -625,14 +629,14 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qal-PP-YtO">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qal-PP-YtO">
|
||||||
<rect key="frame" x="420" y="1" width="23" height="15"/>
|
<rect key="frame" x="436" y="1" width="23" height="15"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘D" id="PPC-be-w4E">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘D" id="PPC-be-w4E">
|
||||||
<font key="font" size="11" name="HelveticaNeue"/>
|
<font key="font" size="11" name="HelveticaNeue"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -654,13 +658,13 @@
|
|||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9b3-wy-KBb">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9b3-wy-KBb">
|
||||||
<rect key="frame" x="309" y="2" width="22" height="14"/>
|
<rect key="frame" x="309" y="2" width="22" height="14"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘T" id="HFM-Bk-akx">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘T" id="HFM-Bk-akx">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -681,14 +685,14 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ido-NQ-3MY">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ido-NQ-3MY">
|
||||||
<rect key="frame" x="186" y="1" width="22" height="15"/>
|
<rect key="frame" x="167" y="1" width="22" height="15"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘L" id="fUB-rF-7x8">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘L" id="fUB-rF-7x8">
|
||||||
<font key="font" size="11" name="HelveticaNeue"/>
|
<font key="font" size="11" name="HelveticaNeue"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -709,14 +713,14 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uol-dE-I8H">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uol-dE-I8H">
|
||||||
<rect key="frame" x="309" y="70" width="22" height="14"/>
|
<rect key="frame" x="309" y="68" width="23" height="14"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘P" id="MyN-x6-dMk">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘P" id="MyN-x6-dMk">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -746,14 +750,14 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UpZ-rb-NXd">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UpZ-rb-NXd">
|
||||||
<rect key="frame" x="242" y="70" width="157" height="14"/>
|
<rect key="frame" x="241" y="68" width="158" height="14"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Click here to set a password:" id="gjc-Fw-xa1">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Click here to set a password:" id="gjc-Fw-xa1">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -788,13 +792,13 @@
|
|||||||
</textField>
|
</textField>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gAU-xs-aae">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gAU-xs-aae">
|
||||||
<rect key="frame" x="595" y="490" width="19" height="14"/>
|
<rect key="frame" x="595" y="490" width="19" height="14"/>
|
||||||
<shadow key="shadow" blurRadius="1">
|
<shadow key="shadow" blurRadius="0.5">
|
||||||
<size key="offset" width="0.0" height="1"/>
|
<size key="offset" width="0.0" height="1"/>
|
||||||
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="color" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
</shadow>
|
</shadow>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘," id="Xm1-qb-6EP">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="⌘," id="Xm1-qb-6EP">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<color key="textColor" name="highlightColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -810,7 +814,7 @@
|
|||||||
<constraint firstItem="v80-wd-hUR" firstAttribute="top" secondItem="iGR-wo-ual" secondAttribute="top" id="1iV-OU-5Ay"/>
|
<constraint firstItem="v80-wd-hUR" firstAttribute="top" secondItem="iGR-wo-ual" secondAttribute="top" id="1iV-OU-5Ay"/>
|
||||||
<constraint firstItem="brI-fg-Kav" firstAttribute="centerX" secondItem="vES-W5-m4x" secondAttribute="centerX" id="1tN-p4-2m4"/>
|
<constraint firstItem="brI-fg-Kav" firstAttribute="centerX" secondItem="vES-W5-m4x" secondAttribute="centerX" id="1tN-p4-2m4"/>
|
||||||
<constraint firstItem="Ido-NQ-3MY" firstAttribute="top" secondItem="1Qo-iG-CQt" secondAttribute="bottom" constant="4" id="3MM-M7-OKF"/>
|
<constraint firstItem="Ido-NQ-3MY" firstAttribute="top" secondItem="1Qo-iG-CQt" secondAttribute="bottom" constant="4" id="3MM-M7-OKF"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="Bwc-sd-6gm" secondAttribute="bottom" id="3fF-7g-c6C"/>
|
<constraint firstAttribute="bottom" secondItem="Bwc-sd-6gm" secondAttribute="bottom" constant="-80" id="3fF-7g-c6C"/>
|
||||||
<constraint firstItem="XuF-Sp-6JD" firstAttribute="centerX" secondItem="qal-PP-YtO" secondAttribute="centerX" id="7mj-3B-j0X"/>
|
<constraint firstItem="XuF-Sp-6JD" firstAttribute="centerX" secondItem="qal-PP-YtO" secondAttribute="centerX" id="7mj-3B-j0X"/>
|
||||||
<constraint firstItem="NGk-Io-Buc" firstAttribute="top" secondItem="oSh-Ec-8Nf" secondAttribute="bottom" constant="8" symbolic="YES" id="8AC-MT-cz4"/>
|
<constraint firstItem="NGk-Io-Buc" firstAttribute="top" secondItem="oSh-Ec-8Nf" secondAttribute="bottom" constant="8" symbolic="YES" id="8AC-MT-cz4"/>
|
||||||
<constraint firstItem="vES-W5-m4x" firstAttribute="centerX" secondItem="CnS-iI-dhr" secondAttribute="centerX" id="92S-HP-Vk7"/>
|
<constraint firstItem="vES-W5-m4x" firstAttribute="centerX" secondItem="CnS-iI-dhr" secondAttribute="centerX" id="92S-HP-Vk7"/>
|
||||||
@@ -822,7 +826,7 @@
|
|||||||
<constraint firstAttribute="centerY" secondItem="iGR-wo-ual" secondAttribute="centerY" id="GZE-mX-kjj"/>
|
<constraint firstAttribute="centerY" secondItem="iGR-wo-ual" secondAttribute="centerY" id="GZE-mX-kjj"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="CnS-iI-dhr" secondAttribute="centerY" id="HjG-vb-3Qg"/>
|
<constraint firstAttribute="centerY" secondItem="CnS-iI-dhr" secondAttribute="centerY" id="HjG-vb-3Qg"/>
|
||||||
<constraint firstItem="iGR-wo-ual" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" symbolic="YES" id="KNz-B2-qfi"/>
|
<constraint firstItem="iGR-wo-ual" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" symbolic="YES" id="KNz-B2-qfi"/>
|
||||||
<constraint firstItem="Bwc-sd-6gm" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" id="Kqb-ig-5cP"/>
|
<constraint firstItem="Bwc-sd-6gm" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="-80" id="Kqb-ig-5cP"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="iGR-wo-ual" secondAttribute="trailing" constant="20" symbolic="YES" id="LW8-vu-scs"/>
|
<constraint firstAttribute="trailing" secondItem="iGR-wo-ual" secondAttribute="trailing" constant="20" symbolic="YES" id="LW8-vu-scs"/>
|
||||||
<constraint firstItem="Aue-Zx-6Mf" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" symbolic="YES" id="Lts-go-pIX"/>
|
<constraint firstItem="Aue-Zx-6Mf" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" symbolic="YES" id="Lts-go-pIX"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="Bme-XK-MMc" secondAttribute="bottom" constant="80" id="MbE-Oa-J9k"/>
|
<constraint firstAttribute="bottom" secondItem="Bme-XK-MMc" secondAttribute="bottom" constant="80" id="MbE-Oa-J9k"/>
|
||||||
@@ -845,7 +849,7 @@
|
|||||||
<constraint firstItem="OnR-s6-d4P" firstAttribute="top" secondItem="NGk-Io-Buc" secondAttribute="bottom" constant="8" symbolic="YES" id="dr2-eR-Yup"/>
|
<constraint firstItem="OnR-s6-d4P" firstAttribute="top" secondItem="NGk-Io-Buc" secondAttribute="bottom" constant="8" symbolic="YES" id="dr2-eR-Yup"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="vES-W5-m4x" secondAttribute="bottom" constant="20" symbolic="YES" id="eHI-Tn-bYD"/>
|
<constraint firstAttribute="bottom" secondItem="vES-W5-m4x" secondAttribute="bottom" constant="20" symbolic="YES" id="eHI-Tn-bYD"/>
|
||||||
<constraint firstItem="rhm-sC-xFS" firstAttribute="top" secondItem="CnS-iI-dhr" secondAttribute="bottom" constant="8" symbolic="YES" id="f1g-ug-BVL"/>
|
<constraint firstItem="rhm-sC-xFS" firstAttribute="top" secondItem="CnS-iI-dhr" secondAttribute="bottom" constant="8" symbolic="YES" id="f1g-ug-BVL"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="Bwc-sd-6gm" secondAttribute="trailing" id="gKu-JH-NDR"/>
|
<constraint firstAttribute="trailing" secondItem="Bwc-sd-6gm" secondAttribute="trailing" constant="-80" id="gKu-JH-NDR"/>
|
||||||
<constraint firstItem="CnS-iI-dhr" firstAttribute="centerX" secondItem="rhm-sC-xFS" secondAttribute="centerX" id="gmg-aZ-1Si"/>
|
<constraint firstItem="CnS-iI-dhr" firstAttribute="centerX" secondItem="rhm-sC-xFS" secondAttribute="centerX" id="gmg-aZ-1Si"/>
|
||||||
<constraint firstItem="Bme-XK-MMc" firstAttribute="top" secondItem="rhm-sC-xFS" secondAttribute="bottom" constant="8" symbolic="YES" id="gsL-Ww-yLa"/>
|
<constraint firstItem="Bme-XK-MMc" firstAttribute="top" secondItem="rhm-sC-xFS" secondAttribute="bottom" constant="8" symbolic="YES" id="gsL-Ww-yLa"/>
|
||||||
<constraint firstItem="9b3-wy-KBb" firstAttribute="top" secondItem="vES-W5-m4x" secondAttribute="bottom" constant="4" id="hKa-2u-uL3"/>
|
<constraint firstItem="9b3-wy-KBb" firstAttribute="top" secondItem="vES-W5-m4x" secondAttribute="bottom" constant="4" id="hKa-2u-uL3"/>
|
||||||
@@ -858,7 +862,7 @@
|
|||||||
<constraint firstItem="vES-W5-m4x" firstAttribute="top" secondItem="brI-fg-Kav" secondAttribute="bottom" constant="8" symbolic="YES" id="rCP-oh-rWr"/>
|
<constraint firstItem="vES-W5-m4x" firstAttribute="top" secondItem="brI-fg-Kav" secondAttribute="bottom" constant="8" symbolic="YES" id="rCP-oh-rWr"/>
|
||||||
<constraint firstItem="v80-wd-hUR" firstAttribute="trailing" secondItem="iGR-wo-ual" secondAttribute="trailing" id="rIx-cQ-PNt"/>
|
<constraint firstItem="v80-wd-hUR" firstAttribute="trailing" secondItem="iGR-wo-ual" secondAttribute="trailing" id="rIx-cQ-PNt"/>
|
||||||
<constraint firstItem="brI-fg-Kav" firstAttribute="centerX" secondItem="uol-dE-I8H" secondAttribute="centerX" id="s5w-Nc-YJY"/>
|
<constraint firstItem="brI-fg-Kav" firstAttribute="centerX" secondItem="uol-dE-I8H" secondAttribute="centerX" id="s5w-Nc-YJY"/>
|
||||||
<constraint firstItem="Bwc-sd-6gm" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" id="tea-fv-b1S"/>
|
<constraint firstItem="Bwc-sd-6gm" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="-80" id="tea-fv-b1S"/>
|
||||||
<constraint firstItem="lW3-2z-cEa" firstAttribute="centerX" secondItem="iGR-wo-ual" secondAttribute="centerX" id="vML-2u-shw"/>
|
<constraint firstItem="lW3-2z-cEa" firstAttribute="centerX" secondItem="iGR-wo-ual" secondAttribute="centerX" id="vML-2u-shw"/>
|
||||||
<constraint firstItem="v80-wd-hUR" firstAttribute="bottom" secondItem="iGR-wo-ual" secondAttribute="bottom" id="xiX-8e-pNR"/>
|
<constraint firstItem="v80-wd-hUR" firstAttribute="bottom" secondItem="iGR-wo-ual" secondAttribute="bottom" id="xiX-8e-pNR"/>
|
||||||
<constraint firstItem="v80-wd-hUR" firstAttribute="leading" secondItem="iGR-wo-ual" secondAttribute="leading" id="yVZ-Ar-5ov"/>
|
<constraint firstItem="v80-wd-hUR" firstAttribute="leading" secondItem="iGR-wo-ual" secondAttribute="leading" id="yVZ-Ar-5ov"/>
|
||||||
@@ -867,6 +871,7 @@
|
|||||||
</constraints>
|
</constraints>
|
||||||
<animations/>
|
<animations/>
|
||||||
</view>
|
</view>
|
||||||
|
<point key="canvasLocation" x="-267" y="279"/>
|
||||||
</window>
|
</window>
|
||||||
<userDefaultsController representsSharedInstance="YES" id="yy2-3W-Ocj"/>
|
<userDefaultsController representsSharedInstance="YES" id="yy2-3W-Ocj"/>
|
||||||
<arrayController objectClassName="MPSiteModel" id="mcS-ik-b0n">
|
<arrayController objectClassName="MPSiteModel" id="mcS-ik-b0n">
|
||||||
|
|||||||
@@ -17,15 +17,17 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
#import "MPSiteEntity.h"
|
||||||
@class MPSiteEntity;
|
@class MPSiteEntity;
|
||||||
|
|
||||||
@interface MPSiteModel : NSObject
|
@interface MPSiteModel : NSObject
|
||||||
|
|
||||||
@property (nonatomic) NSString *siteName;
|
@property (nonatomic) NSString *name;
|
||||||
|
@property (nonatomic) NSAttributedString *displayedName;
|
||||||
@property (nonatomic) MPSiteType type;
|
@property (nonatomic) MPSiteType type;
|
||||||
@property (nonatomic) NSString *typeName;
|
@property (nonatomic) NSString *typeName;
|
||||||
@property (nonatomic) NSString *content;
|
@property (nonatomic) NSString *content;
|
||||||
@property (nonatomic) NSString *contentDisplay;
|
@property (nonatomic) NSString *displayedContent;
|
||||||
@property (nonatomic) NSString *loginName;
|
@property (nonatomic) NSString *loginName;
|
||||||
@property (nonatomic) NSNumber *uses;
|
@property (nonatomic) NSNumber *uses;
|
||||||
@property (nonatomic) NSUInteger counter;
|
@property (nonatomic) NSUInteger counter;
|
||||||
@@ -34,7 +36,7 @@
|
|||||||
@property (nonatomic) BOOL generated;
|
@property (nonatomic) BOOL generated;
|
||||||
@property (nonatomic) BOOL stored;
|
@property (nonatomic) BOOL stored;
|
||||||
|
|
||||||
- (id)initWithEntity:(MPSiteEntity *)entity;
|
- (instancetype)initWithEntity:(MPSiteEntity *)entity fuzzyGroups:(NSArray *)fuzzyGroups;
|
||||||
- (MPSiteEntity *)entityInContext:(NSManagedObjectContext *)moc;
|
- (MPSiteEntity *)entityInContext:(NSManagedObjectContext *)moc;
|
||||||
|
|
||||||
- (void)updateContent;
|
- (void)updateContent;
|
||||||
|
|||||||
@@ -28,27 +28,42 @@
|
|||||||
BOOL _initialized;
|
BOOL _initialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (id)initWithEntity:(MPSiteEntity *)entity {
|
- (id)initWithEntity:(MPSiteEntity *)entity fuzzyGroups:(NSArray *)fuzzyGroups {
|
||||||
|
|
||||||
if (!(self = [super init]))
|
if (!(self = [super init]))
|
||||||
return nil;
|
return nil;
|
||||||
|
|
||||||
[self setEntity:entity];
|
[self setEntity:entity fuzzyGroups:fuzzyGroups];
|
||||||
_initialized = YES;
|
_initialized = YES;
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setEntity:(MPSiteEntity *)entity {
|
- (void)setEntity:(MPSiteEntity *)entity fuzzyGroups:(NSArray *)fuzzyGroups {
|
||||||
|
|
||||||
if ([_entityOID isEqual:entity.objectID])
|
if ([_entityOID isEqual:entity.objectID])
|
||||||
return;
|
return;
|
||||||
_entityOID = entity.objectID;
|
_entityOID = entity.objectID;
|
||||||
|
|
||||||
|
NSString *siteName = entity.name;
|
||||||
|
NSMutableAttributedString *attributedSiteName = [[NSMutableAttributedString alloc] initWithString:siteName];
|
||||||
|
for (NSUInteger f = 0, s = (NSUInteger)-1; f < [fuzzyGroups count]; ++f) {
|
||||||
|
s = [siteName rangeOfString:fuzzyGroups[f] options:NSDiacriticInsensitiveSearch | NSCaseInsensitiveSearch
|
||||||
|
range:NSMakeRange( s + 1, [siteName length] - (s + 1) )].location;
|
||||||
|
if (s == NSNotFound)
|
||||||
|
break;
|
||||||
|
|
||||||
|
[attributedSiteName addAttribute:NSBackgroundColorAttributeName value:[NSColor alternateSelectedControlColor]
|
||||||
|
range:NSMakeRange( s, [fuzzyGroups[f] length] )];
|
||||||
|
}
|
||||||
|
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
|
||||||
|
paragraphStyle.alignment = NSCenterTextAlignment;
|
||||||
|
[attributedSiteName addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange( 0, [siteName length] )];
|
||||||
|
|
||||||
|
self.displayedName = attributedSiteName;
|
||||||
|
self.name = siteName;
|
||||||
self.algorithm = entity.algorithm;
|
self.algorithm = entity.algorithm;
|
||||||
self.siteName = entity.name;
|
|
||||||
self.lastUsed = entity.lastUsed;
|
self.lastUsed = entity.lastUsed;
|
||||||
self.loginName = entity.loginName;
|
|
||||||
self.type = entity.type;
|
self.type = entity.type;
|
||||||
self.typeName = entity.typeName;
|
self.typeName = entity.typeName;
|
||||||
self.uses = entity.uses_;
|
self.uses = entity.uses_;
|
||||||
@@ -124,7 +139,12 @@
|
|||||||
|
|
||||||
PearlMainQueue( ^{
|
PearlMainQueue( ^{
|
||||||
self.content = result;
|
self.content = result;
|
||||||
self.contentDisplay = displayResult;
|
self.displayedContent = displayResult;
|
||||||
|
} );
|
||||||
|
}];
|
||||||
|
[entity resolveLoginUsingKey:[MPAppDelegate_Shared get].key result:^(NSString *result) {
|
||||||
|
PearlMainQueue( ^{
|
||||||
|
self.loginName = result;
|
||||||
} );
|
} );
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,8 +39,6 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
<string>${EXECUTABLE_NAME}</string>
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string>MasterPassword</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>com.lyndir.lhunath.MasterPassword.Mac</string>
|
<string>com.lyndir.lhunath.MasterPassword.Mac</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
@@ -62,7 +60,7 @@
|
|||||||
<key>LSUIElement</key>
|
<key>LSUIElement</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>Copyright © 2011-2013 Lyndir. All rights reserved.</string>
|
<string>Copyright © 2011-2014 Lyndir</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
<string>MainMenu</string>
|
<string>MainMenu</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
|
|||||||
@@ -103,7 +103,7 @@
|
|||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
CLASSPREFIX = MP;
|
CLASSPREFIX = MP;
|
||||||
LastUpgradeCheck = 0510;
|
LastUpgradeCheck = 0610;
|
||||||
ORGANIZATIONNAME = "Maarten Billemont";
|
ORGANIZATIONNAME = "Maarten Billemont";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
DAD9B5C0176299B9001835F9 = {
|
DAD9B5C0176299B9001835F9 = {
|
||||||
@@ -209,6 +209,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "3rd Party Mac Developer Application";
|
CODE_SIGN_IDENTITY = "3rd Party Mac Developer Application";
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
INFOPLIST_FILE = "$(SRCROOT)/MasterPassword-Mac-LoginHelper/MasterPassword-Mac-LoginHelper-Info.plist";
|
INFOPLIST_FILE = "$(SRCROOT)/MasterPassword-Mac-LoginHelper/MasterPassword-Mac-LoginHelper-Info.plist";
|
||||||
|
PROVISIONING_PROFILE = "8ea8f441-a2d3-4119-ad85-f18953e17648";
|
||||||
};
|
};
|
||||||
name = "AppStore-Mac";
|
name = "AppStore-Mac";
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
93D390C676DF52DA7E459F19 /* MPPasswordWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D9D0061FF1159998F06 /* MPPasswordWindow.m */; };
|
93D390C676DF52DA7E459F19 /* MPPasswordWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D9D0061FF1159998F06 /* MPPasswordWindow.m */; };
|
||||||
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */; };
|
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */; };
|
||||||
93D394C4254EEB45FB335AFB /* MPSitesTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39423D7BF4FD31FE6D27C /* MPSitesTableView.m */; };
|
93D394C4254EEB45FB335AFB /* MPSitesTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39423D7BF4FD31FE6D27C /* MPSitesTableView.m */; };
|
||||||
|
93D395E4830290EBB6E71F34 /* MPNoStateButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39538C4CEFF46DF379254 /* MPNoStateButton.m */; };
|
||||||
93D395F08A087F8A24689347 /* NSArray+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */; };
|
93D395F08A087F8A24689347 /* NSArray+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */; };
|
||||||
93D3970BCF85F7902E611168 /* PearlProfiler.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39DB3A8ADED08C39A6228 /* PearlProfiler.m */; };
|
93D3970BCF85F7902E611168 /* PearlProfiler.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39DB3A8ADED08C39A6228 /* PearlProfiler.m */; };
|
||||||
93D39784E725A34D1EE3FB3B /* MPInitialWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D3CB30874147D9A9E1B /* MPInitialWindowController.m */; };
|
93D39784E725A34D1EE3FB3B /* MPInitialWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D3CB30874147D9A9E1B /* MPInitialWindowController.m */; };
|
||||||
@@ -22,13 +23,11 @@
|
|||||||
DA0933D01747B91B00DE1CEF /* appstore.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0933CF1747B91B00DE1CEF /* appstore.png */; };
|
DA0933D01747B91B00DE1CEF /* appstore.png in Resources */ = {isa = PBXBuildFile; fileRef = DA0933CF1747B91B00DE1CEF /* appstore.png */; };
|
||||||
DA10007F1998A4C6002B873F /* scrypt in Headers */ = {isa = PBXBuildFile; fileRef = DAE8E65619867AF500416A0F /* scrypt */; settings = {ATTRIBUTES = (Public, ); }; };
|
DA10007F1998A4C6002B873F /* scrypt in Headers */ = {isa = PBXBuildFile; fileRef = DAE8E65619867AF500416A0F /* scrypt */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
DA1000801998A4C6002B873F /* openssl in Headers */ = {isa = PBXBuildFile; fileRef = DAE8E65719867AF500416A0F /* openssl */; settings = {ATTRIBUTES = (Public, ); }; };
|
DA1000801998A4C6002B873F /* openssl in Headers */ = {isa = PBXBuildFile; fileRef = DAE8E65719867AF500416A0F /* openssl */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
DA16B33F170661D4000A0EAB /* libUbiquityStoreManager.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA4425CB1557BED40052177D /* libUbiquityStoreManager.a */; };
|
|
||||||
DA16B341170661DB000A0EAB /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA16B340170661DB000A0EAB /* Carbon.framework */; };
|
DA16B341170661DB000A0EAB /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA16B340170661DB000A0EAB /* Carbon.framework */; };
|
||||||
DA16B342170661E0000A0EAB /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC632871486D95D0075AEA5 /* Security.framework */; };
|
DA16B342170661E0000A0EAB /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC632871486D95D0075AEA5 /* Security.framework */; };
|
||||||
DA16B344170661EE000A0EAB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA16B343170661EE000A0EAB /* Cocoa.framework */; };
|
DA16B344170661EE000A0EAB /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA16B343170661EE000A0EAB /* Cocoa.framework */; };
|
||||||
DA16B345170661F2000A0EAB /* libPearl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC77CAD148291A600BCF976 /* libPearl.a */; };
|
DA16B345170661F2000A0EAB /* libPearl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC77CAD148291A600BCF976 /* libPearl.a */; };
|
||||||
DA2508F119511D3600AC23F1 /* MPPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DA2508F019511D3600AC23F1 /* MPPasswordWindowController.xib */; };
|
DA2508F119511D3600AC23F1 /* MPPasswordWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DA2508F019511D3600AC23F1 /* MPPasswordWindowController.xib */; };
|
||||||
DA2508F719513C1400AC23F1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA16B343170661EE000A0EAB /* Cocoa.framework */; };
|
|
||||||
DA250925195148E200AC23F1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEBC45214F6364500987BF6 /* QuartzCore.framework */; };
|
DA250925195148E200AC23F1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEBC45214F6364500987BF6 /* QuartzCore.framework */; };
|
||||||
DA29992C19C6A89900AF7DF1 /* MasterPassword.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DA29992619C6A89900AF7DF1 /* MasterPassword.xcdatamodeld */; };
|
DA29992C19C6A89900AF7DF1 /* MasterPassword.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = DA29992619C6A89900AF7DF1 /* MasterPassword.xcdatamodeld */; };
|
||||||
DA2CA4ED18D323D3007798F8 /* NSError+PearlFullDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4E718D323D3007798F8 /* NSError+PearlFullDescription.m */; };
|
DA2CA4ED18D323D3007798F8 /* NSError+PearlFullDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4E718D323D3007798F8 /* NSError+PearlFullDescription.m */; };
|
||||||
@@ -55,15 +54,15 @@
|
|||||||
DA3B8453190FC86F00246EEA /* NSManagedObject+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3B8451190FC86F00246EEA /* NSManagedObject+Pearl.h */; };
|
DA3B8453190FC86F00246EEA /* NSManagedObject+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3B8451190FC86F00246EEA /* NSManagedObject+Pearl.h */; };
|
||||||
DA3B8456190FC89700246EEA /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3B8454190FC89700246EEA /* MPFixable.m */; };
|
DA3B8456190FC89700246EEA /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3B8454190FC89700246EEA /* MPFixable.m */; };
|
||||||
DA3BCFCD19BD09E0006B2681 /* SourceCodePro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */; };
|
DA3BCFCD19BD09E0006B2681 /* SourceCodePro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */; };
|
||||||
DA4425CC1557BED40052177D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
|
||||||
DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC6326C148680650075AEA5 /* libjrswizzle.a */; };
|
DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC6326C148680650075AEA5 /* libjrswizzle.a */; };
|
||||||
|
DA5180CA19FF2F9200A587E9 /* MPAlgorithmV2.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */; };
|
||||||
|
DA5180CE19FF307E00A587E9 /* MPAppDelegate_Store.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5180CD19FF307E00A587E9 /* MPAppDelegate_Store.m */; };
|
||||||
DA5E5C9417248AA1003798D8 /* libscryptenc-osx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5E5C8717248AA1003798D8 /* libscryptenc-osx.a */; };
|
DA5E5C9417248AA1003798D8 /* libscryptenc-osx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5E5C8717248AA1003798D8 /* libscryptenc-osx.a */; };
|
||||||
DA5E5CF61724A667003798D8 /* MPAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5C981724A667003798D8 /* MPAlgorithm.m */; };
|
DA5E5CF61724A667003798D8 /* MPAlgorithm.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5C981724A667003798D8 /* MPAlgorithm.m */; };
|
||||||
DA5E5CF71724A667003798D8 /* MPAlgorithmV0.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5C9A1724A667003798D8 /* MPAlgorithmV0.m */; };
|
DA5E5CF71724A667003798D8 /* MPAlgorithmV0.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5C9A1724A667003798D8 /* MPAlgorithmV0.m */; };
|
||||||
DA5E5CF81724A667003798D8 /* MPAlgorithmV1.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5C9C1724A667003798D8 /* MPAlgorithmV1.m */; };
|
DA5E5CF81724A667003798D8 /* MPAlgorithmV1.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5C9C1724A667003798D8 /* MPAlgorithmV1.m */; };
|
||||||
DA5E5CF91724A667003798D8 /* MPAppDelegate_Key.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5C9E1724A667003798D8 /* MPAppDelegate_Key.m */; };
|
DA5E5CF91724A667003798D8 /* MPAppDelegate_Key.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5C9E1724A667003798D8 /* MPAppDelegate_Key.m */; };
|
||||||
DA5E5CFA1724A667003798D8 /* MPAppDelegate_Shared.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CA01724A667003798D8 /* MPAppDelegate_Shared.m */; };
|
DA5E5CFA1724A667003798D8 /* MPAppDelegate_Shared.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CA01724A667003798D8 /* MPAppDelegate_Shared.m */; };
|
||||||
DA5E5CFB1724A667003798D8 /* MPAppDelegate_Store.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CA21724A667003798D8 /* MPAppDelegate_Store.m */; };
|
|
||||||
DA5E5CFC1724A667003798D8 /* MPConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CA41724A667003798D8 /* MPConfig.m */; };
|
DA5E5CFC1724A667003798D8 /* MPConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CA41724A667003798D8 /* MPConfig.m */; };
|
||||||
DA5E5D001724A667003798D8 /* MPEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CAC1724A667003798D8 /* MPEntities.m */; };
|
DA5E5D001724A667003798D8 /* MPEntities.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CAC1724A667003798D8 /* MPEntities.m */; };
|
||||||
DA5E5D011724A667003798D8 /* MPKey.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CAE1724A667003798D8 /* MPKey.m */; };
|
DA5E5D011724A667003798D8 /* MPKey.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5E5CAE1724A667003798D8 /* MPKey.m */; };
|
||||||
@@ -80,15 +79,14 @@
|
|||||||
DA8ED896192906920099B726 /* PearlTween.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8ED892192906920099B726 /* PearlTween.h */; };
|
DA8ED896192906920099B726 /* PearlTween.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8ED892192906920099B726 /* PearlTween.h */; };
|
||||||
DA8ED897192906920099B726 /* map-macro.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8ED894192906920099B726 /* map-macro.h */; };
|
DA8ED897192906920099B726 /* map-macro.h in Headers */ = {isa = PBXBuildFile; fileRef = DA8ED894192906920099B726 /* map-macro.h */; };
|
||||||
DAAA81B0195A8D1300FA30D9 /* gradient.png in Resources */ = {isa = PBXBuildFile; fileRef = DAAA81AF195A8D1300FA30D9 /* gradient.png */; };
|
DAAA81B0195A8D1300FA30D9 /* gradient.png in Resources */ = {isa = PBXBuildFile; fileRef = DAAA81AF195A8D1300FA30D9 /* gradient.png */; };
|
||||||
DABC6C02175D8C85000C15D4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
DAADCC4719FAFFAD00987B1D /* NSNotificationCenter+PearlEasyCleanup.h in Headers */ = {isa = PBXBuildFile; fileRef = DAADCC3E19FAFFAD00987B1D /* NSNotificationCenter+PearlEasyCleanup.h */; };
|
||||||
DABC6C15175D8CE1000C15D4 /* RHStatusItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = DABC6C14175D8CE1000C15D4 /* RHStatusItemView.m */; };
|
DAADCC4819FAFFAD00987B1D /* NSPersistentStore+PearlMigration.h in Headers */ = {isa = PBXBuildFile; fileRef = DAADCC3F19FAFFAD00987B1D /* NSPersistentStore+PearlMigration.h */; };
|
||||||
DABC6C16175D8E3A000C15D4 /* libRHStatusItemView.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DABC6C01175D8C85000C15D4 /* libRHStatusItemView.a */; };
|
DAADCC4919FAFFAD00987B1D /* NSPersistentStore+PearlMigration.m in Sources */ = {isa = PBXBuildFile; fileRef = DAADCC4019FAFFAD00987B1D /* NSPersistentStore+PearlMigration.m */; };
|
||||||
|
DAADCC4B19FB000C00987B1D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAEBC45214F6364500987BF6 /* QuartzCore.framework */; };
|
||||||
|
DAADCC6919FB007F00987B1D /* NSManagedObjectModel+KCOrderedAccessorFix.m in Sources */ = {isa = PBXBuildFile; fileRef = DAADCC6719FB007F00987B1D /* NSManagedObjectModel+KCOrderedAccessorFix.m */; };
|
||||||
|
DAADCC6A19FB00B500987B1D /* libKCOrderedAccessorFix.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAADCC5019FB006500987B1D /* libKCOrderedAccessorFix.a */; };
|
||||||
DAC6326D148680650075AEA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
DAC6326D148680650075AEA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
||||||
DAC77CAE148291A600BCF976 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
DAC77CAE148291A600BCF976 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5BFA4A147E415C00F98B1E /* Foundation.framework */; };
|
||||||
DACA22BB1705DE7D002C6C22 /* UbiquityStoreManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DACA22B71705DE7D002C6C22 /* UbiquityStoreManager.m */; };
|
|
||||||
DACA22BC1705DE7D002C6C22 /* NSError+UbiquityStoreManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DACA22B81705DE7D002C6C22 /* NSError+UbiquityStoreManager.h */; };
|
|
||||||
DACA22BD1705DE7D002C6C22 /* NSError+UbiquityStoreManager.m in Sources */ = {isa = PBXBuildFile; fileRef = DACA22B91705DE7D002C6C22 /* NSError+UbiquityStoreManager.m */; };
|
|
||||||
DACA22BE1705DE7D002C6C22 /* UbiquityStoreManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DACA22BA1705DE7D002C6C22 /* UbiquityStoreManager.h */; };
|
|
||||||
DACA26FE1705DF81002C6C22 /* logo-bare.png in Resources */ = {isa = PBXBuildFile; fileRef = DACA241C1705DF7D002C6C22 /* logo-bare.png */; };
|
DACA26FE1705DF81002C6C22 /* logo-bare.png in Resources */ = {isa = PBXBuildFile; fileRef = DACA241C1705DF7D002C6C22 /* logo-bare.png */; };
|
||||||
DACA27121705DF81002C6C22 /* avatar-13@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DACA24321705DF7D002C6C22 /* avatar-13@2x.png */; };
|
DACA27121705DF81002C6C22 /* avatar-13@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DACA24321705DF7D002C6C22 /* avatar-13@2x.png */; };
|
||||||
DACA27131705DF81002C6C22 /* avatar-3@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DACA24331705DF7D002C6C22 /* avatar-3@2x.png */; };
|
DACA27131705DF81002C6C22 /* avatar-3@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DACA24331705DF7D002C6C22 /* avatar-3@2x.png */; };
|
||||||
@@ -213,6 +211,15 @@
|
|||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXCopyFilesBuildPhase section */
|
/* Begin PBXCopyFilesBuildPhase section */
|
||||||
|
DAADCC4E19FB006500987B1D /* CopyFiles */ = {
|
||||||
|
isa = PBXCopyFilesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
dstPath = "include/$(PRODUCT_NAME)";
|
||||||
|
dstSubfolderSpec = 16;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
DAD9B5EE1762CA3A001835F9 /* Copy LoginHelper */ = {
|
DAD9B5EE1762CA3A001835F9 /* Copy LoginHelper */ = {
|
||||||
isa = PBXCopyFilesBuildPhase;
|
isa = PBXCopyFilesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -229,11 +236,13 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Indexing.m"; sourceTree = "<group>"; };
|
93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Indexing.m"; sourceTree = "<group>"; };
|
||||||
93D39240B5143E01F0B75E96 /* MPSiteModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSiteModel.h; sourceTree = "<group>"; };
|
93D39240B5143E01F0B75E96 /* MPSiteModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSiteModel.h; sourceTree = "<group>"; };
|
||||||
|
93D392A4F3DE0BD758B9B056 /* MPNoStateButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPNoStateButton.h; sourceTree = "<group>"; };
|
||||||
93D392C3918763B3B72CF366 /* MPPasswordWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordWindowController.h; sourceTree = "<group>"; };
|
93D392C3918763B3B72CF366 /* MPPasswordWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordWindowController.h; sourceTree = "<group>"; };
|
||||||
93D39368EF3CBFEF2AFCA15A /* MPInitialWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPInitialWindowController.h; sourceTree = "<group>"; };
|
93D39368EF3CBFEF2AFCA15A /* MPInitialWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPInitialWindowController.h; sourceTree = "<group>"; };
|
||||||
93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Indexing.h"; sourceTree = "<group>"; };
|
93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Indexing.h"; sourceTree = "<group>"; };
|
||||||
93D39423D7BF4FD31FE6D27C /* MPSitesTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSitesTableView.m; sourceTree = "<group>"; };
|
93D39423D7BF4FD31FE6D27C /* MPSitesTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSitesTableView.m; sourceTree = "<group>"; };
|
||||||
93D394EEFF5BF555A55AF361 /* PearlProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PearlProfiler.h; path = ../../../External/Pearl/Pearl/PearlProfiler.h; sourceTree = "<group>"; };
|
93D394EEFF5BF555A55AF361 /* PearlProfiler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PearlProfiler.h; path = ../../../External/Pearl/Pearl/PearlProfiler.h; sourceTree = "<group>"; };
|
||||||
|
93D39538C4CEFF46DF379254 /* MPNoStateButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPNoStateButton.m; sourceTree = "<group>"; };
|
||||||
93D396D04E57792A54D437AC /* NSArray+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Indexing.h"; sourceTree = "<group>"; };
|
93D396D04E57792A54D437AC /* NSArray+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Indexing.h"; sourceTree = "<group>"; };
|
||||||
93D3977484534E99F9BA579D /* MPPasswordWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordWindow.h; sourceTree = "<group>"; };
|
93D3977484534E99F9BA579D /* MPPasswordWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordWindow.h; sourceTree = "<group>"; };
|
||||||
93D39A57A7823DE98A0FF83C /* MPPasswordWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordWindowController.m; sourceTree = "<group>"; };
|
93D39A57A7823DE98A0FF83C /* MPPasswordWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordWindowController.m; sourceTree = "<group>"; };
|
||||||
@@ -249,7 +258,6 @@
|
|||||||
DA16B340170661DB000A0EAB /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
|
DA16B340170661DB000A0EAB /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = System/Library/Frameworks/Carbon.framework; sourceTree = SDKROOT; };
|
||||||
DA16B343170661EE000A0EAB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
DA16B343170661EE000A0EAB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||||
DA2508F019511D3600AC23F1 /* MPPasswordWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPPasswordWindowController.xib; sourceTree = "<group>"; };
|
DA2508F019511D3600AC23F1 /* MPPasswordWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MPPasswordWindowController.xib; sourceTree = "<group>"; };
|
||||||
DA2508F619513C1400AC23F1 /* libRMBlurredView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRMBlurredView.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
DA2508F919513C1400AC23F1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
DA2508F919513C1400AC23F1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||||
DA2508FA19513C1400AC23F1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
|
DA2508FA19513C1400AC23F1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
|
||||||
DA2508FB19513C1400AC23F1 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
|
DA2508FB19513C1400AC23F1 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
|
||||||
@@ -292,7 +300,10 @@
|
|||||||
DA3B8454190FC89700246EEA /* MPFixable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFixable.m; sourceTree = "<group>"; };
|
DA3B8454190FC89700246EEA /* MPFixable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFixable.m; sourceTree = "<group>"; };
|
||||||
DA3B8455190FC89700246EEA /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = "<group>"; };
|
DA3B8455190FC89700246EEA /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = "<group>"; };
|
||||||
DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceCodePro-Regular.otf"; sourceTree = "<group>"; };
|
DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceCodePro-Regular.otf"; sourceTree = "<group>"; };
|
||||||
DA4425CB1557BED40052177D /* libUbiquityStoreManager.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libUbiquityStoreManager.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
DA5180C619FF2F9200A587E9 /* MPAlgorithmV2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAlgorithmV2.h; sourceTree = "<group>"; };
|
||||||
|
DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAlgorithmV2.m; sourceTree = "<group>"; };
|
||||||
|
DA5180CC19FF307E00A587E9 /* MPAppDelegate_Store.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAppDelegate_Store.h; sourceTree = "<group>"; };
|
||||||
|
DA5180CD19FF307E00A587E9 /* MPAppDelegate_Store.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate_Store.m; sourceTree = "<group>"; };
|
||||||
DA5BFA44147E415C00F98B1E /* Master Password.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Master Password.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
DA5BFA44147E415C00F98B1E /* Master Password.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Master Password.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
DA5BFA4A147E415C00F98B1E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
DA5BFA4A147E415C00F98B1E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||||
DA5BFA4C147E415C00F98B1E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
DA5BFA4C147E415C00F98B1E /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
||||||
@@ -308,8 +319,6 @@
|
|||||||
DA5E5C9E1724A667003798D8 /* MPAppDelegate_Key.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate_Key.m; sourceTree = "<group>"; };
|
DA5E5C9E1724A667003798D8 /* MPAppDelegate_Key.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate_Key.m; sourceTree = "<group>"; };
|
||||||
DA5E5C9F1724A667003798D8 /* MPAppDelegate_Shared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAppDelegate_Shared.h; sourceTree = "<group>"; };
|
DA5E5C9F1724A667003798D8 /* MPAppDelegate_Shared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAppDelegate_Shared.h; sourceTree = "<group>"; };
|
||||||
DA5E5CA01724A667003798D8 /* MPAppDelegate_Shared.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate_Shared.m; sourceTree = "<group>"; };
|
DA5E5CA01724A667003798D8 /* MPAppDelegate_Shared.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate_Shared.m; sourceTree = "<group>"; };
|
||||||
DA5E5CA11724A667003798D8 /* MPAppDelegate_Store.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAppDelegate_Store.h; sourceTree = "<group>"; };
|
|
||||||
DA5E5CA21724A667003798D8 /* MPAppDelegate_Store.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAppDelegate_Store.m; sourceTree = "<group>"; };
|
|
||||||
DA5E5CA31724A667003798D8 /* MPConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPConfig.h; sourceTree = "<group>"; };
|
DA5E5CA31724A667003798D8 /* MPConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPConfig.h; sourceTree = "<group>"; };
|
||||||
DA5E5CA41724A667003798D8 /* MPConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPConfig.m; sourceTree = "<group>"; };
|
DA5E5CA41724A667003798D8 /* MPConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPConfig.m; sourceTree = "<group>"; };
|
||||||
DA5E5CAB1724A667003798D8 /* MPEntities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEntities.h; sourceTree = "<group>"; };
|
DA5E5CAB1724A667003798D8 /* MPEntities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPEntities.h; sourceTree = "<group>"; };
|
||||||
@@ -737,18 +746,17 @@
|
|||||||
DA8ED892192906920099B726 /* PearlTween.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlTween.h; sourceTree = "<group>"; };
|
DA8ED892192906920099B726 /* PearlTween.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlTween.h; sourceTree = "<group>"; };
|
||||||
DA8ED894192906920099B726 /* map-macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "map-macro.h"; sourceTree = "<group>"; };
|
DA8ED894192906920099B726 /* map-macro.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "map-macro.h"; sourceTree = "<group>"; };
|
||||||
DAAA81AF195A8D1300FA30D9 /* gradient.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gradient.png; sourceTree = "<group>"; };
|
DAAA81AF195A8D1300FA30D9 /* gradient.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gradient.png; sourceTree = "<group>"; };
|
||||||
|
DAADCC3E19FAFFAD00987B1D /* NSNotificationCenter+PearlEasyCleanup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSNotificationCenter+PearlEasyCleanup.h"; sourceTree = "<group>"; };
|
||||||
|
DAADCC3F19FAFFAD00987B1D /* NSPersistentStore+PearlMigration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPersistentStore+PearlMigration.h"; sourceTree = "<group>"; };
|
||||||
|
DAADCC4019FAFFAD00987B1D /* NSPersistentStore+PearlMigration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPersistentStore+PearlMigration.m"; sourceTree = "<group>"; };
|
||||||
|
DAADCC5019FB006500987B1D /* libKCOrderedAccessorFix.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libKCOrderedAccessorFix.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
DAADCC6619FB007F00987B1D /* NSManagedObjectModel+KCOrderedAccessorFix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSManagedObjectModel+KCOrderedAccessorFix.h"; sourceTree = "<group>"; };
|
||||||
|
DAADCC6719FB007F00987B1D /* NSManagedObjectModel+KCOrderedAccessorFix.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSManagedObjectModel+KCOrderedAccessorFix.m"; sourceTree = "<group>"; };
|
||||||
DABB981515100B4000B05417 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
DABB981515100B4000B05417 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
||||||
DABC6C01175D8C85000C15D4 /* libRHStatusItemView.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRHStatusItemView.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
DABC6C13175D8CE1000C15D4 /* RHStatusItemView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RHStatusItemView.h; sourceTree = "<group>"; };
|
|
||||||
DABC6C14175D8CE1000C15D4 /* RHStatusItemView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RHStatusItemView.m; sourceTree = "<group>"; };
|
|
||||||
DAC6326C148680650075AEA5 /* libjrswizzle.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libjrswizzle.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
DAC6326C148680650075AEA5 /* libjrswizzle.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libjrswizzle.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
DAC632871486D95D0075AEA5 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
|
DAC632871486D95D0075AEA5 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
|
||||||
DAC77CAD148291A600BCF976 /* libPearl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPearl.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
DAC77CAD148291A600BCF976 /* libPearl.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPearl.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
DAC77CB1148291A600BCF976 /* Pearl-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Pearl-Prefix.pch"; path = "../../MasterPassword/ObjC/Pearl/Pearl-Prefix.pch"; sourceTree = "<group>"; };
|
DAC77CB1148291A600BCF976 /* Pearl-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Pearl-Prefix.pch"; path = "../../MasterPassword/ObjC/Pearl/Pearl-Prefix.pch"; sourceTree = "<group>"; };
|
||||||
DACA22B71705DE7D002C6C22 /* UbiquityStoreManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UbiquityStoreManager.m; sourceTree = "<group>"; };
|
|
||||||
DACA22B81705DE7D002C6C22 /* NSError+UbiquityStoreManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+UbiquityStoreManager.h"; sourceTree = "<group>"; };
|
|
||||||
DACA22B91705DE7D002C6C22 /* NSError+UbiquityStoreManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+UbiquityStoreManager.m"; sourceTree = "<group>"; };
|
|
||||||
DACA22BA1705DE7D002C6C22 /* UbiquityStoreManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UbiquityStoreManager.h; sourceTree = "<group>"; };
|
|
||||||
DACA241C1705DF7D002C6C22 /* logo-bare.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "logo-bare.png"; sourceTree = "<group>"; };
|
DACA241C1705DF7D002C6C22 /* logo-bare.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "logo-bare.png"; sourceTree = "<group>"; };
|
||||||
DACA24321705DF7D002C6C22 /* avatar-13@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar-13@2x.png"; sourceTree = "<group>"; };
|
DACA24321705DF7D002C6C22 /* avatar-13@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar-13@2x.png"; sourceTree = "<group>"; };
|
||||||
DACA24331705DF7D002C6C22 /* avatar-3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar-3@2x.png"; sourceTree = "<group>"; };
|
DACA24331705DF7D002C6C22 /* avatar-3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar-3@2x.png"; sourceTree = "<group>"; };
|
||||||
@@ -796,6 +804,17 @@
|
|||||||
DACA29721705E1A8002C6C22 /* dictionary.lst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dictionary.lst; sourceTree = "<group>"; };
|
DACA29721705E1A8002C6C22 /* dictionary.lst */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dictionary.lst; sourceTree = "<group>"; };
|
||||||
DACA29771705E2BD002C6C22 /* JRSwizzle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JRSwizzle.h; sourceTree = "<group>"; };
|
DACA29771705E2BD002C6C22 /* JRSwizzle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JRSwizzle.h; sourceTree = "<group>"; };
|
||||||
DACA298C1705E2BD002C6C22 /* JRSwizzle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JRSwizzle.m; sourceTree = "<group>"; };
|
DACA298C1705E2BD002C6C22 /* JRSwizzle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JRSwizzle.m; sourceTree = "<group>"; };
|
||||||
|
DAD0C5F619FD6034009CB08D /* icon_128x128.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_128x128.png; sourceTree = "<group>"; };
|
||||||
|
DAD0C5F719FD6034009CB08D /* icon_128x128@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_128x128@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DAD0C5F819FD6034009CB08D /* icon_16x16.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_16x16.png; sourceTree = "<group>"; };
|
||||||
|
DAD0C5F919FD6034009CB08D /* icon_16x16@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_16x16@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DAD0C5FA19FD6034009CB08D /* icon_256x256.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_256x256.png; sourceTree = "<group>"; };
|
||||||
|
DAD0C5FB19FD6034009CB08D /* icon_256x256@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_256x256@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DAD0C5FC19FD6034009CB08D /* icon_32x32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_32x32.png; sourceTree = "<group>"; };
|
||||||
|
DAD0C5FD19FD6034009CB08D /* icon_32x32@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_32x32@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DAD0C5FE19FD6034009CB08D /* icon_512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = icon_512x512.png; sourceTree = "<group>"; };
|
||||||
|
DAD0C5FF19FD6034009CB08D /* icon_512x512@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_512x512@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DAD0C60019FD6034009CB08D /* icon.sketch */ = {isa = PBXFileReference; lastKnownFileType = file; path = icon.sketch; sourceTree = "<group>"; };
|
||||||
DAD312C01552A20800A3F9ED /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
|
DAD312C01552A20800A3F9ED /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; };
|
||||||
DAD9B5E1176299B9001835F9 /* MasterPassword-Mac-LoginHelper.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "MasterPassword-Mac-LoginHelper.xcodeproj"; path = "MasterPassword-Mac-LoginHelper/MasterPassword-Mac-LoginHelper.xcodeproj"; sourceTree = "<group>"; };
|
DAD9B5E1176299B9001835F9 /* MasterPassword-Mac-LoginHelper.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "MasterPassword-Mac-LoginHelper.xcodeproj"; path = "MasterPassword-Mac-LoginHelper/MasterPassword-Mac-LoginHelper.xcodeproj"; sourceTree = "<group>"; };
|
||||||
DAD9B5EF1762CAA4001835F9 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
|
DAD9B5EF1762CAA4001835F9 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
|
||||||
@@ -854,30 +873,13 @@
|
|||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
DA2508F319513C1400AC23F1 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
DA2508F719513C1400AC23F1 /* Cocoa.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
DA4425C81557BED40052177D /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
DA4425CC1557BED40052177D /* Foundation.framework in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
DA5BFA41147E415C00F98B1E /* Frameworks */ = {
|
DA5BFA41147E415C00F98B1E /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
DAADCC6A19FB00B500987B1D /* libKCOrderedAccessorFix.a in Frameworks */,
|
||||||
DA250925195148E200AC23F1 /* QuartzCore.framework in Frameworks */,
|
DA250925195148E200AC23F1 /* QuartzCore.framework in Frameworks */,
|
||||||
DAD9B5F01762CAA4001835F9 /* ServiceManagement.framework in Frameworks */,
|
DAD9B5F01762CAA4001835F9 /* ServiceManagement.framework in Frameworks */,
|
||||||
DABC6C16175D8E3A000C15D4 /* libRHStatusItemView.a in Frameworks */,
|
|
||||||
DA16B33F170661D4000A0EAB /* libUbiquityStoreManager.a in Frameworks */,
|
|
||||||
DA16B341170661DB000A0EAB /* Carbon.framework in Frameworks */,
|
DA16B341170661DB000A0EAB /* Carbon.framework in Frameworks */,
|
||||||
DA16B342170661E0000A0EAB /* Security.framework in Frameworks */,
|
DA16B342170661E0000A0EAB /* Security.framework in Frameworks */,
|
||||||
DA16B345170661F2000A0EAB /* libPearl.a in Frameworks */,
|
DA16B345170661F2000A0EAB /* libPearl.a in Frameworks */,
|
||||||
@@ -886,11 +888,10 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
DABC6BFE175D8C85000C15D4 /* Frameworks */ = {
|
DAADCC4D19FB006500987B1D /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
DABC6C02175D8C85000C15D4 /* Foundation.framework in Frameworks */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -906,6 +907,7 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
DAADCC4B19FB000C00987B1D /* QuartzCore.framework in Frameworks */,
|
||||||
DAE8E65519867AE200416A0F /* libopensslcrypto-osx.a in Frameworks */,
|
DAE8E65519867AE200416A0F /* libopensslcrypto-osx.a in Frameworks */,
|
||||||
DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */,
|
DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */,
|
||||||
DAC77CAE148291A600BCF976 /* Foundation.framework in Frameworks */,
|
DAC77CAE148291A600BCF976 /* Foundation.framework in Frameworks */,
|
||||||
@@ -953,9 +955,7 @@
|
|||||||
DA5BFA44147E415C00F98B1E /* Master Password.app */,
|
DA5BFA44147E415C00F98B1E /* Master Password.app */,
|
||||||
DAC77CAD148291A600BCF976 /* libPearl.a */,
|
DAC77CAD148291A600BCF976 /* libPearl.a */,
|
||||||
DAC6326C148680650075AEA5 /* libjrswizzle.a */,
|
DAC6326C148680650075AEA5 /* libjrswizzle.a */,
|
||||||
DA4425CB1557BED40052177D /* libUbiquityStoreManager.a */,
|
DAADCC5019FB006500987B1D /* libKCOrderedAccessorFix.a */,
|
||||||
DABC6C01175D8C85000C15D4 /* libRHStatusItemView.a */,
|
|
||||||
DA2508F619513C1400AC23F1 /* libRMBlurredView.a */,
|
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -995,39 +995,41 @@
|
|||||||
DA5E5C961724A667003798D8 /* ObjC */ = {
|
DA5E5C961724A667003798D8 /* ObjC */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
DA32CFE319CF1C71004F3F0E /* MPUserEntity.h */,
|
|
||||||
DA32CFE419CF1C71004F3F0E /* MPUserEntity.m */,
|
|
||||||
DA32CFE019CF1C71004F3F0E /* MPSiteQuestionEntity.h */,
|
|
||||||
DA32CFE119CF1C71004F3F0E /* MPSiteQuestionEntity.m */,
|
|
||||||
DA32CFDD19CF1C70004F3F0E /* MPSiteEntity.h */,
|
|
||||||
DA32CFDE19CF1C70004F3F0E /* MPSiteEntity.m */,
|
|
||||||
DA32CFDA19CF1C70004F3F0E /* MPStoredSiteEntity.h */,
|
|
||||||
DA32CFDB19CF1C70004F3F0E /* MPStoredSiteEntity.m */,
|
|
||||||
DA32CFD719CF1C70004F3F0E /* MPGeneratedSiteEntity.h */,
|
|
||||||
DA32CFD819CF1C70004F3F0E /* MPGeneratedSiteEntity.m */,
|
|
||||||
DA3B8454190FC89700246EEA /* MPFixable.m */,
|
|
||||||
DA3B8455190FC89700246EEA /* MPFixable.h */,
|
|
||||||
DA5E5CB21724A667003798D8 /* Mac */,
|
DA5E5CB21724A667003798D8 /* Mac */,
|
||||||
|
DA29992619C6A89900AF7DF1 /* MasterPassword.xcdatamodeld */,
|
||||||
DA5E5C971724A667003798D8 /* MPAlgorithm.h */,
|
DA5E5C971724A667003798D8 /* MPAlgorithm.h */,
|
||||||
DA5E5C981724A667003798D8 /* MPAlgorithm.m */,
|
DA5E5C981724A667003798D8 /* MPAlgorithm.m */,
|
||||||
DA5E5C991724A667003798D8 /* MPAlgorithmV0.h */,
|
DA5E5C991724A667003798D8 /* MPAlgorithmV0.h */,
|
||||||
DA5E5C9A1724A667003798D8 /* MPAlgorithmV0.m */,
|
DA5E5C9A1724A667003798D8 /* MPAlgorithmV0.m */,
|
||||||
DA5E5C9B1724A667003798D8 /* MPAlgorithmV1.h */,
|
DA5E5C9B1724A667003798D8 /* MPAlgorithmV1.h */,
|
||||||
DA5E5C9C1724A667003798D8 /* MPAlgorithmV1.m */,
|
DA5E5C9C1724A667003798D8 /* MPAlgorithmV1.m */,
|
||||||
|
DA5180C619FF2F9200A587E9 /* MPAlgorithmV2.h */,
|
||||||
|
DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */,
|
||||||
DA5E5C9D1724A667003798D8 /* MPAppDelegate_Key.h */,
|
DA5E5C9D1724A667003798D8 /* MPAppDelegate_Key.h */,
|
||||||
DA5E5C9E1724A667003798D8 /* MPAppDelegate_Key.m */,
|
DA5E5C9E1724A667003798D8 /* MPAppDelegate_Key.m */,
|
||||||
DA5E5C9F1724A667003798D8 /* MPAppDelegate_Shared.h */,
|
DA5E5C9F1724A667003798D8 /* MPAppDelegate_Shared.h */,
|
||||||
DA5E5CA01724A667003798D8 /* MPAppDelegate_Shared.m */,
|
DA5E5CA01724A667003798D8 /* MPAppDelegate_Shared.m */,
|
||||||
DA5E5CA11724A667003798D8 /* MPAppDelegate_Store.h */,
|
DA5180CC19FF307E00A587E9 /* MPAppDelegate_Store.h */,
|
||||||
DA5E5CA21724A667003798D8 /* MPAppDelegate_Store.m */,
|
DA5180CD19FF307E00A587E9 /* MPAppDelegate_Store.m */,
|
||||||
DA5E5CA31724A667003798D8 /* MPConfig.h */,
|
DA5E5CA31724A667003798D8 /* MPConfig.h */,
|
||||||
DA5E5CA41724A667003798D8 /* MPConfig.m */,
|
DA5E5CA41724A667003798D8 /* MPConfig.m */,
|
||||||
DA5E5CAB1724A667003798D8 /* MPEntities.h */,
|
DA5E5CAB1724A667003798D8 /* MPEntities.h */,
|
||||||
DA5E5CAC1724A667003798D8 /* MPEntities.m */,
|
DA5E5CAC1724A667003798D8 /* MPEntities.m */,
|
||||||
|
DA3B8455190FC89700246EEA /* MPFixable.h */,
|
||||||
|
DA3B8454190FC89700246EEA /* MPFixable.m */,
|
||||||
|
DA32CFD719CF1C70004F3F0E /* MPGeneratedSiteEntity.h */,
|
||||||
|
DA32CFD819CF1C70004F3F0E /* MPGeneratedSiteEntity.m */,
|
||||||
DA5E5CAD1724A667003798D8 /* MPKey.h */,
|
DA5E5CAD1724A667003798D8 /* MPKey.h */,
|
||||||
DA5E5CAE1724A667003798D8 /* MPKey.m */,
|
DA5E5CAE1724A667003798D8 /* MPKey.m */,
|
||||||
|
DA32CFDD19CF1C70004F3F0E /* MPSiteEntity.h */,
|
||||||
|
DA32CFDE19CF1C70004F3F0E /* MPSiteEntity.m */,
|
||||||
|
DA32CFE019CF1C71004F3F0E /* MPSiteQuestionEntity.h */,
|
||||||
|
DA32CFE119CF1C71004F3F0E /* MPSiteQuestionEntity.m */,
|
||||||
|
DA32CFDA19CF1C70004F3F0E /* MPStoredSiteEntity.h */,
|
||||||
|
DA32CFDB19CF1C70004F3F0E /* MPStoredSiteEntity.m */,
|
||||||
DA5E5CAF1724A667003798D8 /* MPTypes.h */,
|
DA5E5CAF1724A667003798D8 /* MPTypes.h */,
|
||||||
DA29992619C6A89900AF7DF1 /* MasterPassword.xcdatamodeld */,
|
DA32CFE319CF1C71004F3F0E /* MPUserEntity.h */,
|
||||||
|
DA32CFE419CF1C71004F3F0E /* MPUserEntity.m */,
|
||||||
);
|
);
|
||||||
name = ObjC;
|
name = ObjC;
|
||||||
path = ..;
|
path = ..;
|
||||||
@@ -1059,6 +1061,8 @@
|
|||||||
93D39368EF3CBFEF2AFCA15A /* MPInitialWindowController.h */,
|
93D39368EF3CBFEF2AFCA15A /* MPInitialWindowController.h */,
|
||||||
93D39423D7BF4FD31FE6D27C /* MPSitesTableView.m */,
|
93D39423D7BF4FD31FE6D27C /* MPSitesTableView.m */,
|
||||||
93D39AC6360DDC16AEAA4119 /* MPSitesTableView.h */,
|
93D39AC6360DDC16AEAA4119 /* MPSitesTableView.h */,
|
||||||
|
93D39538C4CEFF46DF379254 /* MPNoStateButton.m */,
|
||||||
|
93D392A4F3DE0BD758B9B056 /* MPNoStateButton.h */,
|
||||||
);
|
);
|
||||||
path = Mac;
|
path = Mac;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -1480,14 +1484,13 @@
|
|||||||
path = include;
|
path = include;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
DABC6C0E175D8CE1000C15D4 /* RHStatusItemView */ = {
|
DAADCC6819FB007F00987B1D /* KCOrderedAccessorFix */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
DABC6C13175D8CE1000C15D4 /* RHStatusItemView.h */,
|
DAADCC6619FB007F00987B1D /* NSManagedObjectModel+KCOrderedAccessorFix.h */,
|
||||||
DABC6C14175D8CE1000C15D4 /* RHStatusItemView.m */,
|
DAADCC6719FB007F00987B1D /* NSManagedObjectModel+KCOrderedAccessorFix.m */,
|
||||||
);
|
);
|
||||||
name = RHStatusItemView;
|
path = KCOrderedAccessorFix;
|
||||||
path = RHStatusItemView/RHStatusItemView;
|
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
DAC77CAF148291A600BCF976 /* Pearl */ = {
|
DAC77CAF148291A600BCF976 /* Pearl */ = {
|
||||||
@@ -1503,28 +1506,15 @@
|
|||||||
DACA22121705DDC5002C6C22 /* External */ = {
|
DACA22121705DDC5002C6C22 /* External */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
DAADCC6819FB007F00987B1D /* KCOrderedAccessorFix */,
|
||||||
DA3B8449190FC5A900246EEA /* Mac */,
|
DA3B8449190FC5A900246EEA /* Mac */,
|
||||||
DABC6C0E175D8CE1000C15D4 /* RHStatusItemView */,
|
|
||||||
DACA29751705E2BD002C6C22 /* jrswizzle */,
|
DACA29751705E2BD002C6C22 /* jrswizzle */,
|
||||||
DAC77CAF148291A600BCF976 /* Pearl */,
|
DAC77CAF148291A600BCF976 /* Pearl */,
|
||||||
DACA22B61705DE7D002C6C22 /* UbiquityStoreManager */,
|
|
||||||
);
|
);
|
||||||
name = External;
|
name = External;
|
||||||
path = ../../../External;
|
path = ../../../External;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
DACA22B61705DE7D002C6C22 /* UbiquityStoreManager */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
DACA22BA1705DE7D002C6C22 /* UbiquityStoreManager.h */,
|
|
||||||
DACA22B71705DE7D002C6C22 /* UbiquityStoreManager.m */,
|
|
||||||
DACA22B81705DE7D002C6C22 /* NSError+UbiquityStoreManager.h */,
|
|
||||||
DACA22B91705DE7D002C6C22 /* NSError+UbiquityStoreManager.m */,
|
|
||||||
);
|
|
||||||
name = UbiquityStoreManager;
|
|
||||||
path = UbiquityStoreManager/UbiquityStoreManager;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
DACA23B41705DF7D002C6C22 /* Resources */ = {
|
DACA23B41705DF7D002C6C22 /* Resources */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1539,6 +1529,7 @@
|
|||||||
DACA23B51705DF7D002C6C22 /* Media */ = {
|
DACA23B51705DF7D002C6C22 /* Media */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
DAD0C5F419FD6034009CB08D /* mac */,
|
||||||
DA6558A319A99609009A0BEB /* Images.xcassets */,
|
DA6558A319A99609009A0BEB /* Images.xcassets */,
|
||||||
DA606FE9195D03E200CA98B5 /* Insignia */,
|
DA606FE9195D03E200CA98B5 /* Insignia */,
|
||||||
DAAA81AF195A8D1300FA30D9 /* gradient.png */,
|
DAAA81AF195A8D1300FA30D9 /* gradient.png */,
|
||||||
@@ -1636,8 +1627,33 @@
|
|||||||
DACA29771705E2BD002C6C22 /* JRSwizzle.h */,
|
DACA29771705E2BD002C6C22 /* JRSwizzle.h */,
|
||||||
DACA298C1705E2BD002C6C22 /* JRSwizzle.m */,
|
DACA298C1705E2BD002C6C22 /* JRSwizzle.m */,
|
||||||
);
|
);
|
||||||
name = jrswizzle;
|
path = jrswizzle;
|
||||||
path = Pearl/External/jrswizzle;
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
DAD0C5F419FD6034009CB08D /* mac */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
DAD0C5F519FD6034009CB08D /* icon */,
|
||||||
|
DAD0C60019FD6034009CB08D /* icon.sketch */,
|
||||||
|
);
|
||||||
|
path = mac;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
DAD0C5F519FD6034009CB08D /* icon */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
DAD0C5F619FD6034009CB08D /* icon_128x128.png */,
|
||||||
|
DAD0C5F719FD6034009CB08D /* icon_128x128@2x.png */,
|
||||||
|
DAD0C5F819FD6034009CB08D /* icon_16x16.png */,
|
||||||
|
DAD0C5F919FD6034009CB08D /* icon_16x16@2x.png */,
|
||||||
|
DAD0C5FA19FD6034009CB08D /* icon_256x256.png */,
|
||||||
|
DAD0C5FB19FD6034009CB08D /* icon_256x256@2x.png */,
|
||||||
|
DAD0C5FC19FD6034009CB08D /* icon_32x32.png */,
|
||||||
|
DAD0C5FD19FD6034009CB08D /* icon_32x32@2x.png */,
|
||||||
|
DAD0C5FE19FD6034009CB08D /* icon_512x512.png */,
|
||||||
|
DAD0C5FF19FD6034009CB08D /* icon_512x512@2x.png */,
|
||||||
|
);
|
||||||
|
path = icon;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
DAD9B5E2176299B9001835F9 /* Products */ = {
|
DAD9B5E2176299B9001835F9 /* Products */ = {
|
||||||
@@ -1660,6 +1676,9 @@
|
|||||||
DAFE45D715039823003ABA7C /* Pearl */ = {
|
DAFE45D715039823003ABA7C /* Pearl */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
DAADCC3E19FAFFAD00987B1D /* NSNotificationCenter+PearlEasyCleanup.h */,
|
||||||
|
DAADCC3F19FAFFAD00987B1D /* NSPersistentStore+PearlMigration.h */,
|
||||||
|
DAADCC4019FAFFAD00987B1D /* NSPersistentStore+PearlMigration.m */,
|
||||||
DA8ED891192906920099B726 /* PearlTween.m */,
|
DA8ED891192906920099B726 /* PearlTween.m */,
|
||||||
DA8ED892192906920099B726 /* PearlTween.h */,
|
DA8ED892192906920099B726 /* PearlTween.h */,
|
||||||
DA8ED893192906920099B726 /* include */,
|
DA8ED893192906920099B726 /* include */,
|
||||||
@@ -1750,22 +1769,6 @@
|
|||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
DA2508F419513C1400AC23F1 /* Headers */ = {
|
|
||||||
isa = PBXHeadersBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
DA4425C91557BED40052177D /* Headers */ = {
|
|
||||||
isa = PBXHeadersBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
DACA22BC1705DE7D002C6C22 /* NSError+UbiquityStoreManager.h in Headers */,
|
|
||||||
DACA22BE1705DE7D002C6C22 /* UbiquityStoreManager.h in Headers */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
DAC6326A148680650075AEA5 /* Headers */ = {
|
DAC6326A148680650075AEA5 /* Headers */ = {
|
||||||
isa = PBXHeadersBuildPhase;
|
isa = PBXHeadersBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -1807,12 +1810,14 @@
|
|||||||
DAFE4A3A15039824003ABA7C /* PearlSCrypt.h in Headers */,
|
DAFE4A3A15039824003ABA7C /* PearlSCrypt.h in Headers */,
|
||||||
DA30E9CE15722ECA00A68B4C /* NSBundle+PearlMutableInfo.h in Headers */,
|
DA30E9CE15722ECA00A68B4C /* NSBundle+PearlMutableInfo.h in Headers */,
|
||||||
DA30E9D715723E6900A68B4C /* PearlLazy.h in Headers */,
|
DA30E9D715723E6900A68B4C /* PearlLazy.h in Headers */,
|
||||||
|
DAADCC4719FAFFAD00987B1D /* NSNotificationCenter+PearlEasyCleanup.h in Headers */,
|
||||||
DAFE4A63150399FF003ABA88 /* NSObject+PearlKVO.h in Headers */,
|
DAFE4A63150399FF003ABA88 /* NSObject+PearlKVO.h in Headers */,
|
||||||
DAFE4A63150399FF003ABA94 /* NSDateFormatter+RFC3339.h in Headers */,
|
DAFE4A63150399FF003ABA94 /* NSDateFormatter+RFC3339.h in Headers */,
|
||||||
93D39C34FE35830EF5BE1D2A /* NSArray+Indexing.h in Headers */,
|
93D39C34FE35830EF5BE1D2A /* NSArray+Indexing.h in Headers */,
|
||||||
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */,
|
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */,
|
||||||
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */,
|
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */,
|
||||||
DA2CA4EE18D323D3007798F8 /* NSError+PearlFullDescription.h in Headers */,
|
DA2CA4EE18D323D3007798F8 /* NSError+PearlFullDescription.h in Headers */,
|
||||||
|
DAADCC4819FAFFAD00987B1D /* NSPersistentStore+PearlMigration.h in Headers */,
|
||||||
93D39D304F73B3BBA031522A /* PearlProfiler.h in Headers */,
|
93D39D304F73B3BBA031522A /* PearlProfiler.h in Headers */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -1820,44 +1825,11 @@
|
|||||||
/* End PBXHeadersBuildPhase section */
|
/* End PBXHeadersBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
DA2508F519513C1400AC23F1 /* RMBlurredView */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = DA25091519513C1500AC23F1 /* Build configuration list for PBXNativeTarget "RMBlurredView" */;
|
|
||||||
buildPhases = (
|
|
||||||
DA2508F219513C1400AC23F1 /* Sources */,
|
|
||||||
DA2508F319513C1400AC23F1 /* Frameworks */,
|
|
||||||
DA2508F419513C1400AC23F1 /* Headers */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = RMBlurredView;
|
|
||||||
productName = RMBlurredView;
|
|
||||||
productReference = DA2508F619513C1400AC23F1 /* libRMBlurredView.a */;
|
|
||||||
productType = "com.apple.product-type.library.static";
|
|
||||||
};
|
|
||||||
DA4425CA1557BED40052177D /* UbiquityStoreManager */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = DA4425D31557BED40052177D /* Build configuration list for PBXNativeTarget "UbiquityStoreManager" */;
|
|
||||||
buildPhases = (
|
|
||||||
DA4425C71557BED40052177D /* Sources */,
|
|
||||||
DA4425C81557BED40052177D /* Frameworks */,
|
|
||||||
DA4425C91557BED40052177D /* Headers */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = UbiquityStoreManager;
|
|
||||||
productName = iCloudStoreManager;
|
|
||||||
productReference = DA4425CB1557BED40052177D /* libUbiquityStoreManager.a */;
|
|
||||||
productType = "com.apple.product-type.library.static";
|
|
||||||
};
|
|
||||||
DA5BFA43147E415C00F98B1E /* MasterPassword */ = {
|
DA5BFA43147E415C00F98B1E /* MasterPassword */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = DA5BFA6D147E415C00F98B1E /* Build configuration list for PBXNativeTarget "MasterPassword" */;
|
buildConfigurationList = DA5BFA6D147E415C00F98B1E /* Build configuration list for PBXNativeTarget "MasterPassword" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
DA4EF9CB19FD4B600032ECB5 /* Run Script: genassets */,
|
||||||
DA5BFA40147E415C00F98B1E /* Sources */,
|
DA5BFA40147E415C00F98B1E /* Sources */,
|
||||||
DA5BFA41147E415C00F98B1E /* Frameworks */,
|
DA5BFA41147E415C00F98B1E /* Frameworks */,
|
||||||
DA5BFA42147E415C00F98B1E /* Resources */,
|
DA5BFA42147E415C00F98B1E /* Resources */,
|
||||||
@@ -1875,20 +1847,21 @@
|
|||||||
productReference = DA5BFA44147E415C00F98B1E /* Master Password.app */;
|
productReference = DA5BFA44147E415C00F98B1E /* Master Password.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
};
|
};
|
||||||
DABC6C00175D8C85000C15D4 /* RHStatusItemView */ = {
|
DAADCC4F19FB006500987B1D /* KCOrderedAccessorFix */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = DABC6C0A175D8C85000C15D4 /* Build configuration list for PBXNativeTarget "RHStatusItemView" */;
|
buildConfigurationList = DAADCC5E19FB006500987B1D /* Build configuration list for PBXNativeTarget "KCOrderedAccessorFix" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
DABC6BFD175D8C85000C15D4 /* Sources */,
|
DAADCC4C19FB006500987B1D /* Sources */,
|
||||||
DABC6BFE175D8C85000C15D4 /* Frameworks */,
|
DAADCC4D19FB006500987B1D /* Frameworks */,
|
||||||
|
DAADCC4E19FB006500987B1D /* CopyFiles */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = RHStatusItemView;
|
name = KCOrderedAccessorFix;
|
||||||
productName = RHStatusItemView;
|
productName = KCOrderedAccessorFix;
|
||||||
productReference = DABC6C01175D8C85000C15D4 /* libRHStatusItemView.a */;
|
productReference = DAADCC5019FB006500987B1D /* libKCOrderedAccessorFix.a */;
|
||||||
productType = "com.apple.product-type.library.static";
|
productType = "com.apple.product-type.library.static";
|
||||||
};
|
};
|
||||||
DAC6326B148680650075AEA5 /* jrswizzle */ = {
|
DAC6326B148680650075AEA5 /* jrswizzle */ = {
|
||||||
@@ -1935,7 +1908,7 @@
|
|||||||
attributes = {
|
attributes = {
|
||||||
CLASSPREFIX = MP;
|
CLASSPREFIX = MP;
|
||||||
LastTestingUpgradeCheck = 0510;
|
LastTestingUpgradeCheck = 0510;
|
||||||
LastUpgradeCheck = 0600;
|
LastUpgradeCheck = 0610;
|
||||||
ORGANIZATIONNAME = Lyndir;
|
ORGANIZATIONNAME = Lyndir;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
DA5BFA43147E415C00F98B1E = {
|
DA5BFA43147E415C00F98B1E = {
|
||||||
@@ -1946,6 +1919,9 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
DAADCC4F19FB006500987B1D = {
|
||||||
|
CreatedOnToolsVersion = 6.0.1;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
buildConfigurationList = DA5BFA3E147E415C00F98B1E /* Build configuration list for PBXProject "MasterPassword-Mac" */;
|
buildConfigurationList = DA5BFA3E147E415C00F98B1E /* Build configuration list for PBXProject "MasterPassword-Mac" */;
|
||||||
@@ -1954,6 +1930,7 @@
|
|||||||
hasScannedForEncodings = 0;
|
hasScannedForEncodings = 0;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
en,
|
en,
|
||||||
|
nl,
|
||||||
);
|
);
|
||||||
mainGroup = DA5BFA39147E415C00F98B1E;
|
mainGroup = DA5BFA39147E415C00F98B1E;
|
||||||
productRefGroup = DA5BFA45147E415C00F98B1E /* Products */;
|
productRefGroup = DA5BFA45147E415C00F98B1E /* Products */;
|
||||||
@@ -1969,9 +1946,7 @@
|
|||||||
DA5BFA43147E415C00F98B1E /* MasterPassword */,
|
DA5BFA43147E415C00F98B1E /* MasterPassword */,
|
||||||
DAC77CAC148291A600BCF976 /* Pearl */,
|
DAC77CAC148291A600BCF976 /* Pearl */,
|
||||||
DAC6326B148680650075AEA5 /* jrswizzle */,
|
DAC6326B148680650075AEA5 /* jrswizzle */,
|
||||||
DA4425CA1557BED40052177D /* UbiquityStoreManager */,
|
DAADCC4F19FB006500987B1D /* KCOrderedAccessorFix */,
|
||||||
DABC6C00175D8C85000C15D4 /* RHStatusItemView */,
|
|
||||||
DA2508F519513C1400AC23F1 /* RMBlurredView */,
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
@@ -2072,6 +2047,21 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "";
|
shellScript = "";
|
||||||
};
|
};
|
||||||
|
DA4EF9CB19FD4B600032ECB5 /* Run Script: genassets */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Run Script: genassets";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = "/bin/sh -e";
|
||||||
|
shellScript = "exec ../../../Scripts/genassets";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
DA6556E314D55F3000841C99 /* Run Script: GIT version -> Info.plist */ = {
|
DA6556E314D55F3000841C99 /* Run Script: GIT version -> Info.plist */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -2083,8 +2073,8 @@
|
|||||||
outputPaths = (
|
outputPaths = (
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = "/bin/bash -e";
|
shellPath = "/bin/sh -e";
|
||||||
shellScript = "PATH+=:/usr/libexec\n\naddPlistWithKey() {\n local key=$1 type=$2 value=$3 plist=${4:-\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"}\n \n PlistBuddy -c \"Delete :'$key'\" \"$plist\" 2>/dev/null || true\n PlistBuddy -c \"Add :'$key' '$type' '$value'\" \"$plist\"\n}\nsetPlistWithKey() {\n local key=$1 value=$2 plist=${3:-\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"}\n \n PlistBuddy -c \"Set :'$key' '$value'\" \"$plist\"\n}\ngetPlistWithKey() {\n local key=$1 plist=${2:-\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"}\n \n PlistBuddy -c \"Print :'$key'\" \"$plist\"\n}\nsetSettingWithTitle() {\n local i title=$1 value=$2 plist=${3:-\"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Settings.bundle/Root.plist\"}\n \n for (( i=0; 1; ++i )); do\n PlistBuddy -c \"Print :PreferenceSpecifiers:$i\" \"$plist\" &>/dev/null || break\n echo \"Checking preference specifier $i\"\n \n [[ $(PlistBuddy -c \"Print :PreferenceSpecifiers:$i:Title\" \"$plist\" 2>/dev/null) = $title ]] || continue\n \n echo \"Correct title, setting value.\"\n PlistBuddy -c \"Set :PreferenceSpecifiers:$i:DefaultValue $value\" \"$plist\"\n break\n done\n}\n\ndescription=$(git describe --always --dirty --long)\nversion=${description%-g*}\nIFS=- read major minor <<< \"$version\"\nprintf -v version '%s.%02d' \"$major\" \"$minor\"\nprintf -v commit '%09d' \"$((16#${description##*-g}))\"\n\naddPlistWithKey GITDescription string \"$description\"\nsetPlistWithKey CFBundleVersion \"${version//.}$commit\" # No separator between version and commit because I had already submitted a CFBundleVersion with a really high major. Cry.\nsetPlistWithKey CFBundleShortVersionString \"$version\"\n\nsetSettingWithTitle \"Build\" \"$commit\"\nsetSettingWithTitle \"Version\" \"$version\"\nsetSettingWithTitle \"Copyright\" \"$(getPlistWithKey NSHumanReadableCopyright)\"\n\nif [[ $DEPLOYMENT_LOCATION = YES ]]; then\n # This build is a release. Do some release checks.\n passed=1\n [[ $description != *-dirty ]] || \\\n { passed=0; echo >&2 \"ERROR: Cannot release a dirty version, first commit any changes.\"; }\n [[ $(PlistBuddy -c \"Print :'API Key'\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Crashlytics.plist\") ]] || \\\n { passed=0; echo >&2 \"ERROR: Cannot release: Crashlytics API key is missing.\"; }\n (( passed )) || \\\n { echo >&2 \"Failed to pass release checks. Fix the above errors and re-try. Aborting.\"; exit 1; }\nfi";
|
shellScript = "exec ../../../Scripts/updatePlist";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
DAD3125D155288AA00A3F9ED /* Run Script: Crashlytics */ = {
|
DAD3125D155288AA00A3F9ED /* Run Script: Crashlytics */ = {
|
||||||
@@ -2105,22 +2095,6 @@
|
|||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
DA2508F219513C1400AC23F1 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
DA4425C71557BED40052177D /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
DACA22BB1705DE7D002C6C22 /* UbiquityStoreManager.m in Sources */,
|
|
||||||
DACA22BD1705DE7D002C6C22 /* NSError+UbiquityStoreManager.m in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
DA5BFA40147E415C00F98B1E /* Sources */ = {
|
DA5BFA40147E415C00F98B1E /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -2131,8 +2105,8 @@
|
|||||||
DA5E5CF71724A667003798D8 /* MPAlgorithmV0.m in Sources */,
|
DA5E5CF71724A667003798D8 /* MPAlgorithmV0.m in Sources */,
|
||||||
DA5E5CF81724A667003798D8 /* MPAlgorithmV1.m in Sources */,
|
DA5E5CF81724A667003798D8 /* MPAlgorithmV1.m in Sources */,
|
||||||
DA5E5CF91724A667003798D8 /* MPAppDelegate_Key.m in Sources */,
|
DA5E5CF91724A667003798D8 /* MPAppDelegate_Key.m in Sources */,
|
||||||
|
DA5180CE19FF307E00A587E9 /* MPAppDelegate_Store.m in Sources */,
|
||||||
DA5E5CFA1724A667003798D8 /* MPAppDelegate_Shared.m in Sources */,
|
DA5E5CFA1724A667003798D8 /* MPAppDelegate_Shared.m in Sources */,
|
||||||
DA5E5CFB1724A667003798D8 /* MPAppDelegate_Store.m in Sources */,
|
|
||||||
DA5E5CFC1724A667003798D8 /* MPConfig.m in Sources */,
|
DA5E5CFC1724A667003798D8 /* MPConfig.m in Sources */,
|
||||||
DA29992C19C6A89900AF7DF1 /* MasterPassword.xcdatamodeld in Sources */,
|
DA29992C19C6A89900AF7DF1 /* MasterPassword.xcdatamodeld in Sources */,
|
||||||
DA3B8456190FC89700246EEA /* MPFixable.m in Sources */,
|
DA3B8456190FC89700246EEA /* MPFixable.m in Sources */,
|
||||||
@@ -2143,20 +2117,22 @@
|
|||||||
DA5E5D041724A667003798D8 /* MPMacConfig.m in Sources */,
|
DA5E5D041724A667003798D8 /* MPMacConfig.m in Sources */,
|
||||||
DA5E5D0C1724A667003798D8 /* main.m in Sources */,
|
DA5E5D0C1724A667003798D8 /* main.m in Sources */,
|
||||||
93D39C5789EFA607CF788082 /* MPSiteModel.m in Sources */,
|
93D39C5789EFA607CF788082 /* MPSiteModel.m in Sources */,
|
||||||
|
DA5180CA19FF2F9200A587E9 /* MPAlgorithmV2.m in Sources */,
|
||||||
93D39F833DEC1C89B2F795AC /* MPPasswordWindowController.m in Sources */,
|
93D39F833DEC1C89B2F795AC /* MPPasswordWindowController.m in Sources */,
|
||||||
DA32CFD919CF1C70004F3F0E /* MPGeneratedSiteEntity.m in Sources */,
|
DA32CFD919CF1C70004F3F0E /* MPGeneratedSiteEntity.m in Sources */,
|
||||||
93D390C676DF52DA7E459F19 /* MPPasswordWindow.m in Sources */,
|
93D390C676DF52DA7E459F19 /* MPPasswordWindow.m in Sources */,
|
||||||
93D39784E725A34D1EE3FB3B /* MPInitialWindowController.m in Sources */,
|
93D39784E725A34D1EE3FB3B /* MPInitialWindowController.m in Sources */,
|
||||||
DA32CFDF19CF1C70004F3F0E /* MPSiteEntity.m in Sources */,
|
DA32CFDF19CF1C70004F3F0E /* MPSiteEntity.m in Sources */,
|
||||||
93D394C4254EEB45FB335AFB /* MPSitesTableView.m in Sources */,
|
93D394C4254EEB45FB335AFB /* MPSitesTableView.m in Sources */,
|
||||||
|
93D395E4830290EBB6E71F34 /* MPNoStateButton.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
DABC6BFD175D8C85000C15D4 /* Sources */ = {
|
DAADCC4C19FB006500987B1D /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
DABC6C15175D8CE1000C15D4 /* RHStatusItemView.m in Sources */,
|
DAADCC6919FB007F00987B1D /* NSManagedObjectModel+KCOrderedAccessorFix.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -2173,6 +2149,7 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
DAFE4A1415039824003ABA7C /* NSObject+PearlExport.m in Sources */,
|
DAFE4A1415039824003ABA7C /* NSObject+PearlExport.m in Sources */,
|
||||||
|
DAADCC4919FAFFAD00987B1D /* NSPersistentStore+PearlMigration.m in Sources */,
|
||||||
DAFE4A1615039824003ABA7C /* NSString+PearlNSArrayFormat.m in Sources */,
|
DAFE4A1615039824003ABA7C /* NSString+PearlNSArrayFormat.m in Sources */,
|
||||||
DAFE4A1815039824003ABA7C /* NSString+PearlSEL.m in Sources */,
|
DAFE4A1815039824003ABA7C /* NSString+PearlSEL.m in Sources */,
|
||||||
DA2CA4ED18D323D3007798F8 /* NSError+PearlFullDescription.m in Sources */,
|
DA2CA4ED18D323D3007798F8 /* NSError+PearlFullDescription.m in Sources */,
|
||||||
@@ -2250,54 +2227,6 @@
|
|||||||
/* End PBXVariantGroup section */
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
/* Begin XCBuildConfiguration section */
|
||||||
DA25091619513C1500AC23F1 /* Debug-Mac */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
};
|
|
||||||
name = "Debug-Mac";
|
|
||||||
};
|
|
||||||
DA25091719513C1500AC23F1 /* AdHoc-Mac */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
};
|
|
||||||
name = "AdHoc-Mac";
|
|
||||||
};
|
|
||||||
DA25091819513C1500AC23F1 /* AppStore-Mac */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
};
|
|
||||||
name = "AppStore-Mac";
|
|
||||||
};
|
|
||||||
DA4425D41557BED40052177D /* Debug-Mac */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
};
|
|
||||||
name = "Debug-Mac";
|
|
||||||
};
|
|
||||||
DA4425D51557BED40052177D /* AdHoc-Mac */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
};
|
|
||||||
name = "AdHoc-Mac";
|
|
||||||
};
|
|
||||||
DA4425D61557BED40052177D /* AppStore-Mac */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
};
|
|
||||||
name = "AppStore-Mac";
|
|
||||||
};
|
|
||||||
DA5BFA6B147E415C00F98B1E /* Debug-Mac */ = {
|
DA5BFA6B147E415C00F98B1E /* Debug-Mac */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
@@ -2630,23 +2559,26 @@
|
|||||||
};
|
};
|
||||||
name = "AppStore-Mac";
|
name = "AppStore-Mac";
|
||||||
};
|
};
|
||||||
DABC6C0B175D8C85000C15D4 /* Debug-Mac */ = {
|
DAADCC5F19FB006500987B1D /* Debug-Mac */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
};
|
};
|
||||||
name = "Debug-Mac";
|
name = "Debug-Mac";
|
||||||
};
|
};
|
||||||
DABC6C0C175D8C85000C15D4 /* AdHoc-Mac */ = {
|
DAADCC6019FB006500987B1D /* AdHoc-Mac */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
};
|
};
|
||||||
name = "AdHoc-Mac";
|
name = "AdHoc-Mac";
|
||||||
};
|
};
|
||||||
DABC6C0D175D8C85000C15D4 /* AppStore-Mac */ = {
|
DAADCC6119FB006500987B1D /* AppStore-Mac */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
};
|
};
|
||||||
name = "AppStore-Mac";
|
name = "AppStore-Mac";
|
||||||
@@ -2720,26 +2652,6 @@
|
|||||||
/* End XCBuildConfiguration section */
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
/* Begin XCConfigurationList section */
|
||||||
DA25091519513C1500AC23F1 /* Build configuration list for PBXNativeTarget "RMBlurredView" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
DA25091619513C1500AC23F1 /* Debug-Mac */,
|
|
||||||
DA25091719513C1500AC23F1 /* AdHoc-Mac */,
|
|
||||||
DA25091819513C1500AC23F1 /* AppStore-Mac */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = "AdHoc-Mac";
|
|
||||||
};
|
|
||||||
DA4425D31557BED40052177D /* Build configuration list for PBXNativeTarget "UbiquityStoreManager" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
DA4425D41557BED40052177D /* Debug-Mac */,
|
|
||||||
DA4425D51557BED40052177D /* AdHoc-Mac */,
|
|
||||||
DA4425D61557BED40052177D /* AppStore-Mac */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = "AdHoc-Mac";
|
|
||||||
};
|
|
||||||
DA5BFA3E147E415C00F98B1E /* Build configuration list for PBXProject "MasterPassword-Mac" */ = {
|
DA5BFA3E147E415C00F98B1E /* Build configuration list for PBXProject "MasterPassword-Mac" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
@@ -2760,12 +2672,12 @@
|
|||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = "AdHoc-Mac";
|
defaultConfigurationName = "AdHoc-Mac";
|
||||||
};
|
};
|
||||||
DABC6C0A175D8C85000C15D4 /* Build configuration list for PBXNativeTarget "RHStatusItemView" */ = {
|
DAADCC5E19FB006500987B1D /* Build configuration list for PBXNativeTarget "KCOrderedAccessorFix" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
DABC6C0B175D8C85000C15D4 /* Debug-Mac */,
|
DAADCC5F19FB006500987B1D /* Debug-Mac */,
|
||||||
DABC6C0C175D8C85000C15D4 /* AdHoc-Mac */,
|
DAADCC6019FB006500987B1D /* AdHoc-Mac */,
|
||||||
DABC6C0D175D8C85000C15D4 /* AppStore-Mac */,
|
DAADCC6119FB006500987B1D /* AppStore-Mac */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = "AdHoc-Mac";
|
defaultConfigurationName = "AdHoc-Mac";
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "0600"
|
LastUpgradeVersion = "0610"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "0600"
|
LastUpgradeVersion = "0610"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
|||||||
@@ -41,6 +41,6 @@
|
|||||||
@property(nonatomic) IBOutlet UITextField *questionField;
|
@property(nonatomic) IBOutlet UITextField *questionField;
|
||||||
@property(nonatomic) IBOutlet UITextField *answerField;
|
@property(nonatomic) IBOutlet UITextField *answerField;
|
||||||
|
|
||||||
- (void)setQuestion:(MPSiteQuestionEntity *)question forSite:(MPSiteEntity *)site;
|
- (void)setQuestion:(MPSiteQuestionEntity *)question forSite:(MPSiteEntity *)site inVC:(MPAnswersViewController *)VC;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -92,7 +92,7 @@
|
|||||||
if (!_multiple)
|
if (!_multiple)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return MAX( 2, [[self siteInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]].questions count] );
|
return [[self siteInContext:[MPiOSAppDelegate managedObjectContextForMainThreadIfReady]].questions count] + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||||
@@ -118,7 +118,7 @@
|
|||||||
MPSiteQuestionEntity *question = nil;
|
MPSiteQuestionEntity *question = nil;
|
||||||
if ([site.questions count] > indexPath.item)
|
if ([site.questions count] > indexPath.item)
|
||||||
question = site.questions[indexPath.item];
|
question = site.questions[indexPath.item];
|
||||||
[cell setQuestion:question forSite:site];
|
[cell setQuestion:question forSite:site inVC:self];
|
||||||
|
|
||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
@@ -217,6 +217,17 @@
|
|||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)didAddQuestion:(MPSiteQuestionEntity *)question toSite:(MPSiteEntity *)site {
|
||||||
|
|
||||||
|
NSUInteger newQuestionRow = [site.questions count];
|
||||||
|
PearlMainQueue( ^{
|
||||||
|
[self.tableView beginUpdates];
|
||||||
|
[self.tableView insertRowsAtIndexPaths:@[ [NSIndexPath indexPathForRow:newQuestionRow inSection:1] ]
|
||||||
|
withRowAnimation:UITableViewRowAnimationAutomatic];
|
||||||
|
[self.tableView endUpdates];
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation MPGlobalAnswersCell
|
@implementation MPGlobalAnswersCell
|
||||||
@@ -247,14 +258,16 @@
|
|||||||
@implementation MPAnswersQuestionCell {
|
@implementation MPAnswersQuestionCell {
|
||||||
NSManagedObjectID *_siteOID;
|
NSManagedObjectID *_siteOID;
|
||||||
NSManagedObjectID *_questionOID;
|
NSManagedObjectID *_questionOID;
|
||||||
|
__weak MPAnswersViewController *_answersVC;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - State
|
#pragma mark - State
|
||||||
|
|
||||||
- (void)setQuestion:(MPSiteQuestionEntity *)question forSite:(MPSiteEntity *)site {
|
- (void)setQuestion:(MPSiteQuestionEntity *)question forSite:(MPSiteEntity *)site inVC:(MPAnswersViewController *)answersVC {
|
||||||
|
|
||||||
_siteOID = site.objectID;
|
_siteOID = site.objectID;
|
||||||
_questionOID = question.objectID;
|
_questionOID = question.objectID;
|
||||||
|
_answersVC = answersVC;
|
||||||
|
|
||||||
[self updateAnswerForQuestion:question ofSite:site];
|
[self updateAnswerForQuestion:question ofSite:site];
|
||||||
}
|
}
|
||||||
@@ -272,9 +285,11 @@
|
|||||||
|
|
||||||
NSString *keyword = textField.text;
|
NSString *keyword = textField.text;
|
||||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||||
|
BOOL didAddQuestionObject = NO;
|
||||||
MPSiteEntity *site = [MPSiteEntity existingObjectWithID:_siteOID inContext:context];
|
MPSiteEntity *site = [MPSiteEntity existingObjectWithID:_siteOID inContext:context];
|
||||||
MPSiteQuestionEntity *question = [MPSiteQuestionEntity existingObjectWithID:_questionOID inContext:context];
|
MPSiteQuestionEntity *question = [MPSiteQuestionEntity existingObjectWithID:_questionOID inContext:context];
|
||||||
if (!question) {
|
if (!question) {
|
||||||
|
didAddQuestionObject = YES;
|
||||||
[site addQuestionsObject:question = [MPSiteQuestionEntity insertNewObjectInContext:context]];
|
[site addQuestionsObject:question = [MPSiteQuestionEntity insertNewObjectInContext:context]];
|
||||||
question.site = site;
|
question.site = site;
|
||||||
}
|
}
|
||||||
@@ -291,6 +306,9 @@
|
|||||||
|
|
||||||
_questionOID = question.objectID;
|
_questionOID = question.objectID;
|
||||||
[self updateAnswerForQuestion:question ofSite:site];
|
[self updateAnswerForQuestion:question ofSite:site];
|
||||||
|
|
||||||
|
if (didAddQuestionObject)
|
||||||
|
[_answersVC didAddQuestion:question toSite:site];
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ const long MPAvatarAdd = 10000;
|
|||||||
@property(strong, nonatomic) IBOutlet NSLayoutConstraint *avatarSizeConstraint;
|
@property(strong, nonatomic) IBOutlet NSLayoutConstraint *avatarSizeConstraint;
|
||||||
@property(strong, nonatomic) IBOutlet NSLayoutConstraint *avatarToTopConstraint;
|
@property(strong, nonatomic) IBOutlet NSLayoutConstraint *avatarToTopConstraint;
|
||||||
@property(strong, nonatomic) IBOutlet NSLayoutConstraint *avatarRaisedConstraint;
|
@property(strong, nonatomic) IBOutlet NSLayoutConstraint *avatarRaisedConstraint;
|
||||||
|
@property(strong, nonatomic) IBOutlet NSLayoutConstraint *keyboardHeightConstraint;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -66,6 +67,12 @@ const long MPAvatarAdd = 10000;
|
|||||||
[self observeKeyPath:@"highlighted" withBlock:^(id from, id to, NSKeyValueChange cause, MPAvatarCell *_self) {
|
[self observeKeyPath:@"highlighted" withBlock:^(id from, id to, NSKeyValueChange cause, MPAvatarCell *_self) {
|
||||||
[_self updateAnimated:_self.superview != nil];
|
[_self updateAnimated:_self.superview != nil];
|
||||||
}];
|
}];
|
||||||
|
PearlAddNotificationObserver( UIKeyboardWillShowNotification, nil, [NSOperationQueue mainQueue],
|
||||||
|
^(MPAvatarCell *self, NSNotification *note) {
|
||||||
|
CGRect keyboardRect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
|
||||||
|
CGFloat keyboardHeight = CGRectGetHeight( self.window.screen.bounds ) - CGRectGetMinY( keyboardRect );
|
||||||
|
[self.keyboardHeightConstraint updateConstant:keyboardHeight];
|
||||||
|
} );
|
||||||
|
|
||||||
CABasicAnimation *toShadowOpacityAnimation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];
|
CABasicAnimation *toShadowOpacityAnimation = [CABasicAnimation animationWithKeyPath:@"shadowOpacity"];
|
||||||
toShadowOpacityAnimation.toValue = @0.2f;
|
toShadowOpacityAnimation.toValue = @0.2f;
|
||||||
@@ -99,6 +106,7 @@ const long MPAvatarAdd = 10000;
|
|||||||
- (void)dealloc {
|
- (void)dealloc {
|
||||||
|
|
||||||
[self removeKeyPathObservers];
|
[self removeKeyPathObservers];
|
||||||
|
PearlRemoveNotificationObservers();
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Properties
|
#pragma mark - Properties
|
||||||
@@ -264,7 +272,7 @@ const long MPAvatarAdd = 10000;
|
|||||||
case MPAvatarModeRaisedAndMinimized: {
|
case MPAvatarModeRaisedAndMinimized: {
|
||||||
[self.avatarSizeConstraint updateConstant:36];
|
[self.avatarSizeConstraint updateConstant:36];
|
||||||
[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultLow];
|
[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultLow];
|
||||||
[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultHigh];
|
[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultHigh + 2];
|
||||||
[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh];
|
[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh];
|
||||||
self.nameContainer.alpha = 0;
|
self.nameContainer.alpha = 0;
|
||||||
self.nameContainer.backgroundColor = [UIColor blackColor];
|
self.nameContainer.backgroundColor = [UIColor blackColor];
|
||||||
|
|||||||
@@ -99,6 +99,8 @@
|
|||||||
- (void)setCoached:(BOOL)coached {
|
- (void)setCoached:(BOOL)coached {
|
||||||
|
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:coached forKey:strf( @"%@.%ld.coached", self.coachedClass, (long)self.coachedVersion )];
|
[[NSUserDefaults standardUserDefaults] setBool:coached forKey:strf( @"%@.%ld.coached", self.coachedClass, (long)self.coachedVersion )];
|
||||||
|
if (![[NSUserDefaults standardUserDefaults] synchronize])
|
||||||
|
wrn( @"Couldn't synchronize after coachmark updates." );
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -257,8 +257,11 @@
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
[MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||||
[context deleteObject:[self siteInContext:context]];
|
MPSiteEntity *site_ = [self siteInContext:context];
|
||||||
[context saveToStore];
|
if (site_) {
|
||||||
|
[context deleteObject:site_];
|
||||||
|
[context saveToStore];
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
} cancelTitle:@"Cancel" destructiveTitle:@"Delete Site" otherTitles:nil];
|
} cancelTitle:@"Cancel" destructiveTitle:@"Delete Site" otherTitles:nil];
|
||||||
}
|
}
|
||||||
@@ -516,7 +519,7 @@
|
|||||||
TimeToCrack timeToCrack;
|
TimeToCrack timeToCrack;
|
||||||
NSString *timeToCrackString = nil;
|
NSString *timeToCrackString = nil;
|
||||||
id<MPAlgorithm> algorithm = site.algorithm?: MPAlgorithmDefault;
|
id<MPAlgorithm> algorithm = site.algorithm?: MPAlgorithmDefault;
|
||||||
MPAttacker attackHardware = [[MPConfig get].siteAttacker unsignedIntegerValue];
|
MPAttacker attackHardware = [[MPConfig get].siteAttacker integerValue];
|
||||||
if ([algorithm timeToCrack:&timeToCrack passwordOfType:site.type byAttacker:attackHardware] ||
|
if ([algorithm timeToCrack:&timeToCrack passwordOfType:site.type byAttacker:attackHardware] ||
|
||||||
[algorithm timeToCrack:&timeToCrack passwordString:password byAttacker:attackHardware])
|
[algorithm timeToCrack:&timeToCrack passwordString:password byAttacker:attackHardware])
|
||||||
timeToCrackString = NSStringFromTimeToCrack( timeToCrack );
|
timeToCrackString = NSStringFromTimeToCrack( timeToCrack );
|
||||||
|
|||||||
@@ -63,10 +63,14 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
|
|||||||
|
|
||||||
self.view.backgroundColor = [UIColor clearColor];
|
self.view.backgroundColor = [UIColor clearColor];
|
||||||
[self.passwordCollectionView automaticallyAdjustInsetsForKeyboard];
|
[self.passwordCollectionView automaticallyAdjustInsetsForKeyboard];
|
||||||
[self.passwordsSearchBar enumerateViews:^(UIView *subview, BOOL *stop, BOOL *recurse) {
|
self.passwordsSearchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
|
||||||
if ([subview isKindOfClass:[UITextField class]])
|
if ([self.passwordsSearchBar respondsToSelector:@selector( keyboardAppearance )])
|
||||||
((UITextField *)subview).keyboardAppearance = UIKeyboardAppearanceDark;
|
self.passwordsSearchBar.keyboardAppearance = UIKeyboardAppearanceDark;
|
||||||
} recurse:YES];
|
else
|
||||||
|
[self.passwordsSearchBar enumerateViews:^(UIView *subview, BOOL *stop, BOOL *recurse) {
|
||||||
|
if ([subview isKindOfClass:[UITextField class]])
|
||||||
|
((UITextField *)subview).keyboardAppearance = UIKeyboardAppearanceDark;
|
||||||
|
} recurse:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewWillAppear:(BOOL)animated {
|
- (void)viewWillAppear:(BOOL)animated {
|
||||||
@@ -166,23 +170,29 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
|
|||||||
forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
|
forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
|
||||||
|
|
||||||
if (controller == _fetchedResultsController) {
|
if (controller == _fetchedResultsController) {
|
||||||
[self.passwordCollectionView performBatchUpdates:^{
|
@try {
|
||||||
[self fetchedItemsDidUpdate];
|
[self.passwordCollectionView performBatchUpdates:^{
|
||||||
switch (type) {
|
[self fetchedItemsDidUpdate];
|
||||||
case NSFetchedResultsChangeInsert:
|
switch (type) {
|
||||||
[self.passwordCollectionView insertItemsAtIndexPaths:@[ newIndexPath ]];
|
case NSFetchedResultsChangeInsert:
|
||||||
break;
|
[self.passwordCollectionView insertItemsAtIndexPaths:@[ newIndexPath ]];
|
||||||
case NSFetchedResultsChangeDelete:
|
break;
|
||||||
[self.passwordCollectionView deleteItemsAtIndexPaths:@[ indexPath ]];
|
case NSFetchedResultsChangeDelete:
|
||||||
break;
|
[self.passwordCollectionView deleteItemsAtIndexPaths:@[ indexPath ]];
|
||||||
case NSFetchedResultsChangeMove:
|
break;
|
||||||
[self.passwordCollectionView moveItemAtIndexPath:indexPath toIndexPath:newIndexPath];
|
case NSFetchedResultsChangeMove:
|
||||||
break;
|
[self.passwordCollectionView moveItemAtIndexPath:indexPath toIndexPath:newIndexPath];
|
||||||
case NSFetchedResultsChangeUpdate:
|
break;
|
||||||
[self.passwordCollectionView reloadItemsAtIndexPaths:@[ indexPath ]];
|
case NSFetchedResultsChangeUpdate:
|
||||||
break;
|
[self.passwordCollectionView reloadItemsAtIndexPaths:@[ indexPath ]];
|
||||||
}
|
break;
|
||||||
} completion:nil];
|
}
|
||||||
|
} completion:nil];
|
||||||
|
}
|
||||||
|
@catch (NSException *exception) {
|
||||||
|
wrn( @"While updating password cells: %@", [exception fullDescription] );
|
||||||
|
[self.passwordCollectionView reloadData];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,7 +267,7 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
|
|||||||
[UIView animateWithDuration:0.3f animations:^{
|
[UIView animateWithDuration:0.3f animations:^{
|
||||||
if (showTips & MPPasswordsBadNameTip)
|
if (showTips & MPPasswordsBadNameTip)
|
||||||
self.badNameTipContainer.alpha = 1;
|
self.badNameTipContainer.alpha = 1;
|
||||||
} completion:^(BOOL finished) {
|
} completion:^(BOOL finished) {
|
||||||
if (finished)
|
if (finished)
|
||||||
PearlMainQueueAfter( 5, ^{
|
PearlMainQueueAfter( 5, ^{
|
||||||
[UIView animateWithDuration:0.3f animations:^{
|
[UIView animateWithDuration:0.3f animations:^{
|
||||||
@@ -306,25 +316,33 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
|
|||||||
self.passwordSelectionContainer.alpha = 1;
|
self.passwordSelectionContainer.alpha = 1;
|
||||||
}];
|
}];
|
||||||
} );
|
} );
|
||||||
PearlAddNotificationObserver( MPSignedOutNotification, nil, [NSOperationQueue mainQueue],
|
PearlAddNotificationObserver( MPSignedOutNotification, nil, nil,
|
||||||
^(MPPasswordsViewController *self, NSNotification *note) {
|
^(MPPasswordsViewController *self, NSNotification *note) {
|
||||||
_fetchedResultsController = nil;
|
PearlMainQueue( ^{
|
||||||
self.passwordsSearchBar.text = nil;
|
_fetchedResultsController = nil;
|
||||||
[self.passwordCollectionView reloadData];
|
self.passwordsSearchBar.text = nil;
|
||||||
|
[self.passwordCollectionView reloadData];
|
||||||
|
} );
|
||||||
} );
|
} );
|
||||||
PearlAddNotificationObserver( MPCheckConfigNotification, nil, [NSOperationQueue mainQueue],
|
PearlAddNotificationObserver( MPCheckConfigNotification, nil, nil,
|
||||||
^(MPPasswordsViewController *self, NSNotification *note) {
|
^(MPPasswordsViewController *self, NSNotification *note) {
|
||||||
[self updateConfigKey:note.object];
|
PearlMainQueue( ^{
|
||||||
|
[self updateConfigKey:note.object];
|
||||||
|
} );
|
||||||
} );
|
} );
|
||||||
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresWillChangeNotification, nil, nil,
|
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresWillChangeNotification, nil, nil,
|
||||||
^(MPPasswordsViewController *self, NSNotification *note) {
|
^(MPPasswordsViewController *self, NSNotification *note) {
|
||||||
self->_fetchedResultsController = nil;
|
self->_fetchedResultsController = nil;
|
||||||
[self.passwordCollectionView reloadData];
|
PearlMainQueue( ^{
|
||||||
|
[self.passwordCollectionView reloadData];
|
||||||
|
} );
|
||||||
} );
|
} );
|
||||||
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresDidChangeNotification, nil, nil,
|
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresDidChangeNotification, nil, nil,
|
||||||
^(MPPasswordsViewController *self, NSNotification *note) {
|
^(MPPasswordsViewController *self, NSNotification *note) {
|
||||||
[self updatePasswords];
|
PearlMainQueue( ^{
|
||||||
[self registerObservers];
|
[self updatePasswords];
|
||||||
|
[self registerObservers];
|
||||||
|
} );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
NSManagedObjectContext *mainContext = [MPiOSAppDelegate managedObjectContextForMainThreadIfReady];
|
NSManagedObjectContext *mainContext = [MPiOSAppDelegate managedObjectContextForMainThreadIfReady];
|
||||||
@@ -371,28 +389,34 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
|
|||||||
if (![self.fetchedResultsController performFetch:&error])
|
if (![self.fetchedResultsController performFetch:&error])
|
||||||
err( @"Couldn't fetch sites: %@", [error fullDescription] );
|
err( @"Couldn't fetch sites: %@", [error fullDescription] );
|
||||||
|
|
||||||
[self.passwordCollectionView performBatchUpdates:^{
|
@try {
|
||||||
[self fetchedItemsDidUpdate];
|
[self.passwordCollectionView performBatchUpdates:^{
|
||||||
|
[self fetchedItemsDidUpdate];
|
||||||
|
|
||||||
NSInteger fromSections = self.passwordCollectionView.numberOfSections;
|
NSInteger fromSections = self.passwordCollectionView.numberOfSections;
|
||||||
NSInteger toSections = [self numberOfSectionsInCollectionView:self.passwordCollectionView];
|
NSInteger toSections = [self numberOfSectionsInCollectionView:self.passwordCollectionView];
|
||||||
for (NSInteger section = 0; section < MAX( toSections, fromSections ); ++section) {
|
for (NSInteger section = 0; section < MAX( toSections, fromSections ); ++section) {
|
||||||
if (section >= fromSections)
|
if (section >= fromSections)
|
||||||
[self.passwordCollectionView insertSections:[NSIndexSet indexSetWithIndex:section]];
|
[self.passwordCollectionView insertSections:[NSIndexSet indexSetWithIndex:section]];
|
||||||
else if (section >= toSections)
|
else if (section >= toSections)
|
||||||
[self.passwordCollectionView deleteSections:[NSIndexSet indexSetWithIndex:section]];
|
[self.passwordCollectionView deleteSections:[NSIndexSet indexSetWithIndex:section]];
|
||||||
else if (section < [oldSections count])
|
else if (section < [oldSections count])
|
||||||
[self.passwordCollectionView reloadItemsFromArray:oldSections[section]
|
[self.passwordCollectionView reloadItemsFromArray:oldSections[section]
|
||||||
toArray:[[self.fetchedResultsController sections][section] objects]
|
toArray:[[self.fetchedResultsController sections][section] objects]
|
||||||
inSection:section];
|
inSection:section];
|
||||||
else
|
else
|
||||||
[self.passwordCollectionView reloadSections:[NSIndexSet indexSetWithIndex:section]];
|
[self.passwordCollectionView reloadSections:[NSIndexSet indexSetWithIndex:section]];
|
||||||
}
|
}
|
||||||
} completion:^(BOOL finished) {
|
} completion:^(BOOL finished) {
|
||||||
if (finished)
|
if (finished)
|
||||||
[self.passwordCollectionView setContentOffset:CGPointMake( 0, -self.passwordCollectionView.contentInset.top )
|
[self.passwordCollectionView setContentOffset:CGPointMake( 0, -self.passwordCollectionView.contentInset.top )
|
||||||
animated:YES];
|
animated:YES];
|
||||||
}];
|
}];
|
||||||
|
}
|
||||||
|
@catch (NSException *exception) {
|
||||||
|
wrn( @"While updating password cells: %@", [exception fullDescription] );
|
||||||
|
[self.passwordCollectionView reloadData];
|
||||||
|
}
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,8 @@
|
|||||||
inf( @"Preferences will appear" );
|
inf( @"Preferences will appear" );
|
||||||
[super viewWillAppear:animated];
|
[super viewWillAppear:animated];
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"tipped.passwordsPreferences"];
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"tipped.passwordsPreferences"];
|
||||||
|
if (![[NSUserDefaults standardUserDefaults] synchronize])
|
||||||
|
wrn( @"Couldn't synchronize after preferences appearance." );
|
||||||
|
|
||||||
MPUserEntity *activeUser = [[MPiOSAppDelegate get] activeUserForMainThread];
|
MPUserEntity *activeUser = [[MPiOSAppDelegate get] activeUserForMainThread];
|
||||||
self.generatedTypeControl.selectedSegmentIndex = [self generatedSegmentIndexForType:activeUser.defaultType];
|
self.generatedTypeControl.selectedSegmentIndex = [self generatedSegmentIndexForType:activeUser.defaultType];
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
@property(weak, nonatomic) IBOutlet UITableViewCell *loadingCell;
|
@property(weak, nonatomic) IBOutlet UITableViewCell *loadingCell;
|
||||||
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *fuelMeterConstraint;
|
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *fuelMeterConstraint;
|
||||||
@property(weak, nonatomic) IBOutlet UIButton *fuelSpeedButton;
|
@property(weak, nonatomic) IBOutlet UIButton *fuelSpeedButton;
|
||||||
|
@property(weak, nonatomic) IBOutlet UILabel *fuelStatusLabel;
|
||||||
|
|
||||||
+ (NSString *)latestStoreFeatures;
|
+ (NSString *)latestStoreFeatures;
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,8 @@ PearlEnum( MPDevelopmentFuelConsumption,
|
|||||||
return nil;
|
return nil;
|
||||||
|
|
||||||
[[NSUserDefaults standardUserDefaults] setInteger:storeVersion forKey:@"storeVersion"];
|
[[NSUserDefaults standardUserDefaults] setInteger:storeVersion forKey:@"storeVersion"];
|
||||||
|
if (![[NSUserDefaults standardUserDefaults] synchronize])
|
||||||
|
wrn( @"Couldn't synchronize store version update." );
|
||||||
return features;
|
return features;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,16 +84,21 @@ PearlEnum( MPDevelopmentFuelConsumption,
|
|||||||
PearlRemoveNotificationObservers();
|
PearlRemoveNotificationObservers();
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - UITableViewDelegate
|
#pragma mark - UITableViewDataSource
|
||||||
|
|
||||||
- (MPStoreProductCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
- (MPStoreProductCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||||
|
|
||||||
MPStoreProductCell *cell = (MPStoreProductCell *)[super tableView:tableView cellForRowAtIndexPath:indexPath];
|
MPStoreProductCell *cell = (MPStoreProductCell *)[super tableView:tableView cellForRowAtIndexPath:indexPath];
|
||||||
if (cell.contentView.translatesAutoresizingMaskIntoConstraints) {
|
if (cell.contentView.translatesAutoresizingMaskIntoConstraints) {
|
||||||
cell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
|
cell.contentView.translatesAutoresizingMaskIntoConstraints = NO;
|
||||||
[cell addConstraint:
|
[cell addConstraints:@[
|
||||||
[NSLayoutConstraint constraintWithItem:cell attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual
|
[NSLayoutConstraint constraintWithItem:cell attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual
|
||||||
toItem:cell.contentView attribute:NSLayoutAttributeWidth multiplier:1 constant:0]];
|
toItem:cell.contentView attribute:NSLayoutAttributeTop multiplier:1 constant:0],
|
||||||
|
[NSLayoutConstraint constraintWithItem:cell attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:cell.contentView attribute:NSLayoutAttributeRight multiplier:1 constant:0],
|
||||||
|
[NSLayoutConstraint constraintWithItem:cell attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual
|
||||||
|
toItem:cell.contentView attribute:NSLayoutAttributeLeft multiplier:1 constant:0],
|
||||||
|
]];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (indexPath.section == 0)
|
if (indexPath.section == 0)
|
||||||
@@ -106,13 +113,20 @@ PearlEnum( MPDevelopmentFuelConsumption,
|
|||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||||
|
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - UITableViewDelegate
|
||||||
|
|
||||||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||||
|
|
||||||
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
|
UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
|
||||||
[cell layoutIfNeeded];
|
[cell layoutIfNeeded];
|
||||||
[cell layoutIfNeeded];
|
[cell layoutIfNeeded];
|
||||||
|
|
||||||
dbg_return_tr( cell.contentView.bounds.size.height, @ );
|
dbg_return_tr( cell.contentView.bounds.size.height, @, indexPath );
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||||
@@ -252,18 +266,24 @@ PearlEnum( MPDevelopmentFuelConsumption,
|
|||||||
- (void)updateFuel {
|
- (void)updateFuel {
|
||||||
|
|
||||||
CGFloat weeklyFuelConsumption = [self weeklyFuelConsumption]; /* consume x fuel / week */
|
CGFloat weeklyFuelConsumption = [self weeklyFuelConsumption]; /* consume x fuel / week */
|
||||||
CGFloat fuel = [[MPiOSConfig get].developmentFuel floatValue]; /* x fuel left */
|
CGFloat fuelRemaining = [[MPiOSConfig get].developmentFuelRemaining floatValue]; /* x fuel left */
|
||||||
|
CGFloat fuelInvested = [[MPiOSConfig get].developmentFuelInvested floatValue]; /* x fuel left */
|
||||||
NSDate *now = [NSDate date];
|
NSDate *now = [NSDate date];
|
||||||
NSTimeInterval fuelSecondsElapsed = -[[MPiOSConfig get].developmentFuelChecked timeIntervalSinceDate:now];
|
NSTimeInterval fuelSecondsElapsed = -[[MPiOSConfig get].developmentFuelChecked timeIntervalSinceDate:now];
|
||||||
if (fuelSecondsElapsed > 3600 || ![MPiOSConfig get].developmentFuelChecked) {
|
if (fuelSecondsElapsed > 3600 || ![MPiOSConfig get].developmentFuelChecked) {
|
||||||
NSTimeInterval weeksElapsed = fuelSecondsElapsed / (3600 * 24 * 7 /* 1 week */); /* x weeks elapsed */
|
NSTimeInterval weeksElapsed = fuelSecondsElapsed / (3600 * 24 * 7 /* 1 week */); /* x weeks elapsed */
|
||||||
fuel -= weeklyFuelConsumption * weeksElapsed;
|
NSTimeInterval fuelConsumed = weeklyFuelConsumption * weeksElapsed;
|
||||||
|
fuelRemaining -= fuelConsumed;
|
||||||
|
fuelInvested += fuelConsumed;
|
||||||
[MPiOSConfig get].developmentFuelChecked = now;
|
[MPiOSConfig get].developmentFuelChecked = now;
|
||||||
[MPiOSConfig get].developmentFuel = @(fuel);
|
[MPiOSConfig get].developmentFuelRemaining = @(fuelRemaining);
|
||||||
|
[MPiOSConfig get].developmentFuelInvested = @(fuelInvested);
|
||||||
}
|
}
|
||||||
|
|
||||||
CGFloat fuelRatio = weeklyFuelConsumption == 0? 0: fuel / weeklyFuelConsumption; /* x weeks worth of fuel left */
|
CGFloat fuelRatio = weeklyFuelConsumption == 0? 0: fuelRemaining / weeklyFuelConsumption; /* x weeks worth of fuel left */
|
||||||
[self.fuelMeterConstraint updateConstant:MIN( 0.5f, fuelRatio - 0.5f ) * 160]; /* -80pt = 0 weeks left, 80pt = >=1 week left */
|
[self.fuelMeterConstraint updateConstant:MIN( 0.5f, fuelRatio - 0.5f ) * 160]; /* -80pt = 0 weeks left, 80pt = >=1 week left */
|
||||||
|
self.fuelStatusLabel.text = strf( @"fuel left: %0.1f work hours\ninvested: %0.1f work hours", fuelRemaining, fuelInvested );
|
||||||
|
self.fuelStatusLabel.hidden = (fuelRemaining + fuelInvested) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (CGFloat)weeklyFuelConsumption {
|
- (CGFloat)weeklyFuelConsumption {
|
||||||
@@ -302,7 +322,7 @@ PearlEnum( MPDevelopmentFuelConsumption,
|
|||||||
- (NSInteger)quantityForProductIdentifier:(NSString *)productIdentifier {
|
- (NSInteger)quantityForProductIdentifier:(NSString *)productIdentifier {
|
||||||
|
|
||||||
if ([productIdentifier isEqualToString:MPProductFuel])
|
if ([productIdentifier isEqualToString:MPProductFuel])
|
||||||
return (NSInteger)(MP_FUEL_HOURLY_RATE * [self weeklyFuelConsumption]);
|
return (NSInteger)(MP_FUEL_HOURLY_RATE * [self weeklyFuelConsumption] + .5f);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
@property(weak, nonatomic) IBOutlet UIView *thanksTipContainer;
|
@property(weak, nonatomic) IBOutlet UIView *thanksTipContainer;
|
||||||
@property(weak, nonatomic) IBOutlet UIButton *nextAvatarButton;
|
@property(weak, nonatomic) IBOutlet UIButton *nextAvatarButton;
|
||||||
@property(weak, nonatomic) IBOutlet UIButton *previousAvatarButton;
|
@property(weak, nonatomic) IBOutlet UIButton *previousAvatarButton;
|
||||||
|
@property(weak, nonatomic) IBOutlet NSLayoutConstraint *keyboardHeightConstraint;
|
||||||
|
|
||||||
@property(assign, nonatomic, readonly) BOOL active;
|
@property(assign, nonatomic, readonly) BOOL active;
|
||||||
|
|
||||||
|
|||||||
@@ -649,6 +649,12 @@ referenceSizeForFooterInSection:(NSInteger)section {
|
|||||||
self.userSelectionContainer.alpha = 1;
|
self.userSelectionContainer.alpha = 1;
|
||||||
}];
|
}];
|
||||||
} );
|
} );
|
||||||
|
PearlAddNotificationObserver( UIKeyboardWillShowNotification, nil, [NSOperationQueue mainQueue],
|
||||||
|
^(MPUsersViewController *self, NSNotification *note) {
|
||||||
|
CGRect keyboardRect = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
|
||||||
|
CGFloat keyboardHeight = CGRectGetHeight( self.view.window.screen.bounds ) - CGRectGetMinY( keyboardRect );
|
||||||
|
[self.keyboardHeightConstraint updateConstant:keyboardHeight];
|
||||||
|
} );
|
||||||
|
|
||||||
NSManagedObjectContext *mainContext = [MPiOSAppDelegate managedObjectContextForMainThreadIfReady];
|
NSManagedObjectContext *mainContext = [MPiOSAppDelegate managedObjectContextForMainThreadIfReady];
|
||||||
[UIView animateWithDuration:0.3f animations:^{
|
[UIView animateWithDuration:0.3f animations:^{
|
||||||
@@ -660,7 +666,7 @@ referenceSizeForFooterInSection:(NSInteger)section {
|
|||||||
[self.storeLoadingActivity startAnimating];
|
[self.storeLoadingActivity startAnimating];
|
||||||
|
|
||||||
if (mainContext)
|
if (mainContext)
|
||||||
PearlAddNotificationObserver( NSManagedObjectContextObjectsDidChangeNotification, mainContext, [NSOperationQueue mainQueue],
|
PearlAddNotificationObserver( NSManagedObjectContextObjectsDidChangeNotification, mainContext, nil,
|
||||||
^(MPUsersViewController *self, NSNotification *note) {
|
^(MPUsersViewController *self, NSNotification *note) {
|
||||||
NSSet *insertedObjects = note.userInfo[NSInsertedObjectsKey];
|
NSSet *insertedObjects = note.userInfo[NSInsertedObjectsKey];
|
||||||
NSSet *deletedObjects = note.userInfo[NSDeletedObjectsKey];
|
NSSet *deletedObjects = note.userInfo[NSDeletedObjectsKey];
|
||||||
@@ -670,11 +676,11 @@ referenceSizeForFooterInSection:(NSInteger)section {
|
|||||||
}]] count])
|
}]] count])
|
||||||
[self reloadUsers];
|
[self reloadUsers];
|
||||||
} );
|
} );
|
||||||
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresWillChangeNotification, nil, [NSOperationQueue mainQueue],
|
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresWillChangeNotification, [MPiOSAppDelegate get].storeCoordinator, nil,
|
||||||
^(MPUsersViewController *self, NSNotification *note) {
|
^(MPUsersViewController *self, NSNotification *note) {
|
||||||
self.userIDs = nil;
|
self.userIDs = nil;
|
||||||
} );
|
} );
|
||||||
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresDidChangeNotification, nil, [NSOperationQueue mainQueue],
|
PearlAddNotificationObserver( NSPersistentStoreCoordinatorStoresDidChangeNotification, [MPiOSAppDelegate get].storeCoordinator, nil,
|
||||||
^(MPUsersViewController *self, NSNotification *note) {
|
^(MPUsersViewController *self, NSNotification *note) {
|
||||||
[self registerObservers];
|
[self registerObservers];
|
||||||
[self reloadUsers];
|
[self reloadUsers];
|
||||||
|
|||||||
@@ -50,8 +50,11 @@
|
|||||||
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
|
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request
|
||||||
navigationType:(UIWebViewNavigationType)navigationType {
|
navigationType:(UIWebViewNavigationType)navigationType {
|
||||||
|
|
||||||
if ([[request.URL absoluteString] rangeOfString:@"thanks.lhunath.com"].location != NSNotFound)
|
if ([[request.URL absoluteString] rangeOfString:@"thanks.lhunath.com"].location != NSNotFound) {
|
||||||
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"tipped.thanks"];
|
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"tipped.thanks"];
|
||||||
|
if (![[NSUserDefaults standardUserDefaults] synchronize])
|
||||||
|
wrn( @"Couldn't synchronize thanks tip." );
|
||||||
|
}
|
||||||
|
|
||||||
if ([request.URL isEqual:request.mainDocumentURL]) {
|
if ([request.URL isEqual:request.mainDocumentURL]) {
|
||||||
self.webNavigationItem.title = request.URL.host;
|
self.webNavigationItem.title = request.URL.host;
|
||||||
|
|||||||
@@ -138,18 +138,6 @@
|
|||||||
@"Find the store from the user pull‑down after logging in.", latestFeatures )
|
@"Find the store from the user pull‑down after logging in.", latestFeatures )
|
||||||
viewStyle:UIAlertViewStyleDefault initAlert:nil tappedButtonBlock:nil
|
viewStyle:UIAlertViewStyleDefault initAlert:nil tappedButtonBlock:nil
|
||||||
cancelTitle:@"Thanks" otherTitles:nil];
|
cancelTitle:@"Thanks" otherTitles:nil];
|
||||||
|
|
||||||
MPCheckpoint( MPCheckpointStarted, @{
|
|
||||||
@"simulator" : PearlStringB( [PearlDeviceUtils isSimulator] ),
|
|
||||||
@"encrypted" : PearlStringB( [PearlDeviceUtils isAppEncrypted] ),
|
|
||||||
@"jailbroken" : PearlStringB( [PearlDeviceUtils isJailbroken] ),
|
|
||||||
@"platform" : [PearlDeviceUtils platform],
|
|
||||||
#ifdef APPSTORE
|
|
||||||
@"legal" : PearlStringB([PearlDeviceUtils isAppEncrypted]),
|
|
||||||
#else
|
|
||||||
@"legal" : @"YES",
|
|
||||||
#endif
|
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
@catch (id exception) {
|
@catch (id exception) {
|
||||||
err( @"During Post-Startup: %@", exception );
|
err( @"During Post-Startup: %@", exception );
|
||||||
@@ -293,33 +281,28 @@
|
|||||||
inf( @"Re-activated" );
|
inf( @"Re-activated" );
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification object:nil];
|
[[NSNotificationCenter defaultCenter] postNotificationName:MPCheckConfigNotification object:nil];
|
||||||
|
|
||||||
NSString *importHeader = @"# Master Password site export";
|
PearlNotMainQueue( ^{
|
||||||
NSString *importedSitesString = [UIPasteboard generalPasteboard].string;
|
NSString *importHeader = @"# Master Password site export";
|
||||||
if ([importedSitesString length] > [importHeader length] &&
|
NSString *importedSitesString = [UIPasteboard generalPasteboard].string;
|
||||||
[[importedSitesString substringToIndex:[importHeader length]] isEqualToString:importHeader])
|
if ([importedSitesString length] > [importHeader length] &&
|
||||||
[PearlAlert showAlertWithTitle:@"Import Sites?" message:
|
[[importedSitesString substringToIndex:[importHeader length]] isEqualToString:importHeader])
|
||||||
@"We've detected Master Password import sites on your pasteboard, would you like to import them?"
|
[PearlAlert showAlertWithTitle:@"Import Sites?" message:
|
||||||
viewStyle:UIAlertViewStyleDefault initAlert:nil
|
@"We've detected Master Password import sites on your pasteboard, would you like to import them?"
|
||||||
tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
viewStyle:UIAlertViewStyleDefault initAlert:nil
|
||||||
if (buttonIndex == [alert cancelButtonIndex])
|
tappedButtonBlock:^(UIAlertView *alert, NSInteger buttonIndex) {
|
||||||
return;
|
if (buttonIndex == [alert cancelButtonIndex])
|
||||||
|
return;
|
||||||
|
|
||||||
[self importSites:importedSitesString];
|
[self importSites:importedSitesString];
|
||||||
[UIPasteboard generalPasteboard].string = nil;
|
[UIPasteboard generalPasteboard].string = @"";
|
||||||
} cancelTitle:@"No" otherTitles:@"Import Sites", nil];
|
} cancelTitle:@"No" otherTitles:@"Import Sites", nil];
|
||||||
|
} );
|
||||||
|
|
||||||
[super applicationDidBecomeActive:application];
|
[super applicationDidBecomeActive:application];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - Behavior
|
#pragma mark - Behavior
|
||||||
|
|
||||||
- (void)showReview {
|
|
||||||
|
|
||||||
[super showReview];
|
|
||||||
|
|
||||||
MPCheckpoint( MPCheckpointReview, nil );
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)showFeedbackWithLogs:(BOOL)logs forVC:(UIViewController *)viewController {
|
- (void)showFeedbackWithLogs:(BOOL)logs forVC:(UIViewController *)viewController {
|
||||||
|
|
||||||
if (![PearlEMail canSendMail])
|
if (![PearlEMail canSendMail])
|
||||||
@@ -522,8 +505,6 @@
|
|||||||
[self signOutAnimated:YES];
|
[self signOutAnimated:YES];
|
||||||
if (didReset)
|
if (didReset)
|
||||||
didReset();
|
didReset();
|
||||||
|
|
||||||
MPCheckpoint( MPCheckpointChangeMP, nil );
|
|
||||||
}
|
}
|
||||||
cancelTitle:[PearlStrings get].commonButtonAbort
|
cancelTitle:[PearlStrings get].commonButtonAbort
|
||||||
otherTitles:[PearlStrings get].commonButtonContinue, nil];
|
otherTitles:[PearlStrings get].commonButtonContinue, nil];
|
||||||
@@ -554,28 +535,25 @@
|
|||||||
[PearlLogger get].printLevel = PearlLogLevelInfo;
|
[PearlLogger get].printLevel = PearlLogLevelInfo;
|
||||||
|
|
||||||
#ifdef CRASHLYTICS
|
#ifdef CRASHLYTICS
|
||||||
[[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].rememberLogin boolValue] forKey:@"rememberLogin"];
|
[[Crashlytics sharedInstance] setBoolValue:[[MPConfig get].rememberLogin boolValue] forKey:@"rememberLogin"];
|
||||||
[[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].sendInfo boolValue] forKey:@"sendInfo"];
|
[[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].sendInfo boolValue] forKey:@"sendInfo"];
|
||||||
[[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].helpHidden boolValue] forKey:@"helpHidden"];
|
[[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].helpHidden boolValue] forKey:@"helpHidden"];
|
||||||
[[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].showSetup boolValue] forKey:@"showQuickStart"];
|
[[Crashlytics sharedInstance] setBoolValue:[[MPiOSConfig get].showSetup boolValue] forKey:@"showQuickStart"];
|
||||||
[[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].firstRun boolValue] forKey:@"firstRun"];
|
[[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].firstRun boolValue] forKey:@"firstRun"];
|
||||||
[[Crashlytics sharedInstance] setIntValue:[[PearlConfig get].launchCount intValue] forKey:@"launchCount"];
|
[[Crashlytics sharedInstance] setIntValue:[[PearlConfig get].launchCount intValue] forKey:@"launchCount"];
|
||||||
[[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].askForReviews boolValue] forKey:@"askForReviews"];
|
[[Crashlytics sharedInstance] setBoolValue:[[PearlConfig get].askForReviews boolValue] forKey:@"askForReviews"];
|
||||||
[[Crashlytics sharedInstance] setIntValue:[[PearlConfig get].reviewAfterLaunches intValue] forKey:@"reviewAfterLaunches"];
|
[[Crashlytics sharedInstance] setIntValue:[[PearlConfig get].reviewAfterLaunches intValue] forKey:@"reviewAfterLaunches"];
|
||||||
[[Crashlytics sharedInstance] setObjectValue:[PearlConfig get].reviewedVersion forKey:@"reviewedVersion"];
|
[[Crashlytics sharedInstance] setObjectValue:[PearlConfig get].reviewedVersion forKey:@"reviewedVersion"];
|
||||||
|
[[Crashlytics sharedInstance] setBoolValue:[PearlDeviceUtils isSimulator] forKey:@"simulator"];
|
||||||
|
[[Crashlytics sharedInstance] setBoolValue:[PearlDeviceUtils isAppEncrypted] forKey:@"encrypted"];
|
||||||
|
[[Crashlytics sharedInstance] setBoolValue:[PearlDeviceUtils isJailbroken] forKey:@"jailbroken"];
|
||||||
|
[[Crashlytics sharedInstance] setObjectValue:[PearlDeviceUtils platform] forKey:@"platform"];
|
||||||
|
#ifdef APPSTORE
|
||||||
|
[[Crashlytics sharedInstance] setBoolValue:[PearlDeviceUtils isAppEncrypted] forKey:@"reviewedVersion"];
|
||||||
|
#else
|
||||||
|
[[Crashlytics sharedInstance] setBoolValue:YES forKey:@"reviewedVersion"];
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MPCheckpoint( MPCheckpointConfig, @{
|
|
||||||
@"rememberLogin" : @([[MPConfig get].rememberLogin boolValue]),
|
|
||||||
@"sendInfo" : @([[MPiOSConfig get].sendInfo boolValue]),
|
|
||||||
@"helpHidden" : @([[MPiOSConfig get].helpHidden boolValue]),
|
|
||||||
@"showQuickStart" : @([[MPiOSConfig get].showSetup boolValue]),
|
|
||||||
@"firstRun" : @([[PearlConfig get].firstRun boolValue]),
|
|
||||||
@"launchCount" : NilToNSNull( [PearlConfig get].launchCount ),
|
|
||||||
@"askForReviews" : @([[PearlConfig get].askForReviews boolValue]),
|
|
||||||
@"reviewAfterLaunches" : NilToNSNull( [PearlConfig get].reviewAfterLaunches ),
|
|
||||||
@"reviewedVersion" : NilToNSNull( [PearlConfig get].reviewedVersion )
|
|
||||||
} );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,8 @@
|
|||||||
@property(nonatomic, retain) NSNumber *loginNameTipShown;
|
@property(nonatomic, retain) NSNumber *loginNameTipShown;
|
||||||
@property(nonatomic, retain) NSNumber *traceMode;
|
@property(nonatomic, retain) NSNumber *traceMode;
|
||||||
@property(nonatomic, retain) NSNumber *dictationSearch;
|
@property(nonatomic, retain) NSNumber *dictationSearch;
|
||||||
@property(nonatomic, retain) NSNumber *developmentFuel;
|
@property(nonatomic, retain) NSNumber *developmentFuelRemaining;
|
||||||
|
@property(nonatomic, retain) NSNumber *developmentFuelInvested;
|
||||||
@property(nonatomic, retain) NSNumber *developmentFuelConsumption;
|
@property(nonatomic, retain) NSNumber *developmentFuelConsumption;
|
||||||
@property(nonatomic, retain) NSDate *developmentFuelChecked;
|
@property(nonatomic, retain) NSDate *developmentFuelChecked;
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
@implementation MPiOSConfig
|
@implementation MPiOSConfig
|
||||||
|
|
||||||
@dynamic helpHidden, siteInfoHidden, showSetup, actionsTipShown, typeTipShown, loginNameTipShown, traceMode, dictationSearch;
|
@dynamic helpHidden, siteInfoHidden, showSetup, actionsTipShown, typeTipShown, loginNameTipShown, traceMode, dictationSearch;
|
||||||
@dynamic developmentFuel, developmentFuelConsumption, developmentFuelChecked;
|
@dynamic developmentFuelRemaining, developmentFuelInvested, developmentFuelConsumption, developmentFuelChecked;
|
||||||
|
|
||||||
- (id)init {
|
- (id)init {
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,9 @@
|
|||||||
<string>mpsites</string>
|
<string>mpsites</string>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleTypeIconFiles</key>
|
<key>CFBundleTypeIconFiles</key>
|
||||||
<array/>
|
<array>
|
||||||
|
<string>Icon-Small</string>
|
||||||
|
</array>
|
||||||
<key>CFBundleTypeName</key>
|
<key>CFBundleTypeName</key>
|
||||||
<string>Master Password sites</string>
|
<string>Master Password sites</string>
|
||||||
<key>LSHandlerRank</key>
|
<key>LSHandlerRank</key>
|
||||||
@@ -44,7 +46,7 @@
|
|||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>© 2011-2013, Lyndir</string>
|
<string>Copyright © 2011-2014 Lyndir</string>
|
||||||
<key>UIAppFonts</key>
|
<key>UIAppFonts</key>
|
||||||
<array>
|
<array>
|
||||||
<string>Exo2.0-Bold.otf</string>
|
<string>Exo2.0-Bold.otf</string>
|
||||||
@@ -105,9 +107,9 @@
|
|||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>com.lyndir.masterpassword.sites</string>
|
<string>com.lyndir.masterpassword.sites</string>
|
||||||
<key>UTTypeSize320IconFile</key>
|
<key>UTTypeSize320IconFile</key>
|
||||||
<string></string>
|
<string>Icon-320.png</string>
|
||||||
<key>UTTypeSize64IconFile</key>
|
<key>UTTypeSize64IconFile</key>
|
||||||
<string></string>
|
<string>Icon-64.png</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>public.filename-extension</key>
|
<key>public.filename-extension</key>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
93D391ECBD9BD2C64115B5DD /* PearlSizedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39156E806BB78E04F78B9 /* PearlSizedTextView.m */; };
|
93D391ECBD9BD2C64115B5DD /* PearlSizedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39156E806BB78E04F78B9 /* PearlSizedTextView.m */; };
|
||||||
93D3922A53E41A54832E90D9 /* PearlOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D390FADEB325D8D54A957D /* PearlOverlay.m */; };
|
93D3922A53E41A54832E90D9 /* PearlOverlay.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D390FADEB325D8D54A957D /* PearlOverlay.m */; };
|
||||||
93D39262A8A97DB748213309 /* PearlEMail.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D393BB973253D4BAAC84AA /* PearlEMail.m */; };
|
93D39262A8A97DB748213309 /* PearlEMail.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D393BB973253D4BAAC84AA /* PearlEMail.m */; };
|
||||||
|
93D3928D629EA563F9EC4909 /* NSPersistentStore+PearlMigration.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D399C2F3D48E57C4803BDC /* NSPersistentStore+PearlMigration.m */; };
|
||||||
93D392A8777DC30C11361647 /* UITextView+PearlAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39AA10CD00D05937671B1 /* UITextView+PearlAttributes.h */; };
|
93D392A8777DC30C11361647 /* UITextView+PearlAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39AA10CD00D05937671B1 /* UITextView+PearlAttributes.h */; };
|
||||||
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */; };
|
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */; };
|
||||||
93D392FD5E2052F7D7DB3774 /* NSString+MPMarkDown.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39C41A27AA42D044D68AE /* NSString+MPMarkDown.m */; };
|
93D392FD5E2052F7D7DB3774 /* NSString+MPMarkDown.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39C41A27AA42D044D68AE /* NSString+MPMarkDown.m */; };
|
||||||
@@ -40,6 +41,7 @@
|
|||||||
93D39A53D76CA70786423458 /* UICollectionView+PearlReloadFromArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39246FC21C6E63E35D615 /* UICollectionView+PearlReloadFromArray.h */; };
|
93D39A53D76CA70786423458 /* UICollectionView+PearlReloadFromArray.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39246FC21C6E63E35D615 /* UICollectionView+PearlReloadFromArray.h */; };
|
||||||
93D39A5FF670957C0AF8298D /* MPPasswordCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39DEA995041A13DC9CAF7 /* MPPasswordCell.m */; };
|
93D39A5FF670957C0AF8298D /* MPPasswordCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39DEA995041A13DC9CAF7 /* MPPasswordCell.m */; };
|
||||||
93D39A8EA1C49CE43B63F47B /* PearlUICollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D8A953779B35403AF6E /* PearlUICollectionView.m */; };
|
93D39A8EA1C49CE43B63F47B /* PearlUICollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D8A953779B35403AF6E /* PearlUICollectionView.m */; };
|
||||||
|
93D39AA4A0BE66A872CCC02E /* NSPersistentStore+PearlMigration.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D397F4BAFFF7CF3F1B21A4 /* NSPersistentStore+PearlMigration.h */; };
|
||||||
93D39B429C67A62E29DC02DA /* MPRootSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D399493FEDDE74DD1A0C15 /* MPRootSegue.m */; };
|
93D39B429C67A62E29DC02DA /* MPRootSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D399493FEDDE74DD1A0C15 /* MPRootSegue.m */; };
|
||||||
93D39B76DD5AB108BA8928E8 /* UIScrollView+PearlAdjustInsets.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39DE2CB351D4E3789462B /* UIScrollView+PearlAdjustInsets.h */; };
|
93D39B76DD5AB108BA8928E8 /* UIScrollView+PearlAdjustInsets.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39DE2CB351D4E3789462B /* UIScrollView+PearlAdjustInsets.h */; };
|
||||||
93D39B842AB9A5D072810D76 /* NSError+PearlFullDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */; };
|
93D39B842AB9A5D072810D76 /* NSError+PearlFullDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */; };
|
||||||
@@ -58,6 +60,13 @@
|
|||||||
DA071BF3190187FE00179766 /* empty@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA071BF1190187FE00179766 /* empty@2x.png */; };
|
DA071BF3190187FE00179766 /* empty@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA071BF1190187FE00179766 /* empty@2x.png */; };
|
||||||
DA071BF4190187FE00179766 /* empty.png in Resources */ = {isa = PBXBuildFile; fileRef = DA071BF2190187FE00179766 /* empty.png */; };
|
DA071BF4190187FE00179766 /* empty.png in Resources */ = {isa = PBXBuildFile; fileRef = DA071BF2190187FE00179766 /* empty.png */; };
|
||||||
DA095E75172F4CD8001C948B /* MPLogsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3979190DACEBD1F6AE9F4 /* MPLogsViewController.m */; };
|
DA095E75172F4CD8001C948B /* MPLogsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3979190DACEBD1F6AE9F4 /* MPLogsViewController.m */; };
|
||||||
|
DA24EBAE19DAD08900FF010B /* tip_basic_black_top.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD38941711E29700CF925C /* tip_basic_black_top.png */; };
|
||||||
|
DA24EBAF19DAD08C00FF010B /* tip_basic_black_top@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD38951711E29700CF925C /* tip_basic_black_top@2x.png */; };
|
||||||
|
DA24EBE819DAD6DE00FF010B /* Icon-320.png in Resources */ = {isa = PBXBuildFile; fileRef = DA24EBE619DAD6DE00FF010B /* Icon-320.png */; };
|
||||||
|
DA24EBE919DAD6DE00FF010B /* Icon-64.png in Resources */ = {isa = PBXBuildFile; fileRef = DA24EBE719DAD6DE00FF010B /* Icon-64.png */; };
|
||||||
|
DA24EBEA19DAD6EE00FF010B /* Icon-Small.png in Resources */ = {isa = PBXBuildFile; fileRef = DA24EBBA19DAD4D000FF010B /* Icon-Small.png */; };
|
||||||
|
DA24EBEB19DAD6EE00FF010B /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA24EBBB19DAD4D000FF010B /* Icon-Small@2x.png */; };
|
||||||
|
DA24EBEC19DAD6EE00FF010B /* Icon-Small@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DA24EBBC19DAD4D000FF010B /* Icon-Small@3x.png */; };
|
||||||
DA250A17195665A100AC23F1 /* UITableView+PearlReloadFromArray.m in Sources */ = {isa = PBXBuildFile; fileRef = DA250A13195665A100AC23F1 /* UITableView+PearlReloadFromArray.m */; };
|
DA250A17195665A100AC23F1 /* UITableView+PearlReloadFromArray.m in Sources */ = {isa = PBXBuildFile; fileRef = DA250A13195665A100AC23F1 /* UITableView+PearlReloadFromArray.m */; };
|
||||||
DA250A18195665A100AC23F1 /* UITableView+PearlReloadFromArray.h in Headers */ = {isa = PBXBuildFile; fileRef = DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */; };
|
DA250A18195665A100AC23F1 /* UITableView+PearlReloadFromArray.h in Headers */ = {isa = PBXBuildFile; fileRef = DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */; };
|
||||||
DA250A19195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m in Sources */ = {isa = PBXBuildFile; fileRef = DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */; };
|
DA250A19195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m in Sources */ = {isa = PBXBuildFile; fileRef = DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */; };
|
||||||
@@ -172,8 +181,6 @@
|
|||||||
DAA175F519D86C620044227B /* markdown_lib.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA175B719D86C620044227B /* markdown_lib.m */; };
|
DAA175F519D86C620044227B /* markdown_lib.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA175B719D86C620044227B /* markdown_lib.m */; };
|
||||||
DAA175F619D86C620044227B /* markdown_output.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA175B819D86C620044227B /* markdown_output.m */; };
|
DAA175F619D86C620044227B /* markdown_output.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA175B819D86C620044227B /* markdown_output.m */; };
|
||||||
DAA175F719D86C620044227B /* markdown_parser.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA175BA19D86C620044227B /* markdown_parser.m */; };
|
DAA175F719D86C620044227B /* markdown_parser.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA175BA19D86C620044227B /* markdown_parser.m */; };
|
||||||
DAA1760F19D86C620044227B /* README.markdown in Sources */ = {isa = PBXBuildFile; fileRef = DAA175ED19D86C620044227B /* README.markdown */; };
|
|
||||||
DAA1761019D86C620044227B /* README_PEG-MARKDWON.markdown in Sources */ = {isa = PBXBuildFile; fileRef = DAA175EE19D86C620044227B /* README_PEG-MARKDWON.markdown */; };
|
|
||||||
DAA1761B19D86D0D0044227B /* libAttributedMarkdown.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAA1757D19D86BE70044227B /* libAttributedMarkdown.a */; };
|
DAA1761B19D86D0D0044227B /* libAttributedMarkdown.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAA1757D19D86BE70044227B /* libAttributedMarkdown.a */; };
|
||||||
DAA1762319D89B600044227B /* thumb_touch_id@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAA1761D19D89B600044227B /* thumb_touch_id@3x.png */; };
|
DAA1762319D89B600044227B /* thumb_touch_id@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAA1761D19D89B600044227B /* thumb_touch_id@3x.png */; };
|
||||||
DAA1762419D89B610044227B /* thumb_touch_id@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAA1761E19D89B600044227B /* thumb_touch_id@2x.png */; };
|
DAA1762419D89B610044227B /* thumb_touch_id@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAA1761E19D89B600044227B /* thumb_touch_id@2x.png */; };
|
||||||
@@ -478,6 +485,7 @@
|
|||||||
93D39730673227EFF6DEFF19 /* MPSetupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSetupViewController.h; sourceTree = "<group>"; };
|
93D39730673227EFF6DEFF19 /* MPSetupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSetupViewController.h; sourceTree = "<group>"; };
|
||||||
93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextView+PearlAttributes.m"; sourceTree = "<group>"; };
|
93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITextView+PearlAttributes.m"; sourceTree = "<group>"; };
|
||||||
93D3979190DACEBD1F6AE9F4 /* MPLogsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPLogsViewController.m; sourceTree = "<group>"; };
|
93D3979190DACEBD1F6AE9F4 /* MPLogsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPLogsViewController.m; sourceTree = "<group>"; };
|
||||||
|
93D397F4BAFFF7CF3F1B21A4 /* NSPersistentStore+PearlMigration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPersistentStore+PearlMigration.h"; sourceTree = "<group>"; };
|
||||||
93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlNavigationController.h; sourceTree = "<group>"; };
|
93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlNavigationController.h; sourceTree = "<group>"; };
|
||||||
93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+PearlFullDescription.h"; sourceTree = "<group>"; };
|
93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+PearlFullDescription.h"; sourceTree = "<group>"; };
|
||||||
93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPWebViewController.m; sourceTree = "<group>"; };
|
93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPWebViewController.m; sourceTree = "<group>"; };
|
||||||
@@ -486,6 +494,7 @@
|
|||||||
93D39975CE5AEC99E3F086C7 /* MPPasswordCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordCell.h; sourceTree = "<group>"; };
|
93D39975CE5AEC99E3F086C7 /* MPPasswordCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordCell.h; sourceTree = "<group>"; };
|
||||||
93D3999693660C89A7465F4E /* MPCoachmarkViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCoachmarkViewController.h; sourceTree = "<group>"; };
|
93D3999693660C89A7465F4E /* MPCoachmarkViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCoachmarkViewController.h; sourceTree = "<group>"; };
|
||||||
93D399A8E3181B442D347CD7 /* MPAlgorithmV2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAlgorithmV2.m; sourceTree = "<group>"; };
|
93D399A8E3181B442D347CD7 /* MPAlgorithmV2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAlgorithmV2.m; sourceTree = "<group>"; };
|
||||||
|
93D399C2F3D48E57C4803BDC /* NSPersistentStore+PearlMigration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPersistentStore+PearlMigration.m"; sourceTree = "<group>"; };
|
||||||
93D399E571F61E50A9BF8FAF /* MPUsersViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPUsersViewController.m; sourceTree = "<group>"; };
|
93D399E571F61E50A9BF8FAF /* MPUsersViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPUsersViewController.m; sourceTree = "<group>"; };
|
||||||
93D399F244BB522A317811BB /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = "<group>"; };
|
93D399F244BB522A317811BB /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = "<group>"; };
|
||||||
93D39A1DDFA09AE2E14D26DC /* UIResponder+PearlFirstResponder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIResponder+PearlFirstResponder.m"; sourceTree = "<group>"; };
|
93D39A1DDFA09AE2E14D26DC /* UIResponder+PearlFirstResponder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIResponder+PearlFirstResponder.m"; sourceTree = "<group>"; };
|
||||||
@@ -521,6 +530,32 @@
|
|||||||
DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
|
DA04E33D14B1E70400ECA4F3 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
|
||||||
DA071BF1190187FE00179766 /* empty@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "empty@2x.png"; sourceTree = "<group>"; };
|
DA071BF1190187FE00179766 /* empty@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "empty@2x.png"; sourceTree = "<group>"; };
|
||||||
DA071BF2190187FE00179766 /* empty.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = empty.png; sourceTree = "<group>"; };
|
DA071BF2190187FE00179766 /* empty.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = empty.png; sourceTree = "<group>"; };
|
||||||
|
DA24EBB219DAD4D000FF010B /* Icon-60.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-60.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBB319DAD4D000FF010B /* Icon-60@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-60@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBB419DAD4D000FF010B /* Icon-60@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-60@3x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBB519DAD4D000FF010B /* Icon-76.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-76.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBB619DAD4D000FF010B /* Icon-76@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-76@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBB719DAD4D000FF010B /* Icon-Small-40.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small-40.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBB819DAD4D000FF010B /* Icon-Small-40@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small-40@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBB919DAD4D000FF010B /* Icon-Small-40@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small-40@3x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBBA19DAD4D000FF010B /* Icon-Small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBBB19DAD4D000FF010B /* Icon-Small@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBBC19DAD4D000FF010B /* Icon-Small@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-Small@3x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBBD19DAD4D000FF010B /* iTunesArtwork.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iTunesArtwork.png; sourceTree = "<group>"; };
|
||||||
|
DA24EBBE19DAD4D000FF010B /* iTunesArtwork@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iTunesArtwork@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBBF19DAD4D000FF010B /* icon.sketch */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = icon.sketch; sourceTree = "<group>"; };
|
||||||
|
DA24EBC119DAD4D000FF010B /* 32.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 32.png; sourceTree = "<group>"; };
|
||||||
|
DA24EBC219DAD4D000FF010B /* 320-480.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "320-480.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBC319DAD4D000FF010B /* 320-480@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "320-480@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBC419DAD4D000FF010B /* 320-568@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "320-568@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBC519DAD4D000FF010B /* 375-667@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "375-667@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBC619DAD4D000FF010B /* 414-736@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "414-736@3x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBC719DAD4D000FF010B /* background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = background.png; sourceTree = "<group>"; };
|
||||||
|
DA24EBC819DAD4D000FF010B /* background@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "background@2x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBC919DAD4D000FF010B /* background@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "background@3x.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBCA19DAD4D000FF010B /* launch.sketch */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = launch.sketch; sourceTree = "<group>"; };
|
||||||
|
DA24EBE619DAD6DE00FF010B /* Icon-320.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-320.png"; sourceTree = "<group>"; };
|
||||||
|
DA24EBE719DAD6DE00FF010B /* Icon-64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon-64.png"; sourceTree = "<group>"; };
|
||||||
DA250A13195665A100AC23F1 /* UITableView+PearlReloadFromArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableView+PearlReloadFromArray.m"; sourceTree = "<group>"; };
|
DA250A13195665A100AC23F1 /* UITableView+PearlReloadFromArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UITableView+PearlReloadFromArray.m"; sourceTree = "<group>"; };
|
||||||
DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITableView+PearlReloadFromArray.h"; sourceTree = "<group>"; };
|
DA250A14195665A100AC23F1 /* UITableView+PearlReloadFromArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UITableView+PearlReloadFromArray.h"; sourceTree = "<group>"; };
|
||||||
DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UICollectionReusableView+PearlDequeue.m"; sourceTree = "<group>"; };
|
DA250A15195665A100AC23F1 /* UICollectionReusableView+PearlDequeue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UICollectionReusableView+PearlDequeue.m"; sourceTree = "<group>"; };
|
||||||
@@ -1547,6 +1582,55 @@
|
|||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
DA24EBB019DAD4D000FF010B /* ios */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
DA24EBB119DAD4D000FF010B /* icon */,
|
||||||
|
DA24EBBF19DAD4D000FF010B /* icon.sketch */,
|
||||||
|
DA24EBC019DAD4D000FF010B /* launch */,
|
||||||
|
DA24EBCA19DAD4D000FF010B /* launch.sketch */,
|
||||||
|
);
|
||||||
|
path = ios;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
DA24EBB119DAD4D000FF010B /* icon */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
DA24EBE619DAD6DE00FF010B /* Icon-320.png */,
|
||||||
|
DA24EBE719DAD6DE00FF010B /* Icon-64.png */,
|
||||||
|
DA24EBB219DAD4D000FF010B /* Icon-60.png */,
|
||||||
|
DA24EBB319DAD4D000FF010B /* Icon-60@2x.png */,
|
||||||
|
DA24EBB419DAD4D000FF010B /* Icon-60@3x.png */,
|
||||||
|
DA24EBB519DAD4D000FF010B /* Icon-76.png */,
|
||||||
|
DA24EBB619DAD4D000FF010B /* Icon-76@2x.png */,
|
||||||
|
DA24EBB719DAD4D000FF010B /* Icon-Small-40.png */,
|
||||||
|
DA24EBB819DAD4D000FF010B /* Icon-Small-40@2x.png */,
|
||||||
|
DA24EBB919DAD4D000FF010B /* Icon-Small-40@3x.png */,
|
||||||
|
DA24EBBA19DAD4D000FF010B /* Icon-Small.png */,
|
||||||
|
DA24EBBB19DAD4D000FF010B /* Icon-Small@2x.png */,
|
||||||
|
DA24EBBC19DAD4D000FF010B /* Icon-Small@3x.png */,
|
||||||
|
DA24EBBD19DAD4D000FF010B /* iTunesArtwork.png */,
|
||||||
|
DA24EBBE19DAD4D000FF010B /* iTunesArtwork@2x.png */,
|
||||||
|
);
|
||||||
|
path = icon;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
DA24EBC019DAD4D000FF010B /* launch */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
DA24EBC119DAD4D000FF010B /* 32.png */,
|
||||||
|
DA24EBC219DAD4D000FF010B /* 320-480.png */,
|
||||||
|
DA24EBC319DAD4D000FF010B /* 320-480@2x.png */,
|
||||||
|
DA24EBC419DAD4D000FF010B /* 320-568@2x.png */,
|
||||||
|
DA24EBC519DAD4D000FF010B /* 375-667@2x.png */,
|
||||||
|
DA24EBC619DAD4D000FF010B /* 414-736@3x.png */,
|
||||||
|
DA24EBC719DAD4D000FF010B /* background.png */,
|
||||||
|
DA24EBC819DAD4D000FF010B /* background@2x.png */,
|
||||||
|
DA24EBC919DAD4D000FF010B /* background@3x.png */,
|
||||||
|
);
|
||||||
|
path = launch;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
DA2509B619563E1E00AC23F1 /* Guide */ = {
|
DA2509B619563E1E00AC23F1 /* Guide */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1703,6 +1787,7 @@
|
|||||||
DABD360D1711E29400CF925C /* Media */ = {
|
DABD360D1711E29400CF925C /* Media */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
DA24EBB019DAD4D000FF010B /* ios */,
|
||||||
DAA1761D19D89B600044227B /* thumb_touch_id@3x.png */,
|
DAA1761D19D89B600044227B /* thumb_touch_id@3x.png */,
|
||||||
DAA1761E19D89B600044227B /* thumb_touch_id@2x.png */,
|
DAA1761E19D89B600044227B /* thumb_touch_id@2x.png */,
|
||||||
DAA1761F19D89B600044227B /* thumb_touch_id.png */,
|
DAA1761F19D89B600044227B /* thumb_touch_id.png */,
|
||||||
@@ -2518,8 +2603,6 @@
|
|||||||
DAFE45FC15039823003ABA7C /* Pearl-Crypto */,
|
DAFE45FC15039823003ABA7C /* Pearl-Crypto */,
|
||||||
DAFE460715039823003ABA7C /* Pearl-UIKit */,
|
DAFE460715039823003ABA7C /* Pearl-UIKit */,
|
||||||
DAC77CB1148291A600BCF976 /* Pearl-Prefix.pch */,
|
DAC77CB1148291A600BCF976 /* Pearl-Prefix.pch */,
|
||||||
DACA29751705E2BD002C6C22 /* jrswizzle */,
|
|
||||||
DACA29B41705E2DE002C6C22 /* uicolor-utilities */,
|
|
||||||
);
|
);
|
||||||
path = Pearl;
|
path = Pearl;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -2531,6 +2614,8 @@
|
|||||||
DA32D03719D111EB004F3F0E /* KCOrderedAccessorFix */,
|
DA32D03719D111EB004F3F0E /* KCOrderedAccessorFix */,
|
||||||
DAA141181922FED80032B392 /* iOS */,
|
DAA141181922FED80032B392 /* iOS */,
|
||||||
DAFC5662172C57EC00CB5CC5 /* InAppSettingsKit */,
|
DAFC5662172C57EC00CB5CC5 /* InAppSettingsKit */,
|
||||||
|
DACA29751705E2BD002C6C22 /* jrswizzle */,
|
||||||
|
DACA29B41705E2DE002C6C22 /* uicolor-utilities */,
|
||||||
DAC77CAF148291A600BCF976 /* Pearl */,
|
DAC77CAF148291A600BCF976 /* Pearl */,
|
||||||
);
|
);
|
||||||
name = External;
|
name = External;
|
||||||
@@ -2572,8 +2657,7 @@
|
|||||||
DACA29771705E2BD002C6C22 /* JRSwizzle.h */,
|
DACA29771705E2BD002C6C22 /* JRSwizzle.h */,
|
||||||
DACA298C1705E2BD002C6C22 /* JRSwizzle.m */,
|
DACA298C1705E2BD002C6C22 /* JRSwizzle.m */,
|
||||||
);
|
);
|
||||||
name = jrswizzle;
|
path = jrswizzle;
|
||||||
path = External/jrswizzle;
|
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
DACA29B41705E2DE002C6C22 /* uicolor-utilities */ = {
|
DACA29B41705E2DE002C6C22 /* uicolor-utilities */ = {
|
||||||
@@ -2584,8 +2668,7 @@
|
|||||||
DACA29BA1705E2DE002C6C22 /* UIColor+Expanded.m */,
|
DACA29BA1705E2DE002C6C22 /* UIColor+Expanded.m */,
|
||||||
DACA29BB1705E2DE002C6C22 /* UIColor+HSV.m */,
|
DACA29BB1705E2DE002C6C22 /* UIColor+HSV.m */,
|
||||||
);
|
);
|
||||||
name = "uicolor-utilities";
|
path = "uicolor-utilities";
|
||||||
path = "External/uicolor-utilities";
|
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
DAFC5662172C57EC00CB5CC5 /* InAppSettingsKit */ = {
|
DAFC5662172C57EC00CB5CC5 /* InAppSettingsKit */ = {
|
||||||
@@ -2711,6 +2794,8 @@
|
|||||||
93D39F9106F2CCFB94283188 /* NSError+PearlFullDescription.m */,
|
93D39F9106F2CCFB94283188 /* NSError+PearlFullDescription.m */,
|
||||||
93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */,
|
93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */,
|
||||||
93D391AA32F24290C424438E /* NSNotificationCenter+PearlEasyCleanup.h */,
|
93D391AA32F24290C424438E /* NSNotificationCenter+PearlEasyCleanup.h */,
|
||||||
|
93D399C2F3D48E57C4803BDC /* NSPersistentStore+PearlMigration.m */,
|
||||||
|
93D397F4BAFFF7CF3F1B21A4 /* NSPersistentStore+PearlMigration.h */,
|
||||||
);
|
);
|
||||||
path = Pearl;
|
path = Pearl;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -2934,6 +3019,7 @@
|
|||||||
93D393DB5325820241BA90A7 /* PearlSizedTextView.h in Headers */,
|
93D393DB5325820241BA90A7 /* PearlSizedTextView.h in Headers */,
|
||||||
93D392A8777DC30C11361647 /* UITextView+PearlAttributes.h in Headers */,
|
93D392A8777DC30C11361647 /* UITextView+PearlAttributes.h in Headers */,
|
||||||
93D39A53D76CA70786423458 /* UICollectionView+PearlReloadFromArray.h in Headers */,
|
93D39A53D76CA70786423458 /* UICollectionView+PearlReloadFromArray.h in Headers */,
|
||||||
|
93D39AA4A0BE66A872CCC02E /* NSPersistentStore+PearlMigration.h in Headers */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -2961,6 +3047,7 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = DA5BFA6D147E415C00F98B1E /* Build configuration list for PBXNativeTarget "MasterPassword" */;
|
buildConfigurationList = DA5BFA6D147E415C00F98B1E /* Build configuration list for PBXNativeTarget "MasterPassword" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
DA8D88E019DA412A00B189D0 /* Run Script: genassets */,
|
||||||
DA5BFA40147E415C00F98B1E /* Sources */,
|
DA5BFA40147E415C00F98B1E /* Sources */,
|
||||||
DA5BFA41147E415C00F98B1E /* Frameworks */,
|
DA5BFA41147E415C00F98B1E /* Frameworks */,
|
||||||
DA5BFA42147E415C00F98B1E /* Resources */,
|
DA5BFA42147E415C00F98B1E /* Resources */,
|
||||||
@@ -3067,7 +3154,7 @@
|
|||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
CLASSPREFIX = MP;
|
CLASSPREFIX = MP;
|
||||||
LastUpgradeCheck = 0600;
|
LastUpgradeCheck = 0610;
|
||||||
ORGANIZATIONNAME = Lyndir;
|
ORGANIZATIONNAME = Lyndir;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
DA32D01F19D111C6004F3F0E = {
|
DA32D01F19D111C6004F3F0E = {
|
||||||
@@ -3230,6 +3317,7 @@
|
|||||||
DA7304E5194E025900E72520 /* tip_basic_black.png in Resources */,
|
DA7304E5194E025900E72520 /* tip_basic_black.png in Resources */,
|
||||||
DABD393A1711E29700CF925C /* avatar-10.png in Resources */,
|
DABD393A1711E29700CF925C /* avatar-10.png in Resources */,
|
||||||
DABD393B1711E29700CF925C /* avatar-10@2x.png in Resources */,
|
DABD393B1711E29700CF925C /* avatar-10@2x.png in Resources */,
|
||||||
|
DA24EBAE19DAD08900FF010B /* tip_basic_black_top.png in Resources */,
|
||||||
DABD393C1711E29700CF925C /* avatar-11.png in Resources */,
|
DABD393C1711E29700CF925C /* avatar-11.png in Resources */,
|
||||||
DABD393D1711E29700CF925C /* avatar-11@2x.png in Resources */,
|
DABD393D1711E29700CF925C /* avatar-11@2x.png in Resources */,
|
||||||
DA73049D194E022700E72520 /* ui_spinner.png in Resources */,
|
DA73049D194E022700E72520 /* ui_spinner.png in Resources */,
|
||||||
@@ -3238,9 +3326,11 @@
|
|||||||
DA67461018DE7F0C00DFE240 /* Exo2.0-Bold.otf in Resources */,
|
DA67461018DE7F0C00DFE240 /* Exo2.0-Bold.otf in Resources */,
|
||||||
DABD39401711E29700CF925C /* avatar-13.png in Resources */,
|
DABD39401711E29700CF925C /* avatar-13.png in Resources */,
|
||||||
DA32D07C19D7D784004F3F0E /* background.png in Resources */,
|
DA32D07C19D7D784004F3F0E /* background.png in Resources */,
|
||||||
|
DA24EBE919DAD6DE00FF010B /* Icon-64.png in Resources */,
|
||||||
DABD39411711E29700CF925C /* avatar-13@2x.png in Resources */,
|
DABD39411711E29700CF925C /* avatar-13@2x.png in Resources */,
|
||||||
DABD39421711E29700CF925C /* avatar-14.png in Resources */,
|
DABD39421711E29700CF925C /* avatar-14.png in Resources */,
|
||||||
DABD39431711E29700CF925C /* avatar-14@2x.png in Resources */,
|
DABD39431711E29700CF925C /* avatar-14@2x.png in Resources */,
|
||||||
|
DA24EBE819DAD6DE00FF010B /* Icon-320.png in Resources */,
|
||||||
DAA1764419D8B82B0044227B /* personal_pw.png in Resources */,
|
DAA1764419D8B82B0044227B /* personal_pw.png in Resources */,
|
||||||
DABD39441711E29700CF925C /* avatar-15.png in Resources */,
|
DABD39441711E29700CF925C /* avatar-15.png in Resources */,
|
||||||
DABD39451711E29700CF925C /* avatar-15@2x.png in Resources */,
|
DABD39451711E29700CF925C /* avatar-15@2x.png in Resources */,
|
||||||
@@ -3320,6 +3410,7 @@
|
|||||||
DABD39F31711E29700CF925C /* icon_cancel@2x.png in Resources */,
|
DABD39F31711E29700CF925C /* icon_cancel@2x.png in Resources */,
|
||||||
DABD3A261711E29700CF925C /* icon_edit.png in Resources */,
|
DABD3A261711E29700CF925C /* icon_edit.png in Resources */,
|
||||||
DABD3A271711E29700CF925C /* icon_edit@2x.png in Resources */,
|
DABD3A271711E29700CF925C /* icon_edit@2x.png in Resources */,
|
||||||
|
DA24EBAF19DAD08C00FF010B /* tip_basic_black_top@2x.png in Resources */,
|
||||||
DABD3A3A1711E29700CF925C /* icon_find.png in Resources */,
|
DABD3A3A1711E29700CF925C /* icon_find.png in Resources */,
|
||||||
DABD3A3B1711E29700CF925C /* icon_find@2x.png in Resources */,
|
DABD3A3B1711E29700CF925C /* icon_find@2x.png in Resources */,
|
||||||
DAA1765319D8B82B0044227B /* choose_type@2x.png in Resources */,
|
DAA1765319D8B82B0044227B /* choose_type@2x.png in Resources */,
|
||||||
@@ -3348,6 +3439,7 @@
|
|||||||
DABD3B951711E29800CF925C /* pull-down.png in Resources */,
|
DABD3B951711E29800CF925C /* pull-down.png in Resources */,
|
||||||
DABD3B961711E29800CF925C /* pull-down@2x.png in Resources */,
|
DABD3B961711E29800CF925C /* pull-down@2x.png in Resources */,
|
||||||
DABD3B971711E29800CF925C /* pull-up.png in Resources */,
|
DABD3B971711E29800CF925C /* pull-up.png in Resources */,
|
||||||
|
DA24EBEA19DAD6EE00FF010B /* Icon-Small.png in Resources */,
|
||||||
DABD3B981711E29800CF925C /* pull-up@2x.png in Resources */,
|
DABD3B981711E29800CF925C /* pull-up@2x.png in Resources */,
|
||||||
DA7304A0194E022B00E72520 /* ui_textfield@2x.png in Resources */,
|
DA7304A0194E022B00E72520 /* ui_textfield@2x.png in Resources */,
|
||||||
DAA1765119D8B82B0044227B /* copy_pw@2x.png in Resources */,
|
DAA1765119D8B82B0044227B /* copy_pw@2x.png in Resources */,
|
||||||
@@ -3356,6 +3448,7 @@
|
|||||||
DAA1764519D8B82B0044227B /* name_new@2x.png in Resources */,
|
DAA1764519D8B82B0044227B /* name_new@2x.png in Resources */,
|
||||||
DA45224819062899008F650A /* icon_settings@2x.png in Resources */,
|
DA45224819062899008F650A /* icon_settings@2x.png in Resources */,
|
||||||
DA854C8418D4CFBF00106317 /* avatar-add.png in Resources */,
|
DA854C8418D4CFBF00106317 /* avatar-add.png in Resources */,
|
||||||
|
DA24EBEB19DAD6EE00FF010B /* Icon-Small@2x.png in Resources */,
|
||||||
DAA1764B19D8B82B0044227B /* login_name@2x.png in Resources */,
|
DAA1764B19D8B82B0044227B /* login_name@2x.png in Resources */,
|
||||||
DABD3C241711E2DC00CF925C /* MasterPassword.entitlements in Resources */,
|
DABD3C241711E2DC00CF925C /* MasterPassword.entitlements in Resources */,
|
||||||
DABD3C251711E2DC00CF925C /* Settings.bundle in Resources */,
|
DABD3C251711E2DC00CF925C /* Settings.bundle in Resources */,
|
||||||
@@ -3374,6 +3467,7 @@
|
|||||||
DAE1EF2217E942DE00BC0086 /* Localizable.strings in Resources */,
|
DAE1EF2217E942DE00BC0086 /* Localizable.strings in Resources */,
|
||||||
DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */,
|
DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */,
|
||||||
DA5A09DF171A70E4005284AB /* play.png in Resources */,
|
DA5A09DF171A70E4005284AB /* play.png in Resources */,
|
||||||
|
DA24EBEC19DAD6EE00FF010B /* Icon-Small@3x.png in Resources */,
|
||||||
DA5A09E0171A70E4005284AB /* play@2x.png in Resources */,
|
DA5A09E0171A70E4005284AB /* play@2x.png in Resources */,
|
||||||
DA5A09EA171BB0F7005284AB /* unlocked.png in Resources */,
|
DA5A09EA171BB0F7005284AB /* unlocked.png in Resources */,
|
||||||
DAA1762819D89B610044227B /* thumb_ios_integration.png in Resources */,
|
DAA1762819D89B610044227B /* thumb_ios_integration.png in Resources */,
|
||||||
@@ -3396,8 +3490,23 @@
|
|||||||
outputPaths = (
|
outputPaths = (
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = "/bin/bash -e";
|
shellPath = "/bin/sh -e";
|
||||||
shellScript = "PATH+=:/usr/libexec\n\naddPlistWithKey() {\n local key=$1 type=$2 value=$3 plist=${4:-\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"}\n \n PlistBuddy -c \"Delete :'$key'\" \"$plist\" 2>/dev/null || true\n PlistBuddy -c \"Add :'$key' '$type' '$value'\" \"$plist\"\n}\nsetPlistWithKey() {\n local key=$1 value=$2 plist=${3:-\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"}\n \n PlistBuddy -c \"Set :'$key' '$value'\" \"$plist\"\n}\ngetPlistWithKey() {\n local key=$1 plist=${2:-\"$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH\"}\n \n PlistBuddy -c \"Print :'$key'\" \"$plist\"\n}\nsetSettingWithTitle() {\n local i title=$1 value=$2 plist=${3:-\"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Settings.bundle/Root.plist\"}\n \n for (( i=0; 1; ++i )); do\n PlistBuddy -c \"Print :PreferenceSpecifiers:$i\" \"$plist\" &>/dev/null || break\n echo \"Checking preference specifier $i\"\n \n [[ $(PlistBuddy -c \"Print :PreferenceSpecifiers:$i:Title\" \"$plist\" 2>/dev/null) = $title ]] || continue\n \n echo \"Correct title, setting value.\"\n PlistBuddy -c \"Set :PreferenceSpecifiers:$i:DefaultValue $value\" \"$plist\"\n break\n done\n}\n\ndescription=$(git describe --always --dirty --long)\nversion=${description%-g*}\nIFS=- read major minor <<< \"$version\"\nprintf -v version '%s.%02d' \"$major\" \"$minor\"\nprintf -v commit '%09d' \"$((16#${description##*-g}))\"\n\naddPlistWithKey GITDescription string \"$description\"\nsetPlistWithKey CFBundleVersion \"${version//.}$commit\" # No separator between version and commit because I had already submitted a CFBundleVersion with a really high major. Cry.\nsetPlistWithKey CFBundleShortVersionString \"$version\"\n\nsetSettingWithTitle \"Build\" \"$commit\"\nsetSettingWithTitle \"Version\" \"$version\"\nsetSettingWithTitle \"Copyright\" \"$(getPlistWithKey NSHumanReadableCopyright)\"\n\nif [[ $DEPLOYMENT_LOCATION = YES ]]; then\n # This build is a release. Do some release checks.\n passed=1\n [[ $description != *-dirty ]] || \\\n { passed=0; echo >&2 \"ERROR: Cannot release a dirty version, first commit any changes.\"; }\n [[ $(PlistBuddy -c \"Print :'API Key'\" \"$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Crashlytics.plist\") ]] || \\\n { passed=0; echo >&2 \"ERROR: Cannot release: Crashlytics API key is missing.\"; }\n (( passed )) || \\\n { echo >&2 \"Failed to pass release checks. Fix the above errors and re-try. Aborting.\"; exit 1; }\nfi";
|
shellScript = "exec ../../../Scripts/updatePlist";
|
||||||
|
};
|
||||||
|
DA8D88E019DA412A00B189D0 /* Run Script: genassets */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Run Script: genassets";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = "/bin/sh -e";
|
||||||
|
shellScript = "exec ../../../Scripts/genassets";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
DAD3125D155288AA00A3F9ED /* Run Script: Crashlytics */ = {
|
DAD3125D155288AA00A3F9ED /* Run Script: Crashlytics */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
@@ -3481,8 +3590,6 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
DAA175F519D86C620044227B /* markdown_lib.m in Sources */,
|
DAA175F519D86C620044227B /* markdown_lib.m in Sources */,
|
||||||
DAA1761019D86C620044227B /* README_PEG-MARKDWON.markdown in Sources */,
|
|
||||||
DAA1760F19D86C620044227B /* README.markdown in Sources */,
|
|
||||||
DAA175F719D86C620044227B /* markdown_parser.m in Sources */,
|
DAA175F719D86C620044227B /* markdown_parser.m in Sources */,
|
||||||
DAA175F619D86C620044227B /* markdown_output.m in Sources */,
|
DAA175F619D86C620044227B /* markdown_output.m in Sources */,
|
||||||
);
|
);
|
||||||
@@ -3579,6 +3686,7 @@
|
|||||||
93D391ECBD9BD2C64115B5DD /* PearlSizedTextView.m in Sources */,
|
93D391ECBD9BD2C64115B5DD /* PearlSizedTextView.m in Sources */,
|
||||||
93D39E34FD28D24FE3442C48 /* UITextView+PearlAttributes.m in Sources */,
|
93D39E34FD28D24FE3442C48 /* UITextView+PearlAttributes.m in Sources */,
|
||||||
93D39D47FC623E91FC39D20C /* UICollectionView+PearlReloadFromArray.m in Sources */,
|
93D39D47FC623E91FC39D20C /* UICollectionView+PearlReloadFromArray.m in Sources */,
|
||||||
|
93D3928D629EA563F9EC4909 /* NSPersistentStore+PearlMigration.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -3830,7 +3938,7 @@
|
|||||||
Reveal,
|
Reveal,
|
||||||
);
|
);
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "78fbee53-abe7-4a47-b917-c223df3a6952";
|
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "3251b7d3-04df-4c8e-a410-d020ffc92d10";
|
||||||
SKIP_INSTALL = NO;
|
SKIP_INSTALL = NO;
|
||||||
TARGETED_DEVICE_FAMILY = 1;
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
};
|
};
|
||||||
@@ -3856,7 +3964,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
);
|
);
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "7142c408-252a-43c0-94c6-1ae1f43173f4";
|
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "59b587d0-3ef3-4691-9f12-c48f7f283002";
|
||||||
SKIP_INSTALL = NO;
|
SKIP_INSTALL = NO;
|
||||||
STRIP_INSTALLED_PRODUCT = YES;
|
STRIP_INSTALLED_PRODUCT = YES;
|
||||||
TARGETED_DEVICE_FAMILY = 1;
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
@@ -3963,7 +4071,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
);
|
);
|
||||||
PROVISIONING_PROFILE = "";
|
PROVISIONING_PROFILE = "";
|
||||||
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "48f9bae8-b80e-41c7-8792-663102bed54f";
|
"PROVISIONING_PROFILE[sdk=iphoneos*]" = "a1d8cfc8-b8db-4544-af34-28cc75e46c40";
|
||||||
SKIP_INSTALL = NO;
|
SKIP_INSTALL = NO;
|
||||||
STRIP_INSTALLED_PRODUCT = YES;
|
STRIP_INSTALLED_PRODUCT = YES;
|
||||||
TARGETED_DEVICE_FAMILY = 1;
|
TARGETED_DEVICE_FAMILY = 1;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "0600"
|
LastUpgradeVersion = "0610"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
@@ -26,18 +26,8 @@
|
|||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
buildConfiguration = "AppStore-iOS">
|
buildConfiguration = "Debug-iOS">
|
||||||
<Testables>
|
<Testables>
|
||||||
<TestableReference
|
|
||||||
skipped = "NO">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "DADEF42E1810D5530052CA3E"
|
|
||||||
BuildableName = "LoveLyndirTests.xctest"
|
|
||||||
BlueprintName = "LoveLyndirTests"
|
|
||||||
ReferencedContainer = "container:MasterPassword-iOS.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</TestableReference>
|
|
||||||
</Testables>
|
</Testables>
|
||||||
<MacroExpansion>
|
<MacroExpansion>
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
@@ -54,7 +44,7 @@
|
|||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
launchStyle = "0"
|
launchStyle = "0"
|
||||||
useCustomWorkingDirectory = "NO"
|
useCustomWorkingDirectory = "NO"
|
||||||
buildConfiguration = "AppStore-iOS"
|
buildConfiguration = "Debug-iOS"
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
debugDocumentVersioning = "YES"
|
debugDocumentVersioning = "YES"
|
||||||
allowLocationSimulation = "YES">
|
allowLocationSimulation = "YES">
|
||||||
@@ -74,7 +64,7 @@
|
|||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
savedToolIdentifier = ""
|
savedToolIdentifier = ""
|
||||||
useCustomWorkingDirectory = "NO"
|
useCustomWorkingDirectory = "NO"
|
||||||
buildConfiguration = "AppStore-iOS"
|
buildConfiguration = "Debug-iOS"
|
||||||
debugDocumentVersioning = "YES">
|
debugDocumentVersioning = "YES">
|
||||||
<BuildableProductRunnable>
|
<BuildableProductRunnable>
|
||||||
<BuildableReference
|
<BuildableReference
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "0600"
|
LastUpgradeVersion = "0610"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
|
|||||||
@@ -56,7 +56,7 @@
|
|||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>When enabled, you will not be logged out when switching out of the application. This will help you get to your passwords faster, but when someone finds your device unlocked, they can too.</string>
|
<string>When enabled, you will not be logged out when switching out of the application. This will help you get to your passwords faster, but when someone finds your device unlocked, they can too.</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
<string>Master Password</string>
|
<string>Security</string>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
</dict>
|
</dict>
|
||||||
@@ -70,24 +70,6 @@
|
|||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSToggleSwitchSpecifier</string>
|
<string>PSToggleSwitchSpecifier</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
|
||||||
<key>FooterText</key>
|
|
||||||
<string>Enabling support for dictation in the site search box will enable the dictation button next to the space bar at the bottom of the keyboard. Press this button and speak the name of your site to look it up. Enabling dictation will change your keyboard which might make it slightly more difficult to enter a site name manually.</string>
|
|
||||||
<key>Title</key>
|
|
||||||
<string></string>
|
|
||||||
<key>Type</key>
|
|
||||||
<string>PSGroupSpecifier</string>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
|
||||||
<key>DefaultValue</key>
|
|
||||||
<false/>
|
|
||||||
<key>Key</key>
|
|
||||||
<string>dictationSearch</string>
|
|
||||||
<key>Title</key>
|
|
||||||
<string>Dictation Search</string>
|
|
||||||
<key>Type</key>
|
|
||||||
<string>PSToggleSwitchSpecifier</string>
|
|
||||||
</dict>
|
|
||||||
<dict>
|
<dict>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>This will keep your site's passwords hidden from view. Enable this if you're worried about people watching your screen while you use the app.
|
<string>This will keep your site's passwords hidden from view. Enable this if you're worried about people watching your screen while you use the app.
|
||||||
@@ -110,7 +92,7 @@ To see a site's password anyway, tap and hold your finger down for a while
|
|||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>The password strength indicator estimates the time necessary to break the password from a stolen database of SHA-1 hashes. Use this setting to choose the budget the attacker is willing to devote to breaking your site password.</string>
|
<string>The password strength indicator estimates the time necessary to break the password from a stolen database of SHA-1 hashes. Use this setting to choose the budget the attacker is willing to devote exclusively to breaking your site password.</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
@@ -144,15 +126,34 @@ To see a site's password anyway, tap and hold your finger down for a while
|
|||||||
<integer>0</integer>
|
<integer>0</integer>
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
<integer>2</integer>
|
<integer>2</integer>
|
||||||
|
<integer>3</integer>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>FooterText</key>
|
||||||
|
<string>Enabling support for dictation in the site search box will enable the dictation button next to the space bar at the bottom of the keyboard. Press this button and speak the name of your site to look it up. Enabling dictation will change your keyboard which might make it slightly more difficult to enter a site name manually.</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Miscellaneous</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSGroupSpecifier</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>DefaultValue</key>
|
||||||
|
<false/>
|
||||||
|
<key>Key</key>
|
||||||
|
<string>dictationSearch</string>
|
||||||
|
<key>Title</key>
|
||||||
|
<string>Dictation Search</string>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>PSToggleSwitchSpecifier</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
<string>PSGroupSpecifier</string>
|
<string>PSGroupSpecifier</string>
|
||||||
<key>Title</key>
|
<key>Title</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
<key>FooterText</key>
|
<key>FooterText</key>
|
||||||
<string>If the app tends to crash on login, enable this to check if there are any inconsistencies in your site data. It may slow down login a bit, so keep it off when no issues are reported on login.</string>
|
<string>Enable this if the app crashes when you log in. Master Password will scan for and repair any inconsistencies in your sites history.</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Type</key>
|
<key>Type</key>
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
|
||||||
<capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
|
<capability name="Alignment constraints with different attributes" minToolsVersion="5.1"/>
|
||||||
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
|
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
|
||||||
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
|
|
||||||
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
||||||
<capability name="Unknown constraint types" minToolsVersion="5.1"/>
|
<capability name="Unknown constraint types" minToolsVersion="5.1"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
@@ -97,6 +96,7 @@
|
|||||||
<string>Exo2.0-Thin</string>
|
<string>Exo2.0-Thin</string>
|
||||||
<string>Exo2.0-Thin</string>
|
<string>Exo2.0-Thin</string>
|
||||||
<string>Exo2.0-Thin</string>
|
<string>Exo2.0-Thin</string>
|
||||||
|
<string>Exo2.0-Thin</string>
|
||||||
</mutableArray>
|
</mutableArray>
|
||||||
<mutableArray key="SourceCodePro-Black.otf">
|
<mutableArray key="SourceCodePro-Black.otf">
|
||||||
<string>SourceCodePro-Black</string>
|
<string>SourceCodePro-Black</string>
|
||||||
@@ -133,7 +133,6 @@
|
|||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="216" id="GcG-kq-fq2"/>
|
<constraint firstAttribute="height" constant="216" id="GcG-kq-fq2"/>
|
||||||
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="216" id="yUb-JQ-gv0"/>
|
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rWM-08-aab" userLabel="Users Root">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="rWM-08-aab" userLabel="Users Root">
|
||||||
@@ -173,10 +172,10 @@
|
|||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_spinner.png" translatesAutoresizingMaskIntoConstraints="NO" id="y4j-ds-HM7" userLabel="Spinner">
|
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="ui_spinner.png" translatesAutoresizingMaskIntoConstraints="NO" id="y4j-ds-HM7" userLabel="Spinner">
|
||||||
<rect key="frame" x="52" y="-13" width="110" height="110"/>
|
<rect key="frame" x="52" y="216" width="110" height="110"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar-0.png" translatesAutoresizingMaskIntoConstraints="NO" id="Aca-he-7Qi" userLabel="Avatar">
|
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="755" verticalCompressionResistancePriority="755" image="avatar-0.png" translatesAutoresizingMaskIntoConstraints="NO" id="Aca-he-7Qi" userLabel="Avatar">
|
||||||
<rect key="frame" x="52" y="-13" width="110" height="110"/>
|
<rect key="frame" x="52" y="216" width="110" height="110"/>
|
||||||
<color key="tintColor" red="0.47450980390000003" green="0.86666666670000003" blue="0.98431372549999996" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="tintColor" red="0.47450980390000003" green="0.86666666670000003" blue="0.98431372549999996" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="110" id="Ezz-dq-dfq"/>
|
<constraint firstAttribute="height" constant="110" id="Ezz-dq-dfq"/>
|
||||||
@@ -184,7 +183,7 @@
|
|||||||
</constraints>
|
</constraints>
|
||||||
</imageView>
|
</imageView>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0Sa-Vg-EEI" userLabel="Name Backdrop">
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="0Sa-Vg-EEI" userLabel="Name Backdrop">
|
||||||
<rect key="frame" x="43" y="34" width="128.5" height="16"/>
|
<rect key="frame" x="43" y="263" width="128.5" height="16"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalCompressionResistancePriority="1000" text="Maarten Billemont" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cLT-s0-4SQ" userLabel="Name Field">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalCompressionResistancePriority="1000" text="Maarten Billemont" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cLT-s0-4SQ" userLabel="Name Field">
|
||||||
<rect key="frame" x="5" y="0.0" width="118.5" height="16"/>
|
<rect key="frame" x="5" y="0.0" width="118.5" height="16"/>
|
||||||
@@ -206,7 +205,7 @@
|
|||||||
</view>
|
</view>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="J7b-uT-zY2" firstAttribute="leading" secondItem="Zab-uQ-uk9" secondAttribute="leading" id="1Sw-vq-MuH"/>
|
<constraint firstItem="J7b-uT-zY2" firstAttribute="leading" secondItem="Zab-uQ-uk9" secondAttribute="leading" id="1Sw-vq-MuH"/>
|
||||||
<constraint firstItem="CQo-kd-XAU" firstAttribute="centerY" secondItem="Aca-he-7Qi" secondAttribute="centerY" priority="750" id="1zu-ay-NUc"/>
|
<constraint firstItem="CQo-kd-XAU" firstAttribute="centerY" secondItem="Aca-he-7Qi" secondAttribute="centerY" priority="250" id="1zu-ay-NUc"/>
|
||||||
<constraint firstItem="y4j-ds-HM7" firstAttribute="centerX" secondItem="Aca-he-7Qi" secondAttribute="centerX" id="D6m-xp-Ja0"/>
|
<constraint firstItem="y4j-ds-HM7" firstAttribute="centerX" secondItem="Aca-he-7Qi" secondAttribute="centerX" id="D6m-xp-Ja0"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="0Sa-Vg-EEI" secondAttribute="centerX" id="EYH-CQ-6TX"/>
|
<constraint firstAttribute="centerX" secondItem="0Sa-Vg-EEI" secondAttribute="centerX" id="EYH-CQ-6TX"/>
|
||||||
<constraint firstItem="0Sa-Vg-EEI" firstAttribute="top" secondItem="Aca-he-7Qi" secondAttribute="bottom" priority="500" constant="8" symbolic="YES" id="F67-h9-FDi"/>
|
<constraint firstItem="0Sa-Vg-EEI" firstAttribute="top" secondItem="Aca-he-7Qi" secondAttribute="bottom" priority="500" constant="8" symbolic="YES" id="F67-h9-FDi"/>
|
||||||
@@ -218,16 +217,18 @@
|
|||||||
<constraint firstItem="y4j-ds-HM7" firstAttribute="centerY" secondItem="Aca-he-7Qi" secondAttribute="centerY" id="b7q-13-zb4"/>
|
<constraint firstItem="y4j-ds-HM7" firstAttribute="centerY" secondItem="Aca-he-7Qi" secondAttribute="centerY" id="b7q-13-zb4"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="Aca-he-7Qi" secondAttribute="centerY" priority="500" id="fKx-ZZ-sJa"/>
|
<constraint firstAttribute="centerY" secondItem="Aca-he-7Qi" secondAttribute="centerY" priority="500" id="fKx-ZZ-sJa"/>
|
||||||
<constraint firstItem="CQo-kd-XAU" firstAttribute="top" secondItem="Zab-uQ-uk9" secondAttribute="top" constant="20" id="kO6-Hn-9ab"/>
|
<constraint firstItem="CQo-kd-XAU" firstAttribute="top" secondItem="Zab-uQ-uk9" secondAttribute="top" constant="20" id="kO6-Hn-9ab"/>
|
||||||
|
<constraint firstItem="Aca-he-7Qi" firstAttribute="centerY" relation="greaterThanOrEqual" secondItem="Zab-uQ-uk9" secondAttribute="top" priority="751" constant="60" id="qu4-jD-JoX"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="J7b-uT-zY2" secondAttribute="bottom" id="sKD-RY-oA8"/>
|
<constraint firstAttribute="bottom" secondItem="J7b-uT-zY2" secondAttribute="bottom" id="sKD-RY-oA8"/>
|
||||||
<constraint firstItem="CQo-kd-XAU" firstAttribute="leading" secondItem="Zab-uQ-uk9" secondAttribute="leading" id="trm-Bp-zf3"/>
|
<constraint firstItem="CQo-kd-XAU" firstAttribute="leading" secondItem="Zab-uQ-uk9" secondAttribute="leading" id="trm-Bp-zf3"/>
|
||||||
<constraint firstItem="y4j-ds-HM7" firstAttribute="height" secondItem="Aca-he-7Qi" secondAttribute="height" id="wyT-4c-SaV"/>
|
<constraint firstItem="y4j-ds-HM7" firstAttribute="height" secondItem="Aca-he-7Qi" secondAttribute="height" id="wyT-4c-SaV"/>
|
||||||
<constraint firstItem="J7b-uT-zY2" firstAttribute="top" secondItem="Aca-he-7Qi" secondAttribute="centerY" priority="250" constant="180" id="xgw-C1-V3h"/>
|
<constraint firstItem="J7b-uT-zY2" firstAttribute="top" secondItem="Aca-he-7Qi" secondAttribute="centerY" priority="750" constant="180" id="xgw-C1-V3h"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="avatarImageView" destination="Aca-he-7Qi" id="Me2-jn-hSX"/>
|
<outlet property="avatarImageView" destination="Aca-he-7Qi" id="Me2-jn-hSX"/>
|
||||||
<outlet property="avatarRaisedConstraint" destination="xgw-C1-V3h" id="cHf-dg-hD9"/>
|
<outlet property="avatarRaisedConstraint" destination="xgw-C1-V3h" id="cHf-dg-hD9"/>
|
||||||
<outlet property="avatarSizeConstraint" destination="Ezz-dq-dfq" id="FLf-Gq-Pdw"/>
|
<outlet property="avatarSizeConstraint" destination="Ezz-dq-dfq" id="FLf-Gq-Pdw"/>
|
||||||
<outlet property="avatarToTopConstraint" destination="1zu-ay-NUc" id="i4J-5Z-Ky7"/>
|
<outlet property="avatarToTopConstraint" destination="1zu-ay-NUc" id="i4J-5Z-Ky7"/>
|
||||||
|
<outlet property="keyboardHeightConstraint" destination="KPB-We-gf0" id="gG1-Fl-VqV"/>
|
||||||
<outlet property="nameContainer" destination="0Sa-Vg-EEI" id="VLy-AI-Yh8"/>
|
<outlet property="nameContainer" destination="0Sa-Vg-EEI" id="VLy-AI-Yh8"/>
|
||||||
<outlet property="nameLabel" destination="cLT-s0-4SQ" id="85r-AJ-Zkb"/>
|
<outlet property="nameLabel" destination="cLT-s0-4SQ" id="85r-AJ-Zkb"/>
|
||||||
<outlet property="nameToCenterConstraint" destination="Ht7-Iz-cAW" id="zeF-2U-6GW"/>
|
<outlet property="nameToCenterConstraint" destination="Ht7-Iz-cAW" id="zeF-2U-6GW"/>
|
||||||
@@ -460,9 +461,11 @@
|
|||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="centerX" secondItem="VDd-oM-ZOO" secondAttribute="centerX" id="0j9-vM-WFA"/>
|
<constraint firstAttribute="centerX" secondItem="VDd-oM-ZOO" secondAttribute="centerX" id="0j9-vM-WFA"/>
|
||||||
<constraint firstItem="zCP-wo-gTl" firstAttribute="top" secondItem="rWM-08-aab" secondAttribute="top" constant="20" id="1ly-9W-ybj"/>
|
<constraint firstItem="zCP-wo-gTl" firstAttribute="top" secondItem="rWM-08-aab" secondAttribute="top" constant="20" id="1ly-9W-ybj"/>
|
||||||
<constraint firstItem="cF4-TE-GEj" firstAttribute="bottom" secondItem="9u7-pu-Wtv" secondAttribute="top" id="3oq-Zs-Ann"/>
|
<constraint firstItem="cF4-TE-GEj" firstAttribute="bottom" secondItem="9u7-pu-Wtv" secondAttribute="top" priority="500" id="3oq-Zs-Ann"/>
|
||||||
<constraint firstItem="0Um-Ot-hI6" firstAttribute="top" secondItem="zCP-wo-gTl" secondAttribute="centerY" id="6zz-7f-HLz"/>
|
<constraint firstItem="0Um-Ot-hI6" firstAttribute="top" secondItem="zCP-wo-gTl" secondAttribute="centerY" id="6zz-7f-HLz"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="L6J-pd-gcp" secondAttribute="trailing" id="9fV-8e-y3E"/>
|
<constraint firstAttribute="trailing" secondItem="L6J-pd-gcp" secondAttribute="trailing" id="9fV-8e-y3E"/>
|
||||||
|
<constraint firstItem="fUK-gJ-NRE" firstAttribute="centerY" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="60" id="ADW-TA-Iha"/>
|
||||||
|
<constraint firstItem="9u7-pu-Wtv" firstAttribute="centerY" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="60" id="AQZ-W6-Xkf"/>
|
||||||
<constraint firstItem="L6J-pd-gcp" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="BcO-0y-Nih"/>
|
<constraint firstItem="L6J-pd-gcp" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="BcO-0y-Nih"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="cF4-TE-GEj" secondAttribute="centerX" id="CvC-rv-8KE"/>
|
<constraint firstAttribute="centerX" secondItem="cF4-TE-GEj" secondAttribute="centerX" id="CvC-rv-8KE"/>
|
||||||
<constraint firstItem="qp1-nX-o4i" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="DY1-Ad-Mbi"/>
|
<constraint firstItem="qp1-nX-o4i" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="DY1-Ad-Mbi"/>
|
||||||
@@ -470,6 +473,7 @@
|
|||||||
<constraint firstItem="0Um-Ot-hI6" firstAttribute="centerX" secondItem="zCP-wo-gTl" secondAttribute="centerX" id="OJA-7u-h1T"/>
|
<constraint firstItem="0Um-Ot-hI6" firstAttribute="centerX" secondItem="zCP-wo-gTl" secondAttribute="centerX" id="OJA-7u-h1T"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="XEP-O3-ayG" secondAttribute="bottom" id="PpW-Of-YOc"/>
|
<constraint firstAttribute="bottom" secondItem="XEP-O3-ayG" secondAttribute="bottom" id="PpW-Of-YOc"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="fUK-gJ-NRE" secondAttribute="trailing" id="TBr-pS-kEK"/>
|
<constraint firstAttribute="trailing" secondItem="fUK-gJ-NRE" secondAttribute="trailing" id="TBr-pS-kEK"/>
|
||||||
|
<constraint firstItem="cF4-TE-GEj" firstAttribute="top" relation="greaterThanOrEqual" secondItem="L6J-pd-gcp" secondAttribute="top" constant="4" id="VHh-25-0mJ"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="qp1-nX-o4i" secondAttribute="trailing" id="cOq-BS-Xmo"/>
|
<constraint firstAttribute="trailing" secondItem="qp1-nX-o4i" secondAttribute="trailing" id="cOq-BS-Xmo"/>
|
||||||
<constraint firstAttribute="centerY" secondItem="VDd-oM-ZOO" secondAttribute="centerY" id="dxP-im-1dM"/>
|
<constraint firstAttribute="centerY" secondItem="VDd-oM-ZOO" secondAttribute="centerY" id="dxP-im-1dM"/>
|
||||||
<constraint firstItem="zCP-wo-gTl" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="jBY-Gd-orW"/>
|
<constraint firstItem="zCP-wo-gTl" firstAttribute="leading" secondItem="rWM-08-aab" secondAttribute="leading" id="jBY-Gd-orW"/>
|
||||||
@@ -486,9 +490,9 @@
|
|||||||
<constraint firstItem="VGz-R0-vMD" firstAttribute="top" secondItem="X8H-vh-j7B" secondAttribute="bottom" id="8Ed-3Y-ll0"/>
|
<constraint firstItem="VGz-R0-vMD" firstAttribute="top" secondItem="X8H-vh-j7B" secondAttribute="bottom" id="8Ed-3Y-ll0"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="X8H-vh-j7B" secondAttribute="trailing" id="8Gr-Dq-UpZ"/>
|
<constraint firstAttribute="trailing" secondItem="X8H-vh-j7B" secondAttribute="trailing" id="8Gr-Dq-UpZ"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="rWM-08-aab" secondAttribute="bottom" id="9Yx-cj-wHh"/>
|
<constraint firstAttribute="bottom" secondItem="rWM-08-aab" secondAttribute="bottom" id="9Yx-cj-wHh"/>
|
||||||
<constraint firstItem="X8H-vh-j7B" firstAttribute="top" secondItem="9u7-pu-Wtv" secondAttribute="centerY" constant="180" id="Gp5-h6-53S"/>
|
<constraint firstItem="X8H-vh-j7B" firstAttribute="top" secondItem="9u7-pu-Wtv" secondAttribute="centerY" priority="500" constant="180" id="Gp5-h6-53S"/>
|
||||||
<constraint firstItem="rWM-08-aab" firstAttribute="leading" secondItem="DOr-Xu-P9q" secondAttribute="leading" id="Il8-kg-Dra"/>
|
<constraint firstItem="rWM-08-aab" firstAttribute="leading" secondItem="DOr-Xu-P9q" secondAttribute="leading" id="Il8-kg-Dra"/>
|
||||||
<constraint firstItem="X8H-vh-j7B" firstAttribute="top" secondItem="fUK-gJ-NRE" secondAttribute="centerY" constant="180" id="PgC-ZL-cQo"/>
|
<constraint firstItem="X8H-vh-j7B" firstAttribute="top" secondItem="fUK-gJ-NRE" secondAttribute="centerY" priority="500" constant="180" id="PgC-ZL-cQo"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="rWM-08-aab" secondAttribute="trailing" id="UPP-1n-zIe"/>
|
<constraint firstAttribute="trailing" secondItem="rWM-08-aab" secondAttribute="trailing" id="UPP-1n-zIe"/>
|
||||||
<constraint firstItem="X8H-vh-j7B" firstAttribute="top" secondItem="qp1-nX-o4i" secondAttribute="bottom" constant="20" id="WdK-tA-njz"/>
|
<constraint firstItem="X8H-vh-j7B" firstAttribute="top" secondItem="qp1-nX-o4i" secondAttribute="bottom" constant="20" id="WdK-tA-njz"/>
|
||||||
<constraint firstItem="X8H-vh-j7B" firstAttribute="leading" secondItem="DOr-Xu-P9q" secondAttribute="leading" id="jbn-ko-MPq"/>
|
<constraint firstItem="X8H-vh-j7B" firstAttribute="leading" secondItem="DOr-Xu-P9q" secondAttribute="leading" id="jbn-ko-MPq"/>
|
||||||
@@ -506,6 +510,7 @@
|
|||||||
<outlet property="entryTipSubtitleLabel" destination="KhE-Yj-Kvm" id="G0X-19-RmH"/>
|
<outlet property="entryTipSubtitleLabel" destination="KhE-Yj-Kvm" id="G0X-19-RmH"/>
|
||||||
<outlet property="entryTipTitleLabel" destination="ZI7-qg-7OW" id="dZj-rZ-efd"/>
|
<outlet property="entryTipTitleLabel" destination="ZI7-qg-7OW" id="dZj-rZ-efd"/>
|
||||||
<outlet property="footerContainer" destination="XEP-O3-ayG" id="9cI-p9-av3"/>
|
<outlet property="footerContainer" destination="XEP-O3-ayG" id="9cI-p9-av3"/>
|
||||||
|
<outlet property="keyboardHeightConstraint" destination="GcG-kq-fq2" id="V1s-Sz-0Zp"/>
|
||||||
<outlet property="marqueeButton" destination="4md-Gp-SLG" id="bUt-IL-8P1"/>
|
<outlet property="marqueeButton" destination="4md-Gp-SLG" id="bUt-IL-8P1"/>
|
||||||
<outlet property="nextAvatarButton" destination="fUK-gJ-NRE" id="5qo-lK-rSa"/>
|
<outlet property="nextAvatarButton" destination="fUK-gJ-NRE" id="5qo-lK-rSa"/>
|
||||||
<outlet property="preferencesTipContainer" destination="0Um-Ot-hI6" id="Cv8-Bp-ZZs"/>
|
<outlet property="preferencesTipContainer" destination="0Um-Ot-hI6" id="Cv8-Bp-ZZs"/>
|
||||||
@@ -2294,7 +2299,7 @@ Suspendisse potenti. Etiam ut nisi id augue tempor ultrices et sit amet sapien.
|
|||||||
<rect key="frame" x="20" y="20" width="335" height="80"/>
|
<rect key="frame" x="20" y="20" width="335" height="80"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Stay Logged In?" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5X1-J4-TbH">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Stay Logged In?" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5X1-J4-TbH">
|
||||||
<rect key="frame" x="20" y="108" width="335" height="20"/>
|
<rect key="frame" x="20" y="108" width="335" height="20.5"/>
|
||||||
<fontDescription key="fontDescription" name="Exo2.0-Bold" family="Exo 2.0" pointSize="17"/>
|
<fontDescription key="fontDescription" name="Exo2.0-Bold" family="Exo 2.0" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
@@ -2303,8 +2308,8 @@ Suspendisse potenti. Etiam ut nisi id augue tempor ultrices et sit amet sapien.
|
|||||||
<rect key="frame" x="163" y="532" width="51" height="31"/>
|
<rect key="frame" x="163" y="532" width="51" height="31"/>
|
||||||
<color key="onTintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="onTintColor" red="0.37254901959999998" green="0.3921568627" blue="0.42745098040000001" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
</switch>
|
</switch>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e80-98-V6D">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="e80-98-V6D">
|
||||||
<rect key="frame" x="20" y="136.5" width="335" height="147"/>
|
<rect key="frame" x="20" y="137" width="335" height="151.5"/>
|
||||||
<string key="text">The right balance between security and convenience is often very personal.
|
<string key="text">The right balance between security and convenience is often very personal.
|
||||||
|
|
||||||
To make getting to your passwords faster, you can remain logged in after you close Master Password. This allows you to skip having to log in the next time.
|
To make getting to your passwords faster, you can remain logged in after you close Master Password. This allows you to skip having to log in the next time.
|
||||||
@@ -2809,7 +2814,7 @@ See </string>
|
|||||||
<outlet property="purchasedIndicator" destination="yZX-ns-8oV" id="7x0-eq-oSs"/>
|
<outlet property="purchasedIndicator" destination="yZX-ns-8oV" id="7x0-eq-oSs"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="default" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" shouldIndentWhileEditing="NO" reuseIdentifier="MPStoreProductCellFuel" rowHeight="394" id="le3-Q5-MSO" userLabel="Fuel" customClass="MPStoreProductCell">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="default" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" shouldIndentWhileEditing="NO" reuseIdentifier="MPStoreProductCellFuel" rowHeight="407" id="le3-Q5-MSO" userLabel="Fuel" customClass="MPStoreProductCell">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="97"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="97"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="le3-Q5-MSO" id="SzQ-Y5-XIF">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="le3-Q5-MSO" id="SzQ-Y5-XIF">
|
||||||
@@ -2823,12 +2828,13 @@ See </string>
|
|||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fz2-AO-aGW">
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fz2-AO-aGW">
|
||||||
<rect key="frame" x="20" y="254" width="335" height="119.5"/>
|
<rect key="frame" x="20" y="254" width="335" height="132"/>
|
||||||
<string key="text">You really love Master Password and how it's solving your password problems. You're eager to encourage the maintenance, technical support and development of new features. I am a one-man shop, more fuel means I can allocate more hours to Master Password.
|
<string key="text">You really love Master Password and how it's solving your password problems. You're eager to encourage the maintenance, technical support and development of new features. I am a one-man shop, fuel enables me to allocate more work hours to Master Password.
|
||||||
|
|
||||||
UPCOMING:
|
UPCOMING:
|
||||||
– Safari integration
|
– Safari integration
|
||||||
– Touch ID support
|
– Touch ID support
|
||||||
|
– Multi-platform support
|
||||||
– Your feedback</string>
|
– Your feedback</string>
|
||||||
<fontDescription key="fontDescription" name="Exo2.0-Thin" family="Exo 2.0" pointSize="11"/>
|
<fontDescription key="fontDescription" name="Exo2.0-Thin" family="Exo 2.0" pointSize="11"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
@@ -2862,6 +2868,14 @@ UPCOMING:
|
|||||||
<action selector="toggleFuelConsumption:" destination="pdl-xv-zjX" eventType="touchUpInside" id="NkB-Dy-IeY"/>
|
<action selector="toggleFuelConsumption:" destination="pdl-xv-zjX" eventType="touchUpInside" id="NkB-Dy-IeY"/>
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kYb-j4-32C">
|
||||||
|
<rect key="frame" x="20" y="64" width="117.5" height="26.5"/>
|
||||||
|
<string key="text">fuel left: 0.3 work hours
|
||||||
|
invested: 3.7 work hours</string>
|
||||||
|
<fontDescription key="fontDescription" name="Exo2.0-Thin" family="Exo 2.0" pointSize="11"/>
|
||||||
|
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="aGb-QC-A92" firstAttribute="bottom" secondItem="PnG-hP-syh" secondAttribute="bottom" id="0Jx-M5-xlh"/>
|
<constraint firstItem="aGb-QC-A92" firstAttribute="bottom" secondItem="PnG-hP-syh" secondAttribute="bottom" id="0Jx-M5-xlh"/>
|
||||||
@@ -2873,14 +2887,16 @@ UPCOMING:
|
|||||||
<constraint firstItem="Jnv-uN-xeg" firstAttribute="bottom" secondItem="EbU-DV-fKF" secondAttribute="bottom" id="KbL-rF-pVN"/>
|
<constraint firstItem="Jnv-uN-xeg" firstAttribute="bottom" secondItem="EbU-DV-fKF" secondAttribute="bottom" id="KbL-rF-pVN"/>
|
||||||
<constraint firstItem="Jnv-uN-xeg" firstAttribute="top" secondItem="PnG-hP-syh" secondAttribute="bottom" constant="8" symbolic="YES" id="OZV-m1-YZ1"/>
|
<constraint firstItem="Jnv-uN-xeg" firstAttribute="top" secondItem="PnG-hP-syh" secondAttribute="bottom" constant="8" symbolic="YES" id="OZV-m1-YZ1"/>
|
||||||
<constraint firstItem="dsR-fr-dY4" firstAttribute="top" secondItem="SzQ-Y5-XIF" secondAttribute="top" constant="20" id="VH2-O8-CGj"/>
|
<constraint firstItem="dsR-fr-dY4" firstAttribute="top" secondItem="SzQ-Y5-XIF" secondAttribute="top" constant="20" id="VH2-O8-CGj"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="fz2-AO-aGW" secondAttribute="bottom" constant="20" symbolic="YES" id="Wqo-Le-AcG"/>
|
|
||||||
<constraint firstItem="eS4-59-Xny" firstAttribute="centerX" secondItem="PnG-hP-syh" secondAttribute="centerX" id="ZbQ-LX-kmS"/>
|
<constraint firstItem="eS4-59-Xny" firstAttribute="centerX" secondItem="PnG-hP-syh" secondAttribute="centerX" id="ZbQ-LX-kmS"/>
|
||||||
|
<constraint firstItem="kYb-j4-32C" firstAttribute="leading" secondItem="dsR-fr-dY4" secondAttribute="leading" id="bih-Ha-Tz7"/>
|
||||||
<constraint firstItem="EbU-DV-fKF" firstAttribute="leading" secondItem="Jnv-uN-xeg" secondAttribute="trailing" constant="8" symbolic="YES" id="cku-JX-4bK"/>
|
<constraint firstItem="EbU-DV-fKF" firstAttribute="leading" secondItem="Jnv-uN-xeg" secondAttribute="trailing" constant="8" symbolic="YES" id="cku-JX-4bK"/>
|
||||||
|
<constraint firstItem="kYb-j4-32C" firstAttribute="top" secondItem="dsR-fr-dY4" secondAttribute="bottom" id="eJU-g8-KuU"/>
|
||||||
<constraint firstItem="aGb-QC-A92" firstAttribute="centerX" secondItem="PnG-hP-syh" secondAttribute="centerX" constant="80" id="eMa-Gj-BUc"/>
|
<constraint firstItem="aGb-QC-A92" firstAttribute="centerX" secondItem="PnG-hP-syh" secondAttribute="centerX" constant="80" id="eMa-Gj-BUc"/>
|
||||||
<constraint firstItem="dsR-fr-dY4" firstAttribute="leading" secondItem="SzQ-Y5-XIF" secondAttribute="leading" constant="20" id="eX0-7y-eHi"/>
|
<constraint firstItem="dsR-fr-dY4" firstAttribute="leading" secondItem="SzQ-Y5-XIF" secondAttribute="leading" constant="20" id="eX0-7y-eHi"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="PnG-hP-syh" secondAttribute="centerX" id="gO5-ME-YVO"/>
|
<constraint firstAttribute="centerX" secondItem="PnG-hP-syh" secondAttribute="centerX" id="gO5-ME-YVO"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="EbU-DV-fKF" secondAttribute="trailing" constant="20" id="hae-Jv-wOU"/>
|
<constraint firstAttribute="trailing" secondItem="EbU-DV-fKF" secondAttribute="trailing" constant="20" id="hae-Jv-wOU"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="fz2-AO-aGW" secondAttribute="trailing" constant="20" id="vlt-qH-1Xx"/>
|
<constraint firstAttribute="trailing" secondItem="fz2-AO-aGW" secondAttribute="trailing" constant="20" id="vlt-qH-1Xx"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="fz2-AO-aGW" secondAttribute="bottom" constant="20" symbolic="YES" id="xkO-cL-7m2"/>
|
||||||
<constraint firstItem="eS4-59-Xny" firstAttribute="centerY" secondItem="PnG-hP-syh" secondAttribute="centerY" id="yUc-2F-y1r"/>
|
<constraint firstItem="eS4-59-Xny" firstAttribute="centerY" secondItem="PnG-hP-syh" secondAttribute="centerY" id="yUc-2F-y1r"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</tableViewCellContentView>
|
</tableViewCellContentView>
|
||||||
@@ -2912,7 +2928,7 @@ UPCOMING:
|
|||||||
</label>
|
</label>
|
||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="bottomMargin" secondItem="ARC-xH-0U0" secondAttribute="bottom" constant="40" id="4ux-Ao-e12"/>
|
<constraint firstAttribute="bottom" secondItem="ARC-xH-0U0" secondAttribute="bottom" constant="48" id="5L9-Ag-d1G"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="ARC-xH-0U0" secondAttribute="centerX" id="asI-QK-u6O"/>
|
<constraint firstAttribute="centerX" secondItem="ARC-xH-0U0" secondAttribute="centerX" id="asI-QK-u6O"/>
|
||||||
<constraint firstItem="ARC-xH-0U0" firstAttribute="top" secondItem="Vjt-7c-BJ4" secondAttribute="bottom" constant="40" id="g1T-rA-vOW"/>
|
<constraint firstItem="ARC-xH-0U0" firstAttribute="top" secondItem="Vjt-7c-BJ4" secondAttribute="bottom" constant="40" id="g1T-rA-vOW"/>
|
||||||
<constraint firstAttribute="centerX" secondItem="Vjt-7c-BJ4" secondAttribute="centerX" id="j2l-mA-Duf"/>
|
<constraint firstAttribute="centerX" secondItem="Vjt-7c-BJ4" secondAttribute="centerX" id="j2l-mA-Duf"/>
|
||||||
@@ -2939,7 +2955,7 @@ UPCOMING:
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bCe-a3-cDC">
|
<button opaque="NO" contentMode="scaleToFill" verticalHuggingPriority="1000" verticalCompressionResistancePriority="1000" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bCe-a3-cDC">
|
||||||
<rect key="frame" x="16" y="24" width="343" height="26"/>
|
<rect key="frame" x="8" y="24" width="359" height="26"/>
|
||||||
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="11"/>
|
<fontDescription key="fontDescription" name="Exo2.0-Regular" family="Exo 2.0" pointSize="11"/>
|
||||||
<state key="normal" title="Send Thanks">
|
<state key="normal" title="Send Thanks">
|
||||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
@@ -2957,13 +2973,13 @@ UPCOMING:
|
|||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="trailing" secondItem="IOk-WZ-HJ8" secondAttribute="trailing" constant="20" symbolic="YES" id="CuJ-h7-aGJ"/>
|
<constraint firstAttribute="trailing" secondItem="IOk-WZ-HJ8" secondAttribute="trailing" constant="20" symbolic="YES" id="CuJ-h7-aGJ"/>
|
||||||
<constraint firstAttribute="trailingMargin" secondItem="bCe-a3-cDC" secondAttribute="trailing" constant="8" id="Lfp-Hx-vLN"/>
|
<constraint firstAttribute="trailing" secondItem="bCe-a3-cDC" secondAttribute="trailing" constant="8" id="Lfp-Hx-vLN"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="DxV-2L-bxL" secondAttribute="trailing" constant="20" symbolic="YES" id="QHU-Jw-LPy"/>
|
<constraint firstAttribute="trailing" secondItem="DxV-2L-bxL" secondAttribute="trailing" constant="20" symbolic="YES" id="QHU-Jw-LPy"/>
|
||||||
<constraint firstItem="IOk-WZ-HJ8" firstAttribute="top" secondItem="bCe-a3-cDC" secondAttribute="bottom" constant="8" symbolic="YES" id="bfe-bp-fGn"/>
|
<constraint firstItem="IOk-WZ-HJ8" firstAttribute="top" secondItem="bCe-a3-cDC" secondAttribute="bottom" constant="8" symbolic="YES" id="bfe-bp-fGn"/>
|
||||||
<constraint firstItem="DxV-2L-bxL" firstAttribute="leading" secondItem="4Zu-Ig-Ws4" secondAttribute="leading" constant="20" symbolic="YES" id="fAD-At-gqS"/>
|
<constraint firstItem="DxV-2L-bxL" firstAttribute="leading" secondItem="4Zu-Ig-Ws4" secondAttribute="leading" constant="20" symbolic="YES" id="fAD-At-gqS"/>
|
||||||
<constraint firstItem="DxV-2L-bxL" firstAttribute="top" secondItem="4Zu-Ig-Ws4" secondAttribute="top" constant="4" id="hTN-Cx-hOS"/>
|
<constraint firstItem="DxV-2L-bxL" firstAttribute="top" secondItem="4Zu-Ig-Ws4" secondAttribute="top" constant="4" id="hTN-Cx-hOS"/>
|
||||||
<constraint firstItem="bCe-a3-cDC" firstAttribute="top" secondItem="DxV-2L-bxL" secondAttribute="bottom" constant="8" symbolic="YES" id="hfr-MK-Me2"/>
|
<constraint firstItem="bCe-a3-cDC" firstAttribute="top" secondItem="DxV-2L-bxL" secondAttribute="bottom" constant="8" symbolic="YES" id="hfr-MK-Me2"/>
|
||||||
<constraint firstItem="bCe-a3-cDC" firstAttribute="leading" secondItem="4Zu-Ig-Ws4" secondAttribute="leadingMargin" constant="8" id="l4A-fH-9fA"/>
|
<constraint firstItem="bCe-a3-cDC" firstAttribute="leading" secondItem="4Zu-Ig-Ws4" secondAttribute="leading" constant="8" id="l4A-fH-9fA"/>
|
||||||
<constraint firstItem="IOk-WZ-HJ8" firstAttribute="leading" secondItem="4Zu-Ig-Ws4" secondAttribute="leading" constant="20" symbolic="YES" id="mx2-Jk-5jo"/>
|
<constraint firstItem="IOk-WZ-HJ8" firstAttribute="leading" secondItem="4Zu-Ig-Ws4" secondAttribute="leading" constant="20" symbolic="YES" id="mx2-Jk-5jo"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="IOk-WZ-HJ8" secondAttribute="bottom" id="xEZ-X4-5oi"/>
|
<constraint firstAttribute="bottom" secondItem="IOk-WZ-HJ8" secondAttribute="bottom" id="xEZ-X4-5oi"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
@@ -2985,6 +3001,7 @@ UPCOMING:
|
|||||||
<outlet property="fuelCell" destination="le3-Q5-MSO" id="oAk-6g-cFj"/>
|
<outlet property="fuelCell" destination="le3-Q5-MSO" id="oAk-6g-cFj"/>
|
||||||
<outlet property="fuelMeterConstraint" destination="eMa-Gj-BUc" id="9iF-EO-UU6"/>
|
<outlet property="fuelMeterConstraint" destination="eMa-Gj-BUc" id="9iF-EO-UU6"/>
|
||||||
<outlet property="fuelSpeedButton" destination="dsR-fr-dY4" id="XGI-PE-9mh"/>
|
<outlet property="fuelSpeedButton" destination="dsR-fr-dY4" id="XGI-PE-9mh"/>
|
||||||
|
<outlet property="fuelStatusLabel" destination="kYb-j4-32C" id="o5R-0u-kGL"/>
|
||||||
<outlet property="generateAnswersCell" destination="l1g-Ul-Vg8" id="GlG-iZ-7FP"/>
|
<outlet property="generateAnswersCell" destination="l1g-Ul-Vg8" id="GlG-iZ-7FP"/>
|
||||||
<outlet property="generateLoginCell" destination="JVW-tG-xxe" id="PXM-WX-8Qe"/>
|
<outlet property="generateLoginCell" destination="JVW-tG-xxe" id="PXM-WX-8Qe"/>
|
||||||
<outlet property="iOSIntegrationCell" destination="9Na-CL-jBq" id="LSO-OV-9KA"/>
|
<outlet property="iOSIntegrationCell" destination="9Na-CL-jBq" id="LSO-OV-9KA"/>
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
{"images":[{"size":"60x60","filename":"Icon-60@3x.png","scale":"3x","idiom":"iphone","minimum-system-version":"8.0"},{"size":"40x40","filename":"Icon-Small-40@3x.png","scale":"3x","idiom":"iphone","minimum-system-version":"8.0"},{"size":"60x60","filename":"Icon-60@2x.png","scale":"2x","idiom":"iphone","minimum-system-version":"7.0"},{"size":"40x40","filename":"Icon-Small-40@2x.png","scale":"2x","idiom":"iphone","minimum-system-version":"7.0"},{"size":"29x29","filename":"Icon-Small@3x.png","scale":"3x","idiom":"iphone"},{"size":"29x29","filename":"Icon-Small@2x.png","scale":"2x","idiom":"iphone"},{"size":"76x76","filename":"Icon-76.png","scale":"1x","idiom":"ipad","minimum-system-version":"7.0"},{"size":"76x76","filename":"Icon-76@2x.png","scale":"2x","idiom":"ipad","minimum-system-version":"7.0"},{"size":"40x40","filename":"Icon-Small-40.png","scale":"1x","idiom":"ipad","minimum-system-version":"7.0"},{"size":"40x40","filename":"Icon-Small-40@2x.png","scale":"2x","idiom":"ipad","minimum-system-version":"7.0"},{"size":"29x29","filename":"Icon-Small.png","scale":"1x","idiom":"ipad"},{"size":"29x29","filename":"Icon-Small@2x.png","scale":"2x","idiom":"ipad"}],"info":{"version":1,"author":"genassets"},"properties":{"pre-rendered":true}}
|
|
||||||
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 8.6 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 9.6 KiB |
@@ -1 +0,0 @@
|
|||||||
{"images":[{"extent":"full-screen","filename":"Default-8.0-736h@3x~iphone.png","orientation":"portrait","scale":"3x","idiom":"iphone","minimum-system-version":"8.0","subtype":"736h"},{"extent":"full-screen","filename":"Default-8.0-667h@2x~iphone.png","orientation":"portrait","scale":"2x","idiom":"iphone","minimum-system-version":"8.0","subtype":"667h"},{"extent":"full-screen","filename":"Default-7.0-retina4@2x~iphone.png","orientation":"portrait","scale":"2x","idiom":"iphone","minimum-system-version":"7.0","subtype":"retina4"},{"extent":"full-screen","filename":"Default-retina4@2x~iphone.png","orientation":"portrait","scale":"2x","idiom":"iphone","subtype":"retina4"},{"extent":"full-screen","filename":"Default-7.0@2x~iphone.png","orientation":"portrait","scale":"2x","idiom":"iphone","minimum-system-version":"7.0"},{"extent":"full-screen","filename":"Default@2x~iphone.png","orientation":"portrait","scale":"2x","idiom":"iphone"},{"extent":"full-screen","filename":"Default~iphone.png","orientation":"portrait","scale":"1x","idiom":"iphone"}],"info":{"version":1,"author":"genassets"}}
|
|
||||||
|
Before Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 321 KiB |
|
Before Width: | Height: | Size: 501 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
|
Before Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 321 KiB |
|
Before Width: | Height: | Size: 89 KiB |
BIN
MasterPassword/Resources/Media/ios/icon.sketch
Normal file
@@ -1,22 +0,0 @@
|
|||||||
<?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>app</key>
|
|
||||||
<string>com.bohemiancoding.sketch3</string>
|
|
||||||
<key>build</key>
|
|
||||||
<integer>8053</integer>
|
|
||||||
<key>commit</key>
|
|
||||||
<string>104f8b8798002207eebbbee810c02306c5ce85c9</string>
|
|
||||||
<key>fonts</key>
|
|
||||||
<array>
|
|
||||||
<string>SourceCodePro-Light</string>
|
|
||||||
<string>LucidaGrande</string>
|
|
||||||
<string>HelveticaNeue-Medium</string>
|
|
||||||
</array>
|
|
||||||
<key>length</key>
|
|
||||||
<integer>371142</integer>
|
|
||||||
<key>version</key>
|
|
||||||
<integer>37</integer>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
37
|
|
||||||
BIN
MasterPassword/Resources/Media/ios/icon/Icon-320.png
Normal file
|
After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 25 KiB |
BIN
MasterPassword/Resources/Media/ios/icon/Icon-64.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |