Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5b08149ca6 | ||
|
|
58afc19c26 | ||
|
|
b3109187e9 | ||
|
|
a6e7a749bf | ||
|
|
ca5d83d40c | ||
|
|
285813324f | ||
|
|
d4b772b467 | ||
|
|
f392ad4053 | ||
|
|
35990f3bdd | ||
|
|
3932857c21 | ||
|
|
6f771a972b | ||
|
|
806a07135a |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -28,9 +28,6 @@ Press/MasterPassword_PressKit/MasterPassword_pressrelease_*.pdf
|
|||||||
/sendipa/*
|
/sendipa/*
|
||||||
!/sendipa/sendipa.conf
|
!/sendipa/sendipa.conf
|
||||||
|
|
||||||
# Java
|
|
||||||
MasterPassword/Java/**/target
|
|
||||||
|
|
||||||
# C
|
# C
|
||||||
MasterPassword/C/VERSION
|
MasterPassword/C/VERSION
|
||||||
MasterPassword/C/*.o
|
MasterPassword/C/*.o
|
||||||
|
|||||||
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -18,4 +18,4 @@
|
|||||||
url = git://github.com/jonmarimba/jrswizzle.git
|
url = git://github.com/jonmarimba/jrswizzle.git
|
||||||
[submodule "Site/mpw-js/js/mpw-js"]
|
[submodule "Site/mpw-js/js/mpw-js"]
|
||||||
path = Site/mpw-js/js/mpw-js
|
path = Site/mpw-js/js/mpw-js
|
||||||
url = https://github.com/Lyndir/mpw-js.git
|
url = https://github.com/tmthrgd/mpw-js.git
|
||||||
|
|||||||
2
External/Pearl
vendored
2
External/Pearl
vendored
Submodule External/Pearl updated: 6abdab7168...08c42ba0f9
@@ -227,8 +227,8 @@ mpw() {
|
|||||||
cc "${CFLAGS[@]}" "$@" -c mpw-algorithm.c -o mpw-algorithm.o
|
cc "${CFLAGS[@]}" "$@" -c mpw-algorithm.c -o mpw-algorithm.o
|
||||||
cc "${CFLAGS[@]}" "$@" -c mpw-types.c -o mpw-types.o
|
cc "${CFLAGS[@]}" "$@" -c mpw-types.c -o mpw-types.o
|
||||||
cc "${CFLAGS[@]}" "$@" -c mpw-util.c -o mpw-util.o
|
cc "${CFLAGS[@]}" "$@" -c mpw-util.c -o mpw-util.o
|
||||||
cc "${CFLAGS[@]}" "${LDFLAGS[@]}" "$@" "mpw-algorithm.o" "mpw-types.o" "mpw-util.o" \
|
cc "${CFLAGS[@]}" "$@" "mpw-algorithm.o" "mpw-types.o" "mpw-util.o" \
|
||||||
mpw-cli.c -o mpw
|
"${LDFLAGS[@]}" "mpw-cli.c" -o "mpw"
|
||||||
echo "done! Now run ./install or use ./mpw"
|
echo "done! Now run ./install or use ./mpw"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,8 +264,8 @@ mpw-bench() {
|
|||||||
-l"crypto"
|
-l"crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
cc "${CFLAGS[@]}" "${LDFLAGS[@]}" "$@" "mpw-algorithm.o" "mpw-types.o" "mpw-util.o" \
|
cc "${CFLAGS[@]}" "$@" "mpw-algorithm.o" "mpw-types.o" "mpw-util.o" \
|
||||||
mpw-bench.c -o mpw-bench
|
"${LDFLAGS[@]}" "mpw-bench.c" -o "mpw-bench"
|
||||||
echo "done! Now use ./mpw-bench"
|
echo "done! Now use ./mpw-bench"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -296,9 +296,9 @@ mpw-tests() {
|
|||||||
-l"crypto" -l"xml2"
|
-l"crypto" -l"xml2"
|
||||||
)
|
)
|
||||||
|
|
||||||
cc "${CFLAGS[@]}" "$@" -c mpw-tests-util.c -o mpw-tests-util.o
|
cc "${CFLAGS[@]}" "$@" -c mpw-tests-util.c -o mpw-tests-util.o
|
||||||
cc "${CFLAGS[@]}" "${LDFLAGS[@]}" "$@" "mpw-algorithm.o" "mpw-types.o" "mpw-util.o" "mpw-tests-util.o" \
|
cc "${CFLAGS[@]}" "$@" "mpw-algorithm.o" "mpw-types.o" "mpw-util.o" "mpw-tests-util.o" \
|
||||||
mpw-tests.c -o mpw-tests
|
"${LDFLAGS[@]}" "mpw-tests.c" -o "mpw-tests"
|
||||||
echo "done! Now use ./mpw-tests"
|
echo "done! Now use ./mpw-tests"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,8 +15,10 @@
|
|||||||
#define trc(...) fprintf( stderr, __VA_ARGS__ )
|
#define trc(...) fprintf( stderr, __VA_ARGS__ )
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
|
#ifndef trc
|
||||||
#define trc(...) do {} while (0)
|
#define trc(...) do {} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
#ifndef ftl
|
#ifndef ftl
|
||||||
#define ftl(...) do { fprintf( stderr, __VA_ARGS__ ); abort(); } while (0)
|
#define ftl(...) do { fprintf( stderr, __VA_ARGS__ ); abort(); } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
2
MasterPassword/Java/.gitignore
vendored
Normal file
2
MasterPassword/Java/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
target
|
||||||
|
dependency-reduced-pom.xml
|
||||||
@@ -24,12 +24,12 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.lyndir.lhunath.opal</groupId>
|
<groupId>com.lyndir.lhunath.opal</groupId>
|
||||||
<artifactId>opal-system</artifactId>
|
<artifactId>opal-system</artifactId>
|
||||||
<version>1.6-p6</version>
|
<version>1.6-p7</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.lyndir.lhunath.opal</groupId>
|
<groupId>com.lyndir.lhunath.opal</groupId>
|
||||||
<artifactId>opal-crypto</artifactId>
|
<artifactId>opal-crypto</artifactId>
|
||||||
<version>1.6-p6</version>
|
<version>1.6-p7</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- EXTERNAL DEPENDENCIES -->
|
<!-- EXTERNAL DEPENDENCIES -->
|
||||||
|
|||||||
@@ -77,15 +77,6 @@ public class MasterKey {
|
|||||||
return idForBytes( masterKey );
|
return idForBytes( masterKey );
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] getSubKey(final int subkeyLength) {
|
|
||||||
|
|
||||||
Preconditions.checkState( valid );
|
|
||||||
byte[] subkey = new byte[Math.min( subkeyLength, masterKey.length )];
|
|
||||||
System.arraycopy( masterKey, 0, subkey, 0, subkey.length );
|
|
||||||
|
|
||||||
return subkey;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String encode(final String siteName, final MPSiteType siteType, int siteCounter, final MPSiteVariant siteVariant,
|
public String encode(final String siteName, final MPSiteType siteType, int siteCounter, final MPSiteVariant siteVariant,
|
||||||
@Nullable final String siteContext) {
|
@Nullable final String siteContext) {
|
||||||
Preconditions.checkState( valid );
|
Preconditions.checkState( valid );
|
||||||
|
|||||||
@@ -114,11 +114,10 @@
|
|||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.lambdaworks</groupId>
|
<groupId>com.lambdaworks</groupId>
|
||||||
<artifactId>libscrypt</artifactId>
|
<artifactId>scrypt</artifactId>
|
||||||
<version>1.4.0</version>
|
<version>1.4.0-android</version>
|
||||||
<type>so</type>
|
<type>jar</type>
|
||||||
<classifier>android</classifier>
|
<classifier>native</classifier>
|
||||||
<scope>runtime</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|||||||
@@ -12,64 +12,61 @@
|
|||||||
android:gravity="center">
|
android:gravity="center">
|
||||||
|
|
||||||
<View
|
<View
|
||||||
android:layout_width="0dp"
|
android:layout_width="1dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1" />
|
android:layout_weight="1" />
|
||||||
|
|
||||||
<ProgressBar
|
<ProgressBar
|
||||||
android:id="@+id/progressView"
|
android:id="@+id/progressView"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="300dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="20dp"
|
||||||
android:indeterminate="true" />
|
android:indeterminate="true" />
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="0dp"
|
|
||||||
android:layout_weight="1" />
|
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/userNameField"
|
android:id="@+id/userNameField"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="300dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:inputType="text|textCapWords|textPersonName"
|
android:inputType="text|textCapWords|textPersonName"
|
||||||
android:hint="@string/userName.hint"
|
android:hint="@string/userName_hint"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textColor="#FFFFFF"
|
android:textColor="#FFFFFF"
|
||||||
android:textSize="26sp" />
|
android:textSize="26sp" />
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/masterPasswordField"
|
android:id="@+id/masterPasswordField"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="300dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:inputType="text|textPassword"
|
android:inputType="text|textPassword"
|
||||||
android:hint="@string/masterPassword.hint"
|
android:hint="@string/masterPassword_hint"
|
||||||
android:password="true"
|
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textColor="#FFFFFF"
|
android:textColor="#FFFFFF"
|
||||||
android:textSize="18sp" />
|
android:textSize="18sp" />
|
||||||
|
|
||||||
<ImageView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:src="@drawable/double_"
|
|
||||||
android:contentDescription="@string/empty" />
|
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/siteNameField"
|
android:id="@+id/siteNameField"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="300dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:inputType="text|textNoSuggestions|textUri"
|
android:inputType="text|textNoSuggestions|textUri"
|
||||||
android:hint="@string/siteName.hint"
|
android:hint="@string/siteName_hint"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:textColor="#FFFFFF"
|
android:textColor="#FFFFFF"
|
||||||
android:textSize="26sp" />
|
android:textSize="26sp" />
|
||||||
|
|
||||||
<Button
|
<ImageView
|
||||||
|
android:layout_width="300dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:layout_marginBottom="30dp"
|
||||||
|
android:src="@drawable/double_"
|
||||||
|
android:contentDescription="@string/empty" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
android:id="@+id/sitePasswordField"
|
android:id="@+id/sitePasswordField"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="300dp"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:background="@null"
|
android:background="@android:color/transparent"
|
||||||
android:textColor="#FFFFFF"
|
android:textColor="#FFFFFF"
|
||||||
android:textSize="32sp"
|
android:textSize="32sp"
|
||||||
android:text="LuxdZozvDuma4["
|
android:text="LuxdZozvDuma4["
|
||||||
@@ -77,13 +74,30 @@
|
|||||||
|
|
||||||
<Spinner
|
<Spinner
|
||||||
android:id="@+id/typeField"
|
android:id="@+id/typeField"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="300dp"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center" />
|
||||||
|
|
||||||
<NumberPicker
|
<EditText
|
||||||
android:id="@+id/counterField"
|
android:id="@+id/counterField"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="300dp"
|
||||||
android:layout_height="wrap_content" />
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:inputType="text|textNoSuggestions"
|
||||||
|
android:textColor="#FFFFFF"
|
||||||
|
android:textSize="26sp"
|
||||||
|
android:text="1" />
|
||||||
|
|
||||||
|
<View
|
||||||
|
android:layout_width="1dp"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1" />
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/rememberPasswordField"
|
||||||
|
android:layout_width="300dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/remember" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,9 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Master Password</string>
|
<string name="app_name">Master Password</string>
|
||||||
<string name="avatar">User Avatar</string>
|
<string name="avatar">User Avatar</string>
|
||||||
<string name="siteName.hint">Site Name</string>
|
<string name="remember">Remember Password</string>
|
||||||
<string name="userName.hint">Your Name</string>
|
<string name="siteName_hint">Site Name</string>
|
||||||
<string name="masterPassword.hint">Your Master Password</string>
|
<string name="userName_hint">Your Name</string>
|
||||||
|
<string name="masterPassword_hint">Your Master Password</string>
|
||||||
<string name="empty" />
|
<string name="empty" />
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -9,12 +9,14 @@ import android.os.Bundle;
|
|||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.WindowManager;
|
||||||
import android.widget.*;
|
import android.widget.*;
|
||||||
import butterknife.ButterKnife;
|
import butterknife.ButterKnife;
|
||||||
import butterknife.InjectView;
|
import butterknife.InjectView;
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
import com.google.common.util.concurrent.*;
|
import com.google.common.util.concurrent.*;
|
||||||
import com.lyndir.lhunath.opal.system.logging.Logger;
|
import com.lyndir.lhunath.opal.system.logging.Logger;
|
||||||
|
import com.lyndir.lhunath.opal.system.util.ConversionUtils;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
|
|
||||||
@@ -55,11 +57,14 @@ public class EmergencyActivity extends Activity {
|
|||||||
Spinner typeField;
|
Spinner typeField;
|
||||||
|
|
||||||
@InjectView(R.id.counterField)
|
@InjectView(R.id.counterField)
|
||||||
NumberPicker counterField;
|
EditText counterField;
|
||||||
|
|
||||||
@InjectView(R.id.sitePasswordField)
|
@InjectView(R.id.sitePasswordField)
|
||||||
TextView sitePasswordField;
|
TextView sitePasswordField;
|
||||||
|
|
||||||
|
@InjectView(R.id.rememberPasswordField)
|
||||||
|
CheckBox rememberPasswordField;
|
||||||
|
|
||||||
private int hc_userName;
|
private int hc_userName;
|
||||||
private int hc_masterPassword;
|
private int hc_masterPassword;
|
||||||
|
|
||||||
@@ -68,6 +73,7 @@ public class EmergencyActivity extends Activity {
|
|||||||
super.onCreate( savedInstanceState );
|
super.onCreate( savedInstanceState );
|
||||||
Res.init( getResources() );
|
Res.init( getResources() );
|
||||||
|
|
||||||
|
getWindow().setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE );
|
||||||
setContentView( R.layout.activity_emergency );
|
setContentView( R.layout.activity_emergency );
|
||||||
ButterKnife.inject( this );
|
ButterKnife.inject( this );
|
||||||
|
|
||||||
@@ -75,23 +81,26 @@ public class EmergencyActivity extends Activity {
|
|||||||
masterPasswordField.setOnFocusChangeListener( updateMasterKey );
|
masterPasswordField.setOnFocusChangeListener( updateMasterKey );
|
||||||
siteNameField.addTextChangedListener( updateSitePassword );
|
siteNameField.addTextChangedListener( updateSitePassword );
|
||||||
typeField.setOnItemSelectedListener( updateSitePassword );
|
typeField.setOnItemSelectedListener( updateSitePassword );
|
||||||
counterField.setOnValueChangedListener( updateSitePassword );
|
counterField.addTextChangedListener( updateSitePassword );
|
||||||
|
|
||||||
userNameField.setTypeface( Res.exo_Thin );
|
userNameField.setTypeface( Res.exo_Thin );
|
||||||
userNameField.setPaintFlags( userNameField.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG );
|
userNameField.setPaintFlags( userNameField.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG );
|
||||||
masterPasswordField.setTypeface( Res.sourceCodePro_ExtraLight );
|
masterPasswordField.setTypeface( Res.sourceCodePro_ExtraLight );
|
||||||
masterPasswordField.setPaintFlags( userNameField.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG );
|
masterPasswordField.setPaintFlags( masterPasswordField.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG );
|
||||||
siteNameField.setTypeface( Res.exo_Regular );
|
siteNameField.setTypeface( Res.exo_Regular );
|
||||||
siteNameField.setPaintFlags( userNameField.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG );
|
siteNameField.setPaintFlags( siteNameField.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG );
|
||||||
sitePasswordField.setTypeface( Res.sourceCodePro_Black );
|
sitePasswordField.setTypeface( Res.sourceCodePro_Black );
|
||||||
sitePasswordField.setPaintFlags( userNameField.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG );
|
sitePasswordField.setPaintFlags( sitePasswordField.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG );
|
||||||
|
|
||||||
typeField.setAdapter( new ArrayAdapter<>( this, R.layout.type_item, MPSiteType.forClass( MPSiteTypeClass.Generated ) ) );
|
typeField.setAdapter( new ArrayAdapter<>( this, R.layout.type_item, MPSiteType.forClass( MPSiteTypeClass.Generated ) ) );
|
||||||
typeField.setSelection( MPSiteType.GeneratedLong.ordinal() );
|
typeField.setSelection( MPSiteType.GeneratedLong.ordinal() );
|
||||||
|
|
||||||
counterField.setMinValue( 1 );
|
rememberPasswordField.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
|
||||||
counterField.setMaxValue( Integer.MAX_VALUE );
|
@Override
|
||||||
counterField.setWrapSelectorWheel( false );
|
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
|
||||||
|
getPreferences( MODE_PRIVATE ).edit().putBoolean( "rememberPassword", isChecked ).apply();
|
||||||
|
}
|
||||||
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -99,25 +108,32 @@ public class EmergencyActivity extends Activity {
|
|||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
userNameField.setText( getPreferences( MODE_PRIVATE ).getString( "userName", "" ) );
|
userNameField.setText( getPreferences( MODE_PRIVATE ).getString( "userName", "" ) );
|
||||||
|
rememberPasswordField.setSelected( isRememberPasswordEnabled() );
|
||||||
masterPasswordField.requestFocus();
|
masterPasswordField.requestFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPause() {
|
protected void onPause() {
|
||||||
synchronized (this) {
|
if (!isRememberPasswordEnabled()) {
|
||||||
hc_userName = hc_masterPassword = 0;
|
synchronized (this) {
|
||||||
if (masterKeyFuture != null) {
|
hc_userName = hc_masterPassword = 0;
|
||||||
masterKeyFuture.cancel( true );
|
if (masterKeyFuture != null) {
|
||||||
masterKeyFuture = null;
|
masterKeyFuture.cancel( true );
|
||||||
|
masterKeyFuture = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
sitePasswordField.setText( "" );
|
||||||
|
progressView.setVisibility( View.INVISIBLE );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sitePasswordField.setText( "" );
|
|
||||||
progressView.setVisibility( View.INVISIBLE );
|
|
||||||
|
|
||||||
super.onPause();
|
super.onPause();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isRememberPasswordEnabled() {
|
||||||
|
return getPreferences( MODE_PRIVATE ).getBoolean( "rememberPassword", false );
|
||||||
|
}
|
||||||
|
|
||||||
private synchronized void updateMasterKey() {
|
private synchronized void updateMasterKey() {
|
||||||
final String userName = userNameField.getText().toString();
|
final String userName = userNameField.getText().toString();
|
||||||
final String masterPassword = masterPasswordField.getText().toString();
|
final String masterPassword = masterPasswordField.getText().toString();
|
||||||
@@ -126,9 +142,7 @@ public class EmergencyActivity extends Activity {
|
|||||||
hc_userName = userName.hashCode();
|
hc_userName = userName.hashCode();
|
||||||
hc_masterPassword = masterPassword.hashCode();
|
hc_masterPassword = masterPassword.hashCode();
|
||||||
|
|
||||||
SharedPreferences.Editor pref = getPreferences( MODE_PRIVATE ).edit();
|
getPreferences( MODE_PRIVATE ).edit().putString( "userName", userName ).apply();
|
||||||
pref.putString( "userName", userName );
|
|
||||||
pref.apply();
|
|
||||||
|
|
||||||
if (masterKeyFuture != null)
|
if (masterKeyFuture != null)
|
||||||
masterKeyFuture.cancel( true );
|
masterKeyFuture.cancel( true );
|
||||||
@@ -170,7 +184,7 @@ public class EmergencyActivity extends Activity {
|
|||||||
private void updateSitePassword() {
|
private void updateSitePassword() {
|
||||||
final String siteName = siteNameField.getText().toString();
|
final String siteName = siteNameField.getText().toString();
|
||||||
final MPSiteType type = (MPSiteType) typeField.getSelectedItem();
|
final MPSiteType type = (MPSiteType) typeField.getSelectedItem();
|
||||||
final int counter = counterField.getValue();
|
final int counter = ConversionUtils.toIntegerNN( counterField.getText() );
|
||||||
|
|
||||||
if (masterKeyFuture == null || siteName.isEmpty() || type == null) {
|
if (masterKeyFuture == null || siteName.isEmpty() || type == null) {
|
||||||
sitePasswordField.setText( "" );
|
sitePasswordField.setText( "" );
|
||||||
@@ -220,13 +234,13 @@ public class EmergencyActivity extends Activity {
|
|||||||
|
|
||||||
ClipDescription description = new ClipDescription( strf( "Password for %s", siteNameField.getText() ),
|
ClipDescription description = new ClipDescription( strf( "Password for %s", siteNameField.getText() ),
|
||||||
new String[]{ ClipDescription.MIMETYPE_TEXT_PLAIN } );
|
new String[]{ ClipDescription.MIMETYPE_TEXT_PLAIN } );
|
||||||
((ClipboardManager) getSystemService( CLIPBOARD_SERVICE )).setPrimaryClip(
|
ClipData clipData = new ClipData( description, new ClipData.Item( sitePassword ) );
|
||||||
new ClipData( description, new ClipData.Item( sitePassword ) ) );
|
((ClipboardManager) getSystemService( CLIPBOARD_SERVICE )).setPrimaryClip( clipData );
|
||||||
|
|
||||||
Intent startMain = new Intent(Intent.ACTION_MAIN);
|
Intent startMain = new Intent( Intent.ACTION_MAIN );
|
||||||
startMain.addCategory(Intent.CATEGORY_HOME);
|
startMain.addCategory( Intent.CATEGORY_HOME );
|
||||||
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
startMain.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
|
||||||
startActivity(startMain);
|
startActivity( startMain );
|
||||||
}
|
}
|
||||||
|
|
||||||
private abstract class ValueChangedListener
|
private abstract class ValueChangedListener
|
||||||
|
|||||||
@@ -171,6 +171,7 @@ public class PasswordFrame extends JFrame implements DocumentListener {
|
|||||||
passwordField.setHorizontalAlignment( JTextField.CENTER );
|
passwordField.setHorizontalAlignment( JTextField.CENTER );
|
||||||
passwordField.setAlignmentX( Component.CENTER_ALIGNMENT );
|
passwordField.setAlignmentX( Component.CENTER_ALIGNMENT );
|
||||||
passwordField.setEditable( false );
|
passwordField.setEditable( false );
|
||||||
|
passwordField.putClientProperty( "JPasswordField.cutCopyAllowed", true );
|
||||||
passwordEchoChar = passwordField.getEchoChar();
|
passwordEchoChar = passwordField.getEchoChar();
|
||||||
passwordEchoFont = passwordField.getFont().deriveFont( 40f );
|
passwordEchoFont = passwordField.getFont().deriveFont( 40f );
|
||||||
updateMask();
|
updateMask();
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>com.lyndir.lhunath</groupId>
|
<groupId>com.lyndir.lhunath</groupId>
|
||||||
<artifactId>lyndir</artifactId>
|
<artifactId>lyndir</artifactId>
|
||||||
<version>1.18</version>
|
<version>1.20</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<name>Master Password</name>
|
<name>Master Password</name>
|
||||||
|
|||||||
@@ -6,15 +6,15 @@
|
|||||||
// Copyright (c) 2012 Lyndir. All rights reserved.
|
// Copyright (c) 2012 Lyndir. All rights reserved.
|
||||||
//
|
//
|
||||||
|
|
||||||
#define MPErrorDomain @"MPErrorDomain"
|
NSString *const MPErrorDomain;
|
||||||
|
|
||||||
#define MPSignedInNotification @"MPSignedInNotification"
|
NSString *const MPSignedInNotification;
|
||||||
#define MPSignedOutNotification @"MPSignedOutNotification"
|
NSString *const MPSignedOutNotification;
|
||||||
#define MPKeyForgottenNotification @"MPKeyForgottenNotification"
|
NSString *const MPKeyForgottenNotification;
|
||||||
#define MPSiteUpdatedNotification @"MPSiteUpdatedNotification"
|
NSString *const MPSiteUpdatedNotification;
|
||||||
#define MPCheckConfigNotification @"MPCheckConfigNotification"
|
NSString *const MPCheckConfigNotification;
|
||||||
#define MPSitesImportedNotification @"MPSitesImportedNotification"
|
NSString *const MPSitesImportedNotification;
|
||||||
#define MPFoundInconsistenciesNotification @"MPFoundInconsistenciesNotification"
|
NSString *const MPFoundInconsistenciesNotification;
|
||||||
|
|
||||||
#define MPSitesImportedNotificationUserKey @"MPSitesImportedNotificationUserKey"
|
NSString *const MPSitesImportedNotificationUserKey;
|
||||||
#define MPInconsistenciesFixResultUserKey @"MPInconsistenciesFixResultUserKey"
|
NSString *const MPInconsistenciesFixResultUserKey;
|
||||||
|
|||||||
22
MasterPassword/ObjC/MPTypes.m
Normal file
22
MasterPassword/ObjC/MPTypes.m
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// MPTypes.c
|
||||||
|
// MasterPassword
|
||||||
|
//
|
||||||
|
// Created by Maarten Billemont on 02/01/12.
|
||||||
|
// Copyright (c) 2012 Lyndir. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPTypes.h"
|
||||||
|
|
||||||
|
NSString *const MPErrorDomain = @"MPErrorDomain";
|
||||||
|
|
||||||
|
NSString *const MPSignedInNotification = @"MPSignedInNotification";
|
||||||
|
NSString *const MPSignedOutNotification = @"MPSignedOutNotification";
|
||||||
|
NSString *const MPKeyForgottenNotification = @"MPKeyForgottenNotification";
|
||||||
|
NSString *const MPSiteUpdatedNotification = @"MPSiteUpdatedNotification";
|
||||||
|
NSString *const MPCheckConfigNotification = @"MPCheckConfigNotification";
|
||||||
|
NSString *const MPSitesImportedNotification = @"MPSitesImportedNotification";
|
||||||
|
NSString *const MPFoundInconsistenciesNotification = @"MPFoundInconsistenciesNotification";
|
||||||
|
|
||||||
|
NSString *const MPSitesImportedNotificationUserKey = @"MPSitesImportedNotificationUserKey";
|
||||||
|
NSString *const MPInconsistenciesFixResultUserKey = @"MPInconsistenciesFixResultUserKey";
|
||||||
@@ -390,7 +390,7 @@ static OSStatus MPHotKeyHander(EventHandlerCallRef nextHandler, EventRef theEven
|
|||||||
|
|
||||||
NSAlert *alert = [NSAlert alertWithMessageText:@"Delete User"
|
NSAlert *alert = [NSAlert alertWithMessageText:@"Delete User"
|
||||||
defaultButton:@"Delete" alternateButton:nil otherButton:@"Cancel"
|
defaultButton:@"Delete" alternateButton:nil otherButton:@"Cancel"
|
||||||
informativeTextWithFormat:@"This will delete %@ and all his sites.", self.activeUserForMainThread.name];
|
informativeTextWithFormat:@"This will delete %@ and all their sites.", self.activeUserForMainThread.name];
|
||||||
if ([alert runModal] != NSAlertDefaultReturn)
|
if ([alert runModal] != NSAlertDefaultReturn)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,8 @@
|
|||||||
DA3B8456190FC89700246EEA /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3B8454190FC89700246EEA /* MPFixable.m */; };
|
DA3B8456190FC89700246EEA /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = DA3B8454190FC89700246EEA /* MPFixable.m */; };
|
||||||
DA3BCFCD19BD09E0006B2681 /* SourceCodePro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */; };
|
DA3BCFCD19BD09E0006B2681 /* SourceCodePro-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */; };
|
||||||
DA4DA1D91564471A00F6F596 /* libjrswizzle.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC6326C148680650075AEA5 /* libjrswizzle.a */; };
|
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 */; };
|
||||||
DA5180CA19FF2F9200A587E9 /* MPAlgorithmV2.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */; };
|
DA5180CA19FF2F9200A587E9 /* MPAlgorithmV2.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */; };
|
||||||
DA5180CE19FF307E00A587E9 /* MPAppDelegate_Store.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5180CD19FF307E00A587E9 /* MPAppDelegate_Store.m */; };
|
DA5180CE19FF307E00A587E9 /* MPAppDelegate_Store.m in Sources */ = {isa = PBXBuildFile; fileRef = DA5180CD19FF307E00A587E9 /* MPAppDelegate_Store.m */; };
|
||||||
DA5E5C9417248AA1003798D8 /* libscryptenc-osx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5E5C8717248AA1003798D8 /* libscryptenc-osx.a */; };
|
DA5E5C9417248AA1003798D8 /* libscryptenc-osx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DA5E5C8717248AA1003798D8 /* libscryptenc-osx.a */; };
|
||||||
@@ -328,6 +330,9 @@
|
|||||||
DA3B8454190FC89700246EEA /* MPFixable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFixable.m; sourceTree = "<group>"; };
|
DA3B8454190FC89700246EEA /* MPFixable.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFixable.m; sourceTree = "<group>"; };
|
||||||
DA3B8455190FC89700246EEA /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = "<group>"; };
|
DA3B8455190FC89700246EEA /* MPFixable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPFixable.h; sourceTree = "<group>"; };
|
||||||
DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceCodePro-Regular.otf"; sourceTree = "<group>"; };
|
DA3BCFCC19BD09E0006B2681 /* SourceCodePro-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SourceCodePro-Regular.otf"; sourceTree = "<group>"; };
|
||||||
|
DA4DAE911A7D8117003E5423 /* MPAlgorithmV3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAlgorithmV3.h; sourceTree = "<group>"; };
|
||||||
|
DA4DAE921A7D8117003E5423 /* MPAlgorithmV3.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAlgorithmV3.m; sourceTree = "<group>"; };
|
||||||
|
DA4DAE931A7D8117003E5423 /* MPTypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTypes.m; sourceTree = "<group>"; };
|
||||||
DA5180C619FF2F9200A587E9 /* MPAlgorithmV2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAlgorithmV2.h; sourceTree = "<group>"; };
|
DA5180C619FF2F9200A587E9 /* MPAlgorithmV2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAlgorithmV2.h; sourceTree = "<group>"; };
|
||||||
DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAlgorithmV2.m; sourceTree = "<group>"; };
|
DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAlgorithmV2.m; sourceTree = "<group>"; };
|
||||||
DA5180CC19FF307E00A587E9 /* MPAppDelegate_Store.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAppDelegate_Store.h; sourceTree = "<group>"; };
|
DA5180CC19FF307E00A587E9 /* MPAppDelegate_Store.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAppDelegate_Store.h; sourceTree = "<group>"; };
|
||||||
@@ -1065,6 +1070,8 @@
|
|||||||
DA5E5C9C1724A667003798D8 /* MPAlgorithmV1.m */,
|
DA5E5C9C1724A667003798D8 /* MPAlgorithmV1.m */,
|
||||||
DA5180C619FF2F9200A587E9 /* MPAlgorithmV2.h */,
|
DA5180C619FF2F9200A587E9 /* MPAlgorithmV2.h */,
|
||||||
DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */,
|
DA5180C719FF2F9200A587E9 /* MPAlgorithmV2.m */,
|
||||||
|
DA4DAE911A7D8117003E5423 /* MPAlgorithmV3.h */,
|
||||||
|
DA4DAE921A7D8117003E5423 /* MPAlgorithmV3.m */,
|
||||||
DA5E5C9D1724A667003798D8 /* MPAppDelegate_Key.h */,
|
DA5E5C9D1724A667003798D8 /* MPAppDelegate_Key.h */,
|
||||||
DA5E5C9E1724A667003798D8 /* MPAppDelegate_Key.m */,
|
DA5E5C9E1724A667003798D8 /* MPAppDelegate_Key.m */,
|
||||||
DA5E5C9F1724A667003798D8 /* MPAppDelegate_Shared.h */,
|
DA5E5C9F1724A667003798D8 /* MPAppDelegate_Shared.h */,
|
||||||
@@ -1088,6 +1095,7 @@
|
|||||||
DA32CFDA19CF1C70004F3F0E /* MPStoredSiteEntity.h */,
|
DA32CFDA19CF1C70004F3F0E /* MPStoredSiteEntity.h */,
|
||||||
DA32CFDB19CF1C70004F3F0E /* MPStoredSiteEntity.m */,
|
DA32CFDB19CF1C70004F3F0E /* MPStoredSiteEntity.m */,
|
||||||
DA5E5CAF1724A667003798D8 /* MPTypes.h */,
|
DA5E5CAF1724A667003798D8 /* MPTypes.h */,
|
||||||
|
DA4DAE931A7D8117003E5423 /* MPTypes.m */,
|
||||||
DA32CFE319CF1C71004F3F0E /* MPUserEntity.h */,
|
DA32CFE319CF1C71004F3F0E /* MPUserEntity.h */,
|
||||||
DA32CFE419CF1C71004F3F0E /* MPUserEntity.m */,
|
DA32CFE419CF1C71004F3F0E /* MPUserEntity.m */,
|
||||||
);
|
);
|
||||||
@@ -2256,6 +2264,8 @@
|
|||||||
93D394C4254EEB45FB335AFB /* MPSitesTableView.m in Sources */,
|
93D394C4254EEB45FB335AFB /* MPSitesTableView.m in Sources */,
|
||||||
DA6774291A4746AF004F356A /* mpw-algorithm.c in Sources */,
|
DA6774291A4746AF004F356A /* mpw-algorithm.c in Sources */,
|
||||||
93D395E4830290EBB6E71F34 /* MPNoStateButton.m in Sources */,
|
93D395E4830290EBB6E71F34 /* MPNoStateButton.m in Sources */,
|
||||||
|
DA4DAE941A7D8117003E5423 /* MPAlgorithmV3.m in Sources */,
|
||||||
|
DA4DAE951A7D8117003E5423 /* MPTypes.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -61,6 +61,7 @@
|
|||||||
93D39DF2E77B937D77C10414 /* install in Resources */ = {isa = PBXBuildFile; fileRef = 93D39ACD33E79386E6F33601 /* install */; };
|
93D39DF2E77B937D77C10414 /* install in Resources */ = {isa = PBXBuildFile; fileRef = 93D39ACD33E79386E6F33601 /* install */; };
|
||||||
93D39E281E3658B30550CB55 /* NSDictionary+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */; };
|
93D39E281E3658B30550CB55 /* NSDictionary+Indexing.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39AA1EE2E1E7B81372240 /* NSDictionary+Indexing.m */; };
|
||||||
93D39E34FD28D24FE3442C48 /* UITextView+PearlAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */; };
|
93D39E34FD28D24FE3442C48 /* UITextView+PearlAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D3977321EB249981821AB0 /* UITextView+PearlAttributes.m */; };
|
||||||
|
93D39E5F7F6D7F5C0FAD090F /* MPTypes.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39D72239990DDAC2D75B0 /* MPTypes.m */; };
|
||||||
93D39EAA4D064193074D3021 /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A813CA9D7E192261ED2 /* MPFixable.m */; };
|
93D39EAA4D064193074D3021 /* MPFixable.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A813CA9D7E192261ED2 /* MPFixable.m */; };
|
||||||
93D39F8A9254177891F38705 /* MPSetupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A28369954D147E239BA /* MPSetupViewController.m */; };
|
93D39F8A9254177891F38705 /* MPSetupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 93D39A28369954D147E239BA /* MPSetupViewController.m */; };
|
||||||
93D39FAE1BB6A393BFE15FD0 /* mpw.bashrc in Resources */ = {isa = PBXBuildFile; fileRef = 93D39245A478883C672818F3 /* mpw.bashrc */; };
|
93D39FAE1BB6A393BFE15FD0 /* mpw.bashrc in Resources */ = {isa = PBXBuildFile; fileRef = 93D39245A478883C672818F3 /* mpw.bashrc */; };
|
||||||
@@ -546,6 +547,7 @@
|
|||||||
93D39CF8ADF4542CDC4CD385 /* MPCombinedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCombinedViewController.h; sourceTree = "<group>"; };
|
93D39CF8ADF4542CDC4CD385 /* MPCombinedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCombinedViewController.h; sourceTree = "<group>"; };
|
||||||
93D39D4E713564B7654341B0 /* mpw-algorithm_v3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm_v3.c"; sourceTree = "<group>"; };
|
93D39D4E713564B7654341B0 /* mpw-algorithm_v3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "mpw-algorithm_v3.c"; sourceTree = "<group>"; };
|
||||||
93D39D6604447D7708039155 /* MPAnswersViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAnswersViewController.h; sourceTree = "<group>"; };
|
93D39D6604447D7708039155 /* MPAnswersViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAnswersViewController.h; sourceTree = "<group>"; };
|
||||||
|
93D39D72239990DDAC2D75B0 /* MPTypes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTypes.m; sourceTree = "<group>"; };
|
||||||
93D39D8A953779B35403AF6E /* PearlUICollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlUICollectionView.m; sourceTree = "<group>"; };
|
93D39D8A953779B35403AF6E /* PearlUICollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PearlUICollectionView.m; sourceTree = "<group>"; };
|
||||||
93D39DA27D768B53C8B1330C /* MPAvatarCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAvatarCell.h; sourceTree = "<group>"; };
|
93D39DA27D768B53C8B1330C /* MPAvatarCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAvatarCell.h; sourceTree = "<group>"; };
|
||||||
93D39DE2CB351D4E3789462B /* UIScrollView+PearlAdjustInsets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+PearlAdjustInsets.h"; sourceTree = "<group>"; };
|
93D39DE2CB351D4E3789462B /* UIScrollView+PearlAdjustInsets.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+PearlAdjustInsets.h"; sourceTree = "<group>"; };
|
||||||
@@ -2556,23 +2558,20 @@
|
|||||||
DABD3B9F1711E2DB00CF925C /* ObjC */ = {
|
DABD3B9F1711E2DB00CF925C /* ObjC */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
DA32D05319D741DC004F3F0E /* MPSiteQuestionEntity.h */,
|
|
||||||
DA32D05419D741DC004F3F0E /* MPSiteQuestionEntity.m */,
|
|
||||||
DA32CFE619CF1C8F004F3F0E /* MPUserEntity.m */,
|
|
||||||
DA32CFE719CF1C8F004F3F0E /* MPUserEntity.h */,
|
|
||||||
DA32CFE819CF1C8F004F3F0E /* MPStoredSiteEntity.m */,
|
|
||||||
DA32CFE919CF1C8F004F3F0E /* MPStoredSiteEntity.h */,
|
|
||||||
DA32CFEC19CF1C8F004F3F0E /* MPSiteEntity.m */,
|
|
||||||
DA32CFED19CF1C8F004F3F0E /* MPSiteEntity.h */,
|
|
||||||
DA32CFEE19CF1C8F004F3F0E /* MPGeneratedSiteEntity.m */,
|
|
||||||
DA32CFEF19CF1C8F004F3F0E /* MPGeneratedSiteEntity.h */,
|
|
||||||
DABD3BD71711E2DC00CF925C /* iOS */,
|
DABD3BD71711E2DC00CF925C /* iOS */,
|
||||||
|
DA32D00119CF4735004F3F0E /* MasterPassword.xcdatamodeld */,
|
||||||
DABD3BA01711E2DC00CF925C /* MPAlgorithm.h */,
|
DABD3BA01711E2DC00CF925C /* MPAlgorithm.h */,
|
||||||
DABD3BA11711E2DC00CF925C /* MPAlgorithm.m */,
|
DABD3BA11711E2DC00CF925C /* MPAlgorithm.m */,
|
||||||
DABD3BA21711E2DC00CF925C /* MPAlgorithmV0.h */,
|
DABD3BA21711E2DC00CF925C /* MPAlgorithmV0.h */,
|
||||||
DABD3BA31711E2DC00CF925C /* MPAlgorithmV0.m */,
|
DABD3BA31711E2DC00CF925C /* MPAlgorithmV0.m */,
|
||||||
DABD3BA41711E2DC00CF925C /* MPAlgorithmV1.h */,
|
DABD3BA41711E2DC00CF925C /* MPAlgorithmV1.h */,
|
||||||
DABD3BA51711E2DC00CF925C /* MPAlgorithmV1.m */,
|
DABD3BA51711E2DC00CF925C /* MPAlgorithmV1.m */,
|
||||||
|
93D39A97A7D48CB3B784194D /* MPAlgorithmV2.h */,
|
||||||
|
93D399A8E3181B442D347CD7 /* MPAlgorithmV2.m */,
|
||||||
|
93D394D73F5BC92297CE8D7B /* MPAlgorithmV3.h */,
|
||||||
|
93D39FD9623E8D5571C0AEB3 /* MPAlgorithmV3.m */,
|
||||||
|
93D39CECA10BCCB0BA581BF1 /* MPAppDelegate_InApp.h */,
|
||||||
|
93D394C78C7B879C9AD9152C /* MPAppDelegate_InApp.m */,
|
||||||
DABD3BA61711E2DC00CF925C /* MPAppDelegate_Key.h */,
|
DABD3BA61711E2DC00CF925C /* MPAppDelegate_Key.h */,
|
||||||
DABD3BA71711E2DC00CF925C /* MPAppDelegate_Key.m */,
|
DABD3BA71711E2DC00CF925C /* MPAppDelegate_Key.m */,
|
||||||
DABD3BA81711E2DC00CF925C /* MPAppDelegate_Shared.h */,
|
DABD3BA81711E2DC00CF925C /* MPAppDelegate_Shared.h */,
|
||||||
@@ -2583,18 +2582,22 @@
|
|||||||
DABD3BAD1711E2DC00CF925C /* MPConfig.m */,
|
DABD3BAD1711E2DC00CF925C /* MPConfig.m */,
|
||||||
DABD3BB41711E2DC00CF925C /* MPEntities.h */,
|
DABD3BB41711E2DC00CF925C /* MPEntities.h */,
|
||||||
DABD3BB51711E2DC00CF925C /* MPEntities.m */,
|
DABD3BB51711E2DC00CF925C /* MPEntities.m */,
|
||||||
DABD3BB61711E2DC00CF925C /* MPKey.h */,
|
|
||||||
DABD3BB71711E2DC00CF925C /* MPKey.m */,
|
|
||||||
DABD3BB81711E2DC00CF925C /* MPTypes.h */,
|
|
||||||
DA32D00119CF4735004F3F0E /* MasterPassword.xcdatamodeld */,
|
|
||||||
93D399F244BB522A317811BB /* MPFixable.h */,
|
93D399F244BB522A317811BB /* MPFixable.h */,
|
||||||
93D39A813CA9D7E192261ED2 /* MPFixable.m */,
|
93D39A813CA9D7E192261ED2 /* MPFixable.m */,
|
||||||
93D394C78C7B879C9AD9152C /* MPAppDelegate_InApp.m */,
|
DA32CFEF19CF1C8F004F3F0E /* MPGeneratedSiteEntity.h */,
|
||||||
93D39CECA10BCCB0BA581BF1 /* MPAppDelegate_InApp.h */,
|
DA32CFEE19CF1C8F004F3F0E /* MPGeneratedSiteEntity.m */,
|
||||||
93D399A8E3181B442D347CD7 /* MPAlgorithmV2.m */,
|
DABD3BB61711E2DC00CF925C /* MPKey.h */,
|
||||||
93D39A97A7D48CB3B784194D /* MPAlgorithmV2.h */,
|
DABD3BB71711E2DC00CF925C /* MPKey.m */,
|
||||||
93D394D73F5BC92297CE8D7B /* MPAlgorithmV3.h */,
|
DA32CFED19CF1C8F004F3F0E /* MPSiteEntity.h */,
|
||||||
93D39FD9623E8D5571C0AEB3 /* MPAlgorithmV3.m */,
|
DA32CFEC19CF1C8F004F3F0E /* MPSiteEntity.m */,
|
||||||
|
DA32D05319D741DC004F3F0E /* MPSiteQuestionEntity.h */,
|
||||||
|
DA32D05419D741DC004F3F0E /* MPSiteQuestionEntity.m */,
|
||||||
|
DA32CFE919CF1C8F004F3F0E /* MPStoredSiteEntity.h */,
|
||||||
|
DA32CFE819CF1C8F004F3F0E /* MPStoredSiteEntity.m */,
|
||||||
|
DABD3BB81711E2DC00CF925C /* MPTypes.h */,
|
||||||
|
DA32CFE719CF1C8F004F3F0E /* MPUserEntity.h */,
|
||||||
|
DA32CFE619CF1C8F004F3F0E /* MPUserEntity.m */,
|
||||||
|
93D39D72239990DDAC2D75B0 /* MPTypes.m */,
|
||||||
);
|
);
|
||||||
name = ObjC;
|
name = ObjC;
|
||||||
path = ..;
|
path = ..;
|
||||||
@@ -3652,6 +3655,7 @@
|
|||||||
93D395B715D15F2B56F2A2EE /* mpw-types.c in Sources */,
|
93D395B715D15F2B56F2A2EE /* mpw-types.c in Sources */,
|
||||||
93D39943D01E70DAC3B0DF76 /* mpw-util.c in Sources */,
|
93D39943D01E70DAC3B0DF76 /* mpw-util.c in Sources */,
|
||||||
93D39577FD8BB0945DB2F0A3 /* MPAlgorithmV3.m in Sources */,
|
93D39577FD8BB0945DB2F0A3 /* MPAlgorithmV3.m in Sources */,
|
||||||
|
93D39E5F7F6D7F5C0FAD090F /* MPTypes.m in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
require "formula"
|
|
||||||
|
|
||||||
class Mpw < Formula
|
class Mpw < Formula
|
||||||
homepage "http://masterpasswordapp.com"
|
homepage "http://masterpasswordapp.com"
|
||||||
url "https://ssl.masterpasswordapp.com/mpw-2.1-cli3-3-gd5ff215.tar.gz"
|
url "https://ssl.masterpasswordapp.com/mpw-2.1-cli4-0-gf6b2287.tar.gz"
|
||||||
sha1 "c9fca230cd0c2b22082bc54fe85053219888212a"
|
sha1 "036b3d8f4bd6f0676ae16e7e9c3de65f6030874f"
|
||||||
|
version "2.1-cli4"
|
||||||
|
|
||||||
depends_on "automake" => :build
|
depends_on "automake" => :build
|
||||||
depends_on "autoconf" => :build
|
depends_on "autoconf" => :build
|
||||||
@@ -18,7 +17,7 @@ class Mpw < Formula
|
|||||||
resource("libscrypt").stage buildpath/"lib/scrypt"
|
resource("libscrypt").stage buildpath/"lib/scrypt"
|
||||||
touch "lib/scrypt/.unpacked"
|
touch "lib/scrypt/.unpacked"
|
||||||
|
|
||||||
ENV["targets"]="mpw mpw-tests"
|
ENV["targets"] = "mpw mpw-tests"
|
||||||
system "./build"
|
system "./build"
|
||||||
system "./mpw-tests"
|
system "./mpw-tests"
|
||||||
|
|
||||||
|
|||||||
@@ -255,7 +255,7 @@
|
|||||||
</pre></code>
|
</pre></code>
|
||||||
|
|
||||||
<p>
|
<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 his master password is.
|
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>
|
</p>
|
||||||
|
|
||||||
<h2>Combining The Inputs</h2>
|
<h2>Combining The Inputs</h2>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
mpw-2.1-cli4-0-g21630e9.tar.gz
|
mpw-2.1-cli4-0-gf6b2287.tar.gz
|
||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
9d19eaf667de05c7744e8ae1720e1313a3f98774
|
3932857c2117b8a399fdcb4fa888e9dc1a6818ee
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../../MasterPassword/C/mpw-2.1-cli4-0-g21630e9.tar.gz
|
|
||||||
1
Site/2013-05/mpw-2.1-cli4-0-gf6b2287.tar.gz
Symbolic link
1
Site/2013-05/mpw-2.1-cli4-0-gf6b2287.tar.gz
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
../../MasterPassword/C/mpw-2.1-cli4-0-gf6b2287.tar.gz
|
||||||
@@ -296,14 +296,14 @@
|
|||||||
<h3 id="masterkey" class="inline">The Master Key</h3>
|
<h3 id="masterkey" class="inline">The Master Key</h3>
|
||||||
<p>The first part of the process it to obtain a very strong "token" of your personal identity. We call this token your <em>master key</em>, because it is very much like the one and only <strong>main key that opens all your doors</strong>. It is a personal key, it represents your identity.</p>
|
<p>The first part of the process it to obtain a very strong "token" of your personal identity. We call this token your <em>master key</em>, because it is very much like the one and only <strong>main key that opens all your doors</strong>. It is a personal key, it represents your identity.</p>
|
||||||
<p>The master key is derived from your name and your master password, and thrown away as soon as it's no longer needed to minimize the risk of loss.</p>
|
<p>The master key is derived from your name and your master password, and thrown away as soon as it's no longer needed to minimize the risk of loss.</p>
|
||||||
<p>Since it's vital that nobody else can gain access to your master key, it's important that the process of deriving the key is insurmountably difficult. An attacker could try a brute-force attack against your master key or password by convincing you to make an account on his website, and then guessing at your master password or your master key until he finds one that gives him your password for his fake site.</p>
|
<p>Since it's vital that nobody else can gain access to your master key, it's important that the process of deriving the key is insurmountably difficult. An attacker could try a brute-force attack against your master key or password by convincing you to make an account on their website, and then guessing at your master password or your master key until he finds one that gives him your password for their fake site.</p>
|
||||||
<p>These are two different types of brute-force attacks and we need to make sure to defeat both of them.</p>
|
<p>These are two different types of brute-force attacks and we need to make sure to defeat both of them.</p>
|
||||||
<p>To defeat a brute-force attack against your master key, we make sure the master key is sufficiently high in entropy. Since the master key is a 256-bit key, an attacker would now have to make up to <code>2<sup>256</sup></code> guesses, or try <code>115792089237316195423570985008687907853269984665640564039457584007913129639936</code> master keys before finding the right one. Even at an ambitious rate of 2 billion tries per second, it would take several times the age of the universe to try all of them.
|
<p>To defeat a brute-force attack against your master key, we make sure the master key is sufficiently high in entropy. Since the master key is a 256-bit key, an attacker would now have to make up to <code>2<sup>256</sup></code> guesses, or try <code>115792089237316195423570985008687907853269984665640564039457584007913129639936</code> master keys before finding the right one. Even at an ambitious rate of 2 billion tries per second, it would take several times the age of the universe to try all of them.
|
||||||
<p>A brute-force attack against your master password is more feasible, since your master password will be tiny compared to such a huge master key.</p>
|
<p>A brute-force attack against your master password is more feasible, since your master password will be tiny compared to such a huge master key.</p>
|
||||||
<p>Even if you used an 8-character evenly distributed random alphanumeric password (such as <code>yIp6X2qd</code>), a smart attacker could brute-force such a password in less than <em>1.7 days</em>.</p>
|
<p>Even if you used an 8-character evenly distributed random alphanumeric password (such as <code>yIp6X2qd</code>), a smart attacker could brute-force such a password in less than <em>1.7 days</em>.</p>
|
||||||
<p>To solve this problem, we introduce an expensive <q>scrypt</q>-based <em>key derivation</em> step. <em>scrypt</em> specifically improves on standard key derivation techniques by not only wasting a lot of <em>CPU time</em>, but also consuming huge amounts of <em>RAM</em>. We need to be careful to choose the right parameters so that logging into Master Password doesn't take too long on weaker mobile devices while the possibility of guessing at passwords is sufficiently
|
<p>To solve this problem, we introduce an expensive <q>scrypt</q>-based <em>key derivation</em> step. <em>scrypt</em> specifically improves on standard key derivation techniques by not only wasting a lot of <em>CPU time</em>, but also consuming huge amounts of <em>RAM</em>. We need to be careful to choose the right parameters so that logging into Master Password doesn't take too long on weaker mobile devices while the possibility of guessing at passwords is sufficiently
|
||||||
crippled for attackers. The theory is, the longer it takes for an attacker to try out one guess of your master password, the longer it'll take him to find the right one. We pull this theory into the extreme so that guessing your password now takes <strong>2151076 years</strong> instead of <em>1.7 days</em> while logging into Master Password on an iPhone 4S takes no more than 3 seconds.</p>
|
crippled for attackers. The theory is, the longer it takes for an attacker to try out one guess of your master password, the longer it'll take him to find the right one. We pull this theory into the extreme so that guessing your password now takes <strong>2151076 years</strong> instead of <em>1.7 days</em> while logging into Master Password on an iPhone 4S takes no more than 3 seconds.</p>
|
||||||
<p>It bears note that <em>scrypt</em>'s approach is specifically interesting because it costs both a lot of CPU and a lot of RAM to derive a master key. That means that the more computers an attacker buys, the more his $ cost goes up. CPU and RAM are expensive, and forcing the derivation to use a lot instead of minuscule amounts causes the $ cost of a brute-force attack to become phenomenal.</p>
|
<p>It bears note that <em>scrypt</em>'s approach is specifically interesting because it costs both a lot of CPU and a lot of RAM to derive a master key. That means that the more computers an attacker buys, the more their $ cost goes up. CPU and RAM are expensive, and forcing the derivation to use a lot instead of minuscule amounts causes the $ cost of a brute-force attack to become phenomenal.</p>
|
||||||
<p>Given these solutions, we feel confident Master Password is adequately protected against attacks on your private master key.</p>
|
<p>Given these solutions, we feel confident Master Password is adequately protected against attacks on your private master key.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="hlvl">
|
<div class="hlvl">
|
||||||
|
|||||||
@@ -160,7 +160,7 @@
|
|||||||
<a name="trust"></a>
|
<a name="trust"></a>
|
||||||
<h2>You speak of trust, how can I trust you?</h2>
|
<h2>You speak of trust, how can I trust you?</h2>
|
||||||
<p>A very valid question, and arguably the most important one to ask!</p>
|
<p>A very valid question, and arguably the most important one to ask!</p>
|
||||||
<p>Trust is a very difficult thing to guarantee. Powerful entities will solicit your trust by appearing with it and coming well recommended. Trust can also be assured by legalese or contracts. If you have the means and energy to hold an entity responsible for his claims and actions, this might be sufficient for you.</p>
|
<p>Trust is a very difficult thing to guarantee. Powerful entities will solicit your trust by appearing with it and coming well recommended. Trust can also be assured by legalese or contracts. If you have the means and energy to hold an entity responsible for their claims and actions, this might be sufficient for you.</p>
|
||||||
<p>Most of us mere mortals cannot afford this level of trust enforcement, however. We're mostly left in the position of trusting claims blindly, in the hopes that companies will not violate those claims for fear of taking a seizable public-relations hit.</p>
|
<p>Most of us mere mortals cannot afford this level of trust enforcement, however. We're mostly left in the position of trusting claims blindly, in the hopes that companies will not violate those claims for fear of taking a seizable public-relations hit.</p>
|
||||||
<h3>I propose that none of these forms of trust are sufficient adequate.</h3>
|
<h3>I propose that none of these forms of trust are sufficient adequate.</h3>
|
||||||
<p>In fact, Master Password is what it is because it aims to avoid any requirement of trust in the solution's author. Master Password requires no services or proprietary storage format. I've published Master Password's algorithm for you to inspect and licensed to you the full source code to the implementations for you to use.</p>
|
<p>In fact, Master Password is what it is because it aims to avoid any requirement of trust in the solution's author. Master Password requires no services or proprietary storage format. I've published Master Password's algorithm for you to inspect and licensed to you the full source code to the implementations for you to use.</p>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<header>
|
<header>
|
||||||
<p><strong>BETA</strong> - This site may not yet work on your browser.<br>
|
<p><strong>BETA</strong> - This site may not yet work on your browser.<br>
|
||||||
Passwords are generated locally, your master password is not sent to any server. See <a href="https://github.com/Lyndir/MasterPassword/tree/master/Site/2013-05/mpw-js">the source</a>.</p>
|
Passwords are generated locally, your master password is not sent to any server. See <a href="https://github.com/Lyndir/MasterPassword/tree/master/Site/mpw-js">the source</a>.</p>
|
||||||
<span id="error"></span>
|
<span id="error"></span>
|
||||||
</header>
|
</header>
|
||||||
<section id="identity" class="active"><form action="#">
|
<section id="identity" class="active"><form action="#">
|
||||||
@@ -51,15 +51,15 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<p>This page was made possible thanks to <a href="https://tomthorogood.co.uk/" title="Tom Thorogood">tmthrgd</a>'s <a href="https://github.com/tmthrgd/mpw-js">mpw-js</a>.<br>
|
<p>This page was made possible thanks to <a href="https://tomthorogood.co.uk/" title="Tom Thorogood">tmthrgd</a>'s <a href="https://github.com/tmthrgd/mpw-js">mpw-js</a>.<br>
|
||||||
<em><a href="http://masterpasswordapp.com">Master Password</a> is a security product and algorithm by <a href="http://www.lhunath.com" title="Maarten Billemont">Maarten Billemont</a>, <a href="http://www.lyndir.com">Lyndir</a> (© 2011-2014).</em><br>
|
<em><a href="http://masterpasswordapp.com">Master Password</a> is a security product and algorithm by <a href="http://www.lhunath.com" title="Maarten Billemont">Maarten Billemont</a>, <a href="http://www.lyndir.com">Lyndir</a> (© 2011-2014).</em><br>
|
||||||
Usage implies agreement with our <a href="/privacy.html">privacy policy and disclaimer</a>.</p>
|
Usage implies agreement with our <a href="http://masterpasswordapp.com/privacy.html">privacy policy and disclaimer</a>.</p>
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
<!-- Scripts -->
|
<!-- Scripts -->
|
||||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></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.js"><\/script>')</script>
|
||||||
<script>window.jQuery || 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.min.js"><\/script>')</script>
|
||||||
<script src="js/dependencies.js?2"></script>
|
<script src="js/dependencies.js?3"></script>
|
||||||
<script src="js/main.js?2"></script>
|
<script src="js/main.js?3"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ window.setImmediate || document.write("<script src=js/mpw-js/" + esdir + "setImm
|
|||||||
|
|
||||||
// Include the scrypt implementation
|
// Include the scrypt implementation
|
||||||
var SCRYPTASM_PATH = (window.location + '').replace(/[^/]*(#[^#]*)?$/, 'js/mpw-js/scrypt-asm.js');
|
var SCRYPTASM_PATH = (window.location + '').replace(/[^/]*(#[^#]*)?$/, 'js/mpw-js/scrypt-asm.js');
|
||||||
document.write("<script src=js/mpw-js/" + esdir + "scrypt.js><\/script>");
|
document.write("<script src=js/mpw-js/" + esdir + "scrypt.js?1><\/script>");
|
||||||
|
|
||||||
// Include the MPW class
|
// Include the MPW class
|
||||||
document.write("<script src=js/mpw-js/" + esdir + "mpw.js><\/script>");
|
document.write("<script src=js/mpw-js/" + esdir + "mpw.js?1><\/script>");
|
||||||
|
|||||||
Submodule Site/mpw-js/js/mpw-js updated: 768cfad320...442e418969
Reference in New Issue
Block a user