Mercurial > hg > digilib-old
diff servlet/src/digilib/auth/DBAuthOpsImpl.java @ 1:0ff3ede32060
Initial revision
author | robcast |
---|---|
date | Thu, 17 Jan 2002 15:25:46 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/servlet/src/digilib/auth/DBAuthOpsImpl.java Thu Jan 17 15:25:46 2002 +0100 @@ -0,0 +1,134 @@ +/* DBAuthOpsImpl -- Authentication class using database + + Digital Image Library servlet components + + Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de) + + 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. + + Please read license.txt for the full details. A copy of the GPL + may be found at http://www.gnu.org/copyleft/lgpl.html + + 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 + +*/ + +package digilib.auth; + +import javax.servlet.http.*; +import java.util.*; +import com.borland.dx.dataset.*; + +import digilib.*; + +public class DBAuthOpsImpl implements AuthOps { + + private Utils util = null; + private dlDataModule dlDataModule1; + + public DBAuthOpsImpl() { + util = new Utils(); + dbInit(); + } + + public DBAuthOpsImpl(Utils u) { + util = u; + dbInit(); + } + + void dbInit() { + try { + dlDataModule1 = new dlDataModule(); + dlDataModule1.getAuthPathsQuery().open(); + } + catch(Exception e) { + e.printStackTrace(); + } + } + + public void setUtils(Utils u) { + util = u; + } + + public boolean isAuthRequired(String filepath, HttpServletRequest request) throws AuthOpException { + // check permissions + List rolesRequired = rolesForPath(filepath, request); + return (rolesRequired != null); + } + + public boolean isAuthorized(String filepath, HttpServletRequest request) throws AuthOpException { + List rolesAllowed = rolesForPath(filepath, request); + return isRoleAuthorized(rolesAllowed, request); + }; + + public List rolesForPath(String filepath, HttpServletRequest request) throws AuthOpException { + util.dprintln(4, "rolesForPath ("+filepath+")"); + String p = ""; + List r; + LinkedList roles = new LinkedList(); + + // split path in directories + StringTokenizer path = new StringTokenizer(filepath, "/"); + // walk directories and check with db + while (path.hasMoreTokens()) { + p += "/" + path.nextToken(); + r = dbRolesForPath(p); + if (r != null) { + roles.addAll(r); + } + } + if (roles.size() > 0) { + return roles; + } else { + return null; + } + } + + public boolean isRoleAuthorized(List roles, HttpServletRequest request) { + ListIterator r = roles.listIterator(); + String s = ""; + while (r.hasNext()) { + s = (String)r.next(); + util.dprintln(5, "Testing role: "+s); + if (request.isUserInRole(s)) { + util.dprintln(5, "Role Authorized"); + return true; + } + } + return false; + } + + private List dbRolesForPath(String filepath) throws AuthOpException { + util.dprintln(4, "dbRolesForPath ("+filepath+")"); + + LinkedList roles = new LinkedList(); + DataSet query = dlDataModule1.getAuthPathsQuery(); + if (query == null) { + throw new AuthOpException("Unable to access database!"); + } + // search for PATH_NAME == filepath + DataRow lookupRow = new DataRow(query, "PATH_NAME"); + lookupRow.setString("PATH_NAME", filepath); + + if (query.locate(lookupRow, Locate.FIRST)) { + roles.add(query.getString("ROLE_NAME")); + util.dprintln(5, "role found: "+query.getString("ROLE_NAME")); + // any more matches? + while (query.locate(lookupRow, Locate.NEXT_FAST)) { + roles.add(query.getString("ROLE_NAME")); + util.dprintln(5, "role found: "+query.getString("ROLE_NAME")); + } + } + if (roles.size() > 0) { + return roles; + } else { + return null; + } + } + +}