import org.sonar.api.utils.log.Logger;
import org.sonar.api.utils.log.Loggers;
import org.sonar.db.organization.OrganizationQuery;
+import org.sonar.server.user.AbstractUserSession;
+import org.sonar.server.user.SystemPasscode;
import org.sonar.server.user.UserSession;
public class DeleteEmptyPersonalOrgsAction implements OrganizationsWsAction {
private static final String ACTION = "delete_empty_personal_orgs";
+ private final SystemPasscode passcode;
private final UserSession userSession;
private final OrganizationDeleter organizationDeleter;
- public DeleteEmptyPersonalOrgsAction(UserSession userSession, OrganizationDeleter organizationDeleter) {
+ public DeleteEmptyPersonalOrgsAction(SystemPasscode passcode, UserSession userSession, OrganizationDeleter organizationDeleter) {
+ this.passcode = passcode;
this.userSession = userSession;
this.organizationDeleter = organizationDeleter;
}
@Override
public void handle(Request request, Response response) throws Exception {
- userSession.checkLoggedIn().checkIsSystemAdministrator();
+ if (!passcode.isValid(request) && !userSession.isSystemAdministrator()) {
+ throw AbstractUserSession.insufficientPrivilegesException();
+ }
LOGGER.info("deleting empty personal organizations");
organizationDeleter.deleteByQuery(query);
+ LOGGER.info("Deleted empty personal organizations");
+
response.noContent();
}
import org.sonar.server.qualityprofile.QProfileFactoryImpl;
import org.sonar.server.qualityprofile.index.ActiveRuleIndexer;
import org.sonar.server.tester.UserSessionRule;
+import org.sonar.server.user.SystemPasscode;
import org.sonar.server.user.index.UserIndexer;
import org.sonar.server.ws.WsActionTester;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import static org.sonar.db.permission.OrganizationPermission.ADMINISTER;
public class DeleteEmptyPersonalOrgsActionTest {
@Rule
public final ExpectedException expectedException = ExpectedException.none();
+ private SystemPasscode passcode = mock(SystemPasscode.class);
private final OrganizationDeleter organizationDeleter = new OrganizationDeleter(dbClient,
new ComponentCleanerService(dbClient, new ResourceTypesRule(), new ProjectIndexersImpl()),
new UserIndexer(dbClient, esClient),
new ProjectLifeCycleListenersImpl(new ProjectLifeCycleListener[0]),
new BillingValidationsProxyImpl());
- private final DeleteEmptyPersonalOrgsAction underTest = new DeleteEmptyPersonalOrgsAction(userSession, organizationDeleter);
+ private final DeleteEmptyPersonalOrgsAction underTest = new DeleteEmptyPersonalOrgsAction(passcode, userSession, organizationDeleter);
private final WsActionTester ws = new WsActionTester(underTest);
@Test
@Test
public void delete_empty_personal_orgs() {
+ UserDto admin = db.users().insertUser();
+ db.users().insertPermissionOnUser(admin, ADMINISTER);
+ userSession.logIn().setSystemAdministrator();
+
+ doRun();
+ }
+
+ @Test
+ public void authenticate_with_system_passcode() {
+ when(passcode.isValid(any())).thenReturn(true);
+
+ doRun();
+ }
+
+ private void doRun() {
OrganizationDto emptyPersonal = db.organizations().insert(o -> o.setGuarded(true));
db.users().insertUser(u -> u.setOrganizationUuid(emptyPersonal.getUuid()));
OrganizationDto nonEmptyRegular = db.organizations().insert();
db.components().insertPublicProject(nonEmptyRegular);
- UserDto admin = db.users().insertUser();
- db.users().insertPermissionOnUser(admin, ADMINISTER);
- userSession.logIn().setSystemAdministrator();
ws.newRequest().execute();
List<String> notDeleted = Arrays.asList(