Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion server/gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jackson = "2.18.6"
java = "25"
jaxb-api = "2.3.1"
jaxb-impl = "2.3.8"
jedis = "6.2.0"
jedis = "7.4.1"
jobrunr = "7.5.3"
jooq = "3.19.34"
jsonpath = "2.9.0"
Expand Down
7 changes: 7 additions & 0 deletions server/src/main/java/org/eclipse/openvsx/RegistryAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import jakarta.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.openvsx.entities.SemanticVersion;
import org.eclipse.openvsx.settings.MutatingOperation;
import org.eclipse.openvsx.json.*;
import org.eclipse.openvsx.search.ISearchService;
import org.eclipse.openvsx.search.SortBy;
Expand Down Expand Up @@ -1137,6 +1138,7 @@ public ResponseEntity<QueryResultJson> postQuery(
produces = MediaType.APPLICATION_JSON_VALUE
)
@Operation(summary = "Create a namespace")
@MutatingOperation
@ApiResponse(
responseCode = "201",
description = "Successfully created the namespace",
Expand Down Expand Up @@ -1197,6 +1199,7 @@ public ResponseEntity<ResultJson> createNamespace(
required = true
)
)
@MutatingOperation
@ApiResponse(
responseCode = "201",
description = "Successfully created the namespace",
Expand Down Expand Up @@ -1264,6 +1267,7 @@ public ResponseEntity<ResultJson> createNamespace(
required = true
)
)
@MutatingOperation
@ApiResponse(
responseCode = "201",
description = "Successfully published the extension",
Expand Down Expand Up @@ -1311,6 +1315,7 @@ public ResponseEntity<ExtensionJson> publish(
required = true
)
)
@MutatingOperation
@ApiResponse(
responseCode = "201",
description = "Successfully published the extension",
Expand Down Expand Up @@ -1357,6 +1362,7 @@ public ResponseEntity<ExtensionJson> publish(InputStream content) {
produces = MediaType.APPLICATION_JSON_VALUE
)
@Operation(hidden = true)
@MutatingOperation
public ResponseEntity<ResultJson> postReview(
@RequestBody(required = false) ReviewJson review,
@PathVariable String namespace,
Expand Down Expand Up @@ -1391,6 +1397,7 @@ public ResponseEntity<ResultJson> postReview(
produces = MediaType.APPLICATION_JSON_VALUE
)
@Operation(hidden = true)
@MutatingOperation
public ResponseEntity<ResultJson> deleteReview(@PathVariable String namespace, @PathVariable String extension) {
var json = local.deleteReview(namespace, extension);
if (json.getError() == null) {
Expand Down
7 changes: 7 additions & 0 deletions server/src/main/java/org/eclipse/openvsx/UserAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.eclipse.openvsx.accesstoken.AccessTokenService;
import org.eclipse.openvsx.eclipse.EclipseService;
import org.eclipse.openvsx.entities.*;
import org.eclipse.openvsx.settings.MutatingOperation;
import org.eclipse.openvsx.json.*;
import org.eclipse.openvsx.repositories.ExtensionScanRepository;
import org.eclipse.openvsx.repositories.RepositoryService;
Expand Down Expand Up @@ -163,6 +164,7 @@ public List<AccessTokenJson> getAccessTokens() {
path = "/user/token/create",
produces = MediaType.APPLICATION_JSON_VALUE
)
@MutatingOperation
public ResponseEntity<AccessTokenJson> createAccessToken(@RequestParam(required = false) String description) {
if (description != null && description.length() > TOKEN_DESCRIPTION_SIZE) {
var json = AccessTokenJson.error("The description must not be longer than " + TOKEN_DESCRIPTION_SIZE + " characters.");
Expand All @@ -180,6 +182,7 @@ public ResponseEntity<AccessTokenJson> createAccessToken(@RequestParam(required
path = "/user/token/delete/{id}",
produces = MediaType.APPLICATION_JSON_VALUE
)
@MutatingOperation
public ResponseEntity<ResultJson> deleteAccessToken(@PathVariable long id) {
var user = users.findLoggedInUser();
if (user == null) {
Expand Down Expand Up @@ -345,6 +348,7 @@ public ResponseEntity<ExtensionJson> getOwnExtension(@PathVariable String namesp
path = "/user/extension/{namespaceName}/{extensionName}/delete",
produces = MediaType.APPLICATION_JSON_VALUE
)
@MutatingOperation
public ResponseEntity<ResultJson> deleteExtension(
@PathVariable String namespaceName,
@PathVariable String extensionName,
Expand Down Expand Up @@ -400,6 +404,7 @@ public List<NamespaceJson> getOwnNamespaces() {
path = "/user/namespace/{namespace}/details",
produces = MediaType.APPLICATION_JSON_VALUE
)
@MutatingOperation
public ResponseEntity<ResultJson> updateNamespaceDetails(@RequestBody NamespaceDetailsJson details) {
var user = users.findLoggedInUser();
if (user == null) {
Expand All @@ -423,6 +428,7 @@ public ResponseEntity<ResultJson> updateNamespaceDetails(@RequestBody NamespaceD
produces = MediaType.APPLICATION_JSON_VALUE,
consumes = MediaType.MULTIPART_FORM_DATA_VALUE
)
@MutatingOperation
public ResponseEntity<ResultJson> updateNamespaceDetailsLogo(
@PathVariable String namespace,
@RequestParam MultipartFile file
Expand Down Expand Up @@ -464,6 +470,7 @@ public ResponseEntity<NamespaceMembershipListJson> getNamespaceMembers(@PathVari
path = "/user/namespace/{namespace}/role",
produces = MediaType.APPLICATION_JSON_VALUE
)
@MutatingOperation
public ResponseEntity<ResultJson> setNamespaceMember(@PathVariable String namespace, @RequestParam String user,
@RequestParam String role, @RequestParam(required = false) String provider) {
var requestingUser = users.findLoggedInUser();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
package org.eclipse.openvsx.accesstoken;

import org.eclipse.openvsx.migration.HandlerJobRequest;
import org.eclipse.openvsx.settings.SettingsService;
import org.jobrunr.jobs.annotations.Job;
import org.jobrunr.jobs.lambdas.JobRequestHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -20,14 +22,21 @@ public class ExpirePersonalAccessTokensHandler implements JobRequestHandler<Hand

private final Logger logger = LoggerFactory.getLogger(ExpirePersonalAccessTokensHandler.class);

private final SettingsService settings;
private final AccessTokenService tokens;

public ExpirePersonalAccessTokensHandler(AccessTokenService tokens) {
public ExpirePersonalAccessTokensHandler(SettingsService settings, AccessTokenService tokens) {
this.settings = settings;
this.tokens = tokens;
}

@Override
@Job(name = "Expire access tokens", retries = 0)
public void run(HandlerJobRequest<?> handlerJobRequest) throws Exception {
if (settings.isReadOnly()) {
return;
}

var count = tokens.expireAccessTokens();
if (count > 0) {
logger.info("Expired {} personal access token(s)", count);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
package org.eclipse.openvsx.accesstoken;

import org.eclipse.openvsx.migration.HandlerJobRequest;
import org.eclipse.openvsx.settings.SettingsService;
import org.eclipse.openvsx.util.TimeUtil;
import org.jobrunr.jobs.annotations.Job;
import org.jobrunr.jobs.lambdas.JobRequestHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -21,16 +23,23 @@ public class LegacyPersonalAccessTokenExpirationHandler implements JobRequestHan

private final Logger logger = LoggerFactory.getLogger(LegacyPersonalAccessTokenExpirationHandler.class);

private final SettingsService settings;
private final AccessTokenConfig config;
private final AccessTokenService tokens;

public LegacyPersonalAccessTokenExpirationHandler(AccessTokenConfig config, AccessTokenService tokens) {
public LegacyPersonalAccessTokenExpirationHandler(SettingsService settings, AccessTokenConfig config, AccessTokenService tokens) {
this.settings = settings;
this.config = config;
this.tokens = tokens;
}

@Override
@Job(name = "Legacy token expiration", retries = 0)
public void run(HandlerJobRequest<?> handlerJobRequest) throws Exception {
if (settings.isReadOnly()) {
return;
}

if (config.isTokenExpiryEnabled()) {
var expirationTime = TimeUtil.getCurrentUTC().plus(config.getExpiration());
var count = tokens.setExpirationTimeForLegacyAccessTokens(expirationTime);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@

import org.eclipse.openvsx.migration.HandlerJobRequest;
import org.eclipse.openvsx.repositories.RepositoryService;
import org.eclipse.openvsx.settings.SettingsService;
import org.eclipse.openvsx.util.TimeUtil;
import org.jobrunr.jobs.annotations.Job;
import org.jobrunr.jobs.lambdas.JobRequestHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -23,22 +25,30 @@ public class NotifyPersonalAccessTokenExpirationHandler implements JobRequestHan

private final Logger logger = LoggerFactory.getLogger(NotifyPersonalAccessTokenExpirationHandler.class);

private final SettingsService settings;
private final AccessTokenConfig config;
private final AccessTokenService tokens;
private final RepositoryService repositories;

public NotifyPersonalAccessTokenExpirationHandler(
SettingsService settings,
AccessTokenConfig config,
AccessTokenService tokens,
RepositoryService repositories
) {
this.settings = settings;
this.config = config;
this.tokens = tokens;
this.repositories = repositories;
}

@Override
@Job(name = "Notify token expiration", retries = 0)
public void run(HandlerJobRequest<?> handlerJobRequest) throws Exception {
if (settings.isReadOnly()) {
return;
}

if (config.isTokenExpiryNotificationEnabled()) {
var expireBefore = TimeUtil.getCurrentUTC().plus(config.getNotification());
var page = PageRequest.of(0, config.getMaxTokenNotifications());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
* ****************************************************************************** */
package org.eclipse.openvsx.adapter;

import org.eclipse.openvsx.settings.SettingsService;
import org.jobrunr.jobs.annotations.Job;
import org.jobrunr.jobs.lambdas.JobRequest;
import org.jobrunr.jobs.lambdas.JobRequestHandler;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
Expand All @@ -18,14 +20,21 @@
@ConditionalOnProperty(value = "ovsx.data.mirror.enabled", havingValue = "false", matchIfMissing = true)
public class VSCodeIdDailyUpdateJobRequestHandler implements JobRequestHandler<JobRequest> {

private final SettingsService settings;
private final VSCodeIdUpdateService service;

public VSCodeIdDailyUpdateJobRequestHandler(VSCodeIdUpdateService service) {
public VSCodeIdDailyUpdateJobRequestHandler(SettingsService settings, VSCodeIdUpdateService service) {
this.settings = settings;
this.service = service;
}

@Override
@Job(name = "VS Code ID daily update", retries = 0)
public void run(JobRequest request) throws Exception {
if (settings.isReadOnly()) {
return;
}

service.updateAll();
}
}
Loading