Skip to content

Commit b70c680

Browse files
authored
Merge pull request #1179 from amvanbaren/automate-claim-namespace
Automate namespace claim process
2 parents a238417 + b1f5a60 commit b70c680

File tree

8 files changed

+45
-37
lines changed

8 files changed

+45
-37
lines changed

server/src/main/java/org/eclipse/openvsx/admin/AdminAPI.java

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,8 @@ public ResponseEntity<String> getReportCsv(
8888
}
8989
}
9090

91-
private void validateToken(String tokenValue) {
92-
if(!repositories.isAdminToken(tokenValue)) {
93-
throw new ErrorResultException("Invalid access token", HttpStatus.FORBIDDEN);
94-
}
95-
}
96-
9791
private AdminStatistics getReport(String tokenValue, int year, int month) {
98-
validateToken(tokenValue);
92+
admins.checkAdminUser(tokenValue);
9993
return admins.getAdminStatistics(year, month);
10094
}
10195

@@ -295,9 +289,17 @@ public ResponseEntity<ResultJson> changeNamespace(@RequestBody ChangeNamespaceJs
295289
path = "/admin/namespace/{namespaceName}/members",
296290
produces = MediaType.APPLICATION_JSON_VALUE
297291
)
298-
public ResponseEntity<NamespaceMembershipListJson> getNamespaceMembers(@PathVariable String namespaceName) {
292+
public ResponseEntity<NamespaceMembershipListJson> getNamespaceMembers(
293+
@PathVariable String namespaceName,
294+
@RequestParam(value = "token", required = false) String tokenValue
295+
) {
299296
try{
300-
admins.checkAdminUser();
297+
if(tokenValue == null) {
298+
admins.checkAdminUser();
299+
} else {
300+
admins.checkAdminUser(tokenValue);
301+
}
302+
301303
var memberships = repositories.findMemberships(namespaceName);
302304
var membershipList = new NamespaceMembershipListJson();
303305
membershipList.setNamespaceMemberships(memberships.stream().map(NamespaceMembership::toJson).toList());
@@ -311,12 +313,15 @@ public ResponseEntity<NamespaceMembershipListJson> getNamespaceMembers(@PathVari
311313
path = "/admin/namespace/{namespaceName}/change-member",
312314
produces = MediaType.APPLICATION_JSON_VALUE
313315
)
314-
public ResponseEntity<ResultJson> editNamespaceMember(@PathVariable String namespaceName,
315-
@RequestParam("user") String userName,
316-
@RequestParam(required = false) String provider,
317-
@RequestParam String role) {
316+
public ResponseEntity<ResultJson> editNamespaceMember(
317+
@PathVariable String namespaceName,
318+
@RequestParam("user") String userName,
319+
@RequestParam(required = false) String provider,
320+
@RequestParam String role,
321+
@RequestParam(value = "token", required = false) String tokenValue
322+
) {
318323
try {
319-
var adminUser = admins.checkAdminUser();
324+
var adminUser = tokenValue == null ? admins.checkAdminUser() : admins.checkAdminUser(tokenValue);
320325
var result = admins.editNamespaceMember(namespaceName, userName, provider, role, adminUser);
321326
return ResponseEntity.ok(result);
322327
} catch (ErrorResultException exc) {

server/src/main/java/org/eclipse/openvsx/admin/AdminService.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.time.ZoneId;
3535
import java.util.Comparator;
3636
import java.util.LinkedHashSet;
37+
import java.util.Optional;
3738
import java.util.stream.Collectors;
3839

3940
import static org.eclipse.openvsx.entities.FileResource.*;
@@ -388,7 +389,19 @@ public ResultJson revokePublisherContributions(String provider, String loginName
388389
}
389390

390391
public UserData checkAdminUser() {
391-
var user = users.findLoggedInUser();
392+
return checkAdminUser(users.findLoggedInUser());
393+
}
394+
395+
public UserData checkAdminUser(String tokenValue) {
396+
var user = Optional.of(tokenValue)
397+
.map(users::useAccessToken)
398+
.map(PersonalAccessToken::getUser)
399+
.orElse(null);
400+
401+
return checkAdminUser(user);
402+
}
403+
404+
private UserData checkAdminUser(UserData user) {
392405
if (user == null || !UserData.ROLE_ADMIN.equals(user.getRole())) {
393406
throw new ErrorResultException("Administration role is required.", HttpStatus.FORBIDDEN);
394407
}

server/src/main/java/org/eclipse/openvsx/admin/ChangeNamespaceJobRequestHandler.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ public ChangeNamespaceJobRequestHandler(
7070
@Override
7171
public void run(ChangeNamespaceJobRequest jobRequest) throws Exception {
7272
var oldNamespace = jobRequest.getData().oldNamespace();
73-
synchronized (LOCKS.computeIfAbsent(oldNamespace, key -> new Object())) {
73+
Object lock;
74+
synchronized (LOCKS) {
75+
lock = LOCKS.computeIfAbsent(oldNamespace, key -> new Object());
76+
}
77+
synchronized (lock) {
7478
execute(jobRequest);
7579
}
7680
}

server/src/main/java/org/eclipse/openvsx/repositories/PersonalAccessTokenJooqRepository.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,10 @@
99
* ****************************************************************************** */
1010
package org.eclipse.openvsx.repositories;
1111

12-
import org.eclipse.openvsx.entities.UserData;
1312
import org.jooq.DSLContext;
1413
import org.springframework.stereotype.Component;
1514

1615
import static org.eclipse.openvsx.jooq.Tables.PERSONAL_ACCESS_TOKEN;
17-
import static org.eclipse.openvsx.jooq.Tables.USER_DATA;
1816

1917
@Component
2018
public class PersonalAccessTokenJooqRepository {
@@ -31,15 +29,4 @@ public boolean hasToken(String value) {
3129
.where(PERSONAL_ACCESS_TOKEN.VALUE.eq(value))
3230
);
3331
}
34-
35-
public boolean isAdminToken(String value) {
36-
return dsl.fetchExists(
37-
dsl.selectOne()
38-
.from(PERSONAL_ACCESS_TOKEN)
39-
.join(USER_DATA).on(USER_DATA.ID.eq(PERSONAL_ACCESS_TOKEN.USER_DATA))
40-
.where(PERSONAL_ACCESS_TOKEN.VALUE.eq(value))
41-
.and(PERSONAL_ACCESS_TOKEN.ACTIVE.eq(true))
42-
.and(USER_DATA.ROLE.eq(UserData.ROLE_ADMIN))
43-
);
44-
}
4532
}

server/src/main/java/org/eclipse/openvsx/repositories/RepositoryService.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,6 @@ public PersonalAccessToken findAccessToken(String value) {
342342
return tokenRepo.findByValue(value);
343343
}
344344

345-
public boolean isAdminToken(String value) {
346-
return tokenJooqRepo.isAdminToken(value);
347-
}
348-
349345
public PersonalAccessToken findAccessToken(long id) {
350346
return tokenRepo.findById(id);
351347
}

server/src/main/java/org/eclipse/openvsx/util/FileUtil.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ private FileUtil(){}
3838
* @param writer Writes to file
3939
*/
4040
public static void writeSync(Path path, Consumer<Path> writer) {
41-
synchronized (LOCKS.computeIfAbsent(path, key -> new Object())) {
41+
Object lock;
42+
synchronized (LOCKS) {
43+
lock = LOCKS.computeIfAbsent(path, key -> new Object());
44+
}
45+
synchronized (lock) {
4246
if(!Files.exists(path)) {
4347
writer.accept(path);
4448
}

server/src/test/java/org/eclipse/openvsx/admin/AdminAPITest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,7 +1021,7 @@ private PersonalAccessToken mockAdminToken() {
10211021
token.setActive(true);
10221022
token.setValue(tokenValue);
10231023
token.setUser(user);
1024-
Mockito.when(repositories.isAdminToken(tokenValue)).thenReturn(true);
1024+
Mockito.when(repositories.findAccessToken(tokenValue)).thenReturn(token);
10251025

10261026
return token;
10271027
}
@@ -1035,7 +1035,7 @@ private PersonalAccessToken mockNonAdminToken() {
10351035
token.setActive(true);
10361036
token.setValue(tokenValue);
10371037
token.setUser(user);
1038-
Mockito.when(repositories.isAdminToken(tokenValue)).thenReturn(false);
1038+
Mockito.when(repositories.findAccessToken(tokenValue)).thenReturn(token);
10391039

10401040
return token;
10411041
}

server/src/test/java/org/eclipse/openvsx/repositories/RepositoryServiceSmokeTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ void testExecuteQueries() {
194194
() -> repositories.findExtensionTargetPlatforms(extension),
195195
() -> repositories.deactivateKeyPairs(),
196196
() -> repositories.findActiveAccessTokens(userData),
197-
() -> repositories.isAdminToken("tokenValue"),
198197
() -> repositories.findLatestVersions(List.of(1L)),
199198
() -> repositories.hasSameVersion(extVersion),
200199
() -> repositories.hasActiveReview(extension, userData),

0 commit comments

Comments
 (0)