/**
* 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.unit.core.auth;
import static com.fujitsu.dc.common.auth.token.AbstractOAuth2Token.MILLISECS_IN_AN_HOUR;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.UUID;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
import org.mockito.Matchers;
import com.fujitsu.dc.common.auth.token.CellLocalAccessToken;
import com.fujitsu.dc.common.auth.token.LocalToken;
import com.fujitsu.dc.common.auth.token.UnitLocalUnitUserToken;
import com.fujitsu.dc.common.utils.DcCoreUtils;
import com.fujitsu.dc.core.DcCoreConfig;
import com.fujitsu.dc.core.auth.AccessContext;
import com.fujitsu.dc.core.model.Cell;
import com.fujitsu.dc.core.odata.OEntityWrapper;
import com.fujitsu.dc.test.categories.Unit;
import com.fujitsu.dc.test.jersey.DcRunner;
import com.fujitsu.dc.test.unit.core.UrlUtils;
/**
* AccessContext ユニットテストクラス.
*/
@RunWith(DcRunner.class)
@Category({ Unit.class })
public class AccessContextTest {
/**
* マスタートークン.
*/
public static final String MASTER_TOKEN = DcCoreConfig.getMasterToken();
/**
* baseUrl.
*/
public static final String BASE_URL = UrlUtils.getBaseUrl();
/**
* Owner.
*/
public static final String OWNER = null;
/**
* トークン処理ライブラリの初期設定.
*/
@BeforeClass
public static void beforeClass() {
}
/**
* testGetCellのテスト.
*/
@Test
@Ignore
public void testGetCell() {
fail("Not yet implemented");
}
/**
* testGetTypeのテスト.
*/
@Test
@Ignore
public void testGetType() {
fail("Not yet implemented");
}
/**
* testGetSubjectのテスト.
*/
@Test
@Ignore
public void testGetSubject() {
fail("Not yet implemented");
}
/**
* testGetSchemaのテスト.
*/
@Test
@Ignore
public void testGetSchema() {
fail("Not yet implemented");
}
/**
* testAddRoleのテスト.
*/
@Test
@Ignore
public void testAddRole() {
fail("Not yet implemented");
}
/**
* testGetRoleListのテスト.
*/
@Test
@Ignore
public void testGetRoleList() {
fail("Not yet implemented");
}
/**
* testCreateBasicのテスト.
*/
@Test
public void testCreate() {
Cell cell = (Cell) mock(Cell.class);
when(cell.authenticateAccount((OEntityWrapper) Matchers.any(), Matchers.anyString())).thenReturn(true);
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(null, null, null, null,
cell, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(accessContext.getType(), AccessContext.TYPE_ANONYMOUS);
}
/**
* testCreateBasicのテスト.
* TODO V1.1 Basic認証に対応後有効化する
*/
@Test
@Ignore
public void testCreateBasic() {
String auth = "Basic "
+ DcCoreUtils.encodeBase64Url("user:pass".getBytes());
Cell cell = (Cell) mock(Cell.class);
when(cell.authenticateAccount((OEntityWrapper) Matchers.any(), Matchers.anyString())).thenReturn(true);
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(auth,
null, null, null, cell, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(accessContext.getType(), AccessContext.TYPE_BASIC);
}
/**
* testCreateBasicでInvalidになるテスト.
*/
@Test
public void testCreateBasicINVALID() {
String auth = "Basic "
+ DcCoreUtils.encodeBase64Url("user:pass".getBytes());
Cell cell = (Cell) mock(Cell.class);
when(cell.authenticateAccount((OEntityWrapper) Matchers.any(), Matchers.anyString())).thenReturn(false);
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(auth,
null, null, null, cell, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(accessContext.getType(), AccessContext.TYPE_INVALID);
}
/**
* Bearer形式 マスタートークンを指定して、UNIT_MASTERのアクセスコンテキストが取得できること.
*/
@Test
public void testCreateBearerAuthzMasterToken() {
String authzHeader = "Bearer " + MASTER_TOKEN;
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(authzHeader,
null, null, null, null, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(AccessContext.TYPE_UNIT_MASTER, accessContext.getType());
}
/**
* Bearer形式 Cell指定がない状態でパースエラーが発生した場合、ACCESS_INVALIDのアクセスコンテキストが取得できること.
*/
@Test
public void testCreateBearerAuthzCellNullParseError() {
// 「dGVzdA==」=>「test」のBase64化した文字列
String authzHeader = "Bearer dGVzdA==";
System.out.println(authzHeader);
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(authzHeader,
null, null, null, null, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(AccessContext.TYPE_INVALID, accessContext.getType());
}
/**
* Bearer形式 Cell指定がない状態で「Bearer」のみ指定した場合、ACCESS_INVALIDのアクセスコンテキストが取得できること.
*/
@Test
public void testCreateBearerAuthzCellNullParamBearer() {
String authzHeader = "Bearer";
System.out.println(authzHeader);
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(authzHeader,
null, null, null, null, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(AccessContext.TYPE_INVALID, accessContext.getType());
}
/**
* Bearer形式 Cell指定がない状態で「Bearer 」のみ指定した場合、ACCESS_INVALIDのアクセスコンテキストが取得できること.
*/
@Test
public void testCreateBearerAuthzCellNullParamBearerSpace() {
String authzHeader = "Bearer ";
System.out.println(authzHeader);
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(authzHeader,
null, null, null, null, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(AccessContext.TYPE_INVALID, accessContext.getType());
}
/**
* AuthorizationHeaderなしでのULUUTのcookie認証によるAccessContext生成の正常系テスト.
*/
@Test
public void AuthorizationHeaderなしでのULUUTのcookie認証によるAccessContext生成の正常系テスト() {
Cell cell = (Cell) mock(Cell.class);
when(cell.authenticateAccount((OEntityWrapper) Matchers.any(), Matchers.anyString())).thenReturn(true);
when(cell.getOwner()).thenReturn("cellOwner");
UriInfo uriInfo = new TestUriInfo();
// uluut発行処理
UnitLocalUnitUserToken uluut = new UnitLocalUnitUserToken(
System.currentTimeMillis(), UnitLocalUnitUserToken.ACCESS_TOKEN_EXPIRES_HOUR * MILLISECS_IN_AN_HOUR,
cell.getOwner(), uriInfo.getBaseUri().getHost() + ":" + uriInfo.getBaseUri().getPort());
String tokenString = uluut.toTokenString();
// dc_cookie_peerとして、ランダムなUUIDを設定する
String dcCookiePeer = UUID.randomUUID().toString();
String cookieValue = dcCookiePeer + "\t" + tokenString;
// ヘッダに返却するdc-cookie値は、暗号化する
String encodedCookieValue = LocalToken.encode(cookieValue,
UnitLocalUnitUserToken.getIvBytes(AccessContext.getCookieCryptKey(uriInfo.getBaseUri())));
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(null, uriInfo, dcCookiePeer, encodedCookieValue,
cell, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(AccessContext.TYPE_UNIT_LOCAL, accessContext.getType());
}
/**
* AuthorizationHeaderなしでのLocalTokenのcookie認証によるAccessContext生成の正常系テスト.
*/
@Test
public void AuthorizationHeaderなしでのLocalTokenのcookie認証によるAccessContext生成の正常系テスト() {
UriInfo uriInfo = new TestUriInfo();
Cell cell = (Cell) mock(Cell.class);
when(cell.authenticateAccount((OEntityWrapper) Matchers.any(), Matchers.anyString())).thenReturn(true);
when(cell.getOwner()).thenReturn("cellOwner");
when(cell.getUrl()).thenReturn(uriInfo.getBaseUri().getHost() + ":" + uriInfo.getBaseUri().getPort());
// Token発行処理
CellLocalAccessToken token = new CellLocalAccessToken(
uriInfo.getBaseUri().getHost() + ":" + uriInfo.getBaseUri().getPort(), cell.getOwner(), null,
uriInfo.getBaseUri().getHost() + ":" + uriInfo.getBaseUri().getPort());
String tokenString = token.toTokenString();
// dc_cookie_peerとして、ランダムなUUIDを設定する
String dcCookiePeer = UUID.randomUUID().toString();
String cookieValue = dcCookiePeer + "\t" + tokenString;
// ヘッダに返却するdc-cookie値は、暗号化する
String encodedCookieValue = LocalToken.encode(cookieValue,
UnitLocalUnitUserToken.getIvBytes(AccessContext.getCookieCryptKey(uriInfo.getBaseUri())));
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(null, uriInfo, dcCookiePeer, encodedCookieValue,
cell, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(AccessContext.TYPE_LOCAL, accessContext.getType());
}
/**
* BASIC認証AuthorizationHeaderとcookie認証情報が同時に指定された場合のAccessContext生成の正常系テスト.
*/
@Test
public void BASIC認証AuthorizationHeaderとcookie認証情報が同時に指定された場合のAccessContext生成の正常系テスト() {
Cell cell = (Cell) mock(Cell.class);
when(cell.authenticateAccount((OEntityWrapper) Matchers.any(), Matchers.anyString())).thenReturn(true);
when(cell.getOwner()).thenReturn("cellOwner");
UriInfo uriInfo = new TestUriInfo();
// uluut発行処理
UnitLocalUnitUserToken uluut = new UnitLocalUnitUserToken(
System.currentTimeMillis(), UnitLocalUnitUserToken.ACCESS_TOKEN_EXPIRES_HOUR * MILLISECS_IN_AN_HOUR,
cell.getOwner(), uriInfo.getBaseUri().getHost() + ":" + uriInfo.getBaseUri().getPort());
String tokenString = uluut.toTokenString();
// dc_cookie_peerとして、ランダムなUUIDを設定する
String dcCookiePeer = UUID.randomUUID().toString();
String cookieValue = dcCookiePeer + "\t" + tokenString;
// ヘッダに返却するdc-cookie値は、暗号化する
String encodedCookieValue = LocalToken.encode(cookieValue,
UnitLocalUnitUserToken.getIvBytes(AccessContext.getCookieCryptKey(uriInfo.getBaseUri())));
String basicAuth = "Basic "
+ DcCoreUtils.encodeBase64Url("user:pass".getBytes());
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(basicAuth, uriInfo, dcCookiePeer, encodedCookieValue,
cell, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(AccessContext.TYPE_INVALID, accessContext.getType());
}
/**
* マスタトークン認証AuthorizationHeaderとcookie認証情報が同時に指定された場合のAccessContext生成の正常系テスト.
*/
@Test
public void マスタトークン認証AuthorizationHeaderとcookie認証情報が同時に指定された場合のAccessContext生成の正常系テスト() {
Cell cell = (Cell) mock(Cell.class);
when(cell.authenticateAccount((OEntityWrapper) Matchers.any(), Matchers.anyString())).thenReturn(true);
when(cell.getOwner()).thenReturn("cellOwner");
UriInfo uriInfo = new TestUriInfo();
// uluut発行処理
UnitLocalUnitUserToken uluut = new UnitLocalUnitUserToken(
System.currentTimeMillis(), UnitLocalUnitUserToken.ACCESS_TOKEN_EXPIRES_HOUR * MILLISECS_IN_AN_HOUR,
cell.getOwner(), uriInfo.getBaseUri().getHost() + ":" + uriInfo.getBaseUri().getPort());
String tokenString = uluut.toTokenString();
// dc_cookie_peerとして、ランダムなUUIDを設定する
String dcCookiePeer = UUID.randomUUID().toString();
String cookieValue = dcCookiePeer + "\t" + tokenString;
// ヘッダに返却するdc-cookie値は、暗号化する
String encodedCookieValue = LocalToken.encode(cookieValue,
UnitLocalUnitUserToken.getIvBytes(AccessContext.getCookieCryptKey(uriInfo.getBaseUri())));
String masterTokenAuth = "Bearer " + MASTER_TOKEN;
// 第1引数は AuthHeader, 第2引数は UriInfo, 第3引数は cookie_peer, 第4引数は cookie内の暗号化されたトークン情報
AccessContext accessContext = AccessContext.create(masterTokenAuth, uriInfo, dcCookiePeer, encodedCookieValue,
cell, BASE_URL, UrlUtils.getHost(), OWNER);
assertEquals(AccessContext.TYPE_UNIT_MASTER, accessContext.getType());
}
/**
* ダミーの UriInfo実装.
*/
class TestUriInfo implements UriInfo {
@Override
public String getPath() {
return "/dc1-core";
}
@Override
public String getPath(boolean decode) {
return "/dc1-core";
}
@Override
public List<PathSegment> getPathSegments() {
return null;
}
@Override
public List<PathSegment> getPathSegments(boolean decode) {
return null;
}
@Override
public URI getRequestUri() {
return null;
}
@Override
public UriBuilder getRequestUriBuilder() {
return null;
}
@Override
public URI getAbsolutePath() {
return null;
}
@Override
public UriBuilder getAbsolutePathBuilder() {
return null;
}
@Override
public URI getBaseUri() {
try {
return new URI(UrlUtils.getBaseUrl());
} catch (URISyntaxException e) {
fail();
return null;
}
}
@Override
public UriBuilder getBaseUriBuilder() {
return null;
}
@Override
public MultivaluedMap<String, String> getPathParameters() {
return null;
}
@Override
public MultivaluedMap<String, String> getPathParameters(boolean decode) {
return null;
}
@Override
public MultivaluedMap<String, String> getQueryParameters() {
return null;
}
@Override
public MultivaluedMap<String, String> getQueryParameters(boolean decode) {
return null;
}
@Override
public List<String> getMatchedURIs() {
return null;
}
@Override
public List<String> getMatchedURIs(boolean decode) {
return null;
}
@Override
public List<Object> getMatchedResources() {
return null;
}
}
}