cleanup pycharm/163.1439 webstorm/163.1437
authorVladimir Krivosheev <vladimir.krivosheev@jetbrains.com>
Tue, 12 Jul 2016 14:58:01 +0000 (16:58 +0200)
committerVladimir Krivosheev <vladimir.krivosheev@jetbrains.com>
Wed, 13 Jul 2016 05:36:41 +0000 (07:36 +0200)
platform/platform-api/src/com/intellij/ide/passwordSafe/MasterPasswordUnavailableException.java
platform/platform-impl/src/com/intellij/ide/passwordSafe/impl/providers/masterKey/MasterKeyPasswordSafe.java
platform/platform-impl/src/com/intellij/ide/passwordSafe/impl/providers/masterKey/windows/WindowsCryptUtils.java

index 2757e23040776b4b07151910d1839923834e97e4..5617c9c1107231c8f7327e018c1aa8b63346b78c 100644 (file)
@@ -18,7 +18,7 @@ package com.intellij.ide.passwordSafe;
 /**
  * This exception is thrown when master password is not available (process of entering password is cancelled, or IDEA is running headless mode)
  */
-public class MasterPasswordUnavailableException extends PasswordSafeException {
+public class MasterPasswordUnavailableException extends RuntimeException {
   public MasterPasswordUnavailableException(String message) {
     super(message);
   }
index c755bcd24ff9f864e36c1ba004effd244807913d..42fc03bfd22a588517b98f64b5b2478c6bc2d144 100644 (file)
@@ -153,22 +153,25 @@ public class MasterKeyPasswordSafe extends BasePasswordSafeProvider {
 
   @NotNull
   @Override
-  protected byte[] key(@Nullable final Project project, @NotNull final Class requestor) throws PasswordSafeException {
+  protected byte[] key(@Nullable final Project project, @NotNull final Class requestor) {
     Object key = myKey.get().get();
     if (key instanceof byte[]) {
       return (byte[])key;
     }
+
     if (key instanceof PasswordSafeException && ((PasswordSafeException)key).justHappened()) {
       throw (PasswordSafeException)key;
     }
 
-    if (isPasswordEncrypted()) {
+    if (SystemInfo.isWindows) {
       try {
-        setMasterPassword(decryptPassword(myDatabase.getPasswordInfo()));
+        setMasterPassword(new String(WindowsCryptUtils.unprotect(myDatabase.getPasswordInfo()), CharsetToolkit.UTF8_CHARSET));
         key = myKey.get().get();
-        if (key instanceof byte[]) return (byte[])key;
+        if (key instanceof byte[]) {
+          return (byte[])key;
+        }
       }
-      catch (PasswordSafeException e) {
+      catch (Exception ignored) {
         // ignore exception and ask password
       }
     }
@@ -179,14 +182,12 @@ public class MasterKeyPasswordSafe extends BasePasswordSafeProvider {
         return key1;
       }
       try {
-        if (myDatabase.isEmpty()) {
-          if (!MasterPasswordDialog.resetMasterPasswordDialog(project, this).showAndGet()) {
-            throw new MasterPasswordUnavailableException("Master password is required to store passwords in the database.");
-          }
-        }
-        else {
+        if (!myDatabase.isEmpty()) {
           MasterPasswordDialog.askPassword(project, this, requestor);
         }
+        else if (!MasterPasswordDialog.resetMasterPasswordDialog(project, this).showAndGet()) {
+          throw new MasterPasswordUnavailableException("Master password is required to store passwords in the database.");
+        }
       }
       catch (PasswordSafeException e) {
         myKey.get().set(e);
@@ -194,8 +195,12 @@ public class MasterKeyPasswordSafe extends BasePasswordSafeProvider {
       }
       return myKey.get().get();
     }, project == null ? Conditions.alwaysFalse() : project.getDisposed());
-    if (key instanceof byte[]) return (byte[])key;
-    if (key instanceof PasswordSafeException) throw (PasswordSafeException)key;
+    if (key instanceof byte[]) {
+      return (byte[])key;
+    }
+    if (key instanceof PasswordSafeException) {
+      throw (PasswordSafeException)key;
+    }
 
     throw new AssertionError();
   }
@@ -298,13 +303,10 @@ public class MasterKeyPasswordSafe extends BasePasswordSafeProvider {
     return setMasterPassword("");
   }
 
-  @SuppressWarnings("MethodMayBeStatic")
   public boolean isOsProtectedPasswordSupported() {
-    // TODO extension point needed?
     return SystemInfo.isWindows;
   }
 
-
   /**
    * Encrypt master password
    *
@@ -318,22 +320,10 @@ public class MasterKeyPasswordSafe extends BasePasswordSafeProvider {
     return WindowsCryptUtils.protect(EncryptionUtil.getUTF8Bytes(pw));
   }
 
-  /**
-   * Decrypt master password
-   *
-   * @param pw the password to decrypt
-   * @return the decrypted password
-   * @throws MasterPasswordUnavailableException
-   *          if decryption fails
-   */
-  private static String decryptPassword(byte[] pw) throws MasterPasswordUnavailableException {
-    if (!SystemInfo.isWindows) throw new AssertionError("Windows OS expected");
-
-    return new String(WindowsCryptUtils.unprotect(pw), CharsetToolkit.UTF8_CHARSET);
-  }
-
   public boolean isPasswordEncrypted() {
-    if (!isOsProtectedPasswordSupported()) return false;
+    if (!isOsProtectedPasswordSupported()) {
+      return false;
+    }
 
     byte[] info = myDatabase.getPasswordInfo();
     return info != null && info.length > 0;
index 2858fb554607eba6c37f721b4ff2210cdf0a9f4f..0b7c5e00e83a8bc58ee28805d3f92cf52a79c39a 100644 (file)
@@ -15,7 +15,6 @@
  */
 package com.intellij.ide.passwordSafe.impl.providers.masterKey.windows;
 
-import com.intellij.ide.passwordSafe.MasterPasswordUnavailableException;
 import com.intellij.util.containers.ContainerUtil;
 import com.sun.jna.Memory;
 import com.sun.jna.Native;
@@ -52,7 +51,7 @@ public class WindowsCryptUtils {
    * @param data the data to protect
    * @return the the protected form the data
    */
-  public static byte[] protect(byte[] data) throws MasterPasswordUnavailableException {
+  public static byte[] protect(byte[] data) {
     if(data.length == 0) {
       return data;
     }
@@ -75,7 +74,7 @@ public class WindowsCryptUtils {
    * @param data the data to protect
    * @return the the protected form the data
    */
-  public static byte[] unprotect(byte[] data) throws MasterPasswordUnavailableException {
+  public static byte[] unprotect(byte[] data) {
     if(data.length == 0) {
       return data;
     }
@@ -92,10 +91,10 @@ public class WindowsCryptUtils {
     return getBytes(out, kernel, rc);
   }
 
-  private static byte[] getBytes(Crypt32.DATA_BLOB out, Kernel32 kernel, boolean rc) throws MasterPasswordUnavailableException {
+  private static byte[] getBytes(Crypt32.DATA_BLOB out, Kernel32 kernel, boolean rc) {
     if (!rc) {
       W32API.DWORD drc = kernel.GetLastError();
-      throw new MasterPasswordUnavailableException("CryptProtectData failed: " + drc.intValue());
+      throw new RuntimeException("CryptProtectData failed: " + drc.intValue());
     }
     else {
       byte[] output = new byte[out.cbData.intValue()];