annotate servlet/src/digilib/auth/DBAuthOpsImpl.java @ 290:5d0c0da080ec gen2 scaleable_1

digilib servlet version 2 ("scaleable digilib") - first stab at using thread pools to limit resource use - using Dug Leas util.concurrent - doesn't mix with tomcat :-(
author robcast
date Thu, 21 Oct 2004 20:53:37 +0200
parents 0ff3ede32060
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
1 /* DBAuthOpsImpl -- Authentication class using database
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
2
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
3 Digital Image Library servlet components
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
4
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
5 Copyright (C) 2001, 2002 Robert Casties (robcast@mail.berlios.de)
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
6
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
7 This program is free software; you can redistribute it and/or modify it
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
9 Free Software Foundation; either version 2 of the License, or (at your
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
10 option) any later version.
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
11
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
12 Please read license.txt for the full details. A copy of the GPL
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
13 may be found at http://www.gnu.org/copyleft/lgpl.html
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
14
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
15 You should have received a copy of the GNU General Public License
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
16 along with this program; if not, write to the Free Software
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
18
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
19 */
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
20
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
21 package digilib.auth;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
22
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
23 import javax.servlet.http.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
24 import java.util.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
25 import com.borland.dx.dataset.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
26
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
27 import digilib.*;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
28
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
29 public class DBAuthOpsImpl implements AuthOps {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
30
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
31 private Utils util = null;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
32 private dlDataModule dlDataModule1;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
33
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
34 public DBAuthOpsImpl() {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
35 util = new Utils();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
36 dbInit();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
37 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
38
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
39 public DBAuthOpsImpl(Utils u) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
40 util = u;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
41 dbInit();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
42 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
43
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
44 void dbInit() {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
45 try {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
46 dlDataModule1 = new dlDataModule();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
47 dlDataModule1.getAuthPathsQuery().open();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
48 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
49 catch(Exception e) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
50 e.printStackTrace();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
51 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
52 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
53
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
54 public void setUtils(Utils u) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
55 util = u;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
56 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
57
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
58 public boolean isAuthRequired(String filepath, HttpServletRequest request) throws AuthOpException {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
59 // check permissions
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
60 List rolesRequired = rolesForPath(filepath, request);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
61 return (rolesRequired != null);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
62 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
63
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
64 public boolean isAuthorized(String filepath, HttpServletRequest request) throws AuthOpException {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
65 List rolesAllowed = rolesForPath(filepath, request);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
66 return isRoleAuthorized(rolesAllowed, request);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
67 };
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
68
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
69 public List rolesForPath(String filepath, HttpServletRequest request) throws AuthOpException {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
70 util.dprintln(4, "rolesForPath ("+filepath+")");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
71 String p = "";
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
72 List r;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
73 LinkedList roles = new LinkedList();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
74
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
75 // split path in directories
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
76 StringTokenizer path = new StringTokenizer(filepath, "/");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
77 // walk directories and check with db
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
78 while (path.hasMoreTokens()) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
79 p += "/" + path.nextToken();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
80 r = dbRolesForPath(p);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
81 if (r != null) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
82 roles.addAll(r);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
83 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
84 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
85 if (roles.size() > 0) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
86 return roles;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
87 } else {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
88 return null;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
89 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
90 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
91
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
92 public boolean isRoleAuthorized(List roles, HttpServletRequest request) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
93 ListIterator r = roles.listIterator();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
94 String s = "";
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
95 while (r.hasNext()) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
96 s = (String)r.next();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
97 util.dprintln(5, "Testing role: "+s);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
98 if (request.isUserInRole(s)) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
99 util.dprintln(5, "Role Authorized");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
100 return true;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
101 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
102 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
103 return false;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
104 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
105
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
106 private List dbRolesForPath(String filepath) throws AuthOpException {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
107 util.dprintln(4, "dbRolesForPath ("+filepath+")");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
108
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
109 LinkedList roles = new LinkedList();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
110 DataSet query = dlDataModule1.getAuthPathsQuery();
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
111 if (query == null) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
112 throw new AuthOpException("Unable to access database!");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
113 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
114 // search for PATH_NAME == filepath
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
115 DataRow lookupRow = new DataRow(query, "PATH_NAME");
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
116 lookupRow.setString("PATH_NAME", filepath);
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
117
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
118 if (query.locate(lookupRow, Locate.FIRST)) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
119 roles.add(query.getString("ROLE_NAME"));
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
120 util.dprintln(5, "role found: "+query.getString("ROLE_NAME"));
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
121 // any more matches?
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
122 while (query.locate(lookupRow, Locate.NEXT_FAST)) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
123 roles.add(query.getString("ROLE_NAME"));
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
124 util.dprintln(5, "role found: "+query.getString("ROLE_NAME"));
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
125 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
126 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
127 if (roles.size() > 0) {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
128 return roles;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
129 } else {
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
130 return null;
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
131 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
132 }
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
133
0ff3ede32060 Initial revision
robcast
parents:
diff changeset
134 }