com.launchkey.sdk.service.V1ServiceAbstract.java Source code

Java tutorial

Introduction

Here is the source code for com.launchkey.sdk.service.V1ServiceAbstract.java

Source

/**
 * Copyright 2015 LaunchKey, Inc.  All rights reserved.
 * <p/>
 * Licensed under the MIT License.
 * You may not use this file except in compliance with the License.
 * A copy of the License is located in the "LICENSE.txt" file accompanying
 * this file. This file 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.launchkey.sdk.service;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.launchkey.sdk.cache.CachePersistenceException;
import com.launchkey.sdk.cache.PingResponseCache;
import com.launchkey.sdk.crypto.Crypto;
import com.launchkey.sdk.service.error.LaunchKeyException;
import com.launchkey.sdk.transport.v1.Transport;
import com.launchkey.sdk.transport.v1.domain.LaunchKeyDateFormat;
import com.launchkey.sdk.transport.v1.domain.PingRequest;
import com.launchkey.sdk.transport.v1.domain.PingResponse;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.security.interfaces.RSAPublicKey;
import java.util.Date;

/**
 * Abstract V1 based service providing shared funcitonality between auth and whitelabel services
 */
public abstract class V1ServiceAbstract {
    protected final Transport transport;
    protected final Crypto crypto;
    protected final PingResponseCache pingResponseCache;
    protected final long rocketKey;
    protected final String secretKey;
    protected final Base64 base64 = new Base64(0);
    protected final ObjectMapper objectMapper = new ObjectMapper();
    protected final Log log;
    protected final LaunchKeyDateFormat launchKeyDateFormat = new LaunchKeyDateFormat();

    /**
     * @param transport
     * @param crypto
     * @param pingResponseCache
     * @param rocketKey
     * @param secretKey
     */
    public V1ServiceAbstract(Transport transport, Crypto crypto, PingResponseCache pingResponseCache,
            long rocketKey, String secretKey) {
        this.transport = transport;
        this.secretKey = secretKey;
        this.pingResponseCache = pingResponseCache;
        this.rocketKey = rocketKey;
        this.crypto = crypto;
        this.log = LogFactory.getLog(getClass());
    }

    protected RSAPublicKey getLaunchKeyPublicKey() throws LaunchKeyException {
        PingResponse pingResponse = null;
        try {
            pingResponse = pingResponseCache.getPingResponse();
        } catch (CachePersistenceException e) {
            log.error("Error getting ping response from cache", e);
        }
        if (pingResponse == null) {
            pingResponse = transport.ping(new PingRequest());
            try {
                pingResponseCache.setPingResponse(pingResponse);
            } catch (CachePersistenceException e) {
                log.error("Error placing ping response in cache", e);
            }
        }
        RSAPublicKey publicKey = crypto.getRSAPublicKeyFromPEM(pingResponse.getPublicKey());
        return publicKey;
    }

    protected byte[] getSecret() throws LaunchKeyException {

        try {
            String json = objectMapper.writeValueAsString(new Object() {
                public final String secret = secretKey;
                public final String stamped = launchKeyDateFormat.format(new Date());
            });
            return crypto.encryptRSA(json.getBytes(), getLaunchKeyPublicKey());
        } catch (JsonProcessingException e) {
            throw new LaunchKeyException("Unable to create JSON from secret key", e, 0);
        }
    }
}