mirror of
https://github.com/Qortal/qortal.git
synced 2025-02-12 10:15:49 +00:00
Require an API key or prior authorization on GET /arbitrary/resource/status/* endpoints
This commit is contained in:
parent
13bcfbe3c5
commit
4b3b96447f
@ -1,5 +1,8 @@
|
|||||||
package org.qortal.api;
|
package org.qortal.api;
|
||||||
|
|
||||||
|
import org.qortal.arbitrary.ArbitraryDataResource;
|
||||||
|
import org.qortal.arbitrary.misc.Service;
|
||||||
|
import org.qortal.controller.arbitrary.ArbitraryDataRenderManager;
|
||||||
import org.qortal.settings.Settings;
|
import org.qortal.settings.Settings;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -61,6 +64,23 @@ public abstract class Security {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void requirePriorAuthorization(HttpServletRequest request, String resourceId, Service service, String identifier) {
|
||||||
|
ArbitraryDataResource resource = new ArbitraryDataResource(resourceId, null, service, identifier);
|
||||||
|
if (!ArbitraryDataRenderManager.getInstance().isAuthorized(resource)) {
|
||||||
|
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.UNAUTHORIZED, "Call /render/authorize first");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void requirePriorAuthorizationOrApiKey(HttpServletRequest request, String resourceId, Service service, String identifier) {
|
||||||
|
try {
|
||||||
|
Security.checkApiCallAllowed(request);
|
||||||
|
|
||||||
|
} catch (ApiException e) {
|
||||||
|
// API call wasn't allowed, but maybe it was pre-authorized
|
||||||
|
Security.requirePriorAuthorization(request, resourceId, service, identifier);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static ApiKey getApiKey(HttpServletRequest request) {
|
public static ApiKey getApiKey(HttpServletRequest request) {
|
||||||
ApiKey apiKey = ApiService.getInstance().getApiKey();
|
ApiKey apiKey = ApiService.getInstance().getApiKey();
|
||||||
if (apiKey == null) {
|
if (apiKey == null) {
|
||||||
|
@ -140,10 +140,12 @@ public class ArbitraryResource {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@SecurityRequirement(name = "apiKey")
|
||||||
public ArbitraryResourceSummary getDefaultResourceStatus(@PathParam("service") Service service,
|
public ArbitraryResourceSummary getDefaultResourceStatus(@PathParam("service") Service service,
|
||||||
@PathParam("name") String name,
|
@PathParam("name") String name,
|
||||||
@QueryParam("build") Boolean build) {
|
@QueryParam("build") Boolean build) {
|
||||||
|
|
||||||
|
Security.requirePriorAuthorizationOrApiKey(request, name, service, null);
|
||||||
return this.getSummary(service, name, null, build);
|
return this.getSummary(service, name, null, build);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,11 +160,13 @@ public class ArbitraryResource {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
@SecurityRequirement(name = "apiKey")
|
||||||
public ArbitraryResourceSummary getResourceStatus(@PathParam("service") Service service,
|
public ArbitraryResourceSummary getResourceStatus(@PathParam("service") Service service,
|
||||||
@PathParam("name") String name,
|
@PathParam("name") String name,
|
||||||
@PathParam("identifier") String identifier,
|
@PathParam("identifier") String identifier,
|
||||||
@QueryParam("build") Boolean build) {
|
@QueryParam("build") Boolean build) {
|
||||||
|
|
||||||
|
Security.requirePriorAuthorizationOrApiKey(request, name, service, identifier);
|
||||||
return this.getSummary(service, name, identifier, build);
|
return this.getSummary(service, name, identifier, build);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ public class RenderResource {
|
|||||||
@Path("/signature/{signature}")
|
@Path("/signature/{signature}")
|
||||||
@SecurityRequirement(name = "apiKey")
|
@SecurityRequirement(name = "apiKey")
|
||||||
public HttpServletResponse getIndexBySignature(@PathParam("signature") String signature) {
|
public HttpServletResponse getIndexBySignature(@PathParam("signature") String signature) {
|
||||||
requirePriorAuthorization(signature, Service.WEBSITE, null);
|
Security.requirePriorAuthorization(request, signature, Service.WEBSITE, null);
|
||||||
return this.get(signature, ResourceIdType.SIGNATURE, null, "/", null, "/render/signature", true, true);
|
return this.get(signature, ResourceIdType.SIGNATURE, null, "/", null, "/render/signature", true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ public class RenderResource {
|
|||||||
@Path("/signature/{signature}/{path:.*}")
|
@Path("/signature/{signature}/{path:.*}")
|
||||||
@SecurityRequirement(name = "apiKey")
|
@SecurityRequirement(name = "apiKey")
|
||||||
public HttpServletResponse getPathBySignature(@PathParam("signature") String signature, @PathParam("path") String inPath) {
|
public HttpServletResponse getPathBySignature(@PathParam("signature") String signature, @PathParam("path") String inPath) {
|
||||||
requirePriorAuthorization(signature, Service.WEBSITE, null);
|
Security.requirePriorAuthorization(request, signature, Service.WEBSITE, null);
|
||||||
return this.get(signature, ResourceIdType.SIGNATURE, null, inPath,null, "/render/signature", true, true);
|
return this.get(signature, ResourceIdType.SIGNATURE, null, inPath,null, "/render/signature", true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ public class RenderResource {
|
|||||||
@Path("/hash/{hash}")
|
@Path("/hash/{hash}")
|
||||||
@SecurityRequirement(name = "apiKey")
|
@SecurityRequirement(name = "apiKey")
|
||||||
public HttpServletResponse getIndexByHash(@PathParam("hash") String hash58, @QueryParam("secret") String secret58) {
|
public HttpServletResponse getIndexByHash(@PathParam("hash") String hash58, @QueryParam("secret") String secret58) {
|
||||||
requirePriorAuthorization(hash58, Service.WEBSITE, null);
|
Security.requirePriorAuthorization(request, hash58, Service.WEBSITE, null);
|
||||||
return this.get(hash58, ResourceIdType.FILE_HASH, Service.WEBSITE, "/", secret58, "/render/hash", true, false);
|
return this.get(hash58, ResourceIdType.FILE_HASH, Service.WEBSITE, "/", secret58, "/render/hash", true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ public class RenderResource {
|
|||||||
@SecurityRequirement(name = "apiKey")
|
@SecurityRequirement(name = "apiKey")
|
||||||
public HttpServletResponse getPathByHash(@PathParam("hash") String hash58, @PathParam("path") String inPath,
|
public HttpServletResponse getPathByHash(@PathParam("hash") String hash58, @PathParam("path") String inPath,
|
||||||
@QueryParam("secret") String secret58) {
|
@QueryParam("secret") String secret58) {
|
||||||
requirePriorAuthorization(hash58, Service.WEBSITE, null);
|
Security.requirePriorAuthorization(request, hash58, Service.WEBSITE, null);
|
||||||
return this.get(hash58, ResourceIdType.FILE_HASH, Service.WEBSITE, inPath, secret58, "/render/hash", true, false);
|
return this.get(hash58, ResourceIdType.FILE_HASH, Service.WEBSITE, inPath, secret58, "/render/hash", true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,7 +157,7 @@ public class RenderResource {
|
|||||||
public HttpServletResponse getPathByName(@PathParam("service") Service service,
|
public HttpServletResponse getPathByName(@PathParam("service") Service service,
|
||||||
@PathParam("name") String name,
|
@PathParam("name") String name,
|
||||||
@PathParam("path") String inPath) {
|
@PathParam("path") String inPath) {
|
||||||
requirePriorAuthorization(name, service, null);
|
Security.requirePriorAuthorization(request, name, service, null);
|
||||||
String prefix = String.format("/render/%s", service);
|
String prefix = String.format("/render/%s", service);
|
||||||
return this.get(name, ResourceIdType.NAME, service, inPath, null, prefix, true, true);
|
return this.get(name, ResourceIdType.NAME, service, inPath, null, prefix, true, true);
|
||||||
}
|
}
|
||||||
@ -167,7 +167,7 @@ public class RenderResource {
|
|||||||
@SecurityRequirement(name = "apiKey")
|
@SecurityRequirement(name = "apiKey")
|
||||||
public HttpServletResponse getIndexByName(@PathParam("service") Service service,
|
public HttpServletResponse getIndexByName(@PathParam("service") Service service,
|
||||||
@PathParam("name") String name) {
|
@PathParam("name") String name) {
|
||||||
requirePriorAuthorization(name, service, null);
|
Security.requirePriorAuthorization(request, name, service, null);
|
||||||
String prefix = String.format("/render/%s", service);
|
String prefix = String.format("/render/%s", service);
|
||||||
return this.get(name, ResourceIdType.NAME, service, "/", null, prefix, true, true);
|
return this.get(name, ResourceIdType.NAME, service, "/", null, prefix, true, true);
|
||||||
}
|
}
|
||||||
@ -200,11 +200,4 @@ public class RenderResource {
|
|||||||
return renderer.render();
|
return renderer.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void requirePriorAuthorization(String resourceId, Service service, String identifier) {
|
|
||||||
ArbitraryDataResource resource = new ArbitraryDataResource(resourceId, null, service, identifier);
|
|
||||||
if (!ArbitraryDataRenderManager.getInstance().isAuthorized(resource)) {
|
|
||||||
throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.UNAUTHORIZED, "Call /render/authorize first");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user