|
What this is
Other links
The source code
package net.wastl.webmail.server;
import net.wastl.webmail.xml.*;
import net.wastl.webmail.misc.*;
import net.wastl.webmail.config.*;
import net.wastl.webmail.server.http.*;
import net.wastl.webmail.exceptions.*;
import java.net.*;
import java.util.*;
import javax.mail.*;
import javax.servlet.http.*;
import org.w3c.dom.*;
import org.webengruven.webmail.auth.*;
/**
* AdminSession.java
*
* Created: Thu Sep 9 18:24:05 1999
*
* Copyright (C) 2000 Sebastian Schaffert
*
* 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.
*/
/**
*
* @author Sebastian Schaffert
* @version
*/
/* 9/24/2000 devink -- updated for new challenge/response authentication */
public class AdminSession implements HTTPSession {
/** When has the session been last accessed? */
private long last_access;
/** The session-ID for this session */
private String session_code;
/** Parent WebMailServer */
protected WebMailServer parent;
protected InetAddress remote;
private String remote_agent;
private String remote_accepts;
protected XMLAdminModel model;
protected HttpSession sess=null;
protected boolean running_as_servlet=false;
protected String selected_domain="";
protected String selected_user="";
protected boolean is_logged_out=false;
public AdminSession(WebMailServer parent, Object parm, HTTPRequestHeader h) throws InvalidPasswordException, WebMailException {
try {
Class srvltreq=Class.forName("javax.servlet.http.HttpServletRequest");
if(srvltreq.isInstance(parm)) {
running_as_servlet=true;
javax.servlet.http.HttpServletRequest req=(javax.servlet.http.HttpServletRequest)parm;
this.sess=req.getSession(false);
session_code=((javax.servlet.http.HttpSession)sess).getId();
try {
remote=InetAddress.getByName(req.getRemoteHost());
} catch(UnknownHostException e) {
try {
remote=InetAddress.getByName(req.getRemoteAddr());
} catch(Exception ex) {
try {
remote=InetAddress.getByName("localhost");
} catch(Exception ex2) {}
}
}
} else {
throw new Exception("Running as Servlet but not a valid ServletRequest");
}
} catch(Throwable t) {
this.remote=(InetAddress)parm;
session_code=Helper.calcSessionCode(remote,h);
}
doInit(parent,h);
}
protected void doInit(WebMailServer parent, HTTPRequestHeader h)
throws InvalidPasswordException, WebMailException {
this.parent=parent;
last_access=System.currentTimeMillis();
remote_agent=h.getHeader("User-Agent").replace('\n',' ');
remote_accepts=h.getHeader("Accept").replace('\n',' ');
//env=new Hashtable();
model=parent.getStorage().createXMLAdminModel();
login(h);
parent.getStorage().log(Storage.LOG_INFO,"WebMail: New Session ("+session_code+")");
setEnv();
}
public void login(HTTPRequestHeader h) throws InvalidPasswordException {
String passwd=parent.getStorage().getConfig("ADMIN PASSWORD");
if(!Helper.crypt(passwd,h.getContent("password")).equals(passwd)) {
throw new InvalidPasswordException();
}
login();
System.err.println("Ok");
}
public void login() {
setLastAccess();
setEnv();
}
public void logout() {
if(!is_logged_out) {
if(sess!=null) {
try {
sess.invalidate();
} catch(Exception ex) {}
}
if(parent.getSession(getSessionCode()) != null) {
parent.removeSession(this);
}
}
is_logged_out=true;
}
public boolean isLoggedOut() {
return is_logged_out;
}
public String getSessionCode() {
return session_code;
}
public Locale getLocale() {
return Locale.getDefault();
}
public long getLastAccess() {
return last_access;
}
public void setLastAccess() {
last_access=System.currentTimeMillis();
}
public String getEnv(String key) {
return model.getStateVar(key);
}
public void selectUser(String user) {
try {
selected_user=user;
System.err.println("Selecting user "+user);
XMLUserData ud=parent.getStorage().getUserData(user,selected_domain,"");
System.err.println("Done.");
model.importUserData(ud.getUserData());
}
catch (InvalidPasswordException e) { }
catch (UserDataException e) { }
}
public void clearUser() {
selected_user="";
model.clearUserData();
}
public void deleteUser(String user) {
parent.getStorage().deleteUserData(user,selected_domain);
// Refresh information
selectDomain(selected_domain);
}
/* 10/22/2000 devink -- added to suport new authentication changes. */
/** This does all the necessary setup to edit the currently selected
* user.
*/
public void setupUserEdit() throws WebMailException {
XMLUserData ud;
AuthDisplayMngr adm;
ud=parent.getStorage().getUserData(selected_user, selected_domain, "");
adm=parent.getStorage().getAuthenticator().getAuthDisplayMngr();
adm.setPassChangeVars(ud, model);
model.setStateVar("pass change tmpl", adm.getPassChangeTmpl());
}
public void setException(Exception ex) {
model.setException(ex);
}
/**
* Change the settings for a specific user.
* This method will check for changes to a user's configuration and save the new user configuration.
* Note that this should not be done when a user session is still active!
* @param h Header parsed from AdministratorPlugin
*/
public void changeUser(HTTPRequestHeader head) throws WebMailException {
XMLUserData user=parent.getStorage().getUserData(selected_user,selected_domain,"",false);
Enumeration contentkeys=head.getContentKeys();
user.resetBoolVars();
while(contentkeys.hasMoreElements()) {
String key=((String)contentkeys.nextElement()).toLowerCase();
if(key.startsWith("intvar")) {
try {
long value=Long.parseLong(head.getContent(key));
user.setIntVar(key.substring(7),value);
} catch(NumberFormatException ex) {
System.err.println("Warning: Remote provided illegal intvar in request header: \n("+key+","+head.getContent(key)+")");
}
} else if(key.startsWith("boolvar")) {
boolean value=head.getContent(key).toUpperCase().equals("ON");
user.setBoolVar(key.substring(8),value);
}
}
user.setSignature(head.getContent("user signature"));
user.setFullName(head.getContent("user full name"));
user.setEmail(head.getContent("user email"));
if(!head.getContent("user password").equals("")) {
net.wastl.webmail.server.Authenticator auth=parent.getStorage().getAuthenticator();
if(auth.canChangePassword()) {
try {
auth.changePassword(user,head.getContent("user password"),head.getContent("user password"));
}
catch (InvalidPasswordException e) {
/* XXX Not sure this is the right exception */
// Modified by exce, start
/**
throw new InvalidDataException(parent.getStorage().getStringResource("EX NO CHANGE PASSWORD", Locale.getDefault()));
**/
throw new InvalidDataException(parent.getStorage().getStringResource("EX NO CHANGE PASSWORD", parent.getDefaultLocale()));
// Modified by exce, end
}
} else {
throw new InvalidDataException(parent.getStorage().getStringResource("EX NO CHANGE PASSWORD",Locale.getDefault()));
}
}
user.setPreferredLocale(head.getContent("user language"));
parent.getStorage().saveUserData(selected_user,selected_domain);
selectUser(selected_user);
selectDomain(selected_domain);
}
public void selectDomain(String domain) {
model.setStateVar("selected domain",domain);
selected_domain=domain;
Enumeration enum=parent.getStorage().getUsers(domain);
model.removeAllStateVars("user");
while(enum.hasMoreElements()) {
model.addStateVar("user",(String)enum.nextElement());
}
}
public void setEnv(String key, String value) {
//env.put(key,value);
model.setStateVar(key,value);
}
public void setEnv() {
model.setStateVar("session id",session_code);
model.setStateVar("base uri",parent.getBasePath());
model.setStateVar("img base uri",parent.getBasePath());
model.setStateVar("uptime",parent.getUptime()/1000+"");
model.update();
// Here we must initialize which choices are available for ChoiceConfigParameters!
XMLSystemData sysdata=parent.getStorage().getSystemData();
sysdata.initChoices();
if(running_as_servlet) {
model.setStateVar("servlet status",parent.toString());
} else {
model.setStateVar("http server status",((StatusServer)parent.getServer("HTTP")).getStatus());
model.setStateVar("ssl server status",((StatusServer)parent.getServer("SSL")).getStatus());
}
model.setStateVar("storage status",parent.getStorage().toString());
/*
Generate a list of active sessions with some additional information
(idle time, session code, active mail connections, ...)
*/
XMLCommon.genericRemoveAll(model.getStateData(),"SESSION");
Enumeration e=parent.getSessions();
if(e != null && e.hasMoreElements()) {
while(e.hasMoreElements()) {
String name=(String)e.nextElement();
HTTPSession h=parent.getSession(name);
if(h instanceof WebMailSession) {
WebMailSession w=(WebMailSession)h;
Element sess_elem=model.addStateElement("SESSION");
sess_elem.setAttribute("type","user");
sess_elem.appendChild(model.createTextElement("SESS_USER",w.getUserName()));
sess_elem.appendChild(model.createTextElement("SESS_CODE",w.getSessionCode()));
sess_elem.appendChild(model.createTextElement("SESS_ADDRESS",w.getRemoteAddress().toString()));
sess_elem.appendChild(model.createStateVar("idle time",(System.currentTimeMillis()-w.getLastAccess())/1000+""));
Enumeration keys=w.getActiveConnections().keys();
while(keys.hasMoreElements()) {
String next=(String)keys.nextElement();
try {
sess_elem.appendChild(model.createTextElement("SESS_CONN",((Folder)w.getActiveConnections().get(next)).getURLName()+""));
} catch(Exception ex) {
sess_elem.appendChild(model.createTextElement("SESS_CONN","Error while fetching connection "+next));
}
}
/* If the remote is admin and we are not the remote! */
// && !h.getSessionCode().equals(session_code)
} else if(h instanceof AdminSession) {
Element sess_elem=model.addStateElement("SESSION");
sess_elem.setAttribute("type","admin");
sess_elem.appendChild(model.createTextElement("SESS_USER","Administrator"));
sess_elem.appendChild(model.createTextElement("SESS_ADDRESS",h.getRemoteAddress().toString()));
sess_elem.appendChild(model.createTextElement("SESS_CODE",h.getSessionCode()));
sess_elem.appendChild(model.createStateVar("idle time",(System.currentTimeMillis()-h.getLastAccess())/1000+""));
}
}
}
// Add all languages to the state
model.removeAllStateVars("language");
String lang=parent.getConfig("languages");
StringTokenizer tok=new StringTokenizer(lang," ");
while(tok.hasMoreTokens()) {
String t=tok.nextToken();
model.addStateVar("language",t);
}
model.removeAllStateVars("protocol");
Provider[] stores=parent.getStoreProviders();
for(int i=0; i<stores.length; i++) {
model.addStateVar("protocol",stores[i].getProtocol());
}
}
public InetAddress getRemoteAddress() {
return remote;
}
public long getTimeout() {
return 600000;
}
public void timeoutOccured() {
}
public void saveData() {
}
public Document getModel() {
return model.getRoot();
}
} // AdminSession
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.