Stephan Richter
2 months ago
3 changed files with 130 additions and 3 deletions
@ -0,0 +1,64 @@
@@ -0,0 +1,64 @@
|
||||
/* © SRSoftware 2024 */ |
||||
package de.srsoftware.oidc.datastore.encrypted; |
||||
|
||||
import static java.util.Optional.empty; |
||||
|
||||
import de.srsoftware.oidc.api.ClientService; |
||||
import de.srsoftware.oidc.api.data.Client; |
||||
import java.util.List; |
||||
import java.util.Optional; |
||||
import java.util.stream.Collectors; |
||||
|
||||
public class EncryptedClientService extends EncryptedConfig implements ClientService { |
||||
private final ClientService backend; |
||||
|
||||
public EncryptedClientService(String key, String salt, ClientService backend) { |
||||
super(key, salt); |
||||
this.backend = backend; |
||||
} |
||||
|
||||
public Client decrypt(Client client) { |
||||
var decryptedUrls = client.redirectUris().stream().map(this::decrypt).collect(Collectors.toSet()); |
||||
return new Client(decrypt(client.id()), decrypt(client.name()), decrypt(client.secret()), decryptedUrls).landingPage(decrypt(client.landingPage())); |
||||
} |
||||
|
||||
public Client encrypt(Client client) { |
||||
var encryptedUrls = client.redirectUris().stream().map(this::encrypt).collect(Collectors.toSet()); |
||||
return new Client(encrypt(client.id()), encrypt(client.name()), encrypt(client.secret()), encryptedUrls).landingPage(encrypt(client.landingPage())); |
||||
} |
||||
|
||||
@Override |
||||
public Optional<Client> getClient(String clientId) { |
||||
if (clientId == null || clientId.isBlank()) return empty(); |
||||
for (var encrypted : backend.listClients()) { |
||||
var decrypted = decrypt(encrypted); |
||||
if (decrypted.id().equals(clientId)) return Optional.of(decrypted); |
||||
} |
||||
return empty(); |
||||
} |
||||
|
||||
@Override |
||||
public List<Client> listClients() { |
||||
return backend.listClients().stream().map(this::decrypt).toList(); |
||||
} |
||||
|
||||
@Override |
||||
public ClientService remove(String clientId) { |
||||
if (clientId == null || clientId.isBlank()) return this; |
||||
for (var encrypted : backend.listClients()) { |
||||
var decrypted = decrypt(encrypted); |
||||
if (decrypted.id().equals(clientId)) { |
||||
backend.remove(encrypted.id()); |
||||
break; |
||||
} |
||||
} |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public ClientService save(Client client) { |
||||
remove(client.id()); |
||||
backend.save(encrypt(client)); |
||||
return this; |
||||
} |
||||
} |
@ -0,0 +1,55 @@
@@ -0,0 +1,55 @@
|
||||
/* © SRSoftware 2024 */ |
||||
import static de.srsoftware.utils.Optionals.nullable; |
||||
import static de.srsoftware.utils.Strings.uuid; |
||||
|
||||
import de.srsoftware.oidc.api.ClientService; |
||||
import de.srsoftware.oidc.api.ClientServiceTest; |
||||
import de.srsoftware.oidc.api.data.Client; |
||||
import de.srsoftware.oidc.datastore.encrypted.EncryptedClientService; |
||||
import java.sql.SQLException; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Optional; |
||||
import org.junit.jupiter.api.BeforeEach; |
||||
|
||||
public class EncryptedClientServiceTest extends ClientServiceTest { |
||||
private static class InMemoryClientService implements ClientService { |
||||
private HashMap<String, Client> clients = new HashMap<>(); |
||||
|
||||
@Override |
||||
public Optional<Client> getClient(String clientId) { |
||||
return nullable(clients.get(clientId)); |
||||
} |
||||
|
||||
@Override |
||||
public List<Client> listClients() { |
||||
return List.copyOf(clients.values()); |
||||
} |
||||
|
||||
@Override |
||||
public ClientService remove(String clientId) { |
||||
clients.remove(clientId); |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public ClientService save(Client client) { |
||||
clients.put(client.id(), client); |
||||
return this; |
||||
} |
||||
} |
||||
private ClientService clientService; |
||||
|
||||
@Override |
||||
protected ClientService clientService() { |
||||
return clientService; |
||||
} |
||||
|
||||
@BeforeEach |
||||
public void setup() throws SQLException { |
||||
var secret = uuid(); |
||||
var salt = uuid(); |
||||
var backend = new InMemoryClientService(); |
||||
clientService = new EncryptedClientService(secret, salt, backend); |
||||
} |
||||
} |
Loading…
Reference in new issue