From bfc861d59a50e3fc6968f6ad633e12ecad8cd979 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Mon, 30 Nov 2020 15:20:03 -0500 Subject: [PATCH] start adding swagger auth documentation --- bubble-server/pom.xml | 6 +++ .../java/bubble/auth/BubbleAuthFilter.java | 2 +- .../bubble/resources/account/MeResource.java | 38 +++++++++++++++++++ bubble-web | 2 +- utils/cobbzilla-wizard | 2 +- 5 files changed, 47 insertions(+), 3 deletions(-) diff --git a/bubble-server/pom.xml b/bubble-server/pom.xml index eae5efa6..b43175a3 100644 --- a/bubble-server/pom.xml +++ b/bubble-server/pom.xml @@ -301,6 +301,12 @@ 1.0.0-SNAPSHOT test + + + io.swagger.core.v3 + swagger-annotations + 2.1.5 + diff --git a/bubble-server/src/main/java/bubble/auth/BubbleAuthFilter.java b/bubble-server/src/main/java/bubble/auth/BubbleAuthFilter.java index de4ea0c6..56a47d57 100644 --- a/bubble-server/src/main/java/bubble/auth/BubbleAuthFilter.java +++ b/bubble-server/src/main/java/bubble/auth/BubbleAuthFilter.java @@ -49,7 +49,7 @@ public class BubbleAuthFilter extends AuthFilter { @Autowired @Getter private BubbleAuthProvider authProvider; @Autowired @Getter private BubbleConfiguration configuration; - @Override protected String getAuthTokenHeader() { return SESSION_HEADER; } + @Override public String getAuthTokenHeader() { return SESSION_HEADER; } @Override protected Set getSkipAuthPaths() { if (configuration.testMode()) return SKIP_AUTH_TEST; diff --git a/bubble-server/src/main/java/bubble/resources/account/MeResource.java b/bubble-server/src/main/java/bubble/resources/account/MeResource.java index 1ac2ee17..941e4153 100644 --- a/bubble-server/src/main/java/bubble/resources/account/MeResource.java +++ b/bubble-server/src/main/java/bubble/resources/account/MeResource.java @@ -34,6 +34,8 @@ import bubble.service.boot.StandardSelfNodeService; import bubble.service.cloud.NodeLaunchMonitor; import bubble.service.upgrade.BubbleJarUpgradeService; import com.fasterxml.jackson.databind.JsonNode; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import lombok.Cleanup; import lombok.Getter; import lombok.extern.slf4j.Slf4j; @@ -76,6 +78,7 @@ import static org.cobbzilla.util.http.HttpContentTypes.*; import static org.cobbzilla.util.json.JsonUtil.json; import static org.cobbzilla.wizard.resources.ResourceUtil.*; import static org.cobbzilla.wizard.server.RestServerBase.reportError; +import static org.cobbzilla.wizard.server.config.OpenApiConfiguration.SEC_API_KEY; @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) @@ -92,6 +95,7 @@ public class MeResource { @Autowired private AccountMessageDAO messageDAO; @GET + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response me(@Context ContainerRequest ctx) { try { final Account account = userPrincipal(ctx); @@ -109,12 +113,14 @@ public class MeResource { } @GET @Path(EP_LOCALE) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response getLocale(@Context ContainerRequest ctx) { final Account account = userPrincipal(ctx); return ok(account.getLocale()); } @POST @Path(EP_LOCALE+"/{locale}") + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response setLocale(@Context ContainerRequest ctx, @PathParam("locale") String locale) { final Account account = userPrincipal(ctx); @@ -147,6 +153,7 @@ public class MeResource { public Response errorApi(@Context Request req) { return ok(getErrorApi()); } @POST @Path(EP_CHANGE_PASSWORD) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response changePassword(@Context Request req, @Context ContainerRequest ctx, ChangePasswordRequest request) { @@ -199,6 +206,7 @@ public class MeResource { @Autowired private StandardAccountMessageService messageService; @POST @Path(EP_APPROVE+"/{token}") + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response approve(@Context Request req, @Context ContainerRequest ctx, @PathParam("token") String token) { @@ -215,6 +223,7 @@ public class MeResource { } @POST @Path(EP_DENY+"/{token}") + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response deny(@Context Request req, @Context ContainerRequest ctx, @PathParam("token") String token) { @@ -225,6 +234,7 @@ public class MeResource { } @POST @Path(EP_DOWNLOAD) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response requestDownloadAccountData(@Context Request req, @Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); @@ -238,6 +248,7 @@ public class MeResource { } @POST @Path(EP_DOWNLOAD+"/{uuid}") + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response downloadAccountData(@Context Request req, @Context ContainerRequest ctx, @PathParam("uuid") String uuid) { @@ -248,6 +259,7 @@ public class MeResource { } @POST @Path(EP_SCRIPT) @Produces(TEXT_PLAIN) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response runScript(@Context ContainerRequest ctx, JsonNode script) { final Account caller = userPrincipal(ctx); @@ -270,120 +282,140 @@ public class MeResource { } @Path(EP_APPS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public AppsResource getApps(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(AppsResource.class, caller); } @Path(EP_DRIVERS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public DriversResource getDrivers(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(DriversResource.class, caller); } @Path(EP_NODES) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public NodesResource getNodes(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(NodesResource.class, caller); } @Path(EP_CLOUDS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public CloudServicesResource getClouds(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(CloudServicesResource.class, caller); } @Path(EP_REGIONS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public CloudServiceRegionsResource getCloudRegions(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(CloudServiceRegionsResource.class, caller); } @Path(EP_DOMAINS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public DomainsResource getDomains(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(DomainsResource.class, caller); } @Path(EP_NETWORKS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public NetworksResource getNetworks(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(NetworksResource.class, caller); } @Path(EP_SENT_NOTIFICATIONS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public SentNotificationsResource getSentNotificationsResource(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(SentNotificationsResource.class, caller); } @Path(EP_RECEIVED_NOTIFICATIONS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public ReceivedNotificationsResource getReceivedNotificationsResource(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(ReceivedNotificationsResource.class, caller); } @Path(EP_PLANS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public AccountPlansResource getAllPlans(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(AccountPlansResource.class, caller); } @Path(EP_CURRENT_PLANS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public CurrentAccountPlansResource getCurrentPlans(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(CurrentAccountPlansResource.class, caller); } @Path(EP_KEYS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public AccountSshKeysResource getSshKeys(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(AccountSshKeysResource.class, caller); } @Path(EP_PAYMENT_METHODS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public AccountPaymentMethodsResource getAccountPaymentMethods(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(AccountPaymentMethodsResource.class, caller); } @Path(EP_BILLS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public BillsResource getBills(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(BillsResource.class, caller); } @Path(EP_PAYMENTS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public AccountPaymentsResource getPayments(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(AccountPaymentsResource.class, caller); } @Path(EP_FOOTPRINTS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public FootprintsResource getFootprints(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(FootprintsResource.class, caller); } @Path(EP_DEVICES) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public DevicesResource getDevices(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(DevicesResource.class, caller); } @Path(EP_DEVICE_TYPES) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public DeviceTypesResource getDeviceTypes(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(DeviceTypesResource.class, caller); } @Path(EP_FLEX_ROUTERS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public FlexRoutersResource getFlexRouters(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(FlexRoutersResource.class, caller); } @Path(EP_REFERRAL_CODES) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public ReferralCodesResource getReferralCodes(@Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); return configuration.subResource(ReferralCodesResource.class, caller); @@ -392,6 +424,7 @@ public class MeResource { @Autowired private NodeLaunchMonitor launchMonitor; @GET @Path(EP_STATUS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response listLaunchStatuses(@Context Request req, @Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); @@ -399,6 +432,7 @@ public class MeResource { } @Path(EP_PACKER) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public PackerResource getPackerResource(@Context Request req, @Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); @@ -406,6 +440,7 @@ public class MeResource { } @Path(EP_PROMOTIONS) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public AccountPromotionsResource getPromotionsResource(@Context Request req, @Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); @@ -416,6 +451,7 @@ public class MeResource { @POST @Path(EP_MODEL) @Consumes(MULTIPART_FORM_DATA) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response uploadModel(@Context Request req, @Context ContainerRequest ctx, @FormDataParam("file") InputStream in, @@ -441,6 +477,7 @@ public class MeResource { private static final long UPGRADE_CHECK_INTERVAL = MINUTES.toMillis(5); @GET @Path(EP_UPGRADE) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response checkForUpgrade(@Context Request req, @Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); @@ -458,6 +495,7 @@ public class MeResource { } @POST @Path(EP_UPGRADE) + @Operation(security=@SecurityRequirement(name=SEC_API_KEY)) public Response upgrade(@Context Request req, @Context ContainerRequest ctx) { final Account caller = userPrincipal(ctx); diff --git a/bubble-web b/bubble-web index 3aa2c918..1bdf0a60 160000 --- a/bubble-web +++ b/bubble-web @@ -1 +1 @@ -Subproject commit 3aa2c918c6a7ffc37a26d5b6fab161524c667db5 +Subproject commit 1bdf0a6043b03184ccbe49ed89582674b400a756 diff --git a/utils/cobbzilla-wizard b/utils/cobbzilla-wizard index 8da076b3..2aab787e 160000 --- a/utils/cobbzilla-wizard +++ b/utils/cobbzilla-wizard @@ -1 +1 @@ -Subproject commit 8da076b3a54a1af1d9d4efceace3b9c832b8d5dc +Subproject commit 2aab787e763f58a84ce7feef576d375476020ad6