Skip to content

Commit

Permalink
feat(add-api-v1) Add new resources handling qualified id requests fro…
Browse files Browse the repository at this point in the history
…m the backend (#WPB-11299)

* Refactor resources and models in specific packages
* Add /api-version endpoint return version 0 and 1
* Add DeviceManagementService, shared service between resources, also abstracting database access from api layer
* Basic integration tests for the new api layer
  • Loading branch information
spoonman01 authored Oct 8, 2024
1 parent 00b299e commit 6f622c0
Show file tree
Hide file tree
Showing 43 changed files with 901 additions and 260 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
// along with this program. If not, see http://www.gnu.org/licenses/.
//

package com.wire.bots.hold.model;
package com.wire.bots.hold;

import com.fasterxml.jackson.annotation.JsonProperty;
import io.dropwizard.Configuration;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/wire/bots/hold/DAO/AccessDAO.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.wire.bots.hold.DAO;

import com.wire.bots.hold.model.LHAccess;
import com.wire.bots.hold.model.database.LHAccess;
import org.jdbi.v3.sqlobject.config.RegisterColumnMapper;
import org.jdbi.v3.sqlobject.customizer.Bind;
import org.jdbi.v3.sqlobject.statement.SqlQuery;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.wire.bots.hold.DAO;

import com.wire.bots.hold.model.LHAccess;
import com.wire.bots.hold.model.database.LHAccess;
import org.jdbi.v3.core.mapper.ColumnMapper;
import org.jdbi.v3.core.statement.StatementContext;

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/wire/bots/hold/DAO/EventsDAO.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.wire.bots.hold.DAO;

import com.wire.bots.hold.model.Event;
import com.wire.bots.hold.model.database.Event;
import org.jdbi.v3.core.mapper.ColumnMapper;
import org.jdbi.v3.core.statement.StatementContext;
import org.jdbi.v3.sqlobject.config.RegisterColumnMapper;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wire.bots.hold.model.Event;
import com.wire.bots.hold.model.database.Event;
import com.wire.xenon.tools.Logger;
import org.jdbi.v3.core.mapper.ColumnMapper;
import org.jdbi.v3.core.statement.StatementContext;
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/com/wire/bots/hold/FallbackDomainFetcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import com.wire.xenon.exceptions.HttpException;
import com.wire.xenon.tools.Logger;

import javax.ws.rs.ProcessingException;

public class FallbackDomainFetcher implements Runnable {

private final LoginClient loginClient;
Expand Down Expand Up @@ -47,12 +49,9 @@ public void run() {
metadataDAO.insert(MetadataDAO.FALLBACK_DOMAIN_KEY, apiVersionResponse.domain);
Cache.setFallbackDomain(apiVersionResponse.domain);
} else {
System.out.println("EEEEEEEE -> " + apiVersionResponse.domain);
if (metadata.value.equals(apiVersionResponse.domain)) {
System.out.println("EEEEEEEE -> p1");
Cache.setFallbackDomain(apiVersionResponse.domain);
} else {
System.out.println("EEEEEEEE -> p2");
String formattedExceptionMessage = String.format(
"Database already has a default domain as %s and instead we got %s from the Backend API.",
metadata.value,
Expand All @@ -63,6 +62,8 @@ public void run() {
}
} catch (HttpException exception) {
Logger.exception(exception, "FallbackDomainFetcher.run, exception: %s", exception.getMessage());
} catch (ProcessingException pexception) {
Logger.info("FallbackDomainFetcher.run, ignoring test exceptions");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wire.bots.hold.DAO.AccessDAO;
import com.wire.bots.hold.model.LHAccess;
import com.wire.bots.hold.model.database.LHAccess;
import com.wire.helium.API;
import com.wire.helium.LoginClient;
import com.wire.helium.models.Access;
Expand Down
68 changes: 45 additions & 23 deletions src/main/java/com/wire/bots/hold/Service.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,31 @@

import com.codahale.metrics.MetricRegistry;
import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
import com.wire.bots.cryptobox.CryptoException;
import com.wire.bots.hold.DAO.AccessDAO;
import com.wire.bots.hold.DAO.EventsDAO;
import com.wire.bots.hold.DAO.MetadataDAO;
import com.wire.bots.hold.filters.ServiceAuthenticationFilter;
import com.wire.bots.hold.healthchecks.SanityCheck;
import com.wire.bots.hold.model.Config;
import com.wire.bots.hold.monitoring.RequestMdcFactoryFilter;
import com.wire.bots.hold.monitoring.StatusResource;
import com.wire.bots.hold.resource.*;
import com.wire.bots.hold.resource.v0.audit.*;
import com.wire.bots.hold.resource.v0.backend.ConfirmResourceV0;
import com.wire.bots.hold.resource.v0.backend.InitiateResourceV0;
import com.wire.bots.hold.resource.v0.backend.RemoveResourceV0;
import com.wire.bots.hold.resource.v1.backend.ConfirmResourceV1;
import com.wire.bots.hold.resource.v1.backend.InitiateResourceV1;
import com.wire.bots.hold.resource.v1.backend.RemoveResourceV1;
import com.wire.bots.hold.service.DeviceManagementService;
import com.wire.bots.hold.utils.CryptoDatabaseFactory;
import com.wire.bots.hold.utils.HoldClientRepo;
import com.wire.bots.hold.utils.ImagesBundle;
import com.wire.helium.LoginClient;
import com.wire.xenon.Const;
import com.wire.xenon.backend.models.QualifiedId;
import com.wire.xenon.crypto.Crypto;
import com.wire.xenon.crypto.CryptoDatabase;
import com.wire.xenon.crypto.storage.JdbiStorage;
import com.wire.xenon.factories.CryptoFactory;
import io.dropwizard.Application;
import io.dropwizard.assets.AssetsBundle;
import io.dropwizard.client.JerseyClientBuilder;
Expand All @@ -55,6 +63,7 @@
import org.jdbi.v3.sqlobject.SqlObjectPlugin;

import javax.ws.rs.client.Client;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
Expand Down Expand Up @@ -107,20 +116,25 @@ public void run(Config config, Environment environment) throws ExecutionExceptio
final Client httpClient = createHttpClient(config, environment);
jdbi = buildJdbi(config.database, environment);

final CryptoFactory cf = getCryptoFactory(jdbi);
final CryptoDatabaseFactory cf = getCryptoFactory(jdbi);

final AccessDAO accessDAO = jdbi.onDemand(AccessDAO.class);
final EventsDAO eventsDAO = jdbi.onDemand(EventsDAO.class);
final MetadataDAO metadataDAO = jdbi.onDemand(MetadataDAO.class);

final DeviceManagementService deviceManagementService = new DeviceManagementService(accessDAO, cf);

// Monitoring resources
addResource(new StatusResource());
addResource(new RequestMdcFactoryFilter());

// Used by Wire Server
addResource(new InitiateResource(cf));
addResource(new ConfirmResource(accessDAO));
addResource(new RemoveResource(accessDAO, cf));
addResource(new InitiateResourceV0(deviceManagementService));
addResource(new InitiateResourceV1(deviceManagementService));
addResource(new ConfirmResourceV0(deviceManagementService));
addResource(new ConfirmResourceV1(deviceManagementService));
addResource(new RemoveResourceV0(deviceManagementService));
addResource(new RemoveResourceV1(deviceManagementService));

// Used by Audit
addResource(new AuthorizeResource());
Expand All @@ -131,22 +145,15 @@ public void run(Config config, Environment environment) throws ExecutionExceptio

addResource(ServiceAuthenticationFilter.ServiceAuthenticationFeature.class);

Runnable run = new Runnable() {
@Override
public void run(){
new FallbackDomainFetcher(
new LoginClient(httpClient),
metadataDAO
).run();
}
};

final Future<?> fallbackDomainFetcher = environment
.lifecycle()
.executorService("fallback_domain_fetcher")
.build()
.submit(
run
new FallbackDomainFetcher(
new LoginClient(httpClient),
metadataDAO
)
);

fallbackDomainFetcher.get();
Expand Down Expand Up @@ -206,10 +213,25 @@ protected void setupDatabase(Config.Database database) {
flyway.migrate();
}

public CryptoFactory getCryptoFactory(Jdbi jdbi) {
return (botId) -> new CryptoDatabase(
new QualifiedId(botId, null), // TODO(WPB-11287): Change null to default domain
new JdbiStorage(jdbi)
);
public CryptoDatabaseFactory getCryptoFactory(Jdbi jdbi) {
return new CryptoDatabaseFactory() {
@Override
public Crypto create(UUID botId) throws CryptoException {
// Note: the name botId is incorrect as in LegalHold we are creating crypto box based on users
// but in the Xenon library used by bots and LegalHold, this param was called botId
return new CryptoDatabase(
new QualifiedId(botId, null),
new JdbiStorage(jdbi)
);
}

@Override
public Crypto create(QualifiedId userId) throws CryptoException {
return new CryptoDatabase(
userId,
new JdbiStorage(jdbi)
);
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.codahale.metrics.health.HealthCheck;
import com.wire.bots.hold.DAO.AccessDAO;
import com.wire.bots.hold.model.LHAccess;
import com.wire.bots.hold.model.database.LHAccess;
import com.wire.bots.hold.utils.Cache;
import com.wire.helium.API;
import com.wire.xenon.backend.models.QualifiedId;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.wire.bots.hold.model.api.shared;

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;

public class ApiVersionResponse {
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private final List<Integer> supported;

public ApiVersionResponse(List<Integer> supported) {
this.supported = supported;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wire.bots.hold.model;
package com.wire.bots.hold.model.api.shared;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wire.bots.hold.model;
package com.wire.bots.hold.model.api.v0;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
Expand All @@ -7,7 +7,7 @@
import java.util.UUID;

@JsonIgnoreProperties(ignoreUnknown = true)
public class ConfirmPayload {
public class ConfirmPayloadV0 {
@JsonProperty("refresh_token")
@NotNull
public String refreshToken;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wire.bots.hold.model;
package com.wire.bots.hold.model.api.v0;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
Expand All @@ -7,7 +7,7 @@
import java.util.UUID;

@JsonIgnoreProperties(ignoreUnknown = true)
public class InitPayload {
public class InitPayloadV0 {
@JsonProperty("user_id")
@NotNull
public UUID userId;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.wire.bots.hold.model.api.v1;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.wire.xenon.backend.models.QualifiedId;

import javax.validation.constraints.NotNull;
import java.util.UUID;

@JsonIgnoreProperties(ignoreUnknown = true)
public class ConfirmPayloadV1 {
@JsonProperty("refresh_token")
@NotNull
public String refreshToken;

@JsonProperty("client_id")
@NotNull
public String clientId;

@JsonProperty("qualified_user_id")
@NotNull
public QualifiedId userId;

@JsonProperty("team_id")
@NotNull
public UUID teamId;
}
19 changes: 19 additions & 0 deletions src/main/java/com/wire/bots/hold/model/api/v1/InitPayloadV1.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.wire.bots.hold.model.api.v1;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.wire.xenon.backend.models.QualifiedId;

import javax.validation.constraints.NotNull;
import java.util.UUID;

@JsonIgnoreProperties(ignoreUnknown = true)
public class InitPayloadV1 {
@JsonProperty("qualified_user_id")
@NotNull
public QualifiedId userId;

@JsonProperty("team_id")
@NotNull
public UUID teamId;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wire.bots.hold.model;
package com.wire.bots.hold.model.database;

import java.util.UUID;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.wire.bots.hold.model;
package com.wire.bots.hold.model.database;

import java.util.UUID;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.wire.bots.hold.model.dto;

import com.wire.xenon.models.otr.PreKey;

import java.util.ArrayList;

public class InitializedDeviceDTO {
private final ArrayList<PreKey> preKeys;
private final PreKey lastPreKey;
private final String fingerprint;

public InitializedDeviceDTO(ArrayList<PreKey> preKeys, PreKey lastPreKey, String fingerprint) {
this.preKeys = preKeys;
this.lastPreKey = lastPreKey;
this.fingerprint = fingerprint;
}

public ArrayList<PreKey> getPreKeys() {
return preKeys;
}

public PreKey getLastPreKey() {
return lastPreKey;
}

public String getFingerprint() {
return fingerprint;
}
}
Loading

0 comments on commit 6f622c0

Please sign in to comment.