fixed news receipt and added processing buttons on News page

git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@458 6c8d7289-2bf4-0310-a012-ef5d649a1542
This commit is contained in:
orbiter 2005-07-30 07:15:39 +00:00
parent 84b74d40f3
commit 849b194149
12 changed files with 152 additions and 43 deletions

View File

@ -3,7 +3,7 @@ javacSource=1.4
javacTarget=1.4 javacTarget=1.4
# Release Configuration # Release Configuration
releaseVersion=0.392 releaseVersion=0.393
releaseFile=yacy_dev_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz releaseFile=yacy_dev_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz
#releaseFile=yacy_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz #releaseFile=yacy_v${releaseVersion}_${DSTAMP}_${releaseNr}.tar.gz
releaseDir=yacy_dev_v${releaseVersion}_${DSTAMP}_${releaseNr} releaseDir=yacy_dev_v${releaseVersion}_${DSTAMP}_${releaseNr}

View File

@ -96,7 +96,7 @@ public class EditProfile_p {
// generate a news message // generate a news message
//HashMap map = new HashMap(); //HashMap map = new HashMap();
yacyCore.newsPool.enqueueMyNews(new yacyNewsRecord("updprfle", profile)); yacyCore.newsPool.publishMyNews(new yacyNewsRecord("updprfle", profile));
}catch(IOException e){ }catch(IOException e){
} finally { } finally {
if (fileOut != null) try { fileOut.close(); } catch (Exception e) {} if (fileOut != null) try { fileOut.close(); } catch (Exception e) {}

View File

@ -40,8 +40,12 @@ This is the news system (currently under testing).
</p> </p>
:: ::
<p> <p>
<form action="News.html" method="post" enctype="multipart/form-data">
<input type="hidden" name="page" value="#[page]#">
<input type="submit" name="delete" value="#(page)#::Process Selected News::Delete Selected News::Abort Publication of Selected News::Delete Selected News#(/page)#"><br><br>
<table border="0" cellpadding="2" cellspacing="1"> <table border="0" cellpadding="2" cellspacing="1">
<tr class="TableHeader" valign="bottom"> <tr class="TableHeader" valign="bottom">
<td class="small"></td>
<td class="small">Originator</td> <td class="small">Originator</td>
<td class="small">Created</td> <td class="small">Created</td>
<td class="small">Category</td> <td class="small">Category</td>
@ -51,6 +55,7 @@ This is the news system (currently under testing).
</tr> </tr>
#{list}# #{list}#
<tr class="TableCell#(dark)#Light::Dark::Summary#(/dark)#"> <tr class="TableCell#(dark)#Light::Dark::Summary#(/dark)#">
<td class="small" align="left"><input type="checkbox" name="del_#[id]#"></td>
<td class="small" align="left">#[ori]#</td> <td class="small" align="left">#[ori]#</td>
<td class="small" align="left">#[cre]#</td> <td class="small" align="left">#[cre]#</td>
<td class="small" align="left">#[cat]#</td> <td class="small" align="left">#[cat]#</td>
@ -60,6 +65,7 @@ This is the news system (currently under testing).
</tr> </tr>
#{/list}# #{/list}#
</table> </table>
</form>
</p> </p>
#(/table)# #(/table)#
#[footer]# #[footer]#

View File

@ -54,23 +54,50 @@ import de.anomic.server.serverDate;
import de.anomic.yacy.yacyCore; import de.anomic.yacy.yacyCore;
import de.anomic.yacy.yacySeed; import de.anomic.yacy.yacySeed;
import de.anomic.yacy.yacyNewsRecord; import de.anomic.yacy.yacyNewsRecord;
import de.anomic.plasma.plasmaSwitchboard;
public class News { public class News {
public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch sb) { public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) {
// return variable that accumulates replacements plasmaSwitchboard switchboard = (plasmaSwitchboard) env;
serverObjects prop = new serverObjects(); serverObjects prop = new serverObjects();
boolean overview = (post == null) || (((String) post.get("page", "0")).equals("0")); boolean overview = (post == null) || (((String) post.get("page", "0")).equals("0"));
int tableID = (overview) ? -1 : Integer.parseInt((String) post.get("page", "0")) - 1;
// execute commands
if (post != null) {
if (switchboard.adminAuthenticated(header) < 2) {
// not authenticated, force log-in
prop.put("AUTHENTICATE", "admin log-in");
return prop;
}
if ((post.containsKey("delete")) && (tableID >= 0)) {
Enumeration e = post.keys();
String check;
String id;
while (e.hasMoreElements()) {
check = (String) e.nextElement();
if ((check.startsWith("del_")) && (post.get(check, "off").equals("on"))) {
id = check.substring(4);
try {
yacyCore.newsPool.moveOff(tableID, id);
} catch (IOException ee) {ee.printStackTrace();}
}
}
}
}
// generate properties for output
if (overview) { if (overview) {
// show overview // show overview
prop.put("table", 0); prop.put("table", 0);
prop.put("page", 0); prop.put("page", 0);
} else { } else {
// generate table // generate table
int tableID = Integer.parseInt((String) post.get("page", "1")) - 1;
prop.put("table", 1); prop.put("table", 1);
prop.put("page", tableID + 1); prop.put("page", tableID + 1);
prop.put("table_page", tableID + 1);
if (yacyCore.seedDB == null) { if (yacyCore.seedDB == null) {
@ -84,6 +111,7 @@ public class News {
record = yacyCore.newsPool.get(tableID, i); record = yacyCore.newsPool.get(tableID, i);
seed = yacyCore.seedDB.getConnected(record.originator()); seed = yacyCore.seedDB.getConnected(record.originator());
if (seed == null) seed = yacyCore.seedDB.getDisconnected(record.originator()); if (seed == null) seed = yacyCore.seedDB.getDisconnected(record.originator());
prop.put("table_list_" + i + "_id", record.id());
prop.put("table_list_" + i + "_ori", (seed == null) ? record.originator() : seed.getName()); prop.put("table_list_" + i + "_ori", (seed == null) ? record.originator() : seed.getName());
prop.put("table_list_" + i + "_cre", yacyCore.universalDateShortString(record.created())); prop.put("table_list_" + i + "_cre", yacyCore.universalDateShortString(record.created()));
prop.put("table_list_" + i + "_cat", record.category()); prop.put("table_list_" + i + "_cat", record.category());

View File

@ -113,10 +113,7 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http
private String[] defaultFiles = null; private String[] defaultFiles = null;
private File htDefaultPath = null; private File htDefaultPath = null;
private File htLocalePath = null; private File htLocalePath = null;
private serverSwitch switchboard; private serverSwitch switchboard;
private String adminAccountBase64MD5;
private MessageDigest md5Digest = null; private MessageDigest md5Digest = null;
public httpdFileHandler(serverSwitch switchboard) { public httpdFileHandler(serverSwitch switchboard) {
@ -179,7 +176,6 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http
for (int i = 0; i < ps.length; i++) System.out.println("PACKAGE IN PROVIDER: " + ps[i].toString()); for (int i = 0; i < ps.length; i++) System.out.println("PACKAGE IN PROVIDER: " + ps[i].toString());
*/ */
} }
adminAccountBase64MD5 = null;
// initialise an message digest for Content-MD5 support ... // initialise an message digest for Content-MD5 support ...
try { try {
@ -247,17 +243,17 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http
} }
// check permission/granted access // check permission/granted access
if ((path.endsWith("_p.html")) && String authorization = (String) requestHeader.get(httpHeader.AUTHORIZATION);
((adminAccountBase64MD5 = switchboard.getConfig("adminAccountBase64MD5", "")).length() != 0)) { String adminAccountBase64MD5 = switchboard.getConfig("adminAccountBase64MD5", "");
if ((path.endsWith("_p.html")) && (adminAccountBase64MD5.length() != 0)) {
// authentication required // authentication required
String auth = (String) requestHeader.get(httpHeader.AUTHORIZATION); if (authorization == null) {
if (auth == null) {
// no authorization given in response. Ask for that // no authorization given in response. Ask for that
httpHeader headers = getDefaultHeaders(); httpHeader headers = getDefaultHeaders();
headers.put(httpHeader.WWW_AUTHENTICATE,"Basic realm=\"admin log-in\""); headers.put(httpHeader.WWW_AUTHENTICATE,"Basic realm=\"admin log-in\"");
httpd.sendRespondHeader(conProp,out,httpVersion,401,headers); httpd.sendRespondHeader(conProp,out,httpVersion,401,headers);
return; return;
} else if (adminAccountBase64MD5.equals(serverCodings.standardCoder.encodeMD5Hex(auth.trim().substring(6)))) { } else if (adminAccountBase64MD5.equals(serverCodings.standardCoder.encodeMD5Hex(authorization.trim().substring(6)))) {
// remove brute-force flag // remove brute-force flag
serverCore.bfHost.remove(conProp.getProperty("CLIENTIP")); serverCore.bfHost.remove(conProp.getProperty("CLIENTIP"));
} else { } else {
@ -277,6 +273,14 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http
} }
} }
// handle bfHost in case we have authentified correctly
if ((authorization != null) &&
(adminAccountBase64MD5.length() != 0) &&
(adminAccountBase64MD5.equals(serverCodings.standardCoder.encodeMD5Hex(authorization.trim().substring(6))))) {
// remove brute-force flag
serverCore.bfHost.remove(conProp.getProperty("CLIENTIP"));
}
// parse arguments // parse arguments
serverObjects args = new serverObjects(); serverObjects args = new serverObjects();
int argc; int argc;
@ -409,6 +413,17 @@ public final class httpdFileHandler extends httpdAbstractHandler implements http
if (tp == null) tp = new serverObjects(); if (tp == null) tp = new serverObjects();
// check if the servlets requests authentification // check if the servlets requests authentification
if (tp.containsKey("AUTHENTICATE")) { if (tp.containsKey("AUTHENTICATE")) {
// handle brute-force protection
if (authorization != null) {
String clientIP = conProp.getProperty("CLIENTIP", "unknown-host");
serverLog.logInfo("HTTPD", "dynamic log-in for account 'admin' in http file handler for path '" + path + "' from host '" + clientIP + "'");
Integer attempts = (Integer) serverCore.bfHost.get(clientIP);
if (attempts == null)
serverCore.bfHost.put(clientIP, new Integer(1));
else
serverCore.bfHost.put(clientIP, new Integer(attempts.intValue() + 1));
}
// send authentication request to browser
httpHeader headers = getDefaultHeaders(); httpHeader headers = getDefaultHeaders();
headers.put(httpHeader.WWW_AUTHENTICATE,"Basic realm=\"" + tp.get("AUTHENTICATE", "") + "\""); headers.put(httpHeader.WWW_AUTHENTICATE,"Basic realm=\"" + tp.get("AUTHENTICATE", "") + "\"");
httpd.sendRespondHeader(conProp,out,httpVersion,401,headers); httpd.sendRespondHeader(conProp,out,httpVersion,401,headers);

View File

@ -389,8 +389,11 @@ public class yacyCore {
// include a YaCyNews record to my seed // include a YaCyNews record to my seed
try { try {
yacyNewsRecord record = newsPool.dequeueMyNews(); yacyNewsRecord record = newsPool.myPublication();
if (record != null) seedDB.mySeed.put("news", de.anomic.tools.crypt.simpleEncode(record.toString())); if (record == null)
seedDB.mySeed.put("news", "");
else
seedDB.mySeed.put("news", de.anomic.tools.crypt.simpleEncode(record.toString()));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }

View File

@ -53,12 +53,12 @@ public class yacyNewsAction implements yacyPeerAction {
public void processPeerArrival(yacySeed peer, boolean direct) { public void processPeerArrival(yacySeed peer, boolean direct) {
String recordString = peer.get("news", null); String recordString = peer.get("news", null);
System.out.println("### triggered news arrival from peer " + peer.getName() + ", news " + ((recordString == null) ? "empty" : "attached")); //System.out.println("### triggered news arrival from peer " + peer.getName() + ", news " + ((recordString == null) ? "empty" : "attached"));
if (recordString == null) return; if ((recordString == null) || (recordString.length() == 0)) return;
yacyNewsRecord record = new yacyNewsRecord(de.anomic.tools.crypt.simpleDecode(recordString, "")); yacyNewsRecord record = new yacyNewsRecord(de.anomic.tools.crypt.simpleDecode(recordString, ""));
System.out.println("### news arrival from peer " + peer.getName() + ", news=" + record.toString()); //System.out.println("### news arrival from peer " + peer.getName() + ", news=" + record.toString());
try { try {
this.pool.enqueueGlobalNews(record); this.pool.enqueueIncomingNews(record);
} catch (IOException e) {e.printStackTrace();} } catch (IOException e) {e.printStackTrace();}
} }

View File

@ -102,6 +102,10 @@ public class yacyNewsDB {
return news.size(); return news.size();
} }
public void remove(String id) throws IOException {
news.remove(id.getBytes());
}
public synchronized yacyNewsRecord put(yacyNewsRecord record) throws IOException { public synchronized yacyNewsRecord put(yacyNewsRecord record) throws IOException {
try { try {
return b2r(news.put(r2b(record))); return b2r(news.put(r2b(record)));

View File

@ -64,11 +64,12 @@ public class yacyNewsPool {
maxDistribution = 30; maxDistribution = 30;
} }
public void enqueueMyNews(yacyNewsRecord record) throws IOException { public void publishMyNews(yacyNewsRecord record) throws IOException {
// this shall be called if our peer generated a new news record and wants to publish it
if (newsDB.get(record.id()) == null) outgoingNews.push(record); if (newsDB.get(record.id()) == null) outgoingNews.push(record);
} }
public yacyNewsRecord dequeueMyNews() throws IOException { public yacyNewsRecord myPublication() throws IOException {
// generate a record for next peer-ping // generate a record for next peer-ping
if (outgoingNews.size() == 0) return null; if (outgoingNews.size() == 0) return null;
yacyNewsRecord record = outgoingNews.topInc(); yacyNewsRecord record = outgoingNews.topInc();
@ -79,15 +80,13 @@ public class yacyNewsPool {
return record; return record;
} }
public void enqueueGlobalNews(yacyNewsRecord record) throws IOException { public void enqueueIncomingNews(yacyNewsRecord record) throws IOException {
// called if a news is attached to a seed
if (newsDB.get(record.id()) == null) incomingNews.push(record); if (newsDB.get(record.id()) == null) incomingNews.push(record);
} }
public yacyNewsRecord getGlobalNews(int job) throws IOException { public synchronized boolean commitIncomingNews(String id) throws IOException {
return incomingNews.top(job); // called if a incoming news was processed
}
public synchronized boolean removeGlobalNews(String id) throws IOException {
yacyNewsRecord record; yacyNewsRecord record;
for (int i = 0; i < incomingNews.size(); i++) { for (int i = 0; i < incomingNews.size(); i++) {
record = incomingNews.top(i); record = incomingNews.top(i);
@ -100,24 +99,79 @@ public class yacyNewsPool {
return false; return false;
} }
public synchronized boolean deleteProcessedNews(String id) throws IOException {
// called if a processed news shall be removed
// the news stays in the news database to prevent
// that it is loaded again from the net
yacyNewsRecord record;
for (int i = 0; i < processedNews.size(); i++) {
record = processedNews.top(i);
if (record.id().equals(id)) {
processedNews.pop(i);
return true;
}
}
return false;
}
public synchronized boolean interruptPublication(String id) throws IOException {
// called if a outgoing news shall not be published any more
yacyNewsRecord record;
for (int i = 0; i < outgoingNews.size(); i++) {
record = outgoingNews.top(i);
if (record.id().equals(id)) {
outgoingNews.pop(i);
publishedNews.push(record);
return true;
}
}
return false;
}
public synchronized boolean deletePublishedNews(String id) throws IOException {
// called if a published news shall be removed
// the news is also removed from the news database
yacyNewsRecord record;
for (int i = 0; i < publishedNews.size(); i++) {
record = publishedNews.top(i);
if (record.id().equals(id)) {
publishedNews.pop(i);
newsDB.remove(id);
return true;
}
}
return false;
}
public int size(int dbKey) { public int size(int dbKey) {
switch (dbKey) { switch (dbKey) {
case OUTGOING_DB: return outgoingNews.size();
case PUBLISHED_DB: return publishedNews.size();
case INCOMING_DB: return incomingNews.size(); case INCOMING_DB: return incomingNews.size();
case PROCESSED_DB: return processedNews.size(); case PROCESSED_DB: return processedNews.size();
case OUTGOING_DB: return outgoingNews.size();
case PUBLISHED_DB: return publishedNews.size();
default: return -1; default: return -1;
} }
} }
public yacyNewsRecord get(int dbKey, int element) throws IOException { public yacyNewsRecord get(int dbKey, int element) throws IOException {
switch (dbKey) { switch (dbKey) {
case OUTGOING_DB: return outgoingNews.top(element);
case PUBLISHED_DB: return publishedNews.top(element);
case INCOMING_DB: return incomingNews.top(element); case INCOMING_DB: return incomingNews.top(element);
case PROCESSED_DB: return processedNews.top(element); case PROCESSED_DB: return processedNews.top(element);
case OUTGOING_DB: return outgoingNews.top(element);
case PUBLISHED_DB: return publishedNews.top(element);
default: return null; default: return null;
} }
} }
public void moveOff(int dbKey, String id) throws IOException {
// this is called if a queue element shall be moved to another queue or off the queue
// it depends on the dbKey how the record is handled
switch (dbKey) {
case INCOMING_DB: commitIncomingNews(id); break;
case PROCESSED_DB: deleteProcessedNews(id); break;
case OUTGOING_DB: interruptPublication(id); break;
case PUBLISHED_DB: deletePublishedNews(id); break;
}
}
} }

View File

@ -58,9 +58,8 @@ public class yacyNewsRecord {
private int distributed; // counter that counts number of distributions of this news record private int distributed; // counter that counts number of distributions of this news record
private Map attributes; // elemets of the news for a special category private Map attributes; // elemets of the news for a special category
public yacyNewsRecord(String encodedNewsString) { public yacyNewsRecord(String newsString) {
String decodedString = serverCodings.enhancedCoder.decodeBase64String(encodedNewsString); this.attributes = serverCodings.string2map(newsString);
this.attributes = serverCodings.string2map(decodedString);
this.received = (attributes.containsKey("rec")) ? yacyCore.parseUniversalDate((String) attributes.get("rec")) : new Date(); this.received = (attributes.containsKey("rec")) ? yacyCore.parseUniversalDate((String) attributes.get("rec")) : new Date();
this.created = (attributes.containsKey("cre")) ? yacyCore.parseUniversalDate((String) attributes.get("cre")) : new Date(); this.created = (attributes.containsKey("cre")) ? yacyCore.parseUniversalDate((String) attributes.get("cre")) : new Date();
this.category = (attributes.containsKey("cat")) ? (String) attributes.get("cat") : null; this.category = (attributes.containsKey("cat")) ? (String) attributes.get("cat") : null;
@ -101,11 +100,11 @@ public class yacyNewsRecord {
public String toString() { public String toString() {
// this creates the string that shall be distributed // this creates the string that shall be distributed
// attention: this has no additional encoding // attention: this has no additional encoding
if (originator != null) attributes.put("ori", originator); if (this.originator != null) attributes.put("ori", this.originator);
if (category != null) attributes.put("cat", category); if (this.category != null) attributes.put("cat", this.category);
attributes.put("cre", yacyCore.universalDateShortString(created)); attributes.put("cre", yacyCore.universalDateShortString(this.created));
attributes.put("rec", yacyCore.universalDateShortString(received)); attributes.put("rec", yacyCore.universalDateShortString(this.received));
attributes.put("dis", "" + distributed); attributes.put("dis", "" +this. distributed);
String theString = attributes.toString(); String theString = attributes.toString();
removeStandards(); removeStandards();
return theString; return theString;

View File

@ -323,7 +323,7 @@ public class yacyPeerActions {
// this is a return of a lost peer // this is a return of a lost peer
yacyCore.log.logDebug("connect: returned KNOWN " + peerType + " peer '" + seed.getName() + "' from " + seed.getAddress()); yacyCore.log.logDebug("connect: returned KNOWN " + peerType + " peer '" + seed.getName() + "' from " + seed.getAddress());
seedDB.addConnected(seed); seedDB.addConnected(seed);
return false; return true;
} else { } else {
yacySeed connectedSeed = seedDB.getConnected(seed.hash); yacySeed connectedSeed = seedDB.getConnected(seed.hash);
if (connectedSeed != null) { if (connectedSeed != null) {
@ -337,7 +337,7 @@ public class yacyPeerActions {
} catch (java.text.ParseException e) {} } catch (java.text.ParseException e) {}
yacyCore.log.logDebug("connect: updated KNOWN " + ((direct) ? "direct " : "") + peerType + " peer '" + seed.getName() + "' from " + seed.getAddress()); yacyCore.log.logDebug("connect: updated KNOWN " + ((direct) ? "direct " : "") + peerType + " peer '" + seed.getName() + "' from " + seed.getAddress());
seedDB.addConnected(seed); seedDB.addConnected(seed);
return false; return true;
} else { } else {
// the seed is new // the seed is new
if (((String) seed.get("IP", "127.0.0.1")).equals((String) seedDB.mySeed.get("IP", "127.0.0.1"))) { if (((String) seed.get("IP", "127.0.0.1")).equals((String) seedDB.mySeed.get("IP", "127.0.0.1"))) {

View File

@ -482,7 +482,7 @@ maxWaitingWordFlush = 180
isTransparentProxy=false isTransparentProxy=false
# Specifies if yacy should use the http connection keep-alive feature # Specifies if yacy should use the http connection keep-alive feature
connectionKeepAliveSupport=false connectionKeepAliveSupport=true
# Configuration options needed to configure server port forwarding # Configuration options needed to configure server port forwarding
portForwardingEnabled=false portForwardingEnabled=false