CoapAuthzInfo.java
/*******************************************************************************
* Copyright (c) 2019, RISE AB
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
package se.sics.ace.coap.rs;
import java.util.logging.Logger;
import org.eclipse.californium.core.CoapResource;
import org.eclipse.californium.core.coap.CoAP.ResponseCode;
import org.eclipse.californium.core.coap.OptionSet;
import org.eclipse.californium.core.coap.Request;
import org.eclipse.californium.core.server.resources.CoapExchange;
import org.eclipse.californium.elements.EndpointContext;
import se.sics.ace.AceException;
import se.sics.ace.Constants;
import se.sics.ace.Message;
import se.sics.ace.coap.CoapReq;
import se.sics.ace.coap.CoapRes;
import se.sics.ace.rs.AuthzInfo;
/**
* A CoAP resource implementing the authz-info endpoint at the RS.
*
* @author Ludwig Seitz and Marco Tiloca
*
*/
public class CoapAuthzInfo extends CoapResource {
/**
* The logger
*/
private static final Logger LOGGER
= Logger.getLogger(CoapAuthzInfo.class.getName());
/**
* The underlying authz-info library
*/
private AuthzInfo ai;
/**
* Constructor.
*
* @param ai the internal authorization information handler
*/
public CoapAuthzInfo(AuthzInfo ai) {
super("authz-info");
this.ai = ai;
}
@Override
public void handlePOST(CoapExchange exchange) {
exchange.accept();
Request req = new Request(exchange.getRequestCode());
req.setPayload(exchange.getRequestPayload());
// The Token POST may be protected, i.e. when updating access rights
//
// To cover this case, copy the information from the traversed security layer
// into the request to process at the underlying authz-info library
EndpointContext ctx = exchange.advanced().getRequest().getSourceContext();
req.setSourceContext(ctx);
// Re-include the CoAP options from the received request.
//
// When then OSCORE profile is used, this enables the RS
// to check that the content-format application/ace+cbor is used.
OptionSet options = exchange.advanced().getRequest().getOptions();
req.setOptions(options);
try {
CoapReq msg = CoapReq.getInstance(req);
Message reply = this.ai.processMessage(msg);
//Safe to cast, since CoapReq only ever renders a CoapRes
CoapRes response = (CoapRes)reply;
exchange.respond(response.getCode(), response.getRawPayload(),
Constants.APPLICATION_ACE_CBOR);
} catch (AceException e) {
LOGGER.severe("Error while handling incoming POST: "
+ e.getMessage());
exchange.respond(ResponseCode.BAD_REQUEST);
return;
}
}
}