From d1649f3c33550e4bc5c755878fffedd5715a7a60 Mon Sep 17 00:00:00 2001 From: Maarten Billemont Date: Sat, 3 Jan 2015 14:25:20 -0500 Subject: [PATCH] Just dispose on close and scope executors to a window, clean up on window hide. --- .../com/lyndir/masterpassword/gui/GUI.java | 5 +-- .../lyndir/masterpassword/gui/ModelUser.java | 2 ++ .../masterpassword/gui/PasswordFrame.java | 2 +- .../com/lyndir/masterpassword/gui/Res.java | 32 ++++++++++++++++--- .../masterpassword/gui/UnlockFrame.java | 2 +- Site/2013-05/faq.html | 1 + 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/GUI.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/GUI.java index 9f03925b..258d81da 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/GUI.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/GUI.java @@ -116,9 +116,6 @@ public class GUI implements UnlockFrame.SignInCallback { } protected PasswordFrame newPasswordFrame(final User user) { - PasswordFrame frame = new PasswordFrame( user ); - frame.setDefaultCloseOperation( WindowConstants.EXIT_ON_CLOSE ); - - return frame; + return new PasswordFrame( user ); } } diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/ModelUser.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/ModelUser.java index 45d5133d..ce253eba 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/ModelUser.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/ModelUser.java @@ -68,6 +68,8 @@ public class ModelUser extends User { @Override public void reset() { + super.reset(); + masterPassword = null; } diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/PasswordFrame.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/PasswordFrame.java index a58ce4ca..95f8f137 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/PasswordFrame.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/PasswordFrame.java @@ -217,7 +217,7 @@ public class PasswordFrame extends JFrame implements DocumentListener { site.setSiteCounter( siteCounter ); } - ListenableFuture passwordFuture = Res.execute( new Callable() { + ListenableFuture passwordFuture = Res.execute( this, new Callable() { @Override public String call() throws Exception { diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/Res.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/Res.java index 2bbb471d..363797c5 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/Res.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/Res.java @@ -8,9 +8,11 @@ import com.google.common.io.Resources; import com.google.common.util.concurrent.*; import com.lyndir.lhunath.opal.system.logging.Logger; import java.awt.*; +import java.awt.event.*; import java.awt.image.ImageObserver; import java.io.IOException; import java.net.URL; +import java.util.WeakHashMap; import java.util.concurrent.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -22,8 +24,8 @@ import javax.swing.*; */ public abstract class Res { - private static final ExecutorService executor = Executors.newSingleThreadExecutor(); - private static final Logger logger = Logger.get( Res.class ); + private static final WeakHashMap executorByWindow = new WeakHashMap<>(); + private static final Logger logger = Logger.get( Res.class ); private static Font sourceCodeProRegular; private static Font sourceCodeProBlack; @@ -32,8 +34,8 @@ public abstract class Res { private static Font exoRegular; private static Font exoThin; - public static Future execute(final Runnable job) { - return executor.submit( new Runnable() { + public static Future execute(final Window host, final Runnable job) { + return getExecutor( host ).submit( new Runnable() { @Override public void run() { try { @@ -46,7 +48,8 @@ public abstract class Res { } ); } - public static ListenableFuture execute(final Callable job) { + public static ListenableFuture execute(final Window host, final Callable job) { + ExecutorService executor = getExecutor( host ); return JdkFutureAdapters.listenInPoolThread( executor.submit( new Callable() { @Override public V call() @@ -62,6 +65,25 @@ public abstract class Res { } ), executor ); } + private static ExecutorService getExecutor(final Window host) { + ExecutorService executor = executorByWindow.get( host ); + + if (executor == null) { + executorByWindow.put( host, executor = Executors.newSingleThreadExecutor() ); + + host.addWindowListener( new WindowAdapter() { + @Override + public void windowClosing(final WindowEvent e) { + ExecutorService executor = executorByWindow.remove( host ); + if (executor != null) + executor.shutdownNow(); + } + } ); + } + + return executor; + } + public static Icon iconAdd() { return new RetinaIcon( Resources.getResource( "media/icon_add@2x.png" ) ); } diff --git a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/UnlockFrame.java b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/UnlockFrame.java index d3d4a29e..0ea5acf0 100644 --- a/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/UnlockFrame.java +++ b/MasterPassword/Java/masterpassword-gui/src/main/java/com/lyndir/masterpassword/gui/UnlockFrame.java @@ -134,7 +134,7 @@ public class UnlockFrame extends JFrame { signInButton.setEnabled( false ); signInButton.setText( "Signing In..." ); - Res.execute( new Runnable() { + Res.execute( this, new Runnable() { @Override public void run() { final boolean success = signInCallback.signedIn( user ); diff --git a/Site/2013-05/faq.html b/Site/2013-05/faq.html index 3b641ec0..766f22a6 100644 --- a/Site/2013-05/faq.html +++ b/Site/2013-05/faq.html @@ -101,6 +101,7 @@

Another strategy is by "encoding" something you already know. This can seem like a good way to make memorable passwords, but recalling the "encoding" you used two years later can be tricky. This also makes it much easier for attackers that know you to find your password.

Master Password itself generates very random passwords that look semi-legible, for instance Togu3]ToxiBuzb. Such passwords have been found to be very memorable while also being very high in entropy (hard to guess).

A strategy that's gaining traction lately is that of combining words into a sentence. Some claim it's best for the sentence to make no grammatical sense, others dispute these claims. It's a fact, though, that if your attacker doesn't expect such a password, they're nearly impossible to defeat.

+

Let's sum these strategies up in a table, note that this type of comparison is very subjective.

Time to crack a master password