// SettingsAck_p.java // ----------------------- // part of YaCy // (C) by Michael Peter Christen; mc@yacy.net // first published on http://www.anomic.de // Frankfurt, Germany, 2004, 2005 // // $LastChangedDate$ // $LastChangedRevision$ // $LastChangedBy$ // // This program 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 2 of the License, or // (at your option) any later version. // // This program 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 this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // You must compile this file with // javac -classpath .:../Classes SettingsAck_p.java // if the shell's current path is HTROOT import java.util.HashMap; import java.util.Iterator; import java.util.StringTokenizer; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import net.yacy.cora.order.Digest; import net.yacy.cora.protocol.RequestHeader; import net.yacy.kelondro.util.Formatter; import net.yacy.peers.Network; import net.yacy.peers.Seed; import net.yacy.peers.operation.yacySeedUploader; import net.yacy.search.Switchboard; import net.yacy.search.SwitchboardConstants; import net.yacy.search.query.SearchEventCache; import net.yacy.server.serverCore; import net.yacy.server.serverObjects; import net.yacy.server.serverSwitch; public class SettingsAck_p { private static boolean nothingChanged = false; public static serverObjects respond(final RequestHeader header, final serverObjects post, final serverSwitch env) { // return variable that accumulates replacements final serverObjects prop = new serverObjects(); final Switchboard sb = (Switchboard) env; // set default backlink prop.put("needsRestart_referer", "Settings_p.html"); prop.put("needsRestart", false); //if (post == null) System.out.println("POST: NULL"); else System.out.println("POST: " + post.toString()); if (post == null) { prop.put("info", "1");//no information submitted return prop; } // admin password if (post.containsKey("adminaccount")) { // read and process data final String user = post.get("adminuser"); final String pw1 = post.get("adminpw1"); final String pw2 = post.get("adminpw2"); // do checks if ((user == null) || (pw1 == null) || (pw2 == null)) { prop.put("info", "1");//error with submitted information return prop; } if (user.isEmpty()) { prop.put("info", "2");//username must be given return prop; } if (!(pw1.equals(pw2))) { prop.put("info", "3");//pw check failed return prop; } // check passed. set account: env.setConfig(SwitchboardConstants.ADMIN_ACCOUNT_B64MD5, "MD5:"+Digest.encodeMD5Hex(user + ":" + sb.getConfig(SwitchboardConstants.ADMIN_REALM,"YaCy") + ":" + pw1)); env.setConfig(SwitchboardConstants.ADMIN_ACCOUNT_USER_NAME, user); prop.put("info", "5");//admin account changed prop.putHTML("info_user", user); return prop; } // proxy password if (post.containsKey("proxyaccount")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=ProxyAccess"); /* * display port info */ prop.put("info_port", env.getLocalPort()); prop.put("info_restart", "0"); // read and process data String filter = (post.get("proxyfilter")).trim(); final boolean useProxyAccounts = post.containsKey("use_proxyaccounts") && post.get("use_proxyaccounts").equals("on"); // do checks if (filter == null) { prop.put("info", "1");//error with submitted information return prop; } if (filter.isEmpty()) filter = "*"; else if (!filter.equals("*")){ // testing proxy filter int patternCount = 0; String patternStr = null; try { final StringTokenizer st = new StringTokenizer(filter,","); while (st.hasMoreTokens()) { patternCount++; patternStr = st.nextToken(); Pattern.compile(patternStr); } } catch (final PatternSyntaxException e) { prop.put("info", "27"); prop.putHTML("info_filter", filter); prop.put("info_nr", patternCount); prop.putHTML("info_error", e.getMessage()); prop.putHTML("info_pattern", patternStr); return prop; } } // check passed. set account: env.setConfig("proxyClient", filter); env.setConfig("use_proxyAccounts", useProxyAccounts); if (!useProxyAccounts){ prop.put("info", "6");//proxy account has changed(no pw) prop.putHTML("info_filter", filter); } else { prop.put("info", "7");//proxy account has changed //prop.put("info_user", user); prop.putHTML("info_filter", filter); } return prop; } // http networking if (post.containsKey("httpNetworking")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=ProxyAccess"); // set transparent proxy flag boolean isTransparentProxy = post.containsKey("isTransparentProxy"); env.setConfig(SwitchboardConstants.PROXY_TRANSPARENT_PROXY, isTransparentProxy); prop.put("info_isTransparentProxy", isTransparentProxy ? "on" : "off"); if (isTransparentProxy) prop.put("needsRestart", isTransparentProxy); // set proxyAlwaysFresh flag boolean proxyAlwaysFresh = post.containsKey("proxyAlwaysFresh"); env.setConfig("proxyAlwaysFresh", proxyAlwaysFresh); prop.put("info_proxyAlwaysFresh", proxyAlwaysFresh ? "on" : "off"); // setting via header property env.setConfig("proxy.sendViaHeader", post.containsKey("proxy.sendViaHeader")); prop.put("info_proxy.sendViaHeader", post.containsKey("proxy.sendViaHeader")? "on" : "off"); // setting X-Forwarded-for header property env.setConfig("proxy.sendXForwardedForHeader", post.containsKey("proxy.sendXForwardedForHeader")); prop.put("info_proxy.sendXForwardedForHeader", post.containsKey("proxy.sendXForwardedForHeader")? "on" : "off"); prop.put("info", "20"); return prop; } // server access if (post.containsKey("serveraccount")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=ServerAccess"); // fileHost String fileHost = (post.get("fileHost")).trim(); if (fileHost != null && !fileHost.isEmpty() && !fileHost.equals(env.getConfig("fileHost", "localpeer"))) { env.setConfig("fileHost", fileHost); } // static IP String staticIP = (post.get("staticIP")).trim(); if (staticIP.startsWith("http://")) { if (staticIP.length() > 7) { staticIP = staticIP.substring(7); } else { staticIP = ""; } } else if (staticIP.startsWith("https://")) { if (staticIP.length() > 8) { staticIP = staticIP.substring(8); } else { staticIP = ""; } } String error = Seed.isProperIP(staticIP) ? null : "ip not proper: " + staticIP; if (error == null) { serverCore.useStaticIP = true; sb.peers.mySeed().setIP(staticIP); env.setConfig(SwitchboardConstants.SERVER_STATICIP, staticIP); } else { serverCore.useStaticIP = false; sb.peers.mySeed().setIP(""); env.setConfig(SwitchboardConstants.SERVER_STATICIP, ""); } // server access data String filter = (post.get("serverfilter")).trim(); /*String user = (String) post.get("serveruser"); String pw1 = (String) post.get("serverpw1"); String pw2 = (String) post.get("serverpw2");*/ // do checks if (filter == null) { //if ((filter == null) || (user == null) || (pw1 == null) || (pw2 == null)) { prop.put("info", "1");//error with submitted information return prop; } /* if (user.isEmpty()) { prop.put("info", 2);//username must be given return prop; } if (!(pw1.equals(pw2))) { prop.put("info", 3);//pw check failed return prop; }*/ if (filter.isEmpty()) filter = "*"; else if (!filter.equals("*")){ // testing proxy filter int patternCount = 0; String patternStr = null; try { final StringTokenizer st = new StringTokenizer(filter,","); while (st.hasMoreTokens()) { patternCount++; patternStr = st.nextToken(); Pattern.compile(patternStr); } } catch (final PatternSyntaxException e) { prop.put("info", "27"); prop.putHTML("info_filter", filter); prop.put("info_nr", patternCount); prop.putHTML("info_error", e.getMessage()); prop.putHTML("info_pattern", patternStr); return prop; } } // check passed. set account: env.setConfig("serverClient", filter); prop.put("info", "8");//server access filter updated //prop.put("info_user", user); prop.putHTML("info_filter", filter); return prop; } if (post.containsKey("proxysettings")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=proxy"); /* ==================================================================== * Reading out the remote proxy settings * ==================================================================== */ final boolean useRemoteProxy = post.containsKey("remoteProxyUse"); final boolean useRemoteProxy4SSL = post.containsKey("remoteProxyUse4SSL"); final String remoteProxyHost = post.get("remoteProxyHost", ""); final int remoteProxyPort = post.getInt("remoteProxyPort", 3128); final String remoteProxyUser = post.get("remoteProxyUser", ""); final String remoteProxyPwd = post.get("remoteProxyPwd", ""); final String remoteProxyNoProxyStr = post.get("remoteProxyNoProxy", ""); //String[] remoteProxyNoProxyPatterns = CommonPattern.COMMA.split(remoteProxyNoProxyStr); /* ==================================================================== * Storing settings into config file * ==================================================================== */ env.setConfig("remoteProxyHost", remoteProxyHost); env.setConfig("remoteProxyPort", Integer.toString(remoteProxyPort)); env.setConfig("remoteProxyUser", remoteProxyUser); env.setConfig("remoteProxyPwd", remoteProxyPwd); env.setConfig("remoteProxyNoProxy", remoteProxyNoProxyStr); env.setConfig("remoteProxyUse", useRemoteProxy); env.setConfig("remoteProxyUse4SSL", useRemoteProxy4SSL); /* ==================================================================== * Enabling settings * ==================================================================== */ sb.initRemoteProxy(); prop.put("info", "15"); // The remote-proxy setting has been changed return prop; } if (post.containsKey("urlproxySettings")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=UrlProxyAccess"); env.setConfig("proxyURL.access", post.get("urlproxyfilter")); env.setConfig("proxyURL.rewriteURLs", post.get("urlproxydomains")); env.setConfig("proxyURL", "on".equals(post.get("urlproxyenabled")) ? true : false); env.setConfig("proxyURL.useforresults", "on".equals(post.get("urlproxyuseforresults")) ? true : false); prop.put("info_success", "1"); prop.put("info", "33"); return prop; } if (post.containsKey("seedUploadRetry")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=seed"); String error; if ((error = Network.saveSeedList(sb)) == null) { // trying to upload the seed-list file prop.put("info", "13"); prop.put("info_success", "1"); } else { prop.put("info", "14"); prop.putHTML("info_errormsg",error.replaceAll("\n","<br>")); env.setConfig("seedUploadMethod","none"); } return prop; } if (post.containsKey("seedSettings")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=seed"); // get the currently used uploading method final String oldSeedUploadMethod = env.getConfig("seedUploadMethod","none"); final String newSeedUploadMethod = post.get("seedUploadMethod"); final String oldSeedURLStr = sb.peers.mySeed().get(Seed.SEEDLISTURL, ""); final String newSeedURLStr = post.get("seedURL"); final boolean seedUrlChanged = !oldSeedURLStr.equals(newSeedURLStr); boolean uploadMethodChanged = !oldSeedUploadMethod.equals(newSeedUploadMethod); if (uploadMethodChanged) { uploadMethodChanged = Network.changeSeedUploadMethod(newSeedUploadMethod); } if (seedUrlChanged || uploadMethodChanged) { env.setConfig("seedUploadMethod", newSeedUploadMethod); sb.peers.mySeed().put(Seed.SEEDLISTURL, newSeedURLStr); if (seedUrlChanged) sb.peers.saveMySeed(); // try an upload String error; if ((error = Network.saveSeedList(sb)) == null) { // we have successfully uploaded the seed-list file prop.put("info_seedUploadMethod", newSeedUploadMethod); prop.putHTML("info_seedURL",newSeedURLStr); prop.put("info_success", newSeedUploadMethod.equalsIgnoreCase("none") ? "0" : "1"); prop.put("info", "19"); } else { prop.put("info", "14"); prop.putHTML("info_errormsg", error.replaceAll("\n","<br>")); env.setConfig("seedUploadMethod","none"); } return prop; } } if (post.containsKey("seedFileSettings") || post.containsKey("seedFtpSettings") || post.containsKey("seedScpSettings")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=seed"); } /* * Loop through the available seed uploaders to see if the * configuration of one of them has changed */ final HashMap<String, String> uploaders = Network.getSeedUploadMethods(); final Iterator<String> uploaderKeys = uploaders.keySet().iterator(); while (uploaderKeys.hasNext()) { // get the uploader module name final String uploaderName = uploaderKeys.next(); // determining if the user has reconfigured the settings of this uploader if (post.containsKey("seed" + uploaderName + "Settings")) { nothingChanged = true; final yacySeedUploader theUploader = Network.getSeedUploader(uploaderName); final String[] configOptions = theUploader.getConfigurationOptions(); if (configOptions != null) { for (final String configOption : configOptions) { final String newSettings = post.get(configOption,""); final String oldSettings = env.getConfig(configOption,""); // bitwise AND with boolean is same as logic AND nothingChanged &= newSettings.equals(oldSettings); if (!nothingChanged) { env.setConfig(configOption,newSettings); } } } if (!nothingChanged) { // if the seed upload method is equal to the seed uploader whose settings // were changed, we now try to upload the seed list with the new settings if (env.getConfig("seedUploadMethod","none").equalsIgnoreCase(uploaderName)) { String error; if ((error = Network.saveSeedList(sb)) == null) { // we have successfully uploaded the seed file prop.put("info", "13"); prop.put("info_success", "1"); } else { // if uploading failed we print out an error message prop.put("info", "14"); prop.putHTML("info_errormsg",error.replaceAll("\n","<br>")); env.setConfig("seedUploadMethod","none"); } } else { prop.put("info", "13"); prop.put("info_success", "0"); } } else { prop.put("info", "13"); prop.put("info_success", "0"); } return prop; } } /* * Message forwarding configuration */ if (post.containsKey("msgForwarding")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=messageForwarding"); env.setConfig("msgForwardingEnabled", post.containsKey("msgForwardingEnabled")); env.setConfig("msgForwardingCmd", post.get("msgForwardingCmd")); env.setConfig("msgForwardingTo", post.get("msgForwardingTo")); prop.put("info", "21"); prop.put("info_msgForwardingEnabled", post.containsKey("msgForwardingEnabled") ? "on" : "off"); prop.putHTML("info_msgForwardingCmd", post.get("msgForwardingCmd")); prop.putHTML("info_msgForwardingTo", post.get("msgForwardingTo")); return prop; } // Crawler settings if (post.containsKey("crawlerSettings")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=crawler"); // get Crawler Timeout String timeoutStr = post.get("crawler.clientTimeout"); if (timeoutStr==null||timeoutStr.length()==0) timeoutStr = "10000"; int crawlerTimeout; try { crawlerTimeout = Integer.parseInt(timeoutStr); if (crawlerTimeout < 0) crawlerTimeout = 0; env.setConfig("crawler.clientTimeout", Integer.toString(crawlerTimeout)); } catch (final NumberFormatException e) { prop.put("info", "29"); prop.putHTML("info_crawler.clientTimeout",post.get("crawler.clientTimeout")); return prop; } // get maximum http file size String maxSizeStr = post.get("crawler.http.maxFileSize"); if (maxSizeStr==null||maxSizeStr.length()==0) maxSizeStr = "-1"; long maxHttpSize; try { maxHttpSize = Integer.parseInt(maxSizeStr); if(maxHttpSize < 0) { maxHttpSize = -1; } env.setConfig("crawler.http.maxFileSize", Long.toString(maxHttpSize)); } catch (final NumberFormatException e) { prop.put("info", "30"); prop.putHTML("info_crawler.http.maxFileSize",post.get("crawler.http.maxFileSize")); return prop; } // get maximum ftp file size maxSizeStr = post.get("crawler.ftp.maxFileSize"); if (maxSizeStr==null||maxSizeStr.length()==0) maxSizeStr = "-1"; long maxFtpSize; try { maxFtpSize = Integer.parseInt(maxSizeStr); env.setConfig("crawler.ftp.maxFileSize", Long.toString(maxFtpSize)); } catch (final NumberFormatException e) { prop.put("info", "31"); prop.putHTML("info_crawler.ftp.maxFileSize",post.get("crawler.ftp.maxFileSize")); return prop; } maxSizeStr = post.get("crawler.smb.maxFileSize"); if (maxSizeStr==null||maxSizeStr.length()==0) maxSizeStr = "-1"; long maxSmbSize; try { maxSmbSize = Integer.parseInt(maxSizeStr); env.setConfig("crawler.smb.maxFileSize", Long.toString(maxSmbSize)); } catch (final NumberFormatException e) { prop.put("info", "31"); prop.putHTML("info_crawler.smb.maxFileSize",post.get("crawler.smb.maxFileSize")); return prop; } maxSizeStr = post.get("crawler.file.maxFileSize"); if (maxSizeStr==null||maxSizeStr.length()==0) maxSizeStr = "-1"; long maxFileSize; try { maxFileSize = Integer.parseInt(maxSizeStr); env.setConfig("crawler.file.maxFileSize", Long.toString(maxFileSize)); } catch (final NumberFormatException e) { prop.put("info", "31"); prop.putHTML("info_crawler.file.maxFileSize",post.get("crawler.file.maxFileSize")); return prop; } // everything is ok prop.put("info_crawler.clientTimeout",(crawlerTimeout==0) ? "0" :Formatter.number(crawlerTimeout/1000.0,false)+" sec"); prop.put("info_crawler.http.maxFileSize",(maxHttpSize==-1)? "-1":Formatter.bytesToString(maxHttpSize)); prop.put("info_crawler.ftp.maxFileSize", (maxFtpSize==-1) ? "-1":Formatter.bytesToString(maxFtpSize)); prop.put("info_crawler.smb.maxFileSize", (maxSmbSize==-1) ? "-1":Formatter.bytesToString(maxSmbSize)); prop.put("info_crawler.file.maxFileSize", (maxFileSize==-1) ? "-1":Formatter.bytesToString(maxFileSize)); prop.put("info", "28"); return prop; } // server port settings if (post.containsKey("serverports")) { int port = post.getInt("port", 8090); if (port > 0) env.setConfig(SwitchboardConstants.SERVER_PORT, port); int portssl = post.getInt("port.ssl", 8443); if (portssl > 0) env.setConfig(SwitchboardConstants.SERVER_SSLPORT, portssl); int portshutdown = post.getInt("port.shutdown", -1); env.setConfig(SwitchboardConstants.SERVER_SHUTDOWNPORT, portshutdown); prop.put("info_port", port); prop.put("info_port.ssl", portssl); prop.put("info_port.shutdown", portshutdown); prop.put("needsRestart_referer", "Settings_p.html?page=ServerAccess"); prop.put("info", "36"); return prop; } // change https port if (post.containsKey("port.ssl")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=ProxyAccess"); int port = post.getInt("port.ssl", 8443); if (port > 0 && port != env.getConfigInt(SwitchboardConstants.SERVER_SSLPORT, 8443)) { env.setConfig(SwitchboardConstants.SERVER_SSLPORT, port); } prop.put("info_port.ssl", port); prop.put("info", "32"); return prop; } // Debug/Analysis settings if (post.containsKey("debugAnalysisSettings")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=debug"); boolean tickedCheckbox = post.containsKey("solrBinaryResponse"); env.setConfig(SwitchboardConstants.REMOTE_SOLR_BINARY_RESPONSE_ENABLED, tickedCheckbox); tickedCheckbox = post.containsKey("searchTestLocalDHT"); env.setConfig(SwitchboardConstants.DEBUG_SEARCH_REMOTE_DHT_TESTLOCAL, tickedCheckbox); tickedCheckbox = post.containsKey("searchTestLocalSolr"); env.setConfig(SwitchboardConstants.DEBUG_SEARCH_REMOTE_SOLR_TESTLOCAL, tickedCheckbox); tickedCheckbox = post.containsKey("searchShowRanking"); env.setConfig(SwitchboardConstants.SEARCH_RESULT_SHOW_RANKING, tickedCheckbox); /* For easier user understanding, the following flags controlling data sources selection * are rendered in the UI as checkboxes corresponding to enabled value when ticked */ tickedCheckbox = post.containsKey("searchLocalDHT"); env.setConfig(SwitchboardConstants.DEBUG_SEARCH_LOCAL_DHT_OFF, !tickedCheckbox); tickedCheckbox = post.containsKey("searchLocalSolr"); env.setConfig(SwitchboardConstants.DEBUG_SEARCH_LOCAL_SOLR_OFF, !tickedCheckbox); tickedCheckbox = post.containsKey("searchRemoteDHT"); env.setConfig(SwitchboardConstants.DEBUG_SEARCH_REMOTE_DHT_OFF, !tickedCheckbox); tickedCheckbox = post.containsKey("searchRemoteSolr"); env.setConfig(SwitchboardConstants.DEBUG_SEARCH_REMOTE_SOLR_OFF, !tickedCheckbox); /* Let's clean up all search events as these settings affect how search is performed and we don't * want cached results obtained with the previous settings */ SearchEventCache.cleanupEvents(true); prop.put("info", "34"); return prop; } // Referrer Policy settings if (post.containsKey("referrerPolicySettings")) { // set backlink prop.put("needsRestart_referer", "Settings_p.html?page=referrer"); String metaPolicy = post.get("metaPolicy", SwitchboardConstants.REFERRER_META_POLICY_DEFAULT); env.setConfig(SwitchboardConstants.REFERRER_META_POLICY, metaPolicy); boolean tickedCheckbox = post.containsKey("searchResultNoReferrer"); env.setConfig(SwitchboardConstants.SEARCH_RESULT_NOREFERRER, tickedCheckbox); prop.put("info", "35"); return prop; } // nothing made prop.put("info", "1");//no information submitted return prop; } }