Skip to content

Commit 45f452f

Browse files
committed
WIP on enhancements
1 parent 29a176f commit 45f452f

File tree

15 files changed

+130
-47
lines changed

15 files changed

+130
-47
lines changed

services-api/src/main/java/io/scalecube/services/ServiceEndpoint.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ServiceEndpoint implements Externalizable {
2222
private static final long serialVersionUID = 1L;
2323

2424
private String id;
25+
private String name;
2526
private Address address;
2627
private Set<String> contentTypes;
2728
private Map<String, String> tags;
@@ -37,6 +38,7 @@ public ServiceEndpoint() {}
3738

3839
private ServiceEndpoint(Builder builder) {
3940
this.id = Objects.requireNonNull(builder.id, "ServiceEndpoint.id is required");
41+
this.name = Objects.requireNonNull(builder.name, "ServiceEndpoint.name is required");
4042
this.address = Objects.requireNonNull(builder.address, "ServiceEndpoint.address is required");
4143
this.contentTypes = Collections.unmodifiableSet(new HashSet<>(builder.contentTypes));
4244
this.tags = Collections.unmodifiableMap(new HashMap<>(builder.tags));
@@ -56,6 +58,10 @@ public String id() {
5658
return id;
5759
}
5860

61+
public String name() {
62+
return name;
63+
}
64+
5965
public Address address() {
6066
return address;
6167
}
@@ -86,7 +92,8 @@ public Collection<ServiceReference> serviceReferences() {
8692
@Override
8793
public String toString() {
8894
return new StringJoiner(", ", ServiceEndpoint.class.getSimpleName() + "[", "]")
89-
.add("id=" + id)
95+
.add("id='" + id + "'")
96+
.add("name='" + name + "'")
9097
.add("address=" + address)
9198
.add("contentTypes=" + contentTypes)
9299
.add("tags=" + tags)
@@ -99,6 +106,9 @@ public void writeExternal(ObjectOutput out) throws IOException {
99106
// id
100107
out.writeUTF(id);
101108

109+
// name
110+
out.writeUTF(name);
111+
102112
// address
103113
out.writeUTF(address.toString());
104114

@@ -127,6 +137,9 @@ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundExcept
127137
// id
128138
id = in.readUTF();
129139

140+
// name
141+
name = in.readUTF();
142+
130143
// address
131144
address = Address.from(in.readUTF());
132145

@@ -160,6 +173,7 @@ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundExcept
160173
public static class Builder {
161174

162175
private String id;
176+
private String name;
163177
private Address address = Address.NULL_ADDRESS;
164178
private Set<String> contentTypes = Collections.emptySet();
165179
private Map<String, String> tags = Collections.emptyMap();
@@ -169,6 +183,7 @@ private Builder() {}
169183

170184
private Builder(ServiceEndpoint other) {
171185
this.id = other.id;
186+
this.name = other.name;
172187
this.address = other.address;
173188
this.contentTypes = new HashSet<>(other.contentTypes);
174189
this.tags = new HashMap<>(other.tags);
@@ -180,6 +195,11 @@ public Builder id(String id) {
180195
return this;
181196
}
182197

198+
public Builder name(String name) {
199+
this.name = Objects.requireNonNull(name, "name");
200+
return this;
201+
}
202+
183203
public Builder address(Address address) {
184204
this.address = Objects.requireNonNull(address, "address");
185205
return this;

services-api/src/main/java/io/scalecube/services/ServiceReference.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
public class ServiceReference {
1919

2020
private final String endpointId;
21+
private final String endpointName;
2122
private final String namespace;
2223
private final String action;
2324
private final String qualifier;
@@ -41,6 +42,7 @@ public ServiceReference(
4142
ServiceRegistration serviceRegistration,
4243
ServiceEndpoint serviceEndpoint) {
4344
this.endpointId = serviceEndpoint.id();
45+
this.endpointName = serviceEndpoint.name();
4446
this.namespace = serviceRegistration.namespace();
4547
this.action = serviceMethodDefinition.action();
4648
this.qualifier = Qualifier.asString(namespace, action);
@@ -57,6 +59,10 @@ public String endpointId() {
5759
return endpointId;
5860
}
5961

62+
public String endpointName() {
63+
return endpointName;
64+
}
65+
6066
public String namespace() {
6167
return namespace;
6268
}
@@ -116,6 +122,7 @@ private static Map<String, String> mergeTags(
116122
public String toString() {
117123
return new StringJoiner(", ", ServiceReference.class.getSimpleName() + "[", "]")
118124
.add("endpointId='" + endpointId + "'")
125+
.add("endpointName='" + endpointName + "'")
119126
.add("namespace='" + namespace + "'")
120127
.add("action='" + action + "'")
121128
.add("qualifier='" + qualifier + "'")

services-api/src/main/java/io/scalecube/services/discovery/api/ServiceDiscoveryEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public boolean isEndpointRemoved() {
6363
public String toString() {
6464
return new StringJoiner(", ", ServiceDiscoveryEvent.class.getSimpleName() + "[", "]")
6565
.add("type=" + type)
66-
.add("ServiceEndpoint.id='" + serviceEndpoint.id() + "'")
66+
.add("serviceEndpoint=" + serviceEndpoint)
6767
.toString();
6868
}
6969
}

services-api/src/main/java/io/scalecube/services/methods/ServiceMethodInvoker.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,8 @@ private Mono<Principal> mapPrincipal(RequestContext context) {
243243
"Insufficient permissions for secured method ({}) -- "
244244
+ "request context ({}) does not have principal "
245245
+ "and principalMapper is also not set",
246-
context,
247-
methodInfo);
246+
methodInfo,
247+
context);
248248
}
249249
throw new ForbiddenException("Insufficient permissions");
250250
}

services-api/src/main/java/io/scalecube/services/routing/StaticAddressRouter.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ private StaticAddressRouter(Builder builder) {
3535
UUID.randomUUID().toString(), Collections.emptyMap(), Collections.emptyList()),
3636
ServiceEndpoint.builder()
3737
.id(UUID.randomUUID().toString())
38+
.name(builder.serviceName)
3839
.address(builder.address)
3940
.build());
4041
}
@@ -53,6 +54,7 @@ public static class Builder {
5354
private Address address;
5455
private boolean isSecured;
5556
private String serviceRole;
57+
private String serviceName;
5658

5759
private Builder() {}
5860

@@ -93,6 +95,18 @@ public Builder serviceRole(String serviceRole) {
9395
return this;
9496
}
9597

98+
/**
99+
* Setter for {@code serviceName} property, will be used in the invocation of {@link
100+
* CredentialsSupplier#credentials(String)}.
101+
*
102+
* @param serviceName serviceName
103+
* @return this
104+
*/
105+
public Builder serviceName(String serviceName) {
106+
this.serviceName = serviceName;
107+
return this;
108+
}
109+
96110
public StaticAddressRouter build() {
97111
return new StaticAddressRouter(this);
98112
}

services-discovery/src/test/java/io/scalecube/services/discovery/ScalecubeServiceDiscoveryTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public void testMetadataCodec(MetadataCodec metadataCodec) {
6767
ServiceEndpoint serviceEndpoint =
6868
ServiceEndpoint.builder()
6969
.id(UUID.randomUUID().toString())
70+
.name("app-service")
7071
.tags(Collections.singletonMap("K", "V"))
7172
.contentTypes(Collections.singleton("json"))
7273
.appendServiceRegistrations(
@@ -231,7 +232,10 @@ public void testEndpointIsRestarted(MetadataCodec metadataCodec) {
231232
}
232233

233234
public static ServiceEndpoint newServiceEndpoint() {
234-
return ServiceEndpoint.builder().id("" + ID_COUNTER.incrementAndGet()).build();
235+
return ServiceEndpoint.builder()
236+
.id("" + ID_COUNTER.incrementAndGet())
237+
.name("app-service")
238+
.build();
235239
}
236240

237241
private Mono<ServiceDiscovery> newServiceDiscovery(

services-security/src/main/java/io/scalecube/services/security/ServiceTokenCredentialsSupplier.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ public class ServiceTokenCredentialsSupplier implements CredentialsSupplier {
1414
private final String vaultAddress;
1515
private final Supplier<CompletableFuture<String>> vaultTokenSupplier;
1616

17+
/**
18+
* Constructor.
19+
*
20+
* @param environment logical environment name
21+
* @param vaultAddress vaultAddress
22+
* @param vaultTokenSupplier vaultTokenSupplier
23+
*/
1724
public ServiceTokenCredentialsSupplier(
1825
String environment,
1926
String vaultAddress,
@@ -23,6 +30,12 @@ public ServiceTokenCredentialsSupplier(
2330
this.vaultTokenSupplier = Objects.requireNonNull(vaultTokenSupplier, "vaultTokenSupplier");
2431
}
2532

33+
/**
34+
* TODO
35+
*
36+
* @param serviceRole serviceRole
37+
* @return credentials
38+
*/
2639
@Override
2740
public Mono<byte[]> credentials(String serviceRole) {
2841
return Mono.defer(

services-security/src/main/java/io/scalecube/services/security/VaultServiceRolesProcessor.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,42 @@
1515
public class VaultServiceRolesProcessor implements ServiceRolesProcessor {
1616

1717
private final String environment;
18+
private final String service;
1819
private final String vaultAddress;
1920
private final Supplier<CompletableFuture<String>> vaultTokenSupplier;
2021

22+
/**
23+
* Constructor.
24+
*
25+
* @param environment logical environment name
26+
* @param service logical service name
27+
* @param vaultAddress vaultAddress
28+
* @param vaultTokenSupplier vaultTokenSupplier
29+
*/
2130
public VaultServiceRolesProcessor(
2231
String environment,
32+
String service,
2333
String vaultAddress,
2434
Supplier<CompletableFuture<String>> vaultTokenSupplier) {
2535
this.environment = Objects.requireNonNull(environment, "environment");
36+
this.service = Objects.requireNonNull(service, "service");
2637
this.vaultAddress = Objects.requireNonNull(vaultAddress, "vaultAddress");
2738
this.vaultTokenSupplier = Objects.requireNonNull(vaultTokenSupplier, "vaultTokenSupplier");
2839
}
2940

41+
/**
42+
* TODO
43+
*
44+
* @param values collection of {@link ServiceRoleDefinition} objects
45+
*/
3046
@Override
3147
public void process(Collection<ServiceRoleDefinition> values) {
3248
VaultServiceRolesInstaller.builder()
3349
.vaultAddress(vaultAddress)
3450
.vaultTokenSupplier(vaultTokenSupplier)
3551
.serviceRolesSources(List.of(() -> toServiceRoles(values)))
36-
.keyNameSupplier(() -> environment + "." + "identity-key")
37-
.roleNameBuilder(role -> environment + "." + role)
52+
.keyNameSupplier(() -> String.join(".", environment, "identity-key"))
53+
.roleNameBuilder(role -> String.join(".", environment, service, role))
3854
.build()
3955
.install();
4056
}

services-security/src/test/java/io/scalecube/services/security/ServiceTokenTests.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ void shouldAuthenticateSuccessfully(SuccessArgs args, VaultEnvironment vaultEnvi
4343

4444
// Install service roles
4545

46-
new VaultServiceRolesProcessor(args.environment, vaultAddr, vaultTokenSupplier)
46+
new VaultServiceRolesProcessor(args.environment, args.service, vaultAddr, vaultTokenSupplier)
4747
.process(SERVICE_ROLES);
4848

4949
// Get service token
@@ -60,15 +60,15 @@ void shouldAuthenticateSuccessfully(SuccessArgs args, VaultEnvironment vaultEnvi
6060
}
6161

6262
private record SuccessArgs(
63-
String environment, String serviceRole, Set<String> expectedPermissions) {}
63+
String environment, String service, String serviceRole, Set<String> expectedPermissions) {}
6464

6565
private static Stream<?> shouldAuthenticateSuccessfullyMethodSource() {
6666
return Stream.of(
67-
new SuccessArgs("develop", "admin", Set.of("*")),
68-
new SuccessArgs("develop", "user", Set.of("read", "write")),
69-
new SuccessArgs("develop", "foo", Set.of("read", "write", "delete")),
70-
new SuccessArgs("master", "admin", Set.of("*")),
71-
new SuccessArgs("master", "user", Set.of("read", "write")),
72-
new SuccessArgs("master", "foo", Set.of("read", "write", "delete")));
67+
new SuccessArgs("develop", "app", "admin", Set.of("*")),
68+
new SuccessArgs("develop", "app", "user", Set.of("read", "write")),
69+
new SuccessArgs("develop", "app", "foo", Set.of("read", "write", "delete")),
70+
new SuccessArgs("master", "app", "admin", Set.of("*")),
71+
new SuccessArgs("master", "app", "user", Set.of("read", "write")),
72+
new SuccessArgs("master", "app", "foo", Set.of("read", "write", "delete")));
7373
}
7474
}

services-transport-parent/services-transport-rsocket/src/main/java/io/scalecube/services/transport/rsocket/RSocketClientTransport.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -75,25 +75,23 @@ public ClientChannel create(ServiceReference serviceReference) {
7575
}
7676

7777
private String selectServiceRole(ServiceReference serviceReference) {
78-
if (credentialsSupplier == null || !serviceReference.isSecured()) {
78+
if (credentialsSupplier == null
79+
|| !serviceReference.isSecured()
80+
|| !serviceReference.hasAllowedRoles()) {
7981
return null;
8082
}
8183

82-
if (serviceReference.hasAllowedRoles()) {
83-
if (allowedRoles == null || allowedRoles.isEmpty()) {
84-
return serviceReference.allowedRoles().get(0);
85-
}
84+
if (allowedRoles == null || allowedRoles.isEmpty()) {
85+
return serviceReference.allowedRoles().get(0);
86+
}
8687

87-
for (var allowedRole : allowedRoles) {
88-
if (serviceReference.allowedRoles().contains(allowedRole)) {
89-
return allowedRole;
90-
}
88+
for (var allowedRole : allowedRoles) {
89+
if (serviceReference.allowedRoles().contains(allowedRole)) {
90+
return allowedRole;
9191
}
92-
93-
throw new ForbiddenException("Insufficient permissions");
9492
}
9593

96-
return null;
94+
throw new ForbiddenException("Insufficient permissions");
9795
}
9896

9997
private Mono<RSocket> connect(
@@ -125,12 +123,12 @@ private Mono<RSocket> connect(
125123
}
126124

127125
private Mono<Payload> getCredentials(ServiceReference serviceReference, String serviceRole) {
128-
if (credentialsSupplier == null || !serviceReference.isSecured()) {
126+
if (credentialsSupplier == null || !serviceReference.isSecured() || serviceRole == null) {
129127
return Mono.just(EmptyPayload.INSTANCE);
130128
}
131129

132130
return credentialsSupplier
133-
.credentials(serviceRole)
131+
.credentials(serviceReference.endpointName() + "." + serviceRole)
134132
.map(data -> data.length != 0 ? DefaultPayload.create(data) : EmptyPayload.INSTANCE)
135133
.onErrorMap(
136134
th -> {

0 commit comments

Comments
 (0)