Skip to content

Commit f56e900

Browse files
authored
Enhance auth interfaces (#850)
* Added CredentialsCodec * Disabled unstable - test_remote_node_died_mono_never * Moved CredentialsSupplier to ServiceTransport
1 parent 0573b39 commit f56e900

File tree

9 files changed

+113
-19
lines changed

9 files changed

+113
-19
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package io.scalecube.services.auth;
2+
3+
import java.io.ByteArrayInputStream;
4+
import java.io.ByteArrayOutputStream;
5+
import java.io.InputStream;
6+
import java.io.ObjectInputStream;
7+
import java.io.ObjectOutputStream;
8+
import java.io.OutputStream;
9+
import java.util.Collections;
10+
import java.util.HashMap;
11+
import java.util.Map;
12+
import java.util.Map.Entry;
13+
import java.util.Objects;
14+
import reactor.core.Exceptions;
15+
16+
public class CredentialsCodec {
17+
18+
private CredentialsCodec() {
19+
// Do not instantiate
20+
}
21+
22+
/**
23+
* Encodes the given credentials to the given stream.
24+
*
25+
* @param stream stream
26+
* @param credentials credentials
27+
*/
28+
public static void encode(OutputStream stream, Map<String, String> credentials) {
29+
if (credentials == null) {
30+
return;
31+
}
32+
Objects.requireNonNull(stream, "output stream");
33+
try (ObjectOutputStream out = new ObjectOutputStream(stream)) {
34+
// credentials
35+
out.writeInt(credentials.size());
36+
for (Entry<String, String> entry : credentials.entrySet()) {
37+
out.writeUTF(entry.getKey());
38+
out.writeObject(entry.getValue()); // value is nullable
39+
}
40+
41+
out.flush();
42+
} catch (Throwable th) {
43+
throw Exceptions.propagate(th);
44+
}
45+
}
46+
47+
/**
48+
* Encodes the given credentials to a byte array.
49+
*
50+
* @param credentials credentials
51+
* @return byte array representation of credentials
52+
*/
53+
public static byte[] toByteArray(Map<String, String> credentials) {
54+
if (credentials == null || credentials.isEmpty()) {
55+
return new byte[0];
56+
}
57+
ByteArrayOutputStream output = new ByteArrayOutputStream();
58+
encode(output, credentials);
59+
return output.toByteArray();
60+
}
61+
62+
/**
63+
* Decodes the given stream to credentials as {@code Map<String, String>}.
64+
*
65+
* @return credentials
66+
*/
67+
public static Map<String, String> decode(InputStream stream) {
68+
Objects.requireNonNull(stream, "input stream");
69+
try (ObjectInputStream in = new ObjectInputStream(stream)) {
70+
// credentials
71+
int credentialsSize = in.readInt();
72+
Map<String, String> credentials = new HashMap<>(credentialsSize);
73+
for (int i = 0; i < credentialsSize; i++) {
74+
String key = in.readUTF();
75+
String value = (String) in.readObject(); // value is nullable
76+
credentials.put(key, value);
77+
}
78+
return Collections.unmodifiableMap(credentials);
79+
} catch (Throwable th) {
80+
throw Exceptions.propagate(th);
81+
}
82+
}
83+
84+
/**
85+
* Decodes the given byte array to credentials as {@code Map<String, String>}.
86+
*
87+
* @return credentials
88+
*/
89+
public static Map<String, String> decode(byte[] bytes) {
90+
if (bytes == null || bytes.length == 0) {
91+
return Collections.emptyMap();
92+
}
93+
ByteArrayInputStream input = new ByteArrayInputStream(bytes);
94+
return decode(input);
95+
}
96+
}

services-api/src/main/java/io/scalecube/services/auth/CredentialsSupplier.java

Lines changed: 0 additions & 14 deletions
This file was deleted.

services-api/src/main/java/io/scalecube/services/transport/api/ServiceTransport.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package io.scalecube.services.transport.api;
22

3+
import io.scalecube.services.ServiceReference;
34
import io.scalecube.services.registry.api.ServiceRegistry;
5+
import java.util.Map;
6+
import java.util.function.Function;
7+
import reactor.core.publisher.Mono;
48

59
public interface ServiceTransport {
610

@@ -28,4 +32,11 @@ public interface ServiceTransport {
2832

2933
/** Shutdowns transport and release occupied resources. */
3034
void stop();
35+
36+
/**
37+
* Returns credentials for the given {@link ServiceReference}. Credentials are being returned in
38+
* most generic form which is {@code Map<String, String>}.
39+
*/
40+
@FunctionalInterface
41+
interface CredentialsSupplier extends Function<ServiceReference, Mono<Map<String, String>>> {}
3142
}

services-examples/src/main/java/io/scalecube/services/examples/auth/CompositeProfileAuthExample.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
import io.scalecube.services.ServiceInfo;
88
import io.scalecube.services.api.ServiceMessage;
99
import io.scalecube.services.auth.Authenticator;
10-
import io.scalecube.services.auth.CredentialsSupplier;
1110
import io.scalecube.services.discovery.ScalecubeServiceDiscovery;
1211
import io.scalecube.services.exceptions.UnauthorizedException;
12+
import io.scalecube.services.transport.api.ServiceTransport.CredentialsSupplier;
1313
import io.scalecube.services.transport.rsocket.RSocketServiceTransport;
1414
import io.scalecube.transport.netty.websocket.WebsocketTransportFactory;
1515
import java.time.Duration;

services-examples/src/main/java/io/scalecube/services/examples/auth/PrincipalMapperAuthExample.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import io.scalecube.services.ServiceEndpoint;
55
import io.scalecube.services.ServiceInfo;
66
import io.scalecube.services.auth.Authenticator;
7-
import io.scalecube.services.auth.CredentialsSupplier;
87
import io.scalecube.services.discovery.ScalecubeServiceDiscovery;
98
import io.scalecube.services.exceptions.UnauthorizedException;
9+
import io.scalecube.services.transport.api.ServiceTransport.CredentialsSupplier;
1010
import io.scalecube.services.transport.rsocket.RSocketServiceTransport;
1111
import io.scalecube.transport.netty.websocket.WebsocketTransportFactory;
1212
import java.time.Duration;

services-examples/src/main/java/io/scalecube/services/examples/auth/ServiceTransportAuthExample.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import io.scalecube.services.Microservices;
44
import io.scalecube.services.ServiceEndpoint;
55
import io.scalecube.services.auth.Authenticator;
6-
import io.scalecube.services.auth.CredentialsSupplier;
76
import io.scalecube.services.discovery.ScalecubeServiceDiscovery;
87
import io.scalecube.services.exceptions.UnauthorizedException;
8+
import io.scalecube.services.transport.api.ServiceTransport.CredentialsSupplier;
99
import io.scalecube.services.transport.rsocket.RSocketServiceTransport;
1010
import io.scalecube.transport.netty.websocket.WebsocketTransportFactory;
1111
import java.time.Duration;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@
1010
import io.rsocket.util.ByteBufPayload;
1111
import io.scalecube.services.Address;
1212
import io.scalecube.services.ServiceReference;
13-
import io.scalecube.services.auth.CredentialsSupplier;
1413
import io.scalecube.services.exceptions.MessageCodecException;
1514
import io.scalecube.services.exceptions.ServiceException;
1615
import io.scalecube.services.exceptions.UnauthorizedException;
1716
import io.scalecube.services.transport.api.ClientChannel;
1817
import io.scalecube.services.transport.api.ClientTransport;
1918
import io.scalecube.services.transport.api.DataCodec;
2019
import io.scalecube.services.transport.api.HeadersCodec;
20+
import io.scalecube.services.transport.api.ServiceTransport.CredentialsSupplier;
2121
import java.util.Collection;
2222
import java.util.Collections;
2323
import java.util.Map;

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import io.netty.util.concurrent.DefaultThreadFactory;
88
import io.netty.util.concurrent.Future;
99
import io.scalecube.services.auth.Authenticator;
10-
import io.scalecube.services.auth.CredentialsSupplier;
1110
import io.scalecube.services.exceptions.ConnectionClosedException;
1211
import io.scalecube.services.registry.api.ServiceRegistry;
1312
import io.scalecube.services.transport.api.ClientTransport;

services/src/test/java/io/scalecube/services/transport/rsocket/RSocketServiceTransportTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.concurrent.atomic.AtomicReference;
2323
import org.junit.jupiter.api.AfterEach;
2424
import org.junit.jupiter.api.BeforeEach;
25+
import org.junit.jupiter.api.Disabled;
2526
import org.junit.jupiter.api.Test;
2627
import reactor.core.Disposable;
2728
import reactor.core.publisher.Mono;
@@ -78,6 +79,7 @@ public void cleanUp() {
7879
}
7980
}
8081

82+
@Disabled
8183
@Test
8284
public void test_remote_node_died_mono_never() throws Exception {
8385
int batchSize = 1;

0 commit comments

Comments
 (0)