Compare commits
55 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
344771dbdf | ||
|
|
d38dba7272 | ||
|
|
409f005eec | ||
|
|
df7903e146 | ||
|
|
49edaef79d | ||
|
|
fcbed9ef01 | ||
|
|
3edb414d23 | ||
|
|
d779c21cc1 | ||
|
|
8d32bc56ae | ||
|
|
9d03ed06c3 | ||
|
|
ee290e5c14 | ||
|
|
789761b177 | ||
|
|
cd0876d58a | ||
|
|
bfae4da56c | ||
|
|
f342ed5940 | ||
|
|
c7373fee28 | ||
|
|
44b2955652 | ||
|
|
8a4af69008 | ||
|
|
6650382e19 | ||
|
|
a1f5e0ba1c | ||
|
|
035bb6b285 | ||
|
|
c0107fb90e | ||
|
|
138be9d14c | ||
|
|
61f474217b | ||
|
|
d31c5eed0a | ||
|
|
5060de689b | ||
|
|
b95424ddf3 | ||
|
|
e40a442a30 | ||
|
|
b5134a9faf | ||
|
|
a791d449ce | ||
|
|
43e1a9d539 | ||
|
|
e91f80d10e | ||
|
|
9db855c7fb | ||
|
|
2dc3636b26 | ||
|
|
4d9df012f6 | ||
|
|
ff9d0d75ef | ||
|
|
4e160b3b33 | ||
|
|
5048acc9f9 | ||
|
|
1841541bc4 | ||
|
|
11d9af3844 | ||
|
|
e30b618241 | ||
|
|
966327571d | ||
|
|
303d50c197 | ||
|
|
bcdfdec211 | ||
|
|
fb769d2ac5 | ||
|
|
f8043ae16d | ||
|
|
7150f2f5c5 | ||
|
|
81bd2e3065 | ||
|
|
78c9618807 | ||
|
|
bed8939b8a | ||
|
|
9443d93500 | ||
|
|
877eba66be | ||
|
|
3af8aba40c | ||
|
|
7ece02c73d | ||
|
|
ebbd2b3ac4 |
6
.gitmodules
vendored
@@ -25,3 +25,9 @@
|
||||
[submodule "platform-darwin/External/libjson-c"]
|
||||
path = platform-darwin/External/libjson-c
|
||||
url = https://github.com/lhunath/json-c.git
|
||||
[submodule "public/site"]
|
||||
path = public/site
|
||||
url = https://github.com/Lyndir/MasterPassword.git
|
||||
branch = gh-pages
|
||||
shallow = true
|
||||
update = none
|
||||
|
||||
10
.travis.yml
@@ -1,6 +1,6 @@
|
||||
language: objective-c
|
||||
os: osx
|
||||
osx_image: xcode8.3
|
||||
osx_image: xcode9.2
|
||||
env: TERM=dumb SHLVL=0
|
||||
git:
|
||||
submodules: true
|
||||
@@ -10,3 +10,11 @@ script:
|
||||
- "( cd ./gradle && ./gradlew --info clean test )"
|
||||
- "( xcodebuild -workspace platform-darwin/MasterPassword.xcworkspace -configuration 'Test' -scheme 'MasterPassword iOS' -sdk iphonesimulator )"
|
||||
- "( xcodebuild -workspace platform-darwin/MasterPassword.xcworkspace -configuration 'Test' -scheme 'MasterPassword macOS' )"
|
||||
notifications:
|
||||
webhooks:
|
||||
urls:
|
||||
- "https://scalar.vector.im/api/neb/services/hooks/dHJhdmlzLWNpLyU0MGxodW5hdGglM0FseW5kaXIuY29tLyUyMWR2S1JpaW1uc0Z3dWdseEpHSyUzQWx5bmRpci5jb20"
|
||||
on_success: change # always|never|change
|
||||
on_failure: always
|
||||
on_start: never
|
||||
|
||||
|
||||
@@ -29,9 +29,9 @@ MPMasterKey mpw_masterKey(const char *fullName, const char *masterPassword, cons
|
||||
if (masterPassword && !strlen( masterPassword ))
|
||||
masterPassword = NULL;
|
||||
|
||||
trc( "-- mpw_masterKey (algorithm: %u)\n", algorithmVersion );
|
||||
trc( "fullName: %s\n", fullName );
|
||||
trc( "masterPassword.id: %s\n", masterPassword? mpw_id_buf( masterPassword, strlen( masterPassword ) ): NULL );
|
||||
trc( "-- mpw_masterKey (algorithm: %u)", algorithmVersion );
|
||||
trc( "fullName: %s", fullName );
|
||||
trc( "masterPassword.id: %s", masterPassword? mpw_id_buf( masterPassword, strlen( masterPassword ) ): NULL );
|
||||
if (!fullName || !masterPassword)
|
||||
return NULL;
|
||||
|
||||
@@ -45,7 +45,7 @@ MPMasterKey mpw_masterKey(const char *fullName, const char *masterPassword, cons
|
||||
case MPAlgorithmVersion3:
|
||||
return mpw_masterKey_v3( fullName, masterPassword );
|
||||
default:
|
||||
err( "Unsupported version: %d\n", algorithmVersion );
|
||||
err( "Unsupported version: %d", algorithmVersion );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -54,16 +54,14 @@ MPSiteKey mpw_siteKey(
|
||||
MPMasterKey masterKey, const char *siteName, const MPCounterValue siteCounter,
|
||||
const MPKeyPurpose keyPurpose, const char *keyContext, const MPAlgorithmVersion algorithmVersion) {
|
||||
|
||||
if (siteName && !strlen( siteName ))
|
||||
siteName = NULL;
|
||||
if (keyContext && !strlen( keyContext ))
|
||||
keyContext = NULL;
|
||||
|
||||
trc( "-- mpw_siteKey (algorithm: %u)\n", algorithmVersion );
|
||||
trc( "siteName: %s\n", siteName );
|
||||
trc( "siteCounter: %d\n", siteCounter );
|
||||
trc( "keyPurpose: %d (%s)\n", keyPurpose, mpw_nameForPurpose( keyPurpose ) );
|
||||
trc( "keyContext: %s\n", keyContext );
|
||||
trc( "-- mpw_siteKey (algorithm: %u)", algorithmVersion );
|
||||
trc( "siteName: %s", siteName );
|
||||
trc( "siteCounter: %d", siteCounter );
|
||||
trc( "keyPurpose: %d (%s)", keyPurpose, mpw_nameForPurpose( keyPurpose ) );
|
||||
trc( "keyContext: %s", keyContext );
|
||||
if (!masterKey || !siteName)
|
||||
return NULL;
|
||||
|
||||
@@ -77,7 +75,7 @@ MPSiteKey mpw_siteKey(
|
||||
case MPAlgorithmVersion3:
|
||||
return mpw_siteKey_v3( masterKey, siteName, siteCounter, keyPurpose, keyContext );
|
||||
default:
|
||||
err( "Unsupported version: %d\n", algorithmVersion );
|
||||
err( "Unsupported version: %d", algorithmVersion );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -88,8 +86,6 @@ const char *mpw_siteResult(
|
||||
const MPResultType resultType, const char *resultParam,
|
||||
const MPAlgorithmVersion algorithmVersion) {
|
||||
|
||||
if (siteName && !strlen( siteName ))
|
||||
siteName = NULL;
|
||||
if (keyContext && !strlen( keyContext ))
|
||||
keyContext = NULL;
|
||||
if (resultParam && !strlen( resultParam ))
|
||||
@@ -99,9 +95,9 @@ const char *mpw_siteResult(
|
||||
if (!siteKey)
|
||||
return NULL;
|
||||
|
||||
trc( "-- mpw_siteResult (algorithm: %u)\n", algorithmVersion );
|
||||
trc( "resultType: %d (%s)\n", resultType, mpw_nameForType( resultType ) );
|
||||
trc( "resultParam: %s\n", resultParam );
|
||||
trc( "-- mpw_siteResult (algorithm: %u)", algorithmVersion );
|
||||
trc( "resultType: %d (%s)", resultType, mpw_nameForType( resultType ) );
|
||||
trc( "resultParam: %s", resultParam );
|
||||
|
||||
char *sitePassword = NULL;
|
||||
if (resultType & MPResultTypeClassTemplate) {
|
||||
@@ -115,7 +111,7 @@ const char *mpw_siteResult(
|
||||
case MPAlgorithmVersion3:
|
||||
return mpw_sitePasswordFromTemplate_v3( masterKey, siteKey, resultType, resultParam );
|
||||
default:
|
||||
err( "Unsupported version: %d\n", algorithmVersion );
|
||||
err( "Unsupported version: %d", algorithmVersion );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -130,7 +126,7 @@ const char *mpw_siteResult(
|
||||
case MPAlgorithmVersion3:
|
||||
return mpw_sitePasswordFromCrypt_v3( masterKey, siteKey, resultType, resultParam );
|
||||
default:
|
||||
err( "Unsupported version: %d\n", algorithmVersion );
|
||||
err( "Unsupported version: %d", algorithmVersion );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -145,12 +141,12 @@ const char *mpw_siteResult(
|
||||
case MPAlgorithmVersion3:
|
||||
return mpw_sitePasswordFromDerive_v3( masterKey, siteKey, resultType, resultParam );
|
||||
default:
|
||||
err( "Unsupported version: %d\n", algorithmVersion );
|
||||
err( "Unsupported version: %d", algorithmVersion );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
err( "Unsupported password type: %d\n", resultType );
|
||||
err( "Unsupported password type: %d", resultType );
|
||||
}
|
||||
|
||||
return sitePassword;
|
||||
@@ -162,8 +158,6 @@ const char *mpw_siteState(
|
||||
const MPResultType resultType, const char *resultParam,
|
||||
const MPAlgorithmVersion algorithmVersion) {
|
||||
|
||||
if (siteName && !strlen( siteName ))
|
||||
siteName = NULL;
|
||||
if (keyContext && !strlen( keyContext ))
|
||||
keyContext = NULL;
|
||||
if (resultParam && !strlen( resultParam ))
|
||||
@@ -173,9 +167,9 @@ const char *mpw_siteState(
|
||||
if (!siteKey)
|
||||
return NULL;
|
||||
|
||||
trc( "-- mpw_siteState (algorithm: %u)\n", algorithmVersion );
|
||||
trc( "resultType: %d (%s)\n", resultType, mpw_nameForType( resultType ) );
|
||||
trc( "resultParam: %zu bytes = %s\n", sizeof( resultParam ), resultParam );
|
||||
trc( "-- mpw_siteState (algorithm: %u)", algorithmVersion );
|
||||
trc( "resultType: %d (%s)", resultType, mpw_nameForType( resultType ) );
|
||||
trc( "resultParam: %zu bytes = %s", sizeof( resultParam ), resultParam );
|
||||
if (!masterKey || !resultParam)
|
||||
return NULL;
|
||||
|
||||
@@ -189,7 +183,44 @@ const char *mpw_siteState(
|
||||
case MPAlgorithmVersion3:
|
||||
return mpw_siteState_v3( masterKey, siteKey, resultType, resultParam );
|
||||
default:
|
||||
err( "Unsupported version: %d\n", algorithmVersion );
|
||||
err( "Unsupported version: %d", algorithmVersion );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
MPIdenticon mpw_identicon(const char *fullName, const char *masterPassword) {
|
||||
|
||||
const char *leftArm[] = { "╔", "╚", "╰", "═" };
|
||||
const char *rightArm[] = { "╗", "╝", "╯", "═" };
|
||||
const char *body[] = { "█", "░", "▒", "▓", "☺", "☻" };
|
||||
const char *accessory[] = {
|
||||
"◈", "◎", "◐", "◑", "◒", "◓", "☀", "☁", "☂", "☃", "", "★", "☆", "☎", "☏", "⎈", "⌂", "☘", "☢", "☣",
|
||||
"☕", "⌚", "⌛", "⏰", "⚡", "⛄", "⛅", "☔", "♔", "♕", "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟",
|
||||
"♨", "♩", "♪", "♫", "⚐", "⚑", "⚔", "⚖", "⚙", "⚠", "⌘", "⏎", "✄", "✆", "✈", "✉", "✌"
|
||||
};
|
||||
|
||||
const uint8_t *identiconSeed = NULL;
|
||||
if (fullName && strlen( fullName ) && masterPassword && strlen( masterPassword ))
|
||||
identiconSeed = mpw_hash_hmac_sha256(
|
||||
(const uint8_t *)masterPassword, strlen( masterPassword ),
|
||||
(const uint8_t *)fullName, strlen( fullName ) );
|
||||
if (!identiconSeed)
|
||||
return (MPIdenticon){
|
||||
.leftArm = "",
|
||||
.body = "",
|
||||
.rightArm = "",
|
||||
.accessory = "",
|
||||
.color=0,
|
||||
};
|
||||
|
||||
MPIdenticon identicon = {
|
||||
.leftArm = leftArm[identiconSeed[0] % (sizeof( leftArm ) / sizeof( leftArm[0] ))],
|
||||
.body = body[identiconSeed[1] % (sizeof( body ) / sizeof( body[0] ))],
|
||||
.rightArm = rightArm[identiconSeed[2] % (sizeof( rightArm ) / sizeof( rightArm[0] ))],
|
||||
.accessory = accessory[identiconSeed[3] % (sizeof( accessory ) / sizeof( accessory[0] ))],
|
||||
.color = (uint8_t)(identiconSeed[4] % (MPIdenticonColorLast - MPIdenticonColorFirst + 1) + MPIdenticonColorFirst),
|
||||
};
|
||||
mpw_free( &identiconSeed, 32 );
|
||||
|
||||
return identicon;
|
||||
}
|
||||
|
||||
@@ -66,4 +66,7 @@ const char *mpw_siteState(
|
||||
const MPResultType resultType, const char *resultParam,
|
||||
const MPAlgorithmVersion algorithmVersion);
|
||||
|
||||
/** @return A fingerprint for a user. */
|
||||
MPIdenticon mpw_identicon(const char *fullName, const char *masterPassword);
|
||||
|
||||
#endif // _MPW_ALGORITHM_H
|
||||
|
||||
@@ -52,10 +52,10 @@ static MPMasterKey mpw_masterKey_v0(
|
||||
const char *fullName, const char *masterPassword) {
|
||||
|
||||
const char *keyScope = mpw_scopeForPurpose( MPKeyPurposeAuthentication );
|
||||
trc( "keyScope: %s\n", keyScope );
|
||||
trc( "keyScope: %s", keyScope );
|
||||
|
||||
// Calculate the master key salt.
|
||||
trc( "masterKeySalt: keyScope=%s | #fullName=%s | fullName=%s\n",
|
||||
trc( "masterKeySalt: keyScope=%s | #fullName=%s | fullName=%s",
|
||||
keyScope, mpw_hex_l( (uint32_t)mpw_utf8_strlen( fullName ) ), fullName );
|
||||
size_t masterKeySaltSize = 0;
|
||||
uint8_t *masterKeySalt = NULL;
|
||||
@@ -63,20 +63,20 @@ static MPMasterKey mpw_masterKey_v0(
|
||||
mpw_push_int( &masterKeySalt, &masterKeySaltSize, (uint32_t)mpw_utf8_strlen( fullName ) );
|
||||
mpw_push_string( &masterKeySalt, &masterKeySaltSize, fullName );
|
||||
if (!masterKeySalt) {
|
||||
err( "Could not allocate master key salt: %s\n", strerror( errno ) );
|
||||
err( "Could not allocate master key salt: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( " => masterKeySalt.id: %s\n", mpw_id_buf( masterKeySalt, masterKeySaltSize ) );
|
||||
trc( " => masterKeySalt.id: %s", mpw_id_buf( masterKeySalt, masterKeySaltSize ) );
|
||||
|
||||
// Calculate the master key.
|
||||
trc( "masterKey: scrypt( masterPassword, masterKeySalt, N=%lu, r=%u, p=%u )\n", MP_N, MP_r, MP_p );
|
||||
trc( "masterKey: scrypt( masterPassword, masterKeySalt, N=%lu, r=%u, p=%u )", MP_N, MP_r, MP_p );
|
||||
MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p );
|
||||
mpw_free( &masterKeySalt, masterKeySaltSize );
|
||||
if (!masterKey) {
|
||||
err( "Could not derive master key: %s\n", strerror( errno ) );
|
||||
err( "Could not derive master key: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( " => masterKey.id: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) );
|
||||
trc( " => masterKey.id: %s", mpw_id_buf( masterKey, MPMasterKeySize ) );
|
||||
|
||||
return masterKey;
|
||||
}
|
||||
@@ -86,14 +86,14 @@ static MPSiteKey mpw_siteKey_v0(
|
||||
MPKeyPurpose keyPurpose, const char *keyContext) {
|
||||
|
||||
const char *keyScope = mpw_scopeForPurpose( keyPurpose );
|
||||
trc( "keyScope: %s\n", keyScope );
|
||||
trc( "keyScope: %s", keyScope );
|
||||
|
||||
// OTP counter value.
|
||||
if (siteCounter == MPCounterValueTOTP)
|
||||
siteCounter = ((uint32_t)time( NULL ) / MP_otp_window) * MP_otp_window;
|
||||
|
||||
// Calculate the site seed.
|
||||
trc( "siteSalt: keyScope=%s | #siteName=%s | siteName=%s | siteCounter=%s | #keyContext=%s | keyContext=%s\n",
|
||||
trc( "siteSalt: keyScope=%s | #siteName=%s | siteName=%s | siteCounter=%s | #keyContext=%s | keyContext=%s",
|
||||
keyScope, mpw_hex_l( (uint32_t)mpw_utf8_strlen( siteName ) ), siteName, mpw_hex_l( siteCounter ),
|
||||
keyContext? mpw_hex_l( (uint32_t)mpw_utf8_strlen( keyContext ) ): NULL, keyContext );
|
||||
size_t siteSaltSize = 0;
|
||||
@@ -107,20 +107,20 @@ static MPSiteKey mpw_siteKey_v0(
|
||||
mpw_push_string( &siteSalt, &siteSaltSize, keyContext );
|
||||
}
|
||||
if (!siteSalt) {
|
||||
err( "Could not allocate site salt: %s\n", strerror( errno ) );
|
||||
err( "Could not allocate site salt: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( " => siteSalt.id: %s\n", mpw_id_buf( siteSalt, siteSaltSize ) );
|
||||
trc( " => siteSalt.id: %s", mpw_id_buf( siteSalt, siteSaltSize ) );
|
||||
|
||||
trc( "siteKey: hmac-sha256( masterKey.id=%s, siteSalt )\n",
|
||||
trc( "siteKey: hmac-sha256( masterKey.id=%s, siteSalt )",
|
||||
mpw_id_buf( masterKey, MPMasterKeySize ) );
|
||||
MPSiteKey siteKey = mpw_hash_hmac_sha256( masterKey, MPMasterKeySize, siteSalt, siteSaltSize );
|
||||
mpw_free( &siteSalt, siteSaltSize );
|
||||
if (!siteKey) {
|
||||
err( "Could not derive site key: %s\n", strerror( errno ) );
|
||||
err( "Could not derive site key: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( " => siteKey.id: %s\n", mpw_id_buf( siteKey, MPSiteKeySize ) );
|
||||
trc( " => siteKey.id: %s", mpw_id_buf( siteKey, MPSiteKeySize ) );
|
||||
|
||||
return siteKey;
|
||||
}
|
||||
@@ -134,11 +134,11 @@ static const char *mpw_sitePasswordFromTemplate_v0(
|
||||
uint16_t seedByte;
|
||||
mpw_uint16( (uint16_t)_siteKey[0], (uint8_t *)&seedByte );
|
||||
const char *template = mpw_templateForType_v0( resultType, seedByte );
|
||||
trc( "template: %u => %s\n", seedByte, template );
|
||||
trc( "template: %u => %s", seedByte, template );
|
||||
if (!template)
|
||||
return NULL;
|
||||
if (strlen( template ) > MPSiteKeySize) {
|
||||
err( "Template too long for password seed: %zu\n", strlen( template ) );
|
||||
err( "Template too long for password seed: %zu", strlen( template ) );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -147,10 +147,10 @@ static const char *mpw_sitePasswordFromTemplate_v0(
|
||||
for (size_t c = 0; c < strlen( template ); ++c) {
|
||||
mpw_uint16( (uint16_t)_siteKey[c + 1], (uint8_t *)&seedByte );
|
||||
sitePassword[c] = mpw_characterFromClass_v0( template[c], seedByte );
|
||||
trc( " - class: %c, index: %5u (0x%02hX) => character: %c\n",
|
||||
trc( " - class: %c, index: %5u (0x%02hX) => character: %c",
|
||||
template[c], seedByte, seedByte, sitePassword[c] );
|
||||
}
|
||||
trc( " => password: %s\n", sitePassword );
|
||||
trc( " => password: %s", sitePassword );
|
||||
|
||||
return sitePassword;
|
||||
}
|
||||
@@ -159,7 +159,7 @@ static const char *mpw_sitePasswordFromCrypt_v0(
|
||||
MPMasterKey masterKey, MPSiteKey __unused siteKey, MPResultType __unused resultType, const char *cipherText) {
|
||||
|
||||
if (!cipherText) {
|
||||
err( "Missing encrypted state.\n" );
|
||||
err( "Missing encrypted state." );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -171,16 +171,16 @@ static const char *mpw_sitePasswordFromCrypt_v0(
|
||||
mpw_free( &cipherBuf, mpw_base64_decode_max( cipherText ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( "b64 decoded: %zu bytes = %s\n", bufSize, mpw_hex( cipherBuf, bufSize ) );
|
||||
trc( "b64 decoded: %zu bytes = %s", bufSize, mpw_hex( cipherBuf, bufSize ) );
|
||||
|
||||
// Decrypt
|
||||
const uint8_t *plainBytes = mpw_aes_decrypt( masterKey, MPMasterKeySize, cipherBuf, &bufSize );
|
||||
mpw_free( &cipherBuf, cipherBufSize );
|
||||
const char *plainText = strndup( (char *)plainBytes, bufSize );
|
||||
const char *plainText = mpw_strndup( (char *)plainBytes, bufSize );
|
||||
mpw_free( &plainBytes, bufSize );
|
||||
if (!plainText)
|
||||
err( "AES decryption error: %s\n", strerror( errno ) );
|
||||
trc( "decrypted -> plainText: %zu bytes = %s = %s\n", strlen( plainText ), plainText, mpw_hex( plainText, strlen( plainText ) ) );
|
||||
err( "AES decryption error: %s", strerror( errno ) );
|
||||
trc( "decrypted -> plainText: %zu bytes = %s = %s", strlen( plainText ), plainText, mpw_hex( plainText, strlen( plainText ) ) );
|
||||
|
||||
return plainText;
|
||||
}
|
||||
@@ -191,23 +191,23 @@ static const char *mpw_sitePasswordFromDerive_v0(
|
||||
switch (resultType) {
|
||||
case MPResultTypeDeriveKey: {
|
||||
if (!resultParam) {
|
||||
err( "Missing key size parameter.\n" );
|
||||
err( "Missing key size parameter." );
|
||||
return NULL;
|
||||
}
|
||||
int resultParamInt = atoi( resultParam );
|
||||
if (!resultParamInt)
|
||||
resultParamInt = 512;
|
||||
if (resultParamInt < 128 || resultParamInt > 512 || resultParamInt % 8 != 0) {
|
||||
err( "Parameter is not a valid key size (should be 128 - 512): %s\n", resultParam );
|
||||
err( "Parameter is not a valid key size (should be 128 - 512): %s", resultParam );
|
||||
return NULL;
|
||||
}
|
||||
uint16_t keySize = (uint16_t)(resultParamInt / 8);
|
||||
trc( "keySize: %u\n", keySize );
|
||||
trc( "keySize: %u", keySize );
|
||||
|
||||
// Derive key
|
||||
const uint8_t *resultKey = mpw_kdf_blake2b( keySize, siteKey, MPSiteKeySize, NULL, 0, 0, NULL );
|
||||
if (!resultKey) {
|
||||
err( "Could not derive result key: %s\n", strerror( errno ) );
|
||||
err( "Could not derive result key: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -219,13 +219,13 @@ static const char *mpw_sitePasswordFromDerive_v0(
|
||||
mpw_free_string( &b64Key );
|
||||
}
|
||||
else
|
||||
trc( "b64 encoded -> key: %s\n", b64Key );
|
||||
trc( "b64 encoded -> key: %s", b64Key );
|
||||
mpw_free( &resultKey, keySize );
|
||||
|
||||
return b64Key;
|
||||
}
|
||||
default:
|
||||
err( "Unsupported derived password type: %d\n", resultType );
|
||||
err( "Unsupported derived password type: %d", resultType );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -237,10 +237,10 @@ static const char *mpw_siteState_v0(
|
||||
size_t bufSize = strlen( plainText );
|
||||
const uint8_t *cipherBuf = mpw_aes_encrypt( masterKey, MPMasterKeySize, (const uint8_t *)plainText, &bufSize );
|
||||
if (!cipherBuf) {
|
||||
err( "AES encryption error: %s\n", strerror( errno ) );
|
||||
err( "AES encryption error: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( "cipherBuf: %zu bytes = %s\n", bufSize, mpw_hex( cipherBuf, bufSize ) );
|
||||
trc( "cipherBuf: %zu bytes = %s", bufSize, mpw_hex( cipherBuf, bufSize ) );
|
||||
|
||||
// Base64-encode
|
||||
size_t b64Max = mpw_base64_encode_max( bufSize );
|
||||
@@ -250,7 +250,7 @@ static const char *mpw_siteState_v0(
|
||||
mpw_free_string( &cipherText );
|
||||
}
|
||||
else
|
||||
trc( "b64 encoded -> cipherText: %s\n", cipherText );
|
||||
trc( "b64 encoded -> cipherText: %s", cipherText );
|
||||
mpw_free( &cipherBuf, bufSize );
|
||||
|
||||
return cipherText;
|
||||
|
||||
@@ -58,11 +58,11 @@ static const char *mpw_sitePasswordFromTemplate_v1(
|
||||
// Determine the template.
|
||||
uint8_t seedByte = siteKey[0];
|
||||
const char *template = mpw_templateForType( resultType, seedByte );
|
||||
trc( "template: %u => %s\n", seedByte, template );
|
||||
trc( "template: %u => %s", seedByte, template );
|
||||
if (!template)
|
||||
return NULL;
|
||||
if (strlen( template ) > MPSiteKeySize) {
|
||||
err( "Template too long for password seed: %zu\n", strlen( template ) );
|
||||
err( "Template too long for password seed: %zu", strlen( template ) );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -71,10 +71,10 @@ static const char *mpw_sitePasswordFromTemplate_v1(
|
||||
for (size_t c = 0; c < strlen( template ); ++c) {
|
||||
seedByte = siteKey[c + 1];
|
||||
sitePassword[c] = mpw_characterFromClass( template[c], seedByte );
|
||||
trc( " - class: %c, index: %3u (0x%02hhX) => character: %c\n",
|
||||
trc( " - class: %c, index: %3u (0x%02hhX) => character: %c",
|
||||
template[c], seedByte, seedByte, sitePassword[c] );
|
||||
}
|
||||
trc( " => password: %s\n", sitePassword );
|
||||
trc( " => password: %s", sitePassword );
|
||||
|
||||
return sitePassword;
|
||||
}
|
||||
|
||||
@@ -51,14 +51,14 @@ static MPSiteKey mpw_siteKey_v2(
|
||||
MPKeyPurpose keyPurpose, const char *keyContext) {
|
||||
|
||||
const char *keyScope = mpw_scopeForPurpose( keyPurpose );
|
||||
trc( "keyScope: %s\n", keyScope );
|
||||
trc( "keyScope: %s", keyScope );
|
||||
|
||||
// OTP counter value.
|
||||
if (siteCounter == MPCounterValueTOTP)
|
||||
siteCounter = ((uint32_t)time( NULL ) / MP_otp_window) * MP_otp_window;
|
||||
|
||||
// Calculate the site seed.
|
||||
trc( "siteSalt: keyScope=%s | #siteName=%s | siteName=%s | siteCounter=%s | #keyContext=%s | keyContext=%s\n",
|
||||
trc( "siteSalt: keyScope=%s | #siteName=%s | siteName=%s | siteCounter=%s | #keyContext=%s | keyContext=%s",
|
||||
keyScope, mpw_hex_l( (uint32_t)strlen( siteName ) ), siteName, mpw_hex_l( siteCounter ),
|
||||
keyContext? mpw_hex_l( (uint32_t)strlen( keyContext ) ): NULL, keyContext );
|
||||
size_t siteSaltSize = 0;
|
||||
@@ -72,20 +72,20 @@ static MPSiteKey mpw_siteKey_v2(
|
||||
mpw_push_string( &siteSalt, &siteSaltSize, keyContext );
|
||||
}
|
||||
if (!siteSalt) {
|
||||
err( "Could not allocate site salt: %s\n", strerror( errno ) );
|
||||
err( "Could not allocate site salt: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( " => siteSalt.id: %s\n", mpw_id_buf( siteSalt, siteSaltSize ) );
|
||||
trc( " => siteSalt.id: %s", mpw_id_buf( siteSalt, siteSaltSize ) );
|
||||
|
||||
trc( "siteKey: hmac-sha256( masterKey.id=%s, siteSalt )\n",
|
||||
trc( "siteKey: hmac-sha256( masterKey.id=%s, siteSalt )",
|
||||
mpw_id_buf( masterKey, MPMasterKeySize ) );
|
||||
MPSiteKey siteKey = mpw_hash_hmac_sha256( masterKey, MPMasterKeySize, siteSalt, siteSaltSize );
|
||||
mpw_free( &siteSalt, siteSaltSize );
|
||||
if (!siteKey) {
|
||||
err( "Could not derive site key: %s\n", strerror( errno ) );
|
||||
err( "Could not derive site key: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( " => siteKey.id: %s\n", mpw_id_buf( siteKey, MPSiteKeySize ) );
|
||||
trc( " => siteKey.id: %s", mpw_id_buf( siteKey, MPSiteKeySize ) );
|
||||
|
||||
return siteKey;
|
||||
}
|
||||
|
||||
@@ -44,10 +44,10 @@ static MPMasterKey mpw_masterKey_v3(
|
||||
const char *fullName, const char *masterPassword) {
|
||||
|
||||
const char *keyScope = mpw_scopeForPurpose( MPKeyPurposeAuthentication );
|
||||
trc( "keyScope: %s\n", keyScope );
|
||||
trc( "keyScope: %s", keyScope );
|
||||
|
||||
// Calculate the master key salt.
|
||||
trc( "masterKeySalt: keyScope=%s | #fullName=%s | fullName=%s\n",
|
||||
trc( "masterKeySalt: keyScope=%s | #fullName=%s | fullName=%s",
|
||||
keyScope, mpw_hex_l( (uint32_t)strlen( fullName ) ), fullName );
|
||||
size_t masterKeySaltSize = 0;
|
||||
uint8_t *masterKeySalt = NULL;
|
||||
@@ -55,20 +55,20 @@ static MPMasterKey mpw_masterKey_v3(
|
||||
mpw_push_int( &masterKeySalt, &masterKeySaltSize, (uint32_t)strlen( fullName ) );
|
||||
mpw_push_string( &masterKeySalt, &masterKeySaltSize, fullName );
|
||||
if (!masterKeySalt) {
|
||||
err( "Could not allocate master key salt: %s\n", strerror( errno ) );
|
||||
err( "Could not allocate master key salt: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( " => masterKeySalt.id: %s\n", mpw_id_buf( masterKeySalt, masterKeySaltSize ) );
|
||||
trc( " => masterKeySalt.id: %s", mpw_id_buf( masterKeySalt, masterKeySaltSize ) );
|
||||
|
||||
// Calculate the master key.
|
||||
trc( "masterKey: scrypt( masterPassword, masterKeySalt, N=%lu, r=%u, p=%u )\n", MP_N, MP_r, MP_p );
|
||||
trc( "masterKey: scrypt( masterPassword, masterKeySalt, N=%lu, r=%u, p=%u )", MP_N, MP_r, MP_p );
|
||||
MPMasterKey masterKey = mpw_kdf_scrypt( MPMasterKeySize, masterPassword, masterKeySalt, masterKeySaltSize, MP_N, MP_r, MP_p );
|
||||
mpw_free( &masterKeySalt, masterKeySaltSize );
|
||||
if (!masterKey) {
|
||||
err( "Could not derive master key: %s\n", strerror( errno ) );
|
||||
err( "Could not derive master key: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
trc( " => masterKey.id: %s\n", mpw_id_buf( masterKey, MPMasterKeySize ) );
|
||||
trc( " => masterKey.id: %s", mpw_id_buf( masterKey, MPMasterKeySize ) );
|
||||
|
||||
return masterKey;
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@ char *mpw_get_token(const char **in, const char *eol, char *delim) {
|
||||
|
||||
// Find characters up to the first delim.
|
||||
size_t len = strcspn( *in, delim );
|
||||
char *token = len && len <= (size_t)(eol - *in)? strndup( *in, len ): NULL;
|
||||
char *token = len && len <= (size_t)(eol - *in)? mpw_strndup( *in, len ): NULL;
|
||||
|
||||
// Advance past the delimitor.
|
||||
*in = min( eol, *in + len + 1 );
|
||||
@@ -38,30 +38,12 @@ char *mpw_get_token(const char **in, const char *eol, char *delim) {
|
||||
time_t mpw_mktime(
|
||||
const char *time) {
|
||||
|
||||
struct tm tm = { .tm_isdst = -1, .tm_gmtoff = 0 };
|
||||
struct tm tm = { .tm_isdst = -1 };
|
||||
if (time && sscanf( time, "%4d-%2d-%2dT%2d:%2d:%2dZ",
|
||||
&tm.tm_year, &tm.tm_mon, &tm.tm_mday,
|
||||
&tm.tm_hour, &tm.tm_min, &tm.tm_sec ) == 6) {
|
||||
tm.tm_year -= 1900; // tm_year 0 = rfc3339 year 1900
|
||||
tm.tm_mon -= 1; // tm_mon 0 = rfc3339 month 1
|
||||
/*
|
||||
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_ARITHMETIC (code=EXC_I386_DIV, subcode=0x0)
|
||||
frame #0: 0x00007fff9fe4d219 libsystem_notify.dylib`_nc_table_find_64 + 22
|
||||
libsystem_notify.dylib`_nc_table_find_64:
|
||||
-> 0x7fff9fe4d219 <+22>: divl 0x4(%rdi)
|
||||
0x7fff9fe4d21c <+25>: movq 0x8(%rdi), %rax
|
||||
0x7fff9fe4d220 <+29>: movq (%rax,%rdx,8), %rcx
|
||||
0x7fff9fe4d224 <+33>: xorl %eax, %eax
|
||||
(lldb) bt
|
||||
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_ARITHMETIC (code=EXC_I386_DIV, subcode=0x0)
|
||||
* frame #0: 0x00007fff9fe4d219 libsystem_notify.dylib`_nc_table_find_64 + 22
|
||||
frame #1: 0x00007fff9fe4a21e libsystem_notify.dylib`registration_node_find + 53
|
||||
frame #2: 0x00007fff9fe4b78d libsystem_notify.dylib`notify_check + 105
|
||||
frame #3: 0x00007fff9fccc164 libsystem_c.dylib`notify_check_tz + 24
|
||||
frame #4: 0x00007fff9fccbd97 libsystem_c.dylib`tzsetwall_basic + 45
|
||||
frame #5: 0x00007fff9fccdcd0 libsystem_c.dylib`mktime + 46
|
||||
frame #6: 0x0000000100009496 mpw`mpw_mktime(time="2017-04-16T03:16:35Z") at mpw-marshal-util.c:47
|
||||
*/
|
||||
return mktime( &tm );
|
||||
}
|
||||
|
||||
@@ -73,10 +55,10 @@ json_object *mpw_get_json_section(
|
||||
json_object *obj, const char *section) {
|
||||
|
||||
json_object *json_value = obj;
|
||||
char *sectionTokenizer = strdup( section ), *sectionToken = sectionTokenizer;
|
||||
char *sectionTokenizer = mpw_strdup( section ), *sectionToken = sectionTokenizer;
|
||||
for (sectionToken = strtok( sectionToken, "." ); sectionToken; sectionToken = strtok( NULL, "." ))
|
||||
if (!json_object_object_get_ex( json_value, sectionToken, &json_value ) || !json_value) {
|
||||
trc( "While resolving: %s: Missing value for: %s\n", section, sectionToken );
|
||||
trc( "While resolving: %s: Missing value for: %s", section, sectionToken );
|
||||
json_value = NULL;
|
||||
break;
|
||||
}
|
||||
@@ -124,7 +106,7 @@ bool mpw_update_masterKey(MPMasterKey *masterKey, MPAlgorithmVersion *masterKeyA
|
||||
*masterKeyAlgorithm = targetKeyAlgorithm;
|
||||
*masterKey = mpw_masterKey( fullName, masterPassword, *masterKeyAlgorithm );
|
||||
if (!*masterKey) {
|
||||
err( "Couldn't derive master key for user %s, algorithm %d.\n", fullName, *masterKeyAlgorithm );
|
||||
err( "Couldn't derive master key for user %s, algorithm %d.", fullName, *masterKeyAlgorithm );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,8 +33,8 @@ MPMarshalledUser *mpw_marshal_user(
|
||||
return NULL;
|
||||
|
||||
*user = (MPMarshalledUser){
|
||||
.fullName = strdup( fullName ),
|
||||
.masterPassword = strdup( masterPassword ),
|
||||
.fullName = mpw_strdup( fullName ),
|
||||
.masterPassword = mpw_strdup( masterPassword ),
|
||||
.algorithm = algorithmVersion,
|
||||
.redacted = true,
|
||||
|
||||
@@ -46,7 +46,7 @@ MPMarshalledUser *mpw_marshal_user(
|
||||
.sites = NULL,
|
||||
};
|
||||
return user;
|
||||
};
|
||||
}
|
||||
|
||||
MPMarshalledSite *mpw_marshal_site(
|
||||
MPMarshalledUser *user, const char *siteName, const MPResultType resultType,
|
||||
@@ -57,7 +57,7 @@ MPMarshalledSite *mpw_marshal_site(
|
||||
|
||||
MPMarshalledSite *site = &user->sites[user->sites_count - 1];
|
||||
*site = (MPMarshalledSite){
|
||||
.name = strdup( siteName ),
|
||||
.name = mpw_strdup( siteName ),
|
||||
.content = NULL,
|
||||
.type = resultType,
|
||||
.counter = siteCounter,
|
||||
@@ -74,7 +74,7 @@ MPMarshalledSite *mpw_marshal_site(
|
||||
.questions = NULL,
|
||||
};
|
||||
return site;
|
||||
};
|
||||
}
|
||||
|
||||
MPMarshalledQuestion *mpw_marshal_question(
|
||||
MPMarshalledSite *site, const char *keyword) {
|
||||
@@ -86,7 +86,7 @@ MPMarshalledQuestion *mpw_marshal_question(
|
||||
|
||||
MPMarshalledQuestion *question = &site->questions[site->questions_count - 1];
|
||||
*question = (MPMarshalledQuestion){
|
||||
.keyword = strdup( keyword ),
|
||||
.keyword = mpw_strdup( keyword ),
|
||||
.content = NULL,
|
||||
.type = MPResultTypeTemplatePhrase,
|
||||
};
|
||||
@@ -198,9 +198,9 @@ static bool mpw_marshal_write_flat(
|
||||
else {
|
||||
// Redacted
|
||||
if (site->type & MPSiteFeatureExportContent && site->content && strlen( site->content ))
|
||||
content = strdup( site->content );
|
||||
content = mpw_strdup( site->content );
|
||||
if (site->loginType & MPSiteFeatureExportContent && site->loginContent && strlen( site->loginContent ))
|
||||
loginContent = strdup( site->loginContent );
|
||||
loginContent = mpw_strdup( site->loginContent );
|
||||
}
|
||||
|
||||
if (strftime( dateString, sizeof( dateString ), "%FT%TZ", gmtime( &site->lastUsed ) ))
|
||||
@@ -284,9 +284,9 @@ static bool mpw_marshal_write_json(
|
||||
else {
|
||||
// Redacted
|
||||
if (site->type & MPSiteFeatureExportContent && site->content && strlen( site->content ))
|
||||
content = strdup( site->content );
|
||||
content = mpw_strdup( site->content );
|
||||
if (site->loginType & MPSiteFeatureExportContent && site->loginContent && strlen( site->loginContent ))
|
||||
loginContent = strdup( site->loginContent );
|
||||
loginContent = mpw_strdup( site->loginContent );
|
||||
}
|
||||
|
||||
json_object *json_site = json_object_new_object();
|
||||
@@ -397,9 +397,9 @@ static void mpw_marshal_read_flat_info(
|
||||
if (strcmp( headerName, "Algorithm" ) == 0)
|
||||
info->algorithm = (MPAlgorithmVersion)atoi( headerValue );
|
||||
if (strcmp( headerName, "Full Name" ) == 0 || strcmp( headerName, "User Name" ) == 0)
|
||||
info->fullName = strdup( headerValue );
|
||||
info->fullName = mpw_strdup( headerValue );
|
||||
if (strcmp( headerName, "Key ID" ) == 0)
|
||||
info->keyID = strdup( headerValue );
|
||||
info->keyID = mpw_strdup( headerValue );
|
||||
if (strcmp( headerName, "Passwords" ) == 0)
|
||||
info->redacted = strcmp( headerValue, "VISIBLE" ) != 0;
|
||||
if (strcmp( headerName, "Date" ) == 0)
|
||||
@@ -456,18 +456,18 @@ static MPMarshalledUser *mpw_marshal_read_flat(
|
||||
char *headerValue = mpw_get_token( &positionInLine, endOfLine, "\n" );
|
||||
if (!headerName || !headerValue) {
|
||||
error->type = MPMarshalErrorStructure;
|
||||
error->description = mpw_str( "Invalid header: %s", strndup( positionInLine, (size_t)(endOfLine - positionInLine) ) );
|
||||
error->description = mpw_str( "Invalid header: %s", mpw_strndup( positionInLine, (size_t)(endOfLine - positionInLine) ) );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (strcmp( headerName, "Format" ) == 0)
|
||||
format = (unsigned int)atoi( headerValue );
|
||||
if (strcmp( headerName, "Full Name" ) == 0 || strcmp( headerName, "User Name" ) == 0)
|
||||
fullName = strdup( headerValue );
|
||||
fullName = mpw_strdup( headerValue );
|
||||
if (strcmp( headerName, "Avatar" ) == 0)
|
||||
avatar = (unsigned int)atoi( headerValue );
|
||||
if (strcmp( headerName, "Key ID" ) == 0)
|
||||
keyID = strdup( headerValue );
|
||||
keyID = mpw_strdup( headerValue );
|
||||
if (strcmp( headerName, "Algorithm" ) == 0) {
|
||||
int value = atoi( headerValue );
|
||||
if (value < MPAlgorithmVersionFirst || value > MPAlgorithmVersionLast) {
|
||||
@@ -527,11 +527,11 @@ static MPMarshalledUser *mpw_marshal_read_flat(
|
||||
str_uses = mpw_get_token( &positionInLine, endOfLine, " \t\n" );
|
||||
char *typeAndVersion = mpw_get_token( &positionInLine, endOfLine, " \t\n" );
|
||||
if (typeAndVersion) {
|
||||
str_type = strdup( strtok( typeAndVersion, ":" ) );
|
||||
str_algorithm = strdup( strtok( NULL, "" ) );
|
||||
str_type = mpw_strdup( strtok( typeAndVersion, ":" ) );
|
||||
str_algorithm = mpw_strdup( strtok( NULL, "" ) );
|
||||
mpw_free_string( &typeAndVersion );
|
||||
}
|
||||
str_counter = strdup( "1" );
|
||||
str_counter = mpw_strdup( "1" );
|
||||
siteLoginName = NULL;
|
||||
siteName = mpw_get_token( &positionInLine, endOfLine, "\t\n" );
|
||||
siteContent = mpw_get_token( &positionInLine, endOfLine, "\n" );
|
||||
@@ -542,9 +542,9 @@ static MPMarshalledUser *mpw_marshal_read_flat(
|
||||
str_uses = mpw_get_token( &positionInLine, endOfLine, " \t\n" );
|
||||
char *typeAndVersionAndCounter = mpw_get_token( &positionInLine, endOfLine, " \t\n" );
|
||||
if (typeAndVersionAndCounter) {
|
||||
str_type = strdup( strtok( typeAndVersionAndCounter, ":" ) );
|
||||
str_algorithm = strdup( strtok( NULL, ":" ) );
|
||||
str_counter = strdup( strtok( NULL, "" ) );
|
||||
str_type = mpw_strdup( strtok( typeAndVersionAndCounter, ":" ) );
|
||||
str_algorithm = mpw_strdup( strtok( NULL, ":" ) );
|
||||
str_counter = mpw_strdup( strtok( NULL, "" ) );
|
||||
mpw_free_string( &typeAndVersionAndCounter );
|
||||
}
|
||||
siteLoginName = mpw_get_token( &positionInLine, endOfLine, "\t\n" );
|
||||
@@ -608,9 +608,9 @@ static MPMarshalledUser *mpw_marshal_read_flat(
|
||||
else {
|
||||
// Redacted
|
||||
if (siteContent && strlen( siteContent ))
|
||||
site->content = strdup( siteContent );
|
||||
site->content = mpw_strdup( siteContent );
|
||||
if (siteLoginName && strlen( siteLoginName ))
|
||||
site->loginContent = strdup( siteLoginName );
|
||||
site->loginContent = mpw_strdup( siteLoginName );
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -650,8 +650,8 @@ static void mpw_marshal_read_json_info(
|
||||
|
||||
// Section: "user"
|
||||
info->algorithm = (MPAlgorithmVersion)mpw_get_json_int( json_file, "user.algorithm", MPAlgorithmVersionCurrent );
|
||||
info->fullName = strdup( mpw_get_json_string( json_file, "user.full_name", NULL ) );
|
||||
info->keyID = strdup( mpw_get_json_string( json_file, "user.key_id", NULL ) );
|
||||
info->fullName = mpw_strdup( mpw_get_json_string( json_file, "user.full_name", NULL ) );
|
||||
info->keyID = mpw_strdup( mpw_get_json_string( json_file, "user.key_id", NULL ) );
|
||||
|
||||
json_object_put( json_file );
|
||||
}
|
||||
@@ -772,7 +772,7 @@ static MPMarshalledUser *mpw_marshal_read_json(
|
||||
}
|
||||
|
||||
site->loginType = siteLoginType;
|
||||
site->url = siteURL? strdup( siteURL ): NULL;
|
||||
site->url = siteURL? mpw_strdup( siteURL ): NULL;
|
||||
site->uses = siteUses;
|
||||
site->lastUsed = siteLastUsed;
|
||||
if (!user->redacted) {
|
||||
@@ -792,9 +792,9 @@ static MPMarshalledUser *mpw_marshal_read_json(
|
||||
else {
|
||||
// Redacted
|
||||
if (siteContent && strlen( siteContent ))
|
||||
site->content = strdup( siteContent );
|
||||
site->content = mpw_strdup( siteContent );
|
||||
if (siteLoginName && strlen( siteLoginName ))
|
||||
site->loginContent = strdup( siteLoginName );
|
||||
site->loginContent = mpw_strdup( siteLoginName );
|
||||
}
|
||||
|
||||
json_object_iter json_site_question;
|
||||
@@ -813,7 +813,7 @@ static MPMarshalledUser *mpw_marshal_read_json(
|
||||
else {
|
||||
// Redacted
|
||||
if (answerContent && strlen( answerContent ))
|
||||
question->content = strdup( answerContent );
|
||||
question->content = mpw_strdup( answerContent );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -885,7 +885,7 @@ const MPMarshalFormat mpw_formatWithName(
|
||||
if (strncmp( mpw_nameForFormat( MPMarshalFormatJSON ), stdFormatName, strlen( stdFormatName ) ) == 0)
|
||||
return MPMarshalFormatJSON;
|
||||
|
||||
dbg( "Not a format name: %s\n", stdFormatName );
|
||||
dbg( "Not a format name: %s", stdFormatName );
|
||||
return (MPMarshalFormat)ERR;
|
||||
}
|
||||
|
||||
@@ -900,7 +900,7 @@ const char *mpw_nameForFormat(
|
||||
case MPMarshalFormatJSON:
|
||||
return "json";
|
||||
default: {
|
||||
dbg( "Unknown format: %d\n", format );
|
||||
dbg( "Unknown format: %d", format );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -917,7 +917,7 @@ const char *mpw_marshal_format_extension(
|
||||
case MPMarshalFormatJSON:
|
||||
return "mpsites.json";
|
||||
default: {
|
||||
dbg( "Unknown format: %d\n", format );
|
||||
dbg( "Unknown format: %d", format );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,9 @@
|
||||
#include "mpw-types.h"
|
||||
#include "mpw-util.h"
|
||||
|
||||
const size_t MPMasterKeySize = 64;
|
||||
const size_t MPSiteKeySize = 256 / 8; // Size of HMAC-SHA-256
|
||||
|
||||
const MPResultType mpw_typeWithName(const char *typeName) {
|
||||
|
||||
// Find what password type is represented by the type letter.
|
||||
@@ -81,7 +84,7 @@ const MPResultType mpw_typeWithName(const char *typeName) {
|
||||
if (strncmp( mpw_nameForType( MPResultTypeDeriveKey ), stdTypeName, strlen( stdTypeName ) ) == 0)
|
||||
return MPResultTypeDeriveKey;
|
||||
|
||||
dbg( "Not a generated type name: %s\n", stdTypeName );
|
||||
dbg( "Not a generated type name: %s", stdTypeName );
|
||||
return (MPResultType)ERR;
|
||||
}
|
||||
|
||||
@@ -111,7 +114,7 @@ const char *mpw_nameForType(MPResultType resultType) {
|
||||
case MPResultTypeDeriveKey:
|
||||
return "key";
|
||||
default: {
|
||||
dbg( "Unknown password type: %d\n", resultType );
|
||||
dbg( "Unknown password type: %d", resultType );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -120,7 +123,7 @@ const char *mpw_nameForType(MPResultType resultType) {
|
||||
const char **mpw_templatesForType(MPResultType type, size_t *count) {
|
||||
|
||||
if (!(type & MPResultTypeClassTemplate)) {
|
||||
dbg( "Not a generated type: %d\n", type );
|
||||
dbg( "Not a generated type: %d", type );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -156,7 +159,7 @@ const char **mpw_templatesForType(MPResultType type, size_t *count) {
|
||||
return mpw_alloc_array( count, const char *,
|
||||
"cvcc cvc cvccvcv cvc", "cvc cvccvcvcv cvcv", "cv cvccv cvc cvcvccv" );
|
||||
default: {
|
||||
dbg( "Unknown generated type: %d\n", type );
|
||||
dbg( "Unknown generated type: %d", type );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -188,7 +191,7 @@ const MPKeyPurpose mpw_purposeWithName(const char *purposeName) {
|
||||
if (strncmp( mpw_nameForPurpose( MPKeyPurposeRecovery ), stdPurposeName, strlen( stdPurposeName ) ) == 0)
|
||||
return MPKeyPurposeRecovery;
|
||||
|
||||
dbg( "Not a purpose name: %s\n", stdPurposeName );
|
||||
dbg( "Not a purpose name: %s", stdPurposeName );
|
||||
return (MPKeyPurpose)ERR;
|
||||
}
|
||||
|
||||
@@ -202,7 +205,7 @@ const char *mpw_nameForPurpose(MPKeyPurpose purpose) {
|
||||
case MPKeyPurposeRecovery:
|
||||
return "recovery";
|
||||
default: {
|
||||
dbg( "Unknown purpose: %d\n", purpose );
|
||||
dbg( "Unknown purpose: %d", purpose );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -218,7 +221,7 @@ const char *mpw_scopeForPurpose(MPKeyPurpose purpose) {
|
||||
case MPKeyPurposeRecovery:
|
||||
return "com.lyndir.masterpassword.answer";
|
||||
default: {
|
||||
dbg( "Unknown purpose: %d\n", purpose );
|
||||
dbg( "Unknown purpose: %d", purpose );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
@@ -248,7 +251,7 @@ const char *mpw_charactersInClass(char characterClass) {
|
||||
case ' ':
|
||||
return " ";
|
||||
default: {
|
||||
dbg( "Unknown character class: %c\n", characterClass );
|
||||
dbg( "Unknown character class: %c", characterClass );
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,10 +35,8 @@
|
||||
|
||||
//// Types.
|
||||
|
||||
#define MPMasterKeySize 64 /* bytes */
|
||||
typedef const uint8_t *MPMasterKey;
|
||||
#define MPSiteKeySize (256 / 8) /* bytes */ // Size of HMAC-SHA-256
|
||||
typedef const uint8_t *MPSiteKey;
|
||||
extern const size_t MPMasterKeySize, MPSiteKeySize; /* bytes */
|
||||
typedef const uint8_t *MPMasterKey, *MPSiteKey;
|
||||
typedef const char *MPKeyID;
|
||||
|
||||
typedef mpw_enum( uint8_t, MPKeyPurpose ) {
|
||||
@@ -72,30 +70,30 @@ typedef mpw_enum( uint16_t, MPSiteFeature ) {
|
||||
|
||||
// bit 0-3 | MPResultTypeClass | MPSiteFeature
|
||||
typedef mpw_enum( uint32_t, MPResultType ) {
|
||||
/** pg^VMAUBk5x3p%HP%i4= */
|
||||
/** 16: pg^VMAUBk5x3p%HP%i4= */
|
||||
MPResultTypeTemplateMaximum = 0x0 | MPResultTypeClassTemplate | 0x0,
|
||||
/** BiroYena8:Kixa */
|
||||
/** 17: BiroYena8:Kixa */
|
||||
MPResultTypeTemplateLong = 0x1 | MPResultTypeClassTemplate | 0x0,
|
||||
/** BirSuj0- */
|
||||
/** 18: BirSuj0- */
|
||||
MPResultTypeTemplateMedium = 0x2 | MPResultTypeClassTemplate | 0x0,
|
||||
/** pO98MoD0 */
|
||||
MPResultTypeTemplateBasic = 0x4 | MPResultTypeClassTemplate | 0x0,
|
||||
/** Bir8 */
|
||||
/** 19: Bir8 */
|
||||
MPResultTypeTemplateShort = 0x3 | MPResultTypeClassTemplate | 0x0,
|
||||
/** 2798 */
|
||||
/** 20: pO98MoD0 */
|
||||
MPResultTypeTemplateBasic = 0x4 | MPResultTypeClassTemplate | 0x0,
|
||||
/** 21: 2798 */
|
||||
MPResultTypeTemplatePIN = 0x5 | MPResultTypeClassTemplate | 0x0,
|
||||
/** birsujano */
|
||||
/** 30: birsujano */
|
||||
MPResultTypeTemplateName = 0xE | MPResultTypeClassTemplate | 0x0,
|
||||
/** bir yennoquce fefi */
|
||||
/** 31: bir yennoquce fefi */
|
||||
MPResultTypeTemplatePhrase = 0xF | MPResultTypeClassTemplate | 0x0,
|
||||
|
||||
/** Custom saved password. */
|
||||
MPResultTypeStatefulPersonal = 0x0 | MPResultTypeClassStateful | MPSiteFeatureExportContent,
|
||||
/** Custom saved password that should not be exported from the device. */
|
||||
MPResultTypeStatefulDevice = 0x1 | MPResultTypeClassStateful | MPSiteFeatureDevicePrivate,
|
||||
/** 1056: Custom saved password. */
|
||||
MPResultTypeStatefulPersonal = 0x0 | MPResultTypeClassStateful | MPSiteFeatureExportContent,
|
||||
/** 2081: Custom saved password that should not be exported from the device. */
|
||||
MPResultTypeStatefulDevice = 0x1 | MPResultTypeClassStateful | MPSiteFeatureDevicePrivate,
|
||||
|
||||
/** Derive a unique binary key. */
|
||||
MPResultTypeDeriveKey = 0x0 | MPResultTypeClassDerive | MPSiteFeatureAlternative,
|
||||
/** 4160: Derive a unique binary key. */
|
||||
MPResultTypeDeriveKey = 0x0 | MPResultTypeClassDerive | MPSiteFeatureAlternative,
|
||||
|
||||
MPResultTypeDefault = MPResultTypeTemplateLong,
|
||||
};
|
||||
@@ -111,6 +109,28 @@ typedef mpw_enum ( uint32_t, MPCounterValue ) {
|
||||
MPCounterValueLast = UINT32_MAX,
|
||||
};
|
||||
|
||||
/** These colours are compatible with the original ANSI SGR. */
|
||||
typedef mpw_enum( uint8_t, MPIdenticonColor ) {
|
||||
MPIdenticonColorRed = 1,
|
||||
MPIdenticonColorGreen,
|
||||
MPIdenticonColorYellow,
|
||||
MPIdenticonColorBlue,
|
||||
MPIdenticonColorMagenta,
|
||||
MPIdenticonColorCyan,
|
||||
MPIdenticonColorWhite,
|
||||
|
||||
MPIdenticonColorFirst = MPIdenticonColorRed,
|
||||
MPIdenticonColorLast = MPIdenticonColorWhite,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
const char *leftArm;
|
||||
const char *body;
|
||||
const char *rightArm;
|
||||
const char *accessory;
|
||||
MPIdenticonColor color;
|
||||
} MPIdenticon;
|
||||
|
||||
//// Type utilities.
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,12 +20,6 @@
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if MPW_COLOR
|
||||
#include <unistd.h>
|
||||
#include <curses.h>
|
||||
#include <term.h>
|
||||
#endif
|
||||
|
||||
#if MPW_CPERCIVA
|
||||
#include <scrypt/crypto_scrypt.h>
|
||||
#include <scrypt/sha256.h>
|
||||
@@ -141,7 +135,7 @@ void mpw_zero(void *buffer, size_t bufferSize) {
|
||||
|
||||
uint8_t *b = buffer;
|
||||
for (; bufferSize > 0; --bufferSize)
|
||||
*b++ = 0;
|
||||
*b++ = 0;
|
||||
}
|
||||
|
||||
bool __mpw_free(void **buffer, const size_t bufferSize) {
|
||||
@@ -274,9 +268,10 @@ uint8_t const *mpw_hash_hmac_sha256(const uint8_t *key, const size_t keySize, co
|
||||
return mac;
|
||||
}
|
||||
|
||||
// We do our best to not fail on odd buf's, eg. non-padded cipher texts.
|
||||
static uint8_t const *mpw_aes(bool encrypt, const uint8_t *key, const size_t keySize, const uint8_t *buf, size_t *bufSize) {
|
||||
|
||||
if (!key || keySize < 16)
|
||||
if (!key || keySize < 16 || !*bufSize)
|
||||
return NULL;
|
||||
|
||||
// IV = zero
|
||||
@@ -284,9 +279,9 @@ static uint8_t const *mpw_aes(bool encrypt, const uint8_t *key, const size_t key
|
||||
mpw_zero( iv, sizeof iv );
|
||||
|
||||
// Add PKCS#7 padding
|
||||
uint32_t aesSize = (uint32_t)*bufSize;
|
||||
if (encrypt)
|
||||
aesSize = (aesSize / 16) * 16 + 16;
|
||||
uint32_t aesSize = ((uint32_t)*bufSize + 15 / 16) * 16; // round up to block size.
|
||||
if (encrypt && !(*bufSize % 16)) // add pad block if plain text fits block size.
|
||||
encrypt += 16;
|
||||
uint8_t aesBuf[aesSize];
|
||||
memcpy( aesBuf, buf, *bufSize );
|
||||
memset( aesBuf + *bufSize, aesSize - *bufSize, aesSize - *bufSize );
|
||||
@@ -302,7 +297,7 @@ static uint8_t const *mpw_aes(bool encrypt, const uint8_t *key, const size_t key
|
||||
// Truncate PKCS#7 padding
|
||||
if (encrypt)
|
||||
*bufSize = aesSize;
|
||||
else
|
||||
else if (*bufSize % 16 == 0 && resultBuf[aesSize - 1] < 16)
|
||||
*bufSize -= resultBuf[aesSize - 1];
|
||||
|
||||
return resultBuf;
|
||||
@@ -343,7 +338,7 @@ const char *mpw_hotp(const uint8_t *key, size_t keySize, uint64_t movingFactor,
|
||||
|
||||
// Render the OTP as `digits` decimal digits.
|
||||
otp %= (int)pow(10, digits);
|
||||
return strdup( mpw_str( "%0*d", digits, otp ) );
|
||||
return mpw_strdup( mpw_str( "%0*d", digits, otp ) );
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -443,99 +438,6 @@ const char *mpw_hex_l(uint32_t number) {
|
||||
return mpw_hex( &buf, sizeof( buf ) );
|
||||
}
|
||||
|
||||
#if MPW_COLOR
|
||||
static char *str_tputs;
|
||||
static int str_tputs_cursor;
|
||||
static const int str_tputs_max = 256;
|
||||
|
||||
static bool mpw_setupterm() {
|
||||
|
||||
if (!isatty( STDERR_FILENO ))
|
||||
return false;
|
||||
|
||||
static bool termsetup;
|
||||
if (!termsetup) {
|
||||
int errret;
|
||||
if (!(termsetup = (setupterm( NULL, STDERR_FILENO, &errret ) == OK))) {
|
||||
wrn( "Terminal doesn't support color (setupterm errret %d).\n", errret );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int mpw_tputc(int c) {
|
||||
|
||||
if (++str_tputs_cursor < str_tputs_max) {
|
||||
str_tputs[str_tputs_cursor] = (char)c;
|
||||
return OK;
|
||||
}
|
||||
|
||||
return ERR;
|
||||
}
|
||||
|
||||
static char *mpw_tputs(const char *str, int affcnt) {
|
||||
|
||||
if (str_tputs)
|
||||
mpw_free( &str_tputs, str_tputs_max );
|
||||
str_tputs = calloc( str_tputs_max, sizeof( char ) );
|
||||
str_tputs_cursor = -1;
|
||||
|
||||
char *result = tputs( str, affcnt, mpw_tputc ) == ERR? NULL: strndup( str_tputs, str_tputs_max );
|
||||
if (str_tputs)
|
||||
mpw_free( &str_tputs, str_tputs_max );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
const char *mpw_identicon(const char *fullName, const char *masterPassword) {
|
||||
|
||||
const char *leftArm[] = { "╔", "╚", "╰", "═" };
|
||||
const char *rightArm[] = { "╗", "╝", "╯", "═" };
|
||||
const char *body[] = { "█", "░", "▒", "▓", "☺", "☻" };
|
||||
const char *accessory[] = {
|
||||
"◈", "◎", "◐", "◑", "◒", "◓", "☀", "☁", "☂", "☃", "☄", "★", "☆", "☎", "☏", "⎈", "⌂", "☘", "☢", "☣",
|
||||
"☕", "⌚", "⌛", "⏰", "⚡", "⛄", "⛅", "☔", "♔", "♕", "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟",
|
||||
"♨", "♩", "♪", "♫", "⚐", "⚑", "⚔", "⚖", "⚙", "⚠", "⌘", "⏎", "✄", "✆", "✈", "✉", "✌"
|
||||
};
|
||||
|
||||
const uint8_t *identiconSeed = mpw_hash_hmac_sha256(
|
||||
(const uint8_t *)masterPassword, strlen( masterPassword ),
|
||||
(const uint8_t *)fullName, strlen( fullName ) );
|
||||
if (!identiconSeed)
|
||||
return NULL;
|
||||
|
||||
char *colorString, *resetString;
|
||||
#ifdef MPW_COLOR
|
||||
if (mpw_setupterm()) {
|
||||
uint8_t colorIdentifier = (uint8_t)(identiconSeed[4] % 7 + 1);
|
||||
colorString = mpw_tputs( tparm( tgetstr( "AF", NULL ), colorIdentifier ), 1 );
|
||||
resetString = mpw_tputs( tgetstr( "me", NULL ), 1 );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
colorString = calloc( 1, sizeof( char ) );
|
||||
resetString = calloc( 1, sizeof( char ) );
|
||||
}
|
||||
|
||||
char *identicon = (char *)calloc( 256, sizeof( char ) );
|
||||
snprintf( identicon, 256, "%s%s%s%s%s%s",
|
||||
colorString,
|
||||
leftArm[identiconSeed[0] % (sizeof( leftArm ) / sizeof( leftArm[0] ))],
|
||||
body[identiconSeed[1] % (sizeof( body ) / sizeof( body[0] ))],
|
||||
rightArm[identiconSeed[2] % (sizeof( rightArm ) / sizeof( rightArm[0] ))],
|
||||
accessory[identiconSeed[3] % (sizeof( accessory ) / sizeof( accessory[0] ))],
|
||||
resetString );
|
||||
|
||||
mpw_free( &identiconSeed, 32 );
|
||||
mpw_free_strings( &colorString, &resetString, NULL );
|
||||
return identicon;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the amount of bytes used by UTF-8 to encode a single character that starts with the given byte.
|
||||
*/
|
||||
@@ -566,3 +468,31 @@ const size_t mpw_utf8_strlen(const char *utf8String) {
|
||||
|
||||
return charlen;
|
||||
}
|
||||
|
||||
char *mpw_strdup(const char *src) {
|
||||
|
||||
if (!src)
|
||||
return NULL;
|
||||
|
||||
size_t len = strlen( src );
|
||||
char *dst = malloc( len + 1 );
|
||||
memcpy( dst, src, len );
|
||||
dst[len] = '\0';
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
char *mpw_strndup(const char *src, size_t max) {
|
||||
|
||||
if (!src)
|
||||
return NULL;
|
||||
|
||||
size_t len = 0;
|
||||
for (; len < max && src[len] != '\0'; ++len);
|
||||
|
||||
char *dst = malloc( len + 1 );
|
||||
memcpy( dst, src, len );
|
||||
dst[len] = '\0';
|
||||
|
||||
return dst;
|
||||
}
|
||||
|
||||
@@ -25,49 +25,44 @@
|
||||
#include "mpw-types.h"
|
||||
|
||||
//// Logging.
|
||||
extern int mpw_verbosity;
|
||||
|
||||
#ifndef mpw_log_do
|
||||
#define mpw_log_do(level, format, ...) \
|
||||
fprintf( stderr, format "\n", ##__VA_ARGS__ )
|
||||
#endif
|
||||
|
||||
#ifndef mpw_log
|
||||
#define mpw_log(level, ...) ({ \
|
||||
if (mpw_verbosity >= level) { \
|
||||
mpw_log_do( level, ##__VA_ARGS__ ); \
|
||||
}; })
|
||||
#endif
|
||||
|
||||
#ifndef trc
|
||||
extern int mpw_verbosity;
|
||||
#define trc_level 3
|
||||
/** Logging internal state. */
|
||||
#define trc(...) ({ \
|
||||
if (mpw_verbosity >= trc_level) \
|
||||
fprintf( stderr, __VA_ARGS__ ); })
|
||||
#endif
|
||||
#ifndef dbg
|
||||
#define dbg_level 2
|
||||
#define trc_level 3
|
||||
#define trc(...) mpw_log( trc_level, ##__VA_ARGS__ )
|
||||
|
||||
/** Logging state and events interesting when investigating issues. */
|
||||
#define dbg(...) ({ \
|
||||
if (mpw_verbosity >= dbg_level) \
|
||||
fprintf( stderr, __VA_ARGS__ ); })
|
||||
#endif
|
||||
#ifndef inf
|
||||
#define inf_level 1
|
||||
#define dbg_level 2
|
||||
#define dbg(...) mpw_log( dbg_level, ##__VA_ARGS__ )
|
||||
|
||||
/** User messages. */
|
||||
#define inf(...) ({ \
|
||||
if (mpw_verbosity >= inf_level) \
|
||||
fprintf( stderr, __VA_ARGS__ ); })
|
||||
#endif
|
||||
#ifndef wrn
|
||||
#define wrn_level 0
|
||||
#define inf_level 1
|
||||
#define inf(...) mpw_log( inf_level, ##__VA_ARGS__ )
|
||||
|
||||
/** Recoverable issues and user suggestions. */
|
||||
#define wrn(...) ({ \
|
||||
if (mpw_verbosity >= wrn_level) \
|
||||
fprintf( stderr, __VA_ARGS__ ); })
|
||||
#endif
|
||||
#ifndef err
|
||||
#define err_level -1
|
||||
#define wrn_level 0
|
||||
#define wrn(...) mpw_log( wrn_level, ##__VA_ARGS__ )
|
||||
|
||||
/** Unrecoverable issues. */
|
||||
#define err(...) ({ \
|
||||
if (mpw_verbosity >= err_level) \
|
||||
fprintf( stderr, __VA_ARGS__ ); })
|
||||
#endif
|
||||
#ifndef ftl
|
||||
#define ftl_level -2
|
||||
#define err_level -1
|
||||
#define err(...) mpw_log( err_level, ##__VA_ARGS__ )
|
||||
|
||||
/** Issues that lead to abortion. */
|
||||
#define ftl(...) ({ \
|
||||
if (mpw_verbosity >= ftl_level) \
|
||||
fprintf( stderr, __VA_ARGS__ ); })
|
||||
#define ftl_level -2
|
||||
#define ftl(...) mpw_log( ftl_level, ##__VA_ARGS__ )
|
||||
#endif
|
||||
|
||||
#ifndef min
|
||||
@@ -203,13 +198,14 @@ MPKeyID mpw_id_buf(const void *buf, size_t length);
|
||||
/** Compare two fingerprints for equality.
|
||||
* @return true if the buffers represent identical fingerprints. */
|
||||
bool mpw_id_buf_equals(const char *id1, const char *id2);
|
||||
/** Encode a visual fingerprint for a user.
|
||||
* @return A newly allocated string. */
|
||||
const char *mpw_identicon(const char *fullName, const char *masterPassword);
|
||||
|
||||
//// String utilities.
|
||||
|
||||
/** @return The amount of display characters in the given UTF-8 string. */
|
||||
const size_t mpw_utf8_strlen(const char *utf8String);
|
||||
/** Drop-in for POSIX strdup(3). */
|
||||
char *mpw_strdup(const char *src);
|
||||
/** Drop-in for POSIX strndup(3). */
|
||||
char *mpw_strndup(const char *src, size_t max);
|
||||
|
||||
#endif // _MPW_UTIL_H
|
||||
|
||||
@@ -20,6 +20,7 @@ package com.lyndir.masterpassword;
|
||||
|
||||
import static org.testng.Assert.*;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import com.lyndir.lhunath.opal.system.CodeUtils;
|
||||
import com.lyndir.lhunath.opal.system.logging.Logger;
|
||||
import java.util.Random;
|
||||
@@ -108,23 +109,37 @@ public class MPMasterKeyTest {
|
||||
char[] masterPassword = testCase.getMasterPassword().toCharArray();
|
||||
MPMasterKey masterKey = new MPMasterKey( testCase.getFullName(), masterPassword );
|
||||
|
||||
Random random = new Random();
|
||||
StringBuilder password = new StringBuilder();
|
||||
for (int p = 0; p < 8; ++p)
|
||||
password.append( (char) (random.nextInt( Character.MAX_CODE_POINT - Character.MIN_CODE_POINT ) + Character.MIN_CODE_POINT) );
|
||||
|
||||
String password = randomString( 8 );
|
||||
for (final MPMasterKey.Version version : MPMasterKey.Version.values()) {
|
||||
MPResultType resultType = MPResultType.StoredPersonal;
|
||||
|
||||
// Test site state
|
||||
String state = masterKey.siteState( testCase.getSiteName(), testCase.getSiteCounter(), testCase.getKeyPurpose(),
|
||||
testCase.getKeyContext(), resultType, password.toString(), version );
|
||||
testCase.getKeyContext(), resultType, password, version );
|
||||
String result = masterKey.siteResult( testCase.getSiteName(), testCase.getSiteCounter(), testCase.getKeyPurpose(),
|
||||
testCase.getKeyContext(), resultType, state, version );
|
||||
|
||||
assertEquals(
|
||||
masterKey.siteResult( testCase.getSiteName(), testCase.getSiteCounter(), testCase.getKeyPurpose(),
|
||||
testCase.getKeyContext(), resultType, state, version ),
|
||||
password.toString(),
|
||||
result,
|
||||
password,
|
||||
"[testSiteState] state mismatch: " + testCase );
|
||||
}
|
||||
}
|
||||
|
||||
public static String randomString(int length) {
|
||||
Random random = new Random();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
while (length > 0) {
|
||||
int codePoint = random.nextInt( Character.MAX_CODE_POINT - Character.MIN_CODE_POINT ) + Character.MIN_CODE_POINT;
|
||||
if (!Character.isDefined( codePoint ) || (Character.getType( codePoint ) == Character.PRIVATE_USE) || Character.isSurrogate(
|
||||
(char) codePoint ))
|
||||
continue;
|
||||
|
||||
builder.appendCodePoint( codePoint );
|
||||
length--;
|
||||
}
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
2
platform-darwin/External/Pearl
vendored
@@ -20,7 +20,6 @@
|
||||
93D39359B0DF9823F6C56A05 /* PearlHangDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39D8508BF868907E9732E /* PearlHangDetector.h */; };
|
||||
93D39392DEDA376F93C6C718 /* MPCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39BAA71DE51B4D8A1286C /* MPCell.m */; };
|
||||
93D3939661CE37180AF7CD6A /* MPStoreViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3957D76F71A652716EECC /* MPStoreViewController.m */; };
|
||||
93D393AA69A1193401160418 /* UIView+AlphaScale.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39488AB33616661725929 /* UIView+AlphaScale.m */; };
|
||||
93D393DB5325820241BA90A7 /* PearlSizedTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39A4759186F6D2D34AA6B /* PearlSizedTextView.h */; };
|
||||
93D3942C1B117EE4851AA7B6 /* UIView+Visible.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3952910EDB8E0EBC94BA9 /* UIView+Visible.m */; };
|
||||
93D394982CBD25D46692DD7C /* MPWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */; };
|
||||
@@ -32,7 +31,6 @@
|
||||
93D3954FCE045A3CC7E804B7 /* MPUsersViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D399E571F61E50A9BF8FAF /* MPUsersViewController.m */; };
|
||||
93D3957237D303DE2D38C267 /* MPAvatarCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39B381350802A194BF332 /* MPAvatarCell.m */; };
|
||||
93D39577FD8BB0945DB2F0A3 /* MPAlgorithmV3.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39FD9623E8D5571C0AEB3 /* MPAlgorithmV3.m */; };
|
||||
93D3959696396A91961C6148 /* UIView+AlphaScale.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D392D76C091DEA3319F11D /* UIView+AlphaScale.h */; };
|
||||
93D395B715D15F2B56F2A2EE /* mpw-types.c in Sources */ = {isa = PBXBuildFile; fileRef = 93D392C5A6572DB0EB5B82C8 /* mpw-types.c */; };
|
||||
93D395F08A087F8A24689347 /* NSArray+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */; };
|
||||
93D39673DDC085BE72C34D7C /* MPPopdownSegue.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39B050DD5F55E9794EFD4 /* MPPopdownSegue.m */; };
|
||||
@@ -40,9 +38,7 @@
|
||||
93D396BA1C74C4A06FD86437 /* PearlOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D3942A356B639724157982 /* PearlOverlay.h */; };
|
||||
93D396D8B67DA6522CDBA142 /* MPCoachmarkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3995B1D4DCE5A30D882BA /* MPCoachmarkViewController.m */; };
|
||||
93D397952F5635C793C24DF1 /* NSError+PearlFullDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39F9106F2CCFB94283188 /* NSError+PearlFullDescription.m */; };
|
||||
93D397FCAAC6FA885247A4F9 /* PearlLinks.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39FEFC296AF6E7DF8E468 /* PearlLinks.m */; };
|
||||
93D3980046016EFD05B35BC5 /* PearlUICollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D39B1D8177A86C5B9EDDE3 /* PearlUICollectionView.h */; };
|
||||
93D39861AEE621B287EA93E9 /* PearlLinks.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D399C408B705172FA0FA02 /* PearlLinks.h */; };
|
||||
93D398ECD7D1A0DEDDADF516 /* MPEmergencyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39ACBA9F4878B6A1CC33B /* MPEmergencyViewController.m */; };
|
||||
93D399246DC90F50913A1287 /* UIResponder+PearlFirstResponder.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A1DDFA09AE2E14D26DC /* UIResponder+PearlFirstResponder.m */; };
|
||||
93D3992FA1546E01F498F665 /* PearlNavigationController.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D398567FD02DB2647B8CF3 /* PearlNavigationController.h */; };
|
||||
@@ -134,8 +130,6 @@
|
||||
DA2C3D651BD9612F001137B3 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = DA2C3D641BD9612F001137B3 /* libz.tbd */; };
|
||||
DA2CA4DD18D28859007798F8 /* NSArray+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */; };
|
||||
DA2CA4DE18D28859007798F8 /* NSArray+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4DA18D28859007798F8 /* NSArray+Pearl.h */; };
|
||||
DA2CA4DF18D28859007798F8 /* NSTimer+PearlBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */; };
|
||||
DA2CA4E018D28859007798F8 /* NSTimer+PearlBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4DC18D28859007798F8 /* NSTimer+PearlBlock.h */; };
|
||||
DA2CA4E418D28866007798F8 /* NSLayoutConstraint+PearlUIKit.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4E218D28866007798F8 /* NSLayoutConstraint+PearlUIKit.h */; };
|
||||
DA2CA4E618D2AC10007798F8 /* NSLayoutConstraint+PearlUIKit.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4E518D2AC10007798F8 /* NSLayoutConstraint+PearlUIKit.m */; };
|
||||
DA30E9D015722ECA00A68B4C /* Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA30E9CD15722ECA00A68B4C /* Pearl.m */; };
|
||||
@@ -165,7 +159,6 @@
|
||||
DA32D07C19D7D784004F3F0E /* background.png in Resources */ = {isa = PBXBuildFile; fileRef = DA32D07919D7D784004F3F0E /* background.png */; };
|
||||
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3509FC15F101A500C14A8E /* PearlQueue.h */; };
|
||||
DA3509FF15F101A500C14A8E /* PearlQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3509FD15F101A500C14A8E /* PearlQueue.m */; };
|
||||
DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */; };
|
||||
DA3BCFCB19BD09D5006B2681 /* SourceCodePro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA3BCFCA19BD09D5006B2681 /* SourceCodePro-Regular.otf */; };
|
||||
DA4522441902355C008F650A /* icon_book.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD370C1711E29500CF925C /* icon_book.png */; };
|
||||
DA4522451902355C008F650A /* icon_book@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD370D1711E29500CF925C /* icon_book@2x.png */; };
|
||||
@@ -175,7 +168,6 @@
|
||||
DA45224A190628A1008F650A /* icon_wrench@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD386B1711E29700CF925C /* icon_wrench@2x.png */; };
|
||||
DA45224B190628B2008F650A /* icon_gear.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37821711E29500CF925C /* icon_gear.png */; };
|
||||
DA45224C190628B2008F650A /* icon_gear@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD37831711E29500CF925C /* icon_gear@2x.png */; };
|
||||
DA45711D1F572F1E00D54152 /* PearlCryptUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DA45711B1F572F1E00D54152 /* PearlCryptUtils.m */; };
|
||||
DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC6326C148680650075AEA5 /* libjrswizzle.a */; };
|
||||
DA4DA1DA1564471F00F6F596 /* libuicolor-utilities.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC6325D1486805C0075AEA5 /* libuicolor-utilities.a */; };
|
||||
DA5A09DF171A70E4005284AB /* play.png in Resources */ = {isa = PBXBuildFile; fileRef = DA5A09DD171A70E4005284AB /* play.png */; };
|
||||
@@ -212,7 +204,6 @@
|
||||
DA92614E1BE1A57500369DE5 /* MPAppDelegate_InApp.m in Sources */ = {isa = PBXBuildFile; fileRef = DA92614D1BE1A57500369DE5 /* MPAppDelegate_InApp.m */; };
|
||||
DA945C8717E3F3FD0053236B /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DA945C8617E3F3FD0053236B /* Images.xcassets */; };
|
||||
DA95B50C1C476B6A0067F5EF /* LocalAuthentication.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA95B50B1C476B6A0067F5EF /* LocalAuthentication.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
|
||||
DA95B50F1C4776F00067F5EF /* NSMutableSet+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA95B50E1C4776F00067F5EF /* NSMutableSet+Pearl.m */; };
|
||||
DA95D5F214DF0B2C008D1B94 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA95D5F014DF0B1E008D1B94 /* MessageUI.framework */; };
|
||||
DAA141201922FF020032B392 /* PearlTween.m in Sources */ = {isa = PBXBuildFile; fileRef = DAA1411C1922FF020032B392 /* PearlTween.m */; };
|
||||
DAA141211922FF020032B392 /* PearlTween.h in Headers */ = {isa = PBXBuildFile; fileRef = DAA1411D1922FF020032B392 /* PearlTween.h */; };
|
||||
@@ -252,8 +243,22 @@
|
||||
DAA449D21EEC4B5800E7BDD5 /* mpw-marshal.c in Sources */ = {isa = PBXBuildFile; fileRef = DAA449D01EEC4B5800E7BDD5 /* mpw-marshal.c */; };
|
||||
DAADBFE01A68763B00F7A756 /* mpw-algorithm.c in Sources */ = {isa = PBXBuildFile; fileRef = 93D3969393A3A46BD27D7078 /* mpw-algorithm.c */; };
|
||||
DAB07C9D1F7725C500CC6D43 /* aes.c in Sources */ = {isa = PBXBuildFile; fileRef = DAB07C9B1F7725C500CC6D43 /* aes.c */; };
|
||||
DAB4FBC4202FDDDD002768FB /* NSInvocation+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB4FBC2202FDDDC002768FB /* NSInvocation+Pearl.h */; };
|
||||
DAB4FBC5202FDDDD002768FB /* NSInvocation+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB4FBC3202FDDDD002768FB /* NSInvocation+Pearl.m */; };
|
||||
DAB4FBC6202FDDEC002768FB /* NSMutableSet+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA95B50D1C4776F00067F5EF /* NSMutableSet+Pearl.h */; };
|
||||
DAB4FBC7202FDDEF002768FB /* NSMutableSet+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA95B50E1C4776F00067F5EF /* NSMutableSet+Pearl.m */; };
|
||||
DAB4FBC8202FDDF3002768FB /* NSNotificationCenter+PearlEasyCleanup.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D391AA32F24290C424438E /* NSNotificationCenter+PearlEasyCleanup.h */; };
|
||||
DAB4FBC9202FDE0F002768FB /* PearlCryptUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA45711C1F572F1E00D54152 /* PearlCryptUtils.h */; };
|
||||
DAB4FBCA202FDE13002768FB /* PearlCryptUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DA45711B1F572F1E00D54152 /* PearlCryptUtils.m */; };
|
||||
DAB4FBD3202FDE48002768FB /* PearlLinks.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB4FBCB202FDE47002768FB /* PearlLinks.m */; };
|
||||
DAB4FBD4202FDE48002768FB /* UIView+PearlLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB4FBCC202FDE47002768FB /* UIView+PearlLayout.h */; };
|
||||
DAB4FBD5202FDE48002768FB /* UIView+PearlSize.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB4FBCD202FDE47002768FB /* UIView+PearlSize.h */; };
|
||||
DAB4FBD6202FDE48002768FB /* PearlLinks.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB4FBCE202FDE47002768FB /* PearlLinks.h */; };
|
||||
DAB4FBD7202FDE48002768FB /* UIView+PearlLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB4FBCF202FDE47002768FB /* UIView+PearlLayout.m */; };
|
||||
DAB4FBD8202FDE48002768FB /* WTFViews.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB4FBD0202FDE47002768FB /* WTFViews.h */; };
|
||||
DAB4FBD9202FDE48002768FB /* UIView+PearlSize.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB4FBD1202FDE48002768FB /* UIView+PearlSize.m */; };
|
||||
DAB4FBDA202FDE48002768FB /* WTFViews.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB4FBD2202FDE48002768FB /* WTFViews.m */; };
|
||||
DAB7AE5D1F3D752900C856B1 /* libjson-c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAB7AE5C1F3D752900C856B1 /* libjson-c.a */; };
|
||||
DAB7AE771F3D755B00C856B1 /* libjson-c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAB7AE761F3D755B00C856B1 /* libjson-c.a */; };
|
||||
DAB7AE991F3DDEE000C856B1 /* mpw-marshal-util.c in Sources */ = {isa = PBXBuildFile; fileRef = DAB7AE981F3DDEE000C856B1 /* mpw-marshal-util.c */; };
|
||||
DABB981615100B4000B05417 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DABB981515100B4000B05417 /* SystemConfiguration.framework */; };
|
||||
DABD39371711E29700CF925C /* avatar-0.png in Resources */ = {isa = PBXBuildFile; fileRef = DABD366C1711E29400CF925C /* avatar-0.png */; };
|
||||
@@ -504,7 +509,6 @@
|
||||
93D3924EE15017F8A12CB436 /* MPSitesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSitesViewController.m; sourceTree = "<group>"; };
|
||||
93D392876BE5C011DE73B43F /* MPPopdownSegue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPopdownSegue.h; sourceTree = "<group>"; };
|
||||
93D392C5A6572DB0EB5B82C8 /* mpw-types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-types.c"; sourceTree = "<group>"; };
|
||||
93D392D76C091DEA3319F11D /* UIView+AlphaScale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+AlphaScale.h"; sourceTree = "<group>"; };
|
||||
93D393310223DDB35218467A /* MPCombinedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPCombinedViewController.m; sourceTree = "<group>"; };
|
||||
93D393B97158D7BE9332EA53 /* NSDictionary+Indexing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Indexing.h"; sourceTree = "<group>"; };
|
||||
93D393BB973253D4BAAC84AA /* PearlEMail.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlEMail.m; sourceTree = "<group>"; };
|
||||
@@ -512,7 +516,6 @@
|
||||
93D394077F8FAB8167647187 /* Twitter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Twitter.framework; path = System/Library/Frameworks/Twitter.framework; sourceTree = SDKROOT; };
|
||||
93D3942A356B639724157982 /* PearlOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlOverlay.h; sourceTree = "<group>"; };
|
||||
93D394482BB07F90E8FD1314 /* UIResponder+PearlFirstResponder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIResponder+PearlFirstResponder.h"; sourceTree = "<group>"; };
|
||||
93D39488AB33616661725929 /* UIView+AlphaScale.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+AlphaScale.m"; sourceTree = "<group>"; };
|
||||
93D394D73F5BC92297CE8D7B /* MPAlgorithmV3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAlgorithmV3.h; sourceTree = "<group>"; };
|
||||
93D395105935859D71679931 /* MPOverlayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayViewController.m; sourceTree = "<group>"; };
|
||||
93D3952910EDB8E0EBC94BA9 /* UIView+Visible.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+Visible.m"; sourceTree = "<group>"; };
|
||||
@@ -540,7 +543,6 @@
|
||||
93D399A8E3181B442D347CD7 /* MPAlgorithmV2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAlgorithmV2.m; sourceTree = "<group>"; };
|
||||
93D399B36CDB2004D7C51391 /* MPMessageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPMessageViewController.m; sourceTree = "<group>"; };
|
||||
93D399C2F3D48E57C4803BDC /* NSPersistentStore+PearlMigration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSPersistentStore+PearlMigration.m"; sourceTree = "<group>"; };
|
||||
93D399C408B705172FA0FA02 /* PearlLinks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlLinks.h; 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>"; };
|
||||
93D39A1DDFA09AE2E14D26DC /* UIResponder+PearlFirstResponder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIResponder+PearlFirstResponder.m"; sourceTree = "<group>"; };
|
||||
@@ -582,7 +584,6 @@
|
||||
93D39F9106F2CCFB94283188 /* NSError+PearlFullDescription.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+PearlFullDescription.m"; sourceTree = "<group>"; };
|
||||
93D39FBF8FCEB4C106272334 /* NSOrderedSetOrArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSOrderedSetOrArray.h; sourceTree = "<group>"; };
|
||||
93D39FD9623E8D5571C0AEB3 /* MPAlgorithmV3.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAlgorithmV3.m; sourceTree = "<group>"; };
|
||||
93D39FEFC296AF6E7DF8E468 /* PearlLinks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlLinks.m; sourceTree = "<group>"; };
|
||||
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>"; };
|
||||
DA071BF2190187FE00179766 /* empty.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = empty.png; sourceTree = "<group>"; };
|
||||
@@ -762,8 +763,6 @@
|
||||
DA2C3D641BD9612F001137B3 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
|
||||
DA2CA4D918D28859007798F8 /* NSArray+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Pearl.m"; sourceTree = "<group>"; };
|
||||
DA2CA4DA18D28859007798F8 /* NSArray+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Pearl.h"; sourceTree = "<group>"; };
|
||||
DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+PearlBlock.m"; sourceTree = "<group>"; };
|
||||
DA2CA4DC18D28859007798F8 /* NSTimer+PearlBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTimer+PearlBlock.h"; sourceTree = "<group>"; };
|
||||
DA2CA4E218D28866007798F8 /* NSLayoutConstraint+PearlUIKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSLayoutConstraint+PearlUIKit.h"; sourceTree = "<group>"; };
|
||||
DA2CA4E518D2AC10007798F8 /* NSLayoutConstraint+PearlUIKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSLayoutConstraint+PearlUIKit.m"; sourceTree = "<group>"; };
|
||||
DA30E9CD15722ECA00A68B4C /* Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Pearl.m; sourceTree = "<group>"; };
|
||||
@@ -790,7 +789,6 @@
|
||||
DA32D07919D7D784004F3F0E /* background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = background.png; path = ios/launch/background.png; sourceTree = "<group>"; };
|
||||
DA3509FC15F101A500C14A8E /* PearlQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlQueue.h; sourceTree = "<group>"; };
|
||||
DA3509FD15F101A500C14A8E /* PearlQueue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlQueue.m; sourceTree = "<group>"; };
|
||||
DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = "<group>"; };
|
||||
DA3B844D190FC5DF00246EEA /* Crashlytics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Crashlytics.framework; path = ../../../External/iOS/Crashlytics.framework; sourceTree = "<group>"; };
|
||||
DA3BCFCA19BD09D5006B2681 /* SourceCodePro-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceCodePro-Regular.otf"; sourceTree = "<group>"; };
|
||||
DA45711B1F572F1E00D54152 /* PearlCryptUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlCryptUtils.m; sourceTree = "<group>"; };
|
||||
@@ -876,6 +874,17 @@
|
||||
DAAC35DD156BD77D00C5FD93 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };
|
||||
DAB07C9B1F7725C500CC6D43 /* aes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aes.c; sourceTree = "<group>"; };
|
||||
DAB07C9C1F7725C500CC6D43 /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = "<group>"; };
|
||||
DAB4FBC2202FDDDC002768FB /* NSInvocation+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSInvocation+Pearl.h"; sourceTree = "<group>"; };
|
||||
DAB4FBC3202FDDDD002768FB /* NSInvocation+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSInvocation+Pearl.m"; sourceTree = "<group>"; };
|
||||
DAB4FBCB202FDE47002768FB /* PearlLinks.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlLinks.m; sourceTree = "<group>"; };
|
||||
DAB4FBCC202FDE47002768FB /* UIView+PearlLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+PearlLayout.h"; sourceTree = "<group>"; };
|
||||
DAB4FBCD202FDE47002768FB /* UIView+PearlSize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+PearlSize.h"; sourceTree = "<group>"; };
|
||||
DAB4FBCE202FDE47002768FB /* PearlLinks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlLinks.h; sourceTree = "<group>"; };
|
||||
DAB4FBCF202FDE47002768FB /* UIView+PearlLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+PearlLayout.m"; sourceTree = "<group>"; };
|
||||
DAB4FBD0202FDE47002768FB /* WTFViews.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WTFViews.h; sourceTree = "<group>"; };
|
||||
DAB4FBD1202FDE48002768FB /* UIView+PearlSize.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+PearlSize.m"; sourceTree = "<group>"; };
|
||||
DAB4FBD2202FDE48002768FB /* WTFViews.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WTFViews.m; sourceTree = "<group>"; };
|
||||
DAB4FBDB202FDE5E002768FB /* Pearl-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Pearl-Prefix.pch"; sourceTree = "<group>"; };
|
||||
DAB7AE5C1F3D752900C856B1 /* libjson-c.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libjson-c.a"; path = "External/libjson-c/libjson-c-ios/lib/libjson-c.a"; sourceTree = "<group>"; };
|
||||
DAB7AE611F3D755B00C856B1 /* arraylist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arraylist.h; sourceTree = "<group>"; };
|
||||
DAB7AE621F3D755B00C856B1 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bits.h; sourceTree = "<group>"; };
|
||||
@@ -1513,7 +1522,7 @@
|
||||
DABD38C11711E29700CF925C /* tip_location_teal@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tip_location_teal@2x.png"; sourceTree = "<group>"; };
|
||||
DABD38C21711E29700CF925C /* tip_location_wood.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tip_location_wood.png; sourceTree = "<group>"; };
|
||||
DABD38C31711E29700CF925C /* tip_location_wood@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "tip_location_wood@2x.png"; sourceTree = "<group>"; };
|
||||
DABD38C81711E29700CF925C /* jquery-1.6.1.min.js */ = {isa = PBXFileReference; fileEncoding = 1; lastKnownFileType = sourcecode.javascript; path = "jquery-1.6.1.min.js"; sourceTree = "<group>"; };
|
||||
DABD38C81711E29700CF925C /* jquery-1.6.1.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "jquery-1.6.1.min.js"; sourceTree = "<group>"; };
|
||||
DABD38C91711E29700CF925C /* keypad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = keypad.png; sourceTree = "<group>"; };
|
||||
DABD38CA1711E29700CF925C /* logo-bare.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "logo-bare.png"; sourceTree = "<group>"; };
|
||||
DABD38CB1711E29700CF925C /* menu-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menu-icon.png"; sourceTree = "<group>"; };
|
||||
@@ -1564,7 +1573,6 @@
|
||||
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; };
|
||||
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 = "../../Source/Pearl/Pearl-Prefix.pch"; sourceTree = "<group>"; };
|
||||
DACA29721705E1A8002C6C22 /* dictionary.lst */ = {isa = PBXFileReference; fileEncoding = 1; lastKnownFileType = text; path = dictionary.lst; 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>"; };
|
||||
@@ -1681,7 +1689,6 @@
|
||||
DA95B50C1C476B6A0067F5EF /* LocalAuthentication.framework in Frameworks */,
|
||||
DA2C3D651BD9612F001137B3 /* libz.tbd in Frameworks */,
|
||||
DA2C3D631BD96126001137B3 /* libc++.tbd in Frameworks */,
|
||||
DAB7AE771F3D755B00C856B1 /* libjson-c.a in Frameworks */,
|
||||
DAA1761B19D86D0D0044227B /* libAttributedMarkdown.a in Frameworks */,
|
||||
DA0CC5421EB57BD4009A8ED9 /* Crashlytics.framework in Frameworks */,
|
||||
DA32D03E19D11293004F3F0E /* libKCOrderedAccessorFix.a in Frameworks */,
|
||||
@@ -2996,7 +3003,6 @@
|
||||
93D39F556F2F142740A65E59 /* MPWebViewController.h */,
|
||||
93D3990E0CD1B5CF9FBB2C07 /* MPWebViewController.m */,
|
||||
DABD3BF91711E2DC00CF925C /* Settings.bundle */,
|
||||
DA38D6A218CCB5BF009AEB3E /* Storyboard.storyboard */,
|
||||
);
|
||||
path = iOS;
|
||||
sourceTree = "<group>";
|
||||
@@ -3007,7 +3013,7 @@
|
||||
DAFE45D715039823003ABA7C /* Pearl */,
|
||||
DAFE45FC15039823003ABA7C /* Pearl-Crypto */,
|
||||
DAFE460715039823003ABA7C /* Pearl-UIKit */,
|
||||
DAC77CB1148291A600BCF976 /* Pearl-Prefix.pch */,
|
||||
DAB4FBDB202FDE5E002768FB /* Pearl-Prefix.pch */,
|
||||
);
|
||||
path = Pearl;
|
||||
sourceTree = "<group>";
|
||||
@@ -3093,6 +3099,8 @@
|
||||
93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */,
|
||||
93D398C95847261903D781D3 /* NSError+PearlFullDescription.h */,
|
||||
93D39F9106F2CCFB94283188 /* NSError+PearlFullDescription.m */,
|
||||
DAB4FBC2202FDDDC002768FB /* NSInvocation+Pearl.h */,
|
||||
DAB4FBC3202FDDDD002768FB /* NSInvocation+Pearl.m */,
|
||||
DAF4EF4F190A81E400023C90 /* NSManagedObject+Pearl.h */,
|
||||
DAF4EF4E190A81E400023C90 /* NSManagedObject+Pearl.m */,
|
||||
DA95B50D1C4776F00067F5EF /* NSMutableSet+Pearl.h */,
|
||||
@@ -3102,14 +3110,14 @@
|
||||
DAFE45D915039823003ABA7C /* NSObject+PearlExport.m */,
|
||||
DAFE4A63150399FF003ABA87 /* NSObject+PearlKVO.h */,
|
||||
DAFE4A63150399FF003ABA85 /* NSObject+PearlKVO.m */,
|
||||
93D39FBF8FCEB4C106272334 /* NSOrderedSetOrArray.h */,
|
||||
93D39789AAF49338F8AC8B02 /* NSOrderedSetOrArray.m */,
|
||||
93D397F4BAFFF7CF3F1B21A4 /* NSPersistentStore+PearlMigration.h */,
|
||||
93D399C2F3D48E57C4803BDC /* NSPersistentStore+PearlMigration.m */,
|
||||
DAFE45DA15039823003ABA7C /* NSString+PearlNSArrayFormat.h */,
|
||||
DAFE45DB15039823003ABA7C /* NSString+PearlNSArrayFormat.m */,
|
||||
DAFE45DC15039823003ABA7C /* NSString+PearlSEL.h */,
|
||||
DAFE45DD15039823003ABA7C /* NSString+PearlSEL.m */,
|
||||
DA2CA4DC18D28859007798F8 /* NSTimer+PearlBlock.h */,
|
||||
DA2CA4DB18D28859007798F8 /* NSTimer+PearlBlock.m */,
|
||||
DAFE45DE15039823003ABA7C /* Pearl.h */,
|
||||
DA30E9CD15722ECA00A68B4C /* Pearl.m */,
|
||||
DAFE45DF15039823003ABA7C /* PearlAbstractStrings.h */,
|
||||
@@ -3120,6 +3128,8 @@
|
||||
DAFE45E615039823003ABA7C /* PearlConfig.m */,
|
||||
DAFE45E715039823003ABA7C /* PearlDeviceUtils.h */,
|
||||
DAFE45E815039823003ABA7C /* PearlDeviceUtils.m */,
|
||||
93D39D8508BF868907E9732E /* PearlHangDetector.h */,
|
||||
93D39BDA5DB85FCDE4E6450A /* PearlHangDetector.m */,
|
||||
DAFE45E915039823003ABA7C /* PearlInfoPlist.h */,
|
||||
DAFE45EA15039823003ABA7C /* PearlInfoPlist.m */,
|
||||
DA30E9D515723E6900A68B4C /* PearlLazy.h */,
|
||||
@@ -3143,10 +3153,6 @@
|
||||
DAA1411C1922FF020032B392 /* PearlTween.m */,
|
||||
DAFE45F815039823003ABA7C /* README */,
|
||||
DAFE45F915039823003ABA7C /* Resources */,
|
||||
93D39FBF8FCEB4C106272334 /* NSOrderedSetOrArray.h */,
|
||||
93D39789AAF49338F8AC8B02 /* NSOrderedSetOrArray.m */,
|
||||
93D39BDA5DB85FCDE4E6450A /* PearlHangDetector.m */,
|
||||
93D39D8508BF868907E9732E /* PearlHangDetector.h */,
|
||||
);
|
||||
path = Pearl;
|
||||
sourceTree = "<group>";
|
||||
@@ -3195,6 +3201,8 @@
|
||||
DA32D01819D046E1004F3F0E /* PearlFixedTableView.m */,
|
||||
DAFE461015039823003ABA7C /* PearlGradientView.h */,
|
||||
DAFE461115039823003ABA7C /* PearlGradientView.m */,
|
||||
DAB4FBCE202FDE47002768FB /* PearlLinks.h */,
|
||||
DAB4FBCB202FDE47002768FB /* PearlLinks.m */,
|
||||
DAFE461615039823003ABA7C /* PearlMessageView.h */,
|
||||
DAFE461715039823003ABA7C /* PearlMessageView.m */,
|
||||
DACE2F6919BA6A2A0010F92E /* PearlMutableStaticTableViewController.h */,
|
||||
@@ -3247,14 +3255,16 @@
|
||||
DACE2F6719BA6A2A0010F92E /* UIView+FontScale.m */,
|
||||
DAEFB01D19BCBD9E00525079 /* UIView+LayoutGone.h */,
|
||||
DAEFB01C19BCBD9E00525079 /* UIView+LayoutGone.m */,
|
||||
DAB4FBCC202FDE47002768FB /* UIView+PearlLayout.h */,
|
||||
DAB4FBCF202FDE47002768FB /* UIView+PearlLayout.m */,
|
||||
DAB4FBCD202FDE47002768FB /* UIView+PearlSize.h */,
|
||||
DAB4FBD1202FDE48002768FB /* UIView+PearlSize.m */,
|
||||
DAEC85B418E3DD9A007FC0DF /* UIView+Touches.h */,
|
||||
DAEC85B118E3DD9A007FC0DF /* UIView+Touches.m */,
|
||||
93D39488AB33616661725929 /* UIView+AlphaScale.m */,
|
||||
93D392D76C091DEA3319F11D /* UIView+AlphaScale.h */,
|
||||
93D3952910EDB8E0EBC94BA9 /* UIView+Visible.m */,
|
||||
93D39B7B765546B1F1900CB7 /* UIView+Visible.h */,
|
||||
93D39FEFC296AF6E7DF8E468 /* PearlLinks.m */,
|
||||
93D399C408B705172FA0FA02 /* PearlLinks.h */,
|
||||
93D3952910EDB8E0EBC94BA9 /* UIView+Visible.m */,
|
||||
DAB4FBD0202FDE47002768FB /* WTFViews.h */,
|
||||
DAB4FBD2202FDE48002768FB /* WTFViews.m */,
|
||||
);
|
||||
path = "Pearl-UIKit";
|
||||
sourceTree = "<group>";
|
||||
@@ -3297,10 +3307,12 @@
|
||||
DAFE4A1915039824003ABA7C /* Pearl.h in Headers */,
|
||||
DAFE4A1A15039824003ABA7C /* PearlAbstractStrings.h in Headers */,
|
||||
DAFE4A1E15039824003ABA7C /* PearlCodeUtils.h in Headers */,
|
||||
DAB4FBD8202FDE48002768FB /* WTFViews.h in Headers */,
|
||||
DAFE4A2015039824003ABA7C /* PearlConfig.h in Headers */,
|
||||
DAFE4A2215039824003ABA7C /* PearlDeviceUtils.h in Headers */,
|
||||
DAFE4A2415039824003ABA7C /* PearlInfoPlist.h in Headers */,
|
||||
DA2CA4E418D28866007798F8 /* NSLayoutConstraint+PearlUIKit.h in Headers */,
|
||||
DAB4FBD5202FDE48002768FB /* UIView+PearlSize.h in Headers */,
|
||||
DACE2F6D19BA6A2A0010F92E /* PearlMutableStaticTableViewController.h in Headers */,
|
||||
DAFE4A2615039824003ABA7C /* PearlLogger.h in Headers */,
|
||||
DAFE4A2815039824003ABA7C /* PearlMathUtils.h in Headers */,
|
||||
@@ -3309,13 +3321,13 @@
|
||||
DAFE4A2C15039824003ABA7C /* PearlResettable.h in Headers */,
|
||||
DAFE4A2D15039824003ABA7C /* PearlStrings.h in Headers */,
|
||||
DAFE4A2F15039824003ABA7C /* PearlStringUtils.h in Headers */,
|
||||
DA2CA4E018D28859007798F8 /* NSTimer+PearlBlock.h in Headers */,
|
||||
DAFE4A3315039824003ABA7C /* Pearl-Crypto.h in Headers */,
|
||||
DAFE4A3615039824003ABA7C /* PearlKeyChain.h in Headers */,
|
||||
DAE2726419CE9CB3007C5262 /* UITableViewCell+PearlDeque.h in Headers */,
|
||||
DACE2F6E19BA6A2A0010F92E /* UIView+FontScale.h in Headers */,
|
||||
DA32D01B19D046E1004F3F0E /* PearlFixedTableView.h in Headers */,
|
||||
DAFE4A3C15039824003ABA7C /* Pearl-UIKit-Dependencies.h in Headers */,
|
||||
DAB4FBD6202FDE48002768FB /* PearlLinks.h in Headers */,
|
||||
DAEC85B818E3DD9A007FC0DF /* UIView+Touches.h in Headers */,
|
||||
DAFE4A3D15039824003ABA7C /* Pearl-UIKit.h in Headers */,
|
||||
DAFE4A3E15039824003ABA7C /* PearlAlert.h in Headers */,
|
||||
@@ -3323,9 +3335,11 @@
|
||||
DAFE4A4215039824003ABA7C /* PearlBoxView.h in Headers */,
|
||||
DAEFB01F19BCBD9E00525079 /* UIView+LayoutGone.h in Headers */,
|
||||
DAFE4A4415039824003ABA7C /* PearlGradientView.h in Headers */,
|
||||
DAB4FBC6202FDDEC002768FB /* NSMutableSet+Pearl.h in Headers */,
|
||||
DAFE4A4A15039824003ABA7C /* PearlMessageView.h in Headers */,
|
||||
DACE2F6619BA6A0A0010F92E /* PearlProfiler.h in Headers */,
|
||||
DAFE4A4C15039824003ABA7C /* PearlRootViewController.h in Headers */,
|
||||
DAB4FBC9202FDE0F002768FB /* PearlCryptUtils.h in Headers */,
|
||||
DAFE4A4E15039824003ABA7C /* PearlSheet.h in Headers */,
|
||||
DAFE4A5015039824003ABA7C /* PearlUIDebug.h in Headers */,
|
||||
DAFE4A5215039824003ABA7C /* PearlUIUtils.h in Headers */,
|
||||
@@ -3343,6 +3357,7 @@
|
||||
DA2CA4DE18D28859007798F8 /* NSArray+Pearl.h in Headers */,
|
||||
93D392EC39DA43C46C692C12 /* NSDictionary+Indexing.h in Headers */,
|
||||
93D3932889B6B4206E66A6D6 /* PearlEMail.h in Headers */,
|
||||
DAB4FBC8202FDDF3002768FB /* NSNotificationCenter+PearlEasyCleanup.h in Headers */,
|
||||
DA3509FE15F101A500C14A8E /* PearlQueue.h in Headers */,
|
||||
DAEC85B718E3DD9A007FC0DF /* PearlUINavigationBar.h in Headers */,
|
||||
93D396BA1C74C4A06FD86437 /* PearlOverlay.h in Headers */,
|
||||
@@ -3355,12 +3370,12 @@
|
||||
93D39536EB550E811CCD04BC /* UIResponder+PearlFirstResponder.h in Headers */,
|
||||
93D393DB5325820241BA90A7 /* PearlSizedTextView.h in Headers */,
|
||||
93D392A8777DC30C11361647 /* UITextView+PearlAttributes.h in Headers */,
|
||||
DAB4FBC4202FDDDD002768FB /* NSInvocation+Pearl.h in Headers */,
|
||||
93D39A53D76CA70786423458 /* UICollectionView+PearlReloadItems.h in Headers */,
|
||||
93D39AA4A0BE66A872CCC02E /* NSPersistentStore+PearlMigration.h in Headers */,
|
||||
93D399E4BC1E092A8C8B12AE /* NSOrderedSetOrArray.h in Headers */,
|
||||
93D3959696396A91961C6148 /* UIView+AlphaScale.h in Headers */,
|
||||
93D39BFB5F5F9337F6565DE3 /* UIView+Visible.h in Headers */,
|
||||
93D39861AEE621B287EA93E9 /* PearlLinks.h in Headers */,
|
||||
DAB4FBD4202FDE48002768FB /* UIView+PearlLayout.h in Headers */,
|
||||
93D39359B0DF9823F6C56A05 /* PearlHangDetector.h in Headers */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -3529,15 +3544,15 @@
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
CLASSPREFIX = MP;
|
||||
LastUpgradeCheck = 0820;
|
||||
LastUpgradeCheck = 0920;
|
||||
ORGANIZATIONNAME = Lyndir;
|
||||
TargetAttributes = {
|
||||
DA32D01F19D111C6004F3F0E = {
|
||||
CreatedOnToolsVersion = 6.0;
|
||||
DevelopmentTeam = HL3Q45LX9N;
|
||||
};
|
||||
DA5BFA43147E415C00F98B1E = {
|
||||
DevelopmentTeam = HL3Q45LX9N;
|
||||
LastSwiftMigration = 0920;
|
||||
ProvisioningStyle = Automatic;
|
||||
SystemCapabilities = {
|
||||
com.apple.BackgroundModes = {
|
||||
@@ -3555,7 +3570,6 @@
|
||||
};
|
||||
};
|
||||
DAA1757C19D86BE70044227B = {
|
||||
CreatedOnToolsVersion = 6.0;
|
||||
DevelopmentTeam = HL3Q45LX9N;
|
||||
};
|
||||
DAB7AE3D1F3D464A00C856B1 = {
|
||||
@@ -3870,7 +3884,6 @@
|
||||
DA8495311A93049300B3053D /* icon_down.png in Resources */,
|
||||
DA25C5FF197DBF200046CDCF /* icon_thumbs-up@2x.png in Resources */,
|
||||
DAE1EF2217E942DE00BC0086 /* Localizable.strings in Resources */,
|
||||
DA38D6A318CCB5BF009AEB3E /* Storyboard.storyboard in Resources */,
|
||||
DA5A09DF171A70E4005284AB /* play.png in Resources */,
|
||||
DA24EBEC19DAD6EE00FF010B /* Icon-Small@3x.png in Resources */,
|
||||
DA5A09E0171A70E4005284AB /* play@2x.png in Resources */,
|
||||
@@ -3990,7 +4003,6 @@
|
||||
93D39A5FF670957C0AF8298D /* MPSiteCell.m in Sources */,
|
||||
93D398ECD7D1A0DEDDADF516 /* MPEmergencyViewController.m in Sources */,
|
||||
DAB7AE991F3DDEE000C856B1 /* mpw-marshal-util.c in Sources */,
|
||||
DA95B50F1C4776F00067F5EF /* NSMutableSet+Pearl.m in Sources */,
|
||||
93D394B5036C882B33C71872 /* MPSitesSegue.m in Sources */,
|
||||
DA0CC5911EB6B030009A8ED9 /* MPStoredSiteEntity+CoreDataProperties.m in Sources */,
|
||||
93D39673DDC085BE72C34D7C /* MPPopdownSegue.m in Sources */,
|
||||
@@ -4005,7 +4017,6 @@
|
||||
93D39D8F78978196D6ABDEDE /* MPNavigationController.m in Sources */,
|
||||
93D3939661CE37180AF7CD6A /* MPStoreViewController.m in Sources */,
|
||||
93D390C1B93F9D3AE37DD0A5 /* MPAnswersViewController.m in Sources */,
|
||||
DA45711D1F572F1E00D54152 /* PearlCryptUtils.m in Sources */,
|
||||
93D399D7E08A142776A74CB8 /* MPOverlayViewController.m in Sources */,
|
||||
93D39A27F2506C6FEEF9C588 /* MPAlgorithmV2.m in Sources */,
|
||||
93D39B429C67A62E29DC02DA /* MPRootSegue.m in Sources */,
|
||||
@@ -4102,24 +4113,28 @@
|
||||
93D39E281E3658B30550CB55 /* NSDictionary+Indexing.m in Sources */,
|
||||
DAF4EF50190A81E400023C90 /* NSManagedObject+Pearl.m in Sources */,
|
||||
93D39262A8A97DB748213309 /* PearlEMail.m in Sources */,
|
||||
DAB4FBD9202FDE48002768FB /* UIView+PearlSize.m in Sources */,
|
||||
DA3509FF15F101A500C14A8E /* PearlQueue.m in Sources */,
|
||||
DAB4FBDA202FDE48002768FB /* WTFViews.m in Sources */,
|
||||
DAB4FBC7202FDDEF002768FB /* NSMutableSet+Pearl.m in Sources */,
|
||||
93D3922A53E41A54832E90D9 /* PearlOverlay.m in Sources */,
|
||||
DA32D01A19D046E1004F3F0E /* PearlFixedTableView.m in Sources */,
|
||||
93D396AA30690B256F30378A /* PearlNavigationController.m in Sources */,
|
||||
93D397952F5635C793C24DF1 /* NSError+PearlFullDescription.m in Sources */,
|
||||
DA2CA4DF18D28859007798F8 /* NSTimer+PearlBlock.m in Sources */,
|
||||
93D3954E96236384AFA00453 /* UIScrollView+PearlAdjustInsets.m in Sources */,
|
||||
DAB4FBCA202FDE13002768FB /* PearlCryptUtils.m in Sources */,
|
||||
93D39A8EA1C49CE43B63F47B /* PearlUICollectionView.m in Sources */,
|
||||
93D399246DC90F50913A1287 /* UIResponder+PearlFirstResponder.m in Sources */,
|
||||
DAA141201922FF020032B392 /* PearlTween.m in Sources */,
|
||||
DAB4FBD7202FDE48002768FB /* UIView+PearlLayout.m in Sources */,
|
||||
93D391ECBD9BD2C64115B5DD /* PearlSizedTextView.m in Sources */,
|
||||
DAB4FBD3202FDE48002768FB /* PearlLinks.m in Sources */,
|
||||
93D39E34FD28D24FE3442C48 /* UITextView+PearlAttributes.m in Sources */,
|
||||
93D39D47FC623E91FC39D20C /* UICollectionView+PearlReloadItems.m in Sources */,
|
||||
93D3928D629EA563F9EC4909 /* NSPersistentStore+PearlMigration.m in Sources */,
|
||||
93D392A33CCE85431E910C7B /* NSOrderedSetOrArray.m in Sources */,
|
||||
93D393AA69A1193401160418 /* UIView+AlphaScale.m in Sources */,
|
||||
93D3942C1B117EE4851AA7B6 /* UIView+Visible.m in Sources */,
|
||||
93D397FCAAC6FA885247A4F9 /* PearlLinks.m in Sources */,
|
||||
DAB4FBC5202FDDDD002768FB /* NSInvocation+Pearl.m in Sources */,
|
||||
93D395373A425B05C86B2268 /* PearlHangDetector.m in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
@@ -4217,11 +4232,19 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_STATIC_ANALYZER_MODE = deep;
|
||||
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES;
|
||||
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES;
|
||||
CLANG_WARN_ASSIGN_ENUM = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
@@ -4232,19 +4255,25 @@
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_RECEIVER_WEAK = NO;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEVELOPMENT_TEAM = HL3Q45LX9N;
|
||||
DSTROOT = "/tmp/${PRODUCT_NAME}.dst";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
@@ -4255,6 +4284,10 @@
|
||||
"NDEBUG=1",
|
||||
"NS_BLOCK_ASSERTIONS=1",
|
||||
"CRASHLYTICS=1",
|
||||
PEARL,
|
||||
PEARL_UIKIT,
|
||||
PEARL_CRYPTO,
|
||||
PEARL_WITH_MESSAGEUI,
|
||||
);
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
|
||||
@@ -4277,7 +4310,7 @@
|
||||
GCC_WARN_SIGN_COMPARE = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = NO;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
@@ -4290,6 +4323,7 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "${TARGET_NAME}";
|
||||
PUBLIC_HEADERS_FOLDER_PATH = include;
|
||||
@@ -4297,6 +4331,7 @@
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
STRIP_INSTALLED_PRODUCT = NO;
|
||||
STRIP_SWIFT_SYMBOLS = NO;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
WARNING_CFLAGS = "-Wno-float-conversion";
|
||||
@@ -4312,16 +4347,17 @@
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
||||
CODE_SIGN_ENTITLEMENTS = Source/iOS/MasterPassword.entitlements;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "-";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
EXCLUDED_SOURCE_FILE_NAMES = libDCIntrospect.a;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/External/iOS\"",
|
||||
);
|
||||
GCC_C_LANGUAGE_STANDARD = c11;
|
||||
GCC_PREFIX_HEADER = "Source/MasterPassword-Prefix.pch";
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
|
||||
INFOPLIST_FILE = "Source/iOS/MasterPassword-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/External/libsodium/libsodium-ios/lib",
|
||||
@@ -4334,7 +4370,10 @@
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lyndir.lhunath.MasterPassword;
|
||||
SKIP_INSTALL = NO;
|
||||
STRIP_INSTALLED_PRODUCT = YES;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
STRIP_SWIFT_SYMBOLS = YES;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Source/iOS/MasterPassword-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_VERSION = 4.0;
|
||||
};
|
||||
name = Test;
|
||||
};
|
||||
@@ -4342,11 +4381,13 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_PREFIX_HEADER = "Source/Pearl/Pearl-Prefix.pch";
|
||||
GCC_PREFIX_HEADER = "External/Pearl/Pearl-Prefix.pch";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)/External/Pearl/Pearl-Crypto/lib\"",
|
||||
"$(inherited)",
|
||||
);
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "External/Pearl/Pearl-Bridging-Header.h";
|
||||
SWIFT_VERSION = 4.0;
|
||||
};
|
||||
name = Test;
|
||||
};
|
||||
@@ -4405,10 +4446,18 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES;
|
||||
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES;
|
||||
CLANG_WARN_ASSIGN_ENUM = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
@@ -4419,19 +4468,26 @@
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_RECEIVER_WEAK = NO;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
DEVELOPMENT_TEAM = HL3Q45LX9N;
|
||||
DSTROOT = "/tmp/${PRODUCT_NAME}.dst";
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
@@ -4442,6 +4498,10 @@
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
"CRASHLYTICS=1",
|
||||
PEARL,
|
||||
PEARL_UIKIT,
|
||||
PEARL_CRYPTO,
|
||||
PEARL_WITH_MESSAGEUI,
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
@@ -4478,6 +4538,7 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "${TARGET_NAME}";
|
||||
@@ -4485,6 +4546,8 @@
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
STRIP_INSTALLED_PRODUCT = NO;
|
||||
STRIP_SWIFT_SYMBOLS = NO;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
WARNING_CFLAGS = "-Wno-float-conversion";
|
||||
};
|
||||
@@ -4495,11 +4558,19 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_STATIC_ANALYZER_MODE = deep;
|
||||
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_INTEGER = YES;
|
||||
CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES;
|
||||
CLANG_WARN_ASSIGN_ENUM = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
@@ -4510,19 +4581,25 @@
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_RECEIVER_WEAK = NO;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
DEVELOPMENT_TEAM = HL3Q45LX9N;
|
||||
DSTROOT = "/tmp/${PRODUCT_NAME}.dst";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
@@ -4533,6 +4610,10 @@
|
||||
"NDEBUG=1",
|
||||
"NS_BLOCK_ASSERTIONS=1",
|
||||
"CRASHLYTICS=1",
|
||||
PEARL,
|
||||
PEARL_UIKIT,
|
||||
PEARL_CRYPTO,
|
||||
PEARL_WITH_MESSAGEUI,
|
||||
);
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
|
||||
@@ -4555,7 +4636,7 @@
|
||||
GCC_WARN_SIGN_COMPARE = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = NO;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
@@ -4568,6 +4649,7 @@
|
||||
"$(inherited)",
|
||||
);
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
OTHER_LDFLAGS = "-ObjC";
|
||||
PRODUCT_NAME = "${TARGET_NAME}";
|
||||
PUBLIC_HEADERS_FOLDER_PATH = include;
|
||||
@@ -4575,6 +4657,7 @@
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
STRIP_INSTALLED_PRODUCT = NO;
|
||||
STRIP_SWIFT_SYMBOLS = NO;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
WARNING_CFLAGS = "-Wno-float-conversion";
|
||||
@@ -4594,44 +4677,12 @@
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/External/iOS\"",
|
||||
);
|
||||
GCC_C_LANGUAGE_STANDARD = c11;
|
||||
GCC_PREFIX_HEADER = "Source/MasterPassword-Prefix.pch";
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
|
||||
INFOPLIST_FILE = "Source/iOS/MasterPassword-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/External/libsodium/libsodium-ios/lib",
|
||||
"$(PROJECT_DIR)/External/libjson-c/libjson-c-ios/lib",
|
||||
);
|
||||
OTHER_CFLAGS = (
|
||||
"-DMPW_SODIUM=1",
|
||||
"-DMPW_CPERCIVA=0",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lyndir.lhunath.MasterPassword;
|
||||
SKIP_INSTALL = NO;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
DA5BFA6F147E415C00F98B1E /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
||||
CODE_SIGN_ENTITLEMENTS = Source/iOS/MasterPassword.entitlements;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
EXCLUDED_SOURCE_FILE_NAMES = libDCIntrospect.a;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/External/iOS\"",
|
||||
);
|
||||
GCC_PREFIX_HEADER = "Source/MasterPassword-Prefix.pch";
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
|
||||
INFOPLIST_FILE = "Source/iOS/MasterPassword-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/External/libsodium/libsodium-ios/lib",
|
||||
@@ -4644,6 +4695,49 @@
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lyndir.lhunath.MasterPassword;
|
||||
SKIP_INSTALL = NO;
|
||||
STRIP_INSTALLED_PRODUCT = YES;
|
||||
STRIP_SWIFT_SYMBOLS = YES;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Source/iOS/MasterPassword-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 4.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
DA5BFA6F147E415C00F98B1E /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = NO;
|
||||
CODE_SIGN_ENTITLEMENTS = Source/iOS/MasterPassword.entitlements;
|
||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||
EXCLUDED_SOURCE_FILE_NAMES = libDCIntrospect.a;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"\"$(SRCROOT)/External/iOS\"",
|
||||
);
|
||||
GCC_C_LANGUAGE_STANDARD = c11;
|
||||
GCC_PREFIX_HEADER = "Source/MasterPassword-Prefix.pch";
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
|
||||
INFOPLIST_FILE = "Source/iOS/MasterPassword-Info.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(PROJECT_DIR)/External/libsodium/libsodium-ios/lib",
|
||||
"$(PROJECT_DIR)/External/libjson-c/libjson-c-ios/lib",
|
||||
);
|
||||
OTHER_CFLAGS = (
|
||||
"-DMPW_SODIUM=1",
|
||||
"-DMPW_CPERCIVA=0",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.lyndir.lhunath.MasterPassword;
|
||||
SKIP_INSTALL = NO;
|
||||
STRIP_INSTALLED_PRODUCT = YES;
|
||||
STRIP_SWIFT_SYMBOLS = YES;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "Source/iOS/MasterPassword-Bridging-Header.h";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
||||
SWIFT_VERSION = 4.0;
|
||||
TARGETED_DEVICE_FAMILY = 1;
|
||||
};
|
||||
name = Release;
|
||||
@@ -4822,11 +4916,13 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_PREFIX_HEADER = "Source/Pearl/Pearl-Prefix.pch";
|
||||
GCC_PREFIX_HEADER = "External/Pearl/Pearl-Prefix.pch";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)/External/Pearl/Pearl-Crypto/lib\"",
|
||||
"$(inherited)",
|
||||
);
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "External/Pearl/Pearl-Bridging-Header.h";
|
||||
SWIFT_VERSION = 4.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -4834,7 +4930,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_PREFIX_HEADER = "Source/Pearl/Pearl-Prefix.pch";
|
||||
GCC_PREFIX_HEADER = "External/Pearl/Pearl-Prefix.pch";
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)/External/Pearl/Pearl-Crypto/lib\"",
|
||||
"$(inherited)",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0830"
|
||||
LastUpgradeVersion = "0920"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -26,6 +26,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
@@ -45,6 +46,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
|
||||
@@ -64,8 +64,6 @@
|
||||
DA2CA4EE18D323D3007798F8 /* NSError+PearlFullDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4E818D323D3007798F8 /* NSError+PearlFullDescription.h */; };
|
||||
DA2CA4EF18D323D3007798F8 /* NSArray+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4E918D323D3007798F8 /* NSArray+Pearl.m */; };
|
||||
DA2CA4F018D323D3007798F8 /* NSArray+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4EA18D323D3007798F8 /* NSArray+Pearl.h */; };
|
||||
DA2CA4F118D323D3007798F8 /* NSTimer+PearlBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = DA2CA4EB18D323D3007798F8 /* NSTimer+PearlBlock.m */; };
|
||||
DA2CA4F218D323D3007798F8 /* NSTimer+PearlBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = DA2CA4EC18D323D3007798F8 /* NSTimer+PearlBlock.h */; };
|
||||
DA30E9D015722ECA00A68B4C /* Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DA30E9CD15722ECA00A68B4C /* Pearl.m */; };
|
||||
DA30E9D215722EE500A68B4C /* Pearl-Crypto.m in Sources */ = {isa = PBXBuildFile; fileRef = DA30E9D115722EE500A68B4C /* Pearl-Crypto.m */; };
|
||||
DA30E9D715723E6900A68B4C /* PearlLazy.h in Headers */ = {isa = PBXBuildFile; fileRef = DA30E9D515723E6900A68B4C /* PearlLazy.h */; };
|
||||
@@ -77,7 +75,6 @@
|
||||
DA3B8453190FC86F00246EEA /* NSManagedObject+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DA3B8451190FC86F00246EEA /* NSManagedObject+Pearl.h */; };
|
||||
DA3B8456190FC89700246EEA /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3B8454190FC89700246EEA /* MPFixable.m */; };
|
||||
DA3BCFCD19BD09E0006B2681 /* SourceCodePro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */; };
|
||||
DA4571201F572F3200D54152 /* PearlCryptUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DA45711E1F572F3200D54152 /* PearlCryptUtils.m */; };
|
||||
DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC6326C148680650075AEA5 /* libjrswizzle.a */; };
|
||||
DA4DAE941A7D8117003E5423 /* MPAlgorithmV3.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4DAE921A7D8117003E5423 /* MPAlgorithmV3.m */; };
|
||||
DA4DAE951A7D8117003E5423 /* MPTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = DA4DAE931A7D8117003E5423 /* MPTypes.m */; };
|
||||
@@ -134,6 +131,16 @@
|
||||
DAB07CA31F77261400CC6D43 /* aes.c in Sources */ = {isa = PBXBuildFile; fileRef = DAB07C9E1F7725D400CC6D43 /* aes.c */; };
|
||||
DAB07CA51F77261C00CC6D43 /* aes.c in Sources */ = {isa = PBXBuildFile; fileRef = DAB07C9E1F7725D400CC6D43 /* aes.c */; };
|
||||
DAB07CA61F77262400CC6D43 /* aes.c in Sources */ = {isa = PBXBuildFile; fileRef = DAB07C9E1F7725D400CC6D43 /* aes.c */; };
|
||||
DAB4FBE3202FF93E002768FB /* PearlHangDetector.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB4FBDD202FF93D002768FB /* PearlHangDetector.h */; };
|
||||
DAB4FBE4202FF93E002768FB /* PearlHangDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB4FBDE202FF93D002768FB /* PearlHangDetector.m */; };
|
||||
DAB4FBE5202FF93E002768FB /* NSInvocation+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB4FBDF202FF93D002768FB /* NSInvocation+Pearl.h */; };
|
||||
DAB4FBE6202FF93E002768FB /* NSInvocation+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB4FBE0202FF93D002768FB /* NSInvocation+Pearl.m */; };
|
||||
DAB4FBE7202FF93E002768FB /* NSOrderedSetOrArray.h in Headers */ = {isa = PBXBuildFile; fileRef = DAB4FBE1202FF93D002768FB /* NSOrderedSetOrArray.h */; };
|
||||
DAB4FBE8202FF93E002768FB /* NSOrderedSetOrArray.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB4FBE2202FF93D002768FB /* NSOrderedSetOrArray.m */; };
|
||||
DAB4FBE9202FF94C002768FB /* NSMutableSet+Pearl.h in Headers */ = {isa = PBXBuildFile; fileRef = DACBFCDB1C59B22E007EF90F /* NSMutableSet+Pearl.h */; };
|
||||
DAB4FBEA202FF951002768FB /* NSMutableSet+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DACBFCDC1C59B22E007EF90F /* NSMutableSet+Pearl.m */; };
|
||||
DAB4FBEB202FF975002768FB /* PearlCryptUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = DA45711F1F572F3200D54152 /* PearlCryptUtils.h */; };
|
||||
DAB4FBEC202FF979002768FB /* PearlCryptUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = DA45711E1F572F3200D54152 /* PearlCryptUtils.m */; };
|
||||
DAB7AE5A1F3D74E700C856B1 /* libjson-c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAB7AE591F3D74E700C856B1 /* libjson-c.a */; };
|
||||
DAB7AE5B1F3D750B00C856B1 /* libjson-c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAB7AE591F3D74E700C856B1 /* libjson-c.a */; };
|
||||
DAB7AE941F3D757B00C856B1 /* libjson-c.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAB7AE901F3D757B00C856B1 /* libjson-c.a */; };
|
||||
@@ -184,7 +191,6 @@
|
||||
DACA29741705E1A8002C6C22 /* dictionary.lst in Resources */ = {isa = PBXBuildFile; fileRef = DACA29721705E1A8002C6C22 /* dictionary.lst */; };
|
||||
DACA298D1705E2BD002C6C22 /* JRSwizzle.h in Headers */ = {isa = PBXBuildFile; fileRef = DACA29771705E2BD002C6C22 /* JRSwizzle.h */; };
|
||||
DACA299A1705E2BD002C6C22 /* JRSwizzle.m in Sources */ = {isa = PBXBuildFile; fileRef = DACA298C1705E2BD002C6C22 /* JRSwizzle.m */; };
|
||||
DACBFCDF1C59B22E007EF90F /* NSMutableSet+Pearl.m in Sources */ = {isa = PBXBuildFile; fileRef = DACBFCDC1C59B22E007EF90F /* NSMutableSet+Pearl.m */; };
|
||||
DAD9B5F01762CAA4001835F9 /* ServiceManagement.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAD9B5EF1762CAA4001835F9 /* ServiceManagement.framework */; };
|
||||
DAD9B5F11762CAB9001835F9 /* MasterPassword-Mac-LoginHelper.app in Copy LoginHelper */ = {isa = PBXBuildFile; fileRef = DAD9B5E6176299BA001835F9 /* MasterPassword-Mac-LoginHelper.app */; };
|
||||
DADD5DFA1EA173B0005E7D96 /* libsodium.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA0979571E9A824700F0BFE8 /* libsodium.a */; };
|
||||
@@ -483,8 +489,6 @@
|
||||
DA2CA4E818D323D3007798F8 /* NSError+PearlFullDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+PearlFullDescription.h"; sourceTree = "<group>"; };
|
||||
DA2CA4E918D323D3007798F8 /* NSArray+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSArray+Pearl.m"; sourceTree = "<group>"; };
|
||||
DA2CA4EA18D323D3007798F8 /* NSArray+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+Pearl.h"; sourceTree = "<group>"; };
|
||||
DA2CA4EB18D323D3007798F8 /* NSTimer+PearlBlock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+PearlBlock.m"; sourceTree = "<group>"; };
|
||||
DA2CA4EC18D323D3007798F8 /* NSTimer+PearlBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTimer+PearlBlock.h"; sourceTree = "<group>"; };
|
||||
DA30E9CD15722ECA00A68B4C /* Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Pearl.m; sourceTree = "<group>"; };
|
||||
DA30E9D115722EE500A68B4C /* Pearl-Crypto.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "Pearl-Crypto.m"; sourceTree = "<group>"; };
|
||||
DA30E9D515723E6900A68B4C /* PearlLazy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlLazy.h; sourceTree = "<group>"; };
|
||||
@@ -982,6 +986,13 @@
|
||||
DAAF16641F5897EA0013B8AE /* mpw-cli-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mpw-cli-util.h"; sourceTree = "<group>"; };
|
||||
DAB07C9E1F7725D400CC6D43 /* aes.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aes.c; sourceTree = "<group>"; };
|
||||
DAB07C9F1F7725D400CC6D43 /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = "<group>"; };
|
||||
DAB4FBB3202FD60A002768FB /* Pearl-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Pearl-Prefix.pch"; sourceTree = "<group>"; };
|
||||
DAB4FBDD202FF93D002768FB /* PearlHangDetector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PearlHangDetector.h; sourceTree = "<group>"; };
|
||||
DAB4FBDE202FF93D002768FB /* PearlHangDetector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlHangDetector.m; sourceTree = "<group>"; };
|
||||
DAB4FBDF202FF93D002768FB /* NSInvocation+Pearl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSInvocation+Pearl.h"; sourceTree = "<group>"; };
|
||||
DAB4FBE0202FF93D002768FB /* NSInvocation+Pearl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSInvocation+Pearl.m"; sourceTree = "<group>"; };
|
||||
DAB4FBE1202FF93D002768FB /* NSOrderedSetOrArray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSOrderedSetOrArray.h; sourceTree = "<group>"; };
|
||||
DAB4FBE2202FF93D002768FB /* NSOrderedSetOrArray.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSOrderedSetOrArray.m; sourceTree = "<group>"; };
|
||||
DAB7AE591F3D74E700C856B1 /* libjson-c.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libjson-c.a"; path = "External/libjson-c/libjson-c-osx/lib/libjson-c.a"; sourceTree = "<group>"; };
|
||||
DAB7AE7B1F3D757B00C856B1 /* arraylist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = arraylist.h; sourceTree = "<group>"; };
|
||||
DAB7AE7C1F3D757B00C856B1 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bits.h; sourceTree = "<group>"; };
|
||||
@@ -1008,7 +1019,6 @@
|
||||
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; };
|
||||
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 = "../../Source/Pearl/Pearl-Prefix.pch"; 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>"; };
|
||||
DACA24331705DF7D002C6C22 /* avatar-3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "avatar-3@2x.png"; sourceTree = "<group>"; };
|
||||
@@ -1993,7 +2003,7 @@
|
||||
DAFE45D715039823003ABA7C /* Pearl */,
|
||||
DA89D4E51A51E53100AC64D7 /* Pearl-Cocoa */,
|
||||
DAFE45FC15039823003ABA7C /* Pearl-Crypto */,
|
||||
DAC77CB1148291A600BCF976 /* Pearl-Prefix.pch */,
|
||||
DAB4FBB3202FD60A002768FB /* Pearl-Prefix.pch */,
|
||||
);
|
||||
path = Pearl;
|
||||
sourceTree = "<group>";
|
||||
@@ -2152,6 +2162,12 @@
|
||||
DAFE45D715039823003ABA7C /* Pearl */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DAB4FBDF202FF93D002768FB /* NSInvocation+Pearl.h */,
|
||||
DAB4FBE0202FF93D002768FB /* NSInvocation+Pearl.m */,
|
||||
DAB4FBE1202FF93D002768FB /* NSOrderedSetOrArray.h */,
|
||||
DAB4FBE2202FF93D002768FB /* NSOrderedSetOrArray.m */,
|
||||
DAB4FBDD202FF93D002768FB /* PearlHangDetector.h */,
|
||||
DAB4FBDE202FF93D002768FB /* PearlHangDetector.m */,
|
||||
DA8ED893192906920099B726 /* include */,
|
||||
93D396D04E57792A54D437AC /* NSArray+Indexing.h */,
|
||||
93D39067C0AFDC581794E2B8 /* NSArray+Indexing.m */,
|
||||
@@ -2178,8 +2194,6 @@
|
||||
DAFE45DB15039823003ABA7C /* NSString+PearlNSArrayFormat.m */,
|
||||
DAFE45DC15039823003ABA7C /* NSString+PearlSEL.h */,
|
||||
DAFE45DD15039823003ABA7C /* NSString+PearlSEL.m */,
|
||||
DA2CA4EC18D323D3007798F8 /* NSTimer+PearlBlock.h */,
|
||||
DA2CA4EB18D323D3007798F8 /* NSTimer+PearlBlock.m */,
|
||||
DAFE45DE15039823003ABA7C /* Pearl.h */,
|
||||
DA30E9CD15722ECA00A68B4C /* Pearl.m */,
|
||||
DAFE45DF15039823003ABA7C /* PearlAbstractStrings.h */,
|
||||
@@ -2255,15 +2269,16 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
DA89D4EC1A51EABD00AC64D7 /* Pearl-Cocoa.h in Headers */,
|
||||
DA2CA4F218D323D3007798F8 /* NSTimer+PearlBlock.h in Headers */,
|
||||
DAFE4A1315039824003ABA7C /* NSObject+PearlExport.h in Headers */,
|
||||
DAFE4A1515039824003ABA7C /* NSString+PearlNSArrayFormat.h in Headers */,
|
||||
DAFE4A1715039824003ABA7C /* NSString+PearlSEL.h in Headers */,
|
||||
DA3B8453190FC86F00246EEA /* NSManagedObject+Pearl.h in Headers */,
|
||||
DA8ED897192906920099B726 /* map-macro.h in Headers */,
|
||||
DAFE4A1915039824003ABA7C /* Pearl.h in Headers */,
|
||||
DAB4FBE9202FF94C002768FB /* NSMutableSet+Pearl.h in Headers */,
|
||||
DAFE4A1A15039824003ABA7C /* PearlAbstractStrings.h in Headers */,
|
||||
DAFE4A1E15039824003ABA7C /* PearlCodeUtils.h in Headers */,
|
||||
DAB4FBE3202FF93E002768FB /* PearlHangDetector.h in Headers */,
|
||||
DAFE4A2015039824003ABA7C /* PearlConfig.h in Headers */,
|
||||
DAFE4A2215039824003ABA7C /* PearlDeviceUtils.h in Headers */,
|
||||
DA8ED896192906920099B726 /* PearlTween.h in Headers */,
|
||||
@@ -2271,13 +2286,16 @@
|
||||
DAFE4A2615039824003ABA7C /* PearlLogger.h in Headers */,
|
||||
DA2CA4F018D323D3007798F8 /* NSArray+Pearl.h in Headers */,
|
||||
DAFE4A2815039824003ABA7C /* PearlMathUtils.h in Headers */,
|
||||
DAB4FBE7202FF93E002768FB /* NSOrderedSetOrArray.h in Headers */,
|
||||
DAFE4A2A15039824003ABA7C /* PearlObjectUtils.h in Headers */,
|
||||
DAFE4A2C15039824003ABA7C /* PearlResettable.h in Headers */,
|
||||
DAFE4A2D15039824003ABA7C /* PearlStrings.h in Headers */,
|
||||
DAFE4A2F15039824003ABA7C /* PearlStringUtils.h in Headers */,
|
||||
DAFE4A3315039824003ABA7C /* Pearl-Crypto.h in Headers */,
|
||||
DAB4FBEB202FF975002768FB /* PearlCryptUtils.h in Headers */,
|
||||
DAFE4A3615039824003ABA7C /* PearlKeyChain.h in Headers */,
|
||||
DA30E9D715723E6900A68B4C /* PearlLazy.h in Headers */,
|
||||
DAB4FBE5202FF93E002768FB /* NSInvocation+Pearl.h in Headers */,
|
||||
DAADCC4719FAFFAD00987B1D /* NSNotificationCenter+PearlEasyCleanup.h in Headers */,
|
||||
DAFE4A63150399FF003ABA88 /* NSObject+PearlKVO.h in Headers */,
|
||||
DAFE4A63150399FF003ABA94 /* NSDateFormatter+RFC3339.h in Headers */,
|
||||
@@ -2712,8 +2730,6 @@
|
||||
DA5E5CF81724A667003798D8 /* MPAlgorithmV1.m in Sources */,
|
||||
DA2686231EBFD7A40001E37E /* MPStoredSiteEntity+CoreDataClass.m in Sources */,
|
||||
DA2686221EBFD7A40001E37E /* MPSiteQuestionEntity+CoreDataProperties.m in Sources */,
|
||||
DA4571201F572F3200D54152 /* PearlCryptUtils.m in Sources */,
|
||||
DACBFCDF1C59B22E007EF90F /* NSMutableSet+Pearl.m in Sources */,
|
||||
DAB07CA01F7725D400CC6D43 /* aes.c in Sources */,
|
||||
DA2686241EBFD7A40001E37E /* MPStoredSiteEntity+CoreDataProperties.m in Sources */,
|
||||
DA6774311A4746AF004F356A /* mpw-util.c in Sources */,
|
||||
@@ -2786,6 +2802,7 @@
|
||||
files = (
|
||||
DAFE4A1415039824003ABA7C /* NSObject+PearlExport.m in Sources */,
|
||||
DAADCC4919FAFFAD00987B1D /* NSPersistentStore+PearlMigration.m in Sources */,
|
||||
DAB4FBE8202FF93E002768FB /* NSOrderedSetOrArray.m in Sources */,
|
||||
DAFE4A1615039824003ABA7C /* NSString+PearlNSArrayFormat.m in Sources */,
|
||||
DAFE4A1815039824003ABA7C /* NSString+PearlSEL.m in Sources */,
|
||||
DA2CA4ED18D323D3007798F8 /* NSError+PearlFullDescription.m in Sources */,
|
||||
@@ -2793,6 +2810,7 @@
|
||||
DAFE4A1F15039824003ABA7C /* PearlCodeUtils.m in Sources */,
|
||||
DAFE4A2115039824003ABA7C /* PearlConfig.m in Sources */,
|
||||
DAFE4A2315039824003ABA7C /* PearlDeviceUtils.m in Sources */,
|
||||
DAB4FBE6202FF93E002768FB /* NSInvocation+Pearl.m in Sources */,
|
||||
DAFE4A2515039824003ABA7C /* PearlInfoPlist.m in Sources */,
|
||||
DAFE4A2715039824003ABA7C /* PearlLogger.m in Sources */,
|
||||
DA2C3D691BD9665B001137B3 /* PearlProfiler.m in Sources */,
|
||||
@@ -2803,12 +2821,14 @@
|
||||
DA89D4ED1A51EABD00AC64D7 /* Pearl-Cocoa.m in Sources */,
|
||||
DAFE4A3715039824003ABA7C /* PearlKeyChain.m in Sources */,
|
||||
DA8ED895192906920099B726 /* PearlTween.m in Sources */,
|
||||
DA2CA4F118D323D3007798F8 /* NSTimer+PearlBlock.m in Sources */,
|
||||
DAB4FBE4202FF93E002768FB /* PearlHangDetector.m in Sources */,
|
||||
DAB4FBEC202FF979002768FB /* PearlCryptUtils.m in Sources */,
|
||||
DA3B8452190FC86F00246EEA /* NSManagedObject+Pearl.m in Sources */,
|
||||
DA30E9D015722ECA00A68B4C /* Pearl.m in Sources */,
|
||||
DA30E9D215722EE500A68B4C /* Pearl-Crypto.m in Sources */,
|
||||
DA2CA4EF18D323D3007798F8 /* NSArray+Pearl.m in Sources */,
|
||||
DA30E9D815723E6900A68B4C /* PearlLazy.m in Sources */,
|
||||
DAB4FBEA202FF951002768FB /* NSMutableSet+Pearl.m in Sources */,
|
||||
DAFE4A63150399FF003ABA86 /* NSObject+PearlKVO.m in Sources */,
|
||||
DAFE4A63150399FF003ABA92 /* NSDateFormatter+RFC3339.m in Sources */,
|
||||
93D395F08A087F8A24689347 /* NSArray+Indexing.m in Sources */,
|
||||
@@ -2896,10 +2916,15 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = NO;
|
||||
CLANG_STATIC_ANALYZER_MODE = deep;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
@@ -2907,16 +2932,21 @@
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_RECEIVER_WEAK = NO;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
@@ -2934,6 +2964,9 @@
|
||||
"NDEBUG=1",
|
||||
"NS_BLOCK_ASSERTIONS=1",
|
||||
"CRASHLYTICS=1",
|
||||
PEARL,
|
||||
PEARL_COCOA,
|
||||
PEARL_CRYPTO,
|
||||
);
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
|
||||
@@ -2954,12 +2987,12 @@
|
||||
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
|
||||
GCC_WARN_MISSING_PARENTHESES = YES;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_SIGN_COMPARE = YES;
|
||||
GCC_WARN_SIGN_COMPARE = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = NO;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = NO;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_VALUE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
@@ -3020,7 +3053,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_PREFIX_HEADER = "Source/Pearl/Pearl-Prefix.pch";
|
||||
GCC_PREFIX_HEADER = "External/Pearl/Pearl-Prefix.pch";
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)/External/Pearl/Pearl-Crypto/lib\"",
|
||||
@@ -3239,10 +3272,14 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = NO;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
@@ -3250,16 +3287,21 @@
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_RECEIVER_WEAK = NO;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
@@ -3276,6 +3318,10 @@
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
"CRASHLYTICS=1",
|
||||
PEARL,
|
||||
PEARL_COCOA,
|
||||
PEARL_CRYPTO,
|
||||
);
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
@@ -3297,12 +3343,12 @@
|
||||
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
|
||||
GCC_WARN_MISSING_PARENTHESES = YES;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_SIGN_COMPARE = YES;
|
||||
GCC_WARN_SIGN_COMPARE = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = NO;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = NO;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = NO;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_VALUE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
@@ -3323,6 +3369,7 @@
|
||||
PUBLIC_HEADERS_FOLDER_PATH = include;
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
};
|
||||
name = Debug;
|
||||
@@ -3332,10 +3379,15 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
|
||||
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = NO;
|
||||
CLANG_STATIC_ANALYZER_MODE = deep;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
@@ -3343,16 +3395,21 @@
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_RECEIVER_WEAK = NO;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
@@ -3370,6 +3427,9 @@
|
||||
"NDEBUG=1",
|
||||
"NS_BLOCK_ASSERTIONS=1",
|
||||
"CRASHLYTICS=1",
|
||||
PEARL,
|
||||
PEARL_COCOA,
|
||||
PEARL_CRYPTO,
|
||||
);
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
|
||||
@@ -3390,12 +3450,12 @@
|
||||
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
|
||||
GCC_WARN_MISSING_PARENTHESES = YES;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_SIGN_COMPARE = YES;
|
||||
GCC_WARN_SIGN_COMPARE = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||
GCC_WARN_UNUSED_FUNCTION = NO;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = NO;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_VALUE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
@@ -3629,7 +3689,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_PREFIX_HEADER = "Source/Pearl/Pearl-Prefix.pch";
|
||||
GCC_PREFIX_HEADER = "External/Pearl/Pearl-Prefix.pch";
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)/External/Pearl/Pearl-Crypto/lib\"",
|
||||
@@ -3642,7 +3702,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
GCC_PREFIX_HEADER = "Source/Pearl/Pearl-Prefix.pch";
|
||||
GCC_PREFIX_HEADER = "External/Pearl/Pearl-Prefix.pch";
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
|
||||
LIBRARY_SEARCH_PATHS = (
|
||||
"\"$(SRCROOT)/External/Pearl/Pearl-Crypto/lib\"",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0830"
|
||||
LastUpgradeVersion = "0920"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -26,6 +26,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
@@ -45,6 +46,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0830"
|
||||
LastUpgradeVersion = "0920"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -26,6 +26,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
@@ -45,6 +46,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0830"
|
||||
LastUpgradeVersion = "0920"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -26,6 +26,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
@@ -45,6 +46,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0830"
|
||||
LastUpgradeVersion = "0920"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -26,6 +26,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
@@ -45,6 +46,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
language = ""
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "YES"
|
||||
customWorkingDirectory = "/Users/lhunath/Documents/workspace/lyndir/MasterPassword/platform-independent/cli-c"
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
hash automake || { echo >&2 "Missing automake."; exit 1; }
|
||||
hash autoreconf || { echo >&2 "Missing autoconf."; exit 1; }
|
||||
hash libtool || hash glibtool || { echo >&2 "Missing libtool."; exit 1; }
|
||||
|
||||
cd "${BASH_SOURCE%/*}/../External/libjson-c"
|
||||
[[ $1 = clean ]] && { [[ ! -e Makefile ]] || make -s distclean; exit; }
|
||||
[[ -e "${prefix=$PWD/libjson-c-ios}/lib/libjson-c.a" ]] && exit
|
||||
|
||||
# Prepare
|
||||
autoreconf -Iautoconf-archive/m4 --verbose --install --symlink 2>&1 | sed 's/^\([^:]*\):[0-9]\{1,\}: /\1: /'
|
||||
autoreconf -Iautoconf-archive/m4 --verbose --install --symlink 2> >(sed 's/^\([^:]*\):[0-9]\{1,\}: /\1: /')
|
||||
rm -rf "${prefix=$PWD/libjson-c-ios}"
|
||||
mkdir -p "$prefix/lib" \
|
||||
"${prefix_i386=$prefix/tmp/i386}" \
|
||||
@@ -17,8 +22,8 @@ mkdir -p "$prefix/lib" \
|
||||
# Targets
|
||||
(
|
||||
## ARCH: i386
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphonesimulator)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphonesimulator)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphonesimulator)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphonesimulator)/usr/bin:$PATH"
|
||||
export CFLAGS="-arch i386 -isysroot $SDKROOT -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g $CFLAGS"
|
||||
export LDFLAGS="-arch i386 -isysroot $SDKROOT -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
@@ -28,8 +33,8 @@ mkdir -p "$prefix/lib" \
|
||||
)
|
||||
(
|
||||
## ARCH: x86_64
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphonesimulator)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphonesimulator)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphonesimulator)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphonesimulator)/usr/bin:$PATH"
|
||||
export CFLAGS="-arch x86_64 -isysroot $SDKROOT -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g $CFLAGS"
|
||||
export LDFLAGS="-arch x86_64 -isysroot $SDKROOT -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
@@ -39,8 +44,8 @@ mkdir -p "$prefix/lib" \
|
||||
)
|
||||
(
|
||||
## ARCH: armv7
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
export CFLAGS="-mthumb -arch armv7 -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g $CFLAGS"
|
||||
export LDFLAGS="-mthumb -arch armv7 -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
@@ -50,8 +55,8 @@ mkdir -p "$prefix/lib" \
|
||||
)
|
||||
(
|
||||
## ARCH: armv7s
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
export CFLAGS="-mthumb -arch armv7s -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g $CFLAGS"
|
||||
export LDFLAGS="-mthumb -arch armv7s -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
@@ -61,8 +66,8 @@ mkdir -p "$prefix/lib" \
|
||||
)
|
||||
(
|
||||
## ARCH: arm64
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
export CFLAGS="-mthumb -arch arm64 -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g $CFLAGS"
|
||||
export LDFLAGS="-mthumb -arch arm64 -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
|
||||
@@ -1,19 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
hash automake || { echo >&2 "Missing automake."; exit 1; }
|
||||
hash autoreconf || { echo >&2 "Missing autoconf."; exit 1; }
|
||||
hash libtool || hash glibtool || { echo >&2 "Missing libtool."; exit 1; }
|
||||
|
||||
cd "${BASH_SOURCE%/*}/../External/libjson-c"
|
||||
[[ $1 = clean ]] && { [[ ! -e Makefile ]] || make -s distclean; exit; }
|
||||
[[ -e "${prefix=$PWD/libjson-c-osx}/lib/libjson-c.a" ]] && exit
|
||||
|
||||
# Prepare
|
||||
autoreconf -Iautoconf-archive/m4 --verbose --install --symlink 2>&1 | sed 's/^\([^:]*\):[0-9]\{1,\}: /\1: /'
|
||||
autoreconf -Iautoconf-archive/m4 --verbose --install --symlink 2> >(sed 's/^\([^:]*\):[0-9]\{1,\}: /\1: /')
|
||||
rm -rf "${prefix=$PWD/libjson-c-osx}"
|
||||
mkdir -p "$prefix"
|
||||
|
||||
# Targets
|
||||
(
|
||||
## ARCH: x86_64
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk macosx)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk macosx)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk macosx)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk macosx)/usr/bin:$PATH"
|
||||
export CFLAGS="-arch x86_64 -isysroot $SDKROOT -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET:-10.8} -O2 -g $CFLAGS" # -flto
|
||||
export LDFLAGS="-arch x86_64 -isysroot $SDKROOT -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET:-10.8} $LDFLAGS" # -flto
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
hash automake || { echo >&2 "Missing automake."; exit 1; }
|
||||
hash autoreconf || { echo >&2 "Missing autoconf."; exit 1; }
|
||||
hash libtool || hash glibtool || { echo >&2 "Missing libtool."; exit 1; }
|
||||
|
||||
cd "${BASH_SOURCE%/*}/../External/libsodium"
|
||||
[[ $1 = clean ]] && { [[ ! -e Makefile ]] || make -s distclean; exit; }
|
||||
[[ -e "${prefix=$PWD/libsodium-ios}/lib/libsodium.a" ]] && exit
|
||||
|
||||
# Prepare
|
||||
autoreconf --verbose --install --symlink 2>&1 | sed 's/^\([^:]*\):[0-9]\{1,\}: /\1: /'
|
||||
autoreconf --verbose --install --symlink 2> >(sed 's/^\([^:]*\):[0-9]\{1,\}: /\1: /')
|
||||
rm -rf "${prefix=$PWD/libsodium-ios}"
|
||||
mkdir -p "$prefix/lib" \
|
||||
"${prefix_i386=$prefix/tmp/i386}" \
|
||||
@@ -17,8 +22,8 @@ mkdir -p "$prefix/lib" \
|
||||
# Targets
|
||||
(
|
||||
## ARCH: i386
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphonesimulator)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphonesimulator)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphonesimulator)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphonesimulator)/usr/bin:$PATH"
|
||||
export CFLAGS="-arch i386 -isysroot $SDKROOT -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g -flto $CFLAGS"
|
||||
export LDFLAGS="-arch i386 -isysroot $SDKROOT -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -flto $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
@@ -28,8 +33,8 @@ mkdir -p "$prefix/lib" \
|
||||
)
|
||||
(
|
||||
## ARCH: x86_64
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphonesimulator)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphonesimulator)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphonesimulator)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphonesimulator)/usr/bin:$PATH"
|
||||
export CFLAGS="-arch x86_64 -isysroot $SDKROOT -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g -flto $CFLAGS"
|
||||
export LDFLAGS="-arch x86_64 -isysroot $SDKROOT -mios-simulator-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -flto $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
@@ -39,8 +44,8 @@ mkdir -p "$prefix/lib" \
|
||||
)
|
||||
(
|
||||
## ARCH: armv7
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
export CFLAGS="-mthumb -arch armv7 -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g -flto $CFLAGS"
|
||||
export LDFLAGS="-mthumb -arch armv7 -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -flto $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
@@ -50,8 +55,8 @@ mkdir -p "$prefix/lib" \
|
||||
)
|
||||
(
|
||||
## ARCH: armv7s
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
export CFLAGS="-mthumb -arch armv7s -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g -flto $CFLAGS"
|
||||
export LDFLAGS="-mthumb -arch armv7s -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -flto $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
@@ -61,8 +66,8 @@ mkdir -p "$prefix/lib" \
|
||||
)
|
||||
(
|
||||
## ARCH: arm64
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk iphoneos)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk iphoneos)/usr/bin:$PATH"
|
||||
export CFLAGS="-mthumb -arch arm64 -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -O2 -g -flto $CFLAGS"
|
||||
export LDFLAGS="-mthumb -arch arm64 -isysroot $SDKROOT -mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET:-8.0} -flto $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
|
||||
@@ -1,20 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
hash automake || { echo >&2 "Missing automake."; exit 1; }
|
||||
hash autoreconf || { echo >&2 "Missing autoconf."; exit 1; }
|
||||
hash libtool || hash glibtool || { echo >&2 "Missing libtool."; exit 1; }
|
||||
|
||||
cd "${BASH_SOURCE%/*}/../External/libsodium"
|
||||
[[ $1 = clean ]] && { [[ ! -e Makefile ]] || make -s distclean; exit; }
|
||||
[[ -e "${prefix=$PWD/libsodium-osx}/lib/libsodium.a" ]] && exit
|
||||
|
||||
# Inspired by libsodium/dist-build/osx.sh
|
||||
# Prepare
|
||||
autoreconf --verbose --install --symlink 2>&1 | sed 's/^\([^:]*\):[0-9]\{1,\}: /\1: /'
|
||||
autoreconf --verbose --install --symlink 2> >(sed 's/^\([^:]*\):[0-9]\{1,\}: /\1: /')
|
||||
rm -rf "${prefix=$PWD/libsodium-osx}"
|
||||
mkdir -p "$prefix"
|
||||
|
||||
# Targets
|
||||
(
|
||||
## ARCH: x86_64
|
||||
export SDKROOT="$(xcrun --show-sdk-path --sdk macosx)"
|
||||
export PATH="$(xcrun --show-sdk-platform-path --sdk macosx)/usr/bin:$PATH"
|
||||
SDKROOT="$(xcrun --show-sdk-path --sdk macosx)"
|
||||
PATH="$(xcrun --show-sdk-platform-path --sdk macosx)/usr/bin:$PATH"
|
||||
export CFLAGS="-arch x86_64 -isysroot $SDKROOT -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET:-10.8} -O2 -g -flto $CFLAGS"
|
||||
export LDFLAGS="-arch x86_64 -isysroot $SDKROOT -mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET:-10.8} -flto $LDFLAGS"
|
||||
export CPPFLAGS="$CFLAGS $CPPFLAGS"
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
+ (BOOL)managedObjectContextForMainThreadPerformBlockAndWait:(void ( ^ )(NSManagedObjectContext *mainContext))mocBlock;
|
||||
+ (BOOL)managedObjectContextPerformBlock:(void ( ^ )(NSManagedObjectContext *context))mocBlock;
|
||||
+ (BOOL)managedObjectContextPerformBlockAndWait:(void ( ^ )(NSManagedObjectContext *context))mocBlock;
|
||||
+ (id)managedObjectContextChanged:(void ( ^ )(NSDictionary<NSManagedObjectID *, NSString *> *affectedObjects))changedBlock;
|
||||
- (id)managedObjectContextChanged:(void ( ^ )(NSDictionary<NSManagedObjectID *, NSString *> *affectedObjects))changedBlock;
|
||||
|
||||
- (MPFixableResult)findAndFixInconsistenciesSaveInContext:(NSManagedObjectContext *)context;
|
||||
- (void)deleteAndResetStore;
|
||||
|
||||
@@ -133,12 +133,11 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
||||
return YES;
|
||||
}
|
||||
|
||||
+ (id)managedObjectContextChanged:(void ( ^ )(NSDictionary<NSManagedObjectID *, NSString *> *affectedObjects))changedBlock {
|
||||
- (id)managedObjectContextChanged:(void ( ^ )(NSDictionary<NSManagedObjectID *, NSString *> *affectedObjects))changedBlock {
|
||||
|
||||
NSManagedObjectContext *privateManagedObjectContextIfReady = [[self get] privateManagedObjectContextIfReady];
|
||||
NSManagedObjectContext *privateManagedObjectContextIfReady = [self privateManagedObjectContextIfReady];
|
||||
if (!privateManagedObjectContextIfReady)
|
||||
return nil;
|
||||
|
||||
return PearlAddNotificationObserver( NSManagedObjectContextObjectsDidChangeNotification, privateManagedObjectContextIfReady, nil,
|
||||
^(id host, NSNotification *note) {
|
||||
NSMutableDictionary *affectedObjects = [NSMutableDictionary new];
|
||||
@@ -217,7 +216,7 @@ PearlAssociatedObjectProperty( NSNumber*, StoreCorrupted, storeCorrupted );
|
||||
|
||||
self.mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
|
||||
self.mainManagedObjectContext.parentContext = self.privateManagedObjectContext;
|
||||
if ([self.mainManagedObjectContext respondsToSelector:@selector( automaticallyMergesChangesFromParent )]) // iOS 10+
|
||||
if (@available(iOS 10.0, macOS 10.12, *))
|
||||
self.mainManagedObjectContext.automaticallyMergesChangesFromParent = YES;
|
||||
else
|
||||
// When privateManagedObjectContext is saved, import the changes into mainManagedObjectContext.
|
||||
|
||||
@@ -166,41 +166,66 @@
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
|
||||
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES;
|
||||
GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES;
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES;
|
||||
GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
|
||||
GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
|
||||
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
|
||||
GCC_WARN_MISSING_PARENTHESES = YES;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_SIGN_COMPARE = YES;
|
||||
GCC_WARN_SIGN_COMPARE = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = NO;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_VALUE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
||||
PRODUCT_NAME = "${TARGET_NAME}";
|
||||
@@ -231,17 +256,31 @@
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
@@ -259,20 +298,30 @@
|
||||
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
|
||||
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES;
|
||||
GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES;
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES;
|
||||
GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
|
||||
GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
|
||||
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
|
||||
GCC_WARN_MISSING_PARENTHESES = YES;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_SIGN_COMPARE = YES;
|
||||
GCC_WARN_SIGN_COMPARE = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = NO;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = NO;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_VALUE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
@@ -292,41 +341,66 @@
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_CXX0X_EXTENSIONS = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = NO;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CLANG_WARN__EXIT_TIME_DESTRUCTORS = YES;
|
||||
COPY_PHASE_STRIP = YES;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||
GCC_ENABLE_OBJC_EXCEPTIONS = YES;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
|
||||
GCC_TREAT_WARNINGS_AS_ERRORS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES;
|
||||
GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES;
|
||||
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
|
||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_ABOUT_POINTER_SIGNEDNESS = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES;
|
||||
GCC_WARN_CHECK_SWITCH_STATEMENTS = YES;
|
||||
GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES;
|
||||
GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
|
||||
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
|
||||
GCC_WARN_MISSING_PARENTHESES = YES;
|
||||
GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
|
||||
GCC_WARN_SIGN_COMPARE = YES;
|
||||
GCC_WARN_SIGN_COMPARE = NO;
|
||||
GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNKNOWN_PRAGMAS = NO;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_LABEL = YES;
|
||||
GCC_WARN_UNUSED_VALUE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.8;
|
||||
PRODUCT_NAME = "${TARGET_NAME}";
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
#import <objc/NSObjCRuntime.h>
|
||||
#import <stdlib.h>
|
||||
|
||||
#define log(level, format, ...) \
|
||||
#define mpw_log(level, format, ...) \
|
||||
do { \
|
||||
void (*_sendMsg)(id, SEL, CFStringRef, NSInteger, CFStringRef, NSUInteger, CFStringRef) = (void *)objc_msgSend; \
|
||||
char *_msg = NULL; \
|
||||
@@ -64,11 +64,11 @@
|
||||
CFRelease( msgStr ); \
|
||||
} while (0)
|
||||
|
||||
#define trc(format, ...) log( 0, format, ##__VA_ARGS__ );
|
||||
#define dbg(format, ...) log( 1, format, ##__VA_ARGS__ );
|
||||
#define inf(format, ...) log( 2, format, ##__VA_ARGS__ );
|
||||
#define wrn(format, ...) log( 3, format, ##__VA_ARGS__ );
|
||||
#define err(format, ...) log( 4, format, ##__VA_ARGS__ );
|
||||
#define ftl(format, ...) log( 5, format, ##__VA_ARGS__ );
|
||||
#define trc(format, ...) mpw_log( 0, format, ##__VA_ARGS__ );
|
||||
#define dbg(format, ...) mpw_log( 1, format, ##__VA_ARGS__ );
|
||||
#define inf(format, ...) mpw_log( 2, format, ##__VA_ARGS__ );
|
||||
#define wrn(format, ...) mpw_log( 3, format, ##__VA_ARGS__ );
|
||||
#define err(format, ...) mpw_log( 4, format, ##__VA_ARGS__ );
|
||||
#define ftl(format, ...) mpw_log( 5, format, ##__VA_ARGS__ );
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
//
|
||||
// Prefix header for all source files of the 'Pearl' target in the 'Pearl' project
|
||||
//
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#define PEARL_WITH_MESSAGEUI
|
||||
|
||||
#define PEARL
|
||||
#define PEARL_CRYPTO
|
||||
#if TARGET_OS_IOS
|
||||
#define PEARL_UIKIT
|
||||
#elif TARGET_OS_OSX
|
||||
#define PEARL_COCOA
|
||||
#endif
|
||||
|
||||
#import "Pearl.h"
|
||||
#import "Pearl-Crypto.h"
|
||||
#if TARGET_OS_IOS
|
||||
#import "Pearl-UIKit.h"
|
||||
#elif TARGET_OS_OSX
|
||||
#import "Pearl-Cocoa.h"
|
||||
#endif
|
||||
#endif
|
||||
@@ -225,7 +225,7 @@
|
||||
- (void)copyAnswer:(NSString *)answer {
|
||||
|
||||
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
||||
if ([pasteboard respondsToSelector:@selector( setItems:options: )]) {
|
||||
if (@available(iOS 10.0, *)) {
|
||||
[pasteboard setItems:@[ @{ UIPasteboardTypeAutomatic: answer } ]
|
||||
options:@{
|
||||
UIPasteboardOptionLocalOnly : @NO,
|
||||
|
||||
@@ -55,20 +55,21 @@
|
||||
[self.views[self.nextView++] setVisible:YES];
|
||||
}];
|
||||
|
||||
self.viewTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 block:^(NSTimer *timer) {
|
||||
self.viewProgress.progress += 1.0f / 50;
|
||||
if (@available(iOS 10.0, *))
|
||||
self.viewTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 repeats:YES block:^(NSTimer *timer) {
|
||||
self.viewProgress.progress += 1.0f / 50;
|
||||
|
||||
if (self.viewProgress.progress == 1)
|
||||
[UIView animateWithDuration:0.3f animations:^{
|
||||
self.viewProgress.progress = 0;
|
||||
[self.views[self.nextView++] setVisible:YES];
|
||||
if (self.viewProgress.progress == 1)
|
||||
[UIView animateWithDuration:0.3f animations:^{
|
||||
self.viewProgress.progress = 0;
|
||||
[self.views[self.nextView++] setVisible:YES];
|
||||
|
||||
if (self.nextView >= [self.views count]) {
|
||||
[self.viewTimer invalidate];
|
||||
self.viewProgress.visible = NO;
|
||||
}
|
||||
}];
|
||||
} repeats:YES];
|
||||
if (self.nextView >= [self.views count]) {
|
||||
[self.viewTimer invalidate];
|
||||
self.viewProgress.visible = NO;
|
||||
}
|
||||
}];
|
||||
}];
|
||||
}
|
||||
|
||||
- (UIStatusBarStyle)preferredStatusBarStyle {
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
return;
|
||||
|
||||
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
||||
if ([pasteboard respondsToSelector:@selector( setItems:options: )])
|
||||
if (@available(iOS 10.0, *))
|
||||
[pasteboard setItems:@[ @{ UIPasteboardTypeAutomatic: sitePassword } ]
|
||||
options:@{
|
||||
UIPasteboardOptionLocalOnly : @NO,
|
||||
|
||||
@@ -572,7 +572,6 @@
|
||||
|
||||
// Calculate Fields
|
||||
if (![MPiOSAppDelegate managedObjectContextPerformBlock:^(NSManagedObjectContext *context) {
|
||||
MPSiteEntity *site = [self siteInContext:context];
|
||||
MPKey *key = [MPiOSAppDelegate get].key;
|
||||
if (!key) {
|
||||
wrn( @"Could not load cell content: key unavailable." );
|
||||
@@ -583,6 +582,7 @@
|
||||
return;
|
||||
}
|
||||
|
||||
MPSiteEntity *site = [self siteInContext:context];
|
||||
BOOL loginGenerated = site.loginGenerated;
|
||||
NSString *password = nil, *loginName = [site resolveLoginUsingKey:key];
|
||||
MPResultType transientType = [[MPiOSAppDelegate get] activeUserInContext:context].defaultType?: MPAlgorithmDefault.defaultType;
|
||||
@@ -677,7 +677,7 @@
|
||||
[self.window endEditing:YES];
|
||||
|
||||
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
||||
if ([pasteboard respondsToSelector:@selector( setItems:options: )]) {
|
||||
if (@available(iOS 10.0, *)) {
|
||||
[pasteboard setItems:@[ @{ UIPasteboardTypeAutomatic: password } ]
|
||||
options:@{
|
||||
UIPasteboardOptionLocalOnly : @NO,
|
||||
|
||||
@@ -83,7 +83,7 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
|
||||
|
||||
NSURL *pasteboardURL = nil;
|
||||
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
|
||||
if ([pasteboard respondsToSelector:@selector( hasURLs )])
|
||||
if (@available(iOS 10.0, *))
|
||||
pasteboardURL = pasteboard.hasURLs? pasteboard.URL: nil;
|
||||
else
|
||||
pasteboardURL = [NSURL URLWithString:pasteboard.string];
|
||||
@@ -352,7 +352,7 @@ typedef NS_OPTIONS( NSUInteger, MPPasswordsTips ) {
|
||||
} );
|
||||
} );
|
||||
|
||||
[MPiOSAppDelegate managedObjectContextChanged:^(NSDictionary<NSManagedObjectID *, NSString *> *affectedObjects) {
|
||||
[[MPiOSAppDelegate get] managedObjectContextChanged:^(NSDictionary<NSManagedObjectID *, NSString *> *affectedObjects) {
|
||||
[MPiOSAppDelegate managedObjectContextForMainThreadPerformBlock:^(NSManagedObjectContext *mainContext) {
|
||||
// TODO: either move this into the app delegate or remove the duplicate signOutAnimated: call from the app delegate.
|
||||
if (![[MPiOSAppDelegate get] activeUserInContext:mainContext])
|
||||
|
||||
@@ -697,7 +697,7 @@ referenceSizeForFooterInSection:(NSInteger)section {
|
||||
} );
|
||||
|
||||
if ((self.contextChangedObserver
|
||||
= [MPiOSAppDelegate managedObjectContextChanged:^(NSDictionary<NSManagedObjectID *, NSString *> *affectedObjects) {
|
||||
= [[MPiOSAppDelegate get] managedObjectContextChanged:^(NSDictionary<NSManagedObjectID *, NSString *> *affectedObjects) {
|
||||
if ([[[affectedObjects allKeys] filteredArrayUsingPredicate:
|
||||
[NSPredicate predicateWithBlock:^BOOL(NSManagedObjectID *objectID, NSDictionary *bindings) {
|
||||
return [objectID.entity.name isEqualToString:NSStringFromClass( [MPUserEntity class] )];
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>M. Password</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
@@ -28,19 +28,17 @@
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>[auto]</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>[auto]</string>
|
||||
<key>Fabric</key>
|
||||
@@ -60,7 +58,7 @@
|
||||
<key>LSRequiresIPhoneOS</key>
|
||||
<true/>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>© 2011-2017</string>
|
||||
<string>© 2011-2018</string>
|
||||
<key>UIAppFonts</key>
|
||||
<array>
|
||||
<string>Exo2.0-Bold.otf</string>
|
||||
@@ -71,8 +69,6 @@
|
||||
<string>SourceCodePro-Regular.otf</string>
|
||||
<string>SourceCodePro-ExtraLight.otf</string>
|
||||
</array>
|
||||
<key>UIMainStoryboardFile</key>
|
||||
<string>Storyboard</string>
|
||||
<key>UIStatusBarHidden</key>
|
||||
<true/>
|
||||
<key>UIStatusBarStyle</key>
|
||||
|
||||
5
platform-independent/cli-c/.gitignore
vendored
@@ -9,3 +9,8 @@ TAG
|
||||
VERSION
|
||||
mpw-*.tar.gz
|
||||
mpw-*.tar.gz.sig
|
||||
|
||||
CMakeCache.txt
|
||||
CMakeFiles
|
||||
Makefile
|
||||
cmake_install.cmake
|
||||
|
||||
@@ -19,78 +19,102 @@ set( CMAKE_BUILD_TYPE Release )
|
||||
set( CMAKE_C_FLAGS "-O3" )
|
||||
|
||||
# Version.
|
||||
file( READ "VERSION" mpw_version )
|
||||
add_definitions( -DMP_VERSION=${VERSION} )
|
||||
find_package( Git )
|
||||
if( GIT_FOUND )
|
||||
execute_process( COMMAND "${GIT_EXECUTABLE}" describe --match *-cli* --long --dirty
|
||||
OUTPUT_VARIABLE mpw_version OUTPUT_STRIP_TRAILING_WHITESPACE )
|
||||
endif()
|
||||
if( NOT mpw_version MATCHES "." )
|
||||
file( READ "VERSION" mpw_version )
|
||||
string( STRIP "${mpw_version}" mpw_version )
|
||||
endif()
|
||||
if( mpw_version MATCHES "." )
|
||||
add_definitions( "-DMP_VERSION=${mpw_version}" )
|
||||
message( STATUS "Current mpw source version ${mpw_version}..." )
|
||||
else()
|
||||
message( STATUS "Current mpw source version unknown..." )
|
||||
endif()
|
||||
|
||||
|
||||
### DEPENDENCIES
|
||||
function( use_mpw_sodium t r )
|
||||
if( USE_SODIUM )
|
||||
target_link_libraries( ${t} sodium )
|
||||
target_compile_definitions( ${t} PUBLIC -DMPW_SODIUM=1 )
|
||||
message(STATUS "${t}: USE_SODIUM is enabled.")
|
||||
target_link_libraries( "${t}" sodium )
|
||||
target_compile_definitions( "${t}" PUBLIC -DMPW_SODIUM=1 )
|
||||
message( STATUS "${t}: USE_SODIUM is enabled." )
|
||||
|
||||
elseif( r STREQUAL "required" )
|
||||
message(FATAL_ERROR "${t}: USE_SODIUM was required but is not enabled. Please enable the option or remove this target.")
|
||||
message( FATAL_ERROR "${t}: USE_SODIUM was required but is not enabled. Please enable the option or remove this target." )
|
||||
|
||||
else()
|
||||
message(STATUS "${t}: USE_SODIUM is supported but not enabled.")
|
||||
message( STATUS "${t}: USE_SODIUM is supported but not enabled." )
|
||||
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function( use_mpw_color t )
|
||||
find_package( Curses )
|
||||
if( USE_COLOR )
|
||||
target_link_libraries( ${t} curses)
|
||||
target_compile_definitions( ${t} PUBLIC -DMPW_COLOR=1 )
|
||||
message(STATUS "${t}: USE_COLOR is enabled.")
|
||||
if ( CURSES_FOUND )
|
||||
target_include_directories( "${t}" PUBLIC ${CURSES_INCLUDE_DIR} )
|
||||
target_link_libraries( "${t}" ${CURSES_LIBRARIES} )
|
||||
target_compile_definitions( "${t}" PUBLIC -DMPW_COLOR=1 ${CURSES_DEFINITIONS} )
|
||||
message( STATUS "${t}: USE_COLOR is enabled." )
|
||||
|
||||
elseif( r STREQUAL "required" )
|
||||
message( FATAL_ERROR "${t}: USE_COLOR was enabled but is missing libcurses. Please install this library before continuing." )
|
||||
|
||||
else()
|
||||
message( WARNING "${t}: USE_COLOR was enabled but is missing libcurses. Will continue with USE_COLOR disabled!" )
|
||||
|
||||
endif()
|
||||
|
||||
elseif( r STREQUAL "required" )
|
||||
message(FATAL_ERROR "${t}: USE_COLOR was required but is not enabled. Please enable the option or remove this target.")
|
||||
message( FATAL_ERROR "${t}: USE_COLOR was required but is not enabled. Please enable the option or remove this target." )
|
||||
|
||||
else()
|
||||
message(STATUS "${t}: USE_COLOR is supported but not enabled.")
|
||||
message( STATUS "${t}: USE_COLOR is supported but not enabled." )
|
||||
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function( use_mpw_json t )
|
||||
if( USE_JSON )
|
||||
target_link_libraries( ${t} json-c)
|
||||
target_compile_definitions( ${t} PUBLIC -DMPW_JSON=1 )
|
||||
message(STATUS "${t}: USE_JSON is enabled.")
|
||||
target_link_libraries( "${t}" json-c )
|
||||
target_compile_definitions( "${t}" PUBLIC -DMPW_JSON=1 )
|
||||
message( STATUS "${t}: USE_JSON is enabled." )
|
||||
|
||||
elseif( r STREQUAL "required" )
|
||||
message(FATAL_ERROR "${t}: USE_JSON was required but is not enabled. Please enable the option or remove this target.")
|
||||
message( FATAL_ERROR "${t}: USE_JSON was required but is not enabled. Please enable the option or remove this target." )
|
||||
|
||||
else()
|
||||
message(STATUS "${t}: USE_JSON is supported but not enabled.")
|
||||
message( STATUS "${t}: USE_JSON is supported but not enabled." )
|
||||
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function( use_mpw_xml t r )
|
||||
find_package( LIBXML2 )
|
||||
find_package( LibXml2 )
|
||||
if( USE_XML )
|
||||
if ( LIBXML2_FOUND )
|
||||
target_include_directories( ${t} PUBLIC ${LIBXML2_INCLUDE_DIR} )
|
||||
target_link_libraries( ${t} ${LIBXML2_LIBRARIES} )
|
||||
target_compile_definitions( ${t} PUBLIC -DMPW_XML=1 ${LIBXML2_DEFINITIONS} )
|
||||
message(STATUS "${t}: USE_XML is enabled.")
|
||||
target_include_directories( "${t}" PUBLIC ${LIBXML2_INCLUDE_DIR} )
|
||||
target_link_libraries( "${t}" ${LIBXML2_LIBRARIES} )
|
||||
target_compile_definitions( "${t}" PUBLIC -DMPW_XML=1 ${LIBXML2_DEFINITIONS} )
|
||||
message( STATUS "${t}: USE_XML is enabled." )
|
||||
|
||||
elseif( r STREQUAL "required" )
|
||||
message(FATAL_ERROR "${t}: USE_XML was enabled but is missing libxml2. Please install this library before continuing.")
|
||||
message( FATAL_ERROR "${t}: USE_XML was enabled but is missing libxml2. Please install this library before continuing." )
|
||||
|
||||
else()
|
||||
message(WARNING "${t}: USE_XML was enabled but is missing libxml2. Will continue with USE_XML disabled!")
|
||||
message( WARNING "${t}: USE_XML was enabled but is missing libxml2. Will continue with USE_XML disabled!" )
|
||||
|
||||
endif()
|
||||
|
||||
elseif( r STREQUAL "required" )
|
||||
message(FATAL_ERROR "${t}: USE_XML was required but is not enabled. Please enable the option or remove this target.")
|
||||
message( FATAL_ERROR "${t}: USE_XML was required but is not enabled. Please enable the option or remove this target." )
|
||||
|
||||
else()
|
||||
message(STATUS "${t}: USE_XML is supported but not enabled.")
|
||||
message( STATUS "${t}: USE_XML is supported but not enabled." )
|
||||
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
@@ -46,7 +46,7 @@ cflags=( -O3 $CFLAGS )
|
||||
ldflags=( $LDFLAGS )
|
||||
|
||||
# Version.
|
||||
if { mpw_version=$(git describe --match '*-cli*' --long --dirty --broken) || mpw_version=$(<VERSION); } 2>/dev/null; then
|
||||
if { mpw_version=$(git describe --match '*-cli*' --long --dirty) || mpw_version=$(<VERSION); } 2>/dev/null; then
|
||||
cflags+=( -D"MP_VERSION=$mpw_version" )
|
||||
fi
|
||||
echo 2>&1 "Current mpw source version ${mpw_version:-<unknown>}..."
|
||||
@@ -150,13 +150,15 @@ cc() {
|
||||
|
||||
### DEPENDENCIES
|
||||
use() {
|
||||
local option=$1 requisite=$2 lib=$3
|
||||
local option=$1 requisite=$2 lib=$3; shift 3
|
||||
local enabled=${!option}
|
||||
|
||||
if (( enabled )); then
|
||||
if haslib "$lib"; then
|
||||
for lib in "$lib" "$@"; do
|
||||
haslib "$lib" && ldflags+=( -l"$lib" )
|
||||
done
|
||||
echo >&2 "INFO: Enabled $option (lib$lib)."
|
||||
ldflags+=( -l"$lib" )
|
||||
return 0
|
||||
|
||||
elif [[ $requisite == required ]]; then
|
||||
@@ -184,7 +186,7 @@ use_mpw_sodium() {
|
||||
}
|
||||
use_mpw_color() {
|
||||
local requisite=$1
|
||||
use mpw_color "$requisite" curses && cflags+=( -D"MPW_COLOR=1" ) ||:
|
||||
use mpw_color "$requisite" curses tinfo && cflags+=( -D"MPW_COLOR=1" ) ||:
|
||||
}
|
||||
use_mpw_json() {
|
||||
local requisite=$1
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
static void mpw_getTime(struct timeval *time) {
|
||||
|
||||
if (gettimeofday( time, NULL ) != 0)
|
||||
ftl( "Could not get time: %s\n", strerror( errno ) );
|
||||
ftl( "Could not get time: %s", strerror( errno ) );
|
||||
}
|
||||
|
||||
static const double mpw_showSpeed(struct timeval startTime, const unsigned int iterations, const char *operation) {
|
||||
@@ -82,7 +82,7 @@ int main(int argc, char *const argv[]) {
|
||||
iterations = 4200000; /* tuned to ~10s on dev machine */
|
||||
masterKey = mpw_masterKey( fullName, masterPassword, MPAlgorithmVersionCurrent );
|
||||
if (!masterKey) {
|
||||
ftl( "Could not allocate master key: %s\n", strerror( errno ) );
|
||||
ftl( "Could not allocate master key: %s", strerror( errno ) );
|
||||
abort();
|
||||
}
|
||||
mpw_getTime( &startTime );
|
||||
@@ -127,7 +127,7 @@ int main(int argc, char *const argv[]) {
|
||||
for (int i = 1; i <= iterations; ++i) {
|
||||
masterKey = mpw_masterKey( fullName, masterPassword, MPAlgorithmVersionCurrent );
|
||||
if (!masterKey) {
|
||||
ftl( "Could not allocate master key: %s\n", strerror( errno ) );
|
||||
ftl( "Could not allocate master key: %s", strerror( errno ) );
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
// LICENSE file. Alternatively, see <http://www.gnu.org/licenses/>.
|
||||
//==============================================================================
|
||||
|
||||
#define _WITH_GETLINE
|
||||
#define _POSIX_C_SOURCE 200809L
|
||||
|
||||
#include "mpw-cli-util.h"
|
||||
|
||||
#include <unistd.h>
|
||||
@@ -27,18 +28,21 @@
|
||||
#include <errno.h>
|
||||
#include <sysexits.h>
|
||||
|
||||
#define MPW_MAX_INPUT 60
|
||||
|
||||
#if MPW_COLOR
|
||||
#include <curses.h>
|
||||
#include <term.h>
|
||||
#endif
|
||||
|
||||
#include "mpw-util.h"
|
||||
|
||||
/** Read the value of an environment variable.
|
||||
* @return A newly allocated string or NULL if the variable doesn't exist. */
|
||||
const char *mpw_getenv(const char *variableName) {
|
||||
|
||||
char *envBuf = getenv( variableName );
|
||||
return envBuf? strdup( envBuf ): NULL;
|
||||
return envBuf? mpw_strdup( envBuf ): NULL;
|
||||
}
|
||||
|
||||
/** Use the askpass program to prompt the user.
|
||||
* @return A newly allocated string or NULL if askpass is not supported or an error occurred. */
|
||||
char *mpw_askpass(const char *prompt) {
|
||||
|
||||
const char *askpass = mpw_getenv( MP_ENV_askpass );
|
||||
@@ -47,13 +51,13 @@ char *mpw_askpass(const char *prompt) {
|
||||
|
||||
int pipes[2];
|
||||
if (pipe( pipes ) == ERR) {
|
||||
wrn( "Couldn't pipe: %s\n", strerror( errno ) );
|
||||
wrn( "Couldn't pipe: %s", strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pid_t pid = fork();
|
||||
if (pid == ERR) {
|
||||
wrn( "Couldn't fork for askpass:\n %s: %s\n", askpass, strerror( errno ) );
|
||||
wrn( "Couldn't fork for askpass:\n %s: %s", askpass, strerror( errno ) );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -61,10 +65,10 @@ char *mpw_askpass(const char *prompt) {
|
||||
// askpass fork
|
||||
close( pipes[0] );
|
||||
if (dup2( pipes[1], STDOUT_FILENO ) == ERR)
|
||||
ftl( "Couldn't connect pipe to process: %s\n", strerror( errno ) );
|
||||
ftl( "Couldn't connect pipe to process: %s", strerror( errno ) );
|
||||
|
||||
else if (execlp( askpass, askpass, prompt, NULL ) == ERR)
|
||||
ftl( "Couldn't execute askpass:\n %s: %s\n", askpass, strerror( errno ) );
|
||||
ftl( "Couldn't execute askpass:\n %s: %s", askpass, strerror( errno ) );
|
||||
|
||||
exit( EX_SOFTWARE );
|
||||
}
|
||||
@@ -74,7 +78,7 @@ char *mpw_askpass(const char *prompt) {
|
||||
close( pipes[0] );
|
||||
int status;
|
||||
if (waitpid( pid, &status, 0 ) == ERR) {
|
||||
wrn( "Couldn't wait for askpass: %s\n", strerror( errno ) );
|
||||
wrn( "Couldn't wait for askpass: %s", strerror( errno ) );
|
||||
mpw_free_string( &answer );
|
||||
return NULL;
|
||||
}
|
||||
@@ -90,15 +94,60 @@ char *mpw_askpass(const char *prompt) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Ask the user a question.
|
||||
* @return A newly allocated string or NULL if an error occurred trying to read from the user. */
|
||||
const char *mpw_getline(const char *prompt) {
|
||||
static const char *_mpw_getline(const char *prompt, bool silent) {
|
||||
|
||||
// Get answer from askpass.
|
||||
char *answer = mpw_askpass( prompt );
|
||||
if (answer)
|
||||
return answer;
|
||||
|
||||
#if MPW_COLOR
|
||||
// Initialize a curses screen.
|
||||
SCREEN *screen = newterm( NULL, stderr, stdin );
|
||||
start_color();
|
||||
init_pair( 1, COLOR_WHITE, COLOR_BLUE );
|
||||
init_pair( 2, COLOR_BLACK, COLOR_WHITE );
|
||||
int rows, cols;
|
||||
getmaxyx( stdscr, rows, cols );
|
||||
|
||||
// Display a dialog box.
|
||||
int width = max( prompt? (int)strlen( prompt ): 0, MPW_MAX_INPUT ) + 6;
|
||||
char *version = "mpw v" stringify_def( MP_VERSION );
|
||||
mvprintw( rows - 1, (cols - (int)strlen( version )) / 2, "%s", version );
|
||||
attron( A_BOLD );
|
||||
color_set( 2, NULL );
|
||||
mvprintw( rows / 2 - 1, (cols - width) / 2, "%s%*s%s", "*", width - 2, "", "*" );
|
||||
mvprintw( rows / 2 - 1, (cols - (int)strlen( prompt )) / 2, "%s", prompt );
|
||||
color_set( 1, NULL );
|
||||
mvprintw( rows / 2 + 0, (cols - width) / 2, "%s%*s%s", "|", width - 2, "", "|" );
|
||||
mvprintw( rows / 2 + 1, (cols - width) / 2, "%s%*s%s", "|", width - 2, "", "|" );
|
||||
mvprintw( rows / 2 + 2, (cols - width) / 2, "%s%*s%s", "|", width - 2, "", "|" );
|
||||
|
||||
// Read response.
|
||||
color_set( 2, NULL );
|
||||
attron( A_STANDOUT );
|
||||
int result = ERR;
|
||||
char str[MPW_MAX_INPUT + 1];
|
||||
if (silent) {
|
||||
mvprintw( rows / 2 + 1, (cols - 5) / 2, "[ * ]" );
|
||||
refresh();
|
||||
|
||||
noecho();
|
||||
result = mvgetnstr( rows / 2 + 1, (cols - 1) / 2, str, MPW_MAX_INPUT );
|
||||
echo();
|
||||
} else {
|
||||
mvprintw( rows / 2 + 1, (cols - (MPW_MAX_INPUT + 2)) / 2, "%*s", MPW_MAX_INPUT + 2, "" );
|
||||
refresh();
|
||||
|
||||
echo();
|
||||
result = mvgetnstr( rows / 2 + 1, (cols - MPW_MAX_INPUT) / 2, str, MPW_MAX_INPUT );
|
||||
}
|
||||
attrset( 0 );
|
||||
endwin();
|
||||
delscreen( screen );
|
||||
|
||||
return result == ERR? NULL: mpw_strndup( str, MPW_MAX_INPUT );
|
||||
#else
|
||||
// Get password from terminal.
|
||||
fprintf( stderr, "%s ", prompt );
|
||||
|
||||
@@ -112,56 +161,44 @@ const char *mpw_getline(const char *prompt) {
|
||||
// Remove trailing newline.
|
||||
answer[lineSize - 1] = '\0';
|
||||
return answer;
|
||||
#endif
|
||||
}
|
||||
|
||||
const char *mpw_getline(const char *prompt) {
|
||||
|
||||
return _mpw_getline( prompt, false );
|
||||
}
|
||||
|
||||
/** Ask the user for a password.
|
||||
* @return A newly allocated string or NULL if an error occurred trying to read from the user. */
|
||||
const char *mpw_getpass(const char *prompt) {
|
||||
|
||||
// Get password from askpass.
|
||||
const char *password = mpw_askpass( prompt );
|
||||
if (password)
|
||||
return password;
|
||||
|
||||
// Get password from terminal.
|
||||
char *answer = getpass( prompt );
|
||||
if (!answer)
|
||||
return NULL;
|
||||
|
||||
password = strdup( answer );
|
||||
mpw_zero( answer, strlen( answer ) );
|
||||
return password;
|
||||
return _mpw_getline( prompt, true );
|
||||
}
|
||||
|
||||
/** Get the absolute path to the mpw configuration file with the given prefix name and file extension.
|
||||
* Resolves the file <prefix.extension> as located in the <.mpw.d> directory inside the user's home directory
|
||||
* or current directory if it couldn't be resolved.
|
||||
* @return A newly allocated string. */
|
||||
const char *mpw_path(const char *prefix, const char *extension) {
|
||||
|
||||
// Resolve user's home directory.
|
||||
char *homeDir = NULL;
|
||||
if (!homeDir)
|
||||
if ((homeDir = getenv( "HOME" )))
|
||||
homeDir = strdup( homeDir );
|
||||
homeDir = mpw_strdup( homeDir );
|
||||
if (!homeDir)
|
||||
if ((homeDir = getenv( "USERPROFILE" )))
|
||||
homeDir = strdup( homeDir );
|
||||
homeDir = mpw_strdup( homeDir );
|
||||
if (!homeDir) {
|
||||
const char *homeDrive = getenv( "HOMEDRIVE" ), *homePath = getenv( "HOMEPATH" );
|
||||
if (homeDrive && homePath)
|
||||
homeDir = strdup( mpw_str( "%s%s", homeDrive, homePath ) );
|
||||
homeDir = mpw_strdup( mpw_str( "%s%s", homeDrive, homePath ) );
|
||||
}
|
||||
if (!homeDir) {
|
||||
struct passwd *passwd = getpwuid( getuid() );
|
||||
if (passwd)
|
||||
homeDir = strdup( passwd->pw_dir );
|
||||
homeDir = mpw_strdup( passwd->pw_dir );
|
||||
}
|
||||
if (!homeDir)
|
||||
homeDir = getcwd( NULL, 0 );
|
||||
|
||||
// Compose filename.
|
||||
char *path = strdup( mpw_str( "%s.%s", prefix, extension ) );
|
||||
char *path = mpw_strdup( mpw_str( "%s.%s", prefix, extension ) );
|
||||
|
||||
// This is a filename, remove all potential directory separators.
|
||||
for (char *slash; (slash = strstr( path, "/" )); *slash = '_');
|
||||
@@ -173,32 +210,31 @@ const char *mpw_path(const char *prefix, const char *extension) {
|
||||
free( path );
|
||||
|
||||
if (homePath)
|
||||
path = strdup( homePath );
|
||||
path = mpw_strdup( homePath );
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
/** mkdir all the directories up to the directory of the given file path.
|
||||
* @return true if the file's path exists. */
|
||||
bool mpw_mkdirs(const char *filePath) {
|
||||
|
||||
if (!filePath)
|
||||
return false;
|
||||
|
||||
// The path to mkdir is the filePath without the last path component.
|
||||
char *pathEnd = strrchr( filePath, '/' );
|
||||
char *path = pathEnd? strndup( filePath, (size_t)(pathEnd - filePath) ): NULL;
|
||||
if (!path)
|
||||
return false;
|
||||
|
||||
// Save the cwd and for absolute paths, start at the root.
|
||||
char *cwd = getcwd( NULL, 0 );
|
||||
if (*filePath == '/')
|
||||
chdir( "/" );
|
||||
if (chdir( "/" ) == ERR)
|
||||
return false;
|
||||
|
||||
// The path to mkdir is the filePath without the last path component.
|
||||
char *pathEnd = strrchr( filePath, '/' );
|
||||
if (!pathEnd)
|
||||
return true;
|
||||
|
||||
// Walk the path.
|
||||
bool success = true;
|
||||
char *path = mpw_strndup( filePath, (size_t)(pathEnd - filePath) );
|
||||
for (char *dirName = strtok( path, "/" ); success && dirName; dirName = strtok( NULL, "/" )) {
|
||||
if (!strlen( dirName ))
|
||||
continue;
|
||||
@@ -208,14 +244,12 @@ bool mpw_mkdirs(const char *filePath) {
|
||||
free( path );
|
||||
|
||||
if (chdir( cwd ) == ERR)
|
||||
wrn( "Could not restore cwd:\n %s: %s\n", cwd, strerror( errno ) );
|
||||
wrn( "Could not restore cwd:\n %s: %s", cwd, strerror( errno ) );
|
||||
free( cwd );
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
/** Read until EOF from the given file descriptor.
|
||||
* @return A newly allocated string or NULL if the read buffer couldn't be allocated or an error occurred. */
|
||||
char *mpw_read_fd(int fd) {
|
||||
|
||||
char *buf = NULL;
|
||||
@@ -229,8 +263,6 @@ char *mpw_read_fd(int fd) {
|
||||
return buf;
|
||||
}
|
||||
|
||||
/** Read the file contents of a given file.
|
||||
* @return A newly allocated string or NULL if the read buffer couldn't be allocated. */
|
||||
char *mpw_read_file(FILE *file) {
|
||||
|
||||
if (!file)
|
||||
@@ -244,3 +276,73 @@ char *mpw_read_file(FILE *file) {
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
#if MPW_COLOR
|
||||
static char *str_tputs;
|
||||
static int str_tputs_cursor;
|
||||
static const int str_tputs_max = 256;
|
||||
|
||||
static bool mpw_setupterm() {
|
||||
|
||||
if (!isatty( STDERR_FILENO ))
|
||||
return false;
|
||||
|
||||
static bool termsetup;
|
||||
if (!termsetup) {
|
||||
int errret;
|
||||
if (!(termsetup = (setupterm( NULL, STDERR_FILENO, &errret ) == OK))) {
|
||||
wrn( "Terminal doesn't support color (setupterm errret %d).", errret );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static int mpw_tputc(int c) {
|
||||
|
||||
if (++str_tputs_cursor < str_tputs_max) {
|
||||
str_tputs[str_tputs_cursor] = (char)c;
|
||||
return OK;
|
||||
}
|
||||
|
||||
return ERR;
|
||||
}
|
||||
|
||||
static char *mpw_tputs(const char *str, int affcnt) {
|
||||
|
||||
if (str_tputs)
|
||||
mpw_free( &str_tputs, str_tputs_max );
|
||||
str_tputs = calloc( str_tputs_max, sizeof( char ) );
|
||||
str_tputs_cursor = -1;
|
||||
|
||||
char *result = tputs( str, affcnt, mpw_tputc ) == ERR? NULL: mpw_strndup( str_tputs, str_tputs_max );
|
||||
if (str_tputs)
|
||||
mpw_free( &str_tputs, str_tputs_max );
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
const char *mpw_identicon_str(MPIdenticon identicon) {
|
||||
|
||||
char *colorString, *resetString;
|
||||
#ifdef MPW_COLOR
|
||||
if (mpw_setupterm()) {
|
||||
colorString = mpw_tputs( tparm( tgetstr( "AF", NULL ), identicon.color ), 1 );
|
||||
resetString = mpw_tputs( tgetstr( "me", NULL ), 1 );
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
colorString = calloc( 1, sizeof( char ) );
|
||||
resetString = calloc( 1, sizeof( char ) );
|
||||
}
|
||||
|
||||
const char *str = mpw_str( "%s%s%s%s%s%s",
|
||||
colorString, identicon.leftArm, identicon.body, identicon.rightArm, identicon.accessory, resetString );
|
||||
mpw_free_strings( &colorString, &resetString, NULL );
|
||||
|
||||
return mpw_strdup( str );
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include "mpw-types.h"
|
||||
|
||||
#ifndef MP_VERSION
|
||||
#define MP_VERSION ?
|
||||
@@ -62,3 +63,7 @@ char *mpw_read_fd(int fd);
|
||||
/** Read the file contents of a given file.
|
||||
* @return A newly allocated string or NULL the read buffer couldn't be allocated. */
|
||||
char *mpw_read_file(FILE *file);
|
||||
|
||||
/** Encode a visual fingerprint for a user.
|
||||
* @return A newly allocated string. */
|
||||
const char *mpw_identicon_str(MPIdenticon identicon);
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
// LICENSE file. Alternatively, see <http://www.gnu.org/licenses/>.
|
||||
//==============================================================================
|
||||
|
||||
#define _POSIX_C_SOURCE 200809L
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
@@ -34,24 +36,24 @@ static void usage() {
|
||||
inf( ""
|
||||
" Master Password v%s\n"
|
||||
"--------------------------------------------------------------------------------\n"
|
||||
" https://masterpasswordapp.com\n\n", stringify_def( MP_VERSION ) );
|
||||
" https://masterpasswordapp.com\n", stringify_def( MP_VERSION ) );
|
||||
inf( ""
|
||||
"\nUSAGE\n\n"
|
||||
" mpw [-u|-U full-name] [-m fd] [-t pw-type] [-P value] [-c counter]\n"
|
||||
" [-a version] [-p purpose] [-C context] [-f|F format] [-R 0|1]\n"
|
||||
" [-v|-q] [-h] [site-name]\n\n" );
|
||||
" [-v|-q] [-h] [site-name]\n" );
|
||||
inf( ""
|
||||
" -u full-name Specify the full name of the user.\n"
|
||||
" -u checks the master password against the config,\n"
|
||||
" -U allows updating to a new master password.\n"
|
||||
" Defaults to %s in env or prompts.\n\n", MP_ENV_fullName );
|
||||
" Defaults to %s in env or prompts.\n", MP_ENV_fullName );
|
||||
dbg( ""
|
||||
" -M master-pw Specify the master password of the user.\n"
|
||||
" Passing secrets as arguments is unsafe, for use in testing only.\n" );
|
||||
" Passing secrets as arguments is unsafe, for use in testing only." );
|
||||
inf( ""
|
||||
" -m fd Read the master password of the user from a file descriptor.\n"
|
||||
" Tip: don't send extra characters like newlines such as by using\n"
|
||||
" echo in a pipe. Consider printf instead.\n\n" );
|
||||
" echo in a pipe. Consider printf instead.\n" );
|
||||
inf( ""
|
||||
" -t pw-type Specify the password's template.\n"
|
||||
" Defaults to 'long' (-p a), 'name' (-p i) or 'phrase' (-p r).\n"
|
||||
@@ -64,31 +66,31 @@ static void usage() {
|
||||
" n, name | 9 letter name.\n"
|
||||
" p, phrase | 20 character sentence.\n"
|
||||
" K, key | encryption key (512 bit or -P bits).\n"
|
||||
" P, personal | saved personal password (save with -P pw).\n\n" );
|
||||
" P, personal | saved personal password (save with -P pw).\n" );
|
||||
inf( ""
|
||||
" -P value The parameter value.\n"
|
||||
" -p i | The login name for the site.\n"
|
||||
" -t K | The bit size of the key to generate (eg. 256).\n"
|
||||
" -t P | The personal password to encrypt.\n\n" );
|
||||
" -t P | The personal password to encrypt.\n" );
|
||||
inf( ""
|
||||
" -c counter The value of the counter.\n"
|
||||
" Defaults to 1.\n\n" );
|
||||
" Defaults to 1.\n" );
|
||||
inf( ""
|
||||
" -a version The algorithm version to use, %d - %d.\n"
|
||||
" Defaults to %s in env or %d.\n\n",
|
||||
" Defaults to %s in env or %d.\n",
|
||||
MPAlgorithmVersionFirst, MPAlgorithmVersionLast, MP_ENV_algorithm, MPAlgorithmVersionCurrent );
|
||||
inf( ""
|
||||
" -p purpose The purpose of the generated token.\n"
|
||||
" Defaults to 'auth'.\n"
|
||||
" a, auth | An authentication token such as a password.\n"
|
||||
" i, ident | An identification token such as a username.\n"
|
||||
" r, rec | A recovery token such as a security answer.\n\n" );
|
||||
" r, rec | A recovery token such as a security answer.\n" );
|
||||
inf( ""
|
||||
" -C context A purpose-specific context.\n"
|
||||
" Defaults to empty.\n"
|
||||
" -p a | -\n"
|
||||
" -p i | -\n"
|
||||
" -p r | Most significant word in security question.\n\n" );
|
||||
" -p r | Most significant word in security question.\n" );
|
||||
inf( ""
|
||||
" -f|F format The mpsites format to use for reading/writing site parameters.\n"
|
||||
" -F forces the use of the given format,\n"
|
||||
@@ -96,24 +98,24 @@ static void usage() {
|
||||
" Defaults to %s in env or json, falls back to plain.\n"
|
||||
" n, none | No file\n"
|
||||
" f, flat | ~/.mpw.d/Full Name.%s\n"
|
||||
" j, json | ~/.mpw.d/Full Name.%s\n\n",
|
||||
" j, json | ~/.mpw.d/Full Name.%s\n",
|
||||
MP_ENV_format, mpw_marshal_format_extension( MPMarshalFormatFlat ), mpw_marshal_format_extension( MPMarshalFormatJSON ) );
|
||||
inf( ""
|
||||
" -R redacted Whether to save the mpsites in redacted format or not.\n"
|
||||
" Redaction omits or encrypts any secrets, making the file safe\n"
|
||||
" for saving on or transmitting via untrusted media.\n"
|
||||
" Defaults to 1, redacted.\n\n" );
|
||||
" Defaults to 1, redacted.\n" );
|
||||
inf( ""
|
||||
" -v Increase output verbosity (can be repeated).\n"
|
||||
" -q Decrease output verbosity (can be repeated).\n\n" );
|
||||
" -q Decrease output verbosity (can be repeated).\n" );
|
||||
inf( ""
|
||||
" -h Show this help output instead of performing any operation.\n\n" );
|
||||
" -h Show this help output instead of performing any operation.\n" );
|
||||
inf( ""
|
||||
"\nENVIRONMENT\n\n"
|
||||
" %-12s The full name of the user (see -u).\n"
|
||||
" %-12s The default algorithm version (see -a).\n"
|
||||
" %-12s The default mpsites format (see -f).\n"
|
||||
" %-12s The askpass program to use for prompting the user.\n\n",
|
||||
" %-12s The askpass program to use for prompting the user.\n",
|
||||
MP_ENV_fullName, MP_ENV_algorithm, MP_ENV_format, MP_ENV_askpass );
|
||||
exit( EX_OK );
|
||||
}
|
||||
@@ -223,24 +225,24 @@ int main(const int argc, char *const argv[]) {
|
||||
cli_free( &args, NULL );
|
||||
|
||||
// Operation summary.
|
||||
dbg( "-----------------\n" );
|
||||
dbg( "-----------------" );
|
||||
if (operation.user) {
|
||||
dbg( "fullName : %s\n", operation.user->fullName );
|
||||
trc( "masterPassword : %s\n", operation.user->masterPassword );
|
||||
dbg( "identicon : %s\n", operation.identicon );
|
||||
dbg( "sitesFormat : %s%s\n", mpw_nameForFormat( operation.sitesFormat ), operation.sitesFormatFixed? " (fixed)": "" );
|
||||
dbg( "sitesPath : %s\n", operation.sitesPath );
|
||||
dbg( "fullName : %s", operation.user->fullName );
|
||||
trc( "masterPassword : %s", operation.user->masterPassword );
|
||||
dbg( "identicon : %s", operation.identicon );
|
||||
dbg( "sitesFormat : %s%s", mpw_nameForFormat( operation.sitesFormat ), operation.sitesFormatFixed? " (fixed)": "" );
|
||||
dbg( "sitesPath : %s", operation.sitesPath );
|
||||
}
|
||||
if (operation.site) {
|
||||
dbg( "siteName : %s\n", operation.site->name );
|
||||
dbg( "siteCounter : %u\n", operation.siteCounter );
|
||||
dbg( "resultType : %s (%u)\n", mpw_nameForType( operation.resultType ), operation.resultType );
|
||||
dbg( "resultParam : %s\n", operation.resultParam );
|
||||
dbg( "keyPurpose : %s (%u)\n", mpw_nameForPurpose( operation.keyPurpose ), operation.keyPurpose );
|
||||
dbg( "keyContext : %s\n", operation.keyContext );
|
||||
dbg( "algorithmVersion : %u\n", operation.site->algorithm );
|
||||
dbg( "siteName : %s", operation.site->name );
|
||||
dbg( "siteCounter : %u", operation.siteCounter );
|
||||
dbg( "resultType : %s (%u)", mpw_nameForType( operation.resultType ), operation.resultType );
|
||||
dbg( "resultParam : %s", operation.resultParam );
|
||||
dbg( "keyPurpose : %s (%u)", mpw_nameForPurpose( operation.keyPurpose ), operation.keyPurpose );
|
||||
dbg( "keyContext : %s", operation.keyContext );
|
||||
dbg( "algorithmVersion : %u", operation.site->algorithm );
|
||||
}
|
||||
dbg( "-----------------\n\n" );
|
||||
dbg( "-----------------" );
|
||||
|
||||
// Finally ready to perform the actual operation.
|
||||
cli_mpw( &args, &operation );
|
||||
@@ -273,51 +275,51 @@ void cli_free(Arguments *args, Operation *operation) {
|
||||
void cli_args(Arguments *args, Operation *operation, const int argc, char *const argv[]) {
|
||||
|
||||
for (int opt; (opt = getopt( argc, argv, "u:U:m:M:t:P:c:a:p:C:f:F:R:vqh" )) != EOF;
|
||||
optarg? mpw_zero( optarg, strlen( optarg ) ): NULL)
|
||||
optarg? mpw_zero( optarg, strlen( optarg ) ): (void)0)
|
||||
switch (opt) {
|
||||
case 'u':
|
||||
args->fullName = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->fullName = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
operation->allowPasswordUpdate = false;
|
||||
break;
|
||||
case 'U':
|
||||
args->fullName = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->fullName = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
operation->allowPasswordUpdate = true;
|
||||
break;
|
||||
case 'm':
|
||||
args->masterPasswordFD = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->masterPasswordFD = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 'M':
|
||||
// Passing your master password via the command-line is insecure. Testing purposes only.
|
||||
args->masterPassword = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->masterPassword = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 't':
|
||||
args->resultType = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->resultType = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 'P':
|
||||
args->resultParam = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->resultParam = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 'c':
|
||||
args->siteCounter = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->siteCounter = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 'a':
|
||||
args->algorithmVersion = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->algorithmVersion = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 'p':
|
||||
args->keyPurpose = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->keyPurpose = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 'C':
|
||||
args->keyContext = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->keyContext = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 'f':
|
||||
args->sitesFormat = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->sitesFormat = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
operation->sitesFormatFixed = false;
|
||||
break;
|
||||
case 'F':
|
||||
args->sitesFormat = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->sitesFormat = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
operation->sitesFormatFixed = true;
|
||||
break;
|
||||
case 'R':
|
||||
args->sitesRedacted = optarg && strlen( optarg )? strdup( optarg ): NULL;
|
||||
args->sitesRedacted = optarg && strlen( optarg )? mpw_strdup( optarg ): NULL;
|
||||
break;
|
||||
case 'v':
|
||||
++mpw_verbosity;
|
||||
@@ -331,31 +333,33 @@ void cli_args(Arguments *args, Operation *operation, const int argc, char *const
|
||||
case '?':
|
||||
switch (optopt) {
|
||||
case 'u':
|
||||
ftl( "Missing full name to option: -%c\n", optopt );
|
||||
ftl( "Missing full name to option: -%c", optopt );
|
||||
exit( EX_USAGE );
|
||||
case 't':
|
||||
ftl( "Missing type name to option: -%c\n", optopt );
|
||||
ftl( "Missing type name to option: -%c", optopt );
|
||||
exit( EX_USAGE );
|
||||
case 'c':
|
||||
ftl( "Missing counter value to option: -%c\n", optopt );
|
||||
ftl( "Missing counter value to option: -%c", optopt );
|
||||
exit( EX_USAGE );
|
||||
default:
|
||||
ftl( "Unknown option: -%c\n", optopt );
|
||||
ftl( "Unknown option: -%c", optopt );
|
||||
exit( EX_USAGE );
|
||||
}
|
||||
default:
|
||||
ftl( "Unexpected option: %c\n", opt );
|
||||
ftl( "Unexpected option: %c", opt );
|
||||
exit( EX_USAGE );
|
||||
}
|
||||
|
||||
if (optind < argc && argv[optind])
|
||||
args->siteName = strdup( argv[optind] );
|
||||
args->siteName = mpw_strdup( argv[optind] );
|
||||
}
|
||||
|
||||
void cli_fullName(Arguments *args, Operation *operation) {
|
||||
|
||||
if ((!operation->fullName || !strlen( operation->fullName )) && args->fullName)
|
||||
operation->fullName = strdup( args->fullName );
|
||||
mpw_free_string( &operation->fullName );
|
||||
|
||||
if (args->fullName)
|
||||
operation->fullName = mpw_strdup( args->fullName );
|
||||
|
||||
if (!operation->fullName || !strlen( operation->fullName ))
|
||||
do {
|
||||
@@ -363,7 +367,7 @@ void cli_fullName(Arguments *args, Operation *operation) {
|
||||
} while (operation->fullName && !strlen( operation->fullName ));
|
||||
|
||||
if (!operation->fullName || !strlen( operation->fullName )) {
|
||||
ftl( "Missing full name.\n" );
|
||||
ftl( "Missing full name." );
|
||||
cli_free( args, operation );
|
||||
exit( EX_DATAERR );
|
||||
}
|
||||
@@ -371,14 +375,16 @@ void cli_fullName(Arguments *args, Operation *operation) {
|
||||
|
||||
void cli_masterPassword(Arguments *args, Operation *operation) {
|
||||
|
||||
if ((!operation->masterPassword || !strlen( operation->masterPassword )) && args->masterPasswordFD) {
|
||||
mpw_free_string( &operation->masterPassword );
|
||||
|
||||
if (args->masterPasswordFD) {
|
||||
operation->masterPassword = mpw_read_fd( atoi( args->masterPasswordFD ) );
|
||||
if (!operation->masterPassword && errno)
|
||||
wrn( "Error reading master password from FD %s: %s\n", args->masterPasswordFD, strerror( errno ) );
|
||||
wrn( "Error reading master password from FD %s: %s", args->masterPasswordFD, strerror( errno ) );
|
||||
}
|
||||
|
||||
if ((!operation->masterPassword || !strlen( operation->masterPassword )) && args->masterPassword)
|
||||
operation->masterPassword = strdup( args->masterPassword );
|
||||
if (args->masterPassword && !operation->masterPassword)
|
||||
operation->masterPassword = mpw_strdup( args->masterPassword );
|
||||
|
||||
if (!operation->masterPassword || !strlen( operation->masterPassword ))
|
||||
do {
|
||||
@@ -386,7 +392,7 @@ void cli_masterPassword(Arguments *args, Operation *operation) {
|
||||
} while (operation->masterPassword && !strlen( operation->masterPassword ));
|
||||
|
||||
if (!operation->masterPassword || !strlen( operation->masterPassword )) {
|
||||
ftl( "Missing master password.\n" );
|
||||
ftl( "Missing master password." );
|
||||
cli_free( args, operation );
|
||||
exit( EX_DATAERR );
|
||||
}
|
||||
@@ -394,15 +400,15 @@ void cli_masterPassword(Arguments *args, Operation *operation) {
|
||||
|
||||
void cli_siteName(Arguments *args, Operation *operation) {
|
||||
|
||||
if ((!operation->siteName || !strlen( operation->siteName )) && args->siteName)
|
||||
operation->siteName = strdup( args->siteName );
|
||||
if (!operation->siteName || !strlen( operation->siteName ))
|
||||
do {
|
||||
operation->siteName = mpw_getline( "Site name:" );
|
||||
} while (operation->siteName && !strlen( operation->siteName ));
|
||||
mpw_free_string( &operation->siteName );
|
||||
|
||||
if (!operation->siteName || !strlen( operation->siteName )) {
|
||||
ftl( "Missing site name.\n" );
|
||||
if (args->siteName)
|
||||
operation->siteName = mpw_strdup( args->siteName );
|
||||
if (!operation->siteName)
|
||||
operation->siteName = mpw_getline( "Site name:" );
|
||||
|
||||
if (!operation->siteName) {
|
||||
ftl( "Missing site name." );
|
||||
cli_free( args, operation );
|
||||
exit( EX_DATAERR );
|
||||
}
|
||||
@@ -415,7 +421,7 @@ void cli_sitesFormat(Arguments *args, Operation *operation) {
|
||||
|
||||
operation->sitesFormat = mpw_formatWithName( args->sitesFormat );
|
||||
if (ERR == (int)operation->sitesFormat) {
|
||||
ftl( "Invalid sites format: %s\n", args->sitesFormat );
|
||||
ftl( "Invalid sites format: %s", args->sitesFormat );
|
||||
cli_free( args, operation );
|
||||
exit( EX_DATAERR );
|
||||
}
|
||||
@@ -428,7 +434,7 @@ void cli_keyPurpose(Arguments *args, Operation *operation) {
|
||||
|
||||
operation->keyPurpose = mpw_purposeWithName( args->keyPurpose );
|
||||
if (ERR == (int)operation->keyPurpose) {
|
||||
ftl( "Invalid purpose: %s\n", args->keyPurpose );
|
||||
ftl( "Invalid purpose: %s", args->keyPurpose );
|
||||
cli_free( args, operation );
|
||||
exit( EX_DATAERR );
|
||||
}
|
||||
@@ -439,7 +445,7 @@ void cli_keyContext(Arguments *args, Operation *operation) {
|
||||
if (!args->keyContext)
|
||||
return;
|
||||
|
||||
operation->keyContext = strdup( args->keyContext );
|
||||
operation->keyContext = mpw_strdup( args->keyContext );
|
||||
}
|
||||
|
||||
void cli_user(Arguments *args, Operation *operation) {
|
||||
@@ -449,7 +455,7 @@ void cli_user(Arguments *args, Operation *operation) {
|
||||
mpw_free_string( &operation->sitesPath );
|
||||
operation->sitesPath = mpw_path( operation->fullName, mpw_marshal_format_extension( operation->sitesFormat ) );
|
||||
if (!operation->sitesPath || !(sitesFile = fopen( operation->sitesPath, "r" ))) {
|
||||
dbg( "Couldn't open configuration file:\n %s: %s\n", operation->sitesPath, strerror( errno ) );
|
||||
dbg( "Couldn't open configuration file:\n %s: %s", operation->sitesPath, strerror( errno ) );
|
||||
|
||||
// Try to fall back to the flat format.
|
||||
if (!operation->sitesFormatFixed) {
|
||||
@@ -458,7 +464,7 @@ void cli_user(Arguments *args, Operation *operation) {
|
||||
if (operation->sitesPath && (sitesFile = fopen( operation->sitesPath, "r" )))
|
||||
operation->sitesFormat = MPMarshalFormatFlat;
|
||||
else
|
||||
dbg( "Couldn't open configuration file:\n %s: %s\n", operation->sitesPath, strerror( errno ) );
|
||||
dbg( "Couldn't open configuration file:\n %s: %s", operation->sitesPath, strerror( errno ) );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -470,7 +476,7 @@ void cli_user(Arguments *args, Operation *operation) {
|
||||
// Read file.
|
||||
char *sitesInputData = mpw_read_file( sitesFile );
|
||||
if (ferror( sitesFile ))
|
||||
wrn( "Error while reading configuration file:\n %s: %d\n", operation->sitesPath, ferror( sitesFile ) );
|
||||
wrn( "Error while reading configuration file:\n %s: %d", operation->sitesPath, ferror( sitesFile ) );
|
||||
fclose( sitesFile );
|
||||
|
||||
// Parse file.
|
||||
@@ -478,12 +484,13 @@ void cli_user(Arguments *args, Operation *operation) {
|
||||
MPMarshalFormat sitesInputFormat = args->sitesFormat? operation->sitesFormat: sitesInputInfo->format;
|
||||
MPMarshalError marshalError = { .type = MPMarshalSuccess };
|
||||
mpw_marshal_info_free( &sitesInputInfo );
|
||||
mpw_marshal_free( &operation->user );
|
||||
operation->user = mpw_marshal_read( sitesInputData, sitesInputFormat, operation->masterPassword, &marshalError );
|
||||
if (marshalError.type == MPMarshalErrorMasterPassword && operation->allowPasswordUpdate) {
|
||||
// Update master password in mpsites.
|
||||
while (marshalError.type == MPMarshalErrorMasterPassword) {
|
||||
inf( "Given master password does not match configuration.\n" );
|
||||
inf( "To update the configuration with this new master password, first confirm the old master password.\n" );
|
||||
inf( "Given master password does not match configuration." );
|
||||
inf( "To update the configuration with this new master password, first confirm the old master password." );
|
||||
|
||||
const char *importMasterPassword = NULL;
|
||||
while (!importMasterPassword || !strlen( importMasterPassword ))
|
||||
@@ -495,21 +502,21 @@ void cli_user(Arguments *args, Operation *operation) {
|
||||
}
|
||||
if (operation->user) {
|
||||
mpw_free_string( &operation->user->masterPassword );
|
||||
operation->user->masterPassword = strdup( operation->masterPassword );
|
||||
operation->user->masterPassword = mpw_strdup( operation->masterPassword );
|
||||
}
|
||||
}
|
||||
mpw_free_string( &sitesInputData );
|
||||
|
||||
// Incorrect master password.
|
||||
if (marshalError.type == MPMarshalErrorMasterPassword) {
|
||||
ftl( "Incorrect master password according to configuration:\n %s: %s\n", operation->sitesPath, marshalError.description );
|
||||
ftl( "Incorrect master password according to configuration:\n %s: %s", operation->sitesPath, marshalError.description );
|
||||
cli_free( args, operation );
|
||||
exit( EX_DATAERR );
|
||||
}
|
||||
|
||||
// Any other parse error.
|
||||
if (!operation->user || marshalError.type != MPMarshalSuccess) {
|
||||
err( "Couldn't parse configuration file:\n %s: %s\n", operation->sitesPath, marshalError.description );
|
||||
err( "Couldn't parse configuration file:\n %s: %s", operation->sitesPath, marshalError.description );
|
||||
cli_free( args, operation );
|
||||
exit( EX_DATAERR );
|
||||
}
|
||||
@@ -534,7 +541,7 @@ void cli_site(Arguments __unused *args, Operation *operation) {
|
||||
// If no site from mpsites, create a new one.
|
||||
if (!operation->site)
|
||||
operation->site = mpw_marshal_site(
|
||||
operation->user, operation->siteName, MPResultTypeDefault, MPCounterValueDefault, operation->user->algorithm );
|
||||
operation->user, operation->siteName, operation->user->defaultType, MPCounterValueDefault, operation->user->algorithm );
|
||||
}
|
||||
|
||||
void cli_question(Arguments __unused *args, Operation *operation) {
|
||||
@@ -550,7 +557,7 @@ void cli_question(Arguments __unused *args, Operation *operation) {
|
||||
case MPKeyPurposeRecovery:
|
||||
for (size_t q = 0; !operation->question && q < operation->site->questions_count; ++q)
|
||||
if ((!operation->keyContext && !strlen( (&operation->site->questions[q])->keyword )) ||
|
||||
(operation->keyContext && strcmp( (&operation->site->questions[q])->keyword, operation->keyContext ) != 0))
|
||||
(operation->keyContext && strcmp( (&operation->site->questions[q])->keyword, operation->keyContext ) == 0))
|
||||
operation->question = &operation->site->questions[q];
|
||||
|
||||
// If no question from mpsites, create a new one.
|
||||
@@ -562,7 +569,8 @@ void cli_question(Arguments __unused *args, Operation *operation) {
|
||||
|
||||
void cli_operation(Arguments __unused *args, Operation *operation) {
|
||||
|
||||
operation->identicon = mpw_identicon( operation->user->fullName, operation->user->masterPassword );
|
||||
mpw_free_string( &operation->identicon );
|
||||
operation->identicon = mpw_identicon_str( mpw_identicon( operation->user->fullName, operation->user->masterPassword ) );
|
||||
|
||||
if (!operation->site)
|
||||
abort();
|
||||
@@ -571,23 +579,23 @@ void cli_operation(Arguments __unused *args, Operation *operation) {
|
||||
case MPKeyPurposeAuthentication: {
|
||||
operation->purposeResult = "password";
|
||||
operation->resultType = operation->site->type;
|
||||
operation->resultState = operation->site->content? strdup( operation->site->content ): NULL;
|
||||
operation->resultState = operation->site->content? mpw_strdup( operation->site->content ): NULL;
|
||||
operation->siteCounter = operation->site->counter;
|
||||
break;
|
||||
}
|
||||
case MPKeyPurposeIdentification: {
|
||||
operation->purposeResult = "login";
|
||||
operation->resultType = operation->site->loginType;
|
||||
operation->resultState = operation->site->loginContent? strdup( operation->site->loginContent ): NULL;
|
||||
operation->resultState = operation->site->loginContent? mpw_strdup( operation->site->loginContent ): NULL;
|
||||
operation->siteCounter = MPCounterValueInitial;
|
||||
break;
|
||||
}
|
||||
case MPKeyPurposeRecovery: {
|
||||
mpw_free_string( &operation->keyContext );
|
||||
operation->purposeResult = "answer";
|
||||
operation->keyContext = operation->question->keyword? strdup( operation->question->keyword ): NULL;
|
||||
operation->keyContext = operation->question->keyword? mpw_strdup( operation->question->keyword ): NULL;
|
||||
operation->resultType = operation->question->type;
|
||||
operation->resultState = operation->question->content? strdup( operation->question->content ): NULL;
|
||||
operation->resultState = operation->question->content? mpw_strdup( operation->question->content ): NULL;
|
||||
operation->siteCounter = MPCounterValueInitial;
|
||||
break;
|
||||
}
|
||||
@@ -603,7 +611,7 @@ void cli_resultType(Arguments *args, Operation *operation) {
|
||||
|
||||
operation->resultType = mpw_typeWithName( args->resultType );
|
||||
if (ERR == (int)operation->resultType) {
|
||||
ftl( "Invalid type: %s\n", args->resultType );
|
||||
ftl( "Invalid type: %s", args->resultType );
|
||||
cli_free( args, operation );
|
||||
exit( EX_USAGE );
|
||||
}
|
||||
@@ -632,7 +640,7 @@ void cli_siteCounter(Arguments *args, Operation *operation) {
|
||||
|
||||
long long int siteCounterInt = atoll( args->siteCounter );
|
||||
if (siteCounterInt < MPCounterValueFirst || siteCounterInt > MPCounterValueLast) {
|
||||
ftl( "Invalid site counter: %s\n", args->siteCounter );
|
||||
ftl( "Invalid site counter: %s", args->siteCounter );
|
||||
cli_free( args, operation );
|
||||
exit( EX_USAGE );
|
||||
}
|
||||
@@ -653,7 +661,8 @@ void cli_resultParam(Arguments *args, Operation *operation) {
|
||||
if (!args->resultParam)
|
||||
return;
|
||||
|
||||
operation->resultParam = strdup( args->resultParam );
|
||||
mpw_free_string( &operation->resultParam );
|
||||
operation->resultParam = mpw_strdup( args->resultParam );
|
||||
}
|
||||
|
||||
void cli_algorithmVersion(Arguments *args, Operation *operation) {
|
||||
@@ -665,7 +674,7 @@ void cli_algorithmVersion(Arguments *args, Operation *operation) {
|
||||
|
||||
int algorithmVersionInt = atoi( args->algorithmVersion );
|
||||
if (algorithmVersionInt < MPAlgorithmVersionFirst || algorithmVersionInt > MPAlgorithmVersionLast) {
|
||||
ftl( "Invalid algorithm version: %s\n", args->algorithmVersion );
|
||||
ftl( "Invalid algorithm version: %s", args->algorithmVersion );
|
||||
cli_free( args, operation );
|
||||
exit( EX_USAGE );
|
||||
}
|
||||
@@ -678,7 +687,7 @@ void cli_sitesRedacted(Arguments *args, Operation *operation) {
|
||||
operation->user->redacted = strcmp( args->sitesRedacted, "1" ) == 0;
|
||||
|
||||
else if (!operation->user->redacted)
|
||||
wrn( "Sites configuration is not redacted. Use -R 1 to change this.\n" );
|
||||
wrn( "Sites configuration is not redacted. Use -R 1 to change this." );
|
||||
}
|
||||
|
||||
void cli_mpw(Arguments *args, Operation *operation) {
|
||||
@@ -686,13 +695,15 @@ void cli_mpw(Arguments *args, Operation *operation) {
|
||||
if (!operation->site)
|
||||
abort();
|
||||
|
||||
inf( "%s's %s for %s:\n[ %s ]: ", operation->user->fullName, operation->purposeResult, operation->site->name, operation->identicon );
|
||||
if (mpw_verbosity >= inf_level)
|
||||
fprintf( stderr, "%s's %s for %s:\n[ %s ]: ",
|
||||
operation->user->fullName, operation->purposeResult, operation->site->name, operation->identicon );
|
||||
|
||||
// Determine master key.
|
||||
MPMasterKey masterKey = mpw_masterKey(
|
||||
operation->user->fullName, operation->user->masterPassword, operation->site->algorithm );
|
||||
if (!masterKey) {
|
||||
ftl( "Couldn't derive master key.\n" );
|
||||
ftl( "Couldn't derive master key." );
|
||||
cli_free( args, operation );
|
||||
exit( EX_SOFTWARE );
|
||||
}
|
||||
@@ -703,7 +714,7 @@ void cli_mpw(Arguments *args, Operation *operation) {
|
||||
if (!(operation->resultState = mpw_siteState( masterKey, operation->site->name, operation->siteCounter,
|
||||
operation->keyPurpose, operation->keyContext, operation->resultType, operation->resultParam,
|
||||
operation->site->algorithm ))) {
|
||||
ftl( "Couldn't encrypt site result.\n" );
|
||||
ftl( "Couldn't encrypt site result." );
|
||||
mpw_free( &masterKey, MPMasterKeySize );
|
||||
cli_free( args, operation );
|
||||
exit( EX_SOFTWARE );
|
||||
@@ -713,18 +724,18 @@ void cli_mpw(Arguments *args, Operation *operation) {
|
||||
switch (operation->keyPurpose) {
|
||||
case MPKeyPurposeAuthentication: {
|
||||
mpw_free_string( &operation->site->content );
|
||||
operation->site->content = strdup( operation->resultState );
|
||||
operation->site->content = mpw_strdup( operation->resultState );
|
||||
break;
|
||||
}
|
||||
case MPKeyPurposeIdentification: {
|
||||
mpw_free_string( &operation->site->loginContent );
|
||||
operation->site->loginContent = strdup( operation->resultState );
|
||||
operation->site->loginContent = mpw_strdup( operation->resultState );
|
||||
break;
|
||||
}
|
||||
|
||||
case MPKeyPurposeRecovery: {
|
||||
mpw_free_string( &operation->question->content );
|
||||
operation->question->content = strdup( operation->resultState );
|
||||
operation->question->content = mpw_strdup( operation->resultState );
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -735,20 +746,21 @@ void cli_mpw(Arguments *args, Operation *operation) {
|
||||
|
||||
// resultParam defaults to state.
|
||||
if (!operation->resultParam && operation->resultState)
|
||||
operation->resultParam = strdup( operation->resultState );
|
||||
operation->resultParam = mpw_strdup( operation->resultState );
|
||||
|
||||
// Generate result.
|
||||
const char *result = mpw_siteResult( masterKey, operation->site->name, operation->siteCounter,
|
||||
operation->keyPurpose, operation->keyContext, operation->resultType, operation->resultParam, operation->site->algorithm );
|
||||
mpw_free( &masterKey, MPMasterKeySize );
|
||||
if (!result) {
|
||||
ftl( "Couldn't generate site result.\n" );
|
||||
ftl( "Couldn't generate site result." );
|
||||
cli_free( args, operation );
|
||||
exit( EX_SOFTWARE );
|
||||
}
|
||||
fflush( NULL );
|
||||
fprintf( stdout, "%s\n", result );
|
||||
if (operation->site->url)
|
||||
inf( "See: %s\n", operation->site->url );
|
||||
inf( "See: %s", operation->site->url );
|
||||
mpw_free_string( &result );
|
||||
|
||||
// Update usage metadata.
|
||||
@@ -763,22 +775,24 @@ void cli_save(Arguments __unused *args, Operation *operation) {
|
||||
|
||||
if (!operation->sitesFormatFixed)
|
||||
operation->sitesFormat = MPMarshalFormatDefault;
|
||||
|
||||
mpw_free_string( &operation->sitesPath );
|
||||
operation->sitesPath = mpw_path( operation->user->fullName, mpw_marshal_format_extension( operation->sitesFormat ) );
|
||||
dbg( "Updating: %s (%s)\n", operation->sitesPath, mpw_nameForFormat( operation->sitesFormat ) );
|
||||
dbg( "Updating: %s (%s)", operation->sitesPath, mpw_nameForFormat( operation->sitesFormat ) );
|
||||
|
||||
FILE *sitesFile = NULL;
|
||||
if (!operation->sitesPath || !mpw_mkdirs( operation->sitesPath ) || !(sitesFile = fopen( operation->sitesPath, "w" ))) {
|
||||
wrn( "Couldn't create updated configuration file:\n %s: %s\n", operation->sitesPath, strerror( errno ) );
|
||||
wrn( "Couldn't create updated configuration file:\n %s: %s", operation->sitesPath, strerror( errno ) );
|
||||
return;
|
||||
}
|
||||
|
||||
char *buf = NULL;
|
||||
MPMarshalError marshalError = { .type = MPMarshalSuccess };
|
||||
if (!mpw_marshal_write( &buf, operation->sitesFormat, operation->user, &marshalError ) || marshalError.type != MPMarshalSuccess)
|
||||
wrn( "Couldn't encode updated configuration file:\n %s: %s\n", operation->sitesPath, marshalError.description );
|
||||
wrn( "Couldn't encode updated configuration file:\n %s: %s", operation->sitesPath, marshalError.description );
|
||||
|
||||
else if (fwrite( buf, sizeof( char ), strlen( buf ), sitesFile ) != strlen( buf ))
|
||||
wrn( "Error while writing updated configuration file:\n %s: %d\n", operation->sitesPath, ferror( sitesFile ) );
|
||||
wrn( "Error while writing updated configuration file:\n %s: %d", operation->sitesPath, ferror( sitesFile ) );
|
||||
|
||||
mpw_free_string( &buf );
|
||||
fclose( sitesFile );
|
||||
|
||||
@@ -75,7 +75,7 @@ xmlNodePtr mpw_xmlTestCaseNode(xmlNodePtr testCaseNode, const char *nodeName) {
|
||||
}
|
||||
}
|
||||
|
||||
err( "Missing parent: %s, for case: %s\n", parentId, mpw_xmlTestCaseString( testCaseNode, "id" ) );
|
||||
err( "Missing parent: %s, for case: %s", parentId, mpw_xmlTestCaseString( testCaseNode, "id" ) );
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,13 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define ftl(...) do { fprintf( stderr, __VA_ARGS__ ); exit(2); } while (0)
|
||||
#ifndef mpw_log_do
|
||||
#define mpw_log_do(level, format, ...) ({ \
|
||||
fprintf( stderr, format "\n", ##__VA_ARGS__ ); \
|
||||
if (level == ftl_level) \
|
||||
abort(); \
|
||||
})
|
||||
#endif
|
||||
|
||||
#include "mpw-algorithm.h"
|
||||
#include "mpw-util.h"
|
||||
@@ -32,7 +38,7 @@ int main(int argc, char *const argv[]) {
|
||||
|
||||
xmlNodePtr tests = xmlDocGetRootElement( xmlParseFile( "mpw_tests.xml" ) );
|
||||
if (!tests) {
|
||||
ftl( "Couldn't find test case: mpw_tests.xml\n" );
|
||||
ftl( "Couldn't find test case: mpw_tests.xml" );
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -60,7 +66,7 @@ int main(int argc, char *const argv[]) {
|
||||
do {
|
||||
fprintf( stdout, "test case %s... ", id );
|
||||
if (!xmlStrlen( result )) {
|
||||
fprintf( stdout, "abstract.\n" );
|
||||
fprintf( stdout, "abstract." );
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -68,7 +74,7 @@ int main(int argc, char *const argv[]) {
|
||||
MPMasterKey masterKey = mpw_masterKey(
|
||||
(char *)fullName, (char *)masterPassword, algorithm );
|
||||
if (!masterKey) {
|
||||
ftl( "Couldn't derive master key.\n" );
|
||||
ftl( "Couldn't derive master key." );
|
||||
abort();
|
||||
}
|
||||
|
||||
@@ -85,7 +91,7 @@ int main(int argc, char *const argv[]) {
|
||||
masterKey, (char *)siteName, siteCounter, keyPurpose, (char *)keyContext, resultType, NULL, algorithm );
|
||||
mpw_free( &masterKey, MPMasterKeySize );
|
||||
if (!testResult) {
|
||||
ftl( "Couldn't derive site password.\n" );
|
||||
ftl( "Couldn't derive site password." );
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,12 +19,12 @@ git show --show-signature --pretty=format:%H --quiet "$tag" > TAG
|
||||
{ git ls-files -z .; printf '%s\0' VERSION TAG; } | xargs -0 tar -Lcvzf "$mpwArchive"
|
||||
|
||||
echo "Creating archive signature $mpwArchive.sig .."
|
||||
gpg --detach-sign "$mpwArchive"
|
||||
gpg --detach-sign --local-user 5C2D1D61853F20F2FCDDCCB70EF21226F43EA6BC "$mpwArchive"
|
||||
|
||||
echo "Installing archive and signature in current site .."
|
||||
cd ../../public/site/current
|
||||
mv "../../../platform-independent/cli-c/$mpwArchive" .; [[ -e $_ ]]
|
||||
mv "../../../platform-independent/cli-c/$mpwArchive.sig" .; [[ -e $_ ]]
|
||||
echo "Installing archive and signature in site .."
|
||||
cd ../../public/site
|
||||
mv "$OLDPWD/$mpwArchive" .; [[ -e $_ ]]
|
||||
mv "$OLDPWD/$mpwArchive.sig" .; [[ -e $_ ]]
|
||||
ln -sf "$mpwArchive" "masterpassword-cli.tar.gz"; [[ -e $_ ]]
|
||||
ln -sf "$mpwArchive.sig" "masterpassword-cli.tar.gz.sig"; [[ -e $_ ]]
|
||||
|
||||
|
||||
@@ -261,7 +261,10 @@ chr() {
|
||||
# Outputs the decimal ASCII value of the given character.
|
||||
#
|
||||
ord() {
|
||||
printf '%d' "'$1"
|
||||
local str=$1 s
|
||||
for (( s=0; s < ${#str}; ++s )); do
|
||||
printf '%d' "'${str:s:1}"
|
||||
done
|
||||
} # _____________________________________________________________________
|
||||
|
||||
|
||||
@@ -274,7 +277,10 @@ ord() {
|
||||
# Outputs the hexadecimal ASCII value of the given character.
|
||||
#
|
||||
hex() {
|
||||
printf '%x' "'$1"
|
||||
local str=$1 s
|
||||
for (( s=0; s < ${#str}; ++s )); do
|
||||
printf '%02X' "'${str:s:1}"
|
||||
done
|
||||
} # _____________________________________________________________________
|
||||
|
||||
|
||||
@@ -287,7 +293,10 @@ hex() {
|
||||
# Outputs the character that has the given hexadecimal ASCII value.
|
||||
#
|
||||
unhex() {
|
||||
printf "\\x$1"
|
||||
local hex=$1 h
|
||||
for (( h=0; h < ${#hex}; h+=2 )); do
|
||||
printf "\\x${hex:h:2}"
|
||||
done
|
||||
} # _____________________________________________________________________
|
||||
|
||||
|
||||
@@ -1422,6 +1431,29 @@ shorten() {
|
||||
|
||||
|
||||
|
||||
# ______________________________________________________________________
|
||||
# |__ CdSource ________________________________________________________________|
|
||||
#
|
||||
# cdsource [file]
|
||||
#
|
||||
# Change the current directory into the directory where the file is located, resolving symlinks.
|
||||
#
|
||||
cdsource() {
|
||||
local source=${1:-${BASH_SOURCE[1]}}
|
||||
|
||||
while [[ $source ]]; do
|
||||
[[ $source = */* ]] && cd "${source%/*}"
|
||||
|
||||
if [[ -L ${source##*/} ]]; then
|
||||
source=$(readlink "${source##*/}")
|
||||
else
|
||||
source=
|
||||
fi
|
||||
done
|
||||
} # _____________________________________________________________________
|
||||
|
||||
|
||||
|
||||
# ______________________________________________________________________
|
||||
# |__ Up ________________________________________________________________|
|
||||
#
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
source bashlib
|
||||
cdsource
|
||||
|
||||
getword() {
|
||||
local cat=$1 pop_limit=$2 words=()
|
||||
@@ -19,9 +21,7 @@ declare -A categoryByCharacter=(
|
||||
['v']=verb
|
||||
)
|
||||
templates=(
|
||||
nvan
|
||||
anvr
|
||||
anavan
|
||||
ran # ~32.0 bit
|
||||
)
|
||||
permutations=1
|
||||
|
||||
|
||||
@@ -61,10 +61,9 @@
|
||||
</footer>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
|
||||
<script>document.write('<script src="js/vendor/jquery-2.1.1.min.js"><\/script>')</script>
|
||||
<script>window.jQuery || document.write('<script src="js/vendor/jquery-2.1.1.js"><\/script>')</script>
|
||||
<script>window.jQuery || document.write('<script src="js/vendor/jquery-2.1.1.min.js"><\/script>')</script>
|
||||
<script src="js/dependencies.js?3"></script>
|
||||
<script src="js/dependencies.js?4"></script>
|
||||
<script src="js/main.js?3"></script>
|
||||
</body>
|
||||
|
||||
|
||||
@@ -16,11 +16,12 @@ if ((!window.crypto || !window.crypto.subtle) && window.SubtleCrypto)
|
||||
|
||||
// If Web Crypto API is not supported we include a JS crypto library
|
||||
// https://code.google.com/p/crypto-js/
|
||||
/* Disabled by default. Enable manually if your browser requires this.
|
||||
if (!window.crypto || !window.crypto.subtle) {
|
||||
document.write("<script src=https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/hmac-sha256.js><\/script>");
|
||||
document.write("<script src=https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/pbkdf2.js><\/script>");
|
||||
document.write("<script src=https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/lib-typedarrays-min.js><\/script>");
|
||||
}
|
||||
}/**/
|
||||
|
||||
if (!Number.MAX_SAFE_INTEGER)
|
||||
Number.MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;
|
||||
|
||||
1
public/site
Submodule
@@ -1 +0,0 @@
|
||||
../../Press/MasterPassword_PressKit.zip
|
||||
@@ -1,445 +0,0 @@
|
||||
<!DOCTYPE HTML>
|
||||
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>Master Password — Securing your online life.</title>
|
||||
|
||||
<link rel="icon" href="images/resources/favicon.png" type="image/x-png" />
|
||||
<link rel="shortcut icon" href="images/resources/favicon.png" type="image/x-png" />
|
||||
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
|
||||
<meta name="apple-itunes-app" content="app-id=510296984" />
|
||||
|
||||
<link rel='stylesheet' type='text/css' href='http://fonts.googleapis.com/css?family=Exo:100,400,600,900,100italic,400italic,600italic' />
|
||||
<link rel="stylesheet" type="text/css" href="css/ml-shadows.css" />
|
||||
<link rel="stylesheet" type="text/css" href="css/screen.css" />
|
||||
|
||||
<script src="js/jquery-1.6.1.min.js" type="text/javascript"></script>
|
||||
<script src="js/functions.js" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$(window).scroll(function() {
|
||||
if ($(window).scrollTop() > 100) {
|
||||
$(".appstore").show();
|
||||
$("header .appstore").hide();
|
||||
} else {
|
||||
$(".appstore").hide();
|
||||
$("header .appstore").show();
|
||||
}
|
||||
})
|
||||
});
|
||||
</script>
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-90535-15']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
var is_ssl = ("https:" == document.location.protocol);
|
||||
var asset_host = is_ssl ? "https://d3rdqalhjaisuu.cloudfront.net/" : "http://d3rdqalhjaisuu.cloudfront.net/";
|
||||
document.write(unescape("%3Cscript src='" + asset_host + "javascripts/feedback-v2.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script>
|
||||
|
||||
<!-- Get Satisfaction -->
|
||||
<!--script type="text/javascript" charset="utf-8">
|
||||
var is_ssl = ("https:" == document.location.protocol);
|
||||
var asset_host = is_ssl ? "https://d3rdqalhjaisuu.cloudfront.net/" : "http://d3rdqalhjaisuu.cloudfront.net/";
|
||||
document.write(unescape("%3Cscript src='" + asset_host + "javascripts/feedback-v2.js' type='text/javascript'%3E%3C/script%3E"));
|
||||
</script>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
var feedback_widget_options = {};
|
||||
feedback_widget_options.display = "overlay";
|
||||
feedback_widget_options.company = "lyndir";
|
||||
feedback_widget_options.placement = "right";
|
||||
feedback_widget_options.color = "#222";
|
||||
feedback_widget_options.style = "question";
|
||||
var feedback_widget = new GSFN.feedback_widget(feedback_widget_options);
|
||||
</script-->
|
||||
|
||||
<!-- UserEcho -->
|
||||
<script type='text/javascript'>
|
||||
var _ues = {
|
||||
host:'support.lyndir.com',
|
||||
forum:'13031',
|
||||
lang:'en',
|
||||
tab_icon_show:false,
|
||||
tab_corner_radius:5,
|
||||
tab_font_size:20,
|
||||
tab_image_hash:'RmVlZGJhY2s%3D',
|
||||
tab_alignment:'right',
|
||||
tab_text_color:'#FFFFFF',
|
||||
tab_bg_color:'#DDDDDD',
|
||||
tab_hover_color:'#CCCCCC'
|
||||
};
|
||||
|
||||
(function() {
|
||||
var _ue = document.createElement('script'); _ue.type = 'text/javascript'; _ue.async = true;
|
||||
_ue.src = ('https:' == document.location.protocol ? 'https://s3.amazonaws.com/' : 'http://') + 'cdn.userecho.com/js/widget-1.4.gz.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(_ue, s);
|
||||
})();
|
||||
</script>
|
||||
|
||||
<!-- jQuery -->
|
||||
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script>
|
||||
|
||||
<!-- Page JS -->
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
$(window).scroll(function() {
|
||||
if ($(window).scrollTop() > 100) {
|
||||
$(".appstore").show();
|
||||
$("header .appstore").hide();
|
||||
} else {
|
||||
$(".appstore").hide();
|
||||
$("header .appstore").show();
|
||||
}
|
||||
});
|
||||
$(".tip.appstore").hide().delay(1000).fadeIn();
|
||||
$(".tip.phone").hide();
|
||||
$("#sendtophone").mouseenter(function() {
|
||||
$(".tip.phone").fadeIn();
|
||||
});
|
||||
$("#sendtophone").mouseleave(function() {
|
||||
$(".tip.phone").fadeOut();
|
||||
});
|
||||
$("#sendtophone").submit(function() {
|
||||
$.ajax({
|
||||
url: "http://masterpassword.lyndir.com/send.php",
|
||||
data: {
|
||||
destination: $(this).find("input[type='text']").val(),
|
||||
},
|
||||
cache: false,
|
||||
});
|
||||
|
||||
goog_report_conversion('index-sendtophone');
|
||||
_gaq.push(['_trackPageview', '/outbound/sendtophone']);
|
||||
|
||||
$("#sendtophone .field").hide();
|
||||
$("#sendtophone .confirm").show();
|
||||
return false;
|
||||
});
|
||||
$("#sendtophone .field").show();
|
||||
$("#sendtophone .confirm").hide();
|
||||
});
|
||||
</script>
|
||||
|
||||
<!-- AdWords -->
|
||||
<script type="text/javascript">
|
||||
/* <![CDATA[ */
|
||||
goog_snippet_vars = function() {
|
||||
var w = window;
|
||||
w.google_conversion_id = 1015576061;
|
||||
w.google_conversion_label = "PcXqCPPz5AIQ_euh5AM";
|
||||
w.google_conversion_value = 4;
|
||||
}
|
||||
goog_report_conversion = function(url) {
|
||||
goog_snippet_vars();
|
||||
window.google_conversion_format = "3";
|
||||
window.google_is_call = true;
|
||||
var opt = new Object();
|
||||
opt.onload_callback = function() {
|
||||
if (typeof(url) != 'undefined') {
|
||||
window.location = url;
|
||||
}
|
||||
}
|
||||
var conv_handler = window['google_trackConversion'];
|
||||
if (typeof(conv_handler) == 'function') {
|
||||
conv_handler(opt);
|
||||
}
|
||||
}
|
||||
/* ]]> */
|
||||
</script>
|
||||
<script type="text/javascript" src="http://www.googleadservices.com/pagead/conversion_async.js"></script>
|
||||
|
||||
<!-- Google +1 -->
|
||||
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<a class="badge appstore" href="http://itunes.apple.com/app/id510296984" onclick="goog_report_conversion('index-fixed-header');_gaq.push(['_trackPageview', '/outbound/itunes']);"><img src="img/appstore.png" /></a>
|
||||
<header>
|
||||
|
||||
<div class="badge appstore">
|
||||
<a href="http://itunes.apple.com/app/id510296984" onclick="goog_report_conversion('index-top-header');_gaq.push(['_trackPageview', '/outbound/itunes']);">
|
||||
<!--span class="tip appstore">Great feedback may earn you a free copy for a friend!</span-->
|
||||
<img src="img/appstore.png" />
|
||||
</a><br />
|
||||
<form id="sendtophone">
|
||||
<span class="field">
|
||||
Or send to your phone:<br />
|
||||
<input type="text" name="email" placeholder="E-mail or phone number" />
|
||||
<span class="tip phone">Phone needs country code (eg. +1 for US/CA, +44 for UK)</span>
|
||||
</span>
|
||||
<span class="confirm">
|
||||
Message sent!
|
||||
</span>
|
||||
</form>
|
||||
</div>
|
||||
<h1><a href="."><img class="logo" src="img/iTunesArtwork-Bare.png" /> Master Password</a></h1>
|
||||
<div class="footnote"><a href="mailto:masterpassword+remove_this@lyndir.com" onclick="_gaq.push(['_trackPageview', '/outbound/mail']);">Contact</a> | <a href="http://www.lyndir.com" onclick="_gaq.push(['_trackPageview', '/outbound/lyndir.com']);">Lyndir</a> | <a href="https://plus.google.com/116256327773442623984/about" rel="publisher" onclick="_gaq.push(['_trackPageview', '/outbound/google+']);">Google+</a></div>
|
||||
<div class="divider"></div>
|
||||
|
||||
</header>
|
||||
<div id="fixedheader">
|
||||
<h2><a href=".">Master Password</a></h2>
|
||||
</div>
|
||||
<!--a href="http://bit.ly/vNN5Zi" onclick="_gaq.push(['_trackPageview', '/outbound/testflight']);" id="ribbon"></a-->
|
||||
|
||||
<section class="heading">
|
||||
<div>
|
||||
<h1>So how does it work? <div class="g-plusone" data-annotation="none" data-href="http://masterpassword.lyndir.com/algorithm.html"></div></h1>
|
||||
|
||||
<p>
|
||||
The theory behind Master Password is simple. The user remembers a single, secure password. The user only ever uses that password to log into the Master Password application. This master password is then used as a seed to generate a different password based on the name of the site to generate a password for.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The result is that each master password generates its own unique sequence of passwords for any site name. Since the only input data is the master password and the site name (along with a password counter, see below), there is no need for any kind of storage to recreate a site's password. All that's needed is the correct master password and the correct algorithm implementation. What that does for you is make it almost impossible to lose your passwords. It also makes it nearly impossible for hackers to steal your online identity.
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h1>The Algorithm</h1>
|
||||
|
||||
<p>
|
||||
Master Password uses a stateless algorithm that relies solely on its implementation and the user's inputs. The user is expected to remember the following information:
|
||||
<ul>
|
||||
<li><strong>The master password</strong> (eg. <em>pink fluffy door frame</em>):<br />
|
||||
This is a secret that the user shares with nobody.</li>
|
||||
<li><strong>The site name</strong> (eg. <em>apple.com</em>):<br />
|
||||
The user chooses a name for each site. Its domain name is an ideal choice, since it needn't necessarily be remembered.</li>
|
||||
<li><strong>The site's password counter</strong> (default: <em>0</em>):<br />
|
||||
This is an integer that can be incremented when the user needs a new password for the site.</li>
|
||||
<li><strong>The site's password type</strong> (default: <em>Long Password</em>):<br />
|
||||
This type determines the format of the output password. It can be changed if the site's password policy does not accept passwords of this format.</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
In short, the algorithm is comprised of the following steps:
|
||||
<ul>
|
||||
<li>Determining the master <code>key</code></li>
|
||||
<li>Determining the template <code>seed</code></li>
|
||||
<li>Encoding a user-friendly <code>password</code></li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
A note on types:
|
||||
<ul>
|
||||
<li>Any character string is UTF-8 de- or encoded, depending on context.</li>
|
||||
<li>Any number is converted to 32-bit network byte order.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<h2>The Master Password</h2>
|
||||
<p>
|
||||
The user chooses a single master password, preferably sufficiently long to harden against brute-force attacks. Master Password recommends absurd three or four-word sentences as they're easily remembered and generally sufficiently high in entropy.
|
||||
</p>
|
||||
<p>
|
||||
The application then creates a <a href="http://www.tarsnap.com/scrypt.html" onclick="_gaq.push(['_trackPageview', '/outbound/tarsnap.com/scrypt.html">scrypt</a> key derivative from the user's password. This process takes quite a bit of processing time and memory. This step exists to make brute-force attempts at guessing the master password from a given output password <strong>far more difficult</strong>, to practically infeasible, even for otherwise vulnerable password strings.
|
||||
</p>
|
||||
<code><pre>
|
||||
key = scrypt( P, S, N, r, p, dkLen )
|
||||
where
|
||||
P = master password
|
||||
S = "com.lyndir.masterpassword" . name length . name
|
||||
N = 32768
|
||||
r = 8
|
||||
p = 2
|
||||
dkLen = 64
|
||||
</pre></code>
|
||||
|
||||
<p>
|
||||
The result is a 64-byte <code>key</code> derived from the user's master password. This key will be fed into the rest of the algorithm to produce output passwords that are as private to the user as their master password is.
|
||||
</p>
|
||||
|
||||
<h2>Combining The Inputs</h2>
|
||||
<p>
|
||||
The theory behind Master Password requires that all inputs are given by the user. The two main inputs are the master password that we used to determine the <code>key</code> and the site's name. There is a third input value, the password counter, which is a 32-bit unsigned integer value. Initially, the password counter should be zero, but a user may specify a non-zero counter value in case he wants to force the algorithm to produce a new output password for the site.
|
||||
</p>
|
||||
<p>
|
||||
These input values are combined in a byte array, separated by a single <code>NUL</code> byte. In order, the input values are the <code>site name</code>, the master <code>key</code>, and a <code>counter</code>. The byte array is hashed using the HMAC-SHA-256 algorithm to yield the <code>seed</code> as a result.
|
||||
</p>
|
||||
<code><pre>
|
||||
seed = hmac-sha256( key, "com.lyndir.masterpassword" . site name length . site name . counter )
|
||||
</pre></code>
|
||||
|
||||
<h2>Generating The Output</h2>
|
||||
<p>
|
||||
We now have a <code>seed</code> which is a sufficiently long seemingly-arbitrary string of bytes that is unique to the site and the user. This string of bytes, however, is not very useful for a user to use as a password. We have two additional problems that need to be solved: The output password must be easy for a user to read and type in using a keyboard or smartphone, but it should also be compatible with most site's password policies.
|
||||
</p>
|
||||
<p>
|
||||
Password policies are strict rules imposed by applications on their users, designed to limit the types of passwords these users are allowed to use with the application. Usually, these policies exist to force users into thinking about passwords with a healthy entropy. Often, they exist purely as a side-effect of bad password handling such as storing the clear-text passwords in a database.
|
||||
</p>
|
||||
<p>
|
||||
Since the idea is that the output password can be used directly as a password to protect the user's account on the site, it needs to be able to pass the site's password policy.
|
||||
Master Password addresses this problem by introducing <em>password types</em>. Each password type describes what an output password must look like and maps to a set of <code>templates</code>. Templates describe the resulting output password using a series of characters that map to character groups of candidate output characters. A template has the same length as the output password it yields. Each character in the template maps to a specific character group. At each position of the output password, a character is chosen from the character group identified by the character in the template at the same position.
|
||||
</p>
|
||||
<p>
|
||||
The following templates are defined:
|
||||
<ul>
|
||||
<li><p>
|
||||
Type: <strong>Maximum Security Password</strong>
|
||||
<ul>
|
||||
<li><code>anoxxxxxxxxxxxxxxxxx</li></code>
|
||||
<li><code>axxxxxxxxxxxxxxxxxno</li></code>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Type: <strong>Long Password</strong>
|
||||
<ul>
|
||||
<li><code>CvcvnoCvcvCvcv</li></code>
|
||||
<li><code>CvcvCvcvnoCvcv</li></code>
|
||||
<li><code>CvcvCvcvCvcvno</li></code>
|
||||
<li><code>CvccnoCvcvCvcv</li></code>
|
||||
<li><code>CvccCvcvnoCvcv</li></code>
|
||||
<li><code>CvccCvcvCvcvno</li></code>
|
||||
<li><code>CvcvnoCvccCvcv</li></code>
|
||||
<li><code>CvcvCvccnoCvcv</li></code>
|
||||
<li><code>CvcvCvccCvcvno</li></code>
|
||||
<li><code>CvcvnoCvcvCvcc</li></code>
|
||||
<li><code>CvcvCvcvnoCvcc</li></code>
|
||||
<li><code>CvcvCvcvCvccno</li></code>
|
||||
<li><code>CvccnoCvccCvcv</li></code>
|
||||
<li><code>CvccCvccnoCvcv</li></code>
|
||||
<li><code>CvccCvccCvcvno</li></code>
|
||||
<li><code>CvcvnoCvccCvcc</li></code>
|
||||
<li><code>CvcvCvccnoCvcc</li></code>
|
||||
<li><code>CvcvCvccCvccno</li></code>
|
||||
<li><code>CvccnoCvcvCvcc</li></code>
|
||||
<li><code>CvccCvcvnoCvcc</li></code>
|
||||
<li><code>CvccCvcvCvccno</li></code>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Type: <strong>Medium Password</strong>
|
||||
<ul>
|
||||
<li><code>CvcnoCvc</code></li>
|
||||
<li><code>CvcCvcno</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Type: <strong>Short Password</strong>
|
||||
<ul>
|
||||
<li><code>Cvcn</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Type: <strong>Basic Password</strong>
|
||||
<ul>
|
||||
<li><code>aaanaaan</code></li>
|
||||
<li><code>aannaaan</code></li>
|
||||
<li><code>aaannaaa</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Type: <strong>PIN</strong>
|
||||
<ul>
|
||||
<li><code>nnnn</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
Where each of the letters above expand any of the characters in their respective character group:
|
||||
<ul>
|
||||
<li><p>Template character: <code>V</code>
|
||||
<ul>
|
||||
<li><code>AEIOU</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Template character: <code>C</code>
|
||||
<ul>
|
||||
<li><code>BCDFGHJKLMNPQRSTVWXYZ</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Template character: <code>v</code>
|
||||
<ul>
|
||||
<li><code>aeiou</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Template character: <code>c</code>
|
||||
<ul>
|
||||
<li><code>bcdfghjklmnpqrstvwxyz</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Template character: <code>A</code> (<code>= V . C</code>)
|
||||
<ul>
|
||||
<li><code>AEIOUBCDFGHJKLMNPQRSTVWXYZ</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Template character: <code>a</code> (<code>= V . v . C . c</code>)
|
||||
<ul>
|
||||
<li><code>AEIOUaeiouBCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Template character: <code>n</code>
|
||||
<ul>
|
||||
<li><code>0123456789</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Template character: <code>o</code>
|
||||
<ul>
|
||||
<li><code>@&%?,=[]_:-+*$#!'^~;()/.</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
<li><p>Template character: <code>X</code> (<code>= a . n . o</code>)
|
||||
<ul>
|
||||
<li><code>AEIOUaeiouBCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz0123456789@&%?,=[]_:-+*$#!'^~;()/.</code></li>
|
||||
</ul>
|
||||
</p></li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
By default, Master Password uses the <em>Long Password</em> type for any new passwords. The user is able to choose a different password type, which is normally only done if the site's password policy is incompatible with the output password produced by this type.
|
||||
</p>
|
||||
<p>
|
||||
To create the output password, the bytes in the <code>seed</code> are encoded according to the template. The first <code>seed</code> byte is used to determine which of the type's templates to use for encoding an output password. We take the byte value of the first <code>seed</code> byte modulo the amount of templates set for the chosen password type and use the result as a zero-based index in the template list for the password type.
|
||||
</p>
|
||||
<code><pre>
|
||||
templates = [ "CvcvCvcvnoCvcv", "CvcvnoCvcvCvcv", "CvcvCvcvCvcvno", ... ]
|
||||
template = templates[ seed[0] % count( templates ) ]
|
||||
</pre></code>
|
||||
<p>
|
||||
Now that we know what template to use for building our output password, all that's left is to iterate the template, and produce a character of password output for each step. When we iterate the template (index <code>i</code>), we look in the character group identified by the character (string <code>passChars</code>) in the template at index <code>i</code>.
|
||||
</p>
|
||||
<p>
|
||||
We use the <code>seed</code>'s byte value at index <code>i + 1</code> modulo the amount of characters in the character class to determine which character (<code>passChar</code>) in the class to use for the output password at index <code>i</code>.
|
||||
</p>
|
||||
<code><pre>
|
||||
passChar = passChars[ seed[i + 1] % count( passChars ) ]
|
||||
passWord[i] = passChar
|
||||
</pre></code>
|
||||
|
||||
<hr />
|
||||
<a class="next" href="https://github.com/Lyndir/MasterPassword">Show me the code!</a>
|
||||
|
||||
</section>
|
||||
|
||||
<span itemscope itemtype="http://schema.org/MobileSoftwareApplication">
|
||||
<meta itemprop="image" content="http://masterpassword.lyndir.com/img/iTunesArtwork-Rounded.png" />
|
||||
<meta itemprop="name" content="Master Password" />
|
||||
<meta itemprop="operatingsystems" content="iOS" />
|
||||
<meta itemprop="softwareversion" content="5.0" />
|
||||
|
||||
<span itemprop="offers" itemscope itemtype="http://schema.org/Offer">
|
||||
<meta itemprop="name" content="iOS" />
|
||||
<meta itemprop="price" content="5.99" />
|
||||
<meta itemprop="priceCurrency" content="USD" />
|
||||
<span itemprop="seller" itemscope itemtype="http://schema.org/Organization">
|
||||
<meta itemprop="name" content="Apple" />
|
||||
<meta itemprop="url" content="http://itunes.apple.com/app/id510296984" />
|
||||
</span>
|
||||
</span>
|
||||
<span itemprop="author" itemscope itemtype="http://schema.org/Organization">
|
||||
<meta itemprop="name" content="Lyndir" />
|
||||
<meta itemprop="url" content="http://www.lyndir.com" />
|
||||
</span>
|
||||
</span>
|
||||
|
||||
<footer>
|
||||
Master Password is a security and productivity product by <a href="http://www.lyndir.com" rel="author" onclick="_gaq.push(['_trackPageview', '/outbound/lyndir.com']);">Lyndir</a>, © 2011.
|
||||
</footer>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,114 +0,0 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<link rel="stylesheet" href="buttons.css" type="text/css" charset="utf-8" />
|
||||
|
||||
<style type="text/css">
|
||||
body{
|
||||
background: #fff;
|
||||
font-family: "Helvetica Neue", Helvetica, Arial, Verdana, sans-serif;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 30px 10px;
|
||||
color: #333;
|
||||
}
|
||||
.clear {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
ul li {
|
||||
float: left;
|
||||
display: inline-block;
|
||||
margin: 0 20px 0 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
<title>CSS Button Kit</title>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<h1>Small Buttons</h1>
|
||||
|
||||
<ul class="smallbuttons">
|
||||
<li><a href="#" class="btn_smallwhite">Button</a></li>
|
||||
<li><a href="#" class="btn_smallblack">Button</a></li>
|
||||
<li><a href="#" class="btn_smallblue">Button</a></li>
|
||||
<li><a href="#" class="btn_smallgreen">Button</a></li>
|
||||
<li><a href="#" class="btn_smallred">Button</a></li>
|
||||
<li><a href="#" class="btn_smallorange">Button</a></li>
|
||||
<li><a href="#" class="btn_smallpurple">Button</a></li>
|
||||
</ul>
|
||||
|
||||
<br class="clear" />
|
||||
|
||||
<ul class="smallbuttons">
|
||||
<li><a href="#" class="btn_smallwhite ico_action"> Action</a></li>
|
||||
<li><a href="#" class="btn_smallblack ico_box"> Download</a></li>
|
||||
<li><a href="#" class="btn_smallblue ico_email"> Email</a></li>
|
||||
<li><a href="#" class="btn_smallgreen ico_folder"> Folder</a></li>
|
||||
<li><a href="#" class="btn_smallred ico_heart"> Like</a></li>
|
||||
<li><a href="#" class="btn_smallorange ico_collection"> Collections</a></li>
|
||||
<li><a href="#" class="btn_smallpurple ico_eye"> View</a></li>
|
||||
</ul>
|
||||
|
||||
<br class="clear" />
|
||||
|
||||
<h1>Medium Buttons</h1>
|
||||
|
||||
<ul class="mediumbuttons">
|
||||
<li><a href="#" class="btn_mediumwhite"> Button</a></li>
|
||||
<li><a href="#" class="btn_mediumblack">Button</a></li>
|
||||
<li><a href="#" class="btn_mediumgray1">Button</a></li>
|
||||
<li><a href="#" class="btn_mediumgray2">Button</a></li>
|
||||
<li><a href="#" class="btn_mediumgray3">Button</a></li>
|
||||
</ul>
|
||||
|
||||
<br class="clear" />
|
||||
|
||||
<ul class="mediumbuttons">
|
||||
<li><a href="#" class="btn_mediumwhite ico_file"> Document</a></li>
|
||||
<li><a href="#" class="btn_mediumblack ico_chart"> Stats</a></li>
|
||||
<li><a href="#" class="btn_mediumgray1 ico_locked"> Lock</a></li>
|
||||
<li><a href="#" class="btn_mediumgray2 ico_music"> Music</a></li>
|
||||
<li><a href="#" class="btn_mediumgray3 ico_print"> Print</a></li>
|
||||
</ul>
|
||||
|
||||
<br class="clear" />
|
||||
|
||||
<h1>Large Buttons</h1>
|
||||
|
||||
<ul class="largebuttons">
|
||||
<li><a href="#" class="btn_largewhite">Button</a></li>
|
||||
<li><a href="#" class="btn_largeblack">Button</a></li>
|
||||
<li><a href="#" class="btn_largegray">Button</a></li>
|
||||
<li><a href="#" class="btn_largeblue">Button</a></li>
|
||||
<li><a href="#" class="btn_largered">Button</a></li>
|
||||
<li><a href="#" class="btn_largegreen">Button</a></li>
|
||||
</ul>
|
||||
|
||||
<br class="clear" /><br/>
|
||||
|
||||
<ul class="largebuttons">
|
||||
<li><a href="#" class="btn_largewhite ico_playvideo"> Watch</a></li>
|
||||
<li><a href="#" class="btn_largeblack ico_search"> Search</a></li>
|
||||
<li><a href="#" class="btn_largegray ico_tel"> Call</a></li>
|
||||
<li><a href="#" class="btn_largeblue ico_user"> Login</a></li>
|
||||
<li><a href="#" class="btn_largered ico_settings1"> Settings</a></li>
|
||||
<li><a href="#" class="btn_largegreen ico_link"> Link</a></li>
|
||||
</ul>
|
||||
|
||||
<br class="clear" />
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,141 +0,0 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
This is a custom SVG webfont generated by Font Squirrel.
|
||||
Copyright : Copyright MediaLoot 2011
|
||||
Designer : Tony Thomas
|
||||
Foundry : MediaLoot
|
||||
Foundry URL : httpwwwmedialootcom
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="SignifyLiteRegular" horiz-adv-x="2048" >
|
||||
<font-face units-per-em="2048" ascent="1638" descent="-410" />
|
||||
<missing-glyph horiz-adv-x="512" />
|
||||
<glyph unicode=" " horiz-adv-x="512" />
|
||||
<glyph unicode="	" horiz-adv-x="512" />
|
||||
<glyph unicode=" " horiz-adv-x="512" />
|
||||
<glyph unicode="!" />
|
||||
<glyph unicode=""" />
|
||||
<glyph unicode="#" />
|
||||
<glyph unicode="$" />
|
||||
<glyph unicode="%" />
|
||||
<glyph unicode="&" />
|
||||
<glyph unicode="'" />
|
||||
<glyph unicode="(" />
|
||||
<glyph unicode=")" />
|
||||
<glyph unicode="*" />
|
||||
<glyph unicode="+" />
|
||||
<glyph unicode="," />
|
||||
<glyph unicode="-" />
|
||||
<glyph unicode="." />
|
||||
<glyph unicode="/" />
|
||||
<glyph unicode="0" />
|
||||
<glyph unicode="1" horiz-adv-x="1816" d="M121 786l788 787l787 -787h-492v-786h-590v786h-493z" />
|
||||
<glyph unicode="2" horiz-adv-x="1734" d="M80 494v589h788v492l787 -787l-787 -786v492h-788z" />
|
||||
<glyph unicode="3" horiz-adv-x="1742" d="M84 782h491v787h590v-787h494l-787 -786z" />
|
||||
<glyph unicode="4" horiz-adv-x="1794" d="M111 793l786 786v-492h786v-589h-786v-492z" />
|
||||
<glyph unicode="5" horiz-adv-x="1429" d="M113 8v1204l1204 -604z" />
|
||||
<glyph unicode="6" horiz-adv-x="1574" d="M147 4v1278h482v-1278h-482zM946 4v1278h481v-1278h-481z" />
|
||||
<glyph unicode="7" horiz-adv-x="1591" d="M115 -8v1360h1362v-1360h-1362z" />
|
||||
<glyph unicode="8" d="M184 16v240v360h240v-360h960v295l388 -387l-388 -387v239h-960h-240zM276 1067l388 389v-242h960h240v-239v-359h-240v359h-960v-295z" />
|
||||
<glyph unicode="9" horiz-adv-x="1677" d="M162 481v1035h1034l-311 -312q14 -6 40.5 -19.5t99.5 -65.5t138.5 -117.5t141 -178t125 -243.5t73 -319.5t2.5 -399.5q-25 47 -69.5 121.5t-173.5 260t-250 315.5t-272.5 210t-268.5 23z" />
|
||||
<glyph unicode=":" />
|
||||
<glyph unicode=";" />
|
||||
<glyph unicode="<" horiz-adv-x="1931" d="M160 707l919 708v-534l693 534v-1417l-693 534v-534z" />
|
||||
<glyph unicode="=" />
|
||||
<glyph unicode=">" horiz-adv-x="1976" d="M182 -6v1417l692 -534v534l920 -709l-920 -708v534z" />
|
||||
<glyph unicode="?" />
|
||||
<glyph unicode="@" />
|
||||
<glyph unicode="A" horiz-adv-x="2029" d="M111 -2v227v905v113v113h790v-226h-565v-905h1358v226h225v-226v-227h-225h-1583zM1024 315q-6 68 -6 133q0 415 262 672q98 96 188 135l-208 215h659v-718l-184 219q-35 17 -74 17q-26 0 -52 -8q-67 -19 -135.5 -75.5t-134 -130.5t-123 -154.5t-100.5 -148.5t-67 -111z " />
|
||||
<glyph unicode="B" horiz-adv-x="1792" d="M154 6v1010h1484v-1010h-1484zM154 1130l227 343h438v-343h-665zM973 1130v343h438l227 -343h-665z" />
|
||||
<glyph unicode="C" horiz-adv-x="1863" d="M129 811q0 334 235.5 568.5t567.5 234.5t567.5 -234.5t235.5 -568.5q0 -332 -235.5 -567.5t-567.5 -235.5t-567.5 235.5t-235.5 567.5zM330 811q0 -250 177 -426t425 -176t425 176t177 426t-177 426t-425 176t-425 -176t-177 -426zM590 819q0 190 100 291 q100 102 285 102q150 0 227 -57q82 -57 123 -180l-207 -47q-12 35 -24 51q-18 27 -47 43q-29 14 -66 14q-80 0 -123 -65q-33 -49 -33 -150q0 -125 39 -174q39 -47 109 -47q68 0 102 37q35 39 51 111l207 -62q-20 -84 -65 -145q-49 -61 -113 -88q-66 -31 -168 -31 q-125 0 -205 37q-80 35 -135 127q-57 90 -57 233z" />
|
||||
<glyph unicode="D" horiz-adv-x="1900" d="M152 793q0 330 234.5 564t563.5 234q190 0 348 -77.5t253.5 -198.5t146.5 -257t51 -265q0 -332 -234.5 -565.5t-564.5 -233.5q-332 0 -565 236.5t-233 562.5zM352 793q0 -193 111 -349l833 836q-156 111 -346 111q-248 0 -423 -175t-175 -423zM604 303q156 -111 346 -110 q248 0 423 176t175 424q0 190 -110 346z" />
|
||||
<glyph unicode="E" horiz-adv-x="2426" d="M106 14v1420v104h2214v-1524h-2214zM244 256l618 573l-618 465v-1038zM309 1399l924 -676l924 676h-1848zM324 154h1736l-563 618l-268 -199l-266 189zM1587 834l596 -641v1101z" />
|
||||
<glyph unicode="F" horiz-adv-x="2351" d="M170 10v1094h2011v-1094h-2011zM170 1233v88l88 262h786l89 -262h1048v-88h-2011z" />
|
||||
<glyph unicode="G" horiz-adv-x="2177" d="M166 -6l2 971l342 872h1149l350 -872l2 -971h-1845zM342 1010h1495l-252 710h-999zM467 1128v80h1227v-80h-1227zM569 1331v80h1039v-80h-1039zM643 1526v80h889v-80h-889zM756 381h665v237h-665v-237z" />
|
||||
<glyph unicode="H" horiz-adv-x="1933" d="M133 1102q0 178 137.5 303t331.5 125q223 0 365 -162q141 162 364 162q195 0 332 -125t137 -303q0 -10 -2 -30.5t-18.5 -86t-45 -134.5t-91 -172.5t-146.5 -203.5t-222 -224t-308 -241q-233 160 -405.5 331t-250.5 301t-123 237.5t-49 164.5z" />
|
||||
<glyph unicode="I" horiz-adv-x="2330" d="M121 758q348 365 842 465q123 25 202 24q23 0 65 -3t167 -29.5t244.5 -72.5t278.5 -146.5t290 -237.5q-131 -137 -287 -238.5t-285 -147.5t-238.5 -73t-170.5 -29l-64 -4q-23 0 -64.5 3t-166.5 30t-245 73t-278.5 147.5t-289.5 238.5zM774 758q0 -154 113.5 -261.5 t277.5 -107.5t277.5 107.5t113.5 261.5q0 152 -114.5 260t-276 108t-276.5 -108t-115 -260zM1034 758q0 51 39 87t92.5 36t92 -36t38.5 -87t-38.5 -87t-92 -36t-92.5 36t-39 87z" />
|
||||
<glyph unicode="J" horiz-adv-x="1712" d="M154 4v1182l577 629h828v-1811h-1405zM307 154h1118v1525h-610v-589h-508v-936z" />
|
||||
<glyph unicode="K" horiz-adv-x="2177" d="M168 119v526q0 55 38 94t93 39h262q55 0 94 -39t39 -94v-526q0 -53 -39 -92t-94 -39h-262q-55 0 -93 39t-38 92zM825 119v1581q0 53 39 92t92 39h265q53 0 92 -39t39 -92v-1581q0 -53 -39 -92t-92 -39h-265q-53 0 -92 39t-39 92zM1483 119v921q0 55 39 94.5t94 39.5h262 q55 0 93 -39t38 -95v-921q0 -53 -38 -92t-93 -39h-262q-55 0 -94 39t-39 92z" />
|
||||
<glyph unicode="L" horiz-adv-x="1728" d="M188 104v1012q0 47 34 81t79 34h21q16 209 170.5 353.5t365.5 144.5t364.5 -144.5t170.5 -353.5h32q45 0 80 -34t35 -81v-1012q0 -47 -33.5 -81.5t-81.5 -34.5h-1124q-45 0 -79 34.5t-34 81.5zM469 1231h776q-16 147 -126.5 248.5t-260.5 101.5q-152 0 -262.5 -101.5 t-126.5 -248.5zM680 670q0 -106 100 -168v-226h197v226q96 59 96 168q0 82 -58.5 139t-140.5 57q-80 0 -137 -57t-57 -139z" />
|
||||
<glyph unicode="M" horiz-adv-x="1972" d="M147 293q0 123 110 209t267 86q160 0 160 -27v778v269q0 23 16.5 38t38.5 15h1030q23 0 39.5 -15.5t16.5 -37.5v-269v-1073h-2q-16 -94 -107.5 -181t-226.5 -87q-156 0 -265.5 87t-109.5 208q0 123 109.5 209t265.5 86q162 0 162 -27v692h-793v-960v-27h-2 q-14 -94 -106.5 -181t-225.5 -87q-156 0 -266.5 87t-110.5 208z" />
|
||||
<glyph unicode="N" horiz-adv-x="2121" d="M166 309v383v193v-127v127h256v770h127h1282h127v-129v-1409v-129h-127h-1409v8q-111 23 -183.5 109.5t-72.5 203.5zM293 309q0 -61 36 -110t93 -70v-12h1409v1409h-1282v-1280h-127v512h-129v-66v-190v-193zM678 246v127h897v-127h-897zM678 502v127h768v-127h-768z M678 758v127h1024v-127h-1024zM678 1014v383h512v-383h-512zM1319 1014v127h256v-127h-256zM1319 1270v127h383v-127h-383z" />
|
||||
<glyph unicode="O" horiz-adv-x="1900" d="M119 834q0 346 243.5 588.5t587.5 242.5t588 -242.5t244 -588.5q0 -344 -244 -588t-588 -244t-587.5 244t-243.5 588zM258 813q14 -41 37.5 -81t57.5 -91t48 -76q10 -14 15.5 -32.5t4.5 -29.5l-3 -35q-2 -24 -2 -32v-2q-1 -6 -1 -11q0 -38 25 -63q14 -18 45 -48.5 t52.5 -57.5t31.5 -57l4 -2q68 -41 170 -74q6 0 24.5 7t78.5 11v2q0 8 20.5 19.5t52 27t46.5 25.5q19 22 18 43q0 28 -36 52q-43 29 -83 29q-18 0 -35 -5q-25 16 -96 80.5t-121 85.5q-23 20 -64.5 33.5t-75.5 20.5t-59.5 31.5t-25.5 67.5q-4 16 0 24.5t-5 22t-10 17.5 t-13.5 15t-15.5 14.5t-17.5 13.5t-16.5 12q-4 12 -3 23q0 38 44 59q22 10 41 10q28 0 47 -22q16 -16 17 -43q29 2 69.5 56t73.5 60q12 10 44 13.5t47.5 10.5t0.5 34q8 8 32 18l38 17q14 6 22.5 24.5t-12.5 42.5q-12 55 -60 69q-9 3 -18 2q-35 0 -53 -46q-8 -3 -15 -3 q-26 0 -30 38v10q0 48 35 74q18 14 43 8q27 -2 38 10t4 27.5t-26 23.5q0 6 -4 2q-16 6 -20 4q-25 16 -22 44t18.5 54.5t14.5 53t-36 39.5q-285 -244 -358 -396q-24 -71 -25 -201q0 -34 2 -73zM449 702q-7 -3 -8 -7q0 -9 24 -23q16 -20 35 -15q8 31 -25 39v2q-2 2 -7 2t-7 2 h-12zM590 909l2 -4h2q6 2 10 6q-8 0 -14 -2zM725 1546q38 3 74 3q136 0 223 -44q8 -27 36.5 -35t57.5 -5t50.5 -8t19.5 -40l4 -4l2 -10q2 -2 2 4q50 -50 50 -69q0 -11 -18 -11h-5h-4q-35 4 -46 -30q-4 -14 -4 -29q0 -22 9 -46q14 -42 41 -55q25 -10 41 -4t13 25.5t-28 32.5 q-2 23 12 22q27 -2 52 -43q10 -18 10 -31q0 -16 -14 -26q-4 -4 -7 -4l-2 -2q-37 -27 -40 -114t-9 -103q-9 -19 -9 -32q0 -20 26 -22h4q36 0 57 35q10 18 4 41q-8 23 6.5 35t36 15t35.5 10.5t4 23.5q21 -11 35 -11q27 0 31 40q1 9 1 17q0 42 -26 69q10 43 33 16q20 -29 6 -59 q2 -10 5 -16.5t10 -12.5t11.5 -8t15.5 -6t13 -6q2 0 4 -2q20 -8 21 -27q0 -13 -10 -31q-24 -81 -116 -81q-27 0 -61 7q-31 -12 -51 -40.5t-38.5 -68.5t-30.5 -58q-44 -80 -44 -140q0 -58 42 -98q25 -23 51 -28t54 6.5t47.5 23.5t45.5 33q10 1 19 1q57 0 71 -59q5 -19 5 -35 q0 -45 -31 -81q-4 -16 -4 -19q180 211 180 482l-6 86q-7 -4 -15 -5q-23 0 -49 37q-20 29 -6 27q8 0 29 -16q20 4 30 12q-12 70 -36 135l-11.5 12t-9.5 11q0 4 -1 12t-1 14v2q-92 188 -273.5 304t-398.5 116q-41 0 -61 -2q-20 -4 -33 -6h-12q-66 -11 -119 -27zM752 1201 q-3 -15 -4 -27q0 -24 14 -33q20 8 29.5 39.5t2 59.5t-29.5 26q-2 0 -6 -1t-6 -1q10 -17 0 -63zM762 973q-10 -2 -10 -7q0 -7 20 -20h16q2 -2 -4 -8q25 18 11.5 28.5t-33.5 6.5zM862 1331l6 6q18 8 11 23q-2 4 -11 4q-2 2 -8 2q-2 0 -5 -1t-5 -1q-21 -4 -21 -21q0 -33 33 -12 zM853 1315q-9 -13 -9 -27q0 -20 18 -41q18 -25 6 -53.5t-11 -59t36 -40.5q10 25 42 64.5t48 74.5q10 21 10 44q0 14 -4 30q-11 46 -55 46q-7 0 -14 -1q-45 -6 -67 -37zM1196 1087q-8 0 -8 -4q0 -6 14 -20q-12 -31 15 -33q18 0 30 19q2 16 -17 28q-17 11 -30 11q-2 -1 -4 -1z " />
|
||||
<glyph unicode="P" horiz-adv-x="2043" d="M160 322v968h432v215v109h106h754v-109v-215h432v-968h-432v-109h-106v-109v-106h-648h-106v106v218h-432zM483 537h109v215h106v-215v-215v-218h432v218h107h109v215v215h106v-215h217v323h-1186v-323zM698 1290h648v215h-648v-215zM1452 1075h217v109h-217v-109z" />
|
||||
<glyph unicode="Q" horiz-adv-x="2095" d="M152 334v1122q0 47 32.5 79t77.5 32h1571q47 0 79 -32t32 -79v-1122q0 -47 -32 -79t-79 -32h-1571q-45 0 -77.5 32t-32.5 79zM375 446h1345v897h-1345v-897zM487 55.5q0 22.5 16.5 39t39.5 16.5h1009q23 0 39.5 -16.5t16.5 -39t-16.5 -40t-39.5 -17.5h-1009 q-23 0 -39.5 17.5t-16.5 40zM823 559v672l449 -336z" />
|
||||
<glyph unicode="R" horiz-adv-x="1847" d="M125 811q0 330 234.5 564.5t564 234.5t564 -234.5t234.5 -564.5q0 -332 -234.5 -565.5t-564 -233.5t-564 233.5t-234.5 565.5zM326 811q0 -248 175 -424t422.5 -176t423 176t175.5 424t-175.5 423t-423 175t-422.5 -175t-175 -423zM625 512v598h336q90 0 143 -16 q51 -14 80 -60q31 -43 30 -106q0 -53 -22 -94q-27 -41 -64 -64q-29 -16 -71 -25q33 -10 53 -24q23 -23 31 -35q25 -33 28 -41l54 -133h-199l-92 143q-31 47 -37 52q-20 14 -49 14h-19l-4 -209h-198zM823 811h86q18 0 54 8q20 6 32 21q12 18 13 104q0 35 -21 49 q-16 16 -74 17h-90v-199z" />
|
||||
<glyph unicode="S" horiz-adv-x="1953" d="M137 993.5q0 270.5 190.5 461t460.5 190.5q268 0 460 -190.5t192 -461.5q0 -188 -101 -344q20 -10 39 -26l406 -406q33 -33 33 -80t-33 -82q-33 -33 -82 -32.5t-82 32.5l-406 406q-10 12 -16 26q-182 -145 -410 -145q-270 0 -460.5 190.5t-190.5 461zM338 993.5 q0 -186.5 132 -318.5t318 -132q160 0 283 100l57 47l41 66q70 111 70 237q0 186 -132 318.5t-318.5 132.5t-318.5 -132t-132 -318.5z" />
|
||||
<glyph unicode="T" horiz-adv-x="2066" d="M164 1642l196 197l494 -491l-197 -197l-82 82q2 -74 75 -204t210 -267q215 -215 461 -293l25 -8l-99 98l199 197l491 -492l-196 -198q-72 -72 -187 -73q-113 0 -267 70q-310 141 -646 480q-303 303 -436 620q-77 184 -77 315q0 94 40 160z" />
|
||||
<glyph unicode="U" horiz-adv-x="2420" d="M160 -41v356h2q0 2 -2 7v4q0 37 20 73q6 10 65.5 42t126.5 63l126 57q59 27 61 29q57 27 151.5 59.5t155 61t92.5 67.5q-8 76 -84.5 256t-82.5 291l-2 42q0 177 79 312q88 152 258 213h84h84q170 -61 258 -213q79 -136 79 -312q0 -21 -1 -42q-6 -111 -83 -291t-85 -256 q33 -39 93.5 -67.5t154.5 -61.5t152 -59q2 -2 61 -29l126 -57q67 -31 126 -62.5t66 -42.5q20 -37 20 -73v-4q-2 -4 -2 -7h2v-356h-20h-1031h-1030h-20z" />
|
||||
<glyph unicode="V" horiz-adv-x="1996" d="M139 6v1837h1719v-1837h-1719zM225 80h172v145h-172v-145zM225 299h172v147h-172v-147zM225 520h172v148h-172v-148zM225 741h172v146h-172v-146zM225 961h172v147h-172v-147zM225 1182h172v147h-172v-147zM225 1401h172v147h-172v-147zM225 1622h172v147h-172v-147z M483 80h1030v807h-1030v-807zM483 961h1030v808h-1030v-808zM1599 80h173v145h-173v-145zM1599 299h173v147h-173v-147zM1599 520h173v148h-173v-148zM1599 741h173v146h-173v-146zM1599 961h173v147h-173v-147zM1599 1182h173v147h-173v-147zM1599 1401h173v147h-173v-147z M1599 1622h173v147h-173v-147z" />
|
||||
<glyph unicode="W" horiz-adv-x="2418" d="M82 1130q229 252 529 383.5t630 131.5q315 0 595 -136.5t501 -378.5l-213 -233q-383 449 -889 449q-264 0 -505 -117t-435 -332zM434 743q152 166 354.5 253t422 87t421 -87t353.5 -253l-213 -233q-270 299 -562 299q-295 0 -565 -299zM961 278.5q0 112.5 73 194.5 q72 80 175.5 80t174.5 -80q74 -82 74 -194.5t-74 -192.5q-72 -82 -175 -82t-175 82q-73 80 -73 192.5z" />
|
||||
<glyph unicode="X" horiz-adv-x="1931" d="M152 229l585 584l-585 586l229 227l586 -584l583 584l230 -227l-586 -586l586 -584l-230 -229l-583 584l-586 -584z" />
|
||||
<glyph unicode="Y" horiz-adv-x="2101" d="M150 1364l288 -287l342 90l92 344l-286 287q36 5 71 5q80 0 158 -25q113 -37 199 -123q141 -141 147 -340l-176 -178q-53 -53 -53 -127q0 -41 16 -80l-131 -131l-10 10q-73 -24 -150 -24q-59 0 -119 14q-140 33 -243 135q-86 86 -124 200q-26 79 -26 160q0 35 5 70z M268 -6l121 362l174 19l549 549l-43 43q-16 16 -16 43q0 25 16 41l80 79l516 519q18 16 44 16t42 -16l170 -172q18 -16 18 -42t-18 -42l-596 -598q-16 -16 -42 -16.5t-44 16.5l-41 43l-211 -209l-338 -340l-20 -174zM1073 543l131 133q37 -18 78 -18q15 0 31 2q57 9 98 51 l80 80l369 -369q10 -8 26 -25q70 -70 70 -168t-69.5 -167.5t-168 -69.5t-168.5 69q-10 10 -22 27zM1587 260q0 -43 29 -72q31 -31 73 -30.5t70 30.5q31 29 31 72t-31 72q-29 29 -70.5 28.5t-72.5 -28.5q-29 -29 -29 -72z" />
|
||||
<glyph unicode="Z" horiz-adv-x="1525" d="M182 -23l582 928h-465l1044 928l-464 -696h464z" />
|
||||
<glyph unicode="[" />
|
||||
<glyph unicode="\" />
|
||||
<glyph unicode="]" />
|
||||
<glyph unicode="^" />
|
||||
<glyph unicode="_" />
|
||||
<glyph unicode="`" />
|
||||
<glyph unicode="a" />
|
||||
<glyph unicode="b" />
|
||||
<glyph unicode="c" />
|
||||
<glyph unicode="d" />
|
||||
<glyph unicode="e" />
|
||||
<glyph unicode="f" />
|
||||
<glyph unicode="g" />
|
||||
<glyph unicode="h" />
|
||||
<glyph unicode="i" />
|
||||
<glyph unicode="j" />
|
||||
<glyph unicode="k" />
|
||||
<glyph unicode="l" />
|
||||
<glyph unicode="m" />
|
||||
<glyph unicode="n" />
|
||||
<glyph unicode="o" />
|
||||
<glyph unicode="p" />
|
||||
<glyph unicode="q" />
|
||||
<glyph unicode="r" />
|
||||
<glyph unicode="s" />
|
||||
<glyph unicode="t" />
|
||||
<glyph unicode="u" />
|
||||
<glyph unicode="v" />
|
||||
<glyph unicode="w" />
|
||||
<glyph unicode="x" />
|
||||
<glyph unicode="y" />
|
||||
<glyph unicode="z" />
|
||||
<glyph unicode="{" />
|
||||
<glyph unicode="|" />
|
||||
<glyph unicode="}" />
|
||||
<glyph unicode="~" horiz-adv-x="1720" d="M204 393.5q-7 145.5 89 259.5l188 228q37 41 88 80q-45 88 -28.5 195.5t88.5 193.5l186 227q61 74 147.5 110.5t174.5 28.5q94 -8 170 -69l96 -82q109 -86 115 -240q4 -137 -91 -254l-188 -227q-39 -45 -88 -78q31 -68 31 -137q6 -139 -90 -254l-189 -228 q-59 -74 -144 -110.5t-175 -28.5q-98 10 -170 72l-97 80q-106 88 -113 233.5zM400 411.5q-1 -63.5 42 -100.5l99 -80q25 -20 61 -24q86 -10 150 67l188 228q45 51 45 123q-4 49 -31 80h-10q-16 -33 -48 -48.5t-67 -7.5q-39 10 -60 45t-11 74l-4 2l-6 6l-41 33 q-37 -14 -72 -55l-189 -226q-45 -53 -46 -116.5zM735 1117.5q-4 -58.5 31 -97.5h37q4 0 10 -2t8 -2l21 74q10 41 46 60t75 9q39 -8 59 -44t10 -77l-28 -114l10 -9q41 18 71 56l189 227q49 55 45 123q-4 57 -41 92l-98 80q-27 20 -62 27q-86 6 -149 -70l-189 -225 q-41 -49 -45 -107.5z" />
|
||||
<glyph unicode="­" />
|
||||
<glyph unicode="²" horiz-adv-x="1734" d="M80 494v589h788v492l787 -787l-787 -786v492h-788z" />
|
||||
<glyph unicode="³" horiz-adv-x="1742" d="M84 782h491v787h590v-787h494l-787 -786z" />
|
||||
<glyph unicode="¹" horiz-adv-x="1816" d="M121 786l788 787l787 -787h-492v-786h-590v786h-493z" />
|
||||
<glyph unicode="À" horiz-adv-x="2029" d="M111 -2v227v905v113v113h790v-226h-565v-905h1358v226h225v-226v-227h-225h-1583zM1024 315q-6 68 -6 133q0 415 262 672q98 96 188 135l-208 215h659v-718l-184 219q-35 17 -74 17q-26 0 -52 -8q-67 -19 -135.5 -75.5t-134 -130.5t-123 -154.5t-100.5 -148.5t-67 -111z " />
|
||||
<glyph unicode="Â" horiz-adv-x="2029" d="M111 -2v227v905v113v113h790v-226h-565v-905h1358v226h225v-226v-227h-225h-1583zM1024 315q-6 68 -6 133q0 415 262 672q98 96 188 135l-208 215h659v-718l-184 219q-35 17 -74 17q-26 0 -52 -8q-67 -19 -135.5 -75.5t-134 -130.5t-123 -154.5t-100.5 -148.5t-67 -111z " />
|
||||
<glyph unicode="Ã" horiz-adv-x="2029" d="M933 2175.5q-7 145.5 89 259.5l188 228q37 41 88 80q-45 88 -28.5 195.5t88.5 193.5l186 227q61 74 147.5 110.5t174.5 28.5q94 -8 170 -69l96 -82q109 -86 115 -240q4 -137 -91 -254l-188 -227q-39 -45 -88 -78q31 -68 31 -137q6 -139 -90 -254l-189 -228 q-59 -74 -144 -110.5t-175 -28.5q-98 10 -170 72l-97 80q-106 88 -113 233.5zM1129 2193.5q-1 -63.5 42 -100.5l99 -80q25 -20 61 -24q86 -10 150 67l188 228q45 51 45 123q-4 49 -31 80h-10q-16 -33 -48 -48.5t-67 -7.5q-39 10 -60 45t-11 74l-4 2l-6 6l-41 33 q-37 -14 -72 -55l-189 -226q-45 -53 -46 -116.5zM1464 2899.5q-4 -58.5 31 -97.5h37q4 0 10 -2t8 -2l21 74q10 41 46 60t75 9q39 -8 59 -44t10 -77l-28 -114l10 -9q41 18 71 56l189 227q49 55 45 123q-4 57 -41 92l-98 80q-27 20 -62 27q-86 6 -149 -70l-189 -225 q-41 -49 -45 -107.5zM111 -2v227v905v113v113h790v-226h-565v-905h1358v226h225v-226v-227h-225h-1583zM1024 315q-6 68 -6 133q0 415 262 672q98 96 188 135l-208 215h659v-718l-184 219q-35 17 -74 17q-26 0 -52 -8q-67 -19 -135.5 -75.5t-134 -130.5t-123 -154.5 t-100.5 -148.5t-67 -111z" />
|
||||
<glyph unicode="È" horiz-adv-x="2426" d="M106 14v1420v104h2214v-1524h-2214zM244 256l618 573l-618 465v-1038zM309 1399l924 -676l924 676h-1848zM324 154h1736l-563 618l-268 -199l-266 189zM1587 834l596 -641v1101z" />
|
||||
<glyph unicode="Ê" horiz-adv-x="2426" d="M106 14v1420v104h2214v-1524h-2214zM244 256l618 573l-618 465v-1038zM309 1399l924 -676l924 676h-1848zM324 154h1736l-563 618l-268 -199l-266 189zM1587 834l596 -641v1101z" />
|
||||
<glyph unicode="Ì" horiz-adv-x="2330" d="M121 758q348 365 842 465q123 25 202 24q23 0 65 -3t167 -29.5t244.5 -72.5t278.5 -146.5t290 -237.5q-131 -137 -287 -238.5t-285 -147.5t-238.5 -73t-170.5 -29l-64 -4q-23 0 -64.5 3t-166.5 30t-245 73t-278.5 147.5t-289.5 238.5zM774 758q0 -154 113.5 -261.5 t277.5 -107.5t277.5 107.5t113.5 261.5q0 152 -114.5 260t-276 108t-276.5 -108t-115 -260zM1034 758q0 51 39 87t92.5 36t92 -36t38.5 -87t-38.5 -87t-92 -36t-92.5 36t-39 87z" />
|
||||
<glyph unicode="Î" horiz-adv-x="2330" d="M121 758q348 365 842 465q123 25 202 24q23 0 65 -3t167 -29.5t244.5 -72.5t278.5 -146.5t290 -237.5q-131 -137 -287 -238.5t-285 -147.5t-238.5 -73t-170.5 -29l-64 -4q-23 0 -64.5 3t-166.5 30t-245 73t-278.5 147.5t-289.5 238.5zM774 758q0 -154 113.5 -261.5 t277.5 -107.5t277.5 107.5t113.5 261.5q0 152 -114.5 260t-276 108t-276.5 -108t-115 -260zM1034 758q0 51 39 87t92.5 36t92 -36t38.5 -87t-38.5 -87t-92 -36t-92.5 36t-39 87z" />
|
||||
<glyph unicode="Ñ" horiz-adv-x="2121" d="M534 2175.5q-7 145.5 89 259.5l188 228q37 41 88 80q-45 88 -28.5 195.5t88.5 193.5l186 227q61 74 147.5 110.5t174.5 28.5q94 -8 170 -69l96 -82q109 -86 115 -240q4 -137 -91 -254l-188 -227q-39 -45 -88 -78q31 -68 31 -137q6 -139 -90 -254l-189 -228 q-59 -74 -144 -110.5t-175 -28.5q-98 10 -170 72l-97 80q-106 88 -113 233.5zM730 2193.5q-1 -63.5 42 -100.5l99 -80q25 -20 61 -24q86 -10 150 67l188 228q45 51 45 123q-4 49 -31 80h-10q-16 -33 -48 -48.5t-67 -7.5q-39 10 -60 45t-11 74l-4 2l-6 6l-41 33 q-37 -14 -72 -55l-189 -226q-45 -53 -46 -116.5zM1065 2899.5q-4 -58.5 31 -97.5h37q4 0 10 -2t8 -2l21 74q10 41 46 60t75 9q39 -8 59 -44t10 -77l-28 -114l10 -9q41 18 71 56l189 227q49 55 45 123q-4 57 -41 92l-98 80q-27 20 -62 27q-86 6 -149 -70l-189 -225 q-41 -49 -45 -107.5zM166 309v383v193v-127v127h256v770h127h1282h127v-129v-1409v-129h-127h-1409v8q-111 23 -183.5 109.5t-72.5 203.5zM293 309q0 -61 36 -110t93 -70v-12h1409v1409h-1282v-1280h-127v512h-129v-66v-190v-193zM678 246v127h897v-127h-897zM678 502v127 h768v-127h-768zM678 758v127h1024v-127h-1024zM678 1014v383h512v-383h-512zM1319 1014v127h256v-127h-256zM1319 1270v127h383v-127h-383z" />
|
||||
<glyph unicode="Ò" horiz-adv-x="1900" d="M119 834q0 346 243.5 588.5t587.5 242.5t588 -242.5t244 -588.5q0 -344 -244 -588t-588 -244t-587.5 244t-243.5 588zM258 813q14 -41 37.5 -81t57.5 -91t48 -76q10 -14 15.5 -32.5t4.5 -29.5l-3 -35q-2 -24 -2 -32v-2q-1 -6 -1 -11q0 -38 25 -63q14 -18 45 -48.5 t52.5 -57.5t31.5 -57l4 -2q68 -41 170 -74q6 0 24.5 7t78.5 11v2q0 8 20.5 19.5t52 27t46.5 25.5q19 22 18 43q0 28 -36 52q-43 29 -83 29q-18 0 -35 -5q-25 16 -96 80.5t-121 85.5q-23 20 -64.5 33.5t-75.5 20.5t-59.5 31.5t-25.5 67.5q-4 16 0 24.5t-5 22t-10 17.5 t-13.5 15t-15.5 14.5t-17.5 13.5t-16.5 12q-4 12 -3 23q0 38 44 59q22 10 41 10q28 0 47 -22q16 -16 17 -43q29 2 69.5 56t73.5 60q12 10 44 13.5t47.5 10.5t0.5 34q8 8 32 18l38 17q14 6 22.5 24.5t-12.5 42.5q-12 55 -60 69q-9 3 -18 2q-35 0 -53 -46q-8 -3 -15 -3 q-26 0 -30 38v10q0 48 35 74q18 14 43 8q27 -2 38 10t4 27.5t-26 23.5q0 6 -4 2q-16 6 -20 4q-25 16 -22 44t18.5 54.5t14.5 53t-36 39.5q-285 -244 -358 -396q-24 -71 -25 -201q0 -34 2 -73zM449 702q-7 -3 -8 -7q0 -9 24 -23q16 -20 35 -15q8 31 -25 39v2q-2 2 -7 2t-7 2 h-12zM590 909l2 -4h2q6 2 10 6q-8 0 -14 -2zM725 1546q38 3 74 3q136 0 223 -44q8 -27 36.5 -35t57.5 -5t50.5 -8t19.5 -40l4 -4l2 -10q2 -2 2 4q50 -50 50 -69q0 -11 -18 -11h-5h-4q-35 4 -46 -30q-4 -14 -4 -29q0 -22 9 -46q14 -42 41 -55q25 -10 41 -4t13 25.5t-28 32.5 q-2 23 12 22q27 -2 52 -43q10 -18 10 -31q0 -16 -14 -26q-4 -4 -7 -4l-2 -2q-37 -27 -40 -114t-9 -103q-9 -19 -9 -32q0 -20 26 -22h4q36 0 57 35q10 18 4 41q-8 23 6.5 35t36 15t35.5 10.5t4 23.5q21 -11 35 -11q27 0 31 40q1 9 1 17q0 42 -26 69q10 43 33 16q20 -29 6 -59 q2 -10 5 -16.5t10 -12.5t11.5 -8t15.5 -6t13 -6q2 0 4 -2q20 -8 21 -27q0 -13 -10 -31q-24 -81 -116 -81q-27 0 -61 7q-31 -12 -51 -40.5t-38.5 -68.5t-30.5 -58q-44 -80 -44 -140q0 -58 42 -98q25 -23 51 -28t54 6.5t47.5 23.5t45.5 33q10 1 19 1q57 0 71 -59q5 -19 5 -35 q0 -45 -31 -81q-4 -16 -4 -19q180 211 180 482l-6 86q-7 -4 -15 -5q-23 0 -49 37q-20 29 -6 27q8 0 29 -16q20 4 30 12q-12 70 -36 135l-11.5 12t-9.5 11q0 4 -1 12t-1 14v2q-92 188 -273.5 304t-398.5 116q-41 0 -61 -2q-20 -4 -33 -6h-12q-66 -11 -119 -27zM752 1201 q-3 -15 -4 -27q0 -24 14 -33q20 8 29.5 39.5t2 59.5t-29.5 26q-2 0 -6 -1t-6 -1q10 -17 0 -63zM762 973q-10 -2 -10 -7q0 -7 20 -20h16q2 -2 -4 -8q25 18 11.5 28.5t-33.5 6.5zM862 1331l6 6q18 8 11 23q-2 4 -11 4q-2 2 -8 2q-2 0 -5 -1t-5 -1q-21 -4 -21 -21q0 -33 33 -12 zM853 1315q-9 -13 -9 -27q0 -20 18 -41q18 -25 6 -53.5t-11 -59t36 -40.5q10 25 42 64.5t48 74.5q10 21 10 44q0 14 -4 30q-11 46 -55 46q-7 0 -14 -1q-45 -6 -67 -37zM1196 1087q-8 0 -8 -4q0 -6 14 -20q-12 -31 15 -33q18 0 30 19q2 16 -17 28q-17 11 -30 11q-2 -1 -4 -1z " />
|
||||
<glyph unicode="Ô" horiz-adv-x="1900" d="M119 834q0 346 243.5 588.5t587.5 242.5t588 -242.5t244 -588.5q0 -344 -244 -588t-588 -244t-587.5 244t-243.5 588zM258 813q14 -41 37.5 -81t57.5 -91t48 -76q10 -14 15.5 -32.5t4.5 -29.5l-3 -35q-2 -24 -2 -32v-2q-1 -6 -1 -11q0 -38 25 -63q14 -18 45 -48.5 t52.5 -57.5t31.5 -57l4 -2q68 -41 170 -74q6 0 24.5 7t78.5 11v2q0 8 20.5 19.5t52 27t46.5 25.5q19 22 18 43q0 28 -36 52q-43 29 -83 29q-18 0 -35 -5q-25 16 -96 80.5t-121 85.5q-23 20 -64.5 33.5t-75.5 20.5t-59.5 31.5t-25.5 67.5q-4 16 0 24.5t-5 22t-10 17.5 t-13.5 15t-15.5 14.5t-17.5 13.5t-16.5 12q-4 12 -3 23q0 38 44 59q22 10 41 10q28 0 47 -22q16 -16 17 -43q29 2 69.5 56t73.5 60q12 10 44 13.5t47.5 10.5t0.5 34q8 8 32 18l38 17q14 6 22.5 24.5t-12.5 42.5q-12 55 -60 69q-9 3 -18 2q-35 0 -53 -46q-8 -3 -15 -3 q-26 0 -30 38v10q0 48 35 74q18 14 43 8q27 -2 38 10t4 27.5t-26 23.5q0 6 -4 2q-16 6 -20 4q-25 16 -22 44t18.5 54.5t14.5 53t-36 39.5q-285 -244 -358 -396q-24 -71 -25 -201q0 -34 2 -73zM449 702q-7 -3 -8 -7q0 -9 24 -23q16 -20 35 -15q8 31 -25 39v2q-2 2 -7 2t-7 2 h-12zM590 909l2 -4h2q6 2 10 6q-8 0 -14 -2zM725 1546q38 3 74 3q136 0 223 -44q8 -27 36.5 -35t57.5 -5t50.5 -8t19.5 -40l4 -4l2 -10q2 -2 2 4q50 -50 50 -69q0 -11 -18 -11h-5h-4q-35 4 -46 -30q-4 -14 -4 -29q0 -22 9 -46q14 -42 41 -55q25 -10 41 -4t13 25.5t-28 32.5 q-2 23 12 22q27 -2 52 -43q10 -18 10 -31q0 -16 -14 -26q-4 -4 -7 -4l-2 -2q-37 -27 -40 -114t-9 -103q-9 -19 -9 -32q0 -20 26 -22h4q36 0 57 35q10 18 4 41q-8 23 6.5 35t36 15t35.5 10.5t4 23.5q21 -11 35 -11q27 0 31 40q1 9 1 17q0 42 -26 69q10 43 33 16q20 -29 6 -59 q2 -10 5 -16.5t10 -12.5t11.5 -8t15.5 -6t13 -6q2 0 4 -2q20 -8 21 -27q0 -13 -10 -31q-24 -81 -116 -81q-27 0 -61 7q-31 -12 -51 -40.5t-38.5 -68.5t-30.5 -58q-44 -80 -44 -140q0 -58 42 -98q25 -23 51 -28t54 6.5t47.5 23.5t45.5 33q10 1 19 1q57 0 71 -59q5 -19 5 -35 q0 -45 -31 -81q-4 -16 -4 -19q180 211 180 482l-6 86q-7 -4 -15 -5q-23 0 -49 37q-20 29 -6 27q8 0 29 -16q20 4 30 12q-12 70 -36 135l-11.5 12t-9.5 11q0 4 -1 12t-1 14v2q-92 188 -273.5 304t-398.5 116q-41 0 -61 -2q-20 -4 -33 -6h-12q-66 -11 -119 -27zM752 1201 q-3 -15 -4 -27q0 -24 14 -33q20 8 29.5 39.5t2 59.5t-29.5 26q-2 0 -6 -1t-6 -1q10 -17 0 -63zM762 973q-10 -2 -10 -7q0 -7 20 -20h16q2 -2 -4 -8q25 18 11.5 28.5t-33.5 6.5zM862 1331l6 6q18 8 11 23q-2 4 -11 4q-2 2 -8 2q-2 0 -5 -1t-5 -1q-21 -4 -21 -21q0 -33 33 -12 zM853 1315q-9 -13 -9 -27q0 -20 18 -41q18 -25 6 -53.5t-11 -59t36 -40.5q10 25 42 64.5t48 74.5q10 21 10 44q0 14 -4 30q-11 46 -55 46q-7 0 -14 -1q-45 -6 -67 -37zM1196 1087q-8 0 -8 -4q0 -6 14 -20q-12 -31 15 -33q18 0 30 19q2 16 -17 28q-17 11 -30 11q-2 -1 -4 -1z " />
|
||||
<glyph unicode="Õ" horiz-adv-x="1900" d="M294 2175.5q-7 145.5 89 259.5l188 228q37 41 88 80q-45 88 -28.5 195.5t88.5 193.5l186 227q61 74 147.5 110.5t174.5 28.5q94 -8 170 -69l96 -82q109 -86 115 -240q4 -137 -91 -254l-188 -227q-39 -45 -88 -78q31 -68 31 -137q6 -139 -90 -254l-189 -228 q-59 -74 -144 -110.5t-175 -28.5q-98 10 -170 72l-97 80q-106 88 -113 233.5zM490 2193.5q-1 -63.5 42 -100.5l99 -80q25 -20 61 -24q86 -10 150 67l188 228q45 51 45 123q-4 49 -31 80h-10q-16 -33 -48 -48.5t-67 -7.5q-39 10 -60 45t-11 74l-4 2l-6 6l-41 33 q-37 -14 -72 -55l-189 -226q-45 -53 -46 -116.5zM825 2899.5q-4 -58.5 31 -97.5h37q4 0 10 -2t8 -2l21 74q10 41 46 60t75 9q39 -8 59 -44t10 -77l-28 -114l10 -9q41 18 71 56l189 227q49 55 45 123q-4 57 -41 92l-98 80q-27 20 -62 27q-86 6 -149 -70l-189 -225 q-41 -49 -45 -107.5zM119 834q0 346 243.5 588.5t587.5 242.5t588 -242.5t244 -588.5q0 -344 -244 -588t-588 -244t-587.5 244t-243.5 588zM258 813q14 -41 37.5 -81t57.5 -91t48 -76q10 -14 15.5 -32.5t4.5 -29.5l-3 -35q-2 -24 -2 -32v-2q-1 -6 -1 -11q0 -38 25 -63 q14 -18 45 -48.5t52.5 -57.5t31.5 -57l4 -2q68 -41 170 -74q6 0 24.5 7t78.5 11v2q0 8 20.5 19.5t52 27t46.5 25.5q19 22 18 43q0 28 -36 52q-43 29 -83 29q-18 0 -35 -5q-25 16 -96 80.5t-121 85.5q-23 20 -64.5 33.5t-75.5 20.5t-59.5 31.5t-25.5 67.5q-4 16 0 24.5t-5 22 t-10 17.5t-13.5 15t-15.5 14.5t-17.5 13.5t-16.5 12q-4 12 -3 23q0 38 44 59q22 10 41 10q28 0 47 -22q16 -16 17 -43q29 2 69.5 56t73.5 60q12 10 44 13.5t47.5 10.5t0.5 34q8 8 32 18l38 17q14 6 22.5 24.5t-12.5 42.5q-12 55 -60 69q-9 3 -18 2q-35 0 -53 -46 q-8 -3 -15 -3q-26 0 -30 38v10q0 48 35 74q18 14 43 8q27 -2 38 10t4 27.5t-26 23.5q0 6 -4 2q-16 6 -20 4q-25 16 -22 44t18.5 54.5t14.5 53t-36 39.5q-285 -244 -358 -396q-24 -71 -25 -201q0 -34 2 -73zM449 702q-7 -3 -8 -7q0 -9 24 -23q16 -20 35 -15q8 31 -25 39v2 q-2 2 -7 2t-7 2h-12zM590 909l2 -4h2q6 2 10 6q-8 0 -14 -2zM725 1546q38 3 74 3q136 0 223 -44q8 -27 36.5 -35t57.5 -5t50.5 -8t19.5 -40l4 -4l2 -10q2 -2 2 4q50 -50 50 -69q0 -11 -18 -11h-5h-4q-35 4 -46 -30q-4 -14 -4 -29q0 -22 9 -46q14 -42 41 -55q25 -10 41 -4 t13 25.5t-28 32.5q-2 23 12 22q27 -2 52 -43q10 -18 10 -31q0 -16 -14 -26q-4 -4 -7 -4l-2 -2q-37 -27 -40 -114t-9 -103q-9 -19 -9 -32q0 -20 26 -22h4q36 0 57 35q10 18 4 41q-8 23 6.5 35t36 15t35.5 10.5t4 23.5q21 -11 35 -11q27 0 31 40q1 9 1 17q0 42 -26 69 q10 43 33 16q20 -29 6 -59q2 -10 5 -16.5t10 -12.5t11.5 -8t15.5 -6t13 -6q2 0 4 -2q20 -8 21 -27q0 -13 -10 -31q-24 -81 -116 -81q-27 0 -61 7q-31 -12 -51 -40.5t-38.5 -68.5t-30.5 -58q-44 -80 -44 -140q0 -58 42 -98q25 -23 51 -28t54 6.5t47.5 23.5t45.5 33q10 1 19 1 q57 0 71 -59q5 -19 5 -35q0 -45 -31 -81q-4 -16 -4 -19q180 211 180 482l-6 86q-7 -4 -15 -5q-23 0 -49 37q-20 29 -6 27q8 0 29 -16q20 4 30 12q-12 70 -36 135l-11.5 12t-9.5 11q0 4 -1 12t-1 14v2q-92 188 -273.5 304t-398.5 116q-41 0 -61 -2q-20 -4 -33 -6h-12 q-66 -11 -119 -27zM752 1201q-3 -15 -4 -27q0 -24 14 -33q20 8 29.5 39.5t2 59.5t-29.5 26q-2 0 -6 -1t-6 -1q10 -17 0 -63zM762 973q-10 -2 -10 -7q0 -7 20 -20h16q2 -2 -4 -8q25 18 11.5 28.5t-33.5 6.5zM862 1331l6 6q18 8 11 23q-2 4 -11 4q-2 2 -8 2q-2 0 -5 -1t-5 -1 q-21 -4 -21 -21q0 -33 33 -12zM853 1315q-9 -13 -9 -27q0 -20 18 -41q18 -25 6 -53.5t-11 -59t36 -40.5q10 25 42 64.5t48 74.5q10 21 10 44q0 14 -4 30q-11 46 -55 46q-7 0 -14 -1q-45 -6 -67 -37zM1196 1087q-8 0 -8 -4q0 -6 14 -20q-12 -31 15 -33q18 0 30 19 q2 16 -17 28q-17 11 -30 11q-2 -1 -4 -1z" />
|
||||
<glyph unicode="Ù" horiz-adv-x="2420" d="M160 -41v356h2q0 2 -2 7v4q0 37 20 73q6 10 65.5 42t126.5 63l126 57q59 27 61 29q57 27 151.5 59.5t155 61t92.5 67.5q-8 76 -84.5 256t-82.5 291l-2 42q0 177 79 312q88 152 258 213h84h84q170 -61 258 -213q79 -136 79 -312q0 -21 -1 -42q-6 -111 -83 -291t-85 -256 q33 -39 93.5 -67.5t154.5 -61.5t152 -59q2 -2 61 -29l126 -57q67 -31 126 -62.5t66 -42.5q20 -37 20 -73v-4q-2 -4 -2 -7h2v-356h-20h-1031h-1030h-20z" />
|
||||
<glyph unicode="Û" horiz-adv-x="2420" d="M160 -41v356h2q0 2 -2 7v4q0 37 20 73q6 10 65.5 42t126.5 63l126 57q59 27 61 29q57 27 151.5 59.5t155 61t92.5 67.5q-8 76 -84.5 256t-82.5 291l-2 42q0 177 79 312q88 152 258 213h84h84q170 -61 258 -213q79 -136 79 -312q0 -21 -1 -42q-6 -111 -83 -291t-85 -256 q33 -39 93.5 -67.5t154.5 -61.5t152 -59q2 -2 61 -29l126 -57q67 -31 126 -62.5t66 -42.5q20 -37 20 -73v-4q-2 -4 -2 -7h2v-356h-20h-1031h-1030h-20z" />
|
||||
<glyph unicode="ã" d="M-656 510.5q-7 145.5 89 259.5l188 228q37 41 88 80q-45 88 -28.5 195.5t88.5 193.5l186 227q61 74 147.5 110.5t174.5 28.5q94 -8 170 -69l96 -82q109 -86 115 -240q4 -137 -91 -254l-188 -227q-39 -45 -88 -78q31 -68 31 -137q6 -139 -90 -254l-189 -228 q-59 -74 -144 -110.5t-175 -28.5q-98 10 -170 72l-97 80q-106 88 -113 233.5zM-460 528.5q-1 -63.5 42 -100.5l99 -80q25 -20 61 -24q86 -10 150 67l188 228q45 51 45 123q-4 49 -31 80h-10q-16 -33 -48 -48.5t-67 -7.5q-39 10 -60 45t-11 74l-4 2l-6 6l-41 33 q-37 -14 -72 -55l-189 -226q-45 -53 -46 -116.5zM-125 1234.5q-4 -58.5 31 -97.5h37q4 0 10 -2t8 -2l21 74q10 41 46 60t75 9q39 -8 59 -44t10 -77l-28 -114l10 -9q41 18 71 56l189 227q49 55 45 123q-4 57 -41 92l-98 80q-27 20 -62 27q-86 6 -149 -70l-189 -225 q-41 -49 -45 -107.5z" />
|
||||
<glyph unicode="ñ" d="M-656 510.5q-7 145.5 89 259.5l188 228q37 41 88 80q-45 88 -28.5 195.5t88.5 193.5l186 227q61 74 147.5 110.5t174.5 28.5q94 -8 170 -69l96 -82q109 -86 115 -240q4 -137 -91 -254l-188 -227q-39 -45 -88 -78q31 -68 31 -137q6 -139 -90 -254l-189 -228 q-59 -74 -144 -110.5t-175 -28.5q-98 10 -170 72l-97 80q-106 88 -113 233.5zM-460 528.5q-1 -63.5 42 -100.5l99 -80q25 -20 61 -24q86 -10 150 67l188 228q45 51 45 123q-4 49 -31 80h-10q-16 -33 -48 -48.5t-67 -7.5q-39 10 -60 45t-11 74l-4 2l-6 6l-41 33 q-37 -14 -72 -55l-189 -226q-45 -53 -46 -116.5zM-125 1234.5q-4 -58.5 31 -97.5h37q4 0 10 -2t8 -2l21 74q10 41 46 60t75 9q39 -8 59 -44t10 -77l-28 -114l10 -9q41 18 71 56l189 227q49 55 45 123q-4 57 -41 92l-98 80q-27 20 -62 27q-86 6 -149 -70l-189 -225 q-41 -49 -45 -107.5z" />
|
||||
<glyph unicode="õ" d="M-656 510.5q-7 145.5 89 259.5l188 228q37 41 88 80q-45 88 -28.5 195.5t88.5 193.5l186 227q61 74 147.5 110.5t174.5 28.5q94 -8 170 -69l96 -82q109 -86 115 -240q4 -137 -91 -254l-188 -227q-39 -45 -88 -78q31 -68 31 -137q6 -139 -90 -254l-189 -228 q-59 -74 -144 -110.5t-175 -28.5q-98 10 -170 72l-97 80q-106 88 -113 233.5zM-460 528.5q-1 -63.5 42 -100.5l99 -80q25 -20 61 -24q86 -10 150 67l188 228q45 51 45 123q-4 49 -31 80h-10q-16 -33 -48 -48.5t-67 -7.5q-39 10 -60 45t-11 74l-4 2l-6 6l-41 33 q-37 -14 -72 -55l-189 -226q-45 -53 -46 -116.5zM-125 1234.5q-4 -58.5 31 -97.5h37q4 0 10 -2t8 -2l21 74q10 41 46 60t75 9q39 -8 59 -44t10 -77l-28 -114l10 -9q41 18 71 56l189 227q49 55 45 123q-4 57 -41 92l-98 80q-27 20 -62 27q-86 6 -149 -70l-189 -225 q-41 -49 -45 -107.5z" />
|
||||
<glyph unicode="Œ" horiz-adv-x="4327" d="M2007 14v1420v104h2214v-1524h-2214zM2145 256l618 573l-618 465v-1038zM2210 1399l924 -676l924 676h-1848zM2225 154h1736l-563 618l-268 -199l-266 189zM3488 834l596 -641v1101zM119 834q0 346 243.5 588.5t587.5 242.5t588 -242.5t244 -588.5q0 -344 -244 -588 t-588 -244t-587.5 244t-243.5 588zM258 813q14 -41 37.5 -81t57.5 -91t48 -76q10 -14 15.5 -32.5t4.5 -29.5l-3 -35q-2 -24 -2 -32v-2q-1 -6 -1 -11q0 -38 25 -63q14 -18 45 -48.5t52.5 -57.5t31.5 -57l4 -2q68 -41 170 -74q6 0 24.5 7t78.5 11v2q0 8 20.5 19.5t52 27 t46.5 25.5q19 22 18 43q0 28 -36 52q-43 29 -83 29q-18 0 -35 -5q-25 16 -96 80.5t-121 85.5q-23 20 -64.5 33.5t-75.5 20.5t-59.5 31.5t-25.5 67.5q-4 16 0 24.5t-5 22t-10 17.5t-13.5 15t-15.5 14.5t-17.5 13.5t-16.5 12q-4 12 -3 23q0 38 44 59q22 10 41 10q28 0 47 -22 q16 -16 17 -43q29 2 69.5 56t73.5 60q12 10 44 13.5t47.5 10.5t0.5 34q8 8 32 18l38 17q14 6 22.5 24.5t-12.5 42.5q-12 55 -60 69q-9 3 -18 2q-35 0 -53 -46q-8 -3 -15 -3q-26 0 -30 38v10q0 48 35 74q18 14 43 8q27 -2 38 10t4 27.5t-26 23.5q0 6 -4 2q-16 6 -20 4 q-25 16 -22 44t18.5 54.5t14.5 53t-36 39.5q-285 -244 -358 -396q-24 -71 -25 -201q0 -34 2 -73zM449 702q-7 -3 -8 -7q0 -9 24 -23q16 -20 35 -15q8 31 -25 39v2q-2 2 -7 2t-7 2h-12zM590 909l2 -4h2q6 2 10 6q-8 0 -14 -2zM725 1546q38 3 74 3q136 0 223 -44 q8 -27 36.5 -35t57.5 -5t50.5 -8t19.5 -40l4 -4l2 -10q2 -2 2 4q50 -50 50 -69q0 -11 -18 -11h-5h-4q-35 4 -46 -30q-4 -14 -4 -29q0 -22 9 -46q14 -42 41 -55q25 -10 41 -4t13 25.5t-28 32.5q-2 23 12 22q27 -2 52 -43q10 -18 10 -31q0 -16 -14 -26q-4 -4 -7 -4l-2 -2 q-37 -27 -40 -114t-9 -103q-9 -19 -9 -32q0 -20 26 -22h4q36 0 57 35q10 18 4 41q-8 23 6.5 35t36 15t35.5 10.5t4 23.5q21 -11 35 -11q27 0 31 40q1 9 1 17q0 42 -26 69q10 43 33 16q20 -29 6 -59q2 -10 5 -16.5t10 -12.5t11.5 -8t15.5 -6t13 -6q2 0 4 -2q20 -8 21 -27 q0 -13 -10 -31q-24 -81 -116 -81q-27 0 -61 7q-31 -12 -51 -40.5t-38.5 -68.5t-30.5 -58q-44 -80 -44 -140q0 -58 42 -98q25 -23 51 -28t54 6.5t47.5 23.5t45.5 33q10 1 19 1q57 0 71 -59q5 -19 5 -35q0 -45 -31 -81q-4 -16 -4 -19q180 211 180 482l-6 86q-7 -4 -15 -5 q-23 0 -49 37q-20 29 -6 27q8 0 29 -16q20 4 30 12q-12 70 -36 135l-11.5 12t-9.5 11q0 4 -1 12t-1 14v2q-92 188 -273.5 304t-398.5 116q-41 0 -61 -2q-20 -4 -33 -6h-12q-66 -11 -119 -27zM752 1201q-3 -15 -4 -27q0 -24 14 -33q20 8 29.5 39.5t2 59.5t-29.5 26 q-2 0 -6 -1t-6 -1q10 -17 0 -63zM762 973q-10 -2 -10 -7q0 -7 20 -20h16q2 -2 -4 -8q25 18 11.5 28.5t-33.5 6.5zM862 1331l6 6q18 8 11 23q-2 4 -11 4q-2 2 -8 2q-2 0 -5 -1t-5 -1q-21 -4 -21 -21q0 -33 33 -12zM853 1315q-9 -13 -9 -27q0 -20 18 -41q18 -25 6 -53.5 t-11 -59t36 -40.5q10 25 42 64.5t48 74.5q10 21 10 44q0 14 -4 30q-11 46 -55 46q-7 0 -14 -1q-45 -6 -67 -37zM1196 1087q-8 0 -8 -4q0 -6 14 -20q-12 -31 15 -33q18 0 30 19q2 16 -17 28q-17 11 -30 11q-2 -1 -4 -1z" />
|
||||
<glyph unicode="˜" horiz-adv-x="512" d="M-656 510.5q-7 145.5 89 259.5l188 228q37 41 88 80q-45 88 -28.5 195.5t88.5 193.5l186 227q61 74 147.5 110.5t174.5 28.5q94 -8 170 -69l96 -82q109 -86 115 -240q4 -137 -91 -254l-188 -227q-39 -45 -88 -78q31 -68 31 -137q6 -139 -90 -254l-189 -228 q-59 -74 -144 -110.5t-175 -28.5q-98 10 -170 72l-97 80q-106 88 -113 233.5zM-460 528.5q-1 -63.5 42 -100.5l99 -80q25 -20 61 -24q86 -10 150 67l188 228q45 51 45 123q-4 49 -31 80h-10q-16 -33 -48 -48.5t-67 -7.5q-39 10 -60 45t-11 74l-4 2l-6 6l-41 33 q-37 -14 -72 -55l-189 -226q-45 -53 -46 -116.5zM-125 1234.5q-4 -58.5 31 -97.5h37q4 0 10 -2t8 -2l21 74q10 41 46 60t75 9q39 -8 59 -44t10 -77l-28 -114l10 -9q41 18 71 56l189 227q49 55 45 123q-4 57 -41 92l-98 80q-27 20 -62 27q-86 6 -149 -70l-189 -225 q-41 -49 -45 -107.5z" />
|
||||
<glyph unicode="–" horiz-adv-x="1024" d="M205 512v205h614v-205h-614z" />
|
||||
<glyph unicode="—" d="M205 512v205h1638v-205h-1638z" />
|
||||
<glyph unicode="‹" horiz-adv-x="1931" d="M160 707l919 708v-534l693 534v-1417l-693 534v-534z" />
|
||||
<glyph unicode="›" horiz-adv-x="1976" d="M182 -6v1417l692 -534v534l920 -709l-920 -708v534z" />
|
||||
<glyph unicode="™" horiz-adv-x="4038" d="M2213 293q0 123 110 209t267 86q160 0 160 -27v778v269q0 23 16.5 38t38.5 15h1030q23 0 39.5 -15.5t16.5 -37.5v-269v-1073h-2q-16 -94 -107.5 -181t-226.5 -87q-156 0 -265.5 87t-109.5 208q0 123 109.5 209t265.5 86q162 0 162 -27v692h-793v-960v-27h-2 q-14 -94 -106.5 -181t-225.5 -87q-156 0 -266.5 87t-110.5 208zM164 1642l196 197l494 -491l-197 -197l-82 82q2 -74 75 -204t210 -267q215 -215 461 -293l25 -8l-99 98l199 197l491 -492l-196 -198q-72 -72 -187 -73q-113 0 -267 70q-310 141 -646 480q-303 303 -436 620 q-77 184 -77 315q0 94 40 160z" />
|
||||
<glyph unicode="" horiz-adv-x="500" d="M0 0v0v0v0v0z" />
|
||||
</font>
|
||||
</defs></svg>
|
||||
|
Before Width: | Height: | Size: 35 KiB |
@@ -1,318 +0,0 @@
|
||||
/* effect-1 */
|
||||
|
||||
.effect-1:before,
|
||||
.effect-1:after {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
bottom:20px;
|
||||
left:10px;
|
||||
width:50%;
|
||||
height:20%;
|
||||
max-width:300px;
|
||||
-webkit-box-shadow: 0 20px 10px rgba(0, 0, 0, 0.75);
|
||||
-moz-box-shadow: 0 20px 10px rgba(0, 0, 0, 0.75);
|
||||
box-shadow: 0 20px 10px rgba(0, 0, 0, 0.75);
|
||||
-webkit-transform:rotate(-4deg);
|
||||
-moz-transform:rotate(-4deg);
|
||||
-o-transform:rotate(-4deg);
|
||||
-ms-transform:rotate(-4deg);
|
||||
transform:rotate(-4deg);
|
||||
}
|
||||
|
||||
.effect-1:after {
|
||||
right:10px;
|
||||
left:auto;
|
||||
-webkit-transform:rotate(4deg);
|
||||
-moz-transform:rotate(4deg);
|
||||
-o-transform:rotate(4deg);
|
||||
-ms-transform:rotate(4deg);
|
||||
transform:rotate(4deg);
|
||||
}
|
||||
|
||||
/* effect-2 */
|
||||
|
||||
.effect-2:before,
|
||||
.effect-2:after {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
bottom:20px;
|
||||
left:10px;
|
||||
width:50%;
|
||||
height:20%;
|
||||
max-width:300px;
|
||||
-webkit-box-shadow:0 22px 10px rgba(0, 0, 0, 0.6);
|
||||
-moz-box-shadow:0 22px 10px rgba(0, 0, 0, 0.6);
|
||||
box-shadow:0 22px 10px rgba(0, 0, 0, 0.6);
|
||||
-webkit-transform:rotate(-8deg);
|
||||
-moz-transform:rotate(-8deg);
|
||||
-o-transform:rotate(-8deg);
|
||||
-ms-transform:rotate(-8deg);
|
||||
transform:rotate(-8deg);
|
||||
}
|
||||
|
||||
.effect-2:after {
|
||||
right:10px;
|
||||
left:auto;
|
||||
-webkit-transform:rotate(8deg);
|
||||
-moz-transform:rotate(8deg);
|
||||
-o-transform:rotate(8deg);
|
||||
-ms-transform:rotate(8deg);
|
||||
transform:rotate(8deg);
|
||||
}
|
||||
|
||||
/* effect-3 */
|
||||
|
||||
.effect-3:before,
|
||||
.effect-3:after {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
bottom:8px;
|
||||
left:2%;
|
||||
width:48.5%;
|
||||
height:55%;
|
||||
-webkit-box-shadow:0 7px 9px rgba(0, 0, 0, 0.75);
|
||||
-moz-box-shadow:0 7px 9px rgba(0, 0, 0, 0.75);
|
||||
box-shadow:0 7px 9px rgba(0, 0, 0, 0.75);
|
||||
-webkit-transform: rotate(2deg);
|
||||
-moz-transform: rotate(2deg);
|
||||
-o-transform: rotate(2deg);
|
||||
-ms-transform: rotate(2deg);
|
||||
transform: rotate(2deg);
|
||||
}
|
||||
|
||||
.effect-3:after {
|
||||
right:2%;
|
||||
left:auto;
|
||||
-webkit-transform: rotate(-2deg);
|
||||
-moz-transform: rotate(-2deg);
|
||||
-o-transform: rotate(-2deg);
|
||||
-ms-transform: rotate(-2deg);
|
||||
transform: rotate(-2deg);
|
||||
}
|
||||
|
||||
/* effect-4 */
|
||||
|
||||
.effect-4:before,
|
||||
.effect-4:after {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
bottom:12px;
|
||||
left:2%;
|
||||
width:49%;
|
||||
height:55%;
|
||||
-webkit-box-shadow:0 12px 18px rgba(0, 0, 0, 0.75);
|
||||
-moz-box-shadow:0 12px 18px rgba(0, 0, 0, 0.75);
|
||||
box-shadow:0 12px 18px rgba(0, 0, 0, 0.75);
|
||||
-webkit-transform: rotate(3deg);
|
||||
-moz-transform: rotate(3deg);
|
||||
-o-transform: rotate(3deg);
|
||||
-ms-transform: rotate(3deg);
|
||||
transform: rotate(3deg);
|
||||
}
|
||||
|
||||
.effect-4:after {
|
||||
right:2%;
|
||||
left:auto;
|
||||
-webkit-transform: rotate(-3deg);
|
||||
-moz-transform: rotate(-3deg);
|
||||
-o-transform: rotate(-3deg);
|
||||
-ms-transform: rotate(-3deg);
|
||||
transform: rotate(-3deg);
|
||||
}
|
||||
|
||||
/* effect-5 */
|
||||
|
||||
.effect-5:before {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
left:-2.5%;
|
||||
bottom:15px;
|
||||
width:105%;
|
||||
height:8px;
|
||||
-webkit-box-shadow: 0px 20px 5px rgba(0, 0, 0, 0.5);
|
||||
-moz-box-shadow: 0px 20px 5px rgba(0, 0, 0, 0.5);
|
||||
box-shadow: 0px 20px 5px rgba(0, 0, 0, 0.5);
|
||||
-webkit-border-radius:10px;
|
||||
-moz-border-radius:10px;
|
||||
border-radius:10px;
|
||||
}
|
||||
|
||||
/* effect-6 */
|
||||
|
||||
.effect-6:before {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
left:-3.5%;
|
||||
bottom:25px;
|
||||
width:107%;
|
||||
height:15px;
|
||||
-webkit-box-shadow: 0px 30px 9px rgba(0, 0, 0, 0.5);
|
||||
-moz-box-shadow: 0px 30px 9px rgba(0, 0, 0, 0.5);
|
||||
box-shadow: 0px 30px 9px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
/* effect-7 */
|
||||
|
||||
.effect-7:before {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
left:0;
|
||||
right:0;
|
||||
top:10px;
|
||||
bottom:10px;
|
||||
-webkit-box-shadow: 0 0 8px rgba(0,0,0,0.5);
|
||||
-moz-box-shadow: 0 0 8px rgba(0,0,0,0.5);
|
||||
box-shadow: 0 0 8px rgba(0,0,0,0.5);
|
||||
-webkit-border-radius:15px;
|
||||
-moz-border-radius:15px;
|
||||
border-radius:15px;
|
||||
}
|
||||
|
||||
/* effect-8 */
|
||||
|
||||
.effect-8:before {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
left:0px;
|
||||
right:0;
|
||||
top:15px;
|
||||
bottom:15px;
|
||||
-webkit-box-shadow: 0px 0 20px rgba(0,0,0,0.8);
|
||||
-moz-box-shadow: 0px 0 20px rgba(0,0,0,0.8);
|
||||
box-shadow: 0px 0 20px rgba(0,0,0,0.8);
|
||||
-webkit-border-radius:35px;
|
||||
-moz-border-radius:35px;
|
||||
border-radius:35px;
|
||||
}
|
||||
|
||||
/* effect-9 */
|
||||
|
||||
.effect-9:before {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
left:70px;
|
||||
bottom:2px;
|
||||
width:50%;
|
||||
height:15px;
|
||||
max-width:200px;
|
||||
-webkit-box-shadow:-85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
-moz-box-shadow:-85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
box-shadow:-85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
-webkit-transform:skew(60deg);
|
||||
-moz-transform:skew(60deg);
|
||||
-o-transform:skew(60deg);
|
||||
-ms-transform:skew(60deg);
|
||||
transform:skew(60deg);
|
||||
}
|
||||
|
||||
/* effect-10 */
|
||||
|
||||
.effect-10:before {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
left:70px;
|
||||
bottom:2px;
|
||||
width:50%;
|
||||
height:15px;
|
||||
max-width:200px;
|
||||
-webkit-box-shadow:-85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
-moz-box-shadow:-85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
box-shadow:-85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
-webkit-transform:skew(60deg);
|
||||
-moz-transform:skew(60deg);
|
||||
-o-transform:skew(60deg);
|
||||
-ms-transform:skew(60deg);
|
||||
-webkit-transform:skew(60deg);
|
||||
}
|
||||
|
||||
.effect-10:after {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
right:70px;
|
||||
bottom:2px;
|
||||
width:50%;
|
||||
height:15px;
|
||||
max-width:200px;
|
||||
-webkit-box-shadow: 85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
-moz-box-shadow: 85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
box-shadow: 85px 0 3px rgba(0, 0, 0, 0.4);
|
||||
-webkit-transform:skew(-60deg);
|
||||
-moz-transform:skew(-60deg);
|
||||
-o-transform:skew(-60deg);
|
||||
-ms-transform:skew(-60deg);
|
||||
transform:skew(-60deg);
|
||||
}
|
||||
|
||||
/* effect-11 */
|
||||
|
||||
.effect-11:before {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
left:70px;
|
||||
bottom:2px;
|
||||
width:50%;
|
||||
height:75px;
|
||||
max-width:200px;
|
||||
-webkit-box-shadow:-86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
-moz-box-shadow:-86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
box-shadow:-86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
-webkit-transform:skew(20deg);
|
||||
-moz-transform:skew(20deg);
|
||||
-o-transform:skew(20deg);
|
||||
-ms-transform:skew(20deg);
|
||||
transform:skew(20deg);
|
||||
}
|
||||
|
||||
.effect-11:after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* effect-12 */
|
||||
|
||||
.effect-12:before {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
left:70px;
|
||||
bottom:2px;
|
||||
width:50%;
|
||||
height:75px;
|
||||
-webkit-box-shadow:-86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
-moz-box-shadow:-86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
box-shadow:-86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
-webkit-transform:skew(20deg);
|
||||
-moz-transform:skew(20deg);
|
||||
-o-transform:skew(20deg);
|
||||
-ms-transform:skew(20deg);
|
||||
transform:skew(20deg);
|
||||
}
|
||||
|
||||
.effect-12:after {
|
||||
content:"";
|
||||
position:absolute;
|
||||
z-index:-500;
|
||||
right:70px;
|
||||
bottom:2px;
|
||||
width:50%;
|
||||
height:75px;
|
||||
-webkit-box-shadow:86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
-moz-box-shadow:86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
box-shadow:86px 0 6px rgba(0, 0, 0, 0.4);
|
||||
-webkit-transform:skew(-20deg);
|
||||
-moz-transform:skew(-20deg);
|
||||
-o-transform:skew(-20deg);
|
||||
-ms-transform:skew(-20deg);
|
||||
transform:skew(-20deg);
|
||||
}
|
||||
@@ -1,420 +0,0 @@
|
||||
html {
|
||||
background: url("../img/back2-light.png") center 0;
|
||||
height: 100%;
|
||||
}
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
color: black;
|
||||
|
||||
font: 105% "Hoefler Text", Garamond, Baskerville, "Baskerville Old Face", "Times New Roman", serif;
|
||||
font-weight: 100;
|
||||
|
||||
height: 100%;
|
||||
}
|
||||
h1, h2, h3, h4 {
|
||||
text-shadow: #FFF 0 -1px 1px, #AAA 0 0 5px;
|
||||
|
||||
font-weight: 600;
|
||||
}
|
||||
h1 {
|
||||
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", "Liberation Sans", sans-serif;
|
||||
|
||||
font-weight: 100;
|
||||
}
|
||||
strong {
|
||||
font-weight: 600;
|
||||
}
|
||||
h1 .sub {
|
||||
font-size: 0.5em;
|
||||
}
|
||||
h1 {
|
||||
font-size: 250%;
|
||||
}
|
||||
h2 {
|
||||
font-size: inherit;
|
||||
}
|
||||
p, blockquote, ul {
|
||||
text-shadow: #FFF 0 -1px 1px, #CCC 0 0 3px;
|
||||
}
|
||||
p {
|
||||
text-align: justify;
|
||||
}
|
||||
ul {
|
||||
font-size: 90%;
|
||||
font-weight: 400;
|
||||
}
|
||||
ul.clean {
|
||||
list-style: none;
|
||||
}
|
||||
blockquote {
|
||||
font-size: 90%;
|
||||
font-weight: 400;
|
||||
}
|
||||
a, .link, :link {
|
||||
color: inherit;
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
font-weight: 400;
|
||||
}
|
||||
a:hover, .link:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
label {
|
||||
display: inline-block;
|
||||
width: 15em;
|
||||
}
|
||||
img {
|
||||
border: none;
|
||||
}
|
||||
|
||||
|
||||
/* Classes */
|
||||
.button {
|
||||
display: inline-block;
|
||||
background: rgba(255, 255, 255, 0.7);
|
||||
border: 1px solid rgba(255, 255, 255, 1);
|
||||
border-radius: 5px;
|
||||
-webkit-box-shadow: 1px 1px 6px rgba(200, 200, 200, 0.5);
|
||||
-moz-box-shadow: 1px 1px 6px rgba(200, 200, 200, 0.5);
|
||||
box-shadow: 1px 1px 6px rgba(200, 200, 200, 0.5);
|
||||
padding: 1em;
|
||||
|
||||
text-decoration: none;
|
||||
}
|
||||
.button:hover {
|
||||
background: rgba(240, 240, 240, 0.5);
|
||||
border-color: white;
|
||||
}
|
||||
|
||||
/* Page */
|
||||
header {
|
||||
position: relative;
|
||||
z-index: 99;
|
||||
background: url("../img/back2-dark.png") center 0;
|
||||
border-bottom: 1px solid #FFF;
|
||||
-webkit-box-shadow: 0 0 50px #666;
|
||||
-moz-box-shadow: 0 0 50px #666;
|
||||
box-shadow: 0 0 50px #666;
|
||||
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 150px;
|
||||
margin: 0;
|
||||
padding: 1em 0 0;
|
||||
|
||||
text-align: center;
|
||||
}
|
||||
header h1 {
|
||||
margin: 0;
|
||||
|
||||
color: white;
|
||||
font-size: 350%;
|
||||
}
|
||||
header .logo {
|
||||
height: 128px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
header .divider {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
bottom: -90px;
|
||||
}
|
||||
#fixedheader {
|
||||
position: fixed;
|
||||
z-index: 98;
|
||||
background: url("../img/back2-dark.png") center 0;
|
||||
border-bottom: 1px solid #FFF;
|
||||
-webkit-box-shadow: 0 0 10px #000;
|
||||
-moz-box-shadow: 0 0 10px #000;
|
||||
box-shadow: 0 0 10px #000;
|
||||
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 50px;
|
||||
padding: 10px 0 0;
|
||||
|
||||
text-align: center;
|
||||
}
|
||||
#fixedheader h2 {
|
||||
margin: 0;
|
||||
|
||||
color: white;
|
||||
font-size: 20px;
|
||||
}
|
||||
header a, header .link, header :link,
|
||||
#fixedheader a, #fixedheader .link, #fixedheader :link {
|
||||
font-family: Exo;
|
||||
font-weight: 600;
|
||||
text-decoration: none;
|
||||
}
|
||||
header a:hover, header .link:hover,
|
||||
#fixedheader a:hover, #fixedheader .link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
footer {
|
||||
clear: both;
|
||||
padding: 10em 0 1em;
|
||||
|
||||
color: #333;
|
||||
text-shadow: #FFF 0 -1px 1px, #999 0 0 5px;
|
||||
|
||||
text-align: center;
|
||||
font-size: 80%;
|
||||
}
|
||||
section {
|
||||
position: relative;
|
||||
width: 950px;
|
||||
margin: 0 auto 2em;
|
||||
padding: 1em 0 0;
|
||||
}
|
||||
section.heading {
|
||||
background: rgba(200, 200, 200, 0.3);
|
||||
border: 1px solid rgba(200, 200, 200, 0.5);
|
||||
border-width: 0 0 1px;
|
||||
-webkit-box-shadow: inset 0 0 15px rgba(255, 255, 255, 0.5), 2px 2px 6px rgba(200, 200, 200, 0.5);
|
||||
-moz-box-shadow: inset 0 0 15px rgba(255, 255, 255, 0.5), 2px 2px 6px rgba(200, 200, 200, 0.5);
|
||||
box-shadow: inset 0 0 15px rgba(255, 255, 255, 0.5), 2px 2px 6px rgba(200, 200, 200, 0.5);
|
||||
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
}
|
||||
section.heading>div {
|
||||
width: 950px;
|
||||
margin: 0 auto;
|
||||
padding: 1em 0;
|
||||
}
|
||||
hr {
|
||||
background: url("../img/Dividers/Simple.png") center center no-repeat;
|
||||
border: none;
|
||||
height: 4em;
|
||||
clear: both;
|
||||
}
|
||||
blockquote {
|
||||
margin-left: 5em;
|
||||
}
|
||||
blockquote:before {
|
||||
content: "❝";
|
||||
position: absolute;
|
||||
margin: -0.5ex 0 0 -1em;
|
||||
font-size: 300%;
|
||||
font-weight: 100;
|
||||
}
|
||||
#sendtophone input[type=text] {
|
||||
border: 1px solid #666;
|
||||
border-radius: 5px;
|
||||
width: 15em;
|
||||
|
||||
-webkit-box-shadow: 0 0 5px #AAA;
|
||||
-moz-box-shadow: 0 0 5px #AAA;
|
||||
box-shadow: 0 0 5px #AAA;
|
||||
}
|
||||
|
||||
/* Utilities */
|
||||
.side {
|
||||
float: right;
|
||||
margin: 1em -10em 1em 1em;
|
||||
}
|
||||
.sidebox {
|
||||
background: url("../img/Dividers/Divider_H.png") center bottom no-repeat;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
float: right;
|
||||
margin: 1em;
|
||||
width: 546px;
|
||||
text-align: center;
|
||||
}
|
||||
.sidebox .clip {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
.badge.appstore {
|
||||
position: fixed;
|
||||
display: none;
|
||||
z-index: 100;
|
||||
|
||||
/* appstore-bubble.png *
|
||||
top: 8px;
|
||||
right: 5px;
|
||||
*/
|
||||
/* appstore.png */
|
||||
top: 25px;
|
||||
right: 25px;
|
||||
width: 200px;
|
||||
|
||||
text-align: center;
|
||||
}
|
||||
.badge.appstore img {
|
||||
width: 200px;
|
||||
border-radius: 5px;
|
||||
-webkit-box-shadow: 0 0 30px #AAA;
|
||||
-moz-box-shadow: 0 0 30px #AAA;
|
||||
box-shadow: 0 0 30px #AAA;
|
||||
}
|
||||
.badge.appstore:hover img {
|
||||
-webkit-box-shadow: 0 0 30px #FFF;
|
||||
-moz-box-shadow: 0 0 30px #FFF;
|
||||
box-shadow: 0 0 30px #FFF;
|
||||
}
|
||||
header .badge.appstore {
|
||||
position: absolute;
|
||||
display: block;
|
||||
|
||||
top: auto;
|
||||
/* appstore-bubble.png *
|
||||
bottom: -73px;
|
||||
*/
|
||||
/* appstore.png
|
||||
bottom: -25px;
|
||||
*/
|
||||
top: 125px;
|
||||
}
|
||||
.tip {
|
||||
background: url("../img/tip-above.png") no-repeat;
|
||||
color: white;
|
||||
|
||||
position: absolute;
|
||||
display: block;
|
||||
right: 65px;
|
||||
width: 410px;
|
||||
height: 60px;
|
||||
padding: 12px 20px;
|
||||
margin-top: -60px;
|
||||
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
|
||||
font: 14px "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", "Liberation Sans", sans-serif;
|
||||
}
|
||||
.tip.phone {
|
||||
background: url("../img/tip-below.png") no-repeat;
|
||||
padding: 23px 20px;
|
||||
margin-top: 0px;
|
||||
}
|
||||
.badge {
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
top: 20px;
|
||||
}
|
||||
.footnote {
|
||||
color: #444;
|
||||
|
||||
position: absolute;
|
||||
width: inherit;
|
||||
bottom: 2px;
|
||||
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
}
|
||||
.footnote a:hover {
|
||||
color: #666;
|
||||
}
|
||||
*>.nothover {
|
||||
display: inline-block;
|
||||
}
|
||||
*:hover>.nothover {
|
||||
display: none;
|
||||
}
|
||||
*>.hover {
|
||||
display: none;
|
||||
}
|
||||
*:hover>.hover {
|
||||
display: inline-block;
|
||||
}
|
||||
.columns {
|
||||
position: relative;
|
||||
clear: both;
|
||||
text-align: center;
|
||||
}
|
||||
.columns>div {
|
||||
float: left;
|
||||
width: 25%;
|
||||
height: 22em;
|
||||
margin: 0 4%;
|
||||
padding: 3em 0 1em;
|
||||
text-align: justify;
|
||||
font-size: smaller;
|
||||
}
|
||||
.columns h2 {
|
||||
font-size: 120%;
|
||||
}
|
||||
.columns .columnhead {
|
||||
}
|
||||
.box {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
font-size: 0;
|
||||
}
|
||||
.box img {
|
||||
border: 1px solid white;
|
||||
}
|
||||
.hoverShow {
|
||||
display: none;
|
||||
}
|
||||
.center {
|
||||
text-align: center;
|
||||
}
|
||||
.clear {
|
||||
clear: both;
|
||||
}
|
||||
*:hover>.hoverShow {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
a.previous, a.next {
|
||||
display: block;
|
||||
|
||||
font-size: 150%;
|
||||
font-weight: 400;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
}
|
||||
a.previous {
|
||||
left: 0;
|
||||
}
|
||||
a.previous:before {
|
||||
content: "< ";
|
||||
}
|
||||
a.next {
|
||||
}
|
||||
a.next:after {
|
||||
content: " >";
|
||||
}
|
||||
|
||||
#ribbon {
|
||||
background: url("../img/ribbon-join-beta.png");
|
||||
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
margin-top: -1em;
|
||||
width: 184px;
|
||||
height: 184px;
|
||||
}
|
||||
#frontpage .heading {
|
||||
height: 100% !important;
|
||||
padding-top: 100px;
|
||||
}
|
||||
#frontpage #about {
|
||||
padding-top: 4em;
|
||||
}
|
||||
#frontpage .sidebox {
|
||||
background-position: center 397px;
|
||||
margin-right: -100px;
|
||||
}
|
||||
#frontpage .sidebox .clip {
|
||||
height: 416px;
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
<html>
|
||||
<head>
|
||||
<!-- Google Analytics -->
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-90535-15']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body onload="javascript:void(function(w){try{_gaq._getAsyncTracker()._setVar(w)}catch(e){try{__utmSetVar(w)}catch(e){pageTracker._setVar(w)}}alert('Done. You are now excluded from tracking.')}('exclude_me'));void(0);">
|
||||
|
||||
<h1>Excluding you from Google Analytics web tracking for this site.</h1>
|
||||
|
||||
<p>After the pop-up appears, you should be excluded from any web tracking done by Google Analytics on this web site.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,118 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 15.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="135px" height="40px" viewBox="0 0 135 40" enable-background="new 0 0 135 40" xml:space="preserve">
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M134.032,35.268c0,2.116-1.714,3.83-3.834,3.83H4.729c-2.119,0-3.839-1.714-3.839-3.83V4.725
|
||||
c0-2.115,1.72-3.835,3.839-3.835h125.468c2.121,0,3.834,1.72,3.834,3.835L134.032,35.268L134.032,35.268z"/>
|
||||
<path fill="#A6A6A6" d="M130.198,39.989H4.729C2.122,39.989,0,37.872,0,35.268V4.726C0,2.12,2.122,0,4.729,0h125.468
|
||||
c2.604,0,4.729,2.12,4.729,4.726v30.542C134.928,37.872,132.803,39.989,130.198,39.989L130.198,39.989z"/>
|
||||
<path d="M134.032,35.268c0,2.116-1.714,3.83-3.834,3.83H4.729c-2.119,0-3.839-1.714-3.839-3.83V4.725
|
||||
c0-2.115,1.72-3.835,3.839-3.835h125.468c2.121,0,3.834,1.72,3.834,3.835L134.032,35.268L134.032,35.268z"/>
|
||||
<path fill="#FFFFFF" d="M30.128,19.784c-0.029-3.223,2.639-4.791,2.761-4.864c-1.511-2.203-3.853-2.504-4.676-2.528
|
||||
c-1.967-0.207-3.875,1.177-4.877,1.177c-1.022,0-2.565-1.157-4.228-1.123c-2.14,0.033-4.142,1.272-5.24,3.196
|
||||
c-2.266,3.923-0.576,9.688,1.595,12.859c1.086,1.554,2.355,3.287,4.016,3.226c1.625-0.066,2.232-1.035,4.193-1.035
|
||||
c1.943,0,2.513,1.035,4.207,0.996c1.744-0.027,2.842-1.56,3.89-3.127c1.255-1.779,1.759-3.533,1.779-3.623
|
||||
C33.508,24.924,30.162,23.646,30.128,19.784z"/>
|
||||
<path fill="#FFFFFF" d="M26.928,10.306c0.874-1.093,1.472-2.58,1.306-4.089c-1.265,0.056-2.847,0.875-3.758,1.944
|
||||
c-0.806,0.942-1.526,2.486-1.34,3.938C24.557,12.205,26.016,11.382,26.928,10.306z"/>
|
||||
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="98.9609" y1="0.9028" x2="98.9609" y2="36.9487" gradientTransform="matrix(1 0 0 -1 0 41)">
|
||||
<stop offset="0" style="stop-color:#1A1A1A;stop-opacity:0.1"/>
|
||||
<stop offset="0.1235" style="stop-color:#212121;stop-opacity:0.1506"/>
|
||||
<stop offset="0.3085" style="stop-color:#353535;stop-opacity:0.2265"/>
|
||||
<stop offset="0.5321" style="stop-color:#575757;stop-opacity:0.3181"/>
|
||||
<stop offset="0.7834" style="stop-color:#858585;stop-opacity:0.4212"/>
|
||||
<stop offset="1" style="stop-color:#B3B3B3;stop-opacity:0.51"/>
|
||||
</linearGradient>
|
||||
<path fill="url(#SVGID_1_)" d="M130.198,0H62.993l26.323,39.989h40.882c2.604,0,4.729-2.117,4.729-4.724V4.726
|
||||
C134.928,2.12,132.803,0,130.198,0z"/>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M53.665,31.504h-2.271l-1.244-3.909h-4.324l-1.185,3.909H42.43l4.285-13.308h2.646L53.665,31.504z
|
||||
M49.775,25.955L48.65,22.48c-0.119-0.355-0.343-1.191-0.671-2.507h-0.04c-0.132,0.566-0.343,1.402-0.632,2.507l-1.106,3.475
|
||||
H49.775z"/>
|
||||
<path fill="#FFFFFF" d="M64.663,26.588c0,1.632-0.443,2.922-1.33,3.869c-0.794,0.843-1.781,1.264-2.958,1.264
|
||||
c-1.271,0-2.185-0.453-2.74-1.361v5.035h-2.132V25.062c0-1.025-0.027-2.076-0.079-3.154h1.875l0.119,1.521h0.04
|
||||
c0.711-1.146,1.79-1.719,3.238-1.719c1.132,0,2.077,0.447,2.833,1.342C64.284,23.949,64.663,25.127,64.663,26.588z M62.491,26.666
|
||||
c0-0.934-0.21-1.704-0.632-2.311c-0.461-0.631-1.08-0.947-1.856-0.947c-0.526,0-1.004,0.176-1.431,0.523
|
||||
c-0.428,0.35-0.708,0.807-0.839,1.373c-0.066,0.264-0.099,0.479-0.099,0.649v1.601c0,0.697,0.214,1.286,0.642,1.768
|
||||
c0.428,0.48,0.984,0.721,1.668,0.721c0.803,0,1.428-0.311,1.875-0.928C62.267,28.496,62.491,27.68,62.491,26.666z"/>
|
||||
<path fill="#FFFFFF" d="M75.7,26.588c0,1.632-0.443,2.922-1.33,3.869c-0.795,0.843-1.781,1.264-2.959,1.264
|
||||
c-1.271,0-2.185-0.453-2.74-1.361v5.035h-2.132V25.062c0-1.025-0.027-2.076-0.079-3.154h1.875l0.119,1.521h0.04
|
||||
c0.71-1.146,1.789-1.719,3.238-1.719c1.131,0,2.076,0.447,2.834,1.342C75.32,23.949,75.7,25.127,75.7,26.588z M73.527,26.666
|
||||
c0-0.934-0.211-1.704-0.633-2.311c-0.461-0.631-1.078-0.947-1.854-0.947c-0.526,0-1.004,0.176-1.433,0.523
|
||||
c-0.428,0.35-0.707,0.807-0.838,1.373c-0.065,0.264-0.1,0.479-0.1,0.649v1.601c0,0.697,0.215,1.286,0.641,1.768
|
||||
c0.428,0.479,0.984,0.721,1.67,0.721c0.804,0,1.429-0.311,1.875-0.928C73.303,28.496,73.527,27.68,73.527,26.666z"/>
|
||||
<path fill="#FFFFFF" d="M88.04,27.771c0,1.133-0.396,2.054-1.183,2.765c-0.866,0.776-2.075,1.165-3.625,1.165
|
||||
c-1.432,0-2.58-0.276-3.446-0.829l0.493-1.777c0.935,0.554,1.962,0.83,3.08,0.83c0.804,0,1.429-0.182,1.875-0.543
|
||||
c0.447-0.362,0.673-0.846,0.673-1.45c0-0.541-0.187-0.994-0.554-1.363c-0.369-0.368-0.979-0.711-1.836-1.026
|
||||
c-2.33-0.869-3.496-2.14-3.496-3.812c0-1.092,0.412-1.986,1.234-2.685c0.822-0.698,1.912-1.047,3.268-1.047
|
||||
c1.211,0,2.22,0.211,3.021,0.632l-0.535,1.738c-0.754-0.408-1.605-0.612-2.557-0.612c-0.752,0-1.342,0.185-1.764,0.553
|
||||
c-0.355,0.329-0.535,0.73-0.535,1.206c0,0.525,0.205,0.961,0.613,1.303c0.354,0.315,1,0.658,1.934,1.026
|
||||
c1.146,0.462,1.988,1,2.527,1.618C87.77,26.081,88.04,26.852,88.04,27.771z"/>
|
||||
<path fill="#FFFFFF" d="M95.107,23.508h-2.35v4.659c0,1.185,0.414,1.776,1.244,1.776c0.381,0,0.697-0.032,0.947-0.099l0.059,1.619
|
||||
c-0.42,0.157-0.973,0.236-1.658,0.236c-0.842,0-1.5-0.257-1.975-0.771c-0.473-0.514-0.711-1.375-0.711-2.587v-4.837h-1.4v-1.6h1.4
|
||||
v-1.757l2.094-0.632v2.389h2.35V23.508z"/>
|
||||
<path fill="#FFFFFF" d="M105.689,26.627c0,1.475-0.422,2.686-1.264,3.633c-0.881,0.975-2.053,1.461-3.514,1.461
|
||||
c-1.41,0-2.531-0.467-3.367-1.4c-0.836-0.935-1.254-2.113-1.254-3.534c0-1.487,0.432-2.705,1.293-3.652
|
||||
c0.863-0.948,2.025-1.422,3.486-1.422c1.408,0,2.539,0.468,3.395,1.402C105.282,24.021,105.689,25.191,105.689,26.627z
|
||||
M103.479,26.676c0-0.879-0.19-1.633-0.571-2.264c-0.447-0.762-1.087-1.143-1.916-1.143c-0.854,0-1.509,0.381-1.955,1.143
|
||||
c-0.382,0.631-0.572,1.398-0.572,2.304c0,0.88,0.19,1.636,0.572,2.265c0.461,0.762,1.104,1.143,1.937,1.143
|
||||
c0.815,0,1.454-0.389,1.916-1.162C103.282,28.316,103.479,27.557,103.479,26.676z"/>
|
||||
<path fill="#FFFFFF" d="M112.622,23.783c-0.211-0.039-0.437-0.059-0.672-0.059c-0.75,0-1.33,0.282-1.738,0.85
|
||||
c-0.354,0.5-0.532,1.132-0.532,1.895v5.035h-2.132V24.93c0-1.105-0.021-2.113-0.062-3.021h1.857l0.078,1.836h0.059
|
||||
c0.226-0.631,0.58-1.14,1.066-1.521c0.475-0.343,0.988-0.514,1.541-0.514c0.197,0,0.375,0.014,0.533,0.039L112.622,23.783
|
||||
L112.622,23.783z"/>
|
||||
<path fill="#FFFFFF" d="M122.157,26.252c0,0.382-0.025,0.704-0.078,0.967h-6.396c0.024,0.948,0.334,1.674,0.928,2.174
|
||||
c0.539,0.446,1.236,0.67,2.092,0.67c0.947,0,1.811-0.15,2.588-0.453l0.334,1.479c-0.908,0.396-1.98,0.593-3.217,0.593
|
||||
c-1.488,0-2.656-0.438-3.506-1.312c-0.848-0.875-1.273-2.051-1.273-3.524c0-1.446,0.395-2.651,1.186-3.612
|
||||
c0.828-1.026,1.947-1.539,3.355-1.539c1.383,0,2.43,0.513,3.141,1.539C121.874,24.047,122.157,25.055,122.157,26.252z
|
||||
M120.124,25.699c0.015-0.633-0.125-1.178-0.414-1.639c-0.369-0.594-0.937-0.89-1.698-0.89c-0.697,0-1.265,0.289-1.697,0.869
|
||||
c-0.355,0.461-0.566,1.015-0.631,1.658L120.124,25.699L120.124,25.699z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path fill="#FFFFFF" d="M48.747,13.433H47.63l-0.611-1.921h-2.125l-0.583,1.921h-1.087l2.106-6.541h1.3L48.747,13.433z
|
||||
M46.835,10.706l-0.553-1.708c-0.058-0.175-0.165-0.582-0.33-1.232h-0.02c-0.068,0.281-0.165,0.689-0.311,1.232l-0.543,1.708
|
||||
H46.835z"/>
|
||||
<path fill="#FFFFFF" d="M54.013,8.717l-1.786,4.716h-1.019L49.48,8.717h1.126l0.806,2.494c0.136,0.417,0.252,0.815,0.339,1.193
|
||||
h0.029c0.078-0.339,0.194-0.737,0.339-1.193l0.796-2.494H54.013z"/>
|
||||
<path fill="#FFFFFF" d="M57.815,13.433l-0.078-0.543h-0.029c-0.32,0.437-0.786,0.65-1.378,0.65c-0.844,0-1.446-0.592-1.446-1.388
|
||||
c0-1.164,1.009-1.766,2.756-1.766v-0.087c0-0.621-0.33-0.932-0.98-0.932c-0.466,0-0.874,0.117-1.232,0.35l-0.213-0.689
|
||||
c0.437-0.272,0.98-0.408,1.621-0.408c1.232,0,1.854,0.65,1.854,1.951v1.737c0,0.476,0.02,0.845,0.068,1.126L57.815,13.433
|
||||
L57.815,13.433z M57.669,11.084c-1.165,0-1.747,0.282-1.747,0.951c0,0.495,0.301,0.737,0.718,0.737
|
||||
c0.534,0,1.029-0.407,1.029-0.96V11.084z"/>
|
||||
<path fill="#FFFFFF" d="M61.024,7.94c-0.349,0-0.621-0.272-0.621-0.631s0.281-0.621,0.641-0.621c0.359,0,0.65,0.262,0.64,0.621
|
||||
C61.684,7.688,61.413,7.94,61.024,7.94z M61.568,13.433H60.52V8.717h1.048V13.433z"/>
|
||||
<path fill="#FFFFFF" d="M64.478,13.433H63.43v-6.88h1.048V13.433z"/>
|
||||
<path fill="#FFFFFF" d="M68.932,13.433l-0.078-0.543h-0.029c-0.32,0.437-0.786,0.65-1.378,0.65c-0.844,0-1.446-0.592-1.446-1.388
|
||||
c0-1.164,1.009-1.766,2.756-1.766v-0.087c0-0.621-0.33-0.932-0.98-0.932c-0.466,0-0.874,0.117-1.232,0.35l-0.214-0.69
|
||||
c0.437-0.272,0.98-0.408,1.621-0.408c1.232,0,1.854,0.65,1.854,1.951v1.737c0,0.476,0.021,0.845,0.067,1.126H68.932z
|
||||
M68.786,11.084c-1.165,0-1.747,0.282-1.747,0.951c0,0.495,0.301,0.737,0.718,0.737c0.534,0,1.029-0.407,1.029-0.96V11.084z"/>
|
||||
<path fill="#FFFFFF" d="M74.052,13.54c-0.669,0-1.163-0.282-1.483-0.835h-0.021l-0.06,0.728h-0.893
|
||||
c0.029-0.378,0.039-0.806,0.039-1.271V6.553h1.049v2.854h0.02c0.311-0.524,0.814-0.786,1.504-0.786
|
||||
c1.136,0,1.932,0.971,1.932,2.387C76.139,12.472,75.255,13.54,74.052,13.54z M73.839,9.444c-0.603,0-1.155,0.524-1.155,1.252
|
||||
v0.825c0,0.65,0.496,1.184,1.137,1.184c0.785,0,1.252-0.64,1.252-1.659C75.072,10.095,74.586,9.444,73.839,9.444z"/>
|
||||
<path fill="#FFFFFF" d="M78.736,13.433h-1.047v-6.88h1.047V13.433z"/>
|
||||
<path fill="#FFFFFF" d="M84.441,11.327h-3.146c0.021,0.893,0.611,1.397,1.485,1.397c0.466,0,0.893-0.078,1.271-0.223l0.163,0.728
|
||||
c-0.446,0.194-0.97,0.291-1.581,0.291c-1.476,0-2.349-0.932-2.349-2.377c0-1.446,0.894-2.533,2.231-2.533
|
||||
c1.203,0,1.961,0.893,1.961,2.242C84.48,11.036,84.471,11.201,84.441,11.327z M83.48,10.58c0-0.728-0.369-1.242-1.039-1.242
|
||||
c-0.602,0-1.076,0.524-1.146,1.242H83.48z"/>
|
||||
<path fill="#FFFFFF" d="M90.793,13.54c-1.378,0-2.271-1.029-2.271-2.426c0-1.456,0.912-2.494,2.35-2.494
|
||||
c1.357,0,2.271,0.98,2.271,2.417C93.143,12.511,92.201,13.54,90.793,13.54z M90.833,9.386c-0.757,0-1.242,0.708-1.242,1.698
|
||||
c0,0.971,0.495,1.679,1.232,1.679s1.231-0.757,1.231-1.699C92.055,10.104,91.57,9.386,90.833,9.386z"/>
|
||||
<path fill="#FFFFFF" d="M98.777,13.433H97.73v-2.708c0-0.834-0.32-1.252-0.951-1.252c-0.621,0-1.049,0.534-1.049,1.155v2.805
|
||||
h-1.047v-3.368c0-0.417-0.011-0.864-0.039-1.349h0.922l0.049,0.728h0.029c0.28-0.504,0.854-0.825,1.494-0.825
|
||||
c0.989,0,1.639,0.757,1.639,1.989V13.433L98.777,13.433z"/>
|
||||
<path fill="#FFFFFF" d="M105.634,9.503h-1.153v2.29c0,0.583,0.203,0.874,0.61,0.874c0.185,0,0.341-0.02,0.466-0.049l0.029,0.796
|
||||
c-0.204,0.078-0.477,0.117-0.814,0.117c-0.826,0-1.319-0.456-1.319-1.65V9.503h-0.688V8.717h0.688V7.853l1.028-0.311v1.174h1.153
|
||||
V9.503z"/>
|
||||
<path fill="#FFFFFF" d="M111.184,13.433h-1.049v-2.688c0-0.844-0.32-1.271-0.951-1.271c-0.543,0-1.047,0.369-1.047,1.116v2.843
|
||||
h-1.049v-6.88h1.049v2.833h0.02c0.33-0.514,0.806-0.767,1.417-0.767c0.999,0,1.61,0.776,1.61,2.009V13.433z"/>
|
||||
<path fill="#FFFFFF" d="M116.539,11.327h-3.145c0.02,0.893,0.61,1.397,1.484,1.397c0.467,0,0.893-0.078,1.271-0.223l0.164,0.728
|
||||
c-0.446,0.194-0.971,0.291-1.582,0.291c-1.476,0-2.349-0.932-2.349-2.377c0-1.446,0.894-2.533,2.231-2.533
|
||||
c1.203,0,1.961,0.893,1.961,2.242C116.578,11.036,116.568,11.201,116.539,11.327z M115.578,10.58c0-0.728-0.368-1.242-1.038-1.242
|
||||
c-0.603,0-1.077,0.524-1.146,1.242H115.578z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 322 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 697 B |
|
Before Width: | Height: | Size: 376 KiB |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 8.0 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 334 KiB |
|
Before Width: | Height: | Size: 510 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 188 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |