/** * 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.core.rs; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.CookieParam; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; import org.apache.commons.codec.CharEncoding; import org.apache.http.HttpHeaders; import com.fujitsu.dc.common.utils.DcCoreUtils; import com.fujitsu.dc.core.DcCoreException; import com.fujitsu.dc.core.auth.AccessContext; import com.fujitsu.dc.core.model.Cell; import com.fujitsu.dc.core.model.ModelFactory; import com.fujitsu.dc.core.model.lock.CellLockManager; import com.fujitsu.dc.core.rs.cell.CellResource; import com.fujitsu.dc.core.rs.unit.UnitCtlResource; /** * すべてのリクエストの入り口となるJax-RS Resource. * ここでURL情報の取得、Authorizationヘッダの取得を行い、 * これら情報はサブリソースに渡してゆく. */ @Path("") public class FacadeResource { /** * クッキー認証の際、クッキー内に埋め込まれている情報のキー. */ public static final String DC_COOKIE_KEY = "dc_cookie"; /** * クッキー認証の際、クエリパラメタに指定されるキー. */ public static final String COOKIE_PEER_QUERY_KEY = "dc_cookie_peer"; /** * @param cookieAuthValue クッキー内の dc_cookieキーに指定された値 * @param cookiePeer dc_cookie_peerクエリに指定された値 * @param authzHeaderValue Authorization ヘッダ * @param host Host ヘッダ * @param uriInfo UriInfo * @param xDcUnitUser X-Dc-UnitUserヘッダ * @param httpServletRequest HttpServletRequest * @return CellResourceオブジェクトまたはResponseオブジェクト */ @Path("{path1}") public final Object facade( @CookieParam(DC_COOKIE_KEY) final String cookieAuthValue, @QueryParam(COOKIE_PEER_QUERY_KEY) final String cookiePeer, @HeaderParam(HttpHeaders.AUTHORIZATION) final String authzHeaderValue, @HeaderParam(HttpHeaders.HOST) final String host, @HeaderParam(DcCoreUtils.HttpHeaders.X_DC_UNIT_USER) final String xDcUnitUser, @Context final UriInfo uriInfo, @Context HttpServletRequest httpServletRequest) { Cell cell = ModelFactory.cell(uriInfo); AccessContext ac = AccessContext.create(authzHeaderValue, uriInfo, cookiePeer, cookieAuthValue, cell, uriInfo.getBaseUri().toString(), host, xDcUnitUser); if (cell == null) { throw DcCoreException.Dav.CELL_NOT_FOUND; } long cellStatus = CellLockManager.getCellStatus(cell.getId()); if (cellStatus == CellLockManager.CELL_STATUS_BULK_DELETION) { throw DcCoreException.Dav.CELL_NOT_FOUND; } CellLockManager.incrementReferenceCount(cell.getId()); httpServletRequest.setAttribute("cellId", cell.getId()); return new CellResource(ac); } /** * @param cookieAuthValue クッキー内の dc_cookieキーに指定された値 * @param cookiePeer dc_cookie_peerクエリに指定された値 * @param authzHeaderValue Authorization ヘッダ * @param host Host ヘッダ * @param xDcUnitUser ヘッダ * @param uriInfo UriInfo * @return UnitCtlResourceオブジェクト */ @Path("__ctl") public final UnitCtlResource ctl( @CookieParam(DC_COOKIE_KEY) final String cookieAuthValue, @QueryParam(COOKIE_PEER_QUERY_KEY) final String cookiePeer, @HeaderParam(HttpHeaders.AUTHORIZATION) final String authzHeaderValue, @HeaderParam(HttpHeaders.HOST) final String host, @HeaderParam(DcCoreUtils.HttpHeaders.X_DC_UNIT_USER) final String xDcUnitUser, @Context final UriInfo uriInfo) { AccessContext ac = AccessContext.create(authzHeaderValue, uriInfo, cookiePeer, cookieAuthValue, null, uriInfo.getBaseUri().toString(), host, xDcUnitUser); return new UnitCtlResource(ac, uriInfo); } /** * @param authzHeaderValue Authorization ヘッダ * @param host Host ヘッダ * @param xDcUnitUser ヘッダ * @param uriInfo UriInfo * @return UnitCtlResourceオブジェクト */ @Path("__status") public final StatusResource status( @HeaderParam(HttpHeaders.AUTHORIZATION) final String authzHeaderValue, @HeaderParam(HttpHeaders.HOST) final String host, @HeaderParam(DcCoreUtils.HttpHeaders.X_DC_UNIT_USER) final String xDcUnitUser, @Context final UriInfo uriInfo) { return new StatusResource(); } static final String CROSSDOMAIN_XML = DcCoreUtils.readStringResource("crossdomain.xml", CharEncoding.UTF_8); /** * Crossdomain.xmlを返します。 * @return Crossdomain.xmlの文字列. */ @Path("crossdomain.xml") @Produces(MediaType.APPLICATION_XML) @GET public final String crosdomainXml() { return CROSSDOMAIN_XML; } }