private java.util.List<File> addFileToZip(String path, String srcFile, ZipOutputStream zip) throws Exception { ArrayList<File> ret = new ArrayList<File>(); if (srcFile.endsWith("Thumbs.db")) { return null; } if (excludeFilter != null) { if (Regex.matches(srcFile, excludeFilter)) { System.out.println("Filtered: " + srcFile); return ret; } } File folder = new File(srcFile); if (excludeFiles != null && excludeFiles.contains(folder)) { return ret; } if (folder.isDirectory()) { ret.addAll(addFolderToZip(path, srcFile, zip)); if (this.deleteAfterPack) FileCreationManager.getInstance().delete(new File(srcFile), null); } else { byte[] buf = new byte[1024]; int len; FileInputStream in = new FileInputStream(srcFile); if (path == null || path.trim().length() == 0) { zip.putNextEntry(new ZipEntry(folder.getName())); } else { zip.putNextEntry(new ZipEntry(path + "/" + folder.getName())); } while ((len = in.read(buf)) > 0) { zip.write(buf, 0, len); } in.close(); if (this.deleteAfterPack) FileCreationManager.getInstance().delete(new File(srcFile), null); ret.add(new File(srcFile)); } return ret; }
private void save(List<LazyHostPlugin> save, final AtomicLong lastFolderModification) { if (save != null) { LOCK.writeLock(); final File cache = Application.getTempResource(getCache()); try { LazyHostPluginCache.write(save, cache, lastFolderModification); } catch (final Throwable e) { final LogSource log = LogController.CL(false); log.log(e); log.close(); cache.delete(); } finally { LOCK.writeUnlock(); FileCreationManager.getInstance() .delete(Application.getTempResource(TMP_INVALIDPLUGINS), null); } } }
/** * wird aufgerufen um die Zip zu erstellen * * @throws Exception */ public java.util.List<File> zip() throws Exception { ArrayList<File> ret = new ArrayList<File>(); ZipOutputStream zip = null; FileOutputStream fileWriter = null; fileWriter = new FileOutputStream(destinationFile); zip = new ZipOutputStream(fileWriter); for (File element : srcFiles) { if (element.isDirectory()) { ret.addAll(addFolderToZip("", element.getAbsolutePath(), zip)); } else if (element.isFile()) { ret.addAll(addFileToZip("", element.getAbsolutePath(), zip)); } } zip.flush(); zip.close(); int toFill = (int) (fillSize - destinationFile.length()); if (toFill > 0) { byte[] sig = new byte[] {80, 75, 3, 4, 20, 0, 8, 0, 8, 0}; toFill -= sig.length; FileInputStream in = new FileInputStream(destinationFile); File newTarget = new File(destinationFile.getAbsolutePath() + ".jd"); FileOutputStream out = new FileOutputStream(newTarget); out.write(sig); out.write(new byte[toFill]); int c; while ((c = in.read()) != -1) { out.write(c); } in.close(); out.close(); FileCreationManager.getInstance().delete(destinationFile, null); newTarget.renameTo(destinationFile); } return ret; }
protected String getCaptchaCode( final Browser br, final String method, final String captchaAddress, final CryptedLink param) throws Exception { if (captchaAddress == null) { logger.severe("Captcha address is not defined!"); new PluginException(LinkStatus.ERROR_PLUGIN_DEFECT); } final File captchaFile = this.getLocalCaptchaFile(); try { final Browser brc = br.cloneBrowser(); // most captcha are images? brc.getHeaders().put("Accept", "image/webp,image/*,*/*;q=0.8"); brc.getHeaders().put("Cache-Control", null); brc.getDownload(captchaFile, captchaAddress); // erst im Nachhinein das der Bilddownload nicht gestört wird final String captchaCode = getCaptchaCode(method, captchaFile, param); return captchaCode; } finally { if (captchaFile != null) { FileCreationManager.getInstance().delete(captchaFile, null); } } }
@Override public Void run() { // let's write an info file. and delete if after extraction. this wy we have infosfiles if the // extraction crashes jd crashLog = new ExtractLogFileWriter( archive.getName(), archive.getFirstArchiveFile().getFilePath(), archive.getFactory().getID()) { @Override public void write(String string) { super.write(string); logger.info(string); } }; try { fireEvent(ExtractionEvent.Type.START); archive.onStartExtracting(); crashLog.write("Date: " + new Date()); crashLog.write("Start Extracting"); crashLog.write("Extension Setup: \r\n" + extension.getSettings().toString()); crashLog.write("Archive Setup: \r\n" + JSonStorage.toString(archive.getSettings())); extractor.setCrashLog(crashLog); logger.info("Start unpacking of " + archive.getFirstArchiveFile().getFilePath()); for (ArchiveFile l : archive.getArchiveFiles()) { if (!new File(l.getFilePath()).exists()) { crashLog.write("File missing: " + l.getFilePath()); logger.info("Could not find archive file " + l.getFilePath()); archive.addCrcError(l); } } if (archive.getCrcError().size() > 0) { fireEvent(ExtractionEvent.Type.FILE_NOT_FOUND); crashLog.write("Failed"); return null; } if (gotKilled()) { return null; } crashLog.write("Prepare"); if (extractor.prepare()) { extractToFolder = extension.getFinalExtractToFolder(archive); crashLog.write("Extract To: " + extractToFolder); if (archive.isProtected()) { crashLog.write("Archive is Protected"); if (!StringUtils.isEmpty(archive.getFinalPassword()) && !checkPassword(archive.getFinalPassword(), false)) { /* open archive with found pw */ logger.info( "Password " + archive.getFinalPassword() + " is invalid, try to find correct one"); archive.setFinalPassword(null); } if (StringUtils.isEmpty(archive.getFinalPassword())) { crashLog.write("Try to find password"); /* pw unknown yet */ List<String> spwList = archive.getSettings().getPasswords(); if (spwList != null) { passwordList.addAll(spwList); } passwordList.addAll(archive.getFactory().getGuessedPasswordList(archive)); passwordList.add(archive.getName()); java.util.List<String> pwList = extractor.config.getPasswordList(); if (pwList == null) { pwList = new ArrayList<String>(); } passwordList.addAll(pwList); fireEvent(ExtractionEvent.Type.START_CRACK_PASSWORD); logger.info("Start password finding for " + archive); String correctPW = null; for (String password : passwordList) { if (password == null) { continue; } if (gotKilled()) { return null; } crashLog.write("Try Password: "******"Found password: \"" + password + "\""); break; } else { // try trimmed password String trimmed = password.trim(); if (trimmed.length() != password.length()) { password = trimmed; if (checkPassword( password, extension.getSettings().isPasswordFindOptimizationEnabled())) { correctPW = password; crashLog.write("Found password: \"" + password + "\""); break; } } } } if (correctPW == null) { fireEvent(ExtractionEvent.Type.PASSWORD_NEEDED_TO_CONTINUE); crashLog.write("Ask for password"); logger.info("Found no password in passwordlist " + archive); if (gotKilled()) { return null; } if (!checkPassword(archive.getFinalPassword(), false)) { fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); logger.info("No password found for " + archive); crashLog.write("No password found or given"); crashLog.write("Failed"); return null; } } fireEvent(ExtractionEvent.Type.PASSWORD_FOUND); logger.info("Found password for " + archive + "->" + archive.getFinalPassword()); } if (StringUtils.isNotEmpty(archive.getFinalPassword())) { extension.addPassword(archive.getFinalPassword()); } } final DiskSpaceReservation extractReservation = new DiskSpaceReservation() { @Override public long getSize() { final long completeSize = Math.max(getCompleteBytes(), archive.getContentView().getTotalSize()); long ret = completeSize - getProcessedBytes(); return ret; } @Override public File getDestination() { return getExtractToFolder(); } }; DISKSPACERESERVATIONRESULT reservationResult = DownloadWatchDog.getInstance() .getSession() .getDiskSpaceManager() .checkAndReserve(extractReservation, this); try { switch (reservationResult) { case FAILED: logger.info( "Not enough harddisk space for unpacking archive " + archive.getFirstArchiveFile().getFilePath()); crashLog.write("Diskspace Problem: " + reservationResult); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.NOT_ENOUGH_SPACE); return null; case INVALIDDESTINATION: logger.warning("Could use create subpath"); crashLog.write("Could use create subpath: " + getExtractToFolder()); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); return null; } fireEvent(ExtractionEvent.Type.OPEN_ARCHIVE_SUCCESS); if (!getExtractToFolder().exists()) { if (!FileCreationManager.getInstance().mkdir(getExtractToFolder())) { logger.warning("Could not create subpath"); crashLog.write("Could not create subpath: " + getExtractToFolder()); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); return null; } } logger.info("Execute unpacking of:" + archive); logger.info("Extract to " + getExtractToFolder()); crashLog.write( "Use Password: "******"|PW Protected:" + archive.isProtected() + ":" + archive.isPasswordRequiredToOpen()); ScheduledExecutorService scheduler = null; try { crashLog.write("Start Extracting " + extractor); scheduler = DelayedRunnable.getNewScheduledExecutorService(); timer = scheduler.scheduleWithFixedDelay( new Runnable() { public void run() { fireEvent(ExtractionEvent.Type.EXTRACTING); } }, 1, 1, TimeUnit.SECONDS); extractor.extract(this); } finally { crashLog.write("Extractor Returned"); if (timer != null) { timer.cancel(false); } if (scheduler != null) { scheduler.shutdown(); } extractor.close(); if (extractor.getLastAccessedArchiveFile() != null) { crashLog.write("Last used File: " + extractor.getLastAccessedArchiveFile()); } fireEvent(ExtractionEvent.Type.EXTRACTING); } } finally { DownloadWatchDog.getInstance() .getSession() .getDiskSpaceManager() .free(extractReservation, this); } if (gotKilled()) { return null; } if (extractor.getException() != null) { exception = extractor.getException(); logger.log(exception); } if (exception != null) { crashLog.write("Exception occured: \r\n" + Exceptions.getStackTrace(exception)); } crashLog.write("ExitCode: " + archive.getExitCode()); switch (archive.getExitCode()) { case ExtractionControllerConstants.EXIT_CODE_SUCCESS: logger.info("Unpacking successful for " + archive); archive .getSettings() .setExtractionInfo(new ExtractionInfo(getExtractToFolder(), archive)); crashLog.write( "Info: \r\n" + JSonStorage.serializeToJson( new ExtractionInfo(getExtractToFolder(), archive))); crashLog.write("Successful"); successful = true; fireEvent(ExtractionEvent.Type.FINISHED); logger.clear(); break; case ExtractionControllerConstants.EXIT_CODE_INCOMPLETE_ERROR: logger.warning("Archive seems to be incomplete " + archive); crashLog.write("Incomplete Archive"); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.FILE_NOT_FOUND); break; case ExtractionControllerConstants.EXIT_CODE_CRC_ERROR: logger.warning("A CRC error occurred when unpacking " + archive); crashLog.write("CRC Error occured"); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED_CRC); break; case ExtractionControllerConstants.EXIT_CODE_USER_BREAK: logger.info("User interrupted unpacking of " + archive); crashLog.write("Interrupted by User"); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); break; case ExtractionControllerConstants.EXIT_CODE_CREATE_ERROR: logger.warning("Could not create Outputfile for" + archive); crashLog.write("Could not create Outputfile"); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); break; case ExtractionControllerConstants.EXIT_CODE_WRITE_ERROR: logger.warning("Unable to write unpacked data on harddisk for " + archive); this.exception = new ExtractionException("Write to disk error"); crashLog.write("Harddisk write Error"); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); break; case ExtractionControllerConstants.EXIT_CODE_FATAL_ERROR: logger.warning("A unknown fatal error occurred while unpacking " + archive); crashLog.write("Unknown Fatal Error"); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); break; case ExtractionControllerConstants.EXIT_CODE_WARNING: logger.warning("Non fatal error(s) occurred while unpacking " + archive); crashLog.write("Unknown Non Fatal Error"); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); break; default: crashLog.write("Failed...unknown reason"); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); break; } return null; } else { crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); } } catch (Exception e) { logger.log(e); this.exception = e; crashLog.write("Exception occured: \r\n" + Exceptions.getStackTrace(e)); crashLog.write("Failed"); fireEvent(ExtractionEvent.Type.EXTRACTION_FAILED); } finally { crashLog.close(); if (!CFG_EXTRACTION.CFG.isWriteExtractionLogEnabled()) { crashLog.delete(); } try { if (gotKilled()) { logger.info("ExtractionController has been killed"); logger.clear(); } try { extractor.close(); } catch (final Throwable e) { } fireEvent(ExtractionEvent.Type.CLEANUP); archive.onCleanUp(); } finally { logger.close(); } } return null; }