1212import java .io .IOException ;
1313import java .io .InputStream ;
1414import java .io .StringReader ;
15+ import java .nio .charset .StandardCharsets ;
1516import java .util .Base64 ;
1617import java .util .Collections ;
1718import java .util .List ;
@@ -49,32 +50,39 @@ public class VaultServiceRolesInstaller {
4950 private final TimeUnit timeUnit ;
5051
5152 private VaultServiceRolesInstaller (Builder builder ) {
52- this .vaultAddress = builder .vaultAddress ;
53- this .vaultTokenSupplier = builder .vaultTokenSupplier ;
54- this .keyNameSupplier = builder .keyNameSupplier ;
55- this .roleNameBuilder = builder .roleNameBuilder ;
56- this .serviceRolesSources = builder .serviceRolesSources ;
57- this .keyAlgorithm = builder .keyAlgorithm ;
58- this .keyRotationPeriod = builder .keyRotationPeriod ;
59- this .keyVerificationTtl = builder .keyVerificationTtl ;
60- this .roleTtl = builder .roleTtl ;
53+ this .vaultAddress = Objects .requireNonNull (builder .vaultAddress , "vaultAddress" );
54+ this .vaultTokenSupplier =
55+ Objects .requireNonNull (builder .vaultTokenSupplier , "vaultTokenSupplier" );
56+ this .keyNameSupplier = Objects .requireNonNull (builder .keyNameSupplier , "keyNameSupplier" );
57+ this .roleNameBuilder = Objects .requireNonNull (builder .roleNameBuilder , "roleNameBuilder" );
58+ this .serviceRolesSources =
59+ Objects .requireNonNull (builder .serviceRolesSources , "serviceRolesSources" );
60+ this .keyAlgorithm = Objects .requireNonNull (builder .keyAlgorithm , "keyAlgorithm" );
61+ this .keyRotationPeriod = Objects .requireNonNull (builder .keyRotationPeriod , "keyRotationPeriod" );
62+ this .keyVerificationTtl =
63+ Objects .requireNonNull (builder .keyVerificationTtl , "keyVerificationTtl" );
64+ this .roleTtl = Objects .requireNonNull (builder .roleTtl , "roleTtl" );
6165 this .timeout = builder .timeout ;
6266 this .timeUnit = builder .timeUnit ;
6367 }
6468
69+ public static Builder builder () {
70+ return new Builder ();
71+ }
72+
6573 /**
6674 * Builds vault oidc micro-infrastructure (identity roles and keys) to use it for
6775 * machine-to-machine authentication.
6876 */
6977 public void install () {
7078 if (isNullOrNoneOrEmpty (vaultAddress )) {
71- LOGGER .debug ("Skipping serviceRoles installation, vaultAddress not set" );
79+ LOGGER .debug ("Skipping service roles installation, vault address not set" );
7280 return ;
7381 }
7482
7583 final ServiceRoles serviceRoles = loadServiceRoles ();
7684 if (serviceRoles == null || serviceRoles .roles .isEmpty ()) {
77- LOGGER .debug ("Skipping serviceRoles installation, serviceRoles not set" );
85+ LOGGER .debug ("Skipping service roles installation, service roles not set" );
7886 return ;
7987 }
8088
@@ -87,17 +95,19 @@ public void install() {
8795 final var keyName = keyNameSupplier .get ();
8896
8997 createVaultIdentityKey (rest .url (vaultIdentityKeyUri (keyName )), keyName );
98+ LOGGER .debug ("Vault identity key: {}" , keyName );
9099
91100 for (var role : serviceRoles .roles ) {
92- String roleName = roleNameBuilder .apply (role .role );
101+ final var roleName = roleNameBuilder .apply (role .role );
93102 createVaultIdentityRole (
94103 rest .url (vaultIdentityRoleUri (roleName )),
95104 keyName ,
96- roleName ,
105+ role . role ,
97106 role .permissions );
107+ LOGGER .debug ("Vault identity role: {}" , roleName );
98108 }
99109
100- LOGGER .debug ("Installed serviceRoles ({}) " , serviceRoles );
110+ LOGGER .debug ("Installed service roles: {} " , serviceRoles );
101111 })
102112 .get (timeout , timeUnit );
103113 } catch (Exception e ) {
@@ -106,10 +116,6 @@ public void install() {
106116 }
107117
108118 private ServiceRoles loadServiceRoles () {
109- if (serviceRolesSources == null ) {
110- return null ;
111- }
112-
113119 for (Supplier <ServiceRoles > serviceRolesSource : serviceRolesSources ) {
114120 final ServiceRoles serviceRoles = serviceRolesSource .get ();
115121 if (serviceRoles != null ) {
@@ -134,11 +140,10 @@ private void createVaultIdentityKey(Rest rest, String keyName) {
134140 .add ("allowed_client_ids" , "*" )
135141 .add ("algorithm" , keyAlgorithm )
136142 .toString ()
137- .getBytes ();
143+ .getBytes (StandardCharsets . UTF_8 );
138144
139145 try {
140146 awaitSuccess (rest .body (body ).post ().getStatus ());
141- LOGGER .debug ("Created vault identity key: {}" , keyName );
142147 } catch (RestException e ) {
143148 throw new RuntimeException ("Failed to create vault identity key: " + keyName , e );
144149 }
@@ -149,23 +154,26 @@ private void createVaultIdentityRole(
149154 final byte [] body =
150155 Json .object ()
151156 .add ("key" , keyName )
152- .add ("template" , createTemplate (permissions ))
157+ .add ("template" , createTemplate (roleName , permissions ))
153158 .add ("ttl" , roleTtl )
154159 .toString ()
155- .getBytes ();
160+ .getBytes (StandardCharsets . UTF_8 );
156161
157162 try {
158163 awaitSuccess (rest .body (body ).post ().getStatus ());
159- LOGGER .debug ("Created vault identity role: {}" , roleName );
160164 } catch (RestException e ) {
161165 throw new RuntimeException ("Failed to create vault identity role: " + roleName , e );
162166 }
163167 }
164168
165- private static String createTemplate (List <String > permissions ) {
169+ private static String createTemplate (String roleName , List <String > permissions ) {
166170 return Base64 .getUrlEncoder ()
167171 .encodeToString (
168- Json .object ().add ("permissions" , String .join ("," , permissions )).toString ().getBytes ());
172+ Json .object ()
173+ .add ("role" , roleName )
174+ .add ("permissions" , String .join ("," , permissions ))
175+ .toString ()
176+ .getBytes (StandardCharsets .UTF_8 ));
169177 }
170178
171179 private String vaultIdentityKeyUri (String keyName ) {
@@ -363,7 +371,7 @@ public static class Builder {
363371 private long timeout = 10 ;
364372 private TimeUnit timeUnit = TimeUnit .SECONDS ;
365373
366- public Builder () {}
374+ private Builder () {}
367375
368376 public Builder vaultAddress (String vaultAddress ) {
369377 this .vaultAddress = vaultAddress ;
0 commit comments