Improve Test coverage of DFC
[nonrtric/plt/ranpm.git] / datafilecollector / src / main / java / org / oran / datafile / oauth2 / OAuthBearerTokenJwt.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2023 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.oran.datafile.oauth2;
22
23 import java.util.Base64;
24 import java.util.HashSet;
25 import java.util.Set;
26 import lombok.ToString;
27 import org.apache.kafka.common.security.oauthbearer.OAuthBearerToken;
28 import org.oran.datafile.exceptions.DatafileTaskException;
29
30 public class OAuthBearerTokenJwt implements OAuthBearerToken {
31     private static final com.google.gson.Gson gson = new com.google.gson.GsonBuilder().disableHtmlEscaping().create();
32
33     private final String jwtTokenRaw;
34     private final JwtTokenBody tokenBody;
35
36     @ToString
37     private static class JwtTokenBody {
38         String sub = ""; // principalName
39         long exp = 0; // expirationTime
40         long iat = 0; // startTime
41         String scope = "";
42     }
43
44     public static OAuthBearerTokenJwt create(String tokenRaw) throws DatafileTaskException {
45         String[] chunks = tokenRaw.split("\\.");
46         Base64.Decoder decoder = Base64.getUrlDecoder();
47         if (chunks.length < 2) {
48             throw new DatafileTaskException("Could not parse JWT token: " + tokenRaw);
49
50         }
51         String payloadStr = new String(decoder.decode(chunks[1]));
52         JwtTokenBody token = gson.fromJson(payloadStr, JwtTokenBody.class);
53         return new OAuthBearerTokenJwt(token, tokenRaw);
54     }
55
56     private OAuthBearerTokenJwt(JwtTokenBody jwtTokenBody, String accessToken) {
57         super();
58         this.jwtTokenRaw = accessToken;
59         this.tokenBody = jwtTokenBody;
60     }
61
62     @Override
63     public String value() {
64         return jwtTokenRaw;
65     }
66
67     @Override
68     public Set<String> scope() {
69         Set<String> res = new HashSet<>();
70         if (!this.tokenBody.scope.isEmpty()) {
71             res.add(this.tokenBody.scope);
72         }
73         return res;
74     }
75
76     @Override
77     public long lifetimeMs() {
78         if (this.tokenBody.exp == 0) {
79             return Long.MAX_VALUE;
80         }
81         return this.tokenBody.exp * 1000;
82     }
83
84     @Override
85     public String principalName() {
86         return this.tokenBody.sub;
87     }
88
89     @Override
90     public Long startTimeMs() {
91         return this.tokenBody.iat;
92     }
93
94 }