in src/main/java/com/googlesource/gerrit/plugins/serviceuser/RegisterServiceUser.java [116:192]
public Response<ServiceUserInfo> apply(ConfigResource parentResource, IdString id, Input input)
throws RestApiException, IOException, ConfigInvalidException, PermissionBackendException {
CurrentUser requestingUser = userProvider.get();
if (requestingUser == null || !requestingUser.isIdentifiedUser()) {
throw new AuthException("authentication required");
}
if (input == null) {
input = new Input();
}
IdentifiedUser user;
try {
user = accountResolver.resolve(input.username).asUniqueUser();
} catch (UnresolvableAccountException e) {
throw new BadRequestException("Username does not exist");
}
if (!requestingUser.getAccountId().equals(user.getAccountId())
&& !permissionBackend.user(requestingUser).testOrFalse(ADMINISTRATE_SERVER)) {
throw new MethodNotAllowedException("Forbidden");
}
if (blockedNameFilter.isBlocked(input.username)) {
throw new BadRequestException(
"The username '" + input.username + "' is not allowed as name for service users.");
}
String creator;
Account.Id creatorId;
if (Strings.isNullOrEmpty(input.creator)) {
creator = requestingUser.getUserName().orElse(null);
creatorId = requestingUser.asIdentifiedUser().getAccountId();
} else {
creator = input.creator;
creatorId = accountResolver.resolve(input.creator).asUniqueUser().getAccountId();
}
String creationDate = rfc2822DateFormatter.format(new Date());
String owner = null;
if (!Strings.isNullOrEmpty(input.owner)) {
try {
owner = groupResolver.parse(input.owner).getGroupUUID().toString();
} catch (UnresolvableAccountException e) {
throw new BadRequestException("The group '" + input.owner + "' does not exist");
}
}
try (MetaDataUpdate md = metaDataUpdateFactory.create(allProjects)) {
ProjectLevelConfig.Bare update = configProvider.get();
update.load(md);
Config db = update.getConfig();
if (db.getSubsections(USER).contains(input.username)) {
return Response.none();
}
db.setInt(USER, input.username, KEY_CREATOR_ID, creatorId.get());
if (creator != null) {
db.setString(USER, input.username, KEY_CREATED_BY, creator);
}
if (owner != null) {
db.setString(USER, input.username, KEY_OWNER, owner);
}
db.setString(USER, input.username, KEY_CREATED_AT, creationDate);
md.setMessage("Create service user '" + input.username + "'\n");
update.commit(md);
storageCache.invalidate();
}
ServiceUserInfo info = new ServiceUserInfo(new AccountInfo(user.getAccountId().get()));
AccountLoader al = accountLoader.create(true);
info.createdBy = al.get(creatorId);
al.fill();
info.createdAt = creationDate;
return Response.created(info);
}