79ae32a8f63606f8d9f678af6e054578cc5cd53c
[dcaegen2/services/sdk.git] /
1 /*
2  * ============LICENSE_START====================================
3  * DCAEGEN2-SERVICES-SDK
4  * =========================================================
5  * Copyright (C) 2019 Nokia. All rights reserved.
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
21 package org.onap.dcaegen2.services.sdk.services.hvves.client.producer.api.options;
22
23 import io.vavr.CheckedFunction1;
24 import io.vavr.Function1;
25 import io.vavr.control.Try;
26 import java.io.IOException;
27 import java.security.GeneralSecurityException;
28 import java.util.Arrays;
29 import org.jetbrains.annotations.NotNull;
30
31 /**
32  * Simple password representation.
33  *
34  * A password can be used only once. After it the corresponding memory is zeroed.
35  *
36  * @author <a href="mailto:piotr.jaszczyk@nokia.com">Piotr Jaszczyk</a>
37  * @since 1.1.1
38  */
39 public class Password {
40
41     private char[] value;
42
43     public Password(@NotNull char[] value) {
44         this.value = value;
45     }
46
47     /**
48      * Consume the password.
49      *
50      * After consumption following uses of this method will return Failure(GeneralSecurityException).
51      *
52      * @param user of the password
53      */
54     public <T> Try<T> use(Function1<char[], Try<T>> user) {
55         if (value == null)
56             return Try.failure(new GeneralSecurityException("Password had been already used so it is in cleared state"));
57
58         try {
59             return user.apply(value);
60         } finally {
61             clear();
62         }
63     }
64
65     public <T> Try<T> useChecked(CheckedFunction1<char[], T> user) {
66         return use(CheckedFunction1.liftTry(user));
67     }
68
69     public void clear() {
70         Arrays.fill(value, (char) 0);
71         value = null;
72     }
73 }