Skip to content

Commit

Permalink
feat: Support CCGAuth and OAuth (box/box-openapi#478) (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
box-sdk-build authored Oct 25, 2024
1 parent d6212c8 commit d592498
Show file tree
Hide file tree
Showing 290 changed files with 3,394 additions and 108 deletions.
2 changes: 1 addition & 1 deletion .codegen.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "engineHash": "80d1f7a", "specHash": "e798cb1", "version": "0.1.0" }
{ "engineHash": "af71f77", "specHash": "90cf4e4", "version": "0.1.0" }
38 changes: 35 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,45 @@ dependencies {
testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.0"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.0"
}
test {
//useJUnitPlatform()
}
spotless {
java {
googleJavaFormat '1.7'
target 'src/**/*.java'
}

}
test {
useJUnitPlatform()
testLogging {
events = ['passed', 'failed', 'skipped']
showStandardStreams = true
}

filter {
excludeTestsMatching 'com.box.sdkgen.test.client.ClientITest.testWithCustomBaseUrls'
excludeTestsMatching 'com.box.sdkgen.test.client.ClientITest.testWithAsUserHeader'
excludeTestsMatching 'com.box.sdkgen.test.client.ClientITest.testWithExtraHeaders'

excludeTestsMatching 'com.box.sdkgen.test.filemetadata.FileMetadataITest.testGlobalFileMetadata'

excludeTestsMatching 'com.box.sdkgen.test.foldermetadata.FolderMetadataITest.testGlobalFolderMetadata'

excludeTestsMatching 'com.box.sdkgen.test.metadatatemplates.MetadataTemplatesITest.testMetadataTemplates'
excludeTestsMatching 'com.box.sdkgen.test.metadatatemplates.MetadataTemplatesITest.testGetMetadataTemplateByInstance'

excludeTestsMatching 'com.box.sdkgen.test.metadatacascadepolicies.MetadataCascadePoliciesITest.testMetadataCascadePolicies'

excludeTestsMatching 'com.box.sdkgen.test.files.FilesITest.testGetFileThumbnail'

excludeTestsMatching 'com.box.sdkgen.test.signtemplates.SignTemplatesITest.testGetSignTemplates'
excludeTestsMatching 'com.box.sdkgen.test.signtemplates.SignTemplatesITest.testGetSignTemplate'

excludeTestsMatching 'com.box.sdkgen.test.signrequests.SignRequestsITest.testCreateSignRequestWithSignerGroupId'
excludeTestsMatching 'com.box.sdkgen.test.signrequests.SignRequestsITest.testCreateGetCancelAndListSignRequest'

excludeTestsMatching 'com.box.sdkgen.test.webhooks.WebhooksITest.testWebhooksCrud'

excludeTestsMatching 'com.box.sdkgen.test.transfer.TransferITest.testTransferUserContent'
}

}
4 changes: 2 additions & 2 deletions docs/files.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ See the endpoint docs at

<!-- sample put_files_id -->
```
client.getFiles().updateFileById(fileToUpdate.getId(), new UpdateFileByIdRequestBody.UpdateFileByIdRequestBodyBuilder().name(updatedName).description("Updated description").build())
downscopedClient.getFiles().updateFileById(file.getId(), new UpdateFileByIdRequestBody.UpdateFileByIdRequestBodyBuilder().name(getUuid()).build())
```

### Arguments
Expand Down Expand Up @@ -95,7 +95,7 @@ See the endpoint docs at

<!-- sample delete_files_id -->
```
client.getFiles().deleteFileById(file.getId())
parentClient.getFiles().deleteFileById(file.getId())
```

### Arguments
Expand Down
6 changes: 3 additions & 3 deletions docs/folders.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ See the endpoint docs at

<!-- sample put_folders_id -->
```
client.getFolders().updateFolderById(copiedFolder.getId(), new UpdateFolderByIdRequestBody.UpdateFolderByIdRequestBodyBuilder().name(movedFolderName).parent(new UpdateFolderByIdRequestBodyParentField.UpdateFolderByIdRequestBodyParentFieldBuilder().id(folderOrigin.getId()).build()).build())
downscopedClient.getFolders().updateFolderById(folder.getId(), new UpdateFolderByIdRequestBody.UpdateFolderByIdRequestBodyBuilder().name(getUuid()).build())
```

### Arguments
Expand Down Expand Up @@ -113,7 +113,7 @@ See the endpoint docs at

<!-- sample delete_folders_id -->
```
client.getFolders().deleteFolderById(folder.getId(), new DeleteFolderByIdQueryParams.DeleteFolderByIdQueryParamsBuilder().recursive(true).build())
parentClient.getFolders().deleteFolderById(folder.getId())
```

### Arguments
Expand Down Expand Up @@ -180,7 +180,7 @@ See the endpoint docs at

<!-- sample post_folders -->
```
client.getFolders().createFolder(new CreateFolderRequestBody(folderOriginName, new CreateFolderRequestBodyParentField("0")))
parentClient.getFolders().createFolder(new CreateFolderRequestBody(getUuid(), new CreateFolderRequestBodyParentField("0")))
```

### Arguments
Expand Down
2 changes: 1 addition & 1 deletion docs/uploads.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ See the endpoint docs at

<!-- sample post_files_content -->
```
client.getUploads().uploadFile(new UploadFileRequestBody(new UploadFileRequestBodyAttributesField(String.join("", getUuid(), ".txt"), new UploadFileRequestBodyAttributesParentField("0")), stringToByteStream("My name is John Doe. I live in San Francisco. I was born in 1990. I work at Box.")))
parentClient.getUploads().uploadFile(new UploadFileRequestBody(new UploadFileRequestBodyAttributesField(getUuid(), new UploadFileRequestBodyAttributesParentField("0")), generateByteStream(1024 * 1024)))
```

### Arguments
Expand Down
223 changes: 223 additions & 0 deletions src/main/java/com/box/sdkgen/box/ccgauth/BoxCCGAuth.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
package com.box.sdkgen.box.ccgauth;

import com.box.sdkgen.box.errors.BoxSDKError;
import com.box.sdkgen.box.tokenstorage.InMemoryTokenStorage;
import com.box.sdkgen.box.tokenstorage.TokenStorage;
import com.box.sdkgen.managers.authorization.AuthorizationManager;
import com.box.sdkgen.networking.auth.Authentication;
import com.box.sdkgen.networking.network.NetworkSession;
import com.box.sdkgen.schemas.accesstoken.AccessToken;
import com.box.sdkgen.schemas.postoauth2revoke.PostOAuth2Revoke;
import com.box.sdkgen.schemas.postoauth2token.PostOAuth2Token;
import com.box.sdkgen.schemas.postoauth2token.PostOAuth2TokenBoxSubjectTypeField;
import com.box.sdkgen.schemas.postoauth2token.PostOAuth2TokenGrantTypeField;
import com.box.sdkgen.schemas.postoauth2token.PostOAuth2TokenSubjectTokenTypeField;
import com.box.sdkgen.serialization.json.EnumWrapper;
import java.util.List;

public class BoxCCGAuth implements Authentication {

public final CCGConfig config;

public final TokenStorage tokenStorage;

public String subjectId;

public EnumWrapper<PostOAuth2TokenBoxSubjectTypeField> subjectType;

public BoxCCGAuth(CCGConfig config) {
this.config = config;
this.tokenStorage = this.config.getTokenStorage();
this.subjectId =
(!(this.config.getUserId() == null)
? this.config.getUserId()
: this.config.getEnterpriseId());
this.subjectType =
new EnumWrapper<PostOAuth2TokenBoxSubjectTypeField>(
(!(this.config.getUserId() == null)
? PostOAuth2TokenBoxSubjectTypeField.USER
: PostOAuth2TokenBoxSubjectTypeField.ENTERPRISE)
.getValue(),
(!(this.config.getUserId() == null)
? PostOAuth2TokenBoxSubjectTypeField.USER
: PostOAuth2TokenBoxSubjectTypeField.ENTERPRISE));
}

protected BoxCCGAuth(BoxCCGAuthBuilder builder) {
this.config = builder.config;
this.tokenStorage = builder.tokenStorage;
this.subjectId = builder.subjectId;
this.subjectType = builder.subjectType;
}

public AccessToken refreshToken() {
return refreshToken(null);
}

@Override
public AccessToken refreshToken(NetworkSession networkSession) {
AuthorizationManager authManager = new AuthorizationManager();
AccessToken token =
authManager.requestAccessToken(
new PostOAuth2Token.PostOAuth2TokenBuilder(
PostOAuth2TokenGrantTypeField.CLIENT_CREDENTIALS)
.clientId(this.config.getClientId())
.clientSecret(this.config.getClientSecret())
.boxSubjectType(this.subjectType)
.boxSubjectId(this.subjectId)
.build());
this.tokenStorage.store(token);
return token;
}

public AccessToken retrieveToken() {
return retrieveToken(null);
}

@Override
public AccessToken retrieveToken(NetworkSession networkSession) {
AccessToken oldToken = this.tokenStorage.get();
if (oldToken == null) {
AccessToken newToken = this.refreshToken(networkSession);
return newToken;
}
return oldToken;
}

public String retrieveAuthorizationHeader() {
return retrieveAuthorizationHeader(null);
}

@Override
public String retrieveAuthorizationHeader(NetworkSession networkSession) {
AccessToken token = this.retrieveToken(networkSession);
return String.join("", "Bearer ", token.getAccessToken());
}

public BoxCCGAuth withUserSubject(String userId) {
return withUserSubject(userId, new InMemoryTokenStorage());
}

public BoxCCGAuth withUserSubject(String userId, TokenStorage tokenStorage) {
CCGConfig newConfig =
new CCGConfig.CCGConfigBuilder(this.config.getClientId(), this.config.getClientSecret())
.enterpriseId(this.config.getEnterpriseId())
.userId(userId)
.tokenStorage(tokenStorage)
.build();
return new BoxCCGAuth(newConfig);
}

public BoxCCGAuth withEnterpriseSubject(String enterpriseId) {
return withEnterpriseSubject(enterpriseId, new InMemoryTokenStorage());
}

public BoxCCGAuth withEnterpriseSubject(String enterpriseId, TokenStorage tokenStorage) {
CCGConfig newConfig =
new CCGConfig.CCGConfigBuilder(this.config.getClientId(), this.config.getClientSecret())
.enterpriseId(enterpriseId)
.userId(null)
.tokenStorage(tokenStorage)
.build();
return new BoxCCGAuth(newConfig);
}

@Override
public AccessToken downscopeToken(
List<String> scopes, String resource, String sharedLink, NetworkSession networkSession) {
AccessToken token = this.tokenStorage.get();
if (token == null) {
throw new BoxSDKError(
"No access token is available. Make an API call to retrieve a token before calling this method.");
}
AuthorizationManager authManager = new AuthorizationManager();
AccessToken downscopedToken =
authManager.requestAccessToken(
new PostOAuth2Token.PostOAuth2TokenBuilder(
PostOAuth2TokenGrantTypeField.URN_IETF_PARAMS_OAUTH_GRANT_TYPE_TOKEN_EXCHANGE)
.subjectToken(token.getAccessToken())
.subjectTokenType(
PostOAuth2TokenSubjectTokenTypeField
.URN_IETF_PARAMS_OAUTH_TOKEN_TYPE_ACCESS_TOKEN)
.resource(resource)
.scope(String.join(" ", scopes))
.boxSharedLink(sharedLink)
.build());
return downscopedToken;
}

public void revokeToken() {
revokeToken(null);
}

@Override
public void revokeToken(NetworkSession networkSession) {
AccessToken oldToken = this.tokenStorage.get();
if (oldToken == null) {
return;
}
AuthorizationManager authManager = new AuthorizationManager();
authManager.revokeAccessToken(
new PostOAuth2Revoke.PostOAuth2RevokeBuilder()
.clientId(this.config.getClientId())
.clientSecret(this.config.getClientSecret())
.token(oldToken.getAccessToken())
.build());
this.tokenStorage.clear();
}

public static class BoxCCGAuthBuilder {

protected final CCGConfig config;

protected TokenStorage tokenStorage;

protected String subjectId;

protected EnumWrapper<PostOAuth2TokenBoxSubjectTypeField> subjectType;

public BoxCCGAuthBuilder(CCGConfig config) {
this.config = config;
this.tokenStorage = this.config.getTokenStorage();
this.subjectId =
(!(this.config.getUserId() == null)
? this.config.getUserId()
: this.config.getEnterpriseId());
this.subjectType =
new EnumWrapper<PostOAuth2TokenBoxSubjectTypeField>(
(!(this.config.getUserId() == null)
? PostOAuth2TokenBoxSubjectTypeField.USER
: PostOAuth2TokenBoxSubjectTypeField.ENTERPRISE)
.getValue(),
(!(this.config.getUserId() == null)
? PostOAuth2TokenBoxSubjectTypeField.USER
: PostOAuth2TokenBoxSubjectTypeField.ENTERPRISE));
}

public BoxCCGAuthBuilder tokenStorage(TokenStorage tokenStorage) {
this.tokenStorage = tokenStorage;
return this;
}

public BoxCCGAuthBuilder subjectId(String subjectId) {
this.subjectId = subjectId;
return this;
}

public BoxCCGAuthBuilder subjectType(
EnumWrapper<PostOAuth2TokenBoxSubjectTypeField> subjectType) {
this.subjectType = subjectType;
return this;
}

public BoxCCGAuthBuilder subjectType(PostOAuth2TokenBoxSubjectTypeField subjectType) {
this.subjectType =
new EnumWrapper<PostOAuth2TokenBoxSubjectTypeField>(subjectType.getValue(), subjectType);
return this;
}

public BoxCCGAuth build() {
return new BoxCCGAuth(this);
}
}
}
Loading

0 comments on commit d592498

Please sign in to comment.