/**
* This file is part of Waarp Project.
*
* Copyright 2009, Frederic Bregier, and individual contributors by the @author tags. See the
* COPYRIGHT.txt in the distribution for a full listing of individual contributors.
*
* All Waarp Project is free software: you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* Waarp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with Waarp . If not, see
* <http://www.gnu.org/licenses/>.
*/
package org.waarp.openr66.protocol.http.adminssl;
import java.io.IOException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.DefaultFullHttpResponse;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.FullHttpResponse;
import io.netty.handler.codec.http.HttpHeaderNames;
import io.netty.handler.codec.http.HttpHeaderValues;
import io.netty.handler.codec.http.HttpMethod;
import io.netty.handler.codec.http.HttpResponse;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.handler.codec.http.HttpUtil;
import io.netty.handler.codec.http.HttpVersion;
import io.netty.handler.codec.http.QueryStringDecoder;
import io.netty.handler.codec.http.cookie.Cookie;
import io.netty.handler.codec.http.cookie.DefaultCookie;
import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
import io.netty.handler.codec.http.cookie.ServerCookieEncoder;
import io.netty.handler.traffic.TrafficCounter;
import org.waarp.common.command.exception.Reply421Exception;
import org.waarp.common.command.exception.Reply530Exception;
import org.waarp.common.crypto.ssl.WaarpSslUtility;
import org.waarp.common.database.DbAdmin;
import org.waarp.common.database.DbPreparedStatement;
import org.waarp.common.database.DbSession;
import org.waarp.common.database.exception.WaarpDatabaseException;
import org.waarp.common.database.exception.WaarpDatabaseNoConnectionException;
import org.waarp.common.database.exception.WaarpDatabaseSqlException;
import org.waarp.common.digest.FilesystemBasedDigest;
import org.waarp.common.exception.FileTransferException;
import org.waarp.common.exception.InvalidArgumentException;
import org.waarp.common.logging.WaarpLogLevel;
import org.waarp.common.logging.WaarpLogger;
import org.waarp.common.logging.WaarpLoggerFactory;
import org.waarp.common.role.RoleDefault.ROLE;
import org.waarp.common.utility.WaarpStringUtils;
import org.waarp.gateway.kernel.http.HttpWriteCacheEnable;
import org.waarp.openr66.client.Message;
import org.waarp.openr66.context.ErrorCode;
import org.waarp.openr66.context.R66FiniteDualStates;
import org.waarp.openr66.context.R66Result;
import org.waarp.openr66.context.R66Session;
import org.waarp.openr66.context.filesystem.R66Dir;
import org.waarp.openr66.context.task.SpooledInformTask;
import org.waarp.openr66.database.DbConstant;
import org.waarp.openr66.database.data.DbHostAuth;
import org.waarp.openr66.database.data.DbHostConfiguration;
import org.waarp.openr66.database.data.DbRule;
import org.waarp.openr66.database.data.DbTaskRunner;
import org.waarp.openr66.protocol.configuration.Configuration;
import org.waarp.openr66.protocol.configuration.Messages;
import org.waarp.openr66.protocol.exception.OpenR66Exception;
import org.waarp.openr66.protocol.exception.OpenR66ExceptionTrappedFactory;
import org.waarp.openr66.protocol.exception.OpenR66ProtocolBusinessException;
import org.waarp.openr66.protocol.exception.OpenR66ProtocolBusinessNoWriteBackException;
import org.waarp.openr66.protocol.localhandler.LocalChannelReference;
import org.waarp.openr66.protocol.localhandler.ServerActions;
import org.waarp.openr66.protocol.localhandler.packet.ErrorPacket;
import org.waarp.openr66.protocol.localhandler.packet.RequestPacket;
import org.waarp.openr66.protocol.localhandler.packet.RequestPacket.TRANSFERMODE;
import org.waarp.openr66.protocol.localhandler.packet.TestPacket;
import org.waarp.openr66.protocol.networkhandler.NetworkTransaction;
import org.waarp.openr66.protocol.utils.ChannelUtils;
import org.waarp.openr66.protocol.utils.NbAndSpecialId;
import org.waarp.openr66.protocol.utils.R66Future;
import org.waarp.openr66.protocol.utils.R66ShutdownHook;
import org.waarp.openr66.protocol.utils.TransferUtils;
import org.waarp.openr66.protocol.utils.Version;
/**
* @author Frederic Bregier
*
*/
public class HttpResponsiveSslHandler extends SimpleChannelInboundHandler<FullHttpRequest> {
/**
* Internal Logger
*/
private static final WaarpLogger logger = WaarpLoggerFactory.getLogger(HttpResponsiveSslHandler.class);
/**
* Session Management
*/
private static final ConcurrentHashMap<String, R66Session> sessions = new ConcurrentHashMap<String, R66Session>();
private static final ConcurrentHashMap<String, DbSession> dbSessions = new ConcurrentHashMap<String, DbSession>();
private static final Random random = new Random();
private R66Session authentHttp = new R66Session();
private FullHttpRequest request;
private boolean newSession = false;
private volatile Cookie admin = null;
private final StringBuilder responseContent = new StringBuilder();
private String uriRequest;
private Map<String, List<String>> params;
private String lang = Messages.getSlocale();
private boolean forceClose = false;
private boolean shutdown = false;
private static final String R66SESSION = "R66SESSION";
private static final String I18NEXT = "i18next";
public static final String LISTING_PAGE = "Listing.html";
private static enum REQUEST {
Logon("Logon.html"),
Logout("Logon.html"),
index("index.html"),
error("Error.html"),
unallowed("NotAllowed.html"),
Listing(LISTING_PAGE),
ListingReload(LISTING_PAGE),
CancelRestart("CancelRestart.html"),
Export("Export.html"),
Hosts("Hosts.html"),
Rules("Rules.html"),
System("System.html"),
SystemLimited("SystemLimited.html"),
Spooled("Spooled.html"),
SpooledDetailed("Spooled.html");
private String header;
/**
* Constructor for a unique file
*
* @param uniquefile
*/
private REQUEST(String uniquefile) {
this.header = uniquefile;
}
/**
* @param header
* @param headerBody
* @param body
* @param endBody
* @param end
*/
private REQUEST(String header, String headerBody, String body,
String endBody, String end) {
this.header = header;
}
/**
* Reader for a unique file
*
* @return the content of the unique file
*/
public String read(HttpResponsiveSslHandler handler) {
return handler.readFileHeader(Configuration.configuration.getHttpBasePath() + this.header);
}
}
private static enum REPLACEMENT {
XXXHOSTIDXXX, XXXADMINXXX, XXXVERSIONXXX, XXXBANDWIDTHXXX, XXXBANDWIDTHINXXX, XXXBANDWIDTHOUTXXX,
XXXXSESSIONLIMITRXXX, XXXXSESSIONLIMITWXXX,
XXXXCHANNELLIMITRXXX, XXXXCHANNELLIMITWXXX,
XXXXDELAYCOMMDXXX, XXXXDELAYRETRYXXX, XXXXDELATRAFFICXXX,
XXXLOCALXXX, XXXNETWORKXXX, XXXNBTRANSFERSXXX,
XXXERRORMESGXXX,
XXXXBUSINESSXXX, XXXXROLESXXX, XXXXALIASESXXX, XXXXOTHERXXX, XXXLIMITROWXXX, XXXREFRESHXXX,
XXXLANGXXX, XXXCURLANGENXXX, XXXCURLANGFRXXX, XXXCURSYSLANGENXXX, XXXCURSYSLANGFRXXX;
}
public static final String sLIMITROW = "LIMITROW";
public static final String sREFRESH = "REFRESH";
private static final String XXXRESULTXXX = "XXXRESULTXXX";
private static final String XXXDATAJSONXXX = "XXXDATAJSONXXX";
private static final String XXXHOSTSIDSXXX = "XXXHOSTSIDSXXX";
private int LIMITROW = 100;
private int REFRESH = 0;
/**
* The Database connection attached to this NetworkChannelReference shared among all associated
* LocalChannels in the session
*/
private DbSession dbSession = null;
/**
* Does this dbSession is private and so should be closed
*/
private boolean isPrivateDbSession = false;
public static String hashStatus() {
return "HttpSslHandler: [sessions: " + sessions.size() + " dbSessions: " + dbSessions.size() + "] ";
}
private String readFileHeader(String filename) {
String value;
try {
value = WaarpStringUtils.readFileException(filename);
} catch (InvalidArgumentException e) {
logger.error("Error while trying to open: " + filename, e);
return "";
} catch (FileTransferException e) {
logger.error("Error while trying to read: " + filename, e);
return "";
}
StringBuilder builder = new StringBuilder(value);
WaarpStringUtils.replace(builder, REPLACEMENT.XXXLOCALXXX.toString(),
Integer.toString(
Configuration.configuration.getLocalTransaction().
getNumberLocalChannel()) + " Thread(" + Thread.activeCount()+")");
WaarpStringUtils.replace(builder, REPLACEMENT.XXXNETWORKXXX.toString(),
Integer.toString(
DbAdmin.getNbConnection() - Configuration.getNBDBSESSION()));
WaarpStringUtils.replace(builder, REPLACEMENT.XXXNBTRANSFERSXXX.toString(),
Long.toString(Configuration.configuration.getMonitoring().nbCountAllRunningStep));
WaarpStringUtils.replaceAll(builder, REPLACEMENT.XXXHOSTIDXXX.toString(),
Configuration.configuration.getHOST_ID());
if (authentHttp.isAuthenticated()) {
WaarpStringUtils.replace(builder, REPLACEMENT.XXXADMINXXX.toString(),
Messages.getString("HttpSslHandler.1")); //$NON-NLS-1$
} else {
WaarpStringUtils.replace(builder, REPLACEMENT.XXXADMINXXX.toString(),
Messages.getString("HttpSslHandler.0")); //$NON-NLS-1$
}
TrafficCounter trafficCounter =
Configuration.configuration.getGlobalTrafficShapingHandler().trafficCounter();
long read = trafficCounter.lastReadThroughput();
long write = trafficCounter.lastWriteThroughput();
WaarpStringUtils.replace(builder, REPLACEMENT.XXXBANDWIDTHXXX.toString(),
Messages.getString("HttpSslHandler.IN") + (read >> 20) + //$NON-NLS-1$
Messages.getString("HttpSslHandler.MOPS") + //$NON-NLS-1$
Messages.getString("HttpSslHandler.OUT") + //$NON-NLS-1$
(write >> 20) +
Messages.getString("HttpSslHandler.MOPS")); //$NON-NLS-1$
WaarpStringUtils.replace(builder, REPLACEMENT.XXXBANDWIDTHINXXX.toString(),
(read >> 20) + //$NON-NLS-1$
Messages.getString("HttpSslHandler.MOPS")); //$NON-NLS-1$
WaarpStringUtils.replace(builder, REPLACEMENT.XXXBANDWIDTHOUTXXX.toString(),
(write >> 20) +
Messages.getString("HttpSslHandler.MOPS")); //$NON-NLS-1$
WaarpStringUtils.replaceAll(builder, REPLACEMENT.XXXLIMITROWXXX.toString(),
"" + getLIMITROW());
WaarpStringUtils.replaceAll(builder, REPLACEMENT.XXXREFRESHXXX.toString(),
"" + (getREFRESH()/1000));
WaarpStringUtils.replaceAll(builder, REPLACEMENT.XXXLANGXXX.toString(), lang);
return builder.toString();
}
private String getTrimValue(String varname) {
List<String> varlist = params.get(varname);
if (varlist != null && !varlist.isEmpty()) {
String value = params.get(varname).get(0).trim();
if (value.isEmpty()) {
value = null;
}
return value;
}
return null;
}
private String getValue(String varname) {
return params.get(varname).get(0);
}
private String index() {
String index = REQUEST.index.read(this);
StringBuilder builder = new StringBuilder(index);
WaarpStringUtils.replaceAll(builder, REPLACEMENT.XXXHOSTIDXXX.toString(),
Configuration.configuration.getHOST_ID());
WaarpStringUtils.replaceAll(builder, REPLACEMENT.XXXADMINXXX.toString(),
Messages.getString("HttpSslHandler.2")); //$NON-NLS-1$
WaarpStringUtils.replace(builder, REPLACEMENT.XXXVERSIONXXX.toString(),
Version.ID);
return builder.toString();
}
private String error(String mesg) {
String index = REQUEST.error.read(this);
return index.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
mesg);
}
private String unallowed(String mesg) {
String index = REQUEST.unallowed.read(this);
if (index == null || index.isEmpty()) {
return error(mesg);
}
return index.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
mesg);
}
private String Logon() {
return REQUEST.Logon.read(this);
}
private String resetOptionTransfer(String header, String startid, String stopid,
String start, String stop, String rule, String req,
boolean pending, boolean transfer, boolean error, boolean done, boolean all) {
StringBuilder builder = new StringBuilder(header);
WaarpStringUtils.replace(builder, "XXXSTARTIDXXX", startid);
WaarpStringUtils.replace(builder, "XXXSTOPIDXXX", stopid);
WaarpStringUtils.replace(builder, "XXXSTARTXXX", start);
WaarpStringUtils.replace(builder, "XXXSTOPXXX", stop);
WaarpStringUtils.replace(builder, "XXXRULEXXX", rule);
WaarpStringUtils.replace(builder, "XXXREQXXX", req);
WaarpStringUtils.replace(builder, "XXXPENDXXX", pending ? "checked" : "");
WaarpStringUtils.replace(builder, "XXXTRANSXXX", transfer ? "checked" : "");
WaarpStringUtils.replace(builder, "XXXERRXXX", error ? "checked" : "");
WaarpStringUtils.replace(builder, "XXXDONEXXX", done ? "checked" : "");
WaarpStringUtils.replace(builder, "XXXALLXXX", all ? "checked" : "");
return builder.toString();
}
private String checkAuthorizedToSeeAll() {
boolean seeAll = false;
if (authentHttp.getAuth().isValidRole(ROLE.CONFIGADMIN)) {
DbHostConfiguration dbhc;
try {
dbhc = new DbHostConfiguration(dbSession, Configuration.configuration.getHOST_ID());
} catch (WaarpDatabaseException e) {
return null;
}
seeAll = dbhc != null && dbhc.isSeeAllId(authentHttp.getAuth().getUser());
}
if (seeAll) {
return "*";
}
return null;
}
private String setDbTaskRunnerJsonData(String head, String errorText,
String startid, String stopid, Timestamp tstart, Timestamp tstop, String rule, String req,
boolean pending, boolean transfer, boolean error, boolean done, boolean all) {
String seeAll = checkAuthorizedToSeeAll();
DbPreparedStatement preparedStatement = null;
try {
preparedStatement =
DbTaskRunner.getFilterPrepareStatement(dbSession, getLIMITROW(), false,
startid, stopid, tstart, tstop, rule, req,
pending, transfer, error, done, all, seeAll);
String json = DbTaskRunner.getJson(preparedStatement, getLIMITROW());
return head.replace(XXXDATAJSONXXX, json);
} catch (WaarpDatabaseException e) {
if (preparedStatement != null) {
preparedStatement.realClose();
}
logger.warn("OpenR66 Web Error {}", e.getMessage());
errorText += Messages.getString("ErrorCode.17")+": "+e.getMessage()+"<BR/>";
} catch (OpenR66ProtocolBusinessException e) {
if (preparedStatement != null) {
preparedStatement.realClose();
}
logger.warn("OpenR66 Web Error {}", e.getMessage());
errorText += Messages.getString("ErrorCode.17")+": "+e.getMessage()+"<BR/>";
}
return head.replace(XXXRESULTXXX, errorText);
}
private String ListingReload() {
String errorText = "";
if (params == null) {
String head = REQUEST.Listing.read(this);
head = resetOptionTransfer(head, "", "", "", "", "", "",
false, false, false, false, true);
head = setDbTaskRunnerJsonData(head, errorText, "", "", null, null, "", "", false, false, false, false, true);
return head.replace(XXXRESULTXXX, "").replace(XXXDATAJSONXXX, "[]");
}
List<String> parms = params.get("ACTION");
String head = REQUEST.Listing.read(this);
if (parms != null) {
String parm = parms.get(0);
boolean isNotReload = ! "Reload".equalsIgnoreCase(parm);
if ("Filter".equalsIgnoreCase(parm) || ! isNotReload) {
String startid = getTrimValue("startid");
String stopid = getTrimValue("stopid");
if (isNotReload && startid != null && stopid == null) {
stopid = Long.MAX_VALUE + "";
}
if (isNotReload && stopid != null && startid == null) {
startid = (DbConstant.ILLEGALVALUE + 1) + "";
}
String start = getValue("start");
String stop = getValue("stop");
String rule = getTrimValue("rule");
String req = getTrimValue("req");
boolean pending, transfer, error, done, all;
pending = params.containsKey("pending");
transfer = params.containsKey("transfer");
error = params.containsKey("error");
done = params.containsKey("done");
all = params.containsKey("all");
if (pending && transfer && error && done) {
all = true;
} else if (!(pending || transfer || error || done)) {
all = true;
}
Timestamp tstart = WaarpStringUtils.fixDate(start);
if (tstart != null) {
start = tstart.toString();
}
Timestamp tstop = WaarpStringUtils.fixDate(stop, tstart);
if (tstop != null) {
stop = tstop.toString();
}
Long idstart = null;
head = setDbTaskRunnerJsonData(head, errorText, startid, stopid, tstart, tstop, rule, req, pending, transfer, error, done, all);
head = resetOptionTransfer(head, startid == null ? (idstart != null ? idstart.toString() : "")
: startid,
stopid == null ? "" : stopid, start, stop,
rule == null ? "" : rule, req == null ? "" : req,
pending, transfer, error, done, all);
} else {
head = resetOptionTransfer(head, "", "", "", "", "", "",
false, false, false, false, true);
head = setDbTaskRunnerJsonData(head, errorText, "", "", null, null, "", "", false, false, false, false, true);
}
} else {
head = resetOptionTransfer(head, "", "", "", "", "", "",
false, false, false, false, true);
head = setDbTaskRunnerJsonData(head, errorText, "", "", null, null, "", "", false, false, false, false, true);
}
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
private String Listing() {
getParams();
return ListingReload();
}
private String CancelRestart() {
getParams();
if (params == null) {
String head = REQUEST.CancelRestart.read(this);
head = resetOptionTransfer(head, "", "", "", "", "", "",
false, false, false, false, true);
head = setDbTaskRunnerJsonData(head, "", "", "", null, null, "", "", false, false, false, false, true);
return head.replace(XXXRESULTXXX, "").replace(XXXDATAJSONXXX, "[]");
}
String head = REQUEST.CancelRestart.read(this);
String errorText = "";
List<String> parms = params.get("ACTION");
String seeAll = checkAuthorizedToSeeAll();
if (parms != null) {
String parm = parms.get(0);
boolean isNotReload = ! "Reload".equalsIgnoreCase(parm);
if ("Search".equalsIgnoreCase(parm)) {
String startid = getTrimValue("startid");
String stopid = startid == null ? null : Long.toString(Long.parseLong(startid)+1);
head = setDbTaskRunnerJsonData(head, errorText, startid, stopid, null, null, null, null, false, false, false, false, true);
head = resetOptionTransfer(head, startid == null ? "" : startid,
stopid, "", "", "", "", false, false, false, false, true);
} else if ("Filter".equalsIgnoreCase(parm) || ! isNotReload) {
String startid = getTrimValue("startid");
String stopid = getTrimValue("stopid");
if (isNotReload && startid != null && stopid == null) {
stopid = Long.MAX_VALUE + "";
}
if (isNotReload && stopid != null && startid == null) {
startid = (DbConstant.ILLEGALVALUE + 1) + "";
}
String start = getValue("start");
String stop = getValue("stop");
String rule = getTrimValue("rule");
String req = getTrimValue("req");
boolean pending, transfer, error, done, all;
pending = params.containsKey("pending");
transfer = params.containsKey("transfer");
error = params.containsKey("error");
done = params.containsKey("done");
all = params.containsKey("all");
if (pending && transfer && error && done) {
all = true;
} else if (!(pending || transfer || error || done)) {
all = true;
}
Timestamp tstart = WaarpStringUtils.fixDate(start);
if (tstart != null) {
start = tstart.toString();
}
Timestamp tstop = WaarpStringUtils.fixDate(stop, tstart);
if (tstop != null) {
stop = tstop.toString();
}
Long idstart = null;
head = setDbTaskRunnerJsonData(head, errorText, startid, stopid, tstart, tstop, rule, req, pending, transfer, error, done, all);
head = resetOptionTransfer(head, startid == null ? (idstart != null ? idstart.toString() : "")
: startid,
stopid == null ? "" : stopid, start, stop,
rule == null ? "" : rule, req == null ? "" : req,
pending, transfer, error, done, all);
} else if ("RestartAll".equalsIgnoreCase(parm) ||
"StopAll".equalsIgnoreCase(parm) ||
"StopCleanAll".equalsIgnoreCase(parm)) {
boolean stopcommand = "StopAll".equalsIgnoreCase(parm) || "StopCleanAll".equalsIgnoreCase(parm);
String startid = getTrimValue("startid");
String stopid = getTrimValue("stopid");
String start = getValue("start");
String stop = getValue("stop");
String rule = getTrimValue("rule");
String req = getTrimValue("req");
boolean pending, transfer, error, done, all;
pending = params.containsKey("pending");
transfer = params.containsKey("transfer");
error = params.containsKey("error");
done = false;
all = false;
if (pending && transfer && error && done) {
all = true;
} else if (!(pending || transfer || error || done)) {
all = true;
pending = true;
transfer = true;
error = true;
}
Timestamp tstart = WaarpStringUtils.fixDate(start);
if (tstart != null) {
start = tstart.toString();
}
Timestamp tstop = WaarpStringUtils.fixDate(stop, tstart);
if (tstop != null) {
stop = tstop.toString();
}
head = resetOptionTransfer(head, startid == null ? "" : startid,
stopid == null ? "" : stopid, start, stop,
rule == null ? "" : rule, req == null ? "" : req,
pending, transfer, error, done, all);
HashMap<String, String> map = new HashMap<String, String>();
if (stopcommand) {
if ("StopCleanAll".equalsIgnoreCase(parm)) {
TransferUtils.cleanSelectedTransfers(dbSession, 0, map,
authentHttp, head, startid, stopid, tstart, tstop, rule, req,
pending, transfer, error, seeAll);
} else {
TransferUtils.stopSelectedTransfers(dbSession, 0, map,
authentHttp, head, startid, stopid, tstart, tstop, rule, req,
pending, transfer, error, seeAll);
}
} else {
DbPreparedStatement preparedStatement = null;
try {
preparedStatement =
DbTaskRunner.getFilterPrepareStatement(dbSession, 0, false,
startid, stopid, tstart, tstop, rule, req,
pending, transfer, error, done, all, seeAll);
preparedStatement.executeQuery();
//int i = 0;
while (preparedStatement.getNext()) {
try {
//i++;
DbTaskRunner taskRunner = DbTaskRunner
.getFromStatement(preparedStatement);
LocalChannelReference lcr =
Configuration.configuration.getLocalTransaction().
getFromRequest(taskRunner.getKey());
R66Result finalResult = TransferUtils.restartTransfer(taskRunner,
lcr);
ErrorCode result = finalResult.getCode();
ErrorCode last = taskRunner.getErrorInfo();
taskRunner.setErrorExecutionStatus(result);
map.put(taskRunner.getKey(), taskRunner.getJsonAsString());
taskRunner.setErrorExecutionStatus(last);
} catch (WaarpDatabaseException e) {
// try to continue if possible
logger.warn("An error occurs while accessing a Runner: {}",
e.getMessage());
continue;
}
}
preparedStatement.realClose();
} catch (WaarpDatabaseException e) {
if (preparedStatement != null) {
preparedStatement.realClose();
}
logger.warn("OpenR66 Web Error {}", e.getMessage());
errorText += Messages.getString("ErrorCode.17")+": "+e.getMessage()+"<BR/>";
}
}
StringBuilder builder = new StringBuilder("[");
if (! map.isEmpty()) {
for (String string : map.values()) {
builder.append(string).append(",");
}
map.clear();
builder.setLength(builder.length()-1);
}
builder.append("]");
head = head.replace(XXXDATAJSONXXX, builder.toString());
} else if ("Cancel".equalsIgnoreCase(parm) || "CancelClean".equalsIgnoreCase(parm)
|| "Stop".equalsIgnoreCase(parm)) {
// Cancel or Stop
boolean stop = "Stop".equalsIgnoreCase(parm);
String specid = getValue("specid");
String reqd = getValue("reqd");
String reqr = getValue("reqr");
LocalChannelReference lcr =
Configuration.configuration.getLocalTransaction().
getFromRequest(reqd + " " + reqr + " " + specid);
// stop the current transfer
ErrorCode result;
long lspecid;
try {
lspecid = Long.parseLong(specid);
} catch (NumberFormatException e) {
errorText += "<br><b>" + parm + Messages.getString("HttpSslHandler.3"); //$NON-NLS-2$
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
DbTaskRunner taskRunner = null;
try {
taskRunner = new DbTaskRunner(dbSession, authentHttp, null,
lspecid, reqr, reqd);
} catch (WaarpDatabaseException e) {
}
if (taskRunner == null) {
errorText += "<br><b>" + parm + Messages.getString("HttpSslHandler.3"); //$NON-NLS-2$
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
ErrorCode code = (stop) ?
ErrorCode.StoppedTransfer : ErrorCode.CanceledTransfer;
if (lcr != null) {
int rank = taskRunner.getRank();
lcr.sessionNewState(R66FiniteDualStates.ERROR);
ErrorPacket error = new ErrorPacket("Transfer " + parm + " " + rank,
code.getCode(), ErrorPacket.FORWARDCLOSECODE);
try {
// XXX ChannelUtils.writeAbstractLocalPacket(lcr, error);
// inform local instead of remote
ChannelUtils.writeAbstractLocalPacketToLocal(lcr, error);
} catch (Exception e) {
}
result = ErrorCode.CompleteOk;
} else {
// Transfer is not running
// But is the database saying the contrary
result = ErrorCode.TransferOk;
if (taskRunner != null) {
if (taskRunner.stopOrCancelRunner(code)) {
result = ErrorCode.CompleteOk;
}
}
}
if (taskRunner != null) {
if ("CancelClean".equalsIgnoreCase(parm)) {
TransferUtils.cleanOneTransfer(taskRunner, null, authentHttp, null);
}
String tstart = taskRunner.getStart().toString();
tstart = tstart.substring(0, tstart.length());
String tstop = taskRunner.getStop().toString();
tstop = tstop.substring(0, tstop.length());
head = resetOptionTransfer(head, (taskRunner.getSpecialId() - 1) + "",
(taskRunner.getSpecialId() + 1) + "", tstart, tstop,
taskRunner.getRuleId(), taskRunner.getRequested(),
false, false, false, false, true);
}
String json = taskRunner.getJsonAsString();
head = head.replace(XXXDATAJSONXXX, "["+json+"]");
errorText += "<br><b>" + (result == ErrorCode.CompleteOk ? parm + Messages.getString("HttpSslHandler.5") : //$NON-NLS-2$
parm + Messages.getString("HttpSslHandler.4")) + "</b>"; //$NON-NLS-1$
} else if ("Restart".equalsIgnoreCase(parm)) {
// Restart
String specid = getValue("specid");
String reqd = getValue("reqd");
String reqr = getValue("reqr");
long lspecid;
if (specid == null || reqd == null || reqr == null) {
errorText += "<br><b>" + parm + Messages.getString("HttpSslHandler.3"); //$NON-NLS-2$
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
try {
lspecid = Long.parseLong(specid);
} catch (NumberFormatException e) {
errorText += "<br><b>" + parm + Messages.getString("HttpSslHandler.3"); //$NON-NLS-2$
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
DbTaskRunner taskRunner;
String comment = "";
try {
taskRunner = new DbTaskRunner(dbSession, authentHttp, null,
lspecid, reqr, reqd);
LocalChannelReference lcr =
Configuration.configuration.getLocalTransaction().
getFromRequest(taskRunner.getKey());
R66Result finalResult = TransferUtils.restartTransfer(taskRunner, lcr);
comment = (String) finalResult.getOther();
String tstart = taskRunner.getStart().toString();
tstart = tstart.substring(0, tstart.length());
String tstop = taskRunner.getStop().toString();
tstop = tstop.substring(0, tstop.length());
head = resetOptionTransfer(head, (taskRunner.getSpecialId() - 1) + "",
(taskRunner.getSpecialId() + 1) + "", tstart, tstop,
taskRunner.getRuleId(), taskRunner.getRequested(),
false, false, false, false, true);
String json = taskRunner.getJsonAsString();
head = head.replace(XXXDATAJSONXXX, "["+json+"]");
} catch (WaarpDatabaseException e) {
errorText += Messages.getString("ErrorCode.17")+": "+e.getMessage()+"<BR/>";
}
errorText += "<br><b>" + comment + "</b>";
} else {
head = resetOptionTransfer(head, "", "", "", "", "", "",
false, false, false, false, true);
head = setDbTaskRunnerJsonData(head, errorText, "", "", null, null, "", "", false, false, false, false, true);
}
} else {
head = resetOptionTransfer(head, "", "", "", "", "", "",
false, false, false, false, true);
head = setDbTaskRunnerJsonData(head, errorText, "", "", null, null, "", "", false, false, false, false, true);
}
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
private String Export() {
getParams();
if (params == null) {
String body = REQUEST.Export.read(this);
body = resetOptionTransfer(body, "", "", "", "", "", "",
false, false, false, true, false);
return body.replace(XXXRESULTXXX, "");
}
String body = REQUEST.Export.read(this);
String start = getValue("start");
String stop = getValue("stop");
String rule = getTrimValue("rule");
String req = getTrimValue("req");
boolean pending, transfer, error, done, all;
pending = params.containsKey("pending");
transfer = params.containsKey("transfer");
error = params.containsKey("error");
done = params.containsKey("done");
all = params.containsKey("all");
boolean toPurge = params.containsKey("purge");
if (toPurge) {
transfer = false;
}
if (pending && transfer && error && done) {
all = true;
} else if (!(pending || transfer || error || done)) {
all = true;
}
Timestamp tstart = WaarpStringUtils.fixDate(start);
if (tstart != null) {
start = tstart.toString();
}
Timestamp tstop = WaarpStringUtils.fixDate(stop, tstart);
if (tstop != null) {
stop = tstop.toString();
}
body = resetOptionTransfer(body, "", "", start, stop,
rule == null ? "" : rule, req == null ? "" : req,
pending, transfer, error, done, all);
boolean isexported = true;
// clean a bit the database before exporting
try {
DbTaskRunner.changeFinishedToDone(dbSession);
} catch (WaarpDatabaseNoConnectionException e2) {
// should not be
}
// create export of log and optionally purge them from database
DbPreparedStatement getValid = null;
NbAndSpecialId nbAndSpecialId = null;
String basename = Configuration.configuration.getArchivePath() + R66Dir.SEPARATOR +
Configuration.configuration.getHOST_ID() + "_" + System.currentTimeMillis() +
"_runners.xml";
String filename = Configuration.configuration.getBaseDirectory() +
basename;
String errorMsg = "";
String seeAll = checkAuthorizedToSeeAll();
try {
getValid =
DbTaskRunner.getFilterPrepareStatement(dbSession, 0,// 0 means no limit
true, null, null, tstart, tstop, rule, req,
pending, transfer, error, done, all, seeAll);
nbAndSpecialId = DbTaskRunner.writeXMLWriter(getValid, filename);
} catch (WaarpDatabaseNoConnectionException e1) {
isexported = false;
toPurge = false;
logger.warn("Export error: {}", e1.getMessage());
errorMsg = e1.getMessage();
} catch (WaarpDatabaseSqlException e1) {
isexported = false;
toPurge = false;
logger.warn("Export error: {}", e1.getMessage());
errorMsg = e1.getMessage();
} catch (OpenR66ProtocolBusinessException e) {
isexported = false;
toPurge = false;
logger.warn("Export error: {}", e.getMessage());
errorMsg = e.getMessage();
} finally {
if (getValid != null) {
getValid.realClose();
}
}
int purge = 0;
if (isexported && nbAndSpecialId != null) {
if (nbAndSpecialId.nb <= 0) {
return body.replace(XXXRESULTXXX,
Messages.getString("HttpSslHandler.7")); //$NON-NLS-1$
}
// in case of purge
if (isexported && toPurge) {
// purge with same filter all runners where globallasttep
// is ALLDONE or ERROR
// but getting the higher Special first
String stopId = Long.toString(nbAndSpecialId.higherSpecialId);
try {
purge =
DbTaskRunner.purgeLogPrepareStatement(dbSession,
null, stopId, tstart, tstop, rule, req,
pending, transfer, error, done, all);
} catch (WaarpDatabaseNoConnectionException e) {
} catch (WaarpDatabaseSqlException e) {
logger.warn("Purge error: {}", e.getMessage());
}
}
}
return body
.replace(
XXXRESULTXXX,
"Export "
+ (isexported ? "<B>" + Messages.getString("HttpSslHandler.8") + //$NON-NLS-1$
"<A href='"+basename+"' target='_blank'>"+basename+"</A>"
+ Messages.getString("HttpSslHandler.9") + nbAndSpecialId.nb + Messages.getString("HttpSslHandler.10") + purge //$NON-NLS-1$ //$NON-NLS-2$
+ Messages.getString("HttpSslHandler.11") + "</B>" : //$NON-NLS-1$
"<B>" + Messages.getString("HttpSslHandler.12"))) + "</B>" + errorMsg; //$NON-NLS-1$
}
private String resetOptionHosts(String header,
String host, String addr, boolean ssl, boolean active) {
StringBuilder builder = new StringBuilder(header);
WaarpStringUtils.replace(builder, "XXXFHOSTXXX", host);
WaarpStringUtils.replace(builder, "XXXFADDRXXX", addr);
WaarpStringUtils.replace(builder, "XXXFSSLXXX", ssl ? "checked" : "");
WaarpStringUtils.replace(builder, "XXXFACTIVXXX", active ? "checked" : "");
return builder.toString();
}
private String setDbHostAuthJsonData(String head, String errorText, String host, String addr, boolean ssl, boolean isactive) {
DbPreparedStatement preparedStatement = null;
try {
preparedStatement =
DbHostAuth.getFilterPrepareStament(dbSession,
host, addr, ssl, isactive);
String json = DbHostAuth.getJson(preparedStatement, getLIMITROW());
return head.replace(XXXDATAJSONXXX, json);
} catch (WaarpDatabaseException e) {
if (preparedStatement != null) {
preparedStatement.realClose();
}
logger.warn("OpenR66 Web Error {}", e.getMessage());
errorText += Messages.getString("ErrorCode.17")+": "+e.getMessage()+"<BR/>";
} catch (OpenR66ProtocolBusinessException e) {
if (preparedStatement != null) {
preparedStatement.realClose();
}
logger.warn("OpenR66 Web Error {}", e.getMessage());
errorText += Messages.getString("ErrorCode.17")+": "+e.getMessage()+"<BR/>";
}
return head.replace(XXXRESULTXXX, errorText);
}
private String Hosts() {
getParams();
String head = REQUEST.Hosts.read(this);
String errorText = "";
if (params == null) {
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, null, null, false, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
List<String> parms = params.get("ACTION");
if (parms != null) {
String parm = parms.get(0);
if ("Create".equalsIgnoreCase(parm)) {
String host = getTrimValue("host");
String addr = getTrimValue("address");
String port = getTrimValue("port");
String key = getTrimValue("hostkey");
boolean ssl, admin, isclient, isactive, isproxified;
ssl = params.containsKey("ssl");
admin = params.containsKey("admin");
isclient = params.containsKey("isclient");
isactive = params.containsKey("isactive");
isproxified = params.containsKey("isproxified");
if (port == null) {
port = "-1";
}
if (port.equals("-1")) {
isclient = true;
}
if (isclient && addr == null) {
addr = "0.0.0.0";
}
if (host == null || addr == null || key == null) {
errorText = Messages.getString("HttpSslHandler.13"); //$NON-NLS-1$
head = resetOptionHosts(head, "", "", ssl, isactive);
head = setDbHostAuthJsonData(head, errorText, null, null, ssl, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
int iport = -1;
try {
iport = Integer.parseInt(port);
} catch (NumberFormatException e1) {
errorText = Messages.getString("HttpSslHandler.14") + e1.getMessage() + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionHosts(head, "", "", ssl, isactive);
head = setDbHostAuthJsonData(head, errorText, null, null, ssl, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
DbHostAuth dbhost = new DbHostAuth(dbSession, host, addr, iport,
ssl, key.getBytes(WaarpStringUtils.UTF8), admin, isclient);
dbhost.setActive(isactive);
dbhost.setProxified(isproxified);
try {
dbhost.insert();
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.14") + e.getMessage() //$NON-NLS-1$
+ "</b></center></p>";
head = resetOptionHosts(head, "", "", ssl, isactive);
head = setDbHostAuthJsonData(head, errorText, null, null, ssl, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
head = resetOptionHosts(head, host, addr, ssl, isactive);
String json = dbhost.getJsonAsString();
head = head.replace(XXXDATAJSONXXX, "["+json+"]");
} else if ("Filter".equalsIgnoreCase(parm)) {
String host = getTrimValue("host");
String addr = getTrimValue("address");
boolean ssl = params.containsKey("ssl");
boolean isactive = params.containsKey("active");
head = resetOptionHosts(head, host == null ? "" : host,
addr == null ? "" : addr, ssl, isactive);
head = setDbHostAuthJsonData(head, errorText, host, addr, ssl, isactive);
} else if ("Update".equalsIgnoreCase(parm)) {
String host = getTrimValue("host");
String addr = getTrimValue("address");
String port = getTrimValue("port");
String key = getTrimValue("hostkey");
boolean ssl, admin, isclient, isactive, isproxified;
ssl = params.containsKey("ssl");
admin = params.containsKey("admin");
isclient = params.containsKey("isclient");
isactive = params.containsKey("isactive");
isproxified = params.containsKey("isproxified");
if (host == null || addr == null || port == null || key == null) {
errorText = Messages.getString("HttpSslHandler.15"); //$NON-NLS-1$
head = resetOptionHosts(head, "", "", ssl, isactive);
head = setDbHostAuthJsonData(head, errorText, host, addr, ssl, isactive);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
int iport;
try {
iport = Integer.parseInt(port);
} catch (NumberFormatException e1) {
errorText = Messages.getString("HttpSslHandler.16") + e1.getMessage() + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionHosts(head, "", "", ssl, isactive);
head = setDbHostAuthJsonData(head, errorText, host, addr, ssl, isactive);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
DbHostAuth dbhost = new DbHostAuth(dbSession, host, addr, iport,
ssl, key.getBytes(WaarpStringUtils.UTF8), admin, isclient);
dbhost.setActive(isactive);
dbhost.setProxified(isproxified);
try {
if (dbhost.exist()) {
dbhost.update();
} else {
dbhost.insert();
}
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.16") + e.getMessage() + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionHosts(head, "", "", ssl, isactive);
head = setDbHostAuthJsonData(head, errorText, host, addr, ssl, isactive);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
head = resetOptionHosts(head, host, addr, ssl, isactive);
String json = dbhost.getJsonAsString();
head = head.replace(XXXDATAJSONXXX, "["+json+"]");
} else if ("TestConn".equalsIgnoreCase(parm)) {
String host = getTrimValue("host");
if (host == null || host.isEmpty()) {
errorText = Messages.getString("HttpSslHandler.17")
+ "</b></center></p>";
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, host, null, false, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
DbHostAuth dbhost;
try {
dbhost = new DbHostAuth(dbSession, host);
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.17") + e.getMessage() + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, host, null, false, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
R66Future result = new R66Future(true);
TestPacket packet = new TestPacket("MSG", "CheckConnection", 100);
Message transaction = new Message(
Configuration.configuration.getInternalRunner().getNetworkTransaction(),
result, dbhost, packet);
transaction.run();
result.awaitUninterruptibly(Configuration.configuration.getTIMEOUTCON() / 2);
head = resetOptionHosts(head, "", "", dbhost.isSsl(), dbhost.isActive());
String json = dbhost.getJsonAsString();
head = head.replace(XXXDATAJSONXXX, "["+json+"]");
if (result.isSuccess()) {
errorText = Messages.getString("HttpSslHandler.18"); //$NON-NLS-1$
} else {
errorText = Messages.getString("HttpSslHandler.19") //$NON-NLS-1$
+
result.getResult().getCode().mesg + "</b></center></p>";
}
} else if ("CloseConn".equalsIgnoreCase(parm)) {
String host = getTrimValue("host");
if (host == null || host.isEmpty()) {
errorText = Messages.getString("HttpSslHandler.17")
+ "</b></center></p>";
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, host, null, false, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
DbHostAuth dbhost;
try {
dbhost = new DbHostAuth(dbSession, host);
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.17") + e.getMessage() + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, host, null, false, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
boolean resultShutDown = NetworkTransaction.shuttingdownNetworkChannelsPerHostID(dbhost.getHostid());
head = resetOptionHosts(head, "", "", dbhost.isSsl(), dbhost.isActive());
String json = dbhost.getJsonAsString();
head = head.replace(XXXDATAJSONXXX, "["+json+"]");
if (resultShutDown) {
errorText = Messages.getString("HttpSslHandler.21"); //$NON-NLS-1$
} else {
errorText = Messages.getString("HttpSslHandler.22"); //$NON-NLS-1$
}
} else if ("Delete".equalsIgnoreCase(parm)) {
String host = getTrimValue("host");
if (host == null || host.isEmpty()) {
errorText = Messages.getString("HttpSslHandler.23")
+ "</b></center></p>";
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, host, null, false, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
DbHostAuth dbhost;
try {
dbhost = new DbHostAuth(dbSession, host);
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.24") + e.getMessage() + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, host, null, false, true);
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
try {
dbhost.delete();
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.24") + e.getMessage() + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, host, null, dbhost.isSsl(), dbhost.isActive());
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
String json = dbhost.getJsonAsString();
head = head.replace(XXXDATAJSONXXX, "["+json+"]");
errorText = Messages.getString("HttpSslHandler.25") + host + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionHosts(head, "", "", false, dbhost.isActive());
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
} else {
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, null, null, false, true);
}
} else {
head = resetOptionHosts(head, "", "", false, true);
head = setDbHostAuthJsonData(head, errorText, null, null, false, true);
}
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
private void createExport(HashMap<String, String> rules, String rule, int mode, int limit) {
DbPreparedStatement preparedStatement = null;
try {
preparedStatement =
DbRule.getFilterPrepareStament(dbSession,
rule, mode);
preparedStatement.executeQuery();
int i = 0;
while (preparedStatement.getNext()) {
DbRule dbrule = DbRule.getFromStatement(preparedStatement);
rules.put(dbrule.getIdRule(), dbrule.getJsonAsString());
i++;
if (i > limit) {
break;
}
}
preparedStatement.realClose();
} catch (WaarpDatabaseException e) {
if (preparedStatement != null) {
preparedStatement.realClose();
}
logger.warn("OpenR66 Web Error {}", e.getMessage());
}
}
private String createExport(String head, String errorText, String rule, int limit) {
DbPreparedStatement preparedStatement = null;
try {
preparedStatement =
DbRule.getFilterPrepareStament(dbSession,
rule, -1);
String json = DbRule.getJson(preparedStatement, getLIMITROW());
preparedStatement.realClose();
return head.replace(XXXDATAJSONXXX, json);
} catch (WaarpDatabaseException e) {
if (preparedStatement != null) {
preparedStatement.realClose();
}
logger.warn("OpenR66 Web Error {}", e.getMessage());
errorText += Messages.getString("ErrorCode.17")+": "+e.getMessage()+"<BR/>";
} catch (OpenR66ProtocolBusinessException e) {
if (preparedStatement != null) {
preparedStatement.realClose();
}
logger.warn("OpenR66 Web Error {}", e.getMessage());
errorText += Messages.getString("ErrorCode.17")+": "+e.getMessage()+"<BR/>";
}
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
private String resetOptionRules(String header,
String rule, RequestPacket.TRANSFERMODE mode, int gmode) {
StringBuilder builder = new StringBuilder(header);
WaarpStringUtils.replace(builder, "XXXRULEXXX", rule);
if (mode != null) {
switch (mode) {
case RECVMODE:
WaarpStringUtils.replace(builder, "XXXRECVXXX", "checked");
break;
case SENDMODE:
WaarpStringUtils.replace(builder, "XXXSENDXXX", "checked");
break;
case RECVMD5MODE:
WaarpStringUtils.replace(builder, "XXXRECVMXXX", "checked");
break;
case SENDMD5MODE:
WaarpStringUtils.replace(builder, "XXXSENDMXXX", "checked");
break;
case RECVTHROUGHMODE:
WaarpStringUtils.replace(builder, "XXXRECVTXXX", "checked");
break;
case SENDTHROUGHMODE:
WaarpStringUtils.replace(builder, "XXXSENDTXXX", "checked");
break;
case RECVMD5THROUGHMODE:
WaarpStringUtils.replace(builder, "XXXRECVMTXXX", "checked");
break;
case SENDMD5THROUGHMODE:
WaarpStringUtils.replace(builder, "XXXSENDMTXXX", "checked");
break;
case UNKNOWNMODE:
break;
default:
break;
}
}
if (gmode == -1) {// All Recv
WaarpStringUtils.replace(builder, "XXXARECVXXX", "checked");
} else if (gmode == -2) {// All Send
WaarpStringUtils.replace(builder, "XXXASENDXXX", "checked");
} else if (gmode == -3) {// All
WaarpStringUtils.replace(builder, "XXXALLXXX", "checked");
}
return builder.toString();
}
private String Rules() {
getParams();
String head = REQUEST.Rules.read(this);
StringBuilder builderHead = new StringBuilder(head);
fillHostIds(builderHead);
head = builderHead.toString();
String errorText = "";
if (params == null) {
head = resetOptionRules(head, "", null, -3);
head = createExport(head, errorText, null, getLIMITROW());
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
List<String> parms = params.get("ACTION");
if (parms != null) {
String parm = parms.get(0);
if ("Create".equalsIgnoreCase(parm) || "Update".equalsIgnoreCase(parm)) {
String rule = getTrimValue("rule");
String hostids = getTrimValue("hostids");
String recvp = getTrimValue("recvp");
String sendp = getTrimValue("sendp");
String archp = getTrimValue("archp");
String workp = getTrimValue("workp");
String rpre = getTrimValue("rpre");
String rpost = getTrimValue("rpost");
String rerr = getTrimValue("rerr");
String spre = getTrimValue("spre");
String spost = getTrimValue("spost");
String serr = getTrimValue("serr");
String mode = getTrimValue("mode");
if (rule == null || mode == null) {
errorText = Messages.getString("HttpSslHandler.26") + parm + Messages.getString("HttpSslHandler.27"); //$NON-NLS-1$ //$NON-NLS-2$
head = resetOptionRules(head, "", null, -3);
head = createExport(head, errorText, null, getLIMITROW());
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
int gmode = 0;
TRANSFERMODE tmode = null;
if (mode.equals("send")) {
tmode = RequestPacket.TRANSFERMODE.SENDMODE;
gmode = -2;
} else if (mode.equals("recv")) {
tmode = RequestPacket.TRANSFERMODE.RECVMODE;
gmode = -1;
} else if (mode.equals("sendmd5")) {
tmode = RequestPacket.TRANSFERMODE.SENDMD5MODE;
gmode = -2;
} else if (mode.equals("recvmd5")) {
tmode = RequestPacket.TRANSFERMODE.RECVMD5MODE;
gmode = -1;
} else if (mode.equals("sendth")) {
tmode = RequestPacket.TRANSFERMODE.SENDTHROUGHMODE;
gmode = -2;
} else if (mode.equals("recvth")) {
tmode = RequestPacket.TRANSFERMODE.RECVTHROUGHMODE;
gmode = -1;
} else if (mode.equals("sendthmd5")) {
tmode = RequestPacket.TRANSFERMODE.SENDMD5THROUGHMODE;
gmode = -2;
} else if (mode.equals("recvthmd5")) {
tmode = RequestPacket.TRANSFERMODE.RECVMD5THROUGHMODE;
gmode = -1;
}
head = resetOptionRules(head, rule, tmode, gmode);
logger.debug("Recv UpdOrInsert: " + rule + ":" + hostids + ":" + tmode.ordinal() + ":" +
recvp + ":" + sendp + ":" + archp + ":" + workp + ":" + rpre + ":" + rpost + ":" + rerr + ":"
+ spre + ":" + spost + ":" + serr);
DbRule dbrule = new DbRule(dbSession, rule, hostids, tmode.ordinal(),
recvp, sendp, archp, workp, rpre, rpost, rerr, spre, spost, serr);
try {
if ("Create".equalsIgnoreCase(parm)) {
dbrule.insert();
} else {
if (dbrule.exist()) {
dbrule.update();
} else {
dbrule.insert();
}
}
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.28") + e.getMessage() //$NON-NLS-1$
+ "</b></center></p>";
head = resetOptionRules(head, "", null, -3);
head = createExport(head, errorText, null, getLIMITROW());
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
String json = dbrule.getJsonAsString();
head = head.replace(XXXDATAJSONXXX, "["+json+"]");
} else if ("Filter".equalsIgnoreCase(parm)) {
String rule = getTrimValue("rule");
String mode = getTrimValue("mode");
TRANSFERMODE tmode;
int gmode = 0;
if (mode != null) {
if (mode.equals("all")) {
gmode = -3;
} else if (mode.equals("send")) {
gmode = -2;
} else if (mode.equals("recv")) {
gmode = -1;
}
}
head = resetOptionRules(head, rule == null ? "" : rule,
null, gmode);
HashMap<String, String> rules = new HashMap<String, String>();
boolean specific = false;
if (params.containsKey("send")) {
tmode = RequestPacket.TRANSFERMODE.SENDMODE;
head = resetOptionRules(head, rule == null ? "" : rule,
tmode, gmode);
specific = true;
createExport(rules, rule,
RequestPacket.TRANSFERMODE.SENDMODE.ordinal(), getLIMITROW() / 2);
}
if (params.containsKey("recv")) {
tmode = RequestPacket.TRANSFERMODE.RECVMODE;
head = resetOptionRules(head, rule == null ? "" : rule,
tmode, gmode);
specific = true;
createExport(rules, rule,
RequestPacket.TRANSFERMODE.RECVMODE.ordinal(), getLIMITROW() / 2);
}
if (params.containsKey("sendmd5")) {
tmode = RequestPacket.TRANSFERMODE.SENDMD5MODE;
head = resetOptionRules(head, rule == null ? "" : rule,
tmode, gmode);
specific = true;
createExport(rules, rule,
RequestPacket.TRANSFERMODE.SENDMD5MODE.ordinal(), getLIMITROW() / 2);
}
if (params.containsKey("recvmd5")) {
tmode = RequestPacket.TRANSFERMODE.RECVMD5MODE;
head = resetOptionRules(head, rule == null ? "" : rule,
tmode, gmode);
specific = true;
createExport(rules, rule,
RequestPacket.TRANSFERMODE.RECVMD5MODE.ordinal(), getLIMITROW() / 2);
}
if (params.containsKey("sendth")) {
tmode = RequestPacket.TRANSFERMODE.SENDTHROUGHMODE;
head = resetOptionRules(head, rule == null ? "" : rule,
tmode, gmode);
specific = true;
createExport(rules, rule,
RequestPacket.TRANSFERMODE.SENDTHROUGHMODE.ordinal(), getLIMITROW() / 2);
}
if (params.containsKey("recvth")) {
tmode = RequestPacket.TRANSFERMODE.RECVTHROUGHMODE;
head = resetOptionRules(head, rule == null ? "" : rule,
tmode, gmode);
specific = true;
createExport(rules, rule,
RequestPacket.TRANSFERMODE.RECVTHROUGHMODE.ordinal(), getLIMITROW() / 2);
}
if (params.containsKey("sendthmd5")) {
tmode = RequestPacket.TRANSFERMODE.SENDMD5THROUGHMODE;
head = resetOptionRules(head, rule == null ? "" : rule,
tmode, gmode);
specific = true;
createExport(rules, rule,
RequestPacket.TRANSFERMODE.SENDMD5THROUGHMODE.ordinal(), getLIMITROW() / 2);
}
if (params.containsKey("recvthmd5")) {
tmode = RequestPacket.TRANSFERMODE.RECVMD5THROUGHMODE;
head = resetOptionRules(head, rule == null ? "" : rule,
tmode, gmode);
specific = true;
createExport(rules, rule,
RequestPacket.TRANSFERMODE.RECVMD5THROUGHMODE.ordinal(), getLIMITROW() / 2);
}
if (!specific) {
if (gmode == -1) {
// recv
createExport(rules, rule,
RequestPacket.TRANSFERMODE.RECVMODE.ordinal(), getLIMITROW() / 2);
createExport(rules, rule,
RequestPacket.TRANSFERMODE.RECVMD5MODE.ordinal(), getLIMITROW() / 2);
createExport(rules, rule,
RequestPacket.TRANSFERMODE.RECVTHROUGHMODE.ordinal(), getLIMITROW() / 2);
createExport(rules, rule,
RequestPacket.TRANSFERMODE.RECVMD5THROUGHMODE.ordinal(),
getLIMITROW() / 2);
} else if (gmode == -2) {
// send
createExport(rules, rule,
RequestPacket.TRANSFERMODE.SENDMODE.ordinal(), getLIMITROW() / 2);
createExport(rules, rule,
RequestPacket.TRANSFERMODE.SENDMD5MODE.ordinal(), getLIMITROW() / 2);
createExport(rules, rule,
RequestPacket.TRANSFERMODE.SENDTHROUGHMODE.ordinal(), getLIMITROW() / 2);
createExport(rules, rule,
RequestPacket.TRANSFERMODE.SENDMD5THROUGHMODE.ordinal(),
getLIMITROW() / 2);
} else {
// all
createExport(rules, rule, -1, getLIMITROW());
}
}
StringBuilder builder = new StringBuilder("[");
if (! rules.isEmpty()) {
for (String string : rules.values()) {
builder.append(string).append(",");
}
rules.clear();
builder.setLength(builder.length()-1);
}
builder.append("]");
head = head.replace(XXXDATAJSONXXX, builder.toString());
} else if ("Delete".equalsIgnoreCase(parm)) {
String rule = getTrimValue("rule");
if (rule == null || rule.isEmpty()) {
errorText = Messages.getString("HttpSslHandler.29"); //$NON-NLS-1$
head = resetOptionRules(head, "", null, -3);
head = createExport(head, errorText, null, getLIMITROW());
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
DbRule dbrule;
try {
dbrule = new DbRule(dbSession, rule);
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.30") + e.getMessage() //$NON-NLS-1$
+ "</b></center></p>";
head = resetOptionRules(head, "", null, -3);
head = createExport(head, errorText, null, getLIMITROW());
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
try {
dbrule.delete();
} catch (WaarpDatabaseException e) {
errorText = Messages.getString("HttpSslHandler.30") + e.getMessage() //$NON-NLS-1$
+ "</b></center></p>";
head = resetOptionRules(head, "", null, -3);
head = createExport(head, errorText, null, getLIMITROW());
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
errorText += Messages.getString("HttpSslHandler.31") + rule + "</b></center></p>"; //$NON-NLS-1$
head = resetOptionRules(head, "", null, -3);
head = head.replace(XXXDATAJSONXXX, "["+dbrule.getJsonAsString()+"]");
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
} else {
head = resetOptionRules(head, "", null, -3);
head = createExport(head, errorText, null, getLIMITROW());
}
} else {
head = resetOptionRules(head, "", null, -3);
head = createExport(head, errorText, null, getLIMITROW());
}
return head.replace(XXXRESULTXXX, errorText).replace(XXXDATAJSONXXX, "[]");
}
private String Spooled(boolean detailed) {
// XXXSPOOLEDXXX
if (request.method() == HttpMethod.POST) {
getParams();
}
String spooled = REQUEST.Spooled.read(this);
String uri = null;
if (detailed) {
uri = "SpooledDetailed.html";
} else {
uri = "Spooled.html";
}
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.uri());
params = queryStringDecoder.parameters();
String name = null;
if (params.containsKey("name")) {
name = getTrimValue("name");
}
int istatus = 0;
if (params.containsKey("status")) {
String status = getTrimValue("status");
try {
istatus = Integer.parseInt(status);
} catch (NumberFormatException e1) {
istatus = 0;
}
}
if (spooled.contains("XXXSPOOLEDXXX")) {
if (name != null && !name.isEmpty()) {
// name is specified
uri = request.uri();
if (istatus != 0) {
uri += "&status=" + istatus;
}
StringBuilder builder = SpooledInformTask.buildSpooledUniqueTable(uri, name);
return spooled.replace("XXXSPOOLEDXXX", builder.toString());
} else {
if (istatus != 0) {
uri += "&status=" + istatus;
}
StringBuilder builder = SpooledInformTask.buildSpooledTable(detailed, istatus, uri);
return spooled.replace("XXXSPOOLEDXXX", builder.toString());
}
}
if (name != null && !name.isEmpty()) {
// name is specified
uri = request.uri();
if (istatus != 0) {
uri += "&status=" + istatus;
}
String builder = SpooledInformTask.buildSpooledUniqueJson(uri, name);
return spooled.replace(XXXDATAJSONXXX, builder);
} else {
if (istatus != 0) {
uri += "&status=" + istatus;
}
String builder = SpooledInformTask.buildSpooledJson(detailed, istatus, uri);
return spooled.replace(XXXDATAJSONXXX, builder);
}
}
/**
* Applied current lang to system page
*
* @param builder
*/
private void langHandle(StringBuilder builder) {
// i18n: add here any new languages
WaarpStringUtils.replace(builder, REPLACEMENT.XXXCURLANGENXXX.name(), lang.equalsIgnoreCase("en") ? "checked"
: "");
WaarpStringUtils.replace(builder, REPLACEMENT.XXXCURLANGFRXXX.name(), lang.equalsIgnoreCase("fr") ? "checked"
: "");
WaarpStringUtils.replace(builder, REPLACEMENT.XXXCURSYSLANGENXXX.name(),
Messages.getSlocale().equalsIgnoreCase("en") ? "checked" : "");
WaarpStringUtils.replace(builder, REPLACEMENT.XXXCURSYSLANGFRXXX.name(),
Messages.getSlocale().equalsIgnoreCase("fr") ? "checked" : "");
}
private String SystemLimitedSource() {
String system = REQUEST.SystemLimited.read(this);
if (system == null || system.isEmpty()) {
return REQUEST.System.read(this);
}
return system;
}
private String SystemLimited() {
getParams();
DbHostConfiguration config = null;
try {
config = new DbHostConfiguration(dbSession, Configuration.configuration.getHOST_ID());
} catch (WaarpDatabaseException e2) {
config = new DbHostConfiguration(dbSession, Configuration.configuration.getHOST_ID(), "", "", "", "");
try {
config.insert();
} catch (WaarpDatabaseException e) {
}
}
if (params == null) {
String system = SystemLimitedSource();
StringBuilder builder = new StringBuilder(system);
replaceStringSystem(config, builder);
langHandle(builder);
return builder.toString();
}
String extraInformation = null;
if (params.containsKey("ACTION")) {
List<String> action = params.get("ACTION");
for (String act : action) {
if (act.equalsIgnoreCase("Language")) {
lang = getTrimValue("change");
extraInformation = Messages.getString("HttpSslHandler.LangIs") + "Web: " + lang + " OpenR66: " + Messages.getSlocale(); //$NON-NLS-1$
} else if (act.equalsIgnoreCase("Disconnect")) {
String logon = Logon();
logon = logon.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
Messages.getString("HttpSslHandler.DisActive"));
newSession = true;
clearSession();
forceClose = true;
return logon;
}
}
}
String system = SystemLimitedSource();
StringBuilder builder = new StringBuilder(system);
replaceStringSystem(config, builder);
langHandle(builder);
if (extraInformation != null) {
builder.append(extraInformation);
}
return builder.toString();
}
/**
* @param config
* @param builder
*/
private void replaceStringSystem(DbHostConfiguration config, StringBuilder builder) {
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXBUSINESSXXX.toString(),
config.getBusiness());
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXROLESXXX.toString(),
config.getRoles());
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXALIASESXXX.toString(),
config.getAliases());
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXOTHERXXX.toString(),
config.getOthers());
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXSESSIONLIMITWXXX.toString(),
Long.toString(Configuration.configuration.getServerChannelWriteLimit()));
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXSESSIONLIMITRXXX.toString(),
Long.toString(Configuration.configuration.getServerChannelReadLimit()));
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXDELATRAFFICXXX.toString(),
Long.toString(Configuration.configuration.getDelayLimit()));
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXDELAYCOMMDXXX.toString(),
Long.toString(Configuration.configuration.getDelayCommander()));
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXDELAYRETRYXXX.toString(),
Long.toString(Configuration.configuration.getDelayRetry()));
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXCHANNELLIMITWXXX.toString(),
Long.toString(Configuration.configuration.getServerGlobalWriteLimit()));
WaarpStringUtils.replace(builder, REPLACEMENT.XXXXCHANNELLIMITRXXX.toString(),
Long.toString(Configuration.configuration.getServerGlobalReadLimit()));
WaarpStringUtils.replace(builder, "XXXBLOCKXXX", Configuration.configuration.isShutdown() ? "checked" : "");
switch (WaarpLoggerFactory.getLogLevel()) {
case DEBUG:
WaarpStringUtils.replace(builder, "XXXLEVEL1XXX", "checked");
WaarpStringUtils.replace(builder, "XXXLEVEL2XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL3XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL4XXX", "");
break;
case INFO:
WaarpStringUtils.replace(builder, "XXXLEVEL1XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL2XXX", "checked");
WaarpStringUtils.replace(builder, "XXXLEVEL3XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL4XXX", "");
break;
case WARN:
WaarpStringUtils.replace(builder, "XXXLEVEL1XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL2XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL3XXX", "checked");
WaarpStringUtils.replace(builder, "XXXLEVEL4XXX", "");
break;
case ERROR:
WaarpStringUtils.replace(builder, "XXXLEVEL1XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL2XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL3XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL4XXX", "checked");
break;
default:
WaarpStringUtils.replace(builder, "XXXLEVEL1XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL2XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL3XXX", "");
WaarpStringUtils.replace(builder, "XXXLEVEL4XXX", "");
break;
}
}
private String Logout() {
String logon = Logon();
logon = logon.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
Messages.getString("HttpSslHandler.Disconnected"));
newSession = true;
clearSession();
forceClose = true;
return logon;
}
private void fillHostIds(StringBuilder builder) {
ArrayList<String> hostsList = new ArrayList<String>();
try {
DbHostAuth [] hosts = DbHostAuth.getAllHosts(dbSession);
for (DbHostAuth dbHostAuth : hosts) {
hostsList.add(dbHostAuth.getHostid());
}
} catch (WaarpDatabaseNoConnectionException e1) {
} catch (WaarpDatabaseSqlException e1) {
}
StringBuilder hostsBuilder = new StringBuilder();
for (String string : hostsList) {
if (hostsBuilder.length() != 0) {
hostsBuilder.append(',');
}
hostsBuilder.append("'").append(string).append("'");
}
String hosts = "["+hostsBuilder.toString()+"]";
WaarpStringUtils.replace(builder, XXXHOSTSIDSXXX, hosts);
}
private String System() {
getParams();
DbHostConfiguration config = null;
try {
config = new DbHostConfiguration(dbSession, Configuration.configuration.getHOST_ID());
} catch (WaarpDatabaseException e2) {
config = new DbHostConfiguration(dbSession, Configuration.configuration.getHOST_ID(), "", "", "", "");
try {
config.insert();
} catch (WaarpDatabaseException e) {
}
}
if (params == null) {
String system = REQUEST.System.read(this);
StringBuilder builder = new StringBuilder(system);
replaceStringSystem(config, builder);
langHandle(builder);
fillHostIds(builder);
return builder.toString();
}
String extraInformation = null;
if (params.containsKey("ACTION")) {
List<String> action = params.get("ACTION");
for (String act : action) {
if (act.equalsIgnoreCase("Language")) {
lang = getTrimValue("change");
String sys = getTrimValue("changesys");
Messages.init(new Locale(sys));
extraInformation = Messages.getString("HttpSslHandler.LangIs") + "Web: " + lang + " OpenR66: " + Messages.getSlocale(); //$NON-NLS-1$
} else if (act.equalsIgnoreCase("Level")) {
String loglevel = getTrimValue("loglevel");
WaarpLogLevel level = WaarpLogLevel.WARN;
if (loglevel.equalsIgnoreCase("debug")) {
level = WaarpLogLevel.DEBUG;
} else if (loglevel.equalsIgnoreCase("info")) {
level = WaarpLogLevel.INFO;
} else if (loglevel.equalsIgnoreCase("warn")) {
level = WaarpLogLevel.WARN;
} else if (loglevel.equalsIgnoreCase("error")) {
level = WaarpLogLevel.ERROR;
}
WaarpLoggerFactory.setLogLevel(level);
extraInformation = Messages.getString("HttpSslHandler.LangIs") + level.name(); //$NON-NLS-1$
} else if (act.equalsIgnoreCase("ExportConfig")) {
String base = Configuration.configuration.getBaseDirectory() + R66Dir.SEPARATOR;
String directory = base + Configuration.configuration.getArchivePath();
extraInformation = Messages.getString("HttpSslHandler.ExportDir") + Configuration.configuration.getArchivePath() + "<br>"; //$NON-NLS-1$
String[] filenames = ServerActions.staticConfigExport(dbSession, directory, true, true, true, true,
true);
// hosts, rules, business, alias, roles
base = base.replace('\\', '/');
if (filenames[0] != null) {
filenames[0] = filenames[0].replace('\\', '/').replace(base, "");
extraInformation += "<A href='"+filenames[0]+"' target='_blank'>"+filenames[0]+"</A> "+
Messages.getString("HttpSslHandler.33"); //$NON-NLS-1$
}
if (filenames[1] != null) {
filenames[1] = filenames[1].replace('\\', '/').replace(base, "");
extraInformation += "<A href='"+filenames[1]+"' target='_blank'>"+filenames[1]+"</A> "+
Messages.getString("HttpSslHandler.32"); //$NON-NLS-1$
}
if (filenames[2] != null) {
filenames[2] = filenames[2].replace('\\', '/').replace(base, "");
extraInformation += "<A href='"+filenames[2]+"' target='_blank'>"+filenames[2]+"</A> "+
Messages.getString("HttpSslHandler.44"); //$NON-NLS-1$
}
if (filenames[3] != null) {
filenames[3] = filenames[3].replace('\\', '/').replace(base, "");
extraInformation += "<A href='"+filenames[3]+"' target='_blank'>"+filenames[3]+"</A> "+
Messages.getString("HttpSslHandler.45"); //$NON-NLS-1$
}
if (filenames[4] != null) {
filenames[4] = filenames[4].replace('\\', '/').replace(base, "");
extraInformation += "<A href='"+filenames[4]+"' target='_blank'>"+filenames[4]+"</A> "+
Messages.getString("HttpSslHandler.46"); //$NON-NLS-1$
}
} else if (act.equalsIgnoreCase("Disconnect")) {
return Logout();
} else if (act.equalsIgnoreCase("Block")) {
boolean block = params.containsKey("blocking");
if (block) {
extraInformation = Messages.getString("HttpSslHandler.34"); //$NON-NLS-1$
} else {
extraInformation = Messages.getString("HttpSslHandler.35"); //$NON-NLS-1$
}
Configuration.configuration.setShutdown(block);
} else if (act.equalsIgnoreCase("Shutdown")) {
String error;
if (Configuration.configuration.getShutdownConfiguration().serviceFuture != null) {
error = error(Messages.getString("HttpSslHandler.38")); //$NON-NLS-1$
} else {
error = error(Messages.getString("HttpSslHandler.37")); //$NON-NLS-1$
}
R66ShutdownHook.setRestart(false);
newSession = true;
clearSession();
forceClose = true;
shutdown = true;
return error;
} else if (act.equalsIgnoreCase("Restart")) {
String error;
if (Configuration.configuration.getShutdownConfiguration().serviceFuture != null) {
error = error(Messages.getString("HttpSslHandler.38")); //$NON-NLS-1$
} else {
error = error(Messages.getString("HttpSslHandler.39") + (Configuration.configuration.getTIMEOUTCON() * 2 / 1000) + Messages.getString("HttpSslHandler.40")); //$NON-NLS-1$ //$NON-NLS-2$
}
error = error.replace("XXXRELOADHTTPXXX", "HTTP-EQUIV=\"refresh\" CONTENT=\""
+ (Configuration.configuration.getTIMEOUTCON() * 2 / 1000) + "\"");
R66ShutdownHook.setRestart(true);
newSession = true;
clearSession();
forceClose = true;
shutdown = true;
return error;
} else if (act.equalsIgnoreCase("Validate")) {
String bsessionr = getTrimValue("BSESSR");
long lsessionr = Configuration.configuration.getServerChannelReadLimit();
long lglobalr;
long lsessionw;
long lglobalw;
long delay;
try {
if (bsessionr != null) {
lsessionr = (Long.parseLong(bsessionr) / 10) * 10;
}
String bglobalr = getTrimValue("BGLOBR");
lglobalr = Configuration.configuration.getServerGlobalReadLimit();
if (bglobalr != null) {
lglobalr = (Long.parseLong(bglobalr) / 10) * 10;
}
String bsessionw = getTrimValue("BSESSW");
lsessionw = Configuration.configuration.getServerChannelWriteLimit();
if (bsessionw != null) {
lsessionw = (Long.parseLong(bsessionw) / 10) * 10;
}
String bglobalw = getTrimValue("BGLOBW");
lglobalw = Configuration.configuration.getServerGlobalWriteLimit();
if (bglobalw != null) {
lglobalw = (Long.parseLong(bglobalw) / 10) * 10;
}
String dtra = getTrimValue("DTRA");
delay = Configuration.configuration.getDelayLimit();
if (dtra != null) {
delay = (Long.parseLong(dtra) / 10) * 10;
if (delay < 100) {
delay = 100;
}
}
Configuration.configuration.changeNetworkLimit(
lglobalw, lglobalr, lsessionw, lsessionr,
delay);
String dcomm = getTrimValue("DCOM");
if (dcomm != null) {
Configuration.configuration.setDelayCommander(Long.parseLong(dcomm));
if (Configuration.configuration.getDelayCommander() <= 100) {
Configuration.configuration.setDelayCommander(100);
}
Configuration.configuration.reloadCommanderDelay();
}
String dret = getTrimValue("DRET");
if (dret != null) {
Configuration.configuration.setDelayRetry(Long.parseLong(dret));
if (Configuration.configuration.getDelayRetry() <= 1000) {
Configuration.configuration.setDelayRetry(1000);
}
}
extraInformation = Messages.getString("HttpSslHandler.41"); //$NON-NLS-1$
} catch (NumberFormatException e) {
extraInformation = Messages.getString("HttpSslHandler.42"); //$NON-NLS-1$
}
} else if (act.equalsIgnoreCase("HostConfig")) {
config.setBusiness(getTrimValue("BUSINESS"));
config.setRoles(getTrimValue("ROLES"));
config.setAliases(getTrimValue("ALIASES"));
config.setOthers(getTrimValue("OTHER"));
try {
config.update();
extraInformation = Messages.getString("HttpSslHandler.41"); //$NON-NLS-1$
} catch (WaarpDatabaseException e) {
extraInformation = Messages.getString("HttpSslHandler.43"); //$NON-NLS-1$
}
}
}
}
String system = REQUEST.System.read(this);
StringBuilder builder = new StringBuilder(system);
replaceStringSystem(config, builder);
langHandle(builder);
fillHostIds(builder);
if (extraInformation != null) {
builder.append(extraInformation);
}
return builder.toString();
}
private void getParams() {
if (request.method() == HttpMethod.GET) {
params = null;
} else if (request.method() == HttpMethod.POST) {
Map<String, List<String>> paramsOld = params;
ByteBuf content = request.content();
if (content.isReadable()) {
String param = content.toString(WaarpStringUtils.UTF8);
QueryStringDecoder queryStringDecoder2 = new QueryStringDecoder("/?" + param);
params = queryStringDecoder2.parameters();
if (params.containsKey(sREFRESH)) {
List<String> parms = params.get("ACTION");
if (parms != null) {
String parm = parms.get(0);
if ("Disabling".equalsIgnoreCase(parm)) {
setREFRESH(0);
} else {
String snb = getTrimValue(sREFRESH);
if (snb != null) {
try {
int old = getREFRESH();
setREFRESH(Integer.parseInt(snb)*1000);
if (getREFRESH() < 0) {
setREFRESH(old);
}
} catch (Exception e1) {
}
}
}
}
params = paramsOld;
return;
}
if (params.containsKey(sLIMITROW)) {
String snb = getTrimValue(sLIMITROW);
if (snb != null) {
try {
int old = getLIMITROW();
setLIMITROW(Integer.parseInt(snb));
if (getLIMITROW() < 5) {
setLIMITROW(old);
}
} catch (Exception e1) {
}
}
}
} else {
params = null;
}
}
}
private void clearSession() {
if (admin != null) {
R66Session lsession = sessions.remove(admin.value());
DbSession ldbsession = dbSessions.remove(admin.value());
admin = null;
if (lsession != null) {
lsession.setStatus(75);
lsession.clear();
}
if (ldbsession != null) {
ldbsession.forceDisconnect();
DbAdmin.decHttpSession();
}
}
}
private void checkAuthent(ChannelHandlerContext ctx) {
newSession = true;
if (request.method() == HttpMethod.GET) {
String logon = Logon();
logon = logon.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
"");
responseContent.append(logon);
clearSession();
writeResponse(ctx);
return;
} else if (request.method() == HttpMethod.POST) {
getParams();
if (params == null) {
String logon = Logon();
logon = logon.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
Messages.getString("HttpSslHandler.EmptyLogin"));
responseContent.append(logon);
clearSession();
writeResponse(ctx);
return;
}
}
boolean getMenu = false;
if (params.containsKey("Logon")) {
String name = null, password = null;
List<String> values = null;
if (!params.isEmpty()) {
// get values
if (params.containsKey("name")) {
values = params.get("name");
if (values != null) {
name = values.get(0);
if (name == null || name.isEmpty()) {
getMenu = true;
}
}
} else {
getMenu = true;
}
// search the nb param
if ((!getMenu) && params.containsKey("passwd")) {
values = params.get("passwd");
if (values != null) {
password = values.get(0);
if (password == null || password.isEmpty()) {
getMenu = true;
} else {
getMenu = false;
}
} else {
getMenu = true;
}
} else {
getMenu = true;
}
} else {
getMenu = true;
}
if (!getMenu) {
logger.debug("Name? "
+ name.equals(Configuration.configuration.getADMINNAME()) +
" Passwd? " + Arrays.equals(password.getBytes(WaarpStringUtils.UTF8),
Configuration.configuration.getSERVERADMINKEY()));
if (name.equals(Configuration.configuration.getADMINNAME()) &&
Arrays.equals(password.getBytes(WaarpStringUtils.UTF8),
Configuration.configuration.getSERVERADMINKEY())) {
authentHttp.getAuth().specialNoSessionAuth(true,
Configuration.configuration.getHOST_ID());
authentHttp.setStatus(70);
} else {
try {
authentHttp.getAuth().connectionHttps(DbConstant.admin.getSession(), name,
FilesystemBasedDigest.passwdCrypt(password.getBytes(WaarpStringUtils.UTF8)));
} catch (Reply530Exception e1) {
getMenu = true;
} catch (Reply421Exception e1) {
getMenu = true;
}
}
if (!authentHttp.isAuthenticated()) {
authentHttp.setStatus(71);
logger.debug("Still not authenticated: {}", authentHttp);
getMenu = true;
}
logger.debug("Identified: " + authentHttp.getAuth().isIdentified() + ":"
+ authentHttp.isAuthenticated());
}
} else {
getMenu = true;
}
if (getMenu) {
String logon = Logon();
logon = logon.replaceAll(REPLACEMENT.XXXERRORMESGXXX.toString(),
Messages.getString("HttpSslHandler.BadLogin"));
responseContent.append(logon);
clearSession();
writeResponse(ctx);
} else {
// load DbSession
if (this.dbSession != null) {
clearSession();
this.dbSession = null;
}
if (this.dbSession == null) {
try {
if (DbConstant.admin.isActive()) {
this.dbSession = new DbSession(DbConstant.admin, false);
DbAdmin.incHttpSession();
this.isPrivateDbSession = true;
}
} catch (WaarpDatabaseNoConnectionException e1) {
// Cannot connect so use default connection
logger.warn("Use default database connection");
this.dbSession = DbConstant.admin.getSession();
}
}
String index = index();
responseContent.append(index);
clearSession();
admin = new DefaultCookie(R66SESSION + Configuration.configuration.getHOST_ID(),
Configuration.configuration.getHOST_ID() +
Long.toHexString(random.nextLong()));
sessions.put(admin.value(), this.authentHttp);
authentHttp.setStatus(72);
if (this.isPrivateDbSession) {
dbSessions.put(admin.value(), dbSession);
}
logger.debug("CreateSession: " + uriRequest + ":{}", admin);
writeResponse(ctx);
}
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest msg) throws Exception {
FullHttpRequest request = this.request = msg;
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.uri());
uriRequest = queryStringDecoder.path();
logger.debug("Msg: " + uriRequest);
if (uriRequest.contains("gre/") || uriRequest.contains("img/") ||
uriRequest.contains("app/") || uriRequest.contains("css/") || uriRequest.contains("js/") || uriRequest.contains("datatable/") ||
uriRequest.contains("res/") || uriRequest.contains("favicon.ico")) {
HttpWriteCacheEnable.writeFile(request,
ctx, Configuration.configuration.getHttpBasePath() + uriRequest,
R66SESSION + Configuration.configuration.getHOST_ID());
return;
}
if (uriRequest.contains(Configuration.configuration.getArchivePath())) {
HttpWriteCacheEnable.writeFile(request,
ctx, Configuration.configuration.getBaseDirectory() + uriRequest,
R66SESSION + Configuration.configuration.getHOST_ID());
return;
}
checkSession(ctx.channel());
if (!authentHttp.isAuthenticated()) {
logger.debug("Not Authent: " + uriRequest + ":{}", authentHttp);
checkAuthent(ctx);
return;
}
String find = uriRequest;
if (uriRequest.charAt(0) == '/') {
find = uriRequest.substring(1);
}
REQUEST req = REQUEST.index;
if (find.length() != 0) {
find = find.substring(0, find.indexOf("."));
try {
req = REQUEST.valueOf(find);
} catch (IllegalArgumentException e1) {
req = REQUEST.index;
logger.debug("NotFound: " + find + ":" + uriRequest);
}
}
switch (req) {
case CancelRestart:
if (authentHttp.getAuth().isValidRole(ROLE.TRANSFER)) {
responseContent.append(CancelRestart());
} else {
responseContent.append(unallowed(Messages.getString("HttpSslHandler.CancelRestartUnallowed")));
}
break;
case Export:
if (authentHttp.getAuth().isValidRole(ROLE.SYSTEM)) {
responseContent.append(Export());
} else {
responseContent.append(unallowed(Messages.getString("HttpSslHandler.ExportUnallowed")));
}
break;
case Hosts:
if (authentHttp.getAuth().isValidRole(ROLE.CONFIGADMIN)) {
responseContent.append(Hosts());
} else {
responseContent.append(unallowed(Messages.getString("HttpSslHandler.HostUnallowed")));
}
break;
case index:
responseContent.append(index());
break;
case ListingReload:
responseContent.append(ListingReload());
break;
case Listing:
responseContent.append(Listing());
break;
case Logon:
responseContent.append(index());
break;
case Logout:
responseContent.append(Logout());
break;
case Rules:
if (authentHttp.getAuth().isValidRole(ROLE.CONFIGADMIN)) {
responseContent.append(Rules());
} else {
responseContent.append(unallowed(Messages.getString("HttpSslHandler.RulesUnallowed")));
}
break;
case System:
if (authentHttp.getAuth().isValidRole(ROLE.SYSTEM)) {
responseContent.append(System());
} else {
responseContent.append(SystemLimited());
}
break;
case Spooled:
responseContent.append(Spooled(false));
break;
case SpooledDetailed:
responseContent.append(Spooled(true));
break;
default:
responseContent.append(index());
break;
}
writeResponse(ctx);
}
private void checkSession(Channel channel) {
String cookieString = request.headers().get(HttpHeaderNames.COOKIE);
if (cookieString != null) {
Set<Cookie> cookies = ServerCookieDecoder.LAX.decode(cookieString);
if (!cookies.isEmpty()) {
for (Cookie elt : cookies) {
if (elt.name().equalsIgnoreCase(R66SESSION + Configuration.configuration.getHOST_ID())) {
logger.debug("Found session: " + elt);
admin = elt;
R66Session session = sessions.get(admin.value());
if (session != null) {
authentHttp = session;
authentHttp.setStatus(73);
} else {
admin = null;
continue;
}
DbSession dbSession = dbSessions.get(admin.value());
if (dbSession != null) {
if (dbSession.isDisActive()) {
clearSession();
}
this.dbSession = dbSession;
} else {
admin = null;
continue;
}
} else if (elt.name().equalsIgnoreCase(I18NEXT)) {
logger.debug("Found i18next: " + elt);
lang = elt.value();
}
}
}
}
if (admin == null) {
logger.debug("NoSession: " + uriRequest + ":{}", admin);
}
}
private void handleCookies(HttpResponse response) {
String cookieString = request.headers().get(HttpHeaderNames.COOKIE);
boolean i18nextFound = false;
if (cookieString != null) {
Set<Cookie> cookies = ServerCookieDecoder.LAX.decode(cookieString);
if (!cookies.isEmpty()) {
// Reset the sessions if necessary.
boolean findSession = false;
for (Cookie cookie : cookies) {
if (cookie.name().equalsIgnoreCase(R66SESSION + Configuration.configuration.getHOST_ID())) {
if (newSession) {
findSession = false;
} else {
findSession = true;
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.LAX.encode(cookie));
}
} else if (cookie.name().equalsIgnoreCase(I18NEXT)) {
i18nextFound = true;
cookie.setValue(lang);
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.LAX.encode(cookie));
} else {
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.LAX.encode(cookie));
}
}
if (!i18nextFound) {
Cookie cookie = new DefaultCookie(I18NEXT, lang);
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.LAX.encode(cookie));
}
newSession = false;
if (!findSession) {
if (admin != null) {
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.LAX.encode(admin));
logger.debug("AddSession: " + uriRequest + ":{}", admin);
}
}
}
} else {
Cookie cookie = new DefaultCookie(I18NEXT, lang);
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.LAX.encode(cookie));
if (admin != null) {
logger.debug("AddSession: " + uriRequest + ":{}", admin);
response.headers().add(HttpHeaderNames.SET_COOKIE, ServerCookieEncoder.LAX.encode(admin));
}
}
}
/**
* Write the response
*
* @param ctx
*/
private void writeResponse(ChannelHandlerContext ctx) {
// Convert the response content to a ByteBuf.
ByteBuf buf = Unpooled.copiedBuffer(responseContent.toString(),
WaarpStringUtils.UTF8);
responseContent.setLength(0);
// Decide whether to close the connection or not.
boolean keepAlive = HttpUtil.isKeepAlive(request);
boolean close = HttpHeaderValues.CLOSE.contentEqualsIgnoreCase(request
.headers().get(HttpHeaderNames.CONNECTION)) ||
(!keepAlive) || forceClose;
// Build the response object.
FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, buf);
response.headers().add(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html");
if (keepAlive) {
response.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
}
if (!close) {
// There's no need to add 'Content-Length' header
// if this is the last response.
response.headers().set(HttpHeaderNames.CONTENT_LENGTH,
String.valueOf(buf.readableBytes()));
}
handleCookies(response);
// Write the response.
ChannelFuture future = ctx.writeAndFlush(response);
// Close the connection after the write operation is done if necessary.
if (close) {
future.addListener(WaarpSslUtility.SSLCLOSE);
}
if (shutdown) {
ChannelUtils.startShutdown();
}
}
/**
* Send an error and close
*
* @param ctx
* @param status
*/
private void sendError(ChannelHandlerContext ctx, HttpResponseStatus status) {
responseContent.setLength(0);
responseContent.append(error(status.toString()));
FullHttpResponse response = new DefaultFullHttpResponse(
HttpVersion.HTTP_1_1, status,
Unpooled.copiedBuffer(responseContent.toString(),
WaarpStringUtils.UTF8));
response.headers().add(HttpHeaderNames.CONTENT_LENGTH, response.content().readableBytes());
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/html");
responseContent.setLength(0);
clearSession();
// Close the connection as soon as the error message is sent.
ctx.writeAndFlush(response).addListener(WaarpSslUtility.SSLCLOSE);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
throws Exception {
OpenR66Exception exception = OpenR66ExceptionTrappedFactory
.getExceptionFromTrappedException(ctx.channel(), cause);
if (exception != null) {
if (!(exception instanceof OpenR66ProtocolBusinessNoWriteBackException)) {
if (cause instanceof IOException) {
// Nothing to do
return;
}
logger.warn("Exception in HttpSslHandler {}", exception.getMessage());
}
if (ctx.channel().isActive()) {
sendError(ctx, HttpResponseStatus.BAD_REQUEST);
}
} else {
// Nothing to do
return;
}
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
Channel channel = ctx.channel();
Configuration.configuration.getHttpChannelGroup().add(channel);
super.channelActive(ctx);
}
/**
* @return the lIMITROW
*/
public int getLIMITROW() {
return LIMITROW;
}
/**
* @param lIMITROW the lIMITROW to set
*/
private void setLIMITROW(int lIMITROW) {
LIMITROW = lIMITROW;
}
/**
* @return the rEFRESH
*/
public int getREFRESH() {
return REFRESH;
}
/**
* @param rEFRESH the rEFRESH to set
*/
private void setREFRESH(int rEFRESH) {
REFRESH = rEFRESH;
}
}