859fd700608b52462116b3f52ca9037a58c370ce
[dcaegen2/collectors/hv-ves.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * dcaegen2-collectors-veshv
4  * ================================================================================
5  * Copyright (C) 2019 NOKIA
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.onap.dcae.collectors.veshv.config.impl.gsonadapters
21
22 import arrow.core.Option
23 import com.google.gson.JsonDeserializationContext
24 import com.google.gson.JsonDeserializer
25 import com.google.gson.JsonElement
26 import com.google.gson.JsonObject
27 import org.onap.dcae.collectors.veshv.config.impl.PartialSecurityConfig
28 import org.onap.dcaegen2.services.sdk.security.ssl.ImmutableSecurityKeys
29 import org.onap.dcaegen2.services.sdk.security.ssl.ImmutableSecurityKeysStore
30 import org.onap.dcaegen2.services.sdk.security.ssl.Passwords
31 import org.onap.dcaegen2.services.sdk.security.ssl.SecurityKeys
32 import java.io.File
33 import java.lang.reflect.Type
34
35 /**
36  * @author Pawel Biniek <pawel.biniek@nokia.com>
37  * @since March 2019
38  */
39 internal class SecurityAdapter : JsonDeserializer<PartialSecurityConfig> {
40
41     override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext?) =
42             json.asJsonObject.let { security ->
43                 if (security.entrySet().isEmpty() || hasSslDisableSet(security)) {
44                     PartialSecurityConfig(Option.empty())
45                 } else {
46                     PartialSecurityConfig(Option.just(security.securityKeys(::asImmutableSecurityKeys)))
47                 }
48             }
49
50     private fun hasSslDisableSet(security: JsonObject) =
51             security.has(SSL_DISABLE_KEY) && security[SSL_DISABLE_KEY].asBoolean
52
53     private fun JsonObject.securityKeys(f: (JsonObject) -> SecurityKeys) = f(getAsJsonObject(KEYS_OBJECT_KEY))
54
55     private fun asImmutableSecurityKeys(keys: JsonObject) = ImmutableSecurityKeys.builder()
56             .keyStore(ImmutableSecurityKeysStore.of(
57                     File(keys[KEY_STORE_FILE_KEY].asString).toPath()))
58             .keyStorePassword(
59                     Passwords.fromString(keys[KEY_STORE_PASSWORD_KEY].asString))
60             .trustStore(ImmutableSecurityKeysStore.of(
61                     File(keys[TRUST_STORE_FILE_KEY].asString).toPath()))
62             .trustStorePassword(
63                     Passwords.fromString(keys[TRUST_STORE_PASSWORD_KEY].asString))
64             .build()
65
66     companion object {
67         private val SSL_DISABLE_KEY = "sslDisable"
68         private val KEYS_OBJECT_KEY = "keys"
69         private val KEY_STORE_FILE_KEY = "keyStoreFile"
70         private val KEY_STORE_PASSWORD_KEY = "keyStorePassword"
71         private val TRUST_STORE_FILE_KEY = "trustStoreFile"
72         private val TRUST_STORE_PASSWORD_KEY = "trustStorePassword"
73     }
74 }
75