package com.beowulfe.hap.impl.pairing; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.beowulfe.hap.HomekitAuthInfo; import com.beowulfe.hap.impl.HomekitRegistry; import com.beowulfe.hap.impl.http.HttpRequest; import com.beowulfe.hap.impl.http.HttpResponse; import com.beowulfe.hap.impl.jmdns.JmdnsHomekitAdvertiser; import com.beowulfe.hap.impl.responses.NotFoundResponse; import com.beowulfe.hap.impl.responses.UnauthorizedResponse; public class PairingManager { private final static Logger logger = LoggerFactory.getLogger(PairingManager.class); private final HomekitAuthInfo authInfo; private final HomekitRegistry registry; private final JmdnsHomekitAdvertiser advertiser; private SrpHandler srpHandler; public PairingManager(HomekitAuthInfo authInfo, HomekitRegistry registry, JmdnsHomekitAdvertiser advertiser) { this.authInfo = authInfo; this.registry = registry; this.advertiser = advertiser; } public HttpResponse handle(HttpRequest httpRequest) throws Exception { PairSetupRequest req = PairSetupRequest.of(httpRequest.getBody()); if (req.getStage() == Stage.ONE) { logger.info("Starting pair for "+registry.getLabel()); srpHandler = new SrpHandler(authInfo.getPin(), authInfo.getSalt()); return srpHandler.handle(req); } else if (req.getStage() == Stage.TWO) { logger.debug("Entering second stage of pair for "+registry.getLabel()); if (srpHandler == null) { logger.warn("Received unexpected stage 2 request for "+registry.getLabel()); return new UnauthorizedResponse(); } else { try { return srpHandler.handle(req); } catch (Exception e) { srpHandler = null; //You don't get to try again - need a new key logger.error("Exception encountered while processing pairing request", e); return new UnauthorizedResponse(); } } } else if (req.getStage() == Stage.THREE) { logger.debug("Entering third stage of pair for "+registry.getLabel()); if (srpHandler == null) { logger.warn("Received unexpected stage 3 request for "+registry.getLabel()); return new UnauthorizedResponse(); } else { FinalPairHandler handler = new FinalPairHandler(srpHandler.getK(), authInfo, advertiser); try { return handler.handle(req); } catch (Exception e) { logger.error("Exception while finalizing pairing", e); return new UnauthorizedResponse(); } } } return new NotFoundResponse(); } }