diff --git a/htroot/SettingsAck_p.html b/htroot/SettingsAck_p.html index 86ab6dae9..2a747f607 100644 --- a/htroot/SettingsAck_p.html +++ b/htroot/SettingsAck_p.html @@ -80,7 +80,7 @@ Parsing of the following mime-types was enabled:
  • #[enabledMime]#
  • #{/parser}# -:: +:: Seed Upload method was changed successfully. #(success)#::
    You are now a principal peer.#(/success)#

    @@ -88,18 +88,34 @@ Seed Upload method was changed successfully. Seed Upload Method:#[seedUploadMethod]# Seed File URL:#[seedURL]# -:: +::

    Your proxy networking settings have been changed.

    - + - - - -
    Transparent Proxy Support is:Transparent Proxy Support is: #[isTransparentProxy]#
    Connection Keep-Alive Support is:#[connectionKeepAliveSupport]#
    + Connection Keep-Alive Support is: + #[connectionKeepAliveSupport]# + + +:: +

    Your message forwarding settings have been changed.

    + + + + + + + + + + + + + +
    Message Forwarding Support is:#[msgForwardingEnabled]#
    Message Forwarding Command:#[msgForwardingCmd]#
    Recipient Address:#[msgForwardingTo]#
    #(/info)#

    You can now go back to the Settings page if you want to make more changes.

    diff --git a/htroot/SettingsAck_p.java b/htroot/SettingsAck_p.java index 79dfbc590..62aa87a5b 100644 --- a/htroot/SettingsAck_p.java +++ b/htroot/SettingsAck_p.java @@ -412,6 +412,25 @@ public class SettingsAck_p { } } + /* + * Message forwarding configuration + */ + if (post.containsKey("msgForwarding")) { + env.setConfig("msgForwardingEnabled",post.containsKey("msgForwardingEnabled")?"true":"false"); + env.setConfig("msgForwardingCmd",(String) post.get("msgForwardingCmd")); + env.setConfig("msgForwardingTo",(String) post.get("msgForwardingTo")); + + prop.put("info", 21); + prop.put("info_msgForwardingEnabled", post.containsKey("msgForwardingEnabled") ? "on" : "off"); + prop.put("info_msgForwardingCmd", (String) post.get("msgForwardingCmd")); + prop.put("info_msgForwardingTo", (String) post.get("msgForwardingTo")); + + return prop; + } + + /* + * Parser configuration + */ if (post.containsKey("parserSettings")) { plasmaSwitchboard sb = (plasmaSwitchboard)env; post.remove("parserSettings"); diff --git a/htroot/Settings_p.html b/htroot/Settings_p.html index 3bb16d548..0ec8b6091 100644 --- a/htroot/Settings_p.html +++ b/htroot/Settings_p.html @@ -30,11 +30,11 @@ delete the file 'DATA/SETTINGS/httpProxy.conf' in the YaCy application root fold downHTTP Networking - downContent Parser Settings + downMessage Forwarding downRemote Proxy (optional) -   + downContent Parser Settings @@ -265,6 +265,37 @@ but only if there had been changes to the seed-list. #{/seedUploadMethods}# +
    +

    +
    Message Forwarding +

    With this settings you can activate or deactivate forwarding of yacy-messages via email. +

    + + + + + + + + + + + + + + + + + + + + + +
    Enable message forwarding:Enabling/Disabling message forwarding via email.
    Forwarding Command:The command-line program that should be used to forward the message.
    e.g.:
     /usr/sbin/sendmail -t
    Forwarding To:The recipient email-address.
    e.g.:
     root@localhost
     Changes will take effect immediately.
    +

    +

    + +

    Content Parser Settings diff --git a/htroot/Settings_p.java b/htroot/Settings_p.java index 1004ed21b..935ce565b 100644 --- a/htroot/Settings_p.java +++ b/htroot/Settings_p.java @@ -188,6 +188,12 @@ public final class Settings_p { // general settings prop.put("seedURL", env.getConfig("seedURL", "")); + /* + * Message forwarding configuration + */ + prop.put("msgForwardingEnabled",env.getConfig("msgForwardingEnabled","false").equals("true")? 1 : 0); + prop.put("msgForwardingCmd",env.getConfig("msgForwardingCmd", "")); + prop.put("msgForwardingTo",env.getConfig("msgForwardingTo", "")); /* * Parser Configuration diff --git a/htroot/yacy/message.java b/htroot/yacy/message.java index 758a06f19..74a700b6e 100644 --- a/htroot/yacy/message.java +++ b/htroot/yacy/message.java @@ -1,54 +1,56 @@ -// message.java -// ----------------------- -// part of the AnomicHTTPD caching proxy -// (C) by Michael Peter Christen; mc@anomic.de -// first published on http://www.anomic.de -// Frankfurt, Germany, 2004 -// last major change: 29.06.2003 +//message.java +//----------------------- +//part of the AnomicHTTPD caching proxy +//(C) by Michael Peter Christen; mc@anomic.de +//first published on http://www.anomic.de +//Frankfurt, Germany, 2004 +//last major change: 29.06.2003 // -// 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 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. +//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 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 // -// Using this software in any meaning (reading, learning, copying, compiling, -// running) means that you agree that the Author(s) is (are) not responsible -// for cost, loss of data or any harm that may be caused directly or indirectly -// by usage of this softare or this documentation. The usage of this software -// is on your own risk. The installation and usage (starting/running) of this -// software may allow other people or application to access your computer and -// any attached devices and is highly dependent on the configuration of the -// software which must be done by the user of the software; the author(s) is -// (are) also not responsible for proper configuration and usage of the -// software, even if provoked by documentation provided together with -// the software. +//Using this software in any meaning (reading, learning, copying, compiling, +//running) means that you agree that the Author(s) is (are) not responsible +//for cost, loss of data or any harm that may be caused directly or indirectly +//by usage of this softare or this documentation. The usage of this software +//is on your own risk. The installation and usage (starting/running) of this +//software may allow other people or application to access your computer and +//any attached devices and is highly dependent on the configuration of the +//software which must be done by the user of the software; the author(s) is +//(are) also not responsible for proper configuration and usage of the +//software, even if provoked by documentation provided together with +//the software. // -// Any changes to this file according to the GPL as documented in the file -// gpl.txt aside this file in the shipment you received can be done to the -// lines that follows this copyright notice here, but changes must not be -// done inside the copyright notive above. A re-distribution must contain -// the intact and unchanged copyright notice. -// Contributions and changes to the program code must be marked as such. +//Any changes to this file according to the GPL as documented in the file +//gpl.txt aside this file in the shipment you received can be done to the +//lines that follows this copyright notice here, but changes must not be +//done inside the copyright notive above. A re-distribution must contain +//the intact and unchanged copyright notice. +//Contributions and changes to the program code must be marked as such. -// You must compile this file with -// javac -classpath .:../../Classes message.java -// if the shell's current path is HTROOT/yacy +//You must compile this file with +//javac -classpath .:../../Classes message.java +//if the shell's current path is HTROOT/yacy import java.io.File; import java.io.IOException; +import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; +import de.anomic.data.messageBoard; import de.anomic.http.httpHeader; import de.anomic.plasma.plasmaSwitchboard; import de.anomic.server.serverFileUtils; @@ -57,115 +59,176 @@ import de.anomic.server.serverSwitch; import de.anomic.tools.crypt; import de.anomic.yacy.yacyCore; import de.anomic.yacy.yacySeed; +import de.anomic.yacy.yacySeedDB; public class message { - + private static SimpleDateFormat SimpleFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); public static String dateString(Date date) { - return SimpleFormatter.format(date); + return SimpleFormatter.format(date); } - - + + public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { - // return variable that accumulates replacements - plasmaSwitchboard switchboard = (plasmaSwitchboard) env; - serverObjects prop = new serverObjects(); - - //System.out.println("yacy/message:post=" + post.toString()); - - if ((post == null) || (env == null)) return new serverObjects(); - - String process = (String) post.get("process", "permission"); - String key = (String) post.get("key", ""); - - int messagesize = 10240; - int attachmentsize = 0; - - prop.put("messagesize", "0"); - prop.put("attachmentsize", "0"); + // return variable that accumulates replacements + plasmaSwitchboard switchboard = (plasmaSwitchboard) env; + serverObjects prop = new serverObjects(); + + //System.out.println("yacy/message:post=" + post.toString()); + + if ((post == null) || (env == null)) return new serverObjects(); + + String process = (String) post.get("process", "permission"); + String key = (String) post.get("key", ""); + + int messagesize = 10240; + int attachmentsize = 0; + + prop.put("messagesize", "0"); + prop.put("attachmentsize", "0"); //System.out.println("DEBUG yacy/message: message post values = " + post.toString()); - - String youare = (String) post.get("youare", ""); // seed hash of the target peer, needed for network stability - // check if we are the right target and requester has correct information about this peer - if ((yacyCore.seedDB.mySeed == null) || (!(yacyCore.seedDB.mySeed.hash.equals(youare)))) { - // this request has a wrong target - //System.out.println("DEBUG yacy/message: authenticate failed"); - prop.put("response", "-1"); // request rejected - return prop; - } - + + String youare = (String) post.get("youare", ""); // seed hash of the target peer, needed for network stability + // check if we are the right target and requester has correct information about this peer + if ((yacyCore.seedDB.mySeed == null) || (!(yacyCore.seedDB.mySeed.hash.equals(youare)))) { + // this request has a wrong target + //System.out.println("DEBUG yacy/message: authenticate failed"); + prop.put("response", "-1"); // request rejected + return prop; + } + prop.put("messagesize", "" + messagesize); - prop.put("attachmentsize", "" + attachmentsize); - - if (process.equals("permission")) { - // permission: respond with accceptabeale message and attachment size - String iam = (String) post.get("iam", ""); // seed hash of requester - prop.put("response", "Welcome to my peer!"); - // that's it! - } - - if (process.equals("post")) { - // post: post message to message board - String otherSeedString = (String) post.get("myseed", ""); - if (otherSeedString.length() == 0) { - prop.put("response", "-1"); // request rejected - return prop; - } + prop.put("attachmentsize", "" + attachmentsize); + + if (process.equals("permission")) { + // permission: respond with accceptabeale message and attachment size + String iam = (String) post.get("iam", ""); // seed hash of requester + prop.put("response", "Welcome to my peer!"); + // that's it! + } + + if (process.equals("post")) { + // post: post message to message board + String otherSeedString = (String) post.get("myseed", ""); + if (otherSeedString.length() == 0) { + prop.put("response", "-1"); // request rejected + return prop; + } Date remoteTime = yacyCore.parseUniversalDate((String) post.get("mytime")); // read remote time - yacySeed otherSeed = yacySeed.genRemoteSeed(otherSeedString, key, remoteTime); - - String subject = crypt.simpleDecode((String) post.get("subject", ""), key); // message's subject - String message = crypt.simpleDecode((String) post.get("message", ""), key); // message body - - prop.put("response", "Thank you!"); - + yacySeed otherSeed = yacySeed.genRemoteSeed(otherSeedString, key, remoteTime); + + String subject = crypt.simpleDecode((String) post.get("subject", ""), key); // message's subject + String message = crypt.simpleDecode((String) post.get("message", ""), key); // message body + + prop.put("response", "Thank you!"); + // save message - switchboard.messageDB.write(switchboard.messageDB.newEntry( - "remote", - otherSeed.get("Name", "anonymous"), otherSeed.hash, - yacyCore.seedDB.mySeed.getName(), yacyCore.seedDB.mySeed.hash, - subject, message.getBytes())); - + messageBoard.entry msgEntry = null; + switchboard.messageDB.write(msgEntry = switchboard.messageDB.newEntry( + "remote", + otherSeed.get("Name", "anonymous"), otherSeed.hash, + yacyCore.seedDB.mySeed.getName(), yacyCore.seedDB.mySeed.hash, + subject, message.getBytes())); + + messageForwardingViaEmail(env,msgEntry); + // finally write notification File notifierSource = new File(switchboard.getRootPath(), switchboard.getConfig("htRootPath","htroot") + "/env/grafics/notifierActive.gif"); File notifierDest = new File(switchboard.getRootPath(), switchboard.getConfig("htRootPath","htroot") + "/env/grafics/notifier.gif"); try { - serverFileUtils.copy(notifierSource, notifierDest); - } catch (IOException e) { - System.out.println("NEW MESSAGE ARRIVED! (error: " + e.getMessage() + ")"); - }; + serverFileUtils.copy(notifierSource, notifierDest); + } catch (IOException e) { + System.out.println("NEW MESSAGE ARRIVED! (error: " + e.getMessage() + ")"); + }; } - //System.out.println("respond = " + prop.toString()); - - // return rewrite properties - return prop; + //System.out.println("respond = " + prop.toString()); + + // return rewrite properties + return prop; } -/* -on 83 -DEBUG: message post values = {youare=Ty2F86ekSWM5, key=pPQSZaXD, iam=WSjicAx1hRio, process=permission} -von 93 wurde gesendet: -DEBUG: PUT BODY=------------1090394265522 -Content-Disposition: form-data; name="youare" - -Ty2F86ekSWM5 -------------1090394265522 -Content-Disposition: form-data; name="key" - -pPQSZaXD -------------1090394265522 -Content-Disposition: form-data; name="iam" - -WSjicAx1hRio -------------1090394265522 -Content-Disposition: form-data; name="process" - -permission -------------1090394265522 - - -on 93 -DEBUG: message post values = {youare=WSjicAx1hRio, key=YJZLwaNS, iam=Ty2F86ekSWM5, process=permission} - - */ + + + /* + * To: #[to]# + From: #[from]# + Subject: #[subject]# + Date: #[date]# + + #[message]# + */ + private static void messageForwardingViaEmail(serverSwitch env, messageBoard.entry msgEntry) { + try { + if (!Boolean.valueOf(env.getConfig("msgForwardingEnabled","false")).booleanValue()) return; + + // getting the sendmail configuration + String sendMailStr = env.getConfig("msgForwardingCmd","/usr/bin/sendmail -t"); + String[] sendMail = sendMailStr.trim().split(" "); + + // getting the recipient address + String sendMailTo = env.getConfig("msgForwardingTo","root@localhost").trim(); + + // building the message text + StringBuffer emailTxt = new StringBuffer(); + emailTxt.append("To: ") + .append(sendMailTo) + .append("\nFrom: ") + .append("yacy@") + .append(yacyCore.seedDB.mySeed.getName()) + .append("\nSubject: [YaCy] ") + .append(msgEntry.subject()) + .append("\nDate: ") + .append(msgEntry.date()) + .append("\n") + .append("\nMessage from: ") + .append(msgEntry.author()) + .append("/") + .append(msgEntry.authorHash()) + .append("\nMessage to: ") + .append(msgEntry.recipient()) + .append("/") + .append(msgEntry.recipientHash()) + .append("\nCategory: ") + .append(msgEntry.category()) + .append("\n===================================================================\n") + .append(new String(msgEntry.message())); + + Process process=Runtime.getRuntime().exec(sendMail); + PrintWriter email = new PrintWriter(process.getOutputStream()); + email.print(emailTxt.toString()); + email.close(); + } catch (Exception e) { + yacyCore.log.logWarning("message: message forwarding via email failed. ",e); + } + + } + + + /* + on 83 + DEBUG: message post values = {youare=Ty2F86ekSWM5, key=pPQSZaXD, iam=WSjicAx1hRio, process=permission} + von 93 wurde gesendet: + DEBUG: PUT BODY=------------1090394265522 + Content-Disposition: form-data; name="youare" + + Ty2F86ekSWM5 + ------------1090394265522 + Content-Disposition: form-data; name="key" + + pPQSZaXD + ------------1090394265522 + Content-Disposition: form-data; name="iam" + + WSjicAx1hRio + ------------1090394265522 + Content-Disposition: form-data; name="process" + + permission + ------------1090394265522 + + + on 93 + DEBUG: message post values = {youare=WSjicAx1hRio, key=YJZLwaNS, iam=Ty2F86ekSWM5, process=permission} + + */ } diff --git a/source/de/anomic/http/httpd.java b/source/de/anomic/http/httpd.java index 54a8599b4..0b637c993 100644 --- a/source/de/anomic/http/httpd.java +++ b/source/de/anomic/http/httpd.java @@ -517,9 +517,14 @@ public final class httpd implements serverHandler { this.log.logInfo("Interruption detected"); } else { String errorMsg = e.getMessage(); - if ((errorMsg != null) && (errorMsg.startsWith("Broken pipe") || errorMsg.startsWith("Connection reset"))) { - // client closed the connection, so we just end silently - this.log.logInfo("Client unexpectedly closed connection"); + if (errorMsg != null) { + if (errorMsg.startsWith("Socket closed")) { + this.log.logInfo("httpd shutdown detected ..."); + } + else if ((errorMsg.startsWith("Broken pipe") || errorMsg.startsWith("Connection reset"))) { + // client closed the connection, so we just end silently + this.log.logInfo("Client unexpectedly closed connection"); + } } else { this.log.logError("Unexpected Error. " + e.getClass().getName() + ": " + e.getMessage(),e); } diff --git a/yacy.init b/yacy.init index 2859e357d..74b8dbb76 100644 --- a/yacy.init +++ b/yacy.init @@ -489,3 +489,9 @@ portForwardingPort= portForwardingUser= portForwardingPwd= +# Specifies if yacy should forward received messages via +# email to the configured email address +msgForwardingEnabled=false +msgForwardingCmd=/usr/sbin/sendmail -t +msgForwardingTo=root@localhost +