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          // osuser is poo and doesnt seem to clean up properly
60          deleteUsers();
61          super.onTearDown();
62          deleteUsers();
63          // osuser does not clean up the property entry table correctly
64          // See: http://jira.atlassian.com/browse/USER-192
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         // zorro has a null password so these should both fail
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             // good
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             // good
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      * Removing the OSUSer should remove its properties
174      * See: http://jira.atlassian.com/browse/USER-192
175      */
176     public void testRemoveOSUserRemovesProperties() throws EntityException
177     {
178         osuUserManager.createUser(new DefaultUser("user1", "", ""), Credential.NONE);
179 
180         // check initial changes to the database
181         JdbcHelper jdbcHelper = new JdbcHelper();
182         List/*<String>*/ tables = jdbcHelper.getNonEmtpyTables(jdbcTemplate);
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 }