*/
package org.sonar.server.db;
-import org.sonar.server.source.db.FileSourceDao;
-
import org.sonar.api.ServerComponent;
import org.sonar.core.issue.db.ActionPlanDao;
import org.sonar.core.issue.db.IssueChangeDao;
import org.sonar.server.measure.persistence.MetricDao;
import org.sonar.server.qualityprofile.db.ActiveRuleDao;
import org.sonar.server.rule.db.RuleDao;
+import org.sonar.server.source.db.FileSourceDao;
import org.sonar.server.user.db.GroupDao;
import org.sonar.server.user.db.UserDao;
+import org.sonar.server.user.db.UserGroupDao;
import java.sql.Connection;
import java.sql.PreparedStatement;
private final AuthorizationDao authorizationDao;
private final UserDao userDao;
private final GroupDao groupDao;
+ private final UserGroupDao userGroupDao;
private final IssueDao issueDao;
private final IssueFilterDao issueFilterDao;
private final IssueChangeDao issueChangeDao;
authorizationDao = getDao(map, AuthorizationDao.class);
userDao = getDao(map, UserDao.class);
groupDao = getDao(map, GroupDao.class);
+ userGroupDao = getDao(map, UserGroupDao.class);
issueDao = getDao(map, IssueDao.class);
issueFilterDao = getDao(map, IssueFilterDao.class);
issueChangeDao = getDao(map, IssueChangeDao.class);
return groupDao;
}
+ public UserGroupDao userGroupDao() {
+ return userGroupDao;
+ }
+
public ActionPlanDao actionPlanDao() {
return actionPlanDao;
}
import org.sonar.server.user.GroupMembershipService;
import org.sonar.server.user.NewUserNotifier;
import org.sonar.server.user.SecurityRealmFactory;
-import org.sonar.server.user.UserService;
import org.sonar.server.user.UserUpdater;
import org.sonar.server.user.db.GroupDao;
import org.sonar.server.user.db.UserDao;
pico.addSingleton(UserIndexDefinition.class);
pico.addSingleton(UserIndexer.class);
pico.addSingleton(UserIndex.class);
- pico.addSingleton(UserService.class);
pico.addSingleton(UserUpdater.class);
// groups
import org.sonar.api.user.UserFinder;
import org.sonar.api.user.UserQuery;
import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.core.user.UserDao;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.user.index.UserDoc;
+import org.sonar.server.user.index.UserIndex;
import org.sonar.server.util.RubyUtils;
import javax.annotation.CheckForNull;
public class DefaultUserService implements RubyUserService {
- private final UserService userService;
+ private final UserIndex userIndex;
+ private final UserUpdater userUpdater;
private final UserFinder finder;
- private final UserDao dao;
- public DefaultUserService(UserService userService, UserFinder finder, UserDao dao) {
- this.userService = userService;
+ public DefaultUserService(UserIndex userIndex, UserUpdater userUpdater, UserFinder finder) {
+ this.userIndex = userIndex;
+ this.userUpdater = userUpdater;
this.finder = finder;
- this.dao = dao;
}
@Override
@CheckForNull
public UserDoc getByLogin(String login) {
- return userService.getNullableByLogin(login);
+ return userIndex.getNullableByLogin(login);
}
public boolean create(Map<String, Object> params) {
.setScmAccounts(RubyUtils.toStrings(params.get("scm_accounts")))
.setPassword((String) params.get("password"))
.setPasswordConfirmation((String) params.get("password_confirmation"));
- return userService.create(newUser);
+ return userUpdater.create(newUser);
}
public void update(Map<String, Object> params) {
updateUser.setPassword((String) params.get("password"));
updateUser.setPasswordConfirmation((String) params.get("password_confirmation"));
}
- userService.update(updateUser);
+ userUpdater.update(updateUser);
}
public void deactivate(String login) {
if (Objects.equal(userSession.login(), login)) {
throw new BadRequestException("Self-deactivation is not possible");
}
- dao.deactivateUserByLogin(login);
- userService.index();
+ userUpdater.deactivateUserByLogin(login);
}
public void index() {
- userService.index();
+ userUpdater.index();
}
}
+++ /dev/null
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.sonar.server.user;
-
-import org.sonar.api.ServerComponent;
-import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.server.user.index.UserDoc;
-import org.sonar.server.user.index.UserIndex;
-import org.sonar.server.user.index.UserIndexer;
-
-import javax.annotation.CheckForNull;
-
-public class UserService implements ServerComponent {
-
- private final UserIndexer userIndexer;
- private final UserIndex userIndex;
- private final UserUpdater userUpdater;
-
- public UserService(UserIndexer userIndexer, UserIndex userIndex, UserUpdater userUpdater) {
- this.userIndexer = userIndexer;
- this.userIndex = userIndex;
- this.userUpdater = userUpdater;
- }
-
- public boolean create(NewUser newUser) {
- checkPermission();
- boolean result = userUpdater.create(newUser);
- userIndexer.index();
- return result;
- }
-
- public void update(UpdateUser updateUser) {
- checkPermission();
- userUpdater.update(updateUser);
- userIndexer.index();
- }
-
- public UserDoc getByLogin(String login) {
- return userIndex.getByLogin(login);
- }
-
- @CheckForNull
- public UserDoc getNullableByLogin(String login) {
- return userIndex.getNullableByLogin(login);
- }
-
- public void index() {
- userIndexer.index();
- }
-
- private void checkPermission() {
- UserSession userSession = UserSession.get();
- userSession.checkLoggedIn();
- userSession.checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
- }
-}
import org.sonar.server.db.DbClient;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.Message;
-import org.sonar.server.user.db.UserGroupDao;
+import org.sonar.server.user.index.UserIndexer;
import org.sonar.server.util.Validation;
import javax.annotation.CheckForNull;
private final NewUserNotifier newUserNotifier;
private final Settings settings;
- private final UserGroupDao userGroupDao;
private final DbClient dbClient;
+ private final UserIndexer userIndexer;
private final System2 system2;
- public UserUpdater(NewUserNotifier newUserNotifier, Settings settings, UserGroupDao userGroupDao, DbClient dbClient, System2 system2) {
+ public UserUpdater(NewUserNotifier newUserNotifier, Settings settings, DbClient dbClient, UserIndexer userIndexer, System2 system2) {
this.newUserNotifier = newUserNotifier;
this.settings = settings;
- this.userGroupDao = userGroupDao;
this.dbClient = dbClient;
+ this.userIndexer = userIndexer;
this.system2 = system2;
}
}
dbSession.commit();
notifyNewUser(userDto.getLogin(), userDto.getName(), newUser.email());
+ userIndexer.index();
} finally {
dbSession.close();
}
updateUser(dbSession, user);
dbSession.commit();
notifyNewUser(user.getLogin(), user.getName(), user.getEmail());
+ userIndexer.index();
} finally {
dbSession.close();
}
}
+ public void deactivateUserByLogin(String login) {
+ dbClient.userDao().deactivateUserByLogin(login);
+ userIndexer.index();
+ }
+
private UserDto createNewUserDto(DbSession dbSession, NewUser newUser) {
UserDto userDto = new UserDto();
List<Message> messages = newArrayList();
}
})) {
GroupDto groupDto = dbClient.groupDao().getByKey(dbSession, defaultGroup);
- userGroupDao.insert(dbSession, new UserGroupDto().setUserId(userDto.getId()).setGroupId(groupDto.getId()));
+ dbClient.userGroupDao().insert(dbSession, new UserGroupDto().setUserId(userDto.getId()).setGroupId(groupDto.getId()));
}
}
+
+ public void index() {
+ userIndexer.index();
+ }
}
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
+import org.sonar.core.permission.GlobalPermissions;
import org.sonar.server.user.NewUser;
-import org.sonar.server.user.UserService;
import org.sonar.server.user.UserSession;
+import org.sonar.server.user.UserUpdater;
import org.sonar.server.user.index.UserDoc;
+import org.sonar.server.user.index.UserIndex;
public class CreateAction implements BaseUsersWsAction {
private static final String PARAM_EMAIL = "email";
private static final String PARAM_SCM_ACCOUNTS = "scm_accounts";
- private final UserService service;
+ private final UserIndex index;
+ private final UserUpdater userUpdater;
private final I18n i18n;
- public CreateAction(UserService service, I18n i18n) {
- this.service = service;
+ public CreateAction(UserIndex index, UserUpdater userUpdater, I18n i18n) {
+ this.index = index;
+ this.userUpdater = userUpdater;
this.i18n = i18n;
}
@Override
public void handle(Request request, Response response) throws Exception {
+ UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+
String login = request.mandatoryParam(PARAM_LOGIN);
NewUser newUser = NewUser.create()
.setLogin(login)
.setPassword(request.mandatoryParam(PARAM_PASSWORD))
.setPasswordConfirmation(request.mandatoryParam(PARAM_PASSWORD_CONFIRMATION));
- boolean isUserReactivated = service.create(newUser);
+ boolean isUserReactivated = userUpdater.create(newUser);
writeResponse(response, login, isUserReactivated);
}
private void writeResponse(Response response, String login, boolean isUserReactivated) {
- UserDoc user = service.getByLogin(login);
+ UserDoc user = index.getByLogin(login);
JsonWriter json = response.newJsonWriter().beginObject();
writeUser(json, user);
if (isUserReactivated) {
import org.sonar.api.server.ws.Response;
import org.sonar.api.server.ws.WebService;
import org.sonar.api.utils.text.JsonWriter;
+import org.sonar.core.permission.GlobalPermissions;
import org.sonar.server.user.UpdateUser;
-import org.sonar.server.user.UserService;
+import org.sonar.server.user.UserSession;
+import org.sonar.server.user.UserUpdater;
import org.sonar.server.user.index.UserDoc;
+import org.sonar.server.user.index.UserIndex;
public class UpdateAction implements BaseUsersWsAction {
private static final String PARAM_EMAIL = "email";
private static final String PARAM_SCM_ACCOUNTS = "scm_accounts";
- private final UserService service;
+ private final UserIndex index;
+ private final UserUpdater userUpdater;
- public UpdateAction(UserService service) {
- this.service = service;
+ public UpdateAction(UserIndex index, UserUpdater userUpdater) {
+ this.index = index;
+ this.userUpdater = userUpdater;
}
@Override
@Override
public void handle(Request request, Response response) throws Exception {
+ UserSession.get().checkLoggedIn().checkGlobalPermission(GlobalPermissions.SYSTEM_ADMIN);
+
String login = request.mandatoryParam(PARAM_LOGIN);
UpdateUser updateUser = UpdateUser.create(login);
if (request.hasParam(PARAM_NAME)) {
updateUser.setPasswordConfirmation(request.mandatoryParam(PARAM_PASSWORD_CONFIRMATION));
}
- service.update(updateUser);
+ userUpdater.update(updateUser);
writeResponse(response, login);
}
private void writeResponse(Response response, String login) {
- UserDoc user = service.getByLogin(login);
+ UserDoc user = index.getByLogin(login);
JsonWriter json = response.newJsonWriter().beginObject();
writeUser(json, user);
json.endObject().close();
import org.sonar.server.tester.ServerTester;
import org.sonar.server.user.MockUserSession;
import org.sonar.server.user.NewUser;
-import org.sonar.server.user.UserService;
+import org.sonar.server.user.UserUpdater;
import org.sonar.server.user.db.GroupDao;
import java.util.Arrays;
}
private void newUser(String login) {
- MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
- tester.get(UserService.class).create(NewUser.create().setLogin(login).setName(login).setPassword("test").setPasswordConfirmation("test"));
- MockUserSession.set();
+ tester.get(UserUpdater.class).create(NewUser.create().setLogin(login).setName(login).setPassword("test").setPasswordConfirmation("test"));
}
private void createDefaultGroup() {
import org.sonar.api.user.UserFinder;
import org.sonar.api.user.UserQuery;
import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.core.user.UserDao;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.ForbiddenException;
+import org.sonar.server.user.index.UserIndex;
import java.util.Map;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.argThat;
-import static org.mockito.Mockito.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
@RunWith(MockitoJUnitRunner.class)
public class DefaultUserServiceTest {
- UserService userService = mock(UserService.class);
+ UserIndex userIndex = mock(UserIndex.class);
UserFinder finder = mock(UserFinder.class);
- UserDao dao = mock(UserDao.class);
- DefaultUserService service = new DefaultUserService(userService, finder, dao);
+ UserUpdater userUpdater = mock(UserUpdater.class);
+ DefaultUserService service = new DefaultUserService(userIndex, userUpdater, finder);
@Rule
public ExpectedException thrown = ExpectedException.none();
fail();
} catch (BadRequestException e) {
assertThat(e).hasMessage("Self-deactivation is not possible");
- verify(dao, never()).deactivateUserByLogin("simon");
+ verify(userUpdater, never()).deactivateUserByLogin("simon");
}
}
service.deactivate("julien");
fail();
} catch (ForbiddenException e) {
- verify(dao, never()).deactivateUserByLogin("simon");
+ verify(userUpdater, never()).deactivateUserByLogin("simon");
}
}
public void deactivate_user() throws Exception {
MockUserSession.set().setLogin("simon").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
service.deactivate("julien");
- verify(dao).deactivateUserByLogin("julien");
- verify(userService).index();
+ verify(userUpdater).deactivateUserByLogin("julien");
}
@Test
fail();
} catch (BadRequestException e) {
assertThat(e).hasMessage("Login is missing");
- verifyZeroInteractions(dao);
}
}
service.create(params);
ArgumentCaptor<NewUser> newUserCaptor = ArgumentCaptor.forClass(NewUser.class);
- verify(userService).create(newUserCaptor.capture());
+ verify(userUpdater).create(newUserCaptor.capture());
assertThat(newUserCaptor.getValue().login()).isEqualTo("john");
assertThat(newUserCaptor.getValue().name()).isEqualTo("John");
assertThat(newUserCaptor.getValue().email()).isEqualTo("john@email.com");
service.update(params);
ArgumentCaptor<UpdateUser> userCaptor = ArgumentCaptor.forClass(UpdateUser.class);
- verify(userService).update(userCaptor.capture());
+ verify(userUpdater).update(userCaptor.capture());
assertThat(userCaptor.getValue().login()).isEqualTo("john");
assertThat(userCaptor.getValue().name()).isEqualTo("John");
assertThat(userCaptor.getValue().email()).isEqualTo("john@email.com");
service.update(params);
ArgumentCaptor<UpdateUser> userCaptor = ArgumentCaptor.forClass(UpdateUser.class);
- verify(userService).update(userCaptor.capture());
+ verify(userUpdater).update(userCaptor.capture());
assertThat(userCaptor.getValue().isNameChanged()).isTrue();
assertThat(userCaptor.getValue().isEmailChanged()).isFalse();
assertThat(userCaptor.getValue().isScmAccountsChanged()).isFalse();
service.update(params);
ArgumentCaptor<UpdateUser> userCaptor = ArgumentCaptor.forClass(UpdateUser.class);
- verify(userService).update(userCaptor.capture());
+ verify(userUpdater).update(userCaptor.capture());
assertThat(userCaptor.getValue().isNameChanged()).isFalse();
assertThat(userCaptor.getValue().isEmailChanged()).isTrue();
assertThat(userCaptor.getValue().isScmAccountsChanged()).isFalse();
service.update(params);
ArgumentCaptor<UpdateUser> userCaptor = ArgumentCaptor.forClass(UpdateUser.class);
- verify(userService).update(userCaptor.capture());
+ verify(userUpdater).update(userCaptor.capture());
assertThat(userCaptor.getValue().isNameChanged()).isFalse();
assertThat(userCaptor.getValue().isEmailChanged()).isFalse();
assertThat(userCaptor.getValue().isScmAccountsChanged()).isTrue();
service.update(params);
ArgumentCaptor<UpdateUser> userCaptor = ArgumentCaptor.forClass(UpdateUser.class);
- verify(userService).update(userCaptor.capture());
+ verify(userUpdater).update(userCaptor.capture());
assertThat(userCaptor.getValue().isNameChanged()).isFalse();
assertThat(userCaptor.getValue().isEmailChanged()).isFalse();
assertThat(userCaptor.getValue().isScmAccountsChanged()).isFalse();
@Test
public void get_by_login() throws Exception {
service.getByLogin("john");
- verify(userService).getNullableByLogin("john");
+ verify(userIndex).getNullableByLogin("john");
}
@Test
public void index() throws Exception {
service.index();
- verify(userService).index();
+ verify(userUpdater).index();
}
}
+++ /dev/null
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package org.sonar.server.user;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.sonar.api.CoreProperties;
-import org.sonar.core.permission.GlobalPermissions;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.user.GroupDto;
-import org.sonar.core.user.UserDto;
-import org.sonar.server.db.DbClient;
-import org.sonar.server.es.EsClient;
-import org.sonar.server.exceptions.ForbiddenException;
-import org.sonar.server.tester.ServerTester;
-import org.sonar.server.user.index.UserDoc;
-import org.sonar.server.user.index.UserIndexDefinition;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static org.assertj.core.api.Assertions.assertThat;
-
-public class UserServiceMediumTest {
-
- @ClassRule
- public static ServerTester tester = new ServerTester();
-
- EsClient esClient;
- DbClient dbClient;
- DbSession session;
-
- UserService service;
-
- @Before
- public void setUp() throws Exception {
- tester.clearDbAndIndexes();
- dbClient = tester.get(DbClient.class);
- esClient = tester.get(EsClient.class);
- session = dbClient.openSession(false);
- service = tester.get(UserService.class);
- }
-
- @After
- public void after() {
- session.close();
- }
-
- @Test
- public void create_user() throws Exception {
- MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
- GroupDto userGroup = new GroupDto().setName(CoreProperties.CORE_DEFAULT_GROUP_DEFAULT_VALUE);
- dbClient.groupDao().insert(session, userGroup);
- session.commit();
-
- boolean result = service.create(NewUser.create()
- .setLogin("user")
- .setName("User")
- .setEmail("user@mail.com")
- .setPassword("password")
- .setPasswordConfirmation("password")
- .setScmAccounts(newArrayList("u1", "u_1")));
-
- assertThat(result).isFalse();
-
- UserDto userDto = dbClient.userDao().selectNullableByLogin(session, "user");
- assertThat(userDto).isNotNull();
- assertThat(userDto.getId()).isNotNull();
- assertThat(userDto.getLogin()).isEqualTo("user");
- assertThat(userDto.getName()).isEqualTo("User");
- assertThat(userDto.getEmail()).isEqualTo("user@mail.com");
- assertThat(userDto.getCryptedPassword()).isNotNull();
- assertThat(userDto.getSalt()).isNotNull();
- assertThat(userDto.getScmAccountsAsList()).containsOnly("u1", "u_1");
- assertThat(userDto.getCreatedAt()).isNotNull();
- assertThat(userDto.getUpdatedAt()).isNotNull();
-
- UserDoc userDoc = service.getNullableByLogin("user");
- assertThat(userDoc).isNotNull();
- assertThat(userDoc.login()).isEqualTo("user");
- assertThat(userDoc.name()).isEqualTo("User");
- assertThat(userDoc.email()).isEqualTo("user@mail.com");
- assertThat(userDoc.scmAccounts()).containsOnly("u1", "u_1");
- assertThat(userDoc.createdAt()).isNotNull();
- assertThat(userDoc.updatedAt()).isNotNull();
- }
-
- @Test(expected = ForbiddenException.class)
- public void fail_to_create_user_without_sys_admin_permission() throws Exception {
- MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.DASHBOARD_SHARING);
-
- service.create(NewUser.create()
- .setLogin("user")
- .setName("User")
- .setEmail("user@mail.com")
- .setPassword("password")
- .setPasswordConfirmation("password")
- .setScmAccounts(newArrayList("u1", "u_1")));
- }
-
- @Test
- public void update_user() throws Exception {
- MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
-
- dbClient.userDao().insert(session, new UserDto()
- .setLogin("marius")
- .setName("Marius")
- .setEmail("marius@mail.com")
- .setCryptedPassword("1234")
- .setSalt("abcd")
- .setCreatedAt(1000L)
- );
- GroupDto userGroup = new GroupDto().setName(CoreProperties.CORE_DEFAULT_GROUP_DEFAULT_VALUE);
- dbClient.groupDao().insert(session, userGroup);
- session.commit();
-
- service.update(UpdateUser.create("marius")
- .setName("Marius2")
- .setEmail("marius2@mail.com"));
-
- UserDto userDto = dbClient.userDao().selectNullableByLogin(session, "marius");
- assertThat(userDto.getName()).isEqualTo("Marius2");
- assertThat(userDto.getEmail()).isEqualTo("marius2@mail.com");
- }
-
- @Test(expected = ForbiddenException.class)
- public void fail_to_update_user_without_sys_admin_permission() throws Exception {
- MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.DASHBOARD_SHARING);
-
- service.update(UpdateUser.create("marius")
- .setName("Marius2")
- .setEmail("marius2@mail.com")
- .setPassword("password2")
- .setPasswordConfirmation("password2")
- .setScmAccounts(newArrayList("ma2")));
- }
-
- @Test
- public void get_nullable_by_login() throws Exception {
- createSampleUser();
-
- assertThat(service.getNullableByLogin("user")).isNotNull();
- }
-
- @Test
- public void get_by_login() throws Exception {
- createSampleUser();
-
- assertThat(service.getByLogin("user")).isNotNull();
- }
-
- @Test
- public void index() throws Exception {
- UserDto userDto = new UserDto().setLogin("user").setEmail("user@mail.com").setCreatedAt(System.currentTimeMillis()).setUpdatedAt(System.currentTimeMillis());
- dbClient.userDao().insert(session, userDto);
- session.commit();
- assertThat(esClient.prepareGet(UserIndexDefinition.INDEX, UserIndexDefinition.TYPE_USER, "user").get().isExists()).isFalse();
-
- service.index();
- assertThat(esClient.prepareGet(UserIndexDefinition.INDEX, UserIndexDefinition.TYPE_USER, "user").get().isExists()).isTrue();
- }
-
- private void createSampleUser() {
- MockUserSession.set().setLogin("john").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
- GroupDto userGroup = new GroupDto().setName(CoreProperties.CORE_DEFAULT_GROUP_DEFAULT_VALUE);
- dbClient.groupDao().insert(session, userGroup);
- session.commit();
-
- service.create(NewUser.create()
- .setLogin("user")
- .setName("User")
- .setEmail("user@mail.com")
- .setPassword("password")
- .setPasswordConfirmation("password")
- .setScmAccounts(newArrayList("u1", "u_1")));
-
- MockUserSession.set().setLogin("john");
- }
-
-}
package org.sonar.server.user;
import com.google.common.base.Strings;
+import org.elasticsearch.search.SearchHit;
import org.junit.After;
import org.junit.Before;
import org.junit.ClassRule;
import org.sonar.core.user.GroupMembershipQuery;
import org.sonar.core.user.UserDto;
import org.sonar.server.db.DbClient;
+import org.sonar.server.es.EsTester;
import org.sonar.server.exceptions.BadRequestException;
import org.sonar.server.exceptions.Message;
import org.sonar.server.user.db.GroupDao;
import org.sonar.server.user.db.UserDao;
import org.sonar.server.user.db.UserGroupDao;
+import org.sonar.server.user.index.UserIndexDefinition;
+import org.sonar.server.user.index.UserIndexer;
import org.sonar.server.util.Validation;
import org.sonar.test.DbTests;
+import java.util.List;
+
import static com.google.common.collect.Lists.newArrayList;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.data.MapEntry.entry;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ClassRule
public static DbTester db = new DbTester();
+ @ClassRule
+ public static EsTester es = new EsTester().addDefinitions(new UserIndexDefinition(new Settings()));
+
@Mock
System2 system2;
GroupDao groupDao;
GroupMembershipFinder groupMembershipFinder;
DbSession session;
+ UserIndexer userIndexer;
UserUpdater userUpdater;
+
@Before
public void setUp() throws Exception {
db.truncateTables();
+ es.truncateIndices();
settings = new Settings();
session = db.myBatis().openSession(false);
userDao = new UserDao(db.myBatis(), system2);
GroupMembershipDao groupMembershipDao = new GroupMembershipDao(db.myBatis());
groupMembershipFinder = new GroupMembershipFinder(userDao, groupMembershipDao);
- userUpdater = new UserUpdater(newUserNotifier, settings, userGroupDao, new DbClient(db.database(), db.myBatis(), userDao, groupDao), system2);
+ DbClient dbClient = new DbClient(db.database(), db.myBatis(), userDao, groupDao, userGroupDao);
+ userIndexer = (UserIndexer) new UserIndexer(dbClient, es.client()).setEnabled(true);
+ userUpdater = new UserUpdater(newUserNotifier, settings, dbClient,
+ userIndexer, system2);
}
@After
assertThat(dto.getCreatedAt()).isEqualTo(1418215735482L);
assertThat(dto.getUpdatedAt()).isEqualTo(1418215735482L);
assertThat(result).isFalse();
+
+ List<SearchHit> indexUsers = es.getDocuments(UserIndexDefinition.INDEX, UserIndexDefinition.TYPE_USER);
+ assertThat(indexUsers).hasSize(1);
+ assertThat(indexUsers.get(0).getSource())
+ .contains(
+ entry("login", "user"),
+ entry("name", "User"),
+ entry("email", "user@mail.com"));
}
@Test
assertThat(dto.getCryptedPassword()).isNotEqualTo("650d2261c98361e2f67f90ce5c65a95e7d8ea2fg");
assertThat(dto.getCreatedAt()).isEqualTo(1418215735482L);
assertThat(dto.getUpdatedAt()).isEqualTo(1418215735486L);
+
+ List<SearchHit> indexUsers = es.getDocuments(UserIndexDefinition.INDEX, UserIndexDefinition.TYPE_USER);
+ assertThat(indexUsers).hasSize(1);
+ assertThat(indexUsers.get(0).getSource())
+ .contains(
+ entry("login", "marius"),
+ entry("name", "Marius2"),
+ entry("email", "marius2@mail.com"));
}
@Test
package org.sonar.server.user.ws;
+import org.junit.After;
import org.junit.Before;
+import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Captor;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
+import org.sonar.api.config.Settings;
import org.sonar.api.i18n.I18n;
import org.sonar.api.server.ws.WebService;
+import org.sonar.api.utils.System2;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.DbTester;
+import org.sonar.core.user.GroupDto;
+import org.sonar.core.user.UserDto;
+import org.sonar.server.db.DbClient;
+import org.sonar.server.es.EsTester;
+import org.sonar.server.exceptions.ForbiddenException;
import org.sonar.server.user.MockUserSession;
-import org.sonar.server.user.NewUser;
-import org.sonar.server.user.UserService;
+import org.sonar.server.user.NewUserNotifier;
+import org.sonar.server.user.UserUpdater;
+import org.sonar.server.user.db.GroupDao;
+import org.sonar.server.user.db.UserDao;
+import org.sonar.server.user.db.UserGroupDao;
import org.sonar.server.user.index.UserDoc;
+import org.sonar.server.user.index.UserIndex;
+import org.sonar.server.user.index.UserIndexDefinition;
+import org.sonar.server.user.index.UserIndexer;
import org.sonar.server.ws.WsTester;
import java.util.Locale;
-import java.util.Map;
-import static com.google.common.collect.Lists.newArrayList;
-import static com.google.common.collect.Maps.newHashMap;
import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class CreateActionTest {
+ static final Settings settings = new Settings().setProperty("sonar.defaultGroup", "sonar-users");
+
+ @ClassRule
+ public static final DbTester dbTester = new DbTester();
+
+ @ClassRule
+ public static final EsTester esTester = new EsTester().addDefinitions(new UserIndexDefinition(settings));
+
WebService.Controller controller;
WsTester tester;
- @Mock
- UserService service;
+ UserIndex index;
+
+ DbClient dbClient;
+
+ UserIndexer userIndexer;
+
+ DbSession session;
@Mock
I18n i18n;
- @Captor
- ArgumentCaptor<NewUser> newUserCaptor;
-
@Before
public void setUp() throws Exception {
- tester = new WsTester(new UsersWs(new CreateAction(service, i18n)));
+ dbTester.truncateTables();
+ esTester.truncateIndices();
+
+ System2 system2 = new System2();
+ UserDao userDao = new UserDao(dbTester.myBatis(), system2);
+ UserGroupDao userGroupDao = new UserGroupDao();
+ GroupDao groupDao = new GroupDao();
+ dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), userDao, userGroupDao, groupDao);
+ session = dbClient.openSession(false);
+ groupDao.insert(session, new GroupDto().setName("sonar-users"));
+ session.commit();
+
+ userIndexer = (UserIndexer) new UserIndexer(dbClient, esTester.client()).setEnabled(true);
+ index = new UserIndex(esTester.client());
+ tester = new WsTester(new UsersWs(new CreateAction(index,
+ new UserUpdater(mock(NewUserNotifier.class), settings, dbClient, userIndexer, system2),
+ i18n)));
controller = tester.controller("api/users");
+
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ session.close();
}
@Test
public void create_user() throws Exception {
- Map<String, Object> userDocMap = newHashMap();
- userDocMap.put("login", "john");
- userDocMap.put("name", "John");
- userDocMap.put("email", "john@email.com");
- userDocMap.put("scmAccounts", newArrayList("jn"));
- userDocMap.put("active", true);
- userDocMap.put("createdAt", 15000L);
- userDocMap.put("updatedAt", 15000L);
- when(service.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
+ MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
tester.newPostRequest("api/users", "create")
.setParam("login", "john")
.setParam("password_confirmation", "1234").execute()
.assertJson(getClass(), "create_user.json");
- verify(service).create(newUserCaptor.capture());
- assertThat(newUserCaptor.getValue().login()).isEqualTo("john");
- assertThat(newUserCaptor.getValue().name()).isEqualTo("John");
- assertThat(newUserCaptor.getValue().email()).isEqualTo("john@email.com");
- assertThat(newUserCaptor.getValue().scmAccounts()).containsOnly("jn");
- assertThat(newUserCaptor.getValue().password()).isEqualTo("1234");
- assertThat(newUserCaptor.getValue().passwordConfirmation()).isEqualTo("1234");
+ UserDoc user = index.getByLogin("john");
+ assertThat(user.login()).isEqualTo("john");
+ assertThat(user.name()).isEqualTo("John");
+ assertThat(user.email()).isEqualTo("john@email.com");
+ assertThat(user.scmAccounts()).containsOnly("jn");
}
@Test
public void reactivate_user() throws Exception {
- Map<String, Object> userDocMap = newHashMap();
- userDocMap.put("login", "john");
- userDocMap.put("name", "John");
- userDocMap.put("email", "john@email.com");
- userDocMap.put("scmAccounts", newArrayList("jn"));
- userDocMap.put("active", true);
- userDocMap.put("createdAt", 15000L);
- userDocMap.put("updatedAt", 15000L);
- when(service.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
- when(service.create(any(NewUser.class))).thenReturn(true);
-
- MockUserSession.set().setLogin("julien").setLocale(Locale.FRENCH);
+ MockUserSession.set().setLogin("admin").setLocale(Locale.FRENCH).setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
+
+ dbClient.userDao().insert(session, new UserDto()
+ .setEmail("john@email.com")
+ .setLogin("john")
+ .setName("John")
+ .setActive(true));
+ session.commit();
+ dbClient.userDao().deactivateUserByLogin("john");
+ userIndexer.index();
+
when(i18n.message(Locale.FRENCH, "user.reactivated", "user.reactivated", "john")).thenReturn("The user 'john' has been reactivated.");
tester.newPostRequest("api/users", "create")
.setParam("password", "1234")
.setParam("password_confirmation", "1234").execute()
.assertJson(getClass(), "reactivate_user.json");
+
+ assertThat(index.getByLogin("john").active()).isTrue();
}
+ @Test(expected = ForbiddenException.class)
+ public void fail_on_missing_permission() throws Exception {
+ MockUserSession.set().setLogin("not_admin");
+
+ tester.newPostRequest("api/users", "create")
+ .setParam("login", "john")
+ .setParam("name", "John")
+ .setParam("email", "john@email.com")
+ .setParam("scm_accounts", "jn")
+ .setParam("password", "1234")
+ .setParam("password_confirmation", "1234").execute();
+ }
}
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.sonar.api.server.ws.WebService;
+import org.sonar.core.permission.GlobalPermissions;
+import org.sonar.server.user.MockUserSession;
import org.sonar.server.user.UpdateUser;
-import org.sonar.server.user.UserService;
+import org.sonar.server.user.UserUpdater;
import org.sonar.server.user.index.UserDoc;
+import org.sonar.server.user.index.UserIndex;
import org.sonar.server.ws.WsTester;
import java.util.Map;
WsTester tester;
@Mock
- UserService service;
+ UserIndex index;
+
+ @Mock
+ UserUpdater updater;
@Captor
ArgumentCaptor<UpdateUser> userCaptor;
@Before
public void setUp() throws Exception {
- tester = new WsTester(new UsersWs(new UpdateAction(service)));
+ tester = new WsTester(new UsersWs(new UpdateAction(index, updater)));
controller = tester.controller("api/users");
+ MockUserSession.set().setLogin("admin").setGlobalPermissions(GlobalPermissions.SYSTEM_ADMIN);
}
@Test
userDocMap.put("active", true);
userDocMap.put("createdAt", 15000L);
userDocMap.put("updatedAt", 15000L);
- when(service.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
+ when(index.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
tester.newPostRequest("api/users", "update")
.setParam("login", "john")
.execute()
.assertJson(getClass(), "update_user.json");
- verify(service).update(userCaptor.capture());
+ verify(updater).update(userCaptor.capture());
assertThat(userCaptor.getValue().login()).isEqualTo("john");
assertThat(userCaptor.getValue().name()).isEqualTo("John");
assertThat(userCaptor.getValue().email()).isEqualTo("john@email.com");
userDocMap.put("active", true);
userDocMap.put("createdAt", 15000L);
userDocMap.put("updatedAt", 15000L);
- when(service.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
+ when(index.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
tester.newPostRequest("api/users", "update")
.setParam("login", "john")
.setParam("name", "John")
.execute();
- verify(service).update(userCaptor.capture());
+ verify(updater).update(userCaptor.capture());
assertThat(userCaptor.getValue().isNameChanged()).isTrue();
assertThat(userCaptor.getValue().isEmailChanged()).isFalse();
assertThat(userCaptor.getValue().isScmAccountsChanged()).isFalse();
userDocMap.put("active", true);
userDocMap.put("createdAt", 15000L);
userDocMap.put("updatedAt", 15000L);
- when(service.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
+ when(index.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
tester.newPostRequest("api/users", "update")
.setParam("login", "john")
.setParam("email", "john@email.com")
.execute();
- verify(service).update(userCaptor.capture());
+ verify(updater).update(userCaptor.capture());
assertThat(userCaptor.getValue().isNameChanged()).isFalse();
assertThat(userCaptor.getValue().isEmailChanged()).isTrue();
assertThat(userCaptor.getValue().isScmAccountsChanged()).isFalse();
userDocMap.put("active", true);
userDocMap.put("createdAt", 15000L);
userDocMap.put("updatedAt", 15000L);
- when(service.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
+ when(index.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
tester.newPostRequest("api/users", "update")
.setParam("login", "john")
.setParam("scm_accounts", "jn")
.execute();
- verify(service).update(userCaptor.capture());
+ verify(updater).update(userCaptor.capture());
assertThat(userCaptor.getValue().isNameChanged()).isFalse();
assertThat(userCaptor.getValue().isEmailChanged()).isFalse();
assertThat(userCaptor.getValue().isScmAccountsChanged()).isTrue();
userDocMap.put("active", true);
userDocMap.put("createdAt", 15000L);
userDocMap.put("updatedAt", 15000L);
- when(service.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
+ when(index.getByLogin("john")).thenReturn(new UserDoc(userDocMap));
tester.newPostRequest("api/users", "update")
.setParam("login", "john")
.setParam("password_confirmation", "1234")
.execute();
- verify(service).update(userCaptor.capture());
+ verify(updater).update(userCaptor.capture());
assertThat(userCaptor.getValue().isNameChanged()).isFalse();
assertThat(userCaptor.getValue().isEmailChanged()).isFalse();
assertThat(userCaptor.getValue().isScmAccountsChanged()).isFalse();
import org.sonar.api.i18n.I18n;
import org.sonar.api.server.ws.RailsHandler;
import org.sonar.api.server.ws.WebService;
-import org.sonar.server.user.UserService;
+import org.sonar.server.user.UserUpdater;
+import org.sonar.server.user.index.UserIndex;
import org.sonar.server.ws.WsTester;
import static org.assertj.core.api.Assertions.assertThat;
@Before
public void setUp() throws Exception {
WsTester tester = new WsTester(new UsersWs(
- new CreateAction(mock(UserService.class), mock(I18n.class)),
- new UpdateAction(mock(UserService.class)),
+ new CreateAction(mock(UserIndex.class), mock(UserUpdater.class), mock(I18n.class)),
+ new UpdateAction(mock(UserIndex.class), mock(UserUpdater.class)),
new CurrentUserAction()));
controller = tester.controller("api/users");
}