From 49564a38784f5a249f3a08f38a2f0bb7172f8f9e Mon Sep 17 00:00:00 2001 From: jrandom <jrandom> Date: Fri, 11 Nov 2005 11:29:15 +0000 Subject: [PATCH] 2005-11-11 jrandom * Default Syndie to single user mode, and automatically log into a default user account (additional accounts can be logged into with the 'switch' or login pages, and new accounts can be created with the register page). * Disable the 'automated' column on the Syndie addressbook unless the user is appropriately authorized (good idea Polecat!) --- .../java/src/net/i2p/syndie/BlogManager.java | 61 ++++++++++++++++++- apps/syndie/java/src/net/i2p/syndie/User.java | 19 +++++- .../src/net/i2p/syndie/web/RSSServlet.java | 3 +- .../i2p/syndie/web/ViewThreadedServlet.java | 10 ++- apps/syndie/jsp/addresses.jsp | 12 ++-- apps/syndie/jsp/switchuser.jsp | 1 + history.txt | 9 ++- 7 files changed, 98 insertions(+), 17 deletions(-) diff --git a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java index 5189437c20..56a90377e8 100644 --- a/apps/syndie/java/src/net/i2p/syndie/BlogManager.java +++ b/apps/syndie/java/src/net/i2p/syndie/BlogManager.java @@ -232,7 +232,7 @@ public class BlogManager { Properties userProps = loadUserProps(files[i]); if (userProps == null) continue; - User user = new User(); + User user = new User(_context); user.load(userProps); if (blog.equals(user.getBlog())) return user; @@ -252,7 +252,7 @@ public class BlogManager { Properties userProps = loadUserProps(files[i]); if (userProps == null) continue; - User user = new User(); + User user = new User(_context); user.load(userProps); rv.add(user); } @@ -281,6 +281,15 @@ public class BlogManager { } } + public User login(String login, String pass) { + User u = new User(_context); + String ok = login(u, login, pass); + if (User.LOGIN_OK.equals(ok)) + return u; + else + return new User(_context); + } + public String login(User user, String login, String pass) { if ( (login == null) || (pass == null) ) return "<span class=\"b_loginMsgErr\">Login not specified</span>"; Hash userHash = _context.sha().calculateHash(DataHelper.getUTF8(login)); @@ -331,12 +340,15 @@ public class BlogManager { return true; } + private static final boolean DEFAULT_IS_SINGLEUSER = true; + /** * If true, this syndie instance is meant for just one local user, so we don't need * to password protect registration, remote.jsp, or admin.jsp * */ public boolean isSingleUser() { + if (!isConfigured()) return DEFAULT_IS_SINGLEUSER; String isSingle = _context.getProperty("syndie.singleUser"); return ( (isSingle != null) && (Boolean.valueOf(isSingle).booleanValue()) ); } @@ -417,6 +429,51 @@ public class BlogManager { return true; } + private static final String DEFAULT_LOGIN = "default"; + private static final String DEFAULT_PASS = ""; + + public User getDefaultUser() { + User user = new User(_context); + getDefaultUser(user); + return user; + } + public void getDefaultUser(User user) { + if (isSingleUser()) { + Hash userHash = _context.sha().calculateHash(DataHelper.getUTF8(DEFAULT_LOGIN)); + File userFile = new File(_userDir, Base64.encode(userHash.getData())); + if (_log.shouldLog(Log.INFO)) + _log.info("Attempting to login to the default user: " + userFile.getAbsolutePath()); + + if (userFile.exists()) { + Properties props = loadUserProps(userFile); + if (props == null) { + user.invalidate(); + _log.error("Error reading the default user file: " + userFile); + return; + } + String ok = user.login(DEFAULT_LOGIN, DEFAULT_PASS, props); + if (User.LOGIN_OK.equals(ok)) { + return; + } else { + user.invalidate(); + _log.error("Error logging into the default user: " + ok); + return; + } + } else { + String ok = register(user, DEFAULT_LOGIN, DEFAULT_PASS, "", "default", "Default Syndie blog", ""); + if (User.LOGIN_OK.equals(ok)) { + _log.info("Default user created: " + user); + return; + } else { + user.invalidate(); + _log.error("Error registering the default user: " + ok); + return; + } + } + } else { + return; + } + } public boolean authorizeAdmin(String pass) { if (isSingleUser()) return true; diff --git a/apps/syndie/java/src/net/i2p/syndie/User.java b/apps/syndie/java/src/net/i2p/syndie/User.java index 4a71d85871..bc848e3fd9 100644 --- a/apps/syndie/java/src/net/i2p/syndie/User.java +++ b/apps/syndie/java/src/net/i2p/syndie/User.java @@ -43,9 +43,24 @@ public class User { private boolean _importAddresses; static final String PROP_USERHASH = "__userHash"; - + + /** + * Ugly hack to fetch the default User instance - this is the default + * constructor so it can be used as a bean on the web interface. If + * the Syndie instance isn't in single user mode, the default User + * is an empty unauthenticated User. If the instance IS in single user + * mode, this will contain the logged in 'default' user (creating a new + * one as necessary). If you just want to create a User object, use the + * new User(I2PAppContext ctx) constructor. + * + */ public User() { - _context = I2PAppContext.getGlobalContext(); + this(I2PAppContext.getGlobalContext()); + BlogManager.instance().getDefaultUser(this); + } + + public User(I2PAppContext ctx) { + _context = ctx; init(); } private void init() { diff --git a/apps/syndie/java/src/net/i2p/syndie/web/RSSServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/RSSServlet.java index 5c6a3a1055..973b845d63 100644 --- a/apps/syndie/java/src/net/i2p/syndie/web/RSSServlet.java +++ b/apps/syndie/java/src/net/i2p/syndie/web/RSSServlet.java @@ -28,8 +28,7 @@ public class RSSServlet extends HttpServlet { if (user == null) { String login = req.getParameter("login"); String pass = req.getParameter("password"); - user = new User(); - BlogManager.instance().login(user, login, pass); // ignore failures - user will just be unauthorized + user = BlogManager.instance().login(login, pass); // ignore failures - user will just be unauthorized if (!user.getAuthenticated()) user.invalidate(); } diff --git a/apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java b/apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java index 81b4384201..50875ae76b 100644 --- a/apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java +++ b/apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java @@ -35,20 +35,18 @@ public class ViewThreadedServlet extends HttpServlet { if (user == null) { if ("Login".equals(action)) { - user = new User(); - BlogManager.instance().login(user, login, pass); // ignore failures - user will just be unauthorized + user = BlogManager.instance().login(login, pass); // ignore failures - user will just be unauthorized if (!user.getAuthenticated()) user.invalidate(); } else { user = new User(); - BlogManager.instance().login(user, login, pass); // ignore failures - user will just be unauthorized } forceNewIndex = true; } else if ("Login".equals(action)) { + user = BlogManager.instance().login(login, pass); // ignore failures - user will just be unauthorized + forceNewIndex = true; + } else if ("Logout".equals(action)) { user = new User(); - BlogManager.instance().login(user, login, pass); // ignore failures - user will just be unauthorized - if (!user.getAuthenticated()) - user.invalidate(); forceNewIndex = true; } diff --git a/apps/syndie/jsp/addresses.jsp b/apps/syndie/jsp/addresses.jsp index 5e9835efe6..17b7fc875a 100644 --- a/apps/syndie/jsp/addresses.jsp +++ b/apps/syndie/jsp/addresses.jsp @@ -166,10 +166,14 @@ if (!user.getAuthenticated()) { if (name.getIsPublic()) buf.append("checked=\"true\" "); buf.append(" /></td>"); - buf.append("<td class=\"b_scheduled\"><input class=\"b_scheduled\" type=\"checkbox\" name=\"scheduleSyndication\" value=\"true\" "); - if (BlogManager.instance().syndicationScheduled(name.getLocation())) - buf.append("checked=\"true\" "); - buf.append(" /></td>"); + if (BlogManager.instance().authorizeRemote(user)) { + buf.append("<td class=\"b_scheduled\"><input class=\"b_scheduled\" type=\"checkbox\" name=\"scheduleSyndication\" value=\"true\" "); + if (BlogManager.instance().syndicationScheduled(name.getLocation())) + buf.append("checked=\"true\" "); + buf.append(" /></td>"); + } else { + buf.append("<td class=\"b_scheduled\"><input class=\"b_scheduled\" type=\"checkbox\" name=\"scheduleSyndication\" value=\"false\" disabled=\"true\" /></td>\n"); + } buf.append("<td class=\"b_addrGroup\"><input class=\"b_addrGroup\" type=\"text\" name=\"groups\" size=\"10\" value=\""); for (int j = 0; j < name.getGroupCount(); j++) { buf.append(HTMLRenderer.sanitizeTagParam(name.getGroup(j))); diff --git a/apps/syndie/jsp/switchuser.jsp b/apps/syndie/jsp/switchuser.jsp index 64a31219f8..b5d21ac773 100644 --- a/apps/syndie/jsp/switchuser.jsp +++ b/apps/syndie/jsp/switchuser.jsp @@ -12,5 +12,6 @@ Syndie login: <input type="text" name="login" /><br /> Password: <input type="password" name="password" /><br /> <input type="submit" name="action" value="Login" /> <input type="submit" name="action" value="Cancel" /> +<input type="submit" name="action" value="Logout" /> </form> </body> \ No newline at end of file diff --git a/history.txt b/history.txt index 9702a31feb..3fbe1489ed 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,11 @@ -$Id: history.txt,v 1.316 2005/11/06 17:25:18 jrandom Exp $ +$Id: history.txt,v 1.317 2005/11/10 22:46:36 jrandom Exp $ + +2005-11-11 jrandom + * Default Syndie to single user mode, and automatically log into a default + user account (additional accounts can be logged into with the 'switch' + or login pages, and new accounts can be created with the register page). + * Disable the 'automated' column on the Syndie addressbook unless the user + is appropriately authorized (good idea Polecat!) 2005-11-10 jrandom * First pass to a new threaded Syndie interface, which isn't enabled by -- GitLab