From a4a38a60c9ec7b4c2de5b4e1f40d60893d2fa606 Mon Sep 17 00:00:00 2001 From: tonikelope Date: Fri, 7 Oct 2016 17:14:23 +0200 Subject: [PATCH] 1.18 -MC password links lock -... --- src/megabasterd/ChunkWriter.java | 2 +- src/megabasterd/Download.java | 10 +- .../GetMegaMasterPasswordDialog.java | 2 +- src/megabasterd/MainPanel.java | 2 +- src/megabasterd/MegaCrypterAPI.java | 118 ++++++++++-------- src/megabasterd/MiscTools.java | 4 +- src/megabasterd/SettingsDialog.java | 2 +- src/megabasterd/TransferenceManager.java | 12 +- src/megabasterd/Upload.java | 6 +- 9 files changed, 85 insertions(+), 73 deletions(-) diff --git a/src/megabasterd/ChunkWriter.java b/src/megabasterd/ChunkWriter.java index 922c867c8..54f43e121 100644 --- a/src/megabasterd/ChunkWriter.java +++ b/src/megabasterd/ChunkWriter.java @@ -35,7 +35,7 @@ public final class ChunkWriter implements Runnable, SecureNotifiable { _byte_file_key = CryptTools.initMEGALinkKey(_download.getFile_key()); _byte_iv = CryptTools.initMEGALinkKeyIV(_download.getFile_key()); _chunk_queue = new ConcurrentHashMap(); - _rejectedChunkIds = new ConcurrentLinkedQueue(); + _rejectedChunkIds = new ConcurrentLinkedQueue<>(); if(_download.getProgress() == 0) { diff --git a/src/megabasterd/Download.java b/src/megabasterd/Download.java index f3f949904..87aac8899 100644 --- a/src/megabasterd/Download.java +++ b/src/megabasterd/Download.java @@ -121,9 +121,9 @@ public final class Download implements Transference, Runnable, SecureNotifiable _slots = slots; _restart= restart; _secure_notify_lock = new Object(); - _chunkworkers = new ArrayList(); - _partialProgressQueue = new ConcurrentLinkedQueue(); - _rejectedChunkIds = new ConcurrentLinkedQueue(); + _chunkworkers = new ArrayList<>(); + _partialProgressQueue = new ConcurrentLinkedQueue<>(); + _rejectedChunkIds = new ConcurrentLinkedQueue<>(); _thread_pool = newCachedThreadPool(); } @@ -1196,6 +1196,10 @@ public final class Download implements Transference, Runnable, SecureNotifiable case 24: emergencyStopDownloader("MegaCrypter link has expired!"); break; + + case 25: + emergencyStopDownloader("MegaCrypter bad password!"); + break; default: diff --git a/src/megabasterd/GetMegaMasterPasswordDialog.java b/src/megabasterd/GetMegaMasterPasswordDialog.java index 45c9c6ac9..f5a111995 100644 --- a/src/megabasterd/GetMegaMasterPasswordDialog.java +++ b/src/megabasterd/GetMegaMasterPasswordDialog.java @@ -212,7 +212,7 @@ public class GetMegaMasterPasswordDialog extends javax.swing.JDialog { if(!pass_hash.equals(_current_pass_hash)) { - JOptionPane.showMessageDialog(tthis, "Bad password!", "Error", JOptionPane.ERROR_MESSAGE); + JOptionPane.showMessageDialog(tthis, "BAD PASSWORD!", "Error", JOptionPane.ERROR_MESSAGE); swingReflectionInvoke("setText", status_label, ""); diff --git a/src/megabasterd/MainPanel.java b/src/megabasterd/MainPanel.java index 68416af4d..c6db412da 100644 --- a/src/megabasterd/MainPanel.java +++ b/src/megabasterd/MainPanel.java @@ -61,7 +61,7 @@ import static megabasterd.Transference.MAX_TRANSFERENCE_SPEED_DEFAULT; */ public final class MainPanel { - public static final String VERSION="1.17"; + public static final String VERSION="1.18"; public static final int CONNECTION_TIMEOUT = 30000; public static final int THROTTLE_SLICE_SIZE=16*1024; public static final int STREAMER_PORT = 1337; diff --git a/src/megabasterd/MegaCrypterAPI.java b/src/megabasterd/MegaCrypterAPI.java index 5de22d991..681e59e61 100644 --- a/src/megabasterd/MegaCrypterAPI.java +++ b/src/megabasterd/MegaCrypterAPI.java @@ -9,6 +9,9 @@ import java.net.URL; import java.security.spec.InvalidKeySpecException; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Set; import java.util.logging.Level; import static java.util.logging.Logger.getLogger; import java.util.zip.GZIPInputStream; @@ -32,6 +35,8 @@ import org.codehaus.jackson.map.ObjectMapper; public final class MegaCrypterAPI { public static final String USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0"; + public static final Set PASS_CACHE = new HashSet<>(); + public static final Object PASS_LOCK = new Object(); private static String _rawRequest(String request, URL url_api) throws IOException, MegaCrypterAPIException { @@ -213,70 +218,73 @@ public final class MegaCrypterAPI { Cipher decrypter; - try { - do - { - bad_pass = false; - - password = JOptionPane.showInputDialog(panel, "Enter password:"); - - if(password!=null) { - + synchronized(PASS_LOCK) { + + LinkedList pass_list = new LinkedList(PASS_CACHE); + + do + { + bad_pass = true; + + if((password = pass_list.poll()) == null) { + + password = JOptionPane.showInputDialog(panel, "Enter password for MegaCrypter link:"); + } + + if(password != null) { + + try { + + info_key=CryptTools.PBKDF2HMACSHA256(password, salt, (int)Math.pow(2, iterations)); + + decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv); + try { - - info_key=CryptTools.PBKDF2HMACSHA256(password, salt, (int)Math.pow(2, iterations)); - - decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv); - try { + bad_pass = !Arrays.equals(info_key, decrypter.doFinal(key_check)); - bad_pass = !Arrays.equals(info_key, decrypter.doFinal(key_check)); + if(!bad_pass) { - } catch (IllegalBlockSizeException | BadPaddingException ex) { - - bad_pass=true; + PASS_CACHE.add(password); } - - } catch (InvalidKeySpecException ex) { - - bad_pass=true; - } - } - - }while(password!=null && bad_pass); - if(password==null) - { - return null; - } - else - { - decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv); + } catch (IllegalBlockSizeException | BadPaddingException ex) {} - byte[] decrypted_key = decrypter.doFinal(BASE642Bin(fkey)); - - fkey = Bin2UrlBASE64(decrypted_key); - - decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv); - - byte[] decrypted_name = decrypter.doFinal(BASE642Bin(fname)); - - fname = new String(decrypted_name); - - if(fpath != null) - { - byte[] decrypted_fpath = decrypter.doFinal(BASE642Bin(fpath)); - - fpath = new String(decrypted_fpath); - } - - pass=Bin2BASE64(info_key); - + } catch (InvalidKeySpecException ex) {} } - } catch (Exception ex) { - getLogger(MegaCrypterAPI.class.getName()).log(Level.SEVERE, null, ex); - } + }while(password!=null && bad_pass); + } + + if(bad_pass) + { + throw new MegaCrypterAPIException("25"); + } + else + { + decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv); + + byte[] decrypted_key = decrypter.doFinal(BASE642Bin(fkey)); + + fkey = Bin2UrlBASE64(decrypted_key); + + decrypter = CryptTools.genDecrypter("AES", "AES/CBC/PKCS5Padding", info_key, iv); + + byte[] decrypted_name = decrypter.doFinal(BASE642Bin(fname)); + + fname = new String(decrypted_name); + + if(fpath != null) + { + byte[] decrypted_fpath = decrypter.doFinal(BASE642Bin(fpath)); + + fpath = new String(decrypted_fpath); + } + + pass=Bin2BASE64(info_key); + + } + } if(fpath != null) diff --git a/src/megabasterd/MiscTools.java b/src/megabasterd/MiscTools.java index 294fe0a5e..45a343ac0 100644 --- a/src/megabasterd/MiscTools.java +++ b/src/megabasterd/MiscTools.java @@ -124,7 +124,7 @@ public final class MiscTools { } else { - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); while(int_buffer.hasRemaining()) { list.add(int_buffer.get()); @@ -151,7 +151,7 @@ public final class MiscTools { } else { - ArrayList list = new ArrayList(); + ArrayList list = new ArrayList<>(); while(int_buffer.hasRemaining()) { list.add(bin_buffer.get()); diff --git a/src/megabasterd/SettingsDialog.java b/src/megabasterd/SettingsDialog.java index ae315ec5f..ac4aea642 100644 --- a/src/megabasterd/SettingsDialog.java +++ b/src/megabasterd/SettingsDialog.java @@ -1226,7 +1226,7 @@ public final class SettingsDialog extends javax.swing.JDialog { private void delete_all_accounts_buttonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_delete_all_accounts_buttonActionPerformed - swingReflectionInvoke("setEnabled", delete_all_accounts_button, true); + swingReflectionInvoke("setEnabled", delete_all_accounts_button, false); final SettingsDialog tthis = this; diff --git a/src/megabasterd/TransferenceManager.java b/src/megabasterd/TransferenceManager.java index e0dee1423..c76aed230 100644 --- a/src/megabasterd/TransferenceManager.java +++ b/src/megabasterd/TransferenceManager.java @@ -51,12 +51,12 @@ abstract public class TransferenceManager implements Runnable, SecureNotifiable _pause_all_button = pause_all_button; _clean_all_menu = clean_all_menu; _secure_notify_lock = new Object(); - _transference_waitstart_queue = new ConcurrentLinkedQueue(); - _transference_provision_queue = new ConcurrentLinkedQueue(); - _transference_remove_queue = new ConcurrentLinkedQueue(); - _transference_finished_queue = new ConcurrentLinkedQueue(); - _transference_running_list = new ConcurrentLinkedQueue(); - _transference_preprocess_queue = new ConcurrentLinkedQueue(); + _transference_waitstart_queue = new ConcurrentLinkedQueue<>(); + _transference_provision_queue = new ConcurrentLinkedQueue<>(); + _transference_remove_queue = new ConcurrentLinkedQueue<>(); + _transference_finished_queue = new ConcurrentLinkedQueue<>(); + _transference_running_list = new ConcurrentLinkedQueue<>(); + _transference_preprocess_queue = new ConcurrentLinkedQueue<>(); } abstract public void provision(Transference transference); diff --git a/src/megabasterd/Upload.java b/src/megabasterd/Upload.java index 70f43d5ec..c7cb1ab83 100644 --- a/src/megabasterd/Upload.java +++ b/src/megabasterd/Upload.java @@ -99,9 +99,9 @@ public final class Upload implements Transference, Runnable, SecureNotifiable { _slots = slots; _restart = restart; _secure_notify_lock = new Object(); - _chunkworkers = new ArrayList(); - _partialProgressQueue = new ConcurrentLinkedQueue(); - _rejectedChunkIds = new ConcurrentLinkedQueue(); + _chunkworkers = new ArrayList<>(); + _partialProgressQueue = new ConcurrentLinkedQueue<>(); + _rejectedChunkIds = new ConcurrentLinkedQueue<>(); _thread_pool = Executors.newCachedThreadPool(); }