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