From a39c00a93f375894436a7d88f9ef48f1c06a3623 Mon Sep 17 00:00:00 2001 From: reger Date: Sun, 9 Apr 2017 02:09:32 +0200 Subject: [PATCH] add servlet to list user in UserDB and made user editor available in separate servlet for a quick and easy overview of configured user and selection for edit. --- htroot/ConfigAccountList_p.html | 29 ++++++ htroot/ConfigAccountList_p.java | 103 +++++++++++++++++++ htroot/ConfigAccounts_p.html | 2 +- htroot/ConfigAccounts_p.java | 4 +- htroot/ConfigUser_p.html | 67 +++++++++++++ htroot/ConfigUser_p.java | 172 ++++++++++++++++++++++++++++++++ 6 files changed, 374 insertions(+), 3 deletions(-) create mode 100644 htroot/ConfigAccountList_p.html create mode 100644 htroot/ConfigAccountList_p.java create mode 100644 htroot/ConfigUser_p.html create mode 100644 htroot/ConfigUser_p.java diff --git a/htroot/ConfigAccountList_p.html b/htroot/ConfigAccountList_p.html new file mode 100644 index 000000000..036a56502 --- /dev/null +++ b/htroot/ConfigAccountList_p.html @@ -0,0 +1,29 @@ + + + + YaCy '#[clientname]#': User Accounts + #%env/templates/metas.template%# + + + + #%env/templates/header.template%# + #%env/templates/submenuUseCaseAccount.template%# +

User List

+ +
User Accounts + + + + + #{userlist}# + + + + #{/userlist}# +
UserFirst nameLast nameAddressLast AccessRightsTimeTraffic
#[username]##[firstname]##[lastname]##[address]##[lastaccess]##[rights]##[time]##[traffic]#
+ +
+ +#%env/templates/footer.template%# + + diff --git a/htroot/ConfigAccountList_p.java b/htroot/ConfigAccountList_p.java new file mode 100644 index 000000000..e6ee44f63 --- /dev/null +++ b/htroot/ConfigAccountList_p.java @@ -0,0 +1,103 @@ +// ConfigAccountList_p.java +// ------------------------- +// (c) 2017 by reger24; https://github.com/reger24 +// +// This is a part of YaCy, a peer-to-peer based web search engine +// +// 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 + +import java.util.Date; +import java.util.Iterator; +import net.yacy.cora.date.GenericFormatter; +import net.yacy.cora.protocol.RequestHeader; +import net.yacy.data.UserDB; +import net.yacy.data.UserDB.AccessRight; +import net.yacy.search.Switchboard; +import net.yacy.server.serverObjects; +import net.yacy.server.serverSwitch; + +public class ConfigAccountList_p { + + public static serverObjects respond(@SuppressWarnings("unused") final RequestHeader header, final serverObjects post, final serverSwitch env) { + + final serverObjects prop = new serverObjects(); + final Switchboard sb = (Switchboard) env; + UserDB.Entry entry; + + if (sb.userDB == null) { + prop.put("userlist", 0); + return prop; + } + + //Generate Userlist + final Iterator it = sb.userDB.iterator(true); + int numUsers = 0; + while (it.hasNext()) { + entry = it.next(); + if (entry == null) { + continue; + } + prop.putHTML("userlist_" + numUsers + "_username", entry.getUserName()); + prop.putHTML("userlist_" + numUsers + "_lastname", entry.getLastName()); + prop.putHTML("userlist_" + numUsers + "_firstname", entry.getFirstName()); + prop.putHTML("userlist_" + numUsers + "_address", entry.getAddress()); + if (entry.getLastAccess() != null) { + prop.put("userlist_" + numUsers + "_lastaccess", GenericFormatter.FORMAT_SIMPLE.format(new Date(entry.getLastAccess()))); + } else { + prop.put("userlist_" + numUsers + "_lastaccess", "never"); + } + + final AccessRight[] rights = AccessRight.values(); + String rightStr = ""; + for (final AccessRight right : rights) { + if (entry.hasRight(right)) { + if (rightStr.isEmpty()) { + rightStr = right.getFriendlyName(); + } else { + rightStr += ", " + right.getFriendlyName(); + } + } + } + prop.putHTML("userlist_" + numUsers + "_rights", rightStr); + + long percent; + if (entry.getTrafficLimit() != null) { + long limit = entry.getTrafficLimit(); + long used = entry.getTrafficSize(); + percent = used * 100 / limit; + prop.put("userlist_" + numUsers + "_time", percent); + } else { + prop.put("userlist_" + numUsers + "_time", ""); + } + + percent = -1; + if (entry.getTimeLimit() > 0) { + long limit = entry.getTimeLimit(); + long used = entry.getTimeUsed(); + percent = used * 100 / limit; + prop.put("userlist_" + numUsers + "_traffic", percent); + } else { + prop.put("userlist_" + numUsers + "_traffic", ""); + } + + + numUsers++; + } + prop.put("userlist", numUsers); + + // return rewrite properties + return prop; + } +} diff --git a/htroot/ConfigAccounts_p.html b/htroot/ConfigAccounts_p.html index 450e75f78..4a95fc370 100644 --- a/htroot/ConfigAccounts_p.html +++ b/htroot/ConfigAccounts_p.html @@ -84,7 +84,7 @@ + or goto user account list
 
diff --git a/htroot/ConfigAccounts_p.java b/htroot/ConfigAccounts_p.java index 61bba4489..2b5a39f88 100644 --- a/htroot/ConfigAccounts_p.java +++ b/htroot/ConfigAccounts_p.java @@ -55,7 +55,7 @@ public class ConfigAccounts_p { /* Acquire a transaction token for the next POST form submission */ prop.put(TransactionManager.TRANSACTION_TOKEN_PARAM, TransactionManager.getTransactionToken(header)); - final Switchboard sb = Switchboard.getSwitchboard(); + final Switchboard sb = (Switchboard) env; UserDB.Entry entry = null; // admin password @@ -306,4 +306,4 @@ public class ConfigAccounts_p { // return rewrite properties return prop; } - } +} diff --git a/htroot/ConfigUser_p.html b/htroot/ConfigUser_p.html new file mode 100644 index 000000000..e284f984f --- /dev/null +++ b/htroot/ConfigUser_p.html @@ -0,0 +1,67 @@ + + + + YaCy '#[clientname]#': User Editor + #%env/templates/metas.template%# + + + #%env/templates/header.template%# + #%env/templates/submenuUseCaseAccount.template%# +

User Account Editor

+ + + #(text)# + :: +

User created: #[username]#

+ :: +

User changed: #[username]#

+ #(/text)# + #(error)# + :: +

Generic error.

+ :: +

Passwords do not match.

+ :: +

Username too short. Username must be >= 4 Characters.

+ :: +

Username already used (not allowed).

+ #(/error)# + +
+
Edit current user: #[username]# + + +
+
:
+
+
:
+
+
:
+
+
:
+
+
:
+
+
:
+
+
Rights:
+
+ #{rights}# +
+ #{/rights}# +
+
:
+
+
:
+
+
 
+
+ +
+
+
+
+ +#%env/templates/footer.template%# + + diff --git a/htroot/ConfigUser_p.java b/htroot/ConfigUser_p.java new file mode 100644 index 000000000..4572a1ae4 --- /dev/null +++ b/htroot/ConfigUser_p.java @@ -0,0 +1,172 @@ +// ConfigUser_p.java +// ----------------------- +// (c) 2017 by reger24; https://github.com/reger24 +// +// This is a part of YaCy, a peer-to-peer based web search engine +// +// 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 + +import java.util.EnumMap; +import java.util.Map; +import net.yacy.cora.order.Digest; +import net.yacy.cora.protocol.RequestHeader; +import net.yacy.cora.util.ConcurrentLog; +import net.yacy.data.UserDB; +import net.yacy.data.UserDB.AccessRight; +import net.yacy.search.Switchboard; +import net.yacy.search.SwitchboardConstants; +import net.yacy.server.serverObjects; +import net.yacy.server.serverSwitch; + +public class ConfigUser_p { + + public static serverObjects respond(@SuppressWarnings("unused") final RequestHeader header, final serverObjects post, final serverSwitch env) { + + final serverObjects prop = new serverObjects(); + final Switchboard sb = (Switchboard) env; + + if (post != null && post.containsKey("cancel")) { + prop.put(serverObjects.ACTION_LOCATION, "ConfigAccountList_p.html"); + return prop; + } + + //default values + prop.put("current_user", "newuser"); + prop.put("username", ""); + prop.put("firstname", ""); + prop.put("lastname", ""); + prop.put("address", ""); + prop.put("timelimit", ""); + prop.put("timeused", ""); + + final AccessRight[] rights = AccessRight.values(); + int c = 0; + for (final AccessRight right : rights) { + prop.put("rights_" + c + "_name", right.toString()); + prop.put("rights_" + c + "_friendlyName", right.getFriendlyName()); + prop.put("rights_" + c + "_set", "0"); + c++; + } + prop.put("rights", c); + + prop.put("users", "0"); + + if (sb.userDB == null) { + return prop; + } + + if (post == null) { + //do nothing + } else if (post.containsKey("user") && !"newuser".equals(post.get("user"))) { + + UserDB.Entry entry = sb.userDB.getEntry(post.get("user")); + if (entry != null) { + //TODO: set username read-only in html + prop.putHTML("current_user", entry.getUserName()); + prop.putHTML("username", entry.getUserName()); + prop.putHTML("firstname", entry.getFirstName()); + prop.putHTML("lastname", entry.getLastName()); + prop.putHTML("address", entry.getAddress()); + prop.put("timelimit", entry.getTimeLimit()); + prop.put("timeused", entry.getTimeUsed()); + int count = 0; + for (final AccessRight right : rights) { + prop.put("rights_" + count + "_set", entry.hasRight(right) ? "1" : "0"); + count++; + } + prop.put("rights", count); + } + } else if (post.containsKey("change")) { // edit User + prop.put("text", "0"); + prop.put("error", "0"); + + final String username = post.get("username"); + final String pw1 = post.get("password"); + final String pw2 = post.get("password2"); + + if (pw1 == null || !pw1.equals(pw2)) { + prop.put("error", "2"); //PW does not match + return prop; + } + // do not allow same username as staticadmin + if (username.equalsIgnoreCase(sb.getConfig(SwitchboardConstants.ADMIN_ACCOUNT_USER_NAME, "admin"))) { + prop.put("error", "4"); + return prop; + } + final String firstName = post.get("firstname"); + final String lastName = post.get("lastname"); + final String address = post.get("address"); + final String timeLimit = post.get("timelimit"); + final String timeUsed = post.get("timeused"); + final Map rightsSet = new EnumMap(AccessRight.class); + + for (final AccessRight right : rights) { + rightsSet.put(right, post.containsKey(right.toString()) && "on".equals(post.get(right.toString())) ? "true" : "false"); + } + + UserDB.Entry entry = sb.userDB.getEntry(username); + + if (entry != null) { + try { + if (!"".equals(pw1)) { + // with prefix of encoding method (supported MD5: ) + entry.setProperty(UserDB.Entry.MD5ENCODED_USERPWD_STRING, "MD5:" + Digest.encodeMD5Hex(username + ":" + sb.getConfig(SwitchboardConstants.ADMIN_REALM, "YaCy") + ":" + pw1)); + } + + entry.setProperty(UserDB.Entry.USER_FIRSTNAME, firstName); + entry.setProperty(UserDB.Entry.USER_LASTNAME, lastName); + entry.setProperty(UserDB.Entry.USER_ADDRESS, address); + entry.setProperty(UserDB.Entry.TIME_LIMIT, timeLimit); + entry.setProperty(UserDB.Entry.TIME_USED, timeUsed); + + for (final AccessRight right : rights) { + entry.setProperty(right.toString(), rightsSet.get(right)); + } + + //TODO: set username read-only in html + prop.putHTML("current_user", entry.getUserName()); + prop.putHTML("username", entry.getUserName()); + prop.putHTML("firstname", entry.getFirstName()); + prop.putHTML("lastname", entry.getLastName()); + prop.putHTML("address", entry.getAddress()); + prop.put("timelimit", entry.getTimeLimit()); + prop.put("timeused", entry.getTimeUsed()); + int count = 0; + for (final AccessRight right : rights) { + prop.put("rights_" + count + "_set", entry.hasRight(right) ? "1" : "0"); + count++; + } + prop.put("rights", count); + + } catch (final Exception e) { + ConcurrentLog.logException(e); + } + + } else { + prop.put("error", "1"); + } + prop.putHTML("text_username", username); + prop.put("text", "2"); + + prop.putHTML("username", username); + } else if (post.containsKey("delete")) { + sb.userDB.removeEntry(post.get("username")); + prop.put(serverObjects.ACTION_LOCATION, "ConfigAccountList_p.html"); // jump back to user list + } + + // return rewrite properties + return prop; + } +}