/*
* Zed Attack Proxy (ZAP) and its related class files.
*
* ZAP is an HTTP/HTTPS proxy for assessing web application security.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.zaproxy.zap.extension.lang;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import javax.swing.JOptionPane;
import org.apache.log4j.Logger;
import org.parosproxy.paros.Constant;
import org.parosproxy.paros.view.View;
import org.zaproxy.zap.utils.LocaleUtils;
public final class LangImporter {
private static final Logger logger = Logger.getLogger(LangImporter.class);
private static final String MSG_SUCCESS = "options.lang.importer.dialog.message.success";
private static final String MSG_ERROR = "options.lang.importer.dialog.message.error";
private static final String MSG_FILE_NOT_FOUND = "options.lang.importer.dialog.message.filenotfound";
private LangImporter() {
}
public static String importLanguagePack(String languagePack) {
Pattern includedFilesPattern = createIncludedFilesPattern();
int langFileCount = 0;
String message = "";
File F = new File(languagePack);
try (ZipFile zipFile = new ZipFile(F.getAbsolutePath())) {
Enumeration<? extends ZipEntry> enumeration = zipFile.entries();
while (enumeration.hasMoreElements()) {
ZipEntry zipEntry = enumeration.nextElement();
if (!zipEntry.isDirectory()) {
try (BufferedInputStream bis = new BufferedInputStream(zipFile.getInputStream(zipEntry))) {
int size;
byte[] buffer = new byte[2048];
String name = zipEntry.getName();
if (includedFilesPattern.matcher(name).find()) {
langFileCount++;
Path outputFile = Paths.get(Constant.getZapInstall(), name);
try (BufferedOutputStream bos = new BufferedOutputStream(
Files.newOutputStream(outputFile),
buffer.length)) {
while ((size = bis.read(buffer, 0, buffer.length)) != -1) {
bos.write(buffer, 0, size);
}
bos.flush();
}
}
}
}
}
message = (langFileCount > 0) ? MSG_SUCCESS : MSG_ERROR;
} catch (IOException e) {
message = MSG_FILE_NOT_FOUND;
logger.error(e.getMessage(), e);
}
if (View.isInitialised()) {
JOptionPane.showMessageDialog(null,
MessageFormat.format(Constant.messages.getString(message), langFileCount),
Constant.messages.getString("options.lang.importer.dialog.title"),
(langFileCount > 0) ? JOptionPane.INFORMATION_MESSAGE : JOptionPane.ERROR_MESSAGE);
}
return message;
}
/**
* Creates a {@code Pattern} to match filenames of, source and translated, resource files Messages.properties and
* vulnerabilities.xml.
*
* @return the {@code Pattern} to match the resource files
* @since 2.4.0
*/
// Relaxed visibility to allow unit test
static Pattern createIncludedFilesPattern() {
String messagesFilesRegex = LocaleUtils.createResourceFilesRegex(Constant.MESSAGES_PREFIX, Constant.MESSAGES_EXTENSION);
String vulnerabilitiesFilesRegex = LocaleUtils.createResourceFilesRegex(
Constant.VULNERABILITIES_PREFIX,
Constant.VULNERABILITIES_EXTENSION);
StringBuilder strBuilder = new StringBuilder(messagesFilesRegex.length() + vulnerabilitiesFilesRegex.length() + 1);
strBuilder.append(messagesFilesRegex).append('|').append(vulnerabilitiesFilesRegex);
return Pattern.compile(strBuilder.toString());
}
}