James Moger
2012-01-13 8051a29d8b3826772e5be1851eb72cd52ab5080c
commit | author | age
eb96ea 1 /*
JM 2  * Copyright 2011 gitblit.com.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.gitblit;
17
18 import java.io.File;
19 import java.io.IOException;
20 import java.text.MessageFormat;
21 import java.util.List;
22
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 import com.gitblit.models.TeamModel;
27 import com.gitblit.models.UserModel;
28
29 /**
30  * This class wraps the default user service and is recommended as the starting
31  * point for custom user service implementations.
32  * 
33  * This does seem a little convoluted, but the idea is to allow IUserService to
34  * evolve with new methods and implementations without breaking custom
35  * authentication implementations.
36  * 
37  * The most common implementation of a custom IUserService is to only override
38  * authentication and then delegate all other functionality to one of Gitblit's
39  * user services. This class optimizes that use-case.
40  * 
41  * Extending GitblitUserService allows for authentication customization without
42  * having to keep-up-with IUSerService API changes.
43  * 
44  * @author James Moger
45  * 
46  */
47 public class GitblitUserService implements IUserService {
48
49     protected IUserService serviceImpl;
50
51     private final Logger logger = LoggerFactory.getLogger(GitblitUserService.class);
52
53     public GitblitUserService() {
54     }
55
56     @Override
57     public void setup(IStoredSettings settings) {
58         File realmFile = GitBlit.getFileOrFolder(Keys.realm.userService, "users.conf");
59         serviceImpl = createUserService(realmFile);
f5fa79 60         logger.info("GUS delegating to " + serviceImpl.toString());
eb96ea 61     }
JM 62
63     @SuppressWarnings("deprecation")
64     protected IUserService createUserService(File realmFile) {
65         IUserService service = null;
66         if (realmFile.getName().toLowerCase().endsWith(".properties")) {
67             // v0.5.0 - v0.7.0 properties-based realm file
68             service = new FileUserService(realmFile);
69         } else if (realmFile.getName().toLowerCase().endsWith(".conf")) {
70             // v0.8.0+ config-based realm file
71             service = new ConfigUserService(realmFile);
72         }
73
74         assert service != null;
75
e3d0d4 76         if (!realmFile.exists()) {
eb96ea 77             // Create the Administrator account for a new realm file
JM 78             try {
79                 realmFile.createNewFile();
80             } catch (IOException x) {
81                 logger.error(MessageFormat.format("COULD NOT CREATE REALM FILE {0}!", realmFile), x);
82             }
83             UserModel admin = new UserModel("admin");
84             admin.password = "admin";
85             admin.canAdmin = true;
86             admin.excludeFromFederation = true;
87             service.updateUserModel(admin);
88         }
89
90         if (service instanceof FileUserService) {
91             // automatically create a users.conf realm file from the original
92             // users.properties file
93             File usersConfig = new File(realmFile.getParentFile(), "users.conf");
94             if (!usersConfig.exists()) {
95                 logger.info(MessageFormat.format("Automatically creating {0} based on {1}",
96                         usersConfig.getAbsolutePath(), realmFile.getAbsolutePath()));
97                 ConfigUserService configService = new ConfigUserService(usersConfig);
8051a2 98                 for (String username : service.getAllUsernames()) {
JM 99                     UserModel userModel = service.getUserModel(username);
eb96ea 100                     configService.updateUserModel(userModel);
JM 101                 }
102             }
103             // issue suggestion about switching to users.conf
104             logger.warn("Please consider using \"users.conf\" instead of the deprecated \"users.properties\" file");
105         }
106         return service;
107     }
f5fa79 108     
JM 109     @Override
110     public String toString() {
111         return getClass().getSimpleName();
112     }
eb96ea 113
JM 114     @Override
115     public boolean supportsCookies() {
116         return serviceImpl.supportsCookies();
117     }
118
119     @Override
120     public char[] getCookie(UserModel model) {
121         return serviceImpl.getCookie(model);
122     }
123
124     @Override
125     public UserModel authenticate(char[] cookie) {
126         return serviceImpl.authenticate(cookie);
127     }
128
129     @Override
130     public UserModel authenticate(String username, char[] password) {
131         return serviceImpl.authenticate(username, password);
132     }
133
134     @Override
135     public UserModel getUserModel(String username) {
136         return serviceImpl.getUserModel(username);
137     }
138
139     @Override
140     public boolean updateUserModel(UserModel model) {
141         return serviceImpl.updateUserModel(model);
142     }
143
144     @Override
145     public boolean updateUserModel(String username, UserModel model) {
146         return serviceImpl.updateUserModel(username, model);
147     }
148
149     @Override
150     public boolean deleteUserModel(UserModel model) {
151         return serviceImpl.deleteUserModel(model);
152     }
153
154     @Override
155     public boolean deleteUser(String username) {
156         return serviceImpl.deleteUser(username);
157     }
158
159     @Override
160     public List<String> getAllUsernames() {
161         return serviceImpl.getAllUsernames();
162     }
163
164     @Override
abeaaf 165     public List<UserModel> getAllUsers() {
JM 166         return serviceImpl.getAllUsers();
167     }
168
169     @Override
eb96ea 170     public List<String> getAllTeamNames() {
JM 171         return serviceImpl.getAllTeamNames();
172     }
173
174     @Override
abeaaf 175     public List<TeamModel> getAllTeams() {
JM 176         return serviceImpl.getAllTeams();
177     }
178
179     @Override
eb96ea 180     public List<String> getTeamnamesForRepositoryRole(String role) {
JM 181         return serviceImpl.getTeamnamesForRepositoryRole(role);
182     }
183
184     @Override
185     public boolean setTeamnamesForRepositoryRole(String role, List<String> teamnames) {
186         return serviceImpl.setTeamnamesForRepositoryRole(role, teamnames);
187     }
188
189     @Override
190     public TeamModel getTeamModel(String teamname) {
191         return serviceImpl.getTeamModel(teamname);
192     }
193
194     @Override
195     public boolean updateTeamModel(TeamModel model) {
196         return serviceImpl.updateTeamModel(model);
197     }
198
199     @Override
200     public boolean updateTeamModel(String teamname, TeamModel model) {
201         return serviceImpl.updateTeamModel(teamname, model);
202     }
203
204     @Override
205     public boolean deleteTeamModel(TeamModel model) {
206         return serviceImpl.deleteTeamModel(model);
207     }
208
209     @Override
210     public boolean deleteTeam(String teamname) {
211         return serviceImpl.deleteTeam(teamname);
212     }
213
214     @Override
215     public List<String> getUsernamesForRepositoryRole(String role) {
216         return serviceImpl.getUsernamesForRepositoryRole(role);
217     }
218
219     @Override
220     public boolean setUsernamesForRepositoryRole(String role, List<String> usernames) {
221         return serviceImpl.setUsernamesForRepositoryRole(role, usernames);
222     }
223
224     @Override
225     public boolean renameRepositoryRole(String oldRole, String newRole) {
226         return serviceImpl.renameRepositoryRole(oldRole, newRole);
227     }
228
229     @Override
230     public boolean deleteRepositoryRole(String role) {
231         return serviceImpl.deleteRepositoryRole(role);
232     }
233 }