*) adding possibility to forward received yacy-messages (htroot/yacy/message.java)

via a command-line email program (e.g. sendmail) to a configured email address
   - the configuration dialog is reachable via Settings_p.html#messageForwarding

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@332 6c8d7289-2bf4-0310-a012-ef5d649a1542
pull/1/head
theli 20 years ago
parent 24d77b892f
commit 9d8c66fb5e

@ -80,7 +80,7 @@ Parsing of the following mime-types was enabled:<br>
<li><font color="#556699">#[enabledMime]#</font></li>
#{/parser}#
</ul>
::
::<!-- 19 -->
Seed Upload method was changed successfully.
#(success)#::<br>You are now a principal peer.#(/success)#
<p>
@ -88,18 +88,34 @@ Seed Upload method was changed successfully.
<tr><td>Seed Upload Method:</td><td><font color="#556699">#[seedUploadMethod]#</font></td></tr>
<tr><td>Seed File URL:</td><td><a href="#[seedURL]#"><font color="#556699">#[seedURL]#</font></a></td></tr>
</table>
::
::<!-- 20 -->
<p><b>Your proxy networking settings have been changed.</b></p>
<table>
<tr>
<td>Transparent Proxy Support is:</td>
<td>Transparent Proxy Support is:</td>
<td><font color="#556699"><b>#[isTransparentProxy]#</b></font></td>
</tr>
<tr>
<td>Connection Keep-Alive Support is:</td>
<td><font color="#556699"><b>#[connectionKeepAliveSupport]#</b></font></td>
</tr>
</table>
<td>Connection Keep-Alive Support is:</td>
<td><font color="#556699"><b>#[connectionKeepAliveSupport]#</b></font></td>
</tr>
</table>
::<!-- 21: message forwarding -->
<p><b>Your message forwarding settings have been changed.</b></p>
<table>
<tr>
<td>Message Forwarding Support is:</td>
<td><font color="#556699"><b>#[msgForwardingEnabled]#</b></font></td>
</tr>
<tr>
<td>Message Forwarding Command:</td>
<td><font color="#556699"><b>#[msgForwardingCmd]#</b></font></td>
</tr>
<tr>
<td>Recipient Address:</td>
<td><font color="#556699"><b>#[msgForwardingTo]#</b></font></td>
</tr>
</table>
#(/info)#
</p>
<p>You can now go back to the <a href="Settings_p.html">Settings</a> page if you want to make more changes.</p>

@ -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");

@ -30,11 +30,11 @@ delete the file 'DATA/SETTINGS/httpProxy.conf' in the YaCy application root fold
</tr>
<tr>
<td><img src="env/grafics/down.gif" alt="down"><a href="#http">HTTP Networking</a></td>
<td><img src="env/grafics/down.gif" alt="down"><a href="#parser">Content Parser Settings</a></td>
<td><img src="env/grafics/down.gif" alt="down"><a href="#messageForwarding">Message Forwarding</a></td>
</tr>
<tr>
<td><img src="env/grafics/down.gif" alt="down"><a href="#proxy">Remote Proxy (optional)</a></td>
<td>&nbsp;</td>
<td><img src="env/grafics/down.gif" alt="down"><a href="#parser">Content Parser Settings</a></td>
</tr>
</table>
@ -265,6 +265,37 @@ but only if there had been changes to the seed-list.
#{/seedUploadMethods}#
</fieldset>
<br>
<p><form action="SettingsAck_p.html" method="post" enctype="multipart/form-data">
<fieldset><legend id="messageForwarding">Message Forwarding</legend>
<p>With this settings you can activate or deactivate forwarding of yacy-messages via email.
<p>
<table border="0" cellspacing="5">
<tr valign="top">
<td>Enable message forwarding:</td>
<td><input type="checkbox" name="msgForwardingEnabled" align="top" #(msgForwardingEnabled)#::checked#(/msgForwardingEnabled)#></td>
<td><i>Enabling/Disabling message forwarding via email.</td>
</tr>
<tr valign="top">
<td>Forwarding Command:</td>
<td><input name="msgForwardingCmd" type="text" size="32" maxlength="128" value="#[msgForwardingCmd]#"></td>
<td><i>The command-line program that should be used to forward the message.<br>e.g.:</i>&nbsp;<code>/usr/sbin/sendmail -t</code></td>
</tr>
<tr valign="top">
<td>Forwarding To:</td>
<td><input name="msgForwardingTo" type="text" size="32" maxlength="128" value="#[msgForwardingTo]#"></td>
<td><i>The recipient email-address.<br> e.g.:</i>&nbsp;<code>root@localhost</code></td>
</tr>
<tr valign="top">
<td></td>
<td colspan="2"><input type="submit" name="msgForwarding" value="submit">&nbsp;<i>Changes will take effect immediately.</i></td>
</tr>
</table>
</fieldset>
</form><br>
<br>
<p><form action="SettingsAck_p.html" method="post" enctype="multipart/form-data">
<fieldset><legend id="parser">Content Parser Settings</legend>

@ -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

@ -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}
*/
}

@ -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);
}

@ -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

Loading…
Cancel
Save