]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
4042360302ff33f6ea2e239c8257518f579c7e18
[tmp/jakarta-migration.git] /
1 /**\r
2  * Copyright 2009 University of California at Berkeley\r
3  */\r
4 package org.collectionspace.authentication;\r
5 \r
6 import java.lang.reflect.Constructor;\r
7 import java.security.Principal;\r
8 import java.security.acl.Group;\r
9 import java.sql.Connection;\r
10 import java.sql.DriverManager;\r
11 import java.sql.PreparedStatement;\r
12 import java.sql.ResultSet;\r
13 import java.sql.SQLException;\r
14 \r
15 import java.util.HashMap;\r
16 import javax.naming.InitialContext;\r
17 import javax.security.auth.login.FailedLoginException;\r
18 import javax.security.auth.login.LoginException;\r
19 import org.jboss.security.SimpleGroup;\r
20 import org.jboss.security.SimplePrincipal;\r
21 import org.jboss.security.auth.spi.DatabaseServerLoginModule;\r
22 import org.slf4j.Logger;\r
23 import org.slf4j.LoggerFactory;\r
24 \r
25 public class CSpaceDBLoginModule extends DatabaseServerLoginModule {\r
26 \r
27     //disabled due to classloading problem\r
28     //private Logger logger = LoggerFactory.getLogger(CSpaceDBLoginModule.class);\r
29     private boolean log = true;\r
30 \r
31     private void log(String str) {\r
32         System.out.println(str);\r
33     }\r
34 \r
35     protected String getUsersPassword() throws LoginException {\r
36         \r
37         String username = getUsername();\r
38         String password = null;\r
39         Connection conn = null;\r
40         PreparedStatement ps = null;\r
41         ResultSet rs = null;\r
42         InitialContext ctx = null;\r
43         try{\r
44 //            Properties env = new Properties();\r
45 //            env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");\r
46 //            env.setProperty(Context.PROVIDER_URL, "jnp://localhost:1199/");\r
47 //            env.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");\r
48 //            ctx = new InitialContext(env);\r
49 ////            ctx = new InitialContext();\r
50 //            DataSource ds = (DataSource) ctx.lookup(dsJndiName);\r
51 //            if(ds == null){\r
52 //                throw new IllegalArgumentException("datasource not found: " + dsJndiName);\r
53 //            }\r
54 //            conn = ds.getConnection();\r
55             Class.forName("com.mysql.jdbc.Driver");\r
56             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cspace", "test", "test");\r
57 \r
58             // Get the password\r
59             if(log){\r
60                 log("Excuting query: " + principalsQuery + ", with username: " + username);\r
61             }\r
62             ps = conn.prepareStatement(principalsQuery);\r
63             ps.setString(1, username);\r
64             rs = ps.executeQuery();\r
65             if(rs.next() == false){\r
66                 if(log){\r
67                     log("Query returned no matches from db");\r
68                 }\r
69                 throw new FailedLoginException("No matching username found");\r
70             }\r
71 \r
72             password = rs.getString(1);\r
73             password = convertRawPassword(password);\r
74             if(log){\r
75                 log("Obtained user password");\r
76             }\r
77 //        }catch(NamingException ex){\r
78 //            LoginException le = new LoginException("Error looking up DataSource from: " + dsJndiName);\r
79 //            le.initCause(ex);\r
80 //            throw le;\r
81         }catch(SQLException ex){\r
82             LoginException le = new LoginException("Query failed");\r
83             le.initCause(ex);\r
84             throw le;\r
85         }catch(Exception ex){\r
86             LoginException le = new LoginException("Unknown Exception");\r
87             le.initCause(ex);\r
88             throw le;\r
89         }finally{\r
90             if(rs != null){\r
91                 try{\r
92                     rs.close();\r
93                 }catch(SQLException e){\r
94                 }\r
95             }\r
96             if(ps != null){\r
97                 try{\r
98                     ps.close();\r
99                 }catch(SQLException e){\r
100                 }\r
101             }\r
102             if(conn != null){\r
103                 try{\r
104                     conn.close();\r
105                 }catch(SQLException ex){\r
106                 }\r
107             }\r
108             if(ctx != null){\r
109                 try{\r
110                     ctx.close();\r
111                 }catch(Exception e){\r
112                 }\r
113             }\r
114         }\r
115         return password;\r
116     }\r
117 \r
118     /** Execute the rolesQuery against the dsJndiName to obtain the roles for\r
119     the authenticated user.\r
120 \r
121     @return Group[] containing the sets of roles\r
122      */\r
123     protected Group[] getRoleSets() throws LoginException {\r
124         String username = getUsername();\r
125         if(log){\r
126             log("getRoleSets using rolesQuery: " + rolesQuery + ", username: " + username);\r
127         }\r
128 \r
129         Connection conn = null;\r
130         HashMap setsMap = new HashMap();\r
131         PreparedStatement ps = null;\r
132         ResultSet rs = null;\r
133 \r
134         try{\r
135 //         InitialContext ctx = new InitialContext();\r
136 //         DataSource ds = (DataSource) ctx.lookup(dsJndiName);\r
137 //         conn = ds.getConnection();\r
138             conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/cspace", "test", "test");\r
139             // Get the user role names\r
140             if(log){\r
141                 log("Excuting query: " + rolesQuery + ", with username: " + username);\r
142             }\r
143 \r
144             ps =\r
145                     conn.prepareStatement(rolesQuery);\r
146             try{\r
147                 ps.setString(1, username);\r
148             }catch(ArrayIndexOutOfBoundsException ignore){\r
149                 // The query may not have any parameters so just try it\r
150             }\r
151             rs = ps.executeQuery();\r
152             if(rs.next() == false){\r
153                 if(log){\r
154                     log("No roles found");\r
155                 }\r
156 //                if(aslm.getUnauthenticatedIdentity() == null){\r
157 //                    throw new FailedLoginException("No matching username found in Roles");\r
158 //                }\r
159                 /* We are running with an unauthenticatedIdentity so create an\r
160                 empty Roles set and return.\r
161                  */\r
162 \r
163                 Group[] roleSets = {new SimpleGroup("Roles")};\r
164                 return roleSets;\r
165             }\r
166 \r
167             do{\r
168                 String name = rs.getString(1);\r
169                 String groupName = rs.getString(2);\r
170                 if(groupName == null || groupName.length() == 0){\r
171                     groupName = "Roles";\r
172                 }\r
173 \r
174                 Group group = (Group) setsMap.get(groupName);\r
175                 if(group == null){\r
176                     group = new SimpleGroup(groupName);\r
177                     setsMap.put(groupName, group);\r
178                 }\r
179 \r
180                 try{\r
181 //                    Principal p = aslm.createIdentity(name);\r
182                     Principal p = createIdentity(name);\r
183                     if(log){\r
184                         log("Assign user to role " + name);\r
185                     }\r
186 \r
187                     group.addMember(p);\r
188                 }catch(Exception e){\r
189                     log("Failed to create principal: " + name + " " + e.toString());\r
190                 }\r
191 \r
192             }while(rs.next());\r
193         } //      catch(NamingException ex)\r
194         //      {\r
195         //         LoginException le = new LoginException("Error looking up DataSource from: "+dsJndiName);\r
196         //         le.initCause(ex);\r
197         //         throw le;\r
198         //      }\r
199         catch(SQLException ex){\r
200             LoginException le = new LoginException("Query failed");\r
201             le.initCause(ex);\r
202             throw le;\r
203         }finally{\r
204             if(rs != null){\r
205                 try{\r
206                     rs.close();\r
207                 }catch(SQLException e){\r
208                 }\r
209             }\r
210             if(ps != null){\r
211                 try{\r
212                     ps.close();\r
213                 }catch(SQLException e){\r
214                 }\r
215             }\r
216             if(conn != null){\r
217                 try{\r
218                     conn.close();\r
219                 }catch(Exception ex){\r
220                 }\r
221             }\r
222 \r
223         }\r
224 \r
225         Group[] roleSets = new Group[setsMap.size()];\r
226         setsMap.values().toArray(roleSets);\r
227         return roleSets;\r
228     }\r
229 \r
230     /** Utility method to create a Principal for the given username. This\r
231      * creates an instance of the principalClassName type if this option was\r
232      * specified using the class constructor matching: ctor(String). If\r
233      * principalClassName was not specified, a SimplePrincipal is created.\r
234      *\r
235      * @param username the name of the principal\r
236      * @return the principal instance\r
237      * @throws java.lang.Exception thrown if the custom principal type cannot be created.\r
238      */\r
239     protected Principal createIdentity(String username)\r
240             throws Exception {\r
241         Principal p = null;\r
242         if(principalClassName == null){\r
243             p = new SimplePrincipal(username);\r
244         }else{\r
245             ClassLoader loader = Thread.currentThread().getContextClassLoader();\r
246             Class clazz = loader.loadClass(principalClassName);\r
247             Class[] ctorSig = {String.class};\r
248             Constructor ctor = clazz.getConstructor(ctorSig);\r
249             Object[] ctorArgs = {username};\r
250             p =\r
251                     (Principal) ctor.newInstance(ctorArgs);\r
252         }\r
253 \r
254         return p;\r
255     }\r
256 }