/** * personium.io * Copyright 2014 FUJITSU LIMITED * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.fujitsu.dc.test.jersey.cell.auth; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import org.apache.http.HttpStatus; import org.json.simple.JSONObject; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.runner.RunWith; import com.fujitsu.dc.common.auth.token.AbstractOAuth2Token.TokenDsigException; import com.fujitsu.dc.common.auth.token.AbstractOAuth2Token.TokenParseException; import com.fujitsu.dc.common.auth.token.AbstractOAuth2Token.TokenRootCrtException; import com.fujitsu.dc.common.auth.token.AccountAccessToken; import com.fujitsu.dc.common.auth.token.CellLocalAccessToken; import com.fujitsu.dc.common.auth.token.CellLocalRefreshToken; import com.fujitsu.dc.common.auth.token.TransCellAccessToken; import com.fujitsu.dc.core.auth.OAuth2Helper; import com.fujitsu.dc.core.model.Box; import com.fujitsu.dc.test.categories.Integration; import com.fujitsu.dc.test.categories.Regression; import com.fujitsu.dc.test.categories.Unit; import com.fujitsu.dc.test.jersey.AbstractCase; import com.fujitsu.dc.test.jersey.DcRunner; import com.fujitsu.dc.test.setup.Setup; import com.fujitsu.dc.test.unit.core.UrlUtils; import com.fujitsu.dc.test.utils.AccountUtils; import com.fujitsu.dc.test.utils.BoxUtils; import com.fujitsu.dc.test.utils.CellUtils; import com.fujitsu.dc.test.utils.DavResourceUtils; import com.fujitsu.dc.test.utils.Http; import com.fujitsu.dc.test.utils.UserDataUtils; import com.fujitsu.dc.test.utils.ResourceUtils; import com.fujitsu.dc.test.utils.TResponse; import com.sun.jersey.test.framework.JerseyTest; /** * スキーマ認証のテスト. */ @RunWith(DcRunner.class) @Category({Unit.class, Integration.class, Regression.class }) public class SchemaAuthTest extends JerseyTest { static final String TEST_CELL1 = "testcell1"; static final String TEST_CELL2 = "testcell2"; static final String TEST_BOX1 = "box1"; static final String TEST_APP_CELL1 = "schema1"; static final String DAV_COLLECTION = "setdavcol/"; static final String ODATA_COLLECTION = "setodata"; static final String DAV_RESOURCE = "dav.txt"; static final String ACL_SETTING_FILE = "box/acl.txt"; static final String ACL_AUTH_TEST_SETTING_FILE = "box/acl-setscheme.txt"; static final String MASTER_TOKEN = AbstractCase.MASTER_TOKEN_NAME; static final String DEFAULT_PRIVILEGE = "<D:read/></D:privilege><D:privilege><D:write/>"; /** * コンストラクタ. */ public SchemaAuthTest() { super("com.fujitsu.dc.core.rs"); } /** * スキーマ無しパスワード認証でセルローカルとリフレッシュトークン. * @throws TokenParseException トークンパースエラー */ @Test public final void スキーマ無しパスワード認証でセルローカルとリフレッシュトークン() throws TokenParseException { // 認証 JSONObject json = ResourceUtils.getLocalTokenByPassAuth(TEST_CELL1, "account2", "password2", -1); String issuer = UrlUtils.cellRoot(TEST_CELL1); // トークンチェック String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); AccountAccessToken aToken = AccountAccessToken.parse(tokenStr, issuer); assertNotNull(aToken.getSchema()); String rTokenStr = (String) json.get(OAuth2Helper.Key.REFRESH_TOKEN); CellLocalRefreshToken rToken = CellLocalRefreshToken.parse(rTokenStr, issuer); assertNotNull(rToken.getSchema()); // WebDavのスキーマアクセス制御確認 // 自分セルローカルトークン try { this.cheacResourcesWithNoneSchema(DAV_COLLECTION, DAV_RESOURCE, tokenStr, TEST_CELL1); } finally { // ACLとスキーマレベル設定を元に戻す this.setAclSchema(Setup.TEST_BOX1, DAV_COLLECTION, OAuth2Helper.SchemaLevel.NONE, TEST_CELL1); } } /** * リソースに対して、スキーマ無しのトークンでアクセス制御を確認. */ private void cheacResourcesWithNoneSchema(String path, String file, String token, String cellPath) { // スキーマ設定無し→アクセス可能 this.cheackResourceSchema(path, file, token, "", HttpStatus.SC_OK, Setup.TEST_BOX1, cellPath); // スキーマ設定NONE→アクセス可能 this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.NONE, HttpStatus.SC_OK, Setup.TEST_BOX1, cellPath); // スキーマ設定PUBLIC→アクセス不可 this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.PUBLIC, HttpStatus.SC_FORBIDDEN, Setup.TEST_BOX1, cellPath); // スキーマ設定CONFIDENTIAL→アクセス不可 this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.CONFIDENTIAL, HttpStatus.SC_FORBIDDEN, Setup.TEST_BOX1, cellPath); } /** * リソースに対して、スキーマ付トークンでアクセス制御を確認. */ private void checkResourcesWithSchema(String path, String file, String token, String boxName, String cellPath) { // スキーマ設定無し→アクセス可能 this.cheackResourceSchema(path, file, token, "", HttpStatus.SC_OK, boxName, cellPath); // スキーマ設定NONE→アクセス可能 this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.NONE, HttpStatus.SC_OK, boxName, cellPath); // スキーマ設定PUBLIC→アクセス可能 this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.PUBLIC, HttpStatus.SC_OK, boxName, cellPath); // スキーマ設定CONFIDENTIAL→アクセス不可 this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.CONFIDENTIAL, HttpStatus.SC_FORBIDDEN, boxName, cellPath); } /** * リソースに対していconfidentialRoleスキーマ付トークンでアクセス制御を確認. */ private void checkResourcesWithWithConfidentialSchema(String path, String file, String token, String cellPath) { // すべてのスキーマ設定でアクセス可能 this.cheackResourceSchema(path, file, token, "", HttpStatus.SC_OK, Setup.TEST_BOX1, cellPath); this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.NONE, HttpStatus.SC_OK, Setup.TEST_BOX1, cellPath); this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.PUBLIC, HttpStatus.SC_OK, Setup.TEST_BOX1, cellPath); this.cheackResourceSchema(path, file, token, OAuth2Helper.SchemaLevel.CONFIDENTIAL, HttpStatus.SC_OK, Setup.TEST_BOX1, cellPath); } /** * リソースアクセスのスキーマ認証制御の確認. */ private void cheackResourceSchema(String path, String file, String token, String level, int status, String boxName, String cellPath) { // ACLでスキーマレベル設定 this.setAclSchema(boxName, path, level, cellPath); // リソースアクセス ResourceUtils.accessResource(path + file, token, status, boxName, cellPath); } /** * ACLによるスキーマ設定. * @param box ボックス名 * @param path コレクション以下のパス * @param level スキーマレベル * @param cellPath セル */ private void setAclSchema(String box, String path, String level, String cellPath) { DavResourceUtils.setACL(cellPath, AbstractCase.MASTER_TOKEN_NAME, HttpStatus.SC_OK, path, ACL_AUTH_TEST_SETTING_FILE, box, level); } /** * ACLによるスキーマ設定(ACL設定を指定する場合). * @param box ボックス名 * @param path コレクション以下のパス * @param roleBaseUrl ACLのBaseUrl * @param level スキーマレベル * @param cellPath セル * @param role ACLのPricipal * @param privilege ACLのprivilege */ private void setAclSchema(String box, String path, String roleBaseUrl, String level, String cellPath, String role, String privilege) { Http.request("box/acl-setting.txt") .with("cellPath", cellPath) .with("path", path) .with("box", box) .with("token", AbstractCase.MASTER_TOKEN_NAME) .with("roleBaseUrl", roleBaseUrl) .with("colname", "") .with("level", level) .with("role", role) .with("privilege", privilege) .returns() .statusCode(HttpStatus.SC_OK); } /** * スキーマ無しパスワード認証でトランスセルトークンのチェック. * @throws TokenParseException トークンパースエラー * @throws TokenRootCrtException TokenRootCrtException * @throws TokenDsigException TokenDsigException */ @Test public final void スキーマ無しパスワード認証でトランスセルトークンのチェック() throws TokenParseException, TokenDsigException, TokenRootCrtException { // 認証 JSONObject json = getTransTokenByPassAuth("account2", "password2"); // トークンチェック String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); TransCellAccessToken aToken = TransCellAccessToken.parse(tokenStr); assertNotNull(aToken.getSchema()); } /** * スキーマ付パスワード認証でセルローカルとリフレッシュトークン. * @throws TokenParseException トークンパースエラー */ @Test public final void スキーマ付パスワード認証でセルローカルとリフレッシュトークン() throws TokenParseException { String tokenStr = checkCellLocalWithSchema("account0", "password0", TEST_APP_CELL1, UrlUtils.cellRoot(TEST_APP_CELL1)); // WebDavのスキーマアクセス制御確認 // 自分セルローカルトークン try { this.checkResourcesWithSchema(DAV_COLLECTION, DAV_RESOURCE, tokenStr, Setup.TEST_BOX1, TEST_CELL1); } finally { // ACLとスキーマレベル設定を元に戻す DavResourceUtils.setACL(TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME, HttpStatus.SC_OK, DAV_COLLECTION, ACL_AUTH_TEST_SETTING_FILE, Setup.TEST_BOX1, OAuth2Helper.SchemaLevel.NONE); } } /** * スキーマ付パスワード認証でトランスセルトークンのチェック. * @throws TokenParseException トークンパースエラー * @throws TokenRootCrtException TokenRootCrtException * @throws TokenDsigException TokenDsigException */ @Test public final void スキーマ付パスワード認証でトランスセルトークンのチェック() throws TokenParseException, TokenDsigException, TokenRootCrtException { checkTransTokenWithSchema("account0", "password0", UrlUtils.cellRoot(TEST_APP_CELL1)); } /** * confidentialRoleスキーマ付パスワード認証でセルローカルとリフレッシュトークン. * @throws TokenParseException トークンパースエラー */ @Test public final void confidentialRoleスキーマ付パスワード認証でセルローカルとリフレッシュトークン() throws TokenParseException { String tokenStr = checkCellLocalWithSchema("account1", "password1", TEST_APP_CELL1, UrlUtils.cellRoot(TEST_APP_CELL1) + OAuth2Helper.Key.CONFIDENTIAL_MARKER); // WebDavのスキーマアクセス制御確認 // 自分セルローカルトークン try { this.checkResourcesWithWithConfidentialSchema(DAV_COLLECTION, DAV_RESOURCE, tokenStr, TEST_CELL1); } finally { // ACLとスキーマレベル設定を元に戻す this.setAclSchema(Setup.TEST_BOX1, DAV_COLLECTION, OAuth2Helper.SchemaLevel.NONE, TEST_CELL1); } } /** * confidentialRoleスキーマ付パスワード認証でトランスセルトークンのチェック. * @throws TokenParseException トークンパースエラー * @throws TokenRootCrtException TokenRootCrtException * @throws TokenDsigException TokenDsigException */ @Test public final void confidentialRoleスキーマ付パスワード認証でトランスセルトークンのチェック() throws TokenParseException, TokenDsigException, TokenRootCrtException { checkTransTokenWithSchema("account1", "password1", UrlUtils.cellRoot(TEST_APP_CELL1) + OAuth2Helper.Key.CONFIDENTIAL_MARKER); } /** * スキーマ無しトークン認証でセルローカルトークンのチェック. * @throws TokenParseException トークンパースエラー */ @Test public final void スキーマ無しトークン認証でセルローカルトークンのチェック() throws TokenParseException { // 認証 JSONObject json = getTransTokenByPassAuth("account2", "password2"); String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); // セルに対してトークン認証 TResponse res2 = Http.request("authn/saml-cl-c0.txt") .with("remoteCell", TEST_CELL2) .with("assertion", tokenStr) .returns() .statusCode(HttpStatus.SC_OK); String issuer = UrlUtils.cellRoot(TEST_CELL2); JSONObject json2 = res2.bodyAsJson(); String tokenStr2 = (String) json2.get(OAuth2Helper.Key.ACCESS_TOKEN); CellLocalAccessToken aToken = CellLocalAccessToken.parse(tokenStr2, issuer); assertNotNull(aToken.getSchema()); // WebDavのスキーマアクセス制御確認 // 自分セルローカルトークン try { this.cheacResourcesWithNoneSchema(DAV_COLLECTION, DAV_RESOURCE, tokenStr2, TEST_CELL2); } finally { // ACLとスキーマレベル設定を元に戻す this.setAclSchema(Setup.TEST_BOX1, DAV_COLLECTION, OAuth2Helper.SchemaLevel.NONE, TEST_CELL2); } } /** * スキーマ付トークン認証でセルローカルトークンのチェック. * @throws TokenParseException トークンパースエラー */ @Test public final void スキーマ付トークン認証でセルローカルトークンのチェック() throws TokenParseException { String tokenStr = cheackTokenAuth("account0", "password0", UrlUtils.cellRoot(TEST_APP_CELL1)); // WebDavのスキーマアクセス制御確認 // 自分セルローカルトークン try { this.checkResourcesWithSchema(DAV_COLLECTION, DAV_RESOURCE, tokenStr, Setup.TEST_BOX1, TEST_CELL2); } finally { // ACLとスキーマレベル設定を元に戻す this.setAclSchema(Setup.TEST_BOX1, DAV_COLLECTION, OAuth2Helper.SchemaLevel.NONE, TEST_CELL2); } } /** * confidentialRoleスキーマ付トークン認証でセルローカルトークンのチェック. * @throws TokenParseException トークンパースエラー */ @Test public final void confidentialRoleスキーマ付トークン認証でセルローカルトークンのチェック() throws TokenParseException { String tokenStr = cheackTokenAuth("account1", "password1", UrlUtils.cellRoot(TEST_APP_CELL1) + OAuth2Helper.Key.CONFIDENTIAL_MARKER); // WebDavのスキーマアクセス制御確認 // 自分セルローカルトークン try { this.checkResourcesWithWithConfidentialSchema(DAV_COLLECTION, DAV_RESOURCE, tokenStr, TEST_CELL2); } finally { // ACLとスキーマレベル設定を元に戻す this.setAclSchema(Setup.TEST_BOX1, DAV_COLLECTION, OAuth2Helper.SchemaLevel.NONE, TEST_CELL2); } } /** * スキーマ認証時に無効なトークンを検出した場合401が返ることの確認. * @throws TokenParseException トークンパースエラー */ @Test public final void スキーマ認証時に無効なトークンを検出した場合401が返ることの確認() throws TokenParseException { // テキトーなトークン String token = "hogeracho"; try { // スキーマ認証レベル設定 this.setAclSchema(TEST_BOX1, DAV_COLLECTION, OAuth2Helper.SchemaLevel.PUBLIC, TEST_CELL1); // リソースアクセス。401になるはず。 ResourceUtils.accessResource(DAV_COLLECTION + DAV_RESOURCE, token, HttpStatus.SC_UNAUTHORIZED, Setup.TEST_BOX1, TEST_CELL1); } finally { // ACLとスキーマレベル設定を元に戻す this.setAclSchema(Setup.TEST_BOX1, DAV_COLLECTION, OAuth2Helper.SchemaLevel.NONE, TEST_CELL1); } } /** * Boxレベル$batchでのスキーマ認証制御の確認. * @throws TokenParseException TokenParseException */ @Test public final void Boxレベル$batchでのスキーマ認証制御の確認() throws TokenParseException { // スキーマ無しの認証トークン取得 String token = ResourceUtils.getMyCellLocalToken(TEST_CELL1, "account0", "password0"); // スキーマ認証トークン取得 String schemaToken = this.checkCellLocalWithSchema("account0", "password0", TEST_APP_CELL1, UrlUtils.cellRoot(TEST_APP_CELL1)); try { // スキーマ認証レベル設定 this.setAclSchema(TEST_BOX1, ODATA_COLLECTION, OAuth2Helper.SchemaLevel.PUBLIC, TEST_CELL1); // スキーマ認証チェックエラーになるはず UserDataUtils.batch(TEST_CELL1, TEST_BOX1, ODATA_COLLECTION, AuthBatchTest.BOUNDARY, AuthBatchTest.TEST_BODY, AbstractCase.MASTER_TOKEN_NAME, HttpStatus.SC_ACCEPTED); // スキーマ認証チェックエラーになるはず UserDataUtils.batch(TEST_CELL1, TEST_BOX1, ODATA_COLLECTION, AuthBatchTest.BOUNDARY, AuthBatchTest.TEST_BODY, token, HttpStatus.SC_FORBIDDEN); // リクエストが受け付けられるはず UserDataUtils.batch(TEST_CELL1, TEST_BOX1, ODATA_COLLECTION, AuthBatchTest.BOUNDARY, AuthBatchTest.TEST_BODY, schemaToken, HttpStatus.SC_ACCEPTED); } finally { // ACLとスキーマレベル設定を元に戻す this.setAclSchema(Setup.TEST_BOX1, ODATA_COLLECTION, OAuth2Helper.SchemaLevel.NONE, TEST_CELL1); } } /** * スキーマレベル設定の継承ー自分の設定が優先されること. */ @Test public final void スキーマレベル設定の継承ー自分の設定が優先されること() { try { // ACL設定 this.setACL(TEST_BOX1, "", ACL_SETTING_FILE); // スキーマレベル設定 this.setAclSchema(TEST_BOX1, "", OAuth2Helper.SchemaLevel.PUBLIC, TEST_CELL1); this.setAclSchema(TEST_BOX1, DAV_COLLECTION, "", TEST_CELL1); this.setAclSchema(TEST_BOX1, DAV_COLLECTION + DAV_RESOURCE, OAuth2Helper.SchemaLevel.NONE, TEST_CELL1); // データセルに自分セルローカルトークン認証 JSONObject json = ResourceUtils.getLocalTokenByPassAuth(TEST_CELL1, "account4", "password4", -1); String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); // ボックスにアクセス // publicが設定されているのでアクセス不可。 ResourceUtils.accessResource("", tokenStr, HttpStatus.SC_FORBIDDEN, Setup.TEST_BOX1, TEST_CELL1); // コレクションにアクセス // 親にpublicが設定されているのでアクセス不可。 ResourceUtils.accessResource(DAV_COLLECTION, tokenStr, HttpStatus.SC_FORBIDDEN, Setup.TEST_BOX1, TEST_CELL1); // データアクセス // アクセスするファイルのスキーマ設定レベルがNONEなのでスキーマ無しでアクセスできる。 ResourceUtils.accessResource(DAV_COLLECTION + DAV_RESOURCE, tokenStr, HttpStatus.SC_OK, Setup.TEST_BOX1, TEST_CELL1); } finally { // スキーマレベル設定を戻す this.setAclSchema(TEST_BOX1, "", "", TEST_CELL1); this.setAclSchema(TEST_BOX1, DAV_COLLECTION, "", TEST_CELL1); this.setAclSchema(TEST_BOX1, DAV_COLLECTION + DAV_RESOURCE, "", TEST_CELL1); // ACL設定を元に戻す this.setACL(TEST_BOX1, "", ACL_AUTH_TEST_SETTING_FILE); } } /** * スキーマレベル設定の継承ー自分に設定が無い場合親の設定が有効になること. */ @Test public final void スキーマレベル設定の継承ー自分に設定が無い場合親の設定が有効になること() { try { // ACL設定 this.setACL(TEST_BOX1, "", ACL_SETTING_FILE); this.setAclSchema(TEST_BOX1, "", "", TEST_CELL1); this.setAclSchema(TEST_BOX1, DAV_COLLECTION, "", TEST_CELL1); this.setAclSchema(TEST_BOX1, DAV_COLLECTION + DAV_RESOURCE, "", TEST_CELL1); // データセルに自分セルローカルトークン認証 JSONObject json = ResourceUtils.getLocalTokenByPassAuth(TEST_CELL1, "account4", "password4", -1); String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); // データアクセス(設定変更前) // スキーマ設定レベルが親含め設定されていないのでアクセス可能。 ResourceUtils.accessResource(DAV_COLLECTION + DAV_RESOURCE, tokenStr, HttpStatus.SC_OK, Setup.TEST_BOX1, TEST_CELL1); // アクセスするリソースの親にスキーマレベル設定 this.setAclSchema(TEST_BOX1, "", OAuth2Helper.SchemaLevel.PUBLIC, TEST_CELL1); // データアクセス(設定変更後) // 親にスキーマ設定レベルが設定されたのでアクセスできなくなる。 ResourceUtils.accessResource(DAV_COLLECTION + DAV_RESOURCE, tokenStr, HttpStatus.SC_FORBIDDEN, Setup.TEST_BOX1, TEST_CELL1); } finally { // スキーマレベル設定を戻す this.setAclSchema(TEST_BOX1, "", "", TEST_CELL1); this.setAclSchema(TEST_BOX1, DAV_COLLECTION, "", TEST_CELL1); this.setAclSchema(TEST_BOX1, DAV_COLLECTION + DAV_RESOURCE, "", TEST_CELL1); // ACL設定を元に戻す this.setACL(TEST_BOX1, "", ACL_AUTH_TEST_SETTING_FILE); } } /** * スキーマレベル設定の継承ーデフォルトはスキーマ認証不要であることの確認. */ @Test public final void スキーマレベル設定の継承ーデフォルトはスキーマ認証不要であることの確認() { try { // ACL設定 this.setACL(TEST_BOX1, "", ACL_SETTING_FILE); // データセルに自分セルローカルトークン認証 JSONObject json = ResourceUtils.getLocalTokenByPassAuth(TEST_CELL1, "account4", "password4", -1); String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); // データアクセス // 親にスキーマ設定レベルが設定されたのでアクセスできなくなる。 ResourceUtils.accessResource(DAV_COLLECTION + DAV_RESOURCE, tokenStr, HttpStatus.SC_OK, Setup.TEST_BOX1, TEST_CELL1); } finally { // ACL設定を元に戻す this.setACL(TEST_BOX1, "", ACL_AUTH_TEST_SETTING_FILE); } } /** * スキーマ認証スキーマ値チェックの確認. * @throws TokenParseException トークンパースエラー */ @SuppressWarnings("deprecation") @Test public final void スキーマ認証スキーマ値チェックの確認() throws TokenParseException { String userCell = "cell20161221"; String schemaCell = "cell20161221schema"; String user = "user"; String pass = "password"; String boxWithHttpSchemaUrl = "testschemabox1"; String boxWithNonSchemaCellSchemaUrl = "testschemabox2"; String boxWithLocalUnitSchemaUrl = "testschemabox3"; String role = "role"; String colName = "col"; String aTokenStr = null; try { // セルの作成 CellUtils.create(userCell, MASTER_TOKEN, HttpStatus.SC_CREATED); CellUtils.create(schemaCell, MASTER_TOKEN, HttpStatus.SC_CREATED); // Accountの作成 AccountUtils.create(MASTER_TOKEN, userCell, user, pass, HttpStatus.SC_CREATED); AccountUtils.create(MASTER_TOKEN, schemaCell, user, pass, HttpStatus.SC_CREATED); // Boxの作成 BoxUtils.createWithSchema(userCell, boxWithHttpSchemaUrl, MASTER_TOKEN, UrlUtils.cellRoot(schemaCell)); BoxUtils.createWithSchema(userCell, boxWithNonSchemaCellSchemaUrl, MASTER_TOKEN, UrlUtils.cellRoot(userCell)); BoxUtils.createWithSchema(userCell, boxWithLocalUnitSchemaUrl, MASTER_TOKEN, "personium-localunit:/" + schemaCell + "/"); // Roleの作成 // RoleUtils.create(userCell, MASTER_TOKEN, boxWithHttpSchemaUrl, role, HttpStatus.SC_CREATED); // RoleUtils.create(userCell, MASTER_TOKEN, boxWithLocalUnitSchemaUrl, role, HttpStatus.SC_CREATED); // RoleとAccountの$links // ResourceUtils.linkAccountRole(userCell, MASTER_TOKEN, user, boxWithHttpSchemaUrl, // role, HttpStatus.SC_NO_CONTENT); // ResourceUtils.linkAccountRole(userCell, MASTER_TOKEN, user, boxWithLocalUnitSchemaUrl, // role, HttpStatus.SC_NO_CONTENT); // BoxにConfidentialレベルの設定 // this.setAclSchema(boxWithHttpSchemaUrl, "", UrlUtils.roleResource(userCell, boxWithHttpSchemaUrl, ""), // OAuth2Helper.SchemaLevel.PUBLIC, userCell, role, DEFAULT_PRIVILEGE); // this.setAclSchema(boxWithNonSchemaCellSchemaUrl, "", // UrlUtils.roleResource(userCell, boxWithHttpSchemaUrl, ""), // OAuth2Helper.SchemaLevel.PUBLIC, userCell, role, DEFAULT_PRIVILEGE); // this.setAclSchema(boxWithLocalUnitSchemaUrl, "", // UrlUtils.roleResource(userCell, boxWithLocalUnitSchemaUrl, ""), // OAuth2Helper.SchemaLevel.PUBLIC, userCell, role, DEFAULT_PRIVILEGE); // ACLの設定(今回テストではACL設定は無関係のため、ALLで設定) DavResourceUtils.setACL(userCell, MASTER_TOKEN, HttpStatus.SC_OK, userCell + "/" + boxWithHttpSchemaUrl, "box/acl-setting-all.txt", role, "<D:read/></D:privilege><D:privilege><D:write/>", OAuth2Helper.SchemaLevel.PUBLIC); DavResourceUtils.setACL(userCell, MASTER_TOKEN, HttpStatus.SC_OK, userCell + "/" + boxWithNonSchemaCellSchemaUrl, "box/acl-setting-all.txt", role, "<D:read/></D:privilege><D:privilege><D:write/>", OAuth2Helper.SchemaLevel.PUBLIC); DavResourceUtils.setACL(userCell, MASTER_TOKEN, HttpStatus.SC_OK, userCell + "/" + boxWithLocalUnitSchemaUrl, "box/acl-setting-all.txt", role, "<D:read/></D:privilege><D:privilege><D:write/>", OAuth2Helper.SchemaLevel.PUBLIC); // スキーマ認証用トランスセルトークンの取得 JSONObject appAuthJson = getTransTokenByAppAuth(schemaCell, user, pass, UrlUtils.cellRoot(userCell)); String appToken = (String) appAuthJson.get(OAuth2Helper.Key.ACCESS_TOKEN); // Queryでスキーマ認証 TResponse res = Http.request("authn/password-cl-cp.txt") .with("remoteCell", userCell) .with("username", user) .with("password", pass) .with("client_id", UrlUtils.cellRoot(schemaCell)) .with("client_secret", appToken) .returns() .statusCode(HttpStatus.SC_OK); JSONObject json = res.bodyAsJson(); String rTokenStr = (String) json.get(OAuth2Helper.Key.REFRESH_TOKEN); aTokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); // コレクションの作成(boxWithHttpSchemaUrlはスキーマと、トークンのスキーマが一致するため作成可能) DavResourceUtils.createWebDavCollection("box/mkcol.txt", userCell, boxWithHttpSchemaUrl + "/" + colName, aTokenStr, HttpStatus.SC_CREATED); // コレクションの作成(boxWithNonSchemaCellSchemaUrlはスキーマと、トークンのスキーマが一致しないため作成不可) DavResourceUtils.createWebDavCollection("box/mkcol.txt", userCell, boxWithNonSchemaCellSchemaUrl + "/" + colName, aTokenStr, HttpStatus.SC_FORBIDDEN); // コレクションの作成(boxWithLocalUnitSchemaUrlはスキーマと、トークンのスキーマが一致するため作成可能) DavResourceUtils.createWebDavCollection("box/mkcol.txt", userCell, boxWithLocalUnitSchemaUrl + "/" + colName, aTokenStr, HttpStatus.SC_CREATED); // リフレッシュトークン認証 TResponse refreshRes = ResourceUtils.refreshTokenAuthCl(userCell, rTokenStr); aTokenStr = (String) refreshRes.bodyAsJson().get(OAuth2Helper.Key.ACCESS_TOKEN); } finally { // コレクションの削除(testbox03はスキーマと、トークンのスキーマが一致するため削除可能) DavResourceUtils.deleteCollection(userCell, boxWithHttpSchemaUrl, colName, MASTER_TOKEN, HttpStatus.SC_NO_CONTENT); // コレクションの削除(testbox05はスキーマと、トークンのスキーマが一致するため削除可能) DavResourceUtils.deleteCollection(userCell, boxWithLocalUnitSchemaUrl, colName, MASTER_TOKEN, HttpStatus.SC_NO_CONTENT); // RoleとAccountの$linksの削除 // ResourceUtils.linkAccountRollDelete(userCell, MASTER_TOKEN, user, boxWithHttpSchemaUrl, role); // Roleの削除 // RoleUtils.delete(userCell, MASTER_TOKEN, boxWithHttpSchemaUrl, role); // Boxの削除 BoxUtils.delete(userCell, MASTER_TOKEN, boxWithHttpSchemaUrl); BoxUtils.delete(userCell, MASTER_TOKEN, boxWithNonSchemaCellSchemaUrl); BoxUtils.delete(userCell, MASTER_TOKEN, boxWithLocalUnitSchemaUrl); // Accountの削除 AccountUtils.delete(schemaCell, MASTER_TOKEN, user, HttpStatus.SC_NO_CONTENT); AccountUtils.delete(userCell, MASTER_TOKEN, user, HttpStatus.SC_NO_CONTENT); // セルの削除 CellUtils.delete(MASTER_TOKEN, schemaCell, -1); CellUtils.delete(MASTER_TOKEN, userCell, -1); } } /** * デフォルトボックスに対するスキーマ認証の確認. * @throws TokenParseException トークンパースエラー */ @Test public final void デフォルトボックスに対するスキーマ認証の確認() throws TokenParseException { String tokenStr = checkCellLocalWithSchema("account0", "password0", TEST_CELL1, UrlUtils.cellRoot(TEST_CELL1)); // WebDavのスキーマアクセス制御確認 // 自分セルローカルトークン try { // テスト用のファイルをPUT DavResourceUtils.createWebDavFile(TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME, "box/dav-put.txt", "hoge", Box.DEFAULT_BOX_NAME, DAV_RESOURCE, -1); // ACL設定 DavResourceUtils.setACL(TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME, HttpStatus.SC_OK, DAV_RESOURCE, "box/acl-all.txt", Box.DEFAULT_BOX_NAME, ""); this.checkResourcesWithSchema("", DAV_RESOURCE, tokenStr, Box.DEFAULT_BOX_NAME, TEST_CELL1); } finally { // テスト用のファイルを削除 DavResourceUtils.deleteWebDavFile("box/dav-delete.txt", Setup.TEST_CELL1, AbstractCase.MASTER_TOKEN_NAME, DAV_RESOURCE, -1, Box.DEFAULT_BOX_NAME); } } /** * パスワード認証-トランスセルトークン取得. * @param account アカウント名 * @param pass パスワード * @return トークン */ private JSONObject getTransTokenByPassAuth(String account, String pass) { TResponse res = Http.request("authn/password-tc-c0.txt") .with("remoteCell", TEST_CELL1) .with("username", account) .with("password", pass) .with("dc_target", UrlUtils.cellRoot(TEST_CELL2)) .returns() .statusCode(HttpStatus.SC_OK); JSONObject json = res.bodyAsJson(); return json; } /** * アプリセルパスワード認証-トランスセルトークン取得. * @param cellName ターゲットCell名 * @param account アカウント名 * @param pass パスワード * @return トークン */ private JSONObject getTransTokenByAppAuth(String cellName, String account, String pass, String targetUrl) { // アプリセルに対して認証 TResponse res = Http.request("authn/password-tc-c0.txt") .with("remoteCell", cellName) .with("username", account) .with("password", pass) .with("dc_target", targetUrl) .returns() .statusCode(HttpStatus.SC_OK); JSONObject json = res.bodyAsJson(); return json; } /** * スキーマ付パスワード認証-セルローカルトークン取得. * @param account アカウント名 * @param pass パスワード * @param clientIdCell clientIdCell * @return トークン */ private JSONObject getLocalTokenByPassAuthWithSchema(String account, String pass, String token, String clientIdCell) { // Queryでスキーマ認証 TResponse res = Http.request("authn/password-cl-cp.txt") .with("remoteCell", TEST_CELL1) .with("username", account) .with("password", pass) .with("client_id", UrlUtils.cellRoot(clientIdCell)) .with("client_secret", token) .returns() .statusCode(HttpStatus.SC_OK); JSONObject json = res.bodyAsJson(); return json; } /** * スキーマ付パスワード認証-セルローカルトークン取得. * @param account アカウント名 * @param pass パスワード * @return トークン */ private JSONObject getTransTokenByPassAuthWithSchema(String account, String pass, String token) { // アプリセルに対して認証 TResponse res = Http.request("authn/password-tc-cp.txt") .with("remoteCell", TEST_CELL1) .with("username", account) .with("password", pass) .with("client_id", UrlUtils.cellRoot(TEST_APP_CELL1)) .with("client_secret", token) .with("dc_target", UrlUtils.cellRoot(TEST_CELL2)) .returns() .statusCode(HttpStatus.SC_OK); JSONObject json = res.bodyAsJson(); return json; } /** * ACL設定. * @param path 対象のコレクションのパス * @return レスポンス */ private TResponse setACL(String box, String path, String setFile) { TResponse tresponseWebDav = null; // ACLの設定 tresponseWebDav = Http.request(setFile) .with("cellPath", TEST_CELL1) .with("colname", path) .with("box", box) .with("token", AbstractCase.MASTER_TOKEN_NAME) .with("roleBaseUrl", UrlUtils.roleResource(TEST_CELL1, null, "")) .with("level", "") .returns() .statusCode(HttpStatus.SC_OK); return tresponseWebDav; } private String checkCellLocalWithSchema(String account, String pass, String schemaCell, String schema) throws TokenParseException { // スキーマ認証 JSONObject appAuthJson = this.getTransTokenByAppAuth(schemaCell, account, pass, UrlUtils.cellRoot(TEST_CELL1)); String appToken = (String) appAuthJson.get(OAuth2Helper.Key.ACCESS_TOKEN); // 認証 JSONObject json = this.getLocalTokenByPassAuthWithSchema("account2", "password2", appToken, schemaCell); String issuer = UrlUtils.cellRoot(TEST_CELL1); // トークンチェック String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); AccountAccessToken aToken = AccountAccessToken.parse(tokenStr, issuer); assertEquals(schema, aToken.getSchema()); String rTokenStr = (String) json.get(OAuth2Helper.Key.REFRESH_TOKEN); CellLocalRefreshToken rToken = CellLocalRefreshToken.parse(rTokenStr, issuer); assertEquals(schema, rToken.getSchema()); return tokenStr; } /** * スキーマ付セルローカルトークン認証処理. * @param account アカウント名 * @param pass パスワード * @return トークン * @throws TokenParseException トークンパースエラー * @throws TokenRootCrtException TokenRootCrtException * @throws TokenDsigException TokenDsigException */ private void checkTransTokenWithSchema(String account, String pass, String schema) throws TokenParseException, TokenDsigException, TokenRootCrtException { // スキーマ認証 JSONObject appAuthJson = getTransTokenByAppAuth(TEST_APP_CELL1, account, pass, UrlUtils.cellRoot(TEST_CELL1)); String appToken = (String) appAuthJson.get(OAuth2Helper.Key.ACCESS_TOKEN); // 認証 JSONObject json = getTransTokenByPassAuthWithSchema("account2", "password2", appToken); // トークンチェック String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); TransCellAccessToken aToken = TransCellAccessToken.parse(tokenStr); assertEquals(schema, aToken.getSchema()); } /** * スキーマ付トークン認証処理. * @param account アカウント名 * @param pass パスワード * @param schema スキーマ名 * @return 他人セルローカルトークン * @throws TokenParseException トークンパースエラー */ private String cheackTokenAuth(String account, String pass, String schema) throws TokenParseException { // 認証 JSONObject json = getTransTokenByPassAuth("account2", "password2"); String tokenStr = (String) json.get(OAuth2Helper.Key.ACCESS_TOKEN); // スキーマ認証 JSONObject appAuthJson = getTransTokenByAppAuth(TEST_APP_CELL1, account, pass, UrlUtils.cellRoot(TEST_CELL2)); String appToken = (String) appAuthJson.get(OAuth2Helper.Key.ACCESS_TOKEN); // セルに対してトークン認証 // Queryでスキーマ認証 TResponse res3 = Http.request("authn/saml-cl-cp.txt") .with("remoteCell", TEST_CELL2) .with("assertion", tokenStr) .with("client_id", UrlUtils.cellRoot(TEST_APP_CELL1)) .with("client_secret", appToken) .returns() .statusCode(HttpStatus.SC_OK); String issuer = UrlUtils.cellRoot(TEST_CELL2); JSONObject json2 = res3.bodyAsJson(); String tokenStr2 = (String) json2.get(OAuth2Helper.Key.ACCESS_TOKEN); CellLocalAccessToken aToken = CellLocalAccessToken.parse(tokenStr2, issuer); assertEquals(schema, aToken.getSchema()); return tokenStr2; } }