1 package com.atlassian.user.impl.osuser;
2
3 import com.atlassian.user.EntityException;
4 import com.atlassian.user.User;
5 import com.atlassian.user.UserManager;
6 import com.atlassian.user.generic.AbstractTestUserManager;
7 import com.atlassian.user.generic.JdbcHelper;
8 import com.atlassian.user.impl.DefaultUser;
9 import com.atlassian.user.impl.osuser.properties.OSUPropertySetFactory;
10 import com.atlassian.user.properties.PropertySetFactory;
11 import com.atlassian.user.security.authentication.Authenticator;
12 import com.atlassian.user.security.password.Credential;
13 import com.opensymphony.module.propertyset.PropertySet;
14 import org.springframework.dao.DataAccessException;
15 import org.springframework.jdbc.core.PreparedStatementCallback;
16
17 import java.sql.PreparedStatement;
18 import java.sql.ResultSet;
19 import java.sql.SQLException;
20 import java.util.Iterator;
21 import java.util.List;
22
23 public class TestOSUserUserManager extends AbstractTestUserManager
24 {
25 private OSUAccessor accessor;
26 private OSUUserManager osuUserManager;
27 private Authenticator osuAuthenticator;
28
29 protected String[] getConfigLocations()
30 {
31 return new String[]{
32 "classpath:com/atlassian/user/impl/osuser/osuserTestContext.xml",
33 "classpath:com/atlassian/user/dataSourceTestContext.xml"
34 };
35 }
36
37 protected UserManager getUserManager()
38 {
39 return osuUserManager;
40 }
41
42 public void setOsuUserManager(OSUUserManager osuUserManager)
43 {
44 this.osuUserManager = osuUserManager;
45 }
46
47 public void setAccessor(OSUAccessor accessor)
48 {
49 this.accessor = accessor;
50 }
51
52 public void setOsuAuthenticator(Authenticator osuAuthenticator)
53 {
54 this.osuAuthenticator = osuAuthenticator;
55 }
56
57 protected void onTearDown() throws Exception
58 {
59
60 deleteUsers();
61 super.onTearDown();
62 deleteUsers();
63
64
65 new JdbcHelper().deleteTable(jdbcTemplate, "OS_PROPERTYENTRY");
66 }
67
68 private void deleteUsers()
69 throws EntityException
70 {
71 for (Iterator i = osuUserManager.getUsers().iterator(); i.hasNext();)
72 {
73 User user = (User) i.next();
74 osuUserManager.removeUser(user);
75 }
76 }
77
78 public void testGetPropertySet() throws Exception
79 {
80 PropertySetFactory propertySetFactory = new OSUPropertySetFactory(accessor.getProfileProvider());
81 User user = getUserManager().createUser("zorro");
82
83 PropertySet propertySet = propertySetFactory.getPropertySet(user);
84 assertNotNull(propertySet);
85
86 getUserManager().removeUser(user);
87 assertNull(propertySetFactory.getPropertySet(user));
88 }
89
90 public void testGetUserReturnsOSUUser() throws EntityException
91 {
92 boolean created = accessor.getCredentialsProvider().create("zorro");
93 assertTrue(created);
94
95 User user = getUserManager().getUser("zorro");
96 assertNotNull(user);
97
98 User osuUser = new OSUUser(new com.opensymphony.user.User("zorro", accessor));
99 assertEquals("The osuserUserManager is not returning users equivalent to the opensymphony osuser construct",
100 user, osuUser);
101 }
102
103 public void testCreateUserCreatesOSUUser() throws EntityException
104 {
105 User userA = getUserManager().createUser("zorro");
106 User userB = new OSUUser(new com.opensymphony.user.User("zorro", accessor));
107 assertEquals("The osuserUserManager is not creating users equivalent to the opensymphony osuser construct",
108 userA, userB);
109 }
110
111
112 public void testNullPasswords() throws Exception
113 {
114 String username = "zorro";
115 User user = getUserManager().createUser(username);
116 assertNotNull(user);
117
118 assertNull(getOSUserPasswordFromJDBC(username));
119
120
121 assertFalse(osuAuthenticator.authenticate("zorro", ""));
122 try
123 {
124 osuAuthenticator.authenticate("zorro", null);
125 fail("Should not be able to authenticate against a null password");
126 }
127 catch (NullPointerException e)
128 {
129
130 }
131
132 User zorroUser = getUserManager().getUser("zorro");
133 assertNotNull(zorroUser);
134
135 getUserManager().alterPassword(zorroUser, "password ");
136 assertFalse(osuAuthenticator.authenticate("zorro", "test"));
137 assertTrue(osuAuthenticator.authenticate("zorro", "password"));
138 assertTrue(osuAuthenticator.authenticate("zorro", "password "));
139 getUserManager().alterPassword(zorroUser, "password");
140 assertTrue(osuAuthenticator.authenticate("zorro", "password"));
141 assertTrue(osuAuthenticator.authenticate("zorro", "password "));
142 assertTrue(osuAuthenticator.authenticate("zorro", " password "));
143 assertFalse(osuAuthenticator.authenticate("zorro", "test"));
144
145 getUserManager().alterPassword(zorroUser, "");
146 try
147 {
148 getUserManager().alterPassword(zorroUser, null);
149 fail("Altering password to null should throw NullPointerException");
150 }
151 catch (NullPointerException e)
152 {
153
154 }
155 }
156
157 private String getOSUserPasswordFromJDBC(final String username) throws Exception
158 {
159 return (String) jdbcTemplate.execute("select passwd from os_user where username = ?", new PreparedStatementCallback()
160 {
161
162 public Object doInPreparedStatement(PreparedStatement preparedStatement) throws SQLException, DataAccessException
163 {
164 preparedStatement.setString(1, username);
165 ResultSet rs = preparedStatement.executeQuery();
166 rs.next();
167 return rs.getString(1);
168 }
169 });
170 }
171
172
173
174
175
176 public void testRemoveOSUserRemovesProperties() throws EntityException
177 {
178 osuUserManager.createUser(new DefaultUser("user1", "", ""), Credential.NONE);
179
180
181 JdbcHelper jdbcHelper = new JdbcHelper();
182 List
183 int userCount = jdbcHelper.getTableCount(jdbcTemplate, "OS_USER");
184 int propertyCount = jdbcHelper.getTableCount(jdbcTemplate, "OS_PROPERTYENTRY");
185 assertEquals("creating user should create exactly one entry in OS_USER", 1, userCount);
186 assertEquals("creating user should create exactly two entry in OS_PROPERTYENTRY", 2, propertyCount);
187 assertEquals("creating user should add data to two tables", 2, tables.size());
188 assertTrue("creating user should add data to OS_USER", tables.contains("OS_USER"));
189 assertTrue("creating user should add data to OS_PROPERTYENTRY", tables.contains("OS_PROPERTYENTRY"));
190
191 User retrievedUser = osuUserManager.getUser("user1");
192 osuUserManager.removeUser(retrievedUser);
193 assertNull("removing user should remove it from the user manager", osuUserManager.getUser("user1"));
194 tables = jdbcHelper.getNonEmtpyTables(jdbcTemplate);
195 userCount = jdbcHelper.getTableCount(jdbcTemplate, "OS_USER");
196 propertyCount = jdbcHelper.getTableCount(jdbcTemplate, "OS_PROPERTYENTRY");
197 assertEquals("removing user should remove entry in OS_USER", 0, userCount);
198 assertEquals("removing user should remove entries in OS_PROPERTYENTRY", 0, propertyCount);
199 assertEquals("removing user should remove all data from database", 0, tables.size());
200 }
201
202 }