Add receipt redemption API to chat server

This commit is contained in:
Ehren Kret
2021-10-01 12:44:47 -05:00
committed by GitHub
parent ba58a95a0f
commit 3032415141
24 changed files with 708 additions and 143 deletions

View File

@@ -15,6 +15,26 @@ import java.util.UUID;
/** AwsAV provides static helper methods for working with AWS AttributeValues. */
public class AttributeValues {
// Clear-type methods
public static AttributeValue b(byte[] value) {
return AttributeValue.builder().b(SdkBytes.fromByteArray(value)).build();
}
public static AttributeValue b(ByteBuffer value) {
return AttributeValue.builder().b(SdkBytes.fromByteBuffer(value)).build();
}
public static AttributeValue b(UUID value) {
return b(UUIDUtil.toByteBuffer(value));
}
public static AttributeValue n(long value) {
return AttributeValue.builder().n(String.valueOf(value)).build();
}
// More opinionated methods
public static AttributeValue fromString(String value) {
return AttributeValue.builder().s(value).build();
}

View File

@@ -2,22 +2,21 @@ package org.whispersystems.textsecuregcm.util;
import org.whispersystems.textsecuregcm.configuration.DynamoDbConfiguration;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.core.client.config.ClientAsyncConfiguration;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.core.client.config.SdkAdvancedAsyncClientOption;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClientBuilder;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import java.util.concurrent.Executor;
public class DynamoDbFromConfig {
private static ClientOverrideConfiguration clientOverrideConfiguration(DynamoDbConfiguration config) {
return ClientOverrideConfiguration.builder()
.apiCallTimeout(config.getClientExecutionTimeout())
.apiCallAttemptTimeout(config.getClientRequestTimeout())
.build();
}
public static DynamoDbClient client(DynamoDbConfiguration config, AwsCredentialsProvider credentialsProvider) {
return DynamoDbClient.builder()
.region(Region.of(config.getRegion()))
@@ -25,17 +24,13 @@ public class DynamoDbFromConfig {
.overrideConfiguration(clientOverrideConfiguration(config))
.build();
}
public static DynamoDbAsyncClient asyncClient(DynamoDbConfiguration config, AwsCredentialsProvider credentialsProvider, Executor executor) {
public static DynamoDbAsyncClient asyncClient(
DynamoDbConfiguration config, AwsCredentialsProvider credentialsProvider) {
DynamoDbAsyncClientBuilder builder = DynamoDbAsyncClient.builder()
.region(Region.of(config.getRegion()))
.credentialsProvider(credentialsProvider)
.overrideConfiguration(clientOverrideConfiguration(config));
if (executor != null) {
builder.asyncConfiguration(ClientAsyncConfiguration.builder()
.advancedOption(SdkAdvancedAsyncClientOption.FUTURE_COMPLETION_EXECUTOR,
executor)
.build());
}
return builder.build();
}
}

View File

@@ -5,19 +5,24 @@
package org.whispersystems.textsecuregcm.util;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({ FIELD, METHOD, PARAMETER, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = ExactlySizeValidator.class)
@Constraint(validatedBy = {
ExactlySizeValidatorForString.class,
ExactlySizeValidatorForArraysOfByte.class,
})
@Documented
public @interface ExactlySize {

View File

@@ -1,34 +1,29 @@
/*
* Copyright 2013-2020 Signal Messenger, LLC
* Copyright 2021 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.textsecuregcm.util;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public abstract class ExactlySizeValidator<T> implements ConstraintValidator<ExactlySize, T> {
public class ExactlySizeValidator implements ConstraintValidator<ExactlySize, String> {
private int[] permittedSizes;
private Set<Integer> permittedSizes;
@Override
public void initialize(ExactlySize exactlySize) {
this.permittedSizes = exactlySize.value();
public void initialize(ExactlySize annotation) {
permittedSizes = Arrays.stream(annotation.value()).boxed().collect(Collectors.toSet());
}
@Override
public boolean isValid(String object, ConstraintValidatorContext constraintContext) {
int objectLength;
if (object == null) objectLength = 0;
else objectLength = object.length();
for (int permittedSize : permittedSizes) {
if (permittedSize == objectLength) return true;
}
return false;
public boolean isValid(T value, ConstraintValidatorContext context) {
return permittedSizes.contains(size(value));
}
protected abstract int size(T value);
}

View File

@@ -0,0 +1,14 @@
/*
* Copyright 2021 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.textsecuregcm.util;
public class ExactlySizeValidatorForArraysOfByte extends ExactlySizeValidator<byte[]> {
@Override
protected int size(final byte[] value) {
return value == null ? 0 : value.length;
}
}

View File

@@ -0,0 +1,15 @@
/*
* Copyright 2013-2020 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.textsecuregcm.util;
public class ExactlySizeValidatorForString extends ExactlySizeValidator<String> {
@Override
protected int size(final String value) {
return value == null ? 0 : value.length();
}
}