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!)
This commit is contained in:
jrandom
2005-11-11 11:29:15 +00:00
committed by zzz
parent 12ddaff0ce
commit 49564a3878
7 changed files with 98 additions and 17 deletions

View File

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

View File

@ -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() {

View File

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

View File

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

View File

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

View File

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

View File

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