Skip to content

Commit b71fb05

Browse files
authored
Annotate endpoints that are secured at the workspace level (#22168)
1 parent d22dfe8 commit b71fb05

14 files changed

+95
-1
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright (c) 2022 Airbyte, Inc., all rights reserved.
3+
*/
4+
5+
package io.airbyte.commons.auth;
6+
7+
import java.lang.annotation.ElementType;
8+
import java.lang.annotation.Inherited;
9+
import java.lang.annotation.Retention;
10+
import java.lang.annotation.RetentionPolicy;
11+
import java.lang.annotation.Target;
12+
13+
/**
14+
* Used to mark a controller route as requiring authorization at the workspace level. Works in
15+
* conjunction with {@link io.micronaut.security.annotation.Secured}, which denotes the required
16+
* roles that should be associated with the user and workspace.
17+
*/
18+
@Retention(RetentionPolicy.RUNTIME)
19+
@Target({ElementType.METHOD})
20+
@Inherited
21+
public @interface SecuredWorkspace {
22+
23+
}

airbyte-server/src/main/java/io/airbyte/server/apis/ConnectionApiController.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.airbyte.api.model.generated.ConnectionUpdate;
1717
import io.airbyte.api.model.generated.JobInfoRead;
1818
import io.airbyte.api.model.generated.WorkspaceIdRequestBody;
19+
import io.airbyte.commons.auth.SecuredWorkspace;
1920
import io.airbyte.commons.server.handlers.ConnectionsHandler;
2021
import io.airbyte.commons.server.handlers.OperationsHandler;
2122
import io.airbyte.commons.server.handlers.SchedulerHandler;
@@ -51,27 +52,31 @@ public ConnectionApiController(final ConnectionsHandler connectionsHandler,
5152
@Override
5253
@Post(uri = "/create")
5354
@Secured({EDITOR})
55+
@SecuredWorkspace
5456
public ConnectionRead createConnection(@Body final ConnectionCreate connectionCreate) {
5557
return ApiHelper.execute(() -> connectionsHandler.createConnection(connectionCreate));
5658
}
5759

5860
@Override
5961
@Post(uri = "/update")
6062
@Secured({EDITOR})
63+
@SecuredWorkspace
6164
public ConnectionRead updateConnection(@Body final ConnectionUpdate connectionUpdate) {
6265
return ApiHelper.execute(() -> connectionsHandler.updateConnection(connectionUpdate));
6366
}
6467

6568
@Override
6669
@Post(uri = "/list")
6770
@Secured({READER})
71+
@SecuredWorkspace
6872
public ConnectionReadList listConnectionsForWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) {
6973
return ApiHelper.execute(() -> connectionsHandler.listConnectionsForWorkspace(workspaceIdRequestBody));
7074
}
7175

7276
@Override
7377
@Post(uri = "/list_all")
7478
@Secured({READER})
79+
@SecuredWorkspace
7580
public ConnectionReadList listAllConnectionsForWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) {
7681
return ApiHelper.execute(() -> connectionsHandler.listAllConnectionsForWorkspace(workspaceIdRequestBody));
7782
}
@@ -85,6 +90,7 @@ public ConnectionReadList searchConnections(@Body final ConnectionSearch connect
8590
@Override
8691
@Post(uri = "/get")
8792
@Secured({READER})
93+
@SecuredWorkspace
8894
public ConnectionRead getConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) {
8995
return ApiHelper.execute(() -> connectionsHandler.getConnection(connectionIdRequestBody.getConnectionId()));
9096
}
@@ -93,6 +99,7 @@ public ConnectionRead getConnection(@Body final ConnectionIdRequestBody connecti
9399
@Post(uri = "/delete")
94100
@Status(HttpStatus.NO_CONTENT)
95101
@Secured({EDITOR})
102+
@SecuredWorkspace
96103
public void deleteConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) {
97104
ApiHelper.execute(() -> {
98105
operationsHandler.deleteOperationsForConnection(connectionIdRequestBody);
@@ -104,13 +111,15 @@ public void deleteConnection(@Body final ConnectionIdRequestBody connectionIdReq
104111
@Override
105112
@Post(uri = "/sync")
106113
@Secured({EDITOR})
114+
@SecuredWorkspace
107115
public JobInfoRead syncConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) {
108116
return ApiHelper.execute(() -> schedulerHandler.syncConnection(connectionIdRequestBody));
109117
}
110118

111119
@Override
112120
@Post(uri = "/reset")
113121
@Secured({EDITOR})
122+
@SecuredWorkspace
114123
public JobInfoRead resetConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) {
115124
return ApiHelper.execute(() -> schedulerHandler.resetConnection(connectionIdRequestBody));
116125
}

airbyte-server/src/main/java/io/airbyte/server/apis/DestinationApiController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.airbyte.api.model.generated.DestinationSearch;
1818
import io.airbyte.api.model.generated.DestinationUpdate;
1919
import io.airbyte.api.model.generated.WorkspaceIdRequestBody;
20+
import io.airbyte.commons.auth.SecuredWorkspace;
2021
import io.airbyte.commons.server.handlers.DestinationHandler;
2122
import io.airbyte.commons.server.handlers.SchedulerHandler;
2223
import io.micronaut.context.annotation.Requires;
@@ -44,13 +45,15 @@ public DestinationApiController(final DestinationHandler destinationHandler, fin
4445

4546
@Post(uri = "/check_connection")
4647
@Secured({EDITOR})
48+
@SecuredWorkspace
4749
@Override
4850
public CheckConnectionRead checkConnectionToDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) {
4951
return ApiHelper.execute(() -> schedulerHandler.checkDestinationConnectionFromDestinationId(destinationIdRequestBody));
5052
}
5153

5254
@Post(uri = "/check_connection_for_update")
5355
@Secured({EDITOR})
56+
@SecuredWorkspace
5457
@Override
5558
public CheckConnectionRead checkConnectionToDestinationForUpdate(@Body final DestinationUpdate destinationUpdate) {
5659
return ApiHelper.execute(() -> schedulerHandler.checkDestinationConnectionFromDestinationIdForUpdate(destinationUpdate));
@@ -64,13 +67,15 @@ public DestinationRead cloneDestination(@Body final DestinationCloneRequestBody
6467

6568
@Post(uri = "/create")
6669
@Secured({EDITOR})
70+
@SecuredWorkspace
6771
@Override
6872
public DestinationRead createDestination(@Body final DestinationCreate destinationCreate) {
6973
return ApiHelper.execute(() -> destinationHandler.createDestination(destinationCreate));
7074
}
7175

7276
@Post(uri = "/delete")
7377
@Secured({EDITOR})
78+
@SecuredWorkspace
7479
@Override
7580
@Status(HttpStatus.NO_CONTENT)
7681
public void deleteDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) {
@@ -82,13 +87,15 @@ public void deleteDestination(@Body final DestinationIdRequestBody destinationId
8287

8388
@Post(uri = "/get")
8489
@Secured({READER})
90+
@SecuredWorkspace
8591
@Override
8692
public DestinationRead getDestination(@Body final DestinationIdRequestBody destinationIdRequestBody) {
8793
return ApiHelper.execute(() -> destinationHandler.getDestination(destinationIdRequestBody));
8894
}
8995

9096
@Post(uri = "/list")
9197
@Secured({READER})
98+
@SecuredWorkspace
9299
@Override
93100
public DestinationReadList listDestinationsForWorkspace(@Body final WorkspaceIdRequestBody workspaceIdRequestBody) {
94101
return ApiHelper.execute(() -> destinationHandler.listDestinationsForWorkspace(workspaceIdRequestBody));
@@ -102,6 +109,7 @@ public DestinationReadList searchDestinations(@Body final DestinationSearch dest
102109

103110
@Post(uri = "/update")
104111
@Secured({EDITOR})
112+
@SecuredWorkspace
105113
@Override
106114
public DestinationRead updateDestination(@Body final DestinationUpdate destinationUpdate) {
107115
return ApiHelper.execute(() -> destinationHandler.updateDestination(destinationUpdate));

airbyte-server/src/main/java/io/airbyte/server/apis/DestinationDefinitionApiController.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.airbyte.api.model.generated.PrivateDestinationDefinitionRead;
2020
import io.airbyte.api.model.generated.PrivateDestinationDefinitionReadList;
2121
import io.airbyte.api.model.generated.WorkspaceIdRequestBody;
22+
import io.airbyte.commons.auth.SecuredWorkspace;
2223
import io.airbyte.commons.server.handlers.DestinationDefinitionsHandler;
2324
import io.micronaut.context.annotation.Context;
2425
import io.micronaut.context.annotation.Requires;
@@ -44,6 +45,7 @@ public DestinationDefinitionApiController(final DestinationDefinitionsHandler de
4445

4546
@Post(uri = "/create_custom")
4647
@Secured({EDITOR})
48+
@SecuredWorkspace
4749
@Override
4850
public DestinationDefinitionRead createCustomDestinationDefinition(final CustomDestinationDefinitionCreate customDestinationDefinitionCreate) {
4951
return ApiHelper.execute(() -> destinationDefinitionsHandler.createCustomDestinationDefinition(customDestinationDefinitionCreate));
@@ -69,6 +71,7 @@ public DestinationDefinitionRead getDestinationDefinition(final DestinationDefin
6971

7072
@Post(uri = "/get_for_workspace")
7173
@Secured({READER})
74+
@SecuredWorkspace
7275
@Override
7376
public DestinationDefinitionRead getDestinationDefinitionForWorkspace(final DestinationDefinitionIdWithWorkspaceId destinationDefinitionIdWithWorkspaceId) {
7477
return ApiHelper.execute(() -> destinationDefinitionsHandler.getDestinationDefinitionForWorkspace(destinationDefinitionIdWithWorkspaceId));
@@ -91,6 +94,7 @@ public DestinationDefinitionReadList listDestinationDefinitions() {
9194

9295
@Post(uri = "/list_for_workspace")
9396
@Secured({READER})
97+
@SecuredWorkspace
9498
@Override
9599
public DestinationDefinitionReadList listDestinationDefinitionsForWorkspace(final WorkspaceIdRequestBody workspaceIdRequestBody) {
96100
return ApiHelper.execute(() -> destinationDefinitionsHandler.listDestinationDefinitionsForWorkspace(workspaceIdRequestBody));

airbyte-server/src/main/java/io/airbyte/server/apis/DestinationOauthApiController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.airbyte.api.model.generated.DestinationOauthConsentRequest;
1313
import io.airbyte.api.model.generated.OAuthConsentRead;
1414
import io.airbyte.api.model.generated.SetInstancewideDestinationOauthParamsRequestBody;
15+
import io.airbyte.commons.auth.SecuredWorkspace;
1516
import io.airbyte.commons.server.handlers.OAuthHandler;
1617
import io.micronaut.context.annotation.Context;
1718
import io.micronaut.context.annotation.Requires;
@@ -36,13 +37,15 @@ public DestinationOauthApiController(final OAuthHandler oAuthHandler) {
3637

3738
@Post("/complete_oauth")
3839
@Secured({EDITOR})
40+
@SecuredWorkspace
3941
@Override
4042
public Map<String, Object> completeDestinationOAuth(final CompleteDestinationOAuthRequest completeDestinationOAuthRequest) {
4143
return ApiHelper.execute(() -> oAuthHandler.completeDestinationOAuth(completeDestinationOAuthRequest));
4244
}
4345

4446
@Post("/get_consent_url")
4547
@Secured({EDITOR})
48+
@SecuredWorkspace
4649
@Override
4750
public OAuthConsentRead getDestinationOAuthConsent(final DestinationOauthConsentRequest destinationOauthConsentRequest) {
4851
return ApiHelper.execute(() -> oAuthHandler.getDestinationOAuthConsent(destinationOauthConsentRequest));

airbyte-server/src/main/java/io/airbyte/server/apis/JobsApiController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.airbyte.api.model.generated.JobListRequestBody;
1919
import io.airbyte.api.model.generated.JobOptionalRead;
2020
import io.airbyte.api.model.generated.JobReadList;
21+
import io.airbyte.commons.auth.SecuredWorkspace;
2122
import io.airbyte.commons.server.handlers.JobHistoryHandler;
2223
import io.airbyte.commons.server.handlers.SchedulerHandler;
2324
import io.micronaut.context.annotation.Context;
@@ -44,6 +45,7 @@ public JobsApiController(final JobHistoryHandler jobHistoryHandler, final Schedu
4445

4546
@Post("/cancel")
4647
@Secured({EDITOR})
48+
@SecuredWorkspace
4749
@Override
4850
public JobInfoRead cancelJob(final JobIdRequestBody jobIdRequestBody) {
4951
return ApiHelper.execute(() -> schedulerHandler.cancelJob(jobIdRequestBody));
@@ -58,20 +60,23 @@ public AttemptNormalizationStatusReadList getAttemptNormalizationStatusesForJob(
5860

5961
@Post("/get_debug_info")
6062
@Secured({READER})
63+
@SecuredWorkspace
6164
@Override
6265
public JobDebugInfoRead getJobDebugInfo(final JobIdRequestBody jobIdRequestBody) {
6366
return ApiHelper.execute(() -> jobHistoryHandler.getJobDebugInfo(jobIdRequestBody));
6467
}
6568

6669
@Post("/get")
6770
@Secured({READER})
71+
@SecuredWorkspace
6872
@Override
6973
public JobInfoRead getJobInfo(final JobIdRequestBody jobIdRequestBody) {
7074
return ApiHelper.execute(() -> jobHistoryHandler.getJobInfo(jobIdRequestBody));
7175
}
7276

7377
@Post("/get_light")
7478
@Secured({READER})
79+
@SecuredWorkspace
7580
@Override
7681
public JobInfoLightRead getJobInfoLight(final JobIdRequestBody jobIdRequestBody) {
7782
return ApiHelper.execute(() -> jobHistoryHandler.getJobInfoLight(jobIdRequestBody));
@@ -86,6 +91,7 @@ public JobOptionalRead getLastReplicationJob(final ConnectionIdRequestBody conne
8691

8792
@Post("/list")
8893
@Secured({READER})
94+
@SecuredWorkspace
8995
@Override
9096
public JobReadList listJobsFor(final JobListRequestBody jobListRequestBody) {
9197
return ApiHelper.execute(() -> jobHistoryHandler.listJobsFor(jobListRequestBody));

airbyte-server/src/main/java/io/airbyte/server/apis/OperationApiController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.airbyte.api.model.generated.OperationReadList;
1818
import io.airbyte.api.model.generated.OperationUpdate;
1919
import io.airbyte.api.model.generated.OperatorConfiguration;
20+
import io.airbyte.commons.auth.SecuredWorkspace;
2021
import io.airbyte.commons.server.handlers.OperationsHandler;
2122
import io.micronaut.context.annotation.Requires;
2223
import io.micronaut.http.HttpStatus;
@@ -49,12 +50,14 @@ public CheckOperationRead checkOperation(@Body final OperatorConfiguration opera
4950
@Post("/create")
5051
@Override
5152
@Secured({EDITOR})
53+
@SecuredWorkspace
5254
public OperationRead createOperation(@Body final OperationCreate operationCreate) {
5355
return ApiHelper.execute(() -> operationsHandler.createOperation(operationCreate));
5456
}
5557

5658
@Post("/delete")
5759
@Secured({EDITOR})
60+
@SecuredWorkspace
5861
@Override
5962
@Status(HttpStatus.NO_CONTENT)
6063
public void deleteOperation(@Body final OperationIdRequestBody operationIdRequestBody) {
@@ -66,20 +69,23 @@ public void deleteOperation(@Body final OperationIdRequestBody operationIdReques
6669

6770
@Post("/get")
6871
@Secured({READER})
72+
@SecuredWorkspace
6973
@Override
7074
public OperationRead getOperation(@Body final OperationIdRequestBody operationIdRequestBody) {
7175
return ApiHelper.execute(() -> operationsHandler.getOperation(operationIdRequestBody));
7276
}
7377

7478
@Post("/list")
7579
@Secured({READER})
80+
@SecuredWorkspace
7681
@Override
7782
public OperationReadList listOperationsForConnection(@Body final ConnectionIdRequestBody connectionIdRequestBody) {
7883
return ApiHelper.execute(() -> operationsHandler.listOperationsForConnection(connectionIdRequestBody));
7984
}
8085

8186
@Post("/update")
8287
@Secured({EDITOR})
88+
@SecuredWorkspace
8389
@Override
8490
public OperationRead updateOperation(@Body final OperationUpdate operationUpdate) {
8591
return ApiHelper.execute(() -> operationsHandler.updateOperation(operationUpdate));

airbyte-server/src/main/java/io/airbyte/server/apis/SchedulerApiController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import io.airbyte.api.model.generated.DestinationCoreConfig;
1313
import io.airbyte.api.model.generated.SourceCoreConfig;
1414
import io.airbyte.api.model.generated.SourceDiscoverSchemaRead;
15+
import io.airbyte.commons.auth.SecuredWorkspace;
1516
import io.airbyte.commons.server.handlers.SchedulerHandler;
1617
import io.micronaut.context.annotation.Requires;
1718
import io.micronaut.http.annotation.Controller;
@@ -47,6 +48,7 @@ public CheckConnectionRead executeSourceCheckConnection(final SourceCoreConfig s
4748

4849
@Post("/sources/discover_schema")
4950
@Secured({EDITOR})
51+
@SecuredWorkspace
5052
@Override
5153
public SourceDiscoverSchemaRead executeSourceDiscoverSchema(final SourceCoreConfig sourceCoreConfig) {
5254
return ApiHelper.execute(() -> schedulerHandler.discoverSchemaForSourceFromSourceCreate(sourceCoreConfig));

0 commit comments

Comments
 (0)