Showing preview only (7,835K chars total). Download the full file or copy to clipboard to get everything.
Repository: signalapp/Signal-Server
Branch: main
Commit: 5c3a82c25723
Files: 1245
Total size: 7.2 MB
Directory structure:
gitextract_qyyfx0yg/
├── .editorconfig
├── .github/
│ ├── FUNDING.yml
│ ├── dependabot.yml
│ ├── stale.yml
│ └── workflows/
│ ├── documentation.yml
│ ├── integration-tests.yml
│ └── test.yml
├── .gitignore
├── .gitmodules
├── .java-version
├── .mvn/
│ ├── extensions.xml
│ ├── jgitver.config.xml
│ └── wrapper/
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── LICENSE
├── README.md
├── TESTING.md
├── api-doc/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── org/
│ │ └── signal/
│ │ └── openapi/
│ │ ├── OpenApiExtension.java
│ │ └── OpenApiReader.java
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ └── io.swagger.v3.jaxrs2.ext.OpenAPIExtension
│ └── openapi/
│ └── openapi-configuration.yaml
├── integration-tests/
│ ├── .gitignore
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── org/
│ │ └── signal/
│ │ └── integration/
│ │ ├── Codecs.java
│ │ ├── IntegrationTools.java
│ │ ├── Operations.java
│ │ ├── TestDevice.java
│ │ ├── TestUser.java
│ │ └── config/
│ │ ├── Config.java
│ │ └── DynamoDbTables.java
│ └── test/
│ └── java/
│ └── org/
│ └── signal/
│ └── integration/
│ ├── AccountTest.java
│ ├── MessagingTest.java
│ └── RegistrationTest.java
├── mvnw
├── mvnw.cmd
├── pom.xml
├── service/
│ ├── assembly.xml
│ ├── config/
│ │ ├── sample-secrets-bundle.yml
│ │ └── sample.yml
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── graphql/
│ │ │ └── braintree/
│ │ │ ├── ChargePayPalOneTimePayment.graphql
│ │ │ ├── CreatePayPalBillingAgreement.graphql
│ │ │ ├── CreatePayPalOneTimePayment.graphql
│ │ │ ├── TokenizePayPalBillingAgreement.graphql
│ │ │ ├── TokenizePayPalOneTimePayment.graphql
│ │ │ ├── VaultPaymentMethod.graphql
│ │ │ └── schema.json
│ │ ├── java/
│ │ │ └── org/
│ │ │ ├── signal/
│ │ │ │ └── i18n/
│ │ │ │ ├── HeaderControlledResourceBundleLookup.java
│ │ │ │ └── ResourceBundleFactory.java
│ │ │ └── whispersystems/
│ │ │ └── textsecuregcm/
│ │ │ ├── WhisperServerConfiguration.java
│ │ │ ├── WhisperServerService.java
│ │ │ ├── asn/
│ │ │ │ ├── AsnInfo.java
│ │ │ │ ├── AsnInfoProvider.java
│ │ │ │ ├── AsnInfoProviderImpl.java
│ │ │ │ └── AsnRange.java
│ │ │ ├── attachments/
│ │ │ │ ├── AttachmentGenerator.java
│ │ │ │ ├── AttachmentUtil.java
│ │ │ │ ├── GcsAttachmentGenerator.java
│ │ │ │ ├── TusAttachmentGenerator.java
│ │ │ │ └── TusConfiguration.java
│ │ │ ├── auth/
│ │ │ │ ├── AccountAuthenticator.java
│ │ │ │ ├── Anonymous.java
│ │ │ │ ├── AuthenticatedBackupUser.java
│ │ │ │ ├── AuthenticatedDevice.java
│ │ │ │ ├── BasicAuthorizationHeader.java
│ │ │ │ ├── CertificateGenerator.java
│ │ │ │ ├── ChangesLinkedDevices.java
│ │ │ │ ├── ChangesPhoneNumber.java
│ │ │ │ ├── CloudflareTurnCredentialsManager.java
│ │ │ │ ├── CombinedUnidentifiedSenderAccessKeys.java
│ │ │ │ ├── DisconnectionRequestListener.java
│ │ │ │ ├── DisconnectionRequestManager.java
│ │ │ │ ├── ExternalServiceCredentials.java
│ │ │ │ ├── ExternalServiceCredentialsGenerator.java
│ │ │ │ ├── ExternalServiceCredentialsSelector.java
│ │ │ │ ├── GroupSendTokenHeader.java
│ │ │ │ ├── IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilter.java
│ │ │ │ ├── InvalidAuthorizationHeaderException.java
│ │ │ │ ├── OptionalAccess.java
│ │ │ │ ├── PhoneVerificationTokenManager.java
│ │ │ │ ├── RedemptionRange.java
│ │ │ │ ├── RegistrationLockVerificationManager.java
│ │ │ │ ├── SaltedTokenHash.java
│ │ │ │ ├── StoredRegistrationLock.java
│ │ │ │ ├── TurnToken.java
│ │ │ │ ├── UnidentifiedAccessChecksum.java
│ │ │ │ ├── UnidentifiedAccessUtil.java
│ │ │ │ └── grpc/
│ │ │ │ ├── AuthenticatedDevice.java
│ │ │ │ ├── AuthenticationUtil.java
│ │ │ │ ├── ProhibitAuthenticationInterceptor.java
│ │ │ │ └── RequireAuthenticationInterceptor.java
│ │ │ ├── backup/
│ │ │ │ ├── BackupAuthManager.java
│ │ │ │ ├── BackupBadReceiptException.java
│ │ │ │ ├── BackupException.java
│ │ │ │ ├── BackupFailedZkAuthenticationException.java
│ │ │ │ ├── BackupInvalidArgumentException.java
│ │ │ │ ├── BackupLevelUtil.java
│ │ │ │ ├── BackupManager.java
│ │ │ │ ├── BackupMissingIdCommitmentException.java
│ │ │ │ ├── BackupNotFoundException.java
│ │ │ │ ├── BackupPermissionException.java
│ │ │ │ ├── BackupPublicKeyConflictException.java
│ │ │ │ ├── BackupUploadDescriptor.java
│ │ │ │ ├── BackupWrongCredentialTypeException.java
│ │ │ │ ├── BackupsDb.java
│ │ │ │ ├── Cdn3BackupCredentialGenerator.java
│ │ │ │ ├── Cdn3RemoteStorageManager.java
│ │ │ │ ├── CopyParameters.java
│ │ │ │ ├── CopyResult.java
│ │ │ │ ├── ExpiredBackup.java
│ │ │ │ ├── InvalidLengthException.java
│ │ │ │ ├── MediaEncryptionParameters.java
│ │ │ │ ├── RemoteStorageManager.java
│ │ │ │ ├── SecureValueRecoveryBCredentialsGeneratorFactory.java
│ │ │ │ ├── SourceObjectNotFoundException.java
│ │ │ │ ├── StoredBackupAttributes.java
│ │ │ │ └── UsageInfo.java
│ │ │ ├── badges/
│ │ │ │ ├── BadgeTranslator.java
│ │ │ │ ├── ConfiguredProfileBadgeConverter.java
│ │ │ │ ├── LevelTranslator.java
│ │ │ │ └── ProfileBadgeConverter.java
│ │ │ ├── captcha/
│ │ │ │ ├── Action.java
│ │ │ │ ├── AssessmentResult.java
│ │ │ │ ├── CaptchaChecker.java
│ │ │ │ ├── CaptchaClient.java
│ │ │ │ ├── RegistrationCaptchaManager.java
│ │ │ │ └── ShortCodeExpander.java
│ │ │ ├── configuration/
│ │ │ │ ├── AccountsTableConfiguration.java
│ │ │ │ ├── ApnConfiguration.java
│ │ │ │ ├── AppleAppStoreConfiguration.java
│ │ │ │ ├── AppleDeviceCheckConfiguration.java
│ │ │ │ ├── AwsCredentialsProviderFactory.java
│ │ │ │ ├── BadgeConfiguration.java
│ │ │ │ ├── BadgesConfiguration.java
│ │ │ │ ├── BraintreeConfiguration.java
│ │ │ │ ├── CallQualitySurveyConfiguration.java
│ │ │ │ ├── Cdn3StorageManagerConfiguration.java
│ │ │ │ ├── CdnConfiguration.java
│ │ │ │ ├── CircuitBreakerConfiguration.java
│ │ │ │ ├── ClientReleaseConfiguration.java
│ │ │ │ ├── CloudflareTurnConfiguration.java
│ │ │ │ ├── DefaultAwsCredentialsFactory.java
│ │ │ │ ├── DefaultPubSubPublisherFactory.java
│ │ │ │ ├── DeviceCheckConfiguration.java
│ │ │ │ ├── DirectoryV2ClientConfiguration.java
│ │ │ │ ├── DirectoryV2Configuration.java
│ │ │ │ ├── DynamoDbClientConfiguration.java
│ │ │ │ ├── DynamoDbClientFactory.java
│ │ │ │ ├── DynamoDbTables.java
│ │ │ │ ├── ExternalRequestFilterConfiguration.java
│ │ │ │ ├── FaultTolerantRedisClientFactory.java
│ │ │ │ ├── FaultTolerantRedisClusterFactory.java
│ │ │ │ ├── FcmConfiguration.java
│ │ │ │ ├── GcpAttachmentsConfiguration.java
│ │ │ │ ├── GenericZkConfig.java
│ │ │ │ ├── GooglePlayBillingConfiguration.java
│ │ │ │ ├── GrpcConfiguration.java
│ │ │ │ ├── HlrLookupConfiguration.java
│ │ │ │ ├── IdlePrimaryDeviceReminderConfiguration.java
│ │ │ │ ├── IssuedReceiptsTableConfiguration.java
│ │ │ │ ├── KeyTransparencyServiceConfiguration.java
│ │ │ │ ├── LinkDeviceSecretConfiguration.java
│ │ │ │ ├── MaxDeviceConfiguration.java
│ │ │ │ ├── MessageByteLimitCardinalityEstimatorConfiguration.java
│ │ │ │ ├── MessageCacheConfiguration.java
│ │ │ │ ├── MonitoredS3ObjectConfiguration.java
│ │ │ │ ├── OneTimeDonationConfiguration.java
│ │ │ │ ├── OneTimeDonationCurrencyConfiguration.java
│ │ │ │ ├── OpenTelemetryConfiguration.java
│ │ │ │ ├── PagedSingleUseKEMPreKeyStoreConfiguration.java
│ │ │ │ ├── PaymentsServiceClientsConfiguration.java
│ │ │ │ ├── PaymentsServiceClientsFactory.java
│ │ │ │ ├── PaymentsServiceConfiguration.java
│ │ │ │ ├── PubSubPublisherFactory.java
│ │ │ │ ├── RedisClusterConfiguration.java
│ │ │ │ ├── RedisConfiguration.java
│ │ │ │ ├── RegistrationServiceClientFactory.java
│ │ │ │ ├── RegistrationServiceConfiguration.java
│ │ │ │ ├── RemoteConfigConfiguration.java
│ │ │ │ ├── ReportMessageConfiguration.java
│ │ │ │ ├── RetryConfiguration.java
│ │ │ │ ├── S3ObjectMonitorFactory.java
│ │ │ │ ├── SecureStorageServiceConfiguration.java
│ │ │ │ ├── SecureValueRecoveryConfiguration.java
│ │ │ │ ├── ShortCodeExpanderConfiguration.java
│ │ │ │ ├── SpamFilterConfiguration.java
│ │ │ │ ├── StaticAwsCredentialsFactory.java
│ │ │ │ ├── StripeConfiguration.java
│ │ │ │ ├── SubscriptionConfiguration.java
│ │ │ │ ├── SubscriptionLevelConfiguration.java
│ │ │ │ ├── SubscriptionPriceConfiguration.java
│ │ │ │ ├── TlsKeyStoreConfiguration.java
│ │ │ │ ├── TurnConfiguration.java
│ │ │ │ ├── TurnUriConfiguration.java
│ │ │ │ ├── URLSerializationConverter.java
│ │ │ │ ├── UnidentifiedDeliveryConfiguration.java
│ │ │ │ ├── VirtualThreadConfiguration.java
│ │ │ │ ├── ZkConfig.java
│ │ │ │ ├── dynamic/
│ │ │ │ │ ├── DynamicBackupConfiguration.java
│ │ │ │ │ ├── DynamicCaptchaConfiguration.java
│ │ │ │ │ ├── DynamicCarrierDataLookupConfiguration.java
│ │ │ │ │ ├── DynamicConfiguration.java
│ │ │ │ │ ├── DynamicE164ExperimentEnrollmentConfiguration.java
│ │ │ │ │ ├── DynamicExperimentEnrollmentConfiguration.java
│ │ │ │ │ ├── DynamicGrpcAllowListConfiguration.java
│ │ │ │ │ ├── DynamicMessagePersisterConfiguration.java
│ │ │ │ │ ├── DynamicMetricsConfiguration.java
│ │ │ │ │ ├── DynamicPaymentsConfiguration.java
│ │ │ │ │ ├── DynamicRegistrationConfiguration.java
│ │ │ │ │ ├── DynamicRemoteDeprecationConfiguration.java
│ │ │ │ │ └── DynamicRestDeprecationConfiguration.java
│ │ │ │ └── secrets/
│ │ │ │ ├── BaseSecretValidator.java
│ │ │ │ ├── Secret.java
│ │ │ │ ├── SecretBytes.java
│ │ │ │ ├── SecretBytesList.java
│ │ │ │ ├── SecretStore.java
│ │ │ │ ├── SecretString.java
│ │ │ │ ├── SecretStringList.java
│ │ │ │ └── SecretsModule.java
│ │ │ ├── controllers/
│ │ │ │ ├── AccountController.java
│ │ │ │ ├── AccountControllerV2.java
│ │ │ │ ├── AccountIdentityResponseBuilder.java
│ │ │ │ ├── ArchiveController.java
│ │ │ │ ├── AttachmentControllerV4.java
│ │ │ │ ├── CallLinkController.java
│ │ │ │ ├── CallQualitySurveyController.java
│ │ │ │ ├── CallRoutingControllerV2.java
│ │ │ │ ├── CertificateController.java
│ │ │ │ ├── ChallengeController.java
│ │ │ │ ├── DeviceCheckController.java
│ │ │ │ ├── DeviceController.java
│ │ │ │ ├── DeviceLimitExceededException.java
│ │ │ │ ├── DirectoryV2Controller.java
│ │ │ │ ├── DonationController.java
│ │ │ │ ├── GetCallingRelaysResponse.java
│ │ │ │ ├── KeepAliveController.java
│ │ │ │ ├── KeyTransparencyController.java
│ │ │ │ ├── KeysController.java
│ │ │ │ ├── MessageController.java
│ │ │ │ ├── MismatchedDevices.java
│ │ │ │ ├── MismatchedDevicesException.java
│ │ │ │ ├── MultiRecipientMismatchedDevicesException.java
│ │ │ │ ├── OneTimeDonationController.java
│ │ │ │ ├── PaymentsController.java
│ │ │ │ ├── ProfileController.java
│ │ │ │ ├── ProvisioningController.java
│ │ │ │ ├── RateLimitExceededException.java
│ │ │ │ ├── RegistrationController.java
│ │ │ │ ├── RemoteConfigController.java
│ │ │ │ ├── SecureStorageController.java
│ │ │ │ ├── SecureValueRecovery2Controller.java
│ │ │ │ ├── ServerRejectedException.java
│ │ │ │ ├── StickerController.java
│ │ │ │ ├── SubscriptionController.java
│ │ │ │ ├── VerificationController.java
│ │ │ │ └── VerificationSessionRateLimitExceededException.java
│ │ │ ├── currency/
│ │ │ │ ├── CoinGeckoClient.java
│ │ │ │ ├── CurrencyConversionManager.java
│ │ │ │ └── FixerClient.java
│ │ │ ├── entities/
│ │ │ │ ├── AccountAttributes.java
│ │ │ │ ├── AccountCreationResponse.java
│ │ │ │ ├── AccountDataReportResponse.java
│ │ │ │ ├── AccountIdentifierResponse.java
│ │ │ │ ├── AccountIdentityResponse.java
│ │ │ │ ├── AccountMismatchedDevices.java
│ │ │ │ ├── AccountStaleDevices.java
│ │ │ │ ├── AnswerCaptchaChallengeRequest.java
│ │ │ │ ├── AnswerChallengeRequest.java
│ │ │ │ ├── AnswerPushChallengeRequest.java
│ │ │ │ ├── ApnRegistrationId.java
│ │ │ │ ├── AttachmentDescriptorV3.java
│ │ │ │ ├── AuthCheckRequest.java
│ │ │ │ ├── AuthCheckResponseV2.java
│ │ │ │ ├── AvatarChange.java
│ │ │ │ ├── Badge.java
│ │ │ │ ├── BadgeSvg.java
│ │ │ │ ├── BaseProfileResponse.java
│ │ │ │ ├── BatchIdentityCheckRequest.java
│ │ │ │ ├── BatchIdentityCheckResponse.java
│ │ │ │ ├── ChangeNumberRequest.java
│ │ │ │ ├── CheckKeysRequest.java
│ │ │ │ ├── ConfirmUsernameHashRequest.java
│ │ │ │ ├── CreateCallLinkCredential.java
│ │ │ │ ├── CreateProfileRequest.java
│ │ │ │ ├── CreateVerificationSessionRequest.java
│ │ │ │ ├── CurrencyConversionEntity.java
│ │ │ │ ├── CurrencyConversionEntityList.java
│ │ │ │ ├── DeliveryCertificate.java
│ │ │ │ ├── DeviceActivationRequest.java
│ │ │ │ ├── DeviceInfo.java
│ │ │ │ ├── DeviceInfoList.java
│ │ │ │ ├── DeviceName.java
│ │ │ │ ├── ECPreKey.java
│ │ │ │ ├── ECSignedPreKey.java
│ │ │ │ ├── EncryptedUsername.java
│ │ │ │ ├── Entitlements.java
│ │ │ │ ├── ExpiringProfileKeyCredentialProfileResponse.java
│ │ │ │ ├── ExpiringProfileKeyCredentialResponseAdapter.java
│ │ │ │ ├── GcmRegistrationId.java
│ │ │ │ ├── GetCreateCallLinkCredentialsRequest.java
│ │ │ │ ├── GroupCredentials.java
│ │ │ │ ├── IncomingMessage.java
│ │ │ │ ├── IncomingMessageList.java
│ │ │ │ ├── IncomingWebsocketMessage.java
│ │ │ │ ├── KEMSignedPreKey.java
│ │ │ │ ├── KeyTransparencyDistinguishedKeyResponse.java
│ │ │ │ ├── KeyTransparencyMonitorRequest.java
│ │ │ │ ├── KeyTransparencyMonitorResponse.java
│ │ │ │ ├── KeyTransparencySearchRequest.java
│ │ │ │ ├── KeyTransparencySearchResponse.java
│ │ │ │ ├── LinkDeviceRequest.java
│ │ │ │ ├── LinkDeviceResponse.java
│ │ │ │ ├── MismatchedDevicesResponse.java
│ │ │ │ ├── OutgoingMessageEntity.java
│ │ │ │ ├── OutgoingMessageEntityList.java
│ │ │ │ ├── PhoneNumberDiscoverabilityRequest.java
│ │ │ │ ├── PhoneNumberIdentityKeyDistributionRequest.java
│ │ │ │ ├── PhoneVerificationRequest.java
│ │ │ │ ├── PreKey.java
│ │ │ │ ├── PreKeyCount.java
│ │ │ │ ├── PreKeyResponse.java
│ │ │ │ ├── PreKeyResponseItem.java
│ │ │ │ ├── PreKeySignatureValidator.java
│ │ │ │ ├── ProfileAvatarUploadAttributes.java
│ │ │ │ ├── ProfileKeyCommitmentAdapter.java
│ │ │ │ ├── ProvisioningMessage.java
│ │ │ │ ├── PurchasableBadge.java
│ │ │ │ ├── RateLimitChallenge.java
│ │ │ │ ├── RedeemReceiptRequest.java
│ │ │ │ ├── RegistrationLock.java
│ │ │ │ ├── RegistrationLockFailure.java
│ │ │ │ ├── RegistrationRequest.java
│ │ │ │ ├── RegistrationServiceSession.java
│ │ │ │ ├── RemoteAttachment.java
│ │ │ │ ├── RemoteAttachmentError.java
│ │ │ │ ├── RemoteConfigurationResponse.java
│ │ │ │ ├── ReserveUsernameHashRequest.java
│ │ │ │ ├── ReserveUsernameHashResponse.java
│ │ │ │ ├── RestoreAccountRequest.java
│ │ │ │ ├── SelfBadge.java
│ │ │ │ ├── SendMessageResponse.java
│ │ │ │ ├── SendMultiRecipientMessageResponse.java
│ │ │ │ ├── SetKeysRequest.java
│ │ │ │ ├── SetPublicKeyRequest.java
│ │ │ │ ├── SignedPreKey.java
│ │ │ │ ├── SpamReport.java
│ │ │ │ ├── StaleDevicesResponse.java
│ │ │ │ ├── StickerPackFormUploadAttributes.java
│ │ │ │ ├── SubmitVerificationCodeRequest.java
│ │ │ │ ├── TransferArchiveResult.java
│ │ │ │ ├── TransferArchiveUploadedRequest.java
│ │ │ │ ├── UpdateVerificationSessionRequest.java
│ │ │ │ ├── UserRemoteConfig.java
│ │ │ │ ├── UserRemoteConfigList.java
│ │ │ │ ├── UsernameHashResponse.java
│ │ │ │ ├── UsernameLinkHandle.java
│ │ │ │ ├── VerificationCodeRequest.java
│ │ │ │ ├── VerificationSessionResponse.java
│ │ │ │ └── VersionedProfileResponse.java
│ │ │ ├── experiment/
│ │ │ │ ├── DeviceLastSeenState.java
│ │ │ │ ├── Experiment.java
│ │ │ │ ├── ExperimentEnrollmentManager.java
│ │ │ │ ├── IdleDevicePushNotificationExperiment.java
│ │ │ │ ├── PushNotificationExperiment.java
│ │ │ │ ├── PushNotificationExperimentSample.java
│ │ │ │ └── PushNotificationExperimentSamples.java
│ │ │ ├── filters/
│ │ │ │ ├── ExternalRequestFilter.java
│ │ │ │ ├── RemoteAddressFilter.java
│ │ │ │ ├── RemoteDeprecationFilter.java
│ │ │ │ ├── RequestStatisticsFilter.java
│ │ │ │ ├── RestDeprecationFilter.java
│ │ │ │ └── TimestampResponseFilter.java
│ │ │ ├── gcp/
│ │ │ │ ├── CanonicalRequest.java
│ │ │ │ ├── CanonicalRequestGenerator.java
│ │ │ │ └── CanonicalRequestSigner.java
│ │ │ ├── grpc/
│ │ │ │ ├── AccountsAnonymousGrpcService.java
│ │ │ │ ├── AccountsGrpcService.java
│ │ │ │ ├── AttachmentsGrpcService.java
│ │ │ │ ├── AvatarChangeUtil.java
│ │ │ │ ├── BackupsAnonymousGrpcService.java
│ │ │ │ ├── BackupsGrpcService.java
│ │ │ │ ├── CallQualitySurveyGrpcService.java
│ │ │ │ ├── ChannelNotFoundException.java
│ │ │ │ ├── ConvertibleToGrpcStatus.java
│ │ │ │ ├── DeviceCapabilityUtil.java
│ │ │ │ ├── DeviceIdUtil.java
│ │ │ │ ├── DevicesGrpcService.java
│ │ │ │ ├── ErrorConformanceInterceptor.java
│ │ │ │ ├── ErrorMappingInterceptor.java
│ │ │ │ ├── ExternalServiceCredentialsAnonymousGrpcService.java
│ │ │ │ ├── ExternalServiceCredentialsGrpcService.java
│ │ │ │ ├── ExternalServiceDefinitions.java
│ │ │ │ ├── GroupSendTokenUtil.java
│ │ │ │ ├── GrpcAllowListInterceptor.java
│ │ │ │ ├── GrpcExceptions.java
│ │ │ │ ├── IdentityTypeUtil.java
│ │ │ │ ├── KeyTransparencyGrpcService.java
│ │ │ │ ├── KeysAnonymousGrpcService.java
│ │ │ │ ├── KeysGrpcHelper.java
│ │ │ │ ├── KeysGrpcService.java
│ │ │ │ ├── MessagesAnonymousGrpcService.java
│ │ │ │ ├── MessagesGrpcHelper.java
│ │ │ │ ├── MessagesGrpcService.java
│ │ │ │ ├── MetricServerInterceptor.java
│ │ │ │ ├── PaymentsGrpcService.java
│ │ │ │ ├── ProfileAnonymousGrpcService.java
│ │ │ │ ├── ProfileGrpcHelper.java
│ │ │ │ ├── ProfileGrpcService.java
│ │ │ │ ├── RateLimitUtil.java
│ │ │ │ ├── RequestAttributes.java
│ │ │ │ ├── RequestAttributesInterceptor.java
│ │ │ │ ├── RequestAttributesUtil.java
│ │ │ │ ├── ServerInterceptorUtil.java
│ │ │ │ ├── ServiceIdentifierUtil.java
│ │ │ │ ├── ValidatingInterceptor.java
│ │ │ │ ├── net/
│ │ │ │ │ ├── ManagedGrpcServer.java
│ │ │ │ │ └── ManagedNioEventLoopGroup.java
│ │ │ │ └── validators/
│ │ │ │ ├── BaseFieldValidator.java
│ │ │ │ ├── E164FieldValidator.java
│ │ │ │ ├── EnumSpecifiedFieldValidator.java
│ │ │ │ ├── ExactlySizeFieldValidator.java
│ │ │ │ ├── FieldValidationException.java
│ │ │ │ ├── FieldValidator.java
│ │ │ │ ├── NonEmptyFieldValidator.java
│ │ │ │ ├── PresentFieldValidator.java
│ │ │ │ ├── Range.java
│ │ │ │ ├── RangeFieldValidator.java
│ │ │ │ ├── SizeFieldValidator.java
│ │ │ │ └── ValidatorUtils.java
│ │ │ ├── http/
│ │ │ │ └── FaultTolerantHttpClient.java
│ │ │ ├── identity/
│ │ │ │ ├── AciServiceIdentifier.java
│ │ │ │ ├── IdentityType.java
│ │ │ │ ├── PniServiceIdentifier.java
│ │ │ │ └── ServiceIdentifier.java
│ │ │ ├── jetty/
│ │ │ │ └── JettyHttpConfigurationCustomizer.java
│ │ │ ├── keytransparency/
│ │ │ │ └── KeyTransparencyServiceClient.java
│ │ │ ├── limits/
│ │ │ │ ├── BaseRateLimiters.java
│ │ │ │ ├── CardinalityEstimator.java
│ │ │ │ ├── LeakyBucketRateLimiter.java
│ │ │ │ ├── MessageDeliveryLoopMonitor.java
│ │ │ │ ├── NoopMessageDeliveryLoopMonitor.java
│ │ │ │ ├── PushChallengeManager.java
│ │ │ │ ├── RateLimitByIpFilter.java
│ │ │ │ ├── RateLimitChallengeManager.java
│ │ │ │ ├── RateLimitChallengeOption.java
│ │ │ │ ├── RateLimitChallengeOptionManager.java
│ │ │ │ ├── RateLimitedByIp.java
│ │ │ │ ├── RateLimiter.java
│ │ │ │ ├── RateLimiterConfig.java
│ │ │ │ ├── RateLimiterDescriptor.java
│ │ │ │ ├── RateLimiters.java
│ │ │ │ └── RedisMessageDeliveryLoopMonitor.java
│ │ │ ├── mappers/
│ │ │ │ ├── BackupExceptionMapper.java
│ │ │ │ ├── CompletionExceptionMapper.java
│ │ │ │ ├── DeviceLimitExceededExceptionMapper.java
│ │ │ │ ├── GrpcStatusRuntimeExceptionMapper.java
│ │ │ │ ├── IOExceptionMapper.java
│ │ │ │ ├── ImpossiblePhoneNumberExceptionMapper.java
│ │ │ │ ├── InvalidWebsocketAddressExceptionMapper.java
│ │ │ │ ├── JsonMappingExceptionMapper.java
│ │ │ │ ├── NonNormalizedPhoneNumberExceptionMapper.java
│ │ │ │ ├── NonNormalizedPhoneNumberResponse.java
│ │ │ │ ├── ObsoletePhoneNumberFormatExceptionMapper.java
│ │ │ │ ├── RateLimitExceededExceptionMapper.java
│ │ │ │ ├── RegistrationServiceSenderExceptionMapper.java
│ │ │ │ ├── ServerRejectedExceptionMapper.java
│ │ │ │ └── SubscriptionExceptionMapper.java
│ │ │ ├── metrics/
│ │ │ │ ├── ApplicationShutdownMonitor.java
│ │ │ │ ├── BackupMetrics.java
│ │ │ │ ├── CallQualityInvalidArgumentsException.java
│ │ │ │ ├── CallQualitySurveyManager.java
│ │ │ │ ├── DevicePlatformUtil.java
│ │ │ │ ├── GarbageCollectionGauges.java
│ │ │ │ ├── LogstashTcpSocketAppenderFactory.java
│ │ │ │ ├── MessageMetrics.java
│ │ │ │ ├── MetricsApplicationEventListener.java
│ │ │ │ ├── MetricsHttpChannelListener.java
│ │ │ │ ├── MetricsRequestEventListener.java
│ │ │ │ ├── MetricsUtil.java
│ │ │ │ ├── MicrometerAwsSdkMetricPublisher.java
│ │ │ │ ├── MicrometerRegistryManager.java
│ │ │ │ ├── NoopAwsSdkMetricPublisher.java
│ │ │ │ ├── OpenTelemetryAppenderFactory.java
│ │ │ │ ├── OpenWebSocketCounter.java
│ │ │ │ ├── ReportedMessageMetricsListener.java
│ │ │ │ ├── TlsCertificateExpirationUtil.java
│ │ │ │ ├── TrafficSource.java
│ │ │ │ └── UserAgentTagUtil.java
│ │ │ ├── providers/
│ │ │ │ └── MultiRecipientMessageProvider.java
│ │ │ ├── push/
│ │ │ │ ├── APNSender.java
│ │ │ │ ├── FcmSender.java
│ │ │ │ ├── IdleDeviceNotificationScheduler.java
│ │ │ │ ├── MessageAvailabilityListener.java
│ │ │ │ ├── MessageSender.java
│ │ │ │ ├── MessageTooLargeException.java
│ │ │ │ ├── MessageUtil.java
│ │ │ │ ├── NotPushRegisteredException.java
│ │ │ │ ├── ProvisioningManager.java
│ │ │ │ ├── PushNotification.java
│ │ │ │ ├── PushNotificationManager.java
│ │ │ │ ├── PushNotificationScheduler.java
│ │ │ │ ├── PushNotificationSender.java
│ │ │ │ ├── ReceiptSender.java
│ │ │ │ ├── RedisMessageAvailabilityManager.java
│ │ │ │ └── SendPushNotificationResult.java
│ │ │ ├── redis/
│ │ │ │ ├── AbstractFaultTolerantPubSubConnection.java
│ │ │ │ ├── ClusterLuaScript.java
│ │ │ │ ├── ConnectionEventLogger.java
│ │ │ │ ├── FaultTolerantPubSubClusterConnection.java
│ │ │ │ ├── FaultTolerantPubSubConnection.java
│ │ │ │ ├── FaultTolerantRedisClient.java
│ │ │ │ ├── FaultTolerantRedisClusterClient.java
│ │ │ │ ├── LettuceShardCircuitBreaker.java
│ │ │ │ ├── NettyUtil.java
│ │ │ │ ├── RedisOperation.java
│ │ │ │ └── RedisUriUtil.java
│ │ │ ├── registration/
│ │ │ │ ├── ClientType.java
│ │ │ │ ├── IdentityTokenCallCredentials.java
│ │ │ │ ├── MessageTransport.java
│ │ │ │ ├── RegistrationFraudException.java
│ │ │ │ ├── RegistrationServiceClient.java
│ │ │ │ ├── RegistrationServiceException.java
│ │ │ │ ├── RegistrationServiceSenderException.java
│ │ │ │ ├── TransportNotAllowedException.java
│ │ │ │ └── VerificationSession.java
│ │ │ ├── s3/
│ │ │ │ ├── ManagedSupplier.java
│ │ │ │ ├── PolicySigner.java
│ │ │ │ ├── PostPolicyGenerator.java
│ │ │ │ ├── S3MonitoringSupplier.java
│ │ │ │ └── S3ObjectMonitor.java
│ │ │ ├── scheduler/
│ │ │ │ ├── JobScheduler.java
│ │ │ │ └── SchedulingUtil.java
│ │ │ ├── securestorage/
│ │ │ │ ├── SecureStorageClient.java
│ │ │ │ └── SecureStorageException.java
│ │ │ ├── securevaluerecovery/
│ │ │ │ ├── SecureValueRecoveryClient.java
│ │ │ │ └── SecureValueRecoveryException.java
│ │ │ ├── spam/
│ │ │ │ ├── ChallengeConstraintChecker.java
│ │ │ │ ├── ChallengeType.java
│ │ │ │ ├── GrpcChallengeResponse.java
│ │ │ │ ├── MessageDeliveryListener.java
│ │ │ │ ├── MessageType.java
│ │ │ │ ├── RateLimitChallengeListener.java
│ │ │ │ ├── RegistrationFraudChecker.java
│ │ │ │ ├── RegistrationRecoveryChecker.java
│ │ │ │ ├── SpamCheckResult.java
│ │ │ │ ├── SpamChecker.java
│ │ │ │ └── SpamFilter.java
│ │ │ ├── storage/
│ │ │ │ ├── AbstractDynamoDbStore.java
│ │ │ │ ├── Account.java
│ │ │ │ ├── AccountAlreadyExistsException.java
│ │ │ │ ├── AccountBadge.java
│ │ │ │ ├── AccountChangeValidator.java
│ │ │ │ ├── AccountLockManager.java
│ │ │ │ ├── AccountUtil.java
│ │ │ │ ├── Accounts.java
│ │ │ │ ├── AccountsManager.java
│ │ │ │ ├── ChangeNumberManager.java
│ │ │ │ ├── ChunkProcessingFailedException.java
│ │ │ │ ├── ClientRelease.java
│ │ │ │ ├── ClientReleaseManager.java
│ │ │ │ ├── ClientReleases.java
│ │ │ │ ├── ConflictingMessageConsumerException.java
│ │ │ │ ├── ContestedOptimisticLockException.java
│ │ │ │ ├── Device.java
│ │ │ │ ├── DeviceCapability.java
│ │ │ │ ├── DeviceIdDeserializer.java
│ │ │ │ ├── DeviceKEMPreKeyPages.java
│ │ │ │ ├── DeviceSpec.java
│ │ │ │ ├── DynamicConfigurationManager.java
│ │ │ │ ├── DynamoDbRecoveryManager.java
│ │ │ │ ├── EnvelopeUtil.java
│ │ │ │ ├── IssuedReceiptsManager.java
│ │ │ │ ├── KEMPreKeyPage.java
│ │ │ │ ├── KeyIdUtil.java
│ │ │ │ ├── KeysManager.java
│ │ │ │ ├── LinkDeviceTokenAlreadyUsedException.java
│ │ │ │ ├── MessagePersistenceException.java
│ │ │ │ ├── MessagePersister.java
│ │ │ │ ├── MessageStream.java
│ │ │ │ ├── MessageStreamEntry.java
│ │ │ │ ├── MessagesCache.java
│ │ │ │ ├── MessagesCacheGetItemsScript.java
│ │ │ │ ├── MessagesCacheInsertScript.java
│ │ │ │ ├── MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScript.java
│ │ │ │ ├── MessagesCacheReleaseNodeClaimScript.java
│ │ │ │ ├── MessagesCacheRemoveByGuidScript.java
│ │ │ │ ├── MessagesCacheRemoveQueueScript.java
│ │ │ │ ├── MessagesCacheRemoveRecipientViewFromMrmDataScript.java
│ │ │ │ ├── MessagesCacheUnlockQueueScript.java
│ │ │ │ ├── MessagesDynamoDb.java
│ │ │ │ ├── MessagesManager.java
│ │ │ │ ├── MrmDataMissingException.java
│ │ │ │ ├── OneTimeDonationsManager.java
│ │ │ │ ├── OptimisticLockRetryLimitExceededException.java
│ │ │ │ ├── PagedSingleUseKEMPreKeyStore.java
│ │ │ │ ├── PaymentTime.java
│ │ │ │ ├── PersistentTimer.java
│ │ │ │ ├── PhoneNumberIdentifiers.java
│ │ │ │ ├── Profiles.java
│ │ │ │ ├── ProfilesManager.java
│ │ │ │ ├── PushChallengeDynamoDb.java
│ │ │ │ ├── RedeemedReceiptsManager.java
│ │ │ │ ├── RedisDynamoDbMessagePublisher.java
│ │ │ │ ├── RedisDynamoDbMessageStream.java
│ │ │ │ ├── RefreshingAccountNotFoundException.java
│ │ │ │ ├── RegistrationRecoveryPasswords.java
│ │ │ │ ├── RegistrationRecoveryPasswordsManager.java
│ │ │ │ ├── RemoteConfig.java
│ │ │ │ ├── RemoteConfigs.java
│ │ │ │ ├── RemoteConfigsManager.java
│ │ │ │ ├── RemovedMessage.java
│ │ │ │ ├── RepeatedUseECSignedPreKeyStore.java
│ │ │ │ ├── RepeatedUseKEMSignedPreKeyStore.java
│ │ │ │ ├── RepeatedUseSignedPreKeyStore.java
│ │ │ │ ├── ReportMessageDynamoDb.java
│ │ │ │ ├── ReportMessageManager.java
│ │ │ │ ├── ReportedMessageListener.java
│ │ │ │ ├── SerializedExpireableJsonDynamoStore.java
│ │ │ │ ├── SingleUseECPreKeyStore.java
│ │ │ │ ├── SubscriberCredentials.java
│ │ │ │ ├── SubscriptionManager.java
│ │ │ │ ├── Subscriptions.java
│ │ │ │ ├── UsernameHashNotAvailableException.java
│ │ │ │ ├── UsernameReservationNotFoundException.java
│ │ │ │ ├── VerificationSessionManager.java
│ │ │ │ ├── VerificationSessions.java
│ │ │ │ ├── VersionedProfile.java
│ │ │ │ ├── devicecheck/
│ │ │ │ │ ├── AppleDeviceCheckManager.java
│ │ │ │ │ ├── AppleDeviceCheckTrustAnchor.java
│ │ │ │ │ ├── AppleDeviceChecks.java
│ │ │ │ │ ├── ChallengeNotFoundException.java
│ │ │ │ │ ├── DeviceCheckKeyIdNotFoundException.java
│ │ │ │ │ ├── DeviceCheckVerificationFailedException.java
│ │ │ │ │ ├── DuplicatePublicKeyException.java
│ │ │ │ │ ├── RequestReuseException.java
│ │ │ │ │ └── TooManyKeysException.java
│ │ │ │ └── foundationdb/
│ │ │ │ └── FoundationDbMessageStore.java
│ │ │ ├── subscriptions/
│ │ │ │ ├── AppleAppStoreClient.java
│ │ │ │ ├── AppleAppStoreDecodedTransaction.java
│ │ │ │ ├── AppleAppStoreManager.java
│ │ │ │ ├── BankMandateTranslator.java
│ │ │ │ ├── BankTransferType.java
│ │ │ │ ├── BraintreeGraphqlClient.java
│ │ │ │ ├── BraintreeManager.java
│ │ │ │ ├── BraintreePlanMetadata.java
│ │ │ │ ├── ChargeFailure.java
│ │ │ │ ├── CustomerAwareSubscriptionPaymentProcessor.java
│ │ │ │ ├── GooglePlayBillingManager.java
│ │ │ │ ├── PayPalDonationsTranslator.java
│ │ │ │ ├── PaymentDetails.java
│ │ │ │ ├── PaymentMethod.java
│ │ │ │ ├── PaymentProvider.java
│ │ │ │ ├── PaymentStatus.java
│ │ │ │ ├── ProcessorCustomer.java
│ │ │ │ ├── StripeManager.java
│ │ │ │ ├── SubscriptionChargeFailurePaymentRequiredException.java
│ │ │ │ ├── SubscriptionCurrencyUtil.java
│ │ │ │ ├── SubscriptionException.java
│ │ │ │ ├── SubscriptionForbiddenException.java
│ │ │ │ ├── SubscriptionInformation.java
│ │ │ │ ├── SubscriptionInvalidAmountException.java
│ │ │ │ ├── SubscriptionInvalidArgumentsException.java
│ │ │ │ ├── SubscriptionInvalidLevelException.java
│ │ │ │ ├── SubscriptionNotFoundException.java
│ │ │ │ ├── SubscriptionPaymentProcessor.java
│ │ │ │ ├── SubscriptionPaymentRequiredException.java
│ │ │ │ ├── SubscriptionPaymentRequiresActionException.java
│ │ │ │ ├── SubscriptionPrice.java
│ │ │ │ ├── SubscriptionProcessorConflictException.java
│ │ │ │ ├── SubscriptionProcessorException.java
│ │ │ │ ├── SubscriptionReceiptRequestedForOpenPaymentException.java
│ │ │ │ └── SubscriptionStatus.java
│ │ │ ├── telephony/
│ │ │ │ ├── CarrierData.java
│ │ │ │ ├── CarrierDataException.java
│ │ │ │ ├── CarrierDataProvider.java
│ │ │ │ └── hlrlookup/
│ │ │ │ ├── HlrLookupCarrierDataProvider.java
│ │ │ │ ├── HlrLookupRequest.java
│ │ │ │ ├── HlrLookupResponse.java
│ │ │ │ ├── HlrLookupResult.java
│ │ │ │ ├── NetworkDetails.java
│ │ │ │ └── TelephoneNumberRequest.java
│ │ │ ├── util/
│ │ │ │ ├── AbstractPublicKeyDeserializer.java
│ │ │ │ ├── AbstractPublicKeySerializer.java
│ │ │ │ ├── AsyncTimerUtil.java
│ │ │ │ ├── AttributeValues.java
│ │ │ │ ├── BackupAuthCredentialAdapter.java
│ │ │ │ ├── BoundedVirtualThreadFactory.java
│ │ │ │ ├── BufferingInterceptor.java
│ │ │ │ ├── ByteArrayAdapter.java
│ │ │ │ ├── ByteArrayBase64UrlAdapter.java
│ │ │ │ ├── ByteArrayBase64WithPaddingAdapter.java
│ │ │ │ ├── CertificateUtil.java
│ │ │ │ ├── ClosableEpoch.java
│ │ │ │ ├── CompletableFutureUtil.java
│ │ │ │ ├── Constants.java
│ │ │ │ ├── Conversions.java
│ │ │ │ ├── DeviceCapabilityAdapter.java
│ │ │ │ ├── DeviceNameByteArrayAdapter.java
│ │ │ │ ├── E164.java
│ │ │ │ ├── ECPublicKeyAdapter.java
│ │ │ │ ├── EncryptDeviceCreationTimestampUtil.java
│ │ │ │ ├── EnumMapUtil.java
│ │ │ │ ├── ExactlySize.java
│ │ │ │ ├── ExactlySizeValidator.java
│ │ │ │ ├── ExactlySizeValidatorForArraysOfByte.java
│ │ │ │ ├── ExactlySizeValidatorForCollection.java
│ │ │ │ ├── ExactlySizeValidatorForSecretBytes.java
│ │ │ │ ├── ExactlySizeValidatorForString.java
│ │ │ │ ├── ExceptionUtils.java
│ │ │ │ ├── ExecutorUtil.java
│ │ │ │ ├── Futures.java
│ │ │ │ ├── GoogleApiUtil.java
│ │ │ │ ├── HeaderUtils.java
│ │ │ │ ├── HmacUtils.java
│ │ │ │ ├── HostnameUtil.java
│ │ │ │ ├── HttpServletRequestUtil.java
│ │ │ │ ├── HttpUtils.java
│ │ │ │ ├── IdentityKeyAdapter.java
│ │ │ │ ├── ImpossiblePhoneNumberException.java
│ │ │ │ ├── InetAddressRange.java
│ │ │ │ ├── InstantAdapter.java
│ │ │ │ ├── JmxDumper.java
│ │ │ │ ├── KEMPublicKeyAdapter.java
│ │ │ │ ├── LinkDeviceToken.java
│ │ │ │ ├── ManagedAwsCrt.java
│ │ │ │ ├── ManagedExecutors.java
│ │ │ │ ├── NoStackTraceException.java
│ │ │ │ ├── NoStackTraceRuntimeException.java
│ │ │ │ ├── NonNormalizedPhoneNumberException.java
│ │ │ │ ├── ObsoletePhoneNumberFormatException.java
│ │ │ │ ├── Optionals.java
│ │ │ │ ├── Pair.java
│ │ │ │ ├── ProfileHelper.java
│ │ │ │ ├── RedisClusterUtil.java
│ │ │ │ ├── RegistrationIdValidator.java
│ │ │ │ ├── ResilienceUtil.java
│ │ │ │ ├── ServiceIdentifierAdapter.java
│ │ │ │ ├── SystemMapper.java
│ │ │ │ ├── ThrowingConsumer.java
│ │ │ │ ├── ThrowingSupplier.java
│ │ │ │ ├── UUIDUtil.java
│ │ │ │ ├── UsernameHashZkProofVerifier.java
│ │ │ │ ├── Util.java
│ │ │ │ ├── ValidBase64URLString.java
│ │ │ │ ├── ValidHexString.java
│ │ │ │ ├── VirtualExecutorServiceProvider.java
│ │ │ │ ├── VirtualThreadPinEventMonitor.java
│ │ │ │ ├── WeightedRandomSelect.java
│ │ │ │ ├── logging/
│ │ │ │ │ ├── LoggingUnhandledExceptionMapper.java
│ │ │ │ │ ├── RequestLogEnabledFilter.java
│ │ │ │ │ ├── RequestLogEnabledFilterFactory.java
│ │ │ │ │ ├── RequestLogManager.java
│ │ │ │ │ ├── UncaughtExceptionHandler.java
│ │ │ │ │ ├── UnknownKeepaliveOptionFilter.java
│ │ │ │ │ ├── UnknownKeepaliveOptionFilterFactory.java
│ │ │ │ │ └── UriInfoUtil.java
│ │ │ │ └── ua/
│ │ │ │ ├── ClientPlatform.java
│ │ │ │ ├── UnrecognizedUserAgentException.java
│ │ │ │ ├── UserAgent.java
│ │ │ │ └── UserAgentUtil.java
│ │ │ ├── websocket/
│ │ │ │ ├── AuthenticatedConnectListener.java
│ │ │ │ ├── InvalidWebsocketAddressException.java
│ │ │ │ ├── NoContextTakeoverPerMessageDeflateExtension.java
│ │ │ │ ├── ProvisioningConnectListener.java
│ │ │ │ ├── WebSocketAccountAuthenticator.java
│ │ │ │ └── WebSocketConnection.java
│ │ │ └── workers/
│ │ │ ├── AbstractCommandWithDependencies.java
│ │ │ ├── AbstractSinglePassCrawlAccountsCommand.java
│ │ │ ├── BackupMetricsCommand.java
│ │ │ ├── BackupUsageRecalculationCommand.java
│ │ │ ├── CertificateCommand.java
│ │ │ ├── CheckDynamicConfigurationCommand.java
│ │ │ ├── ClearIssuedReceiptRedemptionsCommand.java
│ │ │ ├── CommandDependencies.java
│ │ │ ├── DeleteUserCommand.java
│ │ │ ├── DiscardPushNotificationExperimentSamplesCommand.java
│ │ │ ├── FinishPushNotificationExperimentCommand.java
│ │ │ ├── IdleDeviceNotificationSchedulerFactory.java
│ │ │ ├── IdleWakeupEligibilityChecker.java
│ │ │ ├── JobSchedulerFactory.java
│ │ │ ├── MessagePersisterServiceCommand.java
│ │ │ ├── NotifyIdleDevicesCommand.java
│ │ │ ├── ProcessScheduledJobsServiceCommand.java
│ │ │ ├── PushNotificationExperimentFactory.java
│ │ │ ├── RegenerateSecondaryDynamoDbTableDataCommand.java
│ │ │ ├── RemoveExpiredAccountsCommand.java
│ │ │ ├── RemoveExpiredBackupsCommand.java
│ │ │ ├── RemoveExpiredLinkedDevicesCommand.java
│ │ │ ├── RemoveExpiredUsernameHoldsCommand.java
│ │ │ ├── RemoveOrphanedPreKeyPagesCommand.java
│ │ │ ├── ScheduledApnPushNotificationSenderServiceCommand.java
│ │ │ ├── ServerVersionCommand.java
│ │ │ ├── SetRequestLoggingEnabledTask.java
│ │ │ ├── SetUserDiscoverabilityCommand.java
│ │ │ ├── StartPushNotificationExperimentCommand.java
│ │ │ ├── UnlinkDeviceCommand.java
│ │ │ ├── UnlinkDevicesWithIdlePrimaryCommand.java
│ │ │ └── ZkParamsCommand.java
│ │ ├── java-templates/
│ │ │ └── org/
│ │ │ └── whispersystems/
│ │ │ └── textsecuregcm/
│ │ │ ├── WhisperServerVersion.java
│ │ │ └── storage/
│ │ │ └── FoundationDbVersion.java
│ │ ├── proto/
│ │ │ ├── CallQualitySurveyPubSub.proto
│ │ │ ├── DisconnectionRequests.proto
│ │ │ ├── DonationsPubsub.proto
│ │ │ ├── KeyTransparencyService.proto
│ │ │ ├── PubSubMessage.proto
│ │ │ ├── RegistrationService.proto
│ │ │ ├── TextSecure.proto
│ │ │ ├── WebSocketConnectionEvent.proto
│ │ │ └── org/
│ │ │ └── signal/
│ │ │ └── chat/
│ │ │ ├── README.md
│ │ │ ├── account.proto
│ │ │ ├── attachments.proto
│ │ │ ├── backups.proto
│ │ │ ├── call_quality.proto
│ │ │ ├── calling.proto
│ │ │ ├── common.proto
│ │ │ ├── credentials.proto
│ │ │ ├── device.proto
│ │ │ ├── errors.proto
│ │ │ ├── keys.proto
│ │ │ ├── messages.proto
│ │ │ ├── payments.proto
│ │ │ ├── profile.proto
│ │ │ ├── require.proto
│ │ │ └── tag.proto
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ ├── services/
│ │ │ │ ├── io.dropwizard.jackson.Discoverable
│ │ │ │ ├── io.dropwizard.logging.common.AppenderFactory
│ │ │ │ ├── io.dropwizard.logging.common.filter.FilterFactory
│ │ │ │ └── org.whispersystems.textsecuregcm.configuration.AwsCredentialsProviderFactory
│ │ │ ├── validation/
│ │ │ │ └── constraints-custom.xml
│ │ │ └── validation.xml
│ │ ├── banner.txt
│ │ ├── lua/
│ │ │ ├── apn/
│ │ │ │ └── schedule_background_notification.lua
│ │ │ ├── get_delivery_attempt_count.lua
│ │ │ ├── get_items.lua
│ │ │ ├── insert_item.lua
│ │ │ ├── insert_shared_multirecipient_message_data.lua
│ │ │ ├── release_node_claim.lua
│ │ │ ├── remove_item_by_guid.lua
│ │ │ ├── remove_queue.lua
│ │ │ ├── remove_recipient_view_from_mrm_data.lua
│ │ │ ├── unlock_queue.lua
│ │ │ └── validate_rate_limit.lua
│ │ └── org/
│ │ ├── signal/
│ │ │ ├── badges/
│ │ │ │ ├── Badges.properties
│ │ │ │ └── Badges_en.properties
│ │ │ ├── bankmandate/
│ │ │ │ └── BankMandate.properties
│ │ │ └── donations/
│ │ │ └── PayPal.properties
│ │ └── whispersystems/
│ │ └── textsecuregcm/
│ │ ├── push/
│ │ │ └── apns-certificates.pem
│ │ └── storage/
│ │ └── devicecheck/
│ │ └── apple_device_check.pem
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── whispersystems/
│ │ └── textsecuregcm/
│ │ ├── BufferingInterceptorIntegrationTest.java
│ │ ├── CheckServiceConfigurations.java
│ │ ├── LocalWhisperServerService.java
│ │ ├── ProvisioningTimeoutIntegrationTest.java
│ │ ├── WebsocketResourceProviderIntegrationTest.java
│ │ ├── WhisperServerServiceTest.java
│ │ ├── asn/
│ │ │ └── AsnInfoProviderImplTest.java
│ │ ├── auth/
│ │ │ ├── AccountAuthenticatorTest.java
│ │ │ ├── BasicAuthorizationHeaderTest.java
│ │ │ ├── CertificateGeneratorTest.java
│ │ │ ├── CloudflareTurnCredentialsManagerTest.java
│ │ │ ├── DisconnectionRequestManagerTest.java
│ │ │ ├── ExternalServiceCredentialsGeneratorTest.java
│ │ │ ├── ExternalServiceCredentialsSelectorTest.java
│ │ │ ├── IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilterTest.java
│ │ │ ├── OptionalAccessTest.java
│ │ │ ├── RedemptionRangeTest.java
│ │ │ ├── RegistrationLockError.java
│ │ │ ├── RegistrationLockVerificationManagerTest.java
│ │ │ ├── SaltedTokenHashTest.java
│ │ │ ├── StoredRegistrationLockTest.java
│ │ │ ├── UnidentifiedAccessChecksumTest.java
│ │ │ ├── UnidentifiedAccessUtilTest.java
│ │ │ └── grpc/
│ │ │ ├── BasicAuthCallCredentials.java
│ │ │ ├── MockAuthenticationInterceptor.java
│ │ │ ├── ProhibitAuthenticationInterceptorTest.java
│ │ │ └── RequireAuthenticationInterceptorTest.java
│ │ ├── backup/
│ │ │ ├── BackupAuthManagerTest.java
│ │ │ ├── BackupAuthTestUtil.java
│ │ │ ├── BackupManagerTest.java
│ │ │ ├── BackupsDbTest.java
│ │ │ ├── Cdn3BackupCredentialGeneratorTest.java
│ │ │ └── Cdn3RemoteStorageManagerTest.java
│ │ ├── badges/
│ │ │ └── ConfiguredProfileBadgeConverterTest.java
│ │ ├── captcha/
│ │ │ ├── CaptchaCheckerTest.java
│ │ │ └── ShortCodeExpanderTest.java
│ │ ├── configuration/
│ │ │ ├── LocalDynamoDbFactory.java
│ │ │ ├── LocalFaultTolerantRedisClientFactory.java
│ │ │ ├── LocalFaultTolerantRedisClusterFactory.java
│ │ │ ├── StaticS3ObjectMonitorFactory.java
│ │ │ ├── StubPaymentsServiceClientsFactory.java
│ │ │ ├── StubPubSubPublisherFactory.java
│ │ │ ├── StubRegistrationServiceClientFactory.java
│ │ │ ├── dynamic/
│ │ │ │ └── DynamicConfigurationTest.java
│ │ │ └── secrets/
│ │ │ └── SecretsTest.java
│ │ ├── controllers/
│ │ │ ├── AbstractV1SubscriptionControllerTest.java
│ │ │ ├── AccountControllerTest.java
│ │ │ ├── AccountControllerV2Test.java
│ │ │ ├── AccountIdentityResponseBuilderTest.java
│ │ │ ├── ArchiveControllerTest.java
│ │ │ ├── AttachmentControllerV4Test.java
│ │ │ ├── CallLinkControllerTest.java
│ │ │ ├── CallQualitySurveyControllerTest.java
│ │ │ ├── CallRoutingControllerV2Test.java
│ │ │ ├── CertificateControllerTest.java
│ │ │ ├── ChallengeControllerTest.java
│ │ │ ├── DeviceCheckControllerTest.java
│ │ │ ├── DeviceControllerTest.java
│ │ │ ├── DirectoryControllerV2Test.java
│ │ │ ├── DonationControllerTest.java
│ │ │ ├── KeyTransparencyControllerTest.java
│ │ │ ├── KeysControllerTest.java
│ │ │ ├── MessageControllerTest.java
│ │ │ ├── OneTimeDonationControllerTest.java
│ │ │ ├── PaymentsControllerTest.java
│ │ │ ├── ProfileControllerTest.java
│ │ │ ├── ProvisioningControllerTest.java
│ │ │ ├── RegistrationControllerTest.java
│ │ │ ├── RemoteConfigControllerTest.java
│ │ │ ├── SecureStorageControllerTest.java
│ │ │ ├── SecureValueRecovery2ControllerTest.java
│ │ │ ├── StickerControllerTest.java
│ │ │ ├── SubscriptionControllerTest.java
│ │ │ └── VerificationControllerTest.java
│ │ ├── currency/
│ │ │ ├── CoinGeckoClientTest.java
│ │ │ ├── CurrencyConversionManagerTest.java
│ │ │ └── FixerClientTest.java
│ │ ├── entities/
│ │ │ ├── AnswerChallengeRequestTest.java
│ │ │ ├── IncomingMessageListTest.java
│ │ │ ├── OutgoingMessageEntityTest.java
│ │ │ └── PreKeyTest.java
│ │ ├── experiment/
│ │ │ ├── ExperimentEnrollmentManagerTest.java
│ │ │ ├── ExperimentTest.java
│ │ │ ├── IdleDevicePushNotificationExperimentTest.java
│ │ │ └── PushNotificationExperimentSamplesTest.java
│ │ ├── filters/
│ │ │ ├── ExternalRequestFilterTest.java
│ │ │ ├── RemoteAddressFilterIntegrationTest.java
│ │ │ ├── RemoteAddressFilterTest.java
│ │ │ ├── RemoteDeprecationFilterTest.java
│ │ │ ├── RequestStatisticsFilterTest.java
│ │ │ ├── RestDeprecationFilterTest.java
│ │ │ └── TimestampResponseFilterTest.java
│ │ ├── grpc/
│ │ │ ├── AccountsAnonymousGrpcServiceTest.java
│ │ │ ├── AccountsGrpcServiceTest.java
│ │ │ ├── AttachmentsGrpcServiceTest.java
│ │ │ ├── BackupsAnonymousGrpcServiceTest.java
│ │ │ ├── BackupsGrpcServiceTest.java
│ │ │ ├── CallQualitySurveyGrpcServiceTest.java
│ │ │ ├── DevicesGrpcServiceTest.java
│ │ │ ├── EchoServiceImpl.java
│ │ │ ├── ErrorMappingInterceptorTest.java
│ │ │ ├── ExternalServiceCredentialsAnonymousGrpcServiceTest.java
│ │ │ ├── ExternalServiceCredentialsGrpcServiceTest.java
│ │ │ ├── GrpcAllowListInterceptorTest.java
│ │ │ ├── GrpcServerExtension.java
│ │ │ ├── GrpcTestUtils.java
│ │ │ ├── KeyTransparencyGrpcServiceTest.java
│ │ │ ├── KeysAnonymousGrpcServiceTest.java
│ │ │ ├── KeysGrpcServiceTest.java
│ │ │ ├── MessagesAnonymousGrpcServiceTest.java
│ │ │ ├── MessagesGrpcServiceTest.java
│ │ │ ├── MetricServerInterceptorTest.java
│ │ │ ├── MockRequestAttributesInterceptor.java
│ │ │ ├── PaymentsGrpcServiceTest.java
│ │ │ ├── ProfileAnonymousGrpcServiceTest.java
│ │ │ ├── ProfileGrpcServiceTest.java
│ │ │ ├── RequestAttributesInterceptorTest.java
│ │ │ ├── RequestAttributesServiceImpl.java
│ │ │ ├── RequestAttributesUtilTest.java
│ │ │ ├── SimpleBaseGrpcTest.java
│ │ │ └── ValidatingInterceptorTest.java
│ │ ├── http/
│ │ │ └── FaultTolerantHttpClientTest.java
│ │ ├── identity/
│ │ │ ├── AciServiceIdentifierTest.java
│ │ │ ├── PniServiceIdentifierTest.java
│ │ │ └── ServiceIdentifierTest.java
│ │ ├── limits/
│ │ │ ├── CardinalityEstimatorTest.java
│ │ │ ├── LeakyBucketRateLimiterTest.java
│ │ │ ├── MessageDeliveryLoopMonitorTest.java
│ │ │ ├── RateLimitChallengeManagerTest.java
│ │ │ ├── RateLimitChallengeOptionManagerTest.java
│ │ │ ├── RateLimitedByIpTest.java
│ │ │ ├── RateLimiterConfigTest.java
│ │ │ ├── RateLimitersLuaScriptTest.java
│ │ │ └── RateLimitersTest.java
│ │ ├── mappers/
│ │ │ ├── GrpcStatusRuntimeExceptionMapperTest.java
│ │ │ └── IOExceptionMapperTest.java
│ │ ├── metrics/
│ │ │ ├── CallQualitySurveyManagerTest.java
│ │ │ ├── MessageMetricsTest.java
│ │ │ ├── MetricsHttpChannelListenerIntegrationTest.java
│ │ │ ├── MetricsHttpChannelListenerTest.java
│ │ │ ├── MetricsRequestEventListenerTest.java
│ │ │ ├── MetricsUtilTest.java
│ │ │ ├── TlsCertificateExpirationUtilTest.java
│ │ │ └── UserAgentTagUtilTest.java
│ │ ├── push/
│ │ │ ├── APNSenderTest.java
│ │ │ ├── FcmSenderTest.java
│ │ │ ├── IdleDeviceNotificationSchedulerTest.java
│ │ │ ├── MessageSenderTest.java
│ │ │ ├── ProvisioningManagerTest.java
│ │ │ ├── PushNotificationManagerTest.java
│ │ │ ├── PushNotificationSchedulerTest.java
│ │ │ └── RedisMessageAvailabilityManagerTest.java
│ │ ├── redis/
│ │ │ ├── ClusterLuaScriptTest.java
│ │ │ ├── FaultTolerantPubSubClusterConnectionTest.java
│ │ │ ├── FaultTolerantRedisClientTest.java
│ │ │ ├── FaultTolerantRedisClusterClientTest.java
│ │ │ ├── LettuceShardCircuitBreakerTest.java
│ │ │ ├── RedisClusterExtension.java
│ │ │ └── RedisServerExtension.java
│ │ ├── registration/
│ │ │ └── IdentityTokenCallCredentialsTest.java
│ │ ├── s3/
│ │ │ ├── PolicySignerTest.java
│ │ │ └── S3ObjectMonitorTest.java
│ │ ├── scheduler/
│ │ │ ├── JobSchedulerTest.java
│ │ │ └── SchedulingUtilTest.java
│ │ ├── securestorage/
│ │ │ └── SecureStorageClientTest.java
│ │ ├── securevaluerecovery/
│ │ │ └── SecureValueRecoveryClientTest.java
│ │ ├── storage/
│ │ │ ├── AccountChangeValidatorTest.java
│ │ │ ├── AccountCreationDeletionIntegrationTest.java
│ │ │ ├── AccountLockManagerTest.java
│ │ │ ├── AccountTest.java
│ │ │ ├── AccountsManagerChangeNumberIntegrationTest.java
│ │ │ ├── AccountsManagerConcurrentModificationIntegrationTest.java
│ │ │ ├── AccountsManagerDeviceTransferIntegrationTest.java
│ │ │ ├── AccountsManagerTest.java
│ │ │ ├── AccountsManagerUsernameIntegrationTest.java
│ │ │ ├── AccountsTest.java
│ │ │ ├── AddRemoveDeviceIntegrationTest.java
│ │ │ ├── ChangeNumberManagerTest.java
│ │ │ ├── ClientReleaseManagerTest.java
│ │ │ ├── ClientReleasesTest.java
│ │ │ ├── DeviceTest.java
│ │ │ ├── DynamicConfigurationManagerTest.java
│ │ │ ├── DynamoDbExtension.java
│ │ │ ├── DynamoDbExtensionSchema.java
│ │ │ ├── EnvelopeUtilTest.java
│ │ │ ├── FoundationDbClusterExtension.java
│ │ │ ├── FoundationDbDatabaseLifecycleManager.java
│ │ │ ├── IssuedReceiptsManagerTest.java
│ │ │ ├── KEMPreKeyPageTest.java
│ │ │ ├── KeysManagerTest.java
│ │ │ ├── MessagePersisterIntegrationTest.java
│ │ │ ├── MessagePersisterTest.java
│ │ │ ├── MessagesCacheGetItemsScriptTest.java
│ │ │ ├── MessagesCacheInsertScriptTest.java
│ │ │ ├── MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScriptTest.java
│ │ │ ├── MessagesCacheRemoveByGuidScriptTest.java
│ │ │ ├── MessagesCacheRemoveQueueScriptTest.java
│ │ │ ├── MessagesCacheRemoveRecipientViewFromMrmDataScriptTest.java
│ │ │ ├── MessagesCacheTest.java
│ │ │ ├── MessagesDynamoDbTest.java
│ │ │ ├── MessagesManagerTest.java
│ │ │ ├── OnetimeDonationsManagerTest.java
│ │ │ ├── PagedSingleUseKEMPreKeyStoreTest.java
│ │ │ ├── PersistentTimerTest.java
│ │ │ ├── PhoneNumberIdentifiersTest.java
│ │ │ ├── ProfilesManagerTest.java
│ │ │ ├── ProfilesTest.java
│ │ │ ├── PushChallengeDynamoDbTest.java
│ │ │ ├── RedeemedReceiptsManagerTest.java
│ │ │ ├── RedisDynamoDbMessagePublisherTest.java
│ │ │ ├── RedisDynamoDbMessageStreamTest.java
│ │ │ ├── RegistrationRecoveryTest.java
│ │ │ ├── RemoteConfigsManagerTest.java
│ │ │ ├── RemoteConfigsTest.java
│ │ │ ├── RepeatedUseECSignedPreKeyStoreTest.java
│ │ │ ├── RepeatedUseKEMSignedPreKeyStoreTest.java
│ │ │ ├── RepeatedUseSignedPreKeyStoreTest.java
│ │ │ ├── ReportMessageDynamoDbTest.java
│ │ │ ├── ReportMessageManagerTest.java
│ │ │ ├── S3LocalStackExtension.java
│ │ │ ├── SerializedExpireableJsonDynamoStoreTest.java
│ │ │ ├── ServiceContainerFoundationDbDatabaseLifecycleManager.java
│ │ │ ├── SingleUseECPreKeyStoreTest.java
│ │ │ ├── SubscriptionsTest.java
│ │ │ ├── TestcontainersFoundationDbDatabaseLifecycleManager.java
│ │ │ ├── VerificationSessionsTest.java
│ │ │ ├── devicecheck/
│ │ │ │ ├── AppleDeviceCheckManagerTest.java
│ │ │ │ ├── AppleDeviceChecksTest.java
│ │ │ │ └── DeviceCheckTestUtil.java
│ │ │ └── foundationdb/
│ │ │ └── FoundationDbMessageStoreTest.java
│ │ ├── subscriptions/
│ │ │ ├── AppleAppStoreClientTest.java
│ │ │ ├── AppleAppStoreManagerTest.java
│ │ │ ├── BraintreeGraphqlClientTest.java
│ │ │ ├── BraintreeManagerTest.java
│ │ │ ├── GooglePlayBillingManagerTest.java
│ │ │ ├── PayPalDonationsTranslatorTest.java
│ │ │ ├── ProcessorCustomerTest.java
│ │ │ ├── StripeManagerTest.java
│ │ │ └── SubscriptionCurrencyUtilTest.java
│ │ ├── telephony/
│ │ │ └── hlrlookup/
│ │ │ └── HlrLookupCarrierDataProviderTest.java
│ │ ├── tests/
│ │ │ └── util/
│ │ │ ├── AccountsHelper.java
│ │ │ ├── AuthHelper.java
│ │ │ ├── DevicesHelper.java
│ │ │ ├── ExperimentHelper.java
│ │ │ ├── FakeDynamicConfigurationManager.java
│ │ │ ├── JsonHelpers.java
│ │ │ ├── KeysHelper.java
│ │ │ ├── MessageHelper.java
│ │ │ ├── MockRedisFuture.java
│ │ │ ├── MultiRecipientMessageHelper.java
│ │ │ ├── ProfileTestHelper.java
│ │ │ ├── RedisClusterHelper.java
│ │ │ ├── RedisServerHelper.java
│ │ │ ├── SynchronousExecutorService.java
│ │ │ ├── TestPrincipal.java
│ │ │ ├── TestRecipient.java
│ │ │ └── TestWebsocketListener.java
│ │ ├── util/
│ │ │ ├── AttributeValuesTest.java
│ │ │ ├── BoundedVirtualThreadFactoryTest.java
│ │ │ ├── ClosableEpochTest.java
│ │ │ ├── CompletableFutureTestUtil.java
│ │ │ ├── DeviceCapabilityAdapterTest.java
│ │ │ ├── DeviceNameByteArrayAdapterTest.java
│ │ │ ├── E164Test.java
│ │ │ ├── ECPublicKeyAdapterTest.java
│ │ │ ├── EncryptDeviceCreationTimestampUtilTest.java
│ │ │ ├── ExecutorUtilTest.java
│ │ │ ├── HttpServletRequestUtilIntegrationTest.java
│ │ │ ├── HttpServletRequestUtilTest.java
│ │ │ ├── HttpUtilsTest.java
│ │ │ ├── IdentityKeyAdapterTest.java
│ │ │ ├── InetAddressRangeTest.java
│ │ │ ├── KEMPublicKeyAdapterTest.java
│ │ │ ├── LocaleTest.java
│ │ │ ├── MockUtils.java
│ │ │ ├── MutableClock.java
│ │ │ ├── RedisClusterUtilTest.java
│ │ │ ├── SystemMapperTest.java
│ │ │ ├── TestClock.java
│ │ │ ├── TestRandomUtil.java
│ │ │ ├── TestRemoteAddressFilterProvider.java
│ │ │ ├── UtilTest.java
│ │ │ ├── ValidNumberTest.java
│ │ │ ├── VirtualExecutorServiceProviderTest.java
│ │ │ ├── VirtualThreadPinEventMonitorTest.java
│ │ │ ├── WeightedRandomSelectTest.java
│ │ │ ├── jetty/
│ │ │ │ └── TestResource.java
│ │ │ ├── logging/
│ │ │ │ ├── LoggingUnhandledExceptionMapperTest.java
│ │ │ │ └── UriInfoUtilTest.java
│ │ │ ├── redis/
│ │ │ │ ├── BaseRedisCommandsHandler.java
│ │ │ │ ├── RedisCommandsHandler.java
│ │ │ │ ├── RedisLuaScriptSandbox.java
│ │ │ │ └── SimpleCacheCommandsHandler.java
│ │ │ └── ua/
│ │ │ └── UserAgentUtilTest.java
│ │ ├── websocket/
│ │ │ ├── AuthenticatedConnectListenerTest.java
│ │ │ ├── ProvisioningConnectListenerTest.java
│ │ │ ├── WebSocketAccountAuthenticatorTest.java
│ │ │ ├── WebSocketConnectionIntegrationTest.java
│ │ │ └── WebSocketConnectionTest.java
│ │ └── workers/
│ │ ├── FinishPushNotificationExperimentCommandTest.java
│ │ ├── IdleWakeupEligibilityCheckerTest.java
│ │ ├── NotifyIdleDevicesCommandTest.java
│ │ ├── ProcessScheduledJobsServiceCommandTest.java
│ │ ├── RegenerateSecondaryDynamoDbTableDataCommandTest.java
│ │ ├── RemoveExpiredAccountsCommandTest.java
│ │ ├── RemoveExpiredLinkedDevicesCommandTest.java
│ │ ├── RemoveExpiredUsernameHoldsCommandTest.java
│ │ ├── RemoveOrphanedPreKeyPagesCommandTest.java
│ │ ├── StartPushNotificationExperimentCommandTest.java
│ │ └── UnlinkDevicesWithIdlePrimaryCommandTest.java
│ ├── java-templates/
│ │ └── org/
│ │ └── whispersystems/
│ │ └── textsecuregcm/
│ │ └── util/
│ │ └── TestcontainersImages.java
│ ├── proto/
│ │ ├── echo_service.proto
│ │ ├── request_attributes_service.proto
│ │ ├── tag_test.proto
│ │ ├── test_tree_head.proto
│ │ └── validation_test.proto
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ ├── org.whispersystems.textsecuregcm.configuration.DynamicConfigurationManagerFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.DynamoDbClientFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.FaultTolerantRedisClientFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.FaultTolerantRedisClusterFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.PaymentsServiceClientsFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.PubSubPublisherFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.RegistrationServiceClientFactory
│ │ └── org.whispersystems.textsecuregcm.configuration.S3ObjectMonitorFactory
│ ├── config/
│ │ ├── test-secrets-bundle.yml
│ │ └── test.yml
│ ├── fixtures/
│ │ ├── current_message_duplicate_device.json
│ │ ├── current_message_extra_device.json
│ │ ├── current_message_multi_device.json
│ │ ├── current_message_multi_device_not_urgent.json
│ │ ├── current_message_multi_device_pni.json
│ │ ├── current_message_null_message_in_list.json
│ │ ├── current_message_registration_id.json
│ │ ├── current_message_single_device.json
│ │ ├── current_message_single_device_bad_type.json
│ │ ├── current_message_single_device_not_urgent.json
│ │ ├── current_message_single_device_server_receipt_type.json
│ │ ├── current_message_sync.json
│ │ ├── fixer.res.json
│ │ ├── mismatched_registration_id.json
│ │ ├── missing_device_response.json
│ │ ├── missing_device_response2.json
│ │ └── prekey_v2.json
│ ├── logback-test.xml
│ └── org/
│ └── whispersystems/
│ └── textsecuregcm/
│ ├── asn/
│ │ └── ip2asn-test.tsv
│ └── storage/
│ ├── AccountsManagerTest-testJsonRoundTripSerialization.json
│ └── devicecheck/
│ ├── apple-sample-attestation
│ ├── webauthn4j-sample-assertion
│ └── webauthn4j-sample-attestation
└── websocket-resources/
├── pom.xml
└── src/
├── main/
│ ├── java/
│ │ └── org/
│ │ └── whispersystems/
│ │ └── websocket/
│ │ ├── WebSocketClient.java
│ │ ├── WebSocketResourceProvider.java
│ │ ├── WebSocketResourceProviderFactory.java
│ │ ├── WebSocketSecurityContext.java
│ │ ├── WebsocketHeaders.java
│ │ ├── auth/
│ │ │ ├── AuthenticatedWebSocketUpgradeFilter.java
│ │ │ ├── InvalidCredentialsException.java
│ │ │ ├── WebSocketAuthenticator.java
│ │ │ └── WebsocketAuthValueFactoryProvider.java
│ │ ├── configuration/
│ │ │ └── WebSocketConfiguration.java
│ │ ├── logging/
│ │ │ ├── AsyncWebsocketEventAppenderFactory.java
│ │ │ ├── WebsocketEvent.java
│ │ │ ├── WebsocketRequestLog.java
│ │ │ ├── WebsocketRequestLoggerFactory.java
│ │ │ └── layout/
│ │ │ ├── WebsocketEventLayout.java
│ │ │ ├── WebsocketEventLayoutFactory.java
│ │ │ └── converters/
│ │ │ ├── ContentLengthConverter.java
│ │ │ ├── DateConverter.java
│ │ │ ├── EnsureLineSeparation.java
│ │ │ ├── LineSeparatorConverter.java
│ │ │ ├── NAConverter.java
│ │ │ ├── RemoteHostConverter.java
│ │ │ ├── RequestHeaderConverter.java
│ │ │ ├── RequestUrlConverter.java
│ │ │ ├── StatusCodeConverter.java
│ │ │ └── WebSocketEventConverter.java
│ │ ├── messages/
│ │ │ ├── InvalidMessageException.java
│ │ │ ├── WebSocketMessage.java
│ │ │ ├── WebSocketMessageFactory.java
│ │ │ ├── WebSocketRequestMessage.java
│ │ │ ├── WebSocketResponseMessage.java
│ │ │ └── protobuf/
│ │ │ ├── ProtobufWebSocketMessage.java
│ │ │ ├── ProtobufWebSocketMessageFactory.java
│ │ │ ├── ProtobufWebSocketRequestMessage.java
│ │ │ └── ProtobufWebSocketResponseMessage.java
│ │ ├── session/
│ │ │ ├── ContextPrincipal.java
│ │ │ ├── WebSocketSession.java
│ │ │ ├── WebSocketSessionContainerRequestValueFactory.java
│ │ │ ├── WebSocketSessionContext.java
│ │ │ └── WebSocketSessionContextValueFactoryProvider.java
│ │ └── setup/
│ │ ├── WebSocketConnectListener.java
│ │ └── WebSocketEnvironment.java
│ └── proto/
│ └── WebSocketProtocol.proto
└── test/
└── java/
└── org/
└── whispersystems/
└── websocket/
├── WebSocketResourceProviderFactoryTest.java
├── WebSocketResourceProviderTest.java
└── logging/
└── WebSocketRequestLogTest.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
max_line_length = 120
tab_width = 8
ij_continuation_indent_size = 4
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = false
ij_smart_tabs = false
ij_visual_guides = none
ij_wrap_on_typing = false
[*.css]
ij_css_align_closing_brace_with_properties = false
ij_css_blank_lines_around_nested_selector = 1
ij_css_blank_lines_between_blocks = 1
ij_css_brace_placement = end_of_line
ij_css_enforce_quotes_on_format = false
ij_css_hex_color_long_format = false
ij_css_hex_color_lower_case = false
ij_css_hex_color_short_format = false
ij_css_hex_color_upper_case = false
ij_css_keep_blank_lines_in_code = 2
ij_css_keep_indents_on_empty_lines = false
ij_css_keep_single_line_blocks = false
ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
ij_css_space_after_colon = true
ij_css_space_before_opening_brace = true
ij_css_use_double_quotes = true
ij_css_value_alignment = do_not_align
[*.feature]
ij_continuation_indent_size = 8
ij_gherkin_keep_indents_on_empty_lines = false
[*.gsp]
indent_size = 4
ij_continuation_indent_size = 8
ij_gsp_keep_indents_on_empty_lines = false
[*.haml]
ij_continuation_indent_size = 8
ij_haml_keep_indents_on_empty_lines = false
[*.java]
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
ij_java_align_group_field_declarations = false
ij_java_align_multiline_annotation_parameters = false
ij_java_align_multiline_array_initializer_expression = false
ij_java_align_multiline_assignment = false
ij_java_align_multiline_binary_operation = false
ij_java_align_multiline_chained_methods = false
ij_java_align_multiline_extends_list = false
ij_java_align_multiline_for = false
ij_java_align_multiline_method_parentheses = false
ij_java_align_multiline_parameters = false
ij_java_align_multiline_parameters_in_calls = false
ij_java_align_multiline_parenthesized_expression = false
ij_java_align_multiline_records = true
ij_java_align_multiline_resources = false
ij_java_align_multiline_ternary_operation = false
ij_java_align_multiline_text_blocks = false
ij_java_align_multiline_throws_list = false
ij_java_align_subsequent_simple_methods = false
ij_java_align_throws_keyword = false
ij_java_annotation_parameter_wrap = off
ij_java_array_initializer_new_line_after_left_brace = false
ij_java_array_initializer_right_brace_on_new_line = false
ij_java_array_initializer_wrap = normal
ij_java_assert_statement_colon_on_next_line = false
ij_java_assert_statement_wrap = off
ij_java_assignment_wrap = off
ij_java_binary_operation_sign_on_next_line = true
ij_java_binary_operation_wrap = normal
ij_java_blank_lines_after_anonymous_class_header = 0
ij_java_blank_lines_after_class_header = 1
ij_java_blank_lines_after_imports = 1
ij_java_blank_lines_after_package = 1
ij_java_blank_lines_around_class = 1
ij_java_blank_lines_around_field = 0
ij_java_blank_lines_around_field_in_interface = 0
ij_java_blank_lines_around_initializer = 1
ij_java_blank_lines_around_method = 1
ij_java_blank_lines_around_method_in_interface = 1
ij_java_blank_lines_before_class_end = 0
ij_java_blank_lines_before_imports = 1
ij_java_blank_lines_before_method_body = 0
ij_java_blank_lines_before_package = 0
ij_java_block_brace_style = end_of_line
ij_java_block_comment_at_first_column = true
ij_java_call_parameters_new_line_after_left_paren = false
ij_java_call_parameters_right_paren_on_new_line = false
ij_java_call_parameters_wrap = normal
ij_java_case_statement_on_separate_line = true
ij_java_catch_on_new_line = false
ij_java_class_annotation_wrap = split_into_lines
ij_java_class_brace_style = end_of_line
ij_java_class_count_to_use_import_on_demand = 999
ij_java_class_names_in_javadoc = 1
ij_java_do_not_indent_top_level_class_members = false
ij_java_do_not_wrap_after_single_annotation = false
ij_java_do_while_brace_force = always
ij_java_doc_add_blank_line_after_description = true
ij_java_doc_add_blank_line_after_param_comments = false
ij_java_doc_add_blank_line_after_return = false
ij_java_doc_add_p_tag_on_empty_lines = true
ij_java_doc_align_exception_comments = true
ij_java_doc_align_param_comments = true
ij_java_doc_do_not_wrap_if_one_line = false
ij_java_doc_enable_formatting = true
ij_java_doc_enable_leading_asterisks = true
ij_java_doc_indent_on_continuation = false
ij_java_doc_keep_empty_lines = true
ij_java_doc_keep_empty_parameter_tag = true
ij_java_doc_keep_empty_return_tag = true
ij_java_doc_keep_empty_throws_tag = true
ij_java_doc_keep_invalid_tags = true
ij_java_doc_param_description_on_new_line = false
ij_java_doc_preserve_line_breaks = false
ij_java_doc_use_throws_not_exception_tag = true
ij_java_else_on_new_line = false
ij_java_entity_dd_suffix = EJB
ij_java_entity_eb_suffix = Bean
ij_java_entity_hi_suffix = Home
ij_java_entity_lhi_prefix = Local
ij_java_entity_lhi_suffix = Home
ij_java_entity_li_prefix = Local
ij_java_entity_pk_class = java.lang.String
ij_java_entity_vo_suffix = VO
ij_java_enum_constants_wrap = off
ij_java_extends_keyword_wrap = off
ij_java_extends_list_wrap = normal
ij_java_field_annotation_wrap = split_into_lines
ij_java_finally_on_new_line = false
ij_java_for_brace_force = always
ij_java_for_statement_new_line_after_left_paren = false
ij_java_for_statement_right_paren_on_new_line = false
ij_java_for_statement_wrap = normal
ij_java_generate_final_locals = true
ij_java_generate_final_parameters = true
ij_java_if_brace_force = always
ij_java_imports_layout = $*,|,*
ij_java_indent_case_from_switch = true
ij_java_insert_inner_class_imports = false
ij_java_insert_override_annotation = true
ij_java_keep_blank_lines_before_right_brace = 2
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
ij_java_keep_blank_lines_in_code = 1
ij_java_keep_blank_lines_in_declarations = 2
ij_java_keep_control_statement_in_one_line = false
ij_java_keep_first_column_comment = true
ij_java_keep_indents_on_empty_lines = false
ij_java_keep_line_breaks = true
ij_java_keep_multiple_expressions_in_one_line = false
ij_java_keep_simple_blocks_in_one_line = false
ij_java_keep_simple_classes_in_one_line = true
ij_java_keep_simple_lambdas_in_one_line = false
ij_java_keep_simple_methods_in_one_line = false
ij_java_label_indent_absolute = false
ij_java_label_indent_size = 0
ij_java_lambda_brace_style = end_of_line
ij_java_layout_static_imports_separately = true
ij_java_line_comment_add_space = false
ij_java_line_comment_at_first_column = true
ij_java_message_dd_suffix = EJB
ij_java_message_eb_suffix = Bean
ij_java_method_annotation_wrap = split_into_lines
ij_java_method_brace_style = end_of_line
ij_java_method_call_chain_wrap = normal
ij_java_method_parameters_new_line_after_left_paren = false
ij_java_method_parameters_right_paren_on_new_line = false
ij_java_method_parameters_wrap = normal
ij_java_modifier_list_wrap = false
ij_java_names_count_to_use_import_on_demand = 999
ij_java_new_line_after_lparen_in_record_header = false
ij_java_parameter_annotation_wrap = off
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
ij_java_place_assignment_sign_on_next_line = false
ij_java_prefer_longer_names = true
ij_java_prefer_parameters_wrap = false
ij_java_record_components_wrap = normal
ij_java_repeat_synchronized = true
ij_java_replace_instanceof_and_cast = false
ij_java_replace_null_check = true
ij_java_replace_sum_lambda_with_method_ref = true
ij_java_resource_list_new_line_after_left_paren = false
ij_java_resource_list_right_paren_on_new_line = false
ij_java_resource_list_wrap = off
ij_java_rparen_on_new_line_in_record_header = false
ij_java_session_dd_suffix = EJB
ij_java_session_eb_suffix = Bean
ij_java_session_hi_suffix = Home
ij_java_session_lhi_prefix = Local
ij_java_session_lhi_suffix = Home
ij_java_session_li_prefix = Local
ij_java_session_si_suffix = Service
ij_java_space_after_closing_angle_bracket_in_type_argument = false
ij_java_space_after_colon = true
ij_java_space_after_comma = true
ij_java_space_after_comma_in_type_arguments = true
ij_java_space_after_for_semicolon = true
ij_java_space_after_quest = true
ij_java_space_after_type_cast = true
ij_java_space_before_annotation_array_initializer_left_brace = false
ij_java_space_before_annotation_parameter_list = false
ij_java_space_before_array_initializer_left_brace = false
ij_java_space_before_catch_keyword = true
ij_java_space_before_catch_left_brace = true
ij_java_space_before_catch_parentheses = true
ij_java_space_before_class_left_brace = true
ij_java_space_before_colon = true
ij_java_space_before_colon_in_foreach = true
ij_java_space_before_comma = false
ij_java_space_before_do_left_brace = true
ij_java_space_before_else_keyword = true
ij_java_space_before_else_left_brace = true
ij_java_space_before_finally_keyword = true
ij_java_space_before_finally_left_brace = true
ij_java_space_before_for_left_brace = true
ij_java_space_before_for_parentheses = true
ij_java_space_before_for_semicolon = false
ij_java_space_before_if_left_brace = true
ij_java_space_before_if_parentheses = true
ij_java_space_before_method_call_parentheses = false
ij_java_space_before_method_left_brace = true
ij_java_space_before_method_parentheses = false
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
ij_java_space_before_quest = true
ij_java_space_before_switch_left_brace = true
ij_java_space_before_switch_parentheses = true
ij_java_space_before_synchronized_left_brace = true
ij_java_space_before_synchronized_parentheses = true
ij_java_space_before_try_left_brace = true
ij_java_space_before_try_parentheses = true
ij_java_space_before_type_parameter_list = false
ij_java_space_before_while_keyword = true
ij_java_space_before_while_left_brace = true
ij_java_space_before_while_parentheses = true
ij_java_space_inside_one_line_enum_braces = false
ij_java_space_within_empty_array_initializer_braces = false
ij_java_space_within_empty_method_call_parentheses = false
ij_java_space_within_empty_method_parentheses = false
ij_java_spaces_around_additive_operators = true
ij_java_spaces_around_assignment_operators = true
ij_java_spaces_around_bitwise_operators = true
ij_java_spaces_around_equality_operators = true
ij_java_spaces_around_lambda_arrow = true
ij_java_spaces_around_logical_operators = true
ij_java_spaces_around_method_ref_dbl_colon = false
ij_java_spaces_around_multiplicative_operators = true
ij_java_spaces_around_relational_operators = true
ij_java_spaces_around_shift_operators = true
ij_java_spaces_around_type_bounds_in_type_parameters = true
ij_java_spaces_around_unary_operator = false
ij_java_spaces_within_angle_brackets = false
ij_java_spaces_within_annotation_parentheses = false
ij_java_spaces_within_array_initializer_braces = false
ij_java_spaces_within_braces = false
ij_java_spaces_within_brackets = false
ij_java_spaces_within_cast_parentheses = false
ij_java_spaces_within_catch_parentheses = false
ij_java_spaces_within_for_parentheses = false
ij_java_spaces_within_if_parentheses = false
ij_java_spaces_within_method_call_parentheses = false
ij_java_spaces_within_method_parentheses = false
ij_java_spaces_within_parentheses = false
ij_java_spaces_within_record_header = false
ij_java_spaces_within_switch_parentheses = false
ij_java_spaces_within_synchronized_parentheses = false
ij_java_spaces_within_try_parentheses = false
ij_java_spaces_within_while_parentheses = false
ij_java_special_else_if_treatment = true
ij_java_subclass_name_suffix = Impl
ij_java_ternary_operation_signs_on_next_line = true
ij_java_ternary_operation_wrap = normal
ij_java_test_name_suffix = Test
ij_java_throws_keyword_wrap = normal
ij_java_throws_list_wrap = off
ij_java_use_external_annotations = false
ij_java_use_fq_class_names = false
ij_java_use_relative_indents = false
ij_java_use_single_class_imports = true
ij_java_variable_annotation_wrap = off
ij_java_visibility = public
ij_java_while_brace_force = always
ij_java_while_on_new_line = false
ij_java_wrap_comments = true
ij_java_wrap_first_method_in_call_chain = false
ij_java_wrap_long_lines = false
[*.less]
ij_continuation_indent_size = 8
ij_less_align_closing_brace_with_properties = false
ij_less_blank_lines_around_nested_selector = 1
ij_less_blank_lines_between_blocks = 1
ij_less_brace_placement = 0
ij_less_enforce_quotes_on_format = false
ij_less_hex_color_long_format = false
ij_less_hex_color_lower_case = false
ij_less_hex_color_short_format = false
ij_less_hex_color_upper_case = false
ij_less_keep_blank_lines_in_code = 2
ij_less_keep_indents_on_empty_lines = false
ij_less_keep_single_line_blocks = false
ij_less_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
ij_less_space_after_colon = true
ij_less_space_before_opening_brace = true
ij_less_use_double_quotes = true
ij_less_value_alignment = 0
[*.proto]
max_line_length = 80
ij_continuation_indent_size = 2
ij_protobuf_keep_blank_lines_in_code = 2
ij_protobuf_keep_indents_on_empty_lines = false
ij_protobuf_keep_line_breaks = true
ij_protobuf_space_after_comma = true
ij_protobuf_space_before_comma = false
ij_protobuf_spaces_around_assignment_operators = true
ij_protobuf_spaces_within_braces = false
ij_protobuf_spaces_within_brackets = false
[*.rs]
indent_size = 4
ij_rust_align_multiline_chained_methods = false
ij_rust_align_multiline_parameters = true
ij_rust_align_multiline_parameters_in_calls = true
ij_rust_align_ret_type = true
ij_rust_align_type_params = false
ij_rust_align_where_bounds = true
ij_rust_align_where_clause = false
ij_rust_allow_one_line_match = false
ij_rust_block_comment_at_first_column = false
ij_rust_indent_where_clause = true
ij_rust_keep_blank_lines_in_code = 2
ij_rust_keep_blank_lines_in_declarations = 2
ij_rust_keep_indents_on_empty_lines = false
ij_rust_keep_line_breaks = true
ij_rust_line_comment_add_space = true
ij_rust_line_comment_at_first_column = false
ij_rust_min_number_of_blanks_between_items = 1
ij_rust_preserve_punctuation = false
ij_rust_spaces_around_assoc_type_binding = false
[*.sass]
ij_sass_align_closing_brace_with_properties = false
ij_sass_blank_lines_around_nested_selector = 1
ij_sass_blank_lines_between_blocks = 1
ij_sass_brace_placement = 0
ij_sass_enforce_quotes_on_format = false
ij_sass_hex_color_long_format = false
ij_sass_hex_color_lower_case = false
ij_sass_hex_color_short_format = false
ij_sass_hex_color_upper_case = false
ij_sass_keep_blank_lines_in_code = 2
ij_sass_keep_indents_on_empty_lines = false
ij_sass_keep_single_line_blocks = false
ij_sass_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
ij_sass_space_after_colon = true
ij_sass_space_before_opening_brace = true
ij_sass_use_double_quotes = true
ij_sass_value_alignment = 0
[*.scss]
ij_scss_align_closing_brace_with_properties = false
ij_scss_blank_lines_around_nested_selector = 1
ij_scss_blank_lines_between_blocks = 1
ij_scss_brace_placement = 0
ij_scss_enforce_quotes_on_format = false
ij_scss_hex_color_long_format = false
ij_scss_hex_color_lower_case = false
ij_scss_hex_color_short_format = false
ij_scss_hex_color_upper_case = false
ij_scss_keep_blank_lines_in_code = 2
ij_scss_keep_indents_on_empty_lines = false
ij_scss_keep_single_line_blocks = false
ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
ij_scss_space_after_colon = true
ij_scss_space_before_opening_brace = true
ij_scss_use_double_quotes = true
ij_scss_value_alignment = 0
[*.styl]
ij_continuation_indent_size = 8
ij_stylus_align_closing_brace_with_properties = false
ij_stylus_blank_lines_around_nested_selector = 1
ij_stylus_blank_lines_between_blocks = 1
ij_stylus_brace_placement = 0
ij_stylus_enforce_quotes_on_format = false
ij_stylus_hex_color_long_format = false
ij_stylus_hex_color_lower_case = false
ij_stylus_hex_color_short_format = false
ij_stylus_hex_color_upper_case = false
ij_stylus_keep_blank_lines_in_code = 2
ij_stylus_keep_indents_on_empty_lines = false
ij_stylus_keep_single_line_blocks = false
ij_stylus_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
ij_stylus_space_after_colon = true
ij_stylus_space_before_opening_brace = true
ij_stylus_use_double_quotes = true
ij_stylus_value_alignment = 0
[.editorconfig]
ij_editorconfig_align_group_field_declarations = false
ij_editorconfig_space_after_colon = false
ij_editorconfig_space_after_comma = true
ij_editorconfig_space_before_colon = false
ij_editorconfig_space_before_comma = false
ij_editorconfig_spaces_around_assignment_operators = true
[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.qrc,*.rng,*.tld,*.wadl,*.wsdd,*.wsdl,*.xjb,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
ij_continuation_indent_size = 2
ij_xml_align_attributes = false
ij_xml_align_text = false
ij_xml_attribute_wrap = normal
ij_xml_block_comment_at_first_column = true
ij_xml_keep_blank_lines = 2
ij_xml_keep_indents_on_empty_lines = false
ij_xml_keep_line_breaks = true
ij_xml_keep_line_breaks_in_text = true
ij_xml_keep_whitespaces = false
ij_xml_keep_whitespaces_around_cdata = preserve
ij_xml_keep_whitespaces_inside_cdata = false
ij_xml_line_comment_at_first_column = true
ij_xml_space_after_tag_name = false
ij_xml_space_around_equals_in_attribute = false
ij_xml_space_inside_empty_tag = false
ij_xml_text_wrap = normal
ij_xml_use_custom_settings = true
[{*.ats,*.ts}]
ij_typescript_align_imports = false
ij_typescript_align_multiline_array_initializer_expression = false
ij_typescript_align_multiline_binary_operation = false
ij_typescript_align_multiline_chained_methods = false
ij_typescript_align_multiline_extends_list = false
ij_typescript_align_multiline_for = true
ij_typescript_align_multiline_parameters = true
ij_typescript_align_multiline_parameters_in_calls = false
ij_typescript_align_multiline_ternary_operation = false
ij_typescript_align_object_properties = 0
ij_typescript_align_union_types = false
ij_typescript_align_var_statements = 0
ij_typescript_array_initializer_new_line_after_left_brace = false
ij_typescript_array_initializer_right_brace_on_new_line = false
ij_typescript_array_initializer_wrap = off
ij_typescript_assignment_wrap = off
ij_typescript_binary_operation_sign_on_next_line = false
ij_typescript_binary_operation_wrap = off
ij_typescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/**
ij_typescript_blank_lines_after_imports = 1
ij_typescript_blank_lines_around_class = 1
ij_typescript_blank_lines_around_field = 0
ij_typescript_blank_lines_around_field_in_interface = 0
ij_typescript_blank_lines_around_function = 1
ij_typescript_blank_lines_around_method = 1
ij_typescript_blank_lines_around_method_in_interface = 1
ij_typescript_block_brace_style = end_of_line
ij_typescript_call_parameters_new_line_after_left_paren = false
ij_typescript_call_parameters_right_paren_on_new_line = false
ij_typescript_call_parameters_wrap = off
ij_typescript_catch_on_new_line = false
ij_typescript_chained_call_dot_on_new_line = true
ij_typescript_class_brace_style = end_of_line
ij_typescript_comma_on_new_line = false
ij_typescript_do_while_brace_force = never
ij_typescript_else_on_new_line = false
ij_typescript_enforce_trailing_comma = keep
ij_typescript_extends_keyword_wrap = off
ij_typescript_extends_list_wrap = off
ij_typescript_field_prefix = _
ij_typescript_file_name_style = relaxed
ij_typescript_finally_on_new_line = false
ij_typescript_for_brace_force = never
ij_typescript_for_statement_new_line_after_left_paren = false
ij_typescript_for_statement_right_paren_on_new_line = false
ij_typescript_for_statement_wrap = off
ij_typescript_force_quote_style = false
ij_typescript_force_semicolon_style = false
ij_typescript_function_expression_brace_style = end_of_line
ij_typescript_if_brace_force = never
ij_typescript_import_merge_members = global
ij_typescript_import_prefer_absolute_path = global
ij_typescript_import_sort_members = true
ij_typescript_import_sort_module_name = false
ij_typescript_import_use_node_resolution = true
ij_typescript_imports_wrap = on_every_item
ij_typescript_indent_case_from_switch = true
ij_typescript_indent_chained_calls = false
ij_typescript_indent_package_children = 0
ij_typescript_jsdoc_include_types = false
ij_typescript_jsx_attribute_value = braces
ij_typescript_keep_blank_lines_in_code = 2
ij_typescript_keep_first_column_comment = true
ij_typescript_keep_indents_on_empty_lines = false
ij_typescript_keep_line_breaks = true
ij_typescript_keep_simple_blocks_in_one_line = false
ij_typescript_keep_simple_methods_in_one_line = false
ij_typescript_line_comment_add_space = true
ij_typescript_line_comment_at_first_column = false
ij_typescript_method_brace_style = end_of_line
ij_typescript_method_call_chain_wrap = off
ij_typescript_method_parameters_new_line_after_left_paren = false
ij_typescript_method_parameters_right_paren_on_new_line = false
ij_typescript_method_parameters_wrap = off
ij_typescript_object_literal_wrap = on_every_item
ij_typescript_parentheses_expression_new_line_after_left_paren = false
ij_typescript_parentheses_expression_right_paren_on_new_line = false
ij_typescript_place_assignment_sign_on_next_line = false
ij_typescript_prefer_as_type_cast = false
ij_typescript_prefer_explicit_types_function_expression_returns = false
ij_typescript_prefer_explicit_types_function_returns = false
ij_typescript_prefer_explicit_types_vars_fields = false
ij_typescript_prefer_parameters_wrap = false
ij_typescript_reformat_c_style_comments = false
ij_typescript_space_after_colon = true
ij_typescript_space_after_comma = true
ij_typescript_space_after_dots_in_rest_parameter = false
ij_typescript_space_after_generator_mult = true
ij_typescript_space_after_property_colon = true
ij_typescript_space_after_quest = true
ij_typescript_space_after_type_colon = true
ij_typescript_space_after_unary_not = false
ij_typescript_space_before_async_arrow_lparen = true
ij_typescript_space_before_catch_keyword = true
ij_typescript_space_before_catch_left_brace = true
ij_typescript_space_before_catch_parentheses = true
ij_typescript_space_before_class_lbrace = true
ij_typescript_space_before_class_left_brace = true
ij_typescript_space_before_colon = true
ij_typescript_space_before_comma = false
ij_typescript_space_before_do_left_brace = true
ij_typescript_space_before_else_keyword = true
ij_typescript_space_before_else_left_brace = true
ij_typescript_space_before_finally_keyword = true
ij_typescript_space_before_finally_left_brace = true
ij_typescript_space_before_for_left_brace = true
ij_typescript_space_before_for_parentheses = true
ij_typescript_space_before_for_semicolon = false
ij_typescript_space_before_function_left_parenth = true
ij_typescript_space_before_generator_mult = false
ij_typescript_space_before_if_left_brace = true
ij_typescript_space_before_if_parentheses = true
ij_typescript_space_before_method_call_parentheses = false
ij_typescript_space_before_method_left_brace = true
ij_typescript_space_before_method_parentheses = false
ij_typescript_space_before_property_colon = false
ij_typescript_space_before_quest = true
ij_typescript_space_before_switch_left_brace = true
ij_typescript_space_before_switch_parentheses = true
ij_typescript_space_before_try_left_brace = true
ij_typescript_space_before_type_colon = false
ij_typescript_space_before_unary_not = false
ij_typescript_space_before_while_keyword = true
ij_typescript_space_before_while_left_brace = true
ij_typescript_space_before_while_parentheses = true
ij_typescript_spaces_around_additive_operators = true
ij_typescript_spaces_around_arrow_function_operator = true
ij_typescript_spaces_around_assignment_operators = true
ij_typescript_spaces_around_bitwise_operators = true
ij_typescript_spaces_around_equality_operators = true
ij_typescript_spaces_around_logical_operators = true
ij_typescript_spaces_around_multiplicative_operators = true
ij_typescript_spaces_around_relational_operators = true
ij_typescript_spaces_around_shift_operators = true
ij_typescript_spaces_around_unary_operator = false
ij_typescript_spaces_within_array_initializer_brackets = false
ij_typescript_spaces_within_brackets = false
ij_typescript_spaces_within_catch_parentheses = false
ij_typescript_spaces_within_for_parentheses = false
ij_typescript_spaces_within_if_parentheses = false
ij_typescript_spaces_within_imports = false
ij_typescript_spaces_within_interpolation_expressions = false
ij_typescript_spaces_within_method_call_parentheses = false
ij_typescript_spaces_within_method_parentheses = false
ij_typescript_spaces_within_object_literal_braces = false
ij_typescript_spaces_within_object_type_braces = true
ij_typescript_spaces_within_parentheses = false
ij_typescript_spaces_within_switch_parentheses = false
ij_typescript_spaces_within_type_assertion = false
ij_typescript_spaces_within_union_types = true
ij_typescript_spaces_within_while_parentheses = false
ij_typescript_special_else_if_treatment = true
ij_typescript_ternary_operation_signs_on_next_line = false
ij_typescript_ternary_operation_wrap = off
ij_typescript_union_types_wrap = on_every_item
ij_typescript_use_chained_calls_group_indents = false
ij_typescript_use_double_quotes = true
ij_typescript_use_explicit_js_extension = global
ij_typescript_use_path_mapping = always
ij_typescript_use_public_modifier = false
ij_typescript_use_semicolon_after_statement = true
ij_typescript_var_declaration_wrap = normal
ij_typescript_while_brace_force = never
ij_typescript_while_on_new_line = false
ij_typescript_wrap_comments = false
[{*.bash,*.sh,*.zsh}]
ij_shell_binary_ops_start_line = false
ij_shell_keep_column_alignment_padding = false
ij_shell_minify_program = false
ij_shell_redirect_followed_by_space = false
ij_shell_switch_cases_indented = false
[{*.cjs,*.js}]
max_line_length = 80
ij_javascript_align_imports = false
ij_javascript_align_multiline_array_initializer_expression = false
ij_javascript_align_multiline_binary_operation = false
ij_javascript_align_multiline_chained_methods = false
ij_javascript_align_multiline_extends_list = false
ij_javascript_align_multiline_for = false
ij_javascript_align_multiline_parameters = false
ij_javascript_align_multiline_parameters_in_calls = false
ij_javascript_align_multiline_ternary_operation = false
ij_javascript_align_object_properties = 0
ij_javascript_align_union_types = false
ij_javascript_align_var_statements = 0
ij_javascript_array_initializer_new_line_after_left_brace = false
ij_javascript_array_initializer_right_brace_on_new_line = false
ij_javascript_array_initializer_wrap = normal
ij_javascript_assignment_wrap = off
ij_javascript_binary_operation_sign_on_next_line = true
ij_javascript_binary_operation_wrap = normal
ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/**
ij_javascript_blank_lines_after_imports = 1
ij_javascript_blank_lines_around_class = 1
ij_javascript_blank_lines_around_field = 0
ij_javascript_blank_lines_around_function = 1
ij_javascript_blank_lines_around_method = 1
ij_javascript_block_brace_style = end_of_line
ij_javascript_call_parameters_new_line_after_left_paren = false
ij_javascript_call_parameters_right_paren_on_new_line = false
ij_javascript_call_parameters_wrap = normal
ij_javascript_catch_on_new_line = false
ij_javascript_chained_call_dot_on_new_line = true
ij_javascript_class_brace_style = end_of_line
ij_javascript_comma_on_new_line = false
ij_javascript_do_while_brace_force = always
ij_javascript_else_on_new_line = false
ij_javascript_enforce_trailing_comma = keep
ij_javascript_extends_keyword_wrap = off
ij_javascript_extends_list_wrap = off
ij_javascript_field_prefix = _
ij_javascript_file_name_style = relaxed
ij_javascript_finally_on_new_line = false
ij_javascript_for_brace_force = always
ij_javascript_for_statement_new_line_after_left_paren = false
ij_javascript_for_statement_right_paren_on_new_line = false
ij_javascript_for_statement_wrap = normal
ij_javascript_force_quote_style = false
ij_javascript_force_semicolon_style = false
ij_javascript_function_expression_brace_style = end_of_line
ij_javascript_if_brace_force = always
ij_javascript_import_merge_members = global
ij_javascript_import_prefer_absolute_path = global
ij_javascript_import_sort_members = true
ij_javascript_import_sort_module_name = false
ij_javascript_import_use_node_resolution = true
ij_javascript_imports_wrap = on_every_item
ij_javascript_indent_case_from_switch = true
ij_javascript_indent_chained_calls = false
ij_javascript_indent_package_children = 0
ij_javascript_jsx_attribute_value = braces
ij_javascript_keep_blank_lines_in_code = 1
ij_javascript_keep_first_column_comment = true
ij_javascript_keep_indents_on_empty_lines = false
ij_javascript_keep_line_breaks = true
ij_javascript_keep_simple_blocks_in_one_line = false
ij_javascript_keep_simple_methods_in_one_line = false
ij_javascript_line_comment_add_space = true
ij_javascript_line_comment_at_first_column = false
ij_javascript_method_brace_style = end_of_line
ij_javascript_method_call_chain_wrap = off
ij_javascript_method_parameters_new_line_after_left_paren = false
ij_javascript_method_parameters_right_paren_on_new_line = false
ij_javascript_method_parameters_wrap = normal
ij_javascript_object_literal_wrap = on_every_item
ij_javascript_parentheses_expression_new_line_after_left_paren = false
ij_javascript_parentheses_expression_right_paren_on_new_line = false
ij_javascript_place_assignment_sign_on_next_line = false
ij_javascript_prefer_as_type_cast = false
ij_javascript_prefer_explicit_types_function_expression_returns = false
ij_javascript_prefer_explicit_types_function_returns = false
ij_javascript_prefer_explicit_types_vars_fields = false
ij_javascript_prefer_parameters_wrap = false
ij_javascript_reformat_c_style_comments = false
ij_javascript_space_after_colon = true
ij_javascript_space_after_comma = true
ij_javascript_space_after_dots_in_rest_parameter = false
ij_javascript_space_after_generator_mult = true
ij_javascript_space_after_property_colon = true
ij_javascript_space_after_quest = true
ij_javascript_space_after_type_colon = true
ij_javascript_space_after_unary_not = false
ij_javascript_space_before_async_arrow_lparen = true
ij_javascript_space_before_catch_keyword = true
ij_javascript_space_before_catch_left_brace = true
ij_javascript_space_before_catch_parentheses = true
ij_javascript_space_before_class_lbrace = true
ij_javascript_space_before_class_left_brace = true
ij_javascript_space_before_colon = true
ij_javascript_space_before_comma = false
ij_javascript_space_before_do_left_brace = true
ij_javascript_space_before_else_keyword = true
ij_javascript_space_before_else_left_brace = true
ij_javascript_space_before_finally_keyword = true
ij_javascript_space_before_finally_left_brace = true
ij_javascript_space_before_for_left_brace = true
ij_javascript_space_before_for_parentheses = true
ij_javascript_space_before_for_semicolon = false
ij_javascript_space_before_function_left_parenth = true
ij_javascript_space_before_generator_mult = false
ij_javascript_space_before_if_left_brace = true
ij_javascript_space_before_if_parentheses = true
ij_javascript_space_before_method_call_parentheses = false
ij_javascript_space_before_method_left_brace = true
ij_javascript_space_before_method_parentheses = false
ij_javascript_space_before_property_colon = false
ij_javascript_space_before_quest = true
ij_javascript_space_before_switch_left_brace = true
ij_javascript_space_before_switch_parentheses = true
ij_javascript_space_before_try_left_brace = true
ij_javascript_space_before_type_colon = false
ij_javascript_space_before_unary_not = false
ij_javascript_space_before_while_keyword = true
ij_javascript_space_before_while_left_brace = true
ij_javascript_space_before_while_parentheses = true
ij_javascript_spaces_around_additive_operators = true
ij_javascript_spaces_around_arrow_function_operator = true
ij_javascript_spaces_around_assignment_operators = true
ij_javascript_spaces_around_bitwise_operators = true
ij_javascript_spaces_around_equality_operators = true
ij_javascript_spaces_around_logical_operators = true
ij_javascript_spaces_around_multiplicative_operators = true
ij_javascript_spaces_around_relational_operators = true
ij_javascript_spaces_around_shift_operators = true
ij_javascript_spaces_around_unary_operator = false
ij_javascript_spaces_within_array_initializer_brackets = false
ij_javascript_spaces_within_brackets = false
ij_javascript_spaces_within_catch_parentheses = false
ij_javascript_spaces_within_for_parentheses = false
ij_javascript_spaces_within_if_parentheses = false
ij_javascript_spaces_within_imports = false
ij_javascript_spaces_within_interpolation_expressions = false
ij_javascript_spaces_within_method_call_parentheses = false
ij_javascript_spaces_within_method_parentheses = false
ij_javascript_spaces_within_object_literal_braces = false
ij_javascript_spaces_within_object_type_braces = true
ij_javascript_spaces_within_parentheses = false
ij_javascript_spaces_within_switch_parentheses = false
ij_javascript_spaces_within_type_assertion = false
ij_javascript_spaces_within_union_types = true
ij_javascript_spaces_within_while_parentheses = false
ij_javascript_special_else_if_treatment = true
ij_javascript_ternary_operation_signs_on_next_line = true
ij_javascript_ternary_operation_wrap = normal
ij_javascript_union_types_wrap = on_every_item
ij_javascript_use_chained_calls_group_indents = false
ij_javascript_use_double_quotes = true
ij_javascript_use_explicit_js_extension = global
ij_javascript_use_path_mapping = always
ij_javascript_use_public_modifier = false
ij_javascript_use_semicolon_after_statement = true
ij_javascript_var_declaration_wrap = normal
ij_javascript_while_brace_force = always
ij_javascript_while_on_new_line = false
ij_javascript_wrap_comments = false
[{*.cjsx,*.coffee}]
ij_continuation_indent_size = 2
ij_coffeescript_align_function_body = false
ij_coffeescript_align_imports = false
ij_coffeescript_align_multiline_array_initializer_expression = true
ij_coffeescript_align_multiline_parameters = true
ij_coffeescript_align_multiline_parameters_in_calls = false
ij_coffeescript_align_object_properties = 0
ij_coffeescript_align_union_types = false
ij_coffeescript_align_var_statements = 0
ij_coffeescript_array_initializer_new_line_after_left_brace = false
ij_coffeescript_array_initializer_right_brace_on_new_line = false
ij_coffeescript_array_initializer_wrap = normal
ij_coffeescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/**
ij_coffeescript_blank_lines_around_function = 1
ij_coffeescript_call_parameters_new_line_after_left_paren = false
ij_coffeescript_call_parameters_right_paren_on_new_line = false
ij_coffeescript_call_parameters_wrap = normal
ij_coffeescript_chained_call_dot_on_new_line = true
ij_coffeescript_comma_on_new_line = false
ij_coffeescript_enforce_trailing_comma = keep
ij_coffeescript_field_prefix = _
ij_coffeescript_file_name_style = relaxed
ij_coffeescript_force_quote_style = false
ij_coffeescript_force_semicolon_style = false
ij_coffeescript_function_expression_brace_style = end_of_line
ij_coffeescript_import_merge_members = global
ij_coffeescript_import_prefer_absolute_path = global
ij_coffeescript_import_sort_members = true
ij_coffeescript_import_sort_module_name = false
ij_coffeescript_import_use_node_resolution = true
ij_coffeescript_imports_wrap = on_every_item
ij_coffeescript_indent_chained_calls = true
ij_coffeescript_indent_package_children = 0
ij_coffeescript_jsx_attribute_value = braces
ij_coffeescript_keep_blank_lines_in_code = 2
ij_coffeescript_keep_first_column_comment = true
ij_coffeescript_keep_indents_on_empty_lines = false
ij_coffeescript_keep_line_breaks = true
ij_coffeescript_keep_simple_methods_in_one_line = false
ij_coffeescript_method_parameters_new_line_after_left_paren = false
ij_coffeescript_method_parameters_right_paren_on_new_line = false
ij_coffeescript_method_parameters_wrap = off
ij_coffeescript_object_literal_wrap = on_every_item
ij_coffeescript_prefer_as_type_cast = false
ij_coffeescript_prefer_explicit_types_function_expression_returns = false
ij_coffeescript_prefer_explicit_types_function_returns = false
ij_coffeescript_prefer_explicit_types_vars_fields = false
ij_coffeescript_reformat_c_style_comments = false
ij_coffeescript_space_after_comma = true
ij_coffeescript_space_after_dots_in_rest_parameter = false
ij_coffeescript_space_after_generator_mult = true
ij_coffeescript_space_after_property_colon = true
ij_coffeescript_space_after_type_colon = true
ij_coffeescript_space_after_unary_not = false
ij_coffeescript_space_before_async_arrow_lparen = true
ij_coffeescript_space_before_class_lbrace = true
ij_coffeescript_space_before_comma = false
ij_coffeescript_space_before_function_left_parenth = true
ij_coffeescript_space_before_generator_mult = false
ij_coffeescript_space_before_property_colon = false
ij_coffeescript_space_before_type_colon = false
ij_coffeescript_space_before_unary_not = false
ij_coffeescript_spaces_around_additive_operators = true
ij_coffeescript_spaces_around_arrow_function_operator = true
ij_coffeescript_spaces_around_assignment_operators = true
ij_coffeescript_spaces_around_bitwise_operators = true
ij_coffeescript_spaces_around_equality_operators = true
ij_coffeescript_spaces_around_logical_operators = true
ij_coffeescript_spaces_around_multiplicative_operators = true
ij_coffeescript_spaces_around_relational_operators = true
ij_coffeescript_spaces_around_shift_operators = true
ij_coffeescript_spaces_around_unary_operator = false
ij_coffeescript_spaces_within_array_initializer_braces = false
ij_coffeescript_spaces_within_array_initializer_brackets = false
ij_coffeescript_spaces_within_imports = false
ij_coffeescript_spaces_within_index_brackets = false
ij_coffeescript_spaces_within_interpolation_expressions = false
ij_coffeescript_spaces_within_method_call_parentheses = false
ij_coffeescript_spaces_within_method_parentheses = false
ij_coffeescript_spaces_within_object_braces = false
ij_coffeescript_spaces_within_object_literal_braces = false
ij_coffeescript_spaces_within_object_type_braces = true
ij_coffeescript_spaces_within_range_brackets = false
ij_coffeescript_spaces_within_type_assertion = false
ij_coffeescript_spaces_within_union_types = true
ij_coffeescript_union_types_wrap = on_every_item
ij_coffeescript_use_chained_calls_group_indents = false
ij_coffeescript_use_double_quotes = true
ij_coffeescript_use_explicit_js_extension = global
ij_coffeescript_use_path_mapping = always
ij_coffeescript_use_public_modifier = false
ij_coffeescript_use_semicolon_after_statement = false
ij_coffeescript_var_declaration_wrap = normal
[{*.dot,*.gv}]
indent_size = 4
ij_continuation_indent_size = 8
ij_dot_keep_blank_lines_in_code = 2
ij_dot_keep_indents_on_empty_lines = false
ij_dot_label_indent_absolute = false
ij_dot_label_indent_size = 0
ij_dot_space_after_colon = true
ij_dot_space_after_for_semicolon = true
ij_dot_space_before_class_left_brace = true
ij_dot_space_before_for_semicolon = false
ij_dot_space_before_method_left_brace = true
ij_dot_spaces_around_assignment_operators = true
ij_dot_spaces_around_equality_operators = true
ij_dot_spaces_within_brackets = false
ij_dot_use_relative_indents = false
[{*.erb,*.rhtml}]
ij_continuation_indent_size = 2
ij_rhtml_keep_indents_on_empty_lines = false
[{*.ft,*.vm,*.vsl}]
indent_size = 4
ij_continuation_indent_size = 8
ij_vtl_keep_indents_on_empty_lines = false
[{*.gant,*.gradle,*.groovy,*.gson,*.gy}]
indent_size = 4
ij_continuation_indent_size = 8
ij_groovy_align_group_field_declarations = false
ij_groovy_align_multiline_array_initializer_expression = false
ij_groovy_align_multiline_assignment = false
ij_groovy_align_multiline_binary_operation = false
ij_groovy_align_multiline_chained_methods = false
ij_groovy_align_multiline_extends_list = false
ij_groovy_align_multiline_for = true
ij_groovy_align_multiline_list_or_map = true
ij_groovy_align_multiline_method_parentheses = false
ij_groovy_align_multiline_parameters = true
ij_groovy_align_multiline_parameters_in_calls = false
ij_groovy_align_multiline_resources = true
ij_groovy_align_multiline_ternary_operation = false
ij_groovy_align_multiline_throws_list = false
ij_groovy_align_named_args_in_map = true
ij_groovy_align_throws_keyword = false
ij_groovy_array_initializer_new_line_after_left_brace = false
ij_groovy_array_initializer_right_brace_on_new_line = false
ij_groovy_array_initializer_wrap = off
ij_groovy_assert_statement_wrap = off
ij_groovy_assignment_wrap = off
ij_groovy_binary_operation_wrap = off
ij_groovy_blank_lines_after_class_header = 0
ij_groovy_blank_lines_after_imports = 1
ij_groovy_blank_lines_after_package = 1
ij_groovy_blank_lines_around_class = 1
ij_groovy_blank_lines_around_field = 0
ij_groovy_blank_lines_around_field_in_interface = 0
ij_groovy_blank_lines_around_method = 1
ij_groovy_blank_lines_around_method_in_interface = 1
ij_groovy_blank_lines_before_imports = 1
ij_groovy_blank_lines_before_method_body = 0
ij_groovy_blank_lines_before_package = 0
ij_groovy_block_brace_style = end_of_line
ij_groovy_block_comment_at_first_column = true
ij_groovy_call_parameters_new_line_after_left_paren = false
ij_groovy_call_parameters_right_paren_on_new_line = false
ij_groovy_call_parameters_wrap = off
ij_groovy_catch_on_new_line = false
ij_groovy_class_annotation_wrap = split_into_lines
ij_groovy_class_brace_style = end_of_line
ij_groovy_class_count_to_use_import_on_demand = 5
ij_groovy_do_while_brace_force = never
ij_groovy_else_on_new_line = false
ij_groovy_enum_constants_wrap = off
ij_groovy_extends_keyword_wrap = off
ij_groovy_extends_list_wrap = off
ij_groovy_field_annotation_wrap = split_into_lines
ij_groovy_finally_on_new_line = false
ij_groovy_for_brace_force = never
ij_groovy_for_statement_new_line_after_left_paren = false
ij_groovy_for_statement_right_paren_on_new_line = false
ij_groovy_for_statement_wrap = off
ij_groovy_if_brace_force = never
ij_groovy_import_annotation_wrap = 2
ij_groovy_imports_layout = *,|,javax.**,java.**,|,$*
ij_groovy_indent_case_from_switch = true
ij_groovy_indent_label_blocks = true
ij_groovy_insert_inner_class_imports = false
ij_groovy_keep_blank_lines_before_right_brace = 2
ij_groovy_keep_blank_lines_in_code = 2
ij_groovy_keep_blank_lines_in_declarations = 2
ij_groovy_keep_control_statement_in_one_line = true
ij_groovy_keep_first_column_comment = true
ij_groovy_keep_indents_on_empty_lines = false
ij_groovy_keep_line_breaks = true
ij_groovy_keep_multiple_expressions_in_one_line = false
ij_groovy_keep_simple_blocks_in_one_line = false
ij_groovy_keep_simple_classes_in_one_line = true
ij_groovy_keep_simple_lambdas_in_one_line = true
ij_groovy_keep_simple_methods_in_one_line = true
ij_groovy_label_indent_absolute = false
ij_groovy_label_indent_size = 0
ij_groovy_lambda_brace_style = end_of_line
ij_groovy_layout_static_imports_separately = true
ij_groovy_line_comment_add_space = false
ij_groovy_line_comment_at_first_column = true
ij_groovy_method_annotation_wrap = split_into_lines
ij_groovy_method_brace_style = end_of_line
ij_groovy_method_call_chain_wrap = off
ij_groovy_method_parameters_new_line_after_left_paren = false
ij_groovy_method_parameters_right_paren_on_new_line = false
ij_groovy_method_parameters_wrap = off
ij_groovy_modifier_list_wrap = false
ij_groovy_names_count_to_use_import_on_demand = 3
ij_groovy_parameter_annotation_wrap = off
ij_groovy_parentheses_expression_new_line_after_left_paren = false
ij_groovy_parentheses_expression_right_paren_on_new_line = false
ij_groovy_prefer_parameters_wrap = false
ij_groovy_resource_list_new_line_after_left_paren = false
ij_groovy_resource_list_right_paren_on_new_line = false
ij_groovy_resource_list_wrap = off
ij_groovy_space_after_assert_separator = true
ij_groovy_space_after_colon = true
ij_groovy_space_after_comma = true
ij_groovy_space_after_comma_in_type_arguments = true
ij_groovy_space_after_for_semicolon = true
ij_groovy_space_after_quest = true
ij_groovy_space_after_type_cast = true
ij_groovy_space_before_annotation_parameter_list = false
ij_groovy_space_before_array_initializer_left_brace = false
ij_groovy_space_before_assert_separator = false
ij_groovy_space_before_catch_keyword = true
ij_groovy_space_before_catch_left_brace = true
ij_groovy_space_before_catch_parentheses = true
ij_groovy_space_before_class_left_brace = true
ij_groovy_space_before_closure_left_brace = true
ij_groovy_space_before_colon = true
ij_groovy_space_before_comma = false
ij_groovy_space_before_do_left_brace = true
ij_groovy_space_before_else_keyword = true
ij_groovy_space_before_else_left_brace = true
ij_groovy_space_before_finally_keyword = true
ij_groovy_space_before_finally_left_brace = true
ij_groovy_space_before_for_left_brace = true
ij_groovy_space_before_for_parentheses = true
ij_groovy_space_before_for_semicolon = false
ij_groovy_space_before_if_left_brace = true
ij_groovy_space_before_if_parentheses = true
ij_groovy_space_before_method_call_parentheses = false
ij_groovy_space_before_method_left_brace = true
ij_groovy_space_before_method_parentheses = false
ij_groovy_space_before_quest = true
ij_groovy_space_before_switch_left_brace = true
ij_groovy_space_before_switch_parentheses = true
ij_groovy_space_before_synchronized_left_brace = true
ij_groovy_space_before_synchronized_parentheses = true
ij_groovy_space_before_try_left_brace = true
ij_groovy_space_before_try_parentheses = true
ij_groovy_space_before_while_keyword = true
ij_groovy_space_before_while_left_brace = true
ij_groovy_space_before_while_parentheses = true
ij_groovy_space_in_named_argument = true
ij_groovy_space_in_named_argument_before_colon = false
ij_groovy_space_within_empty_array_initializer_braces = false
ij_groovy_space_within_empty_method_call_parentheses = false
ij_groovy_spaces_around_additive_operators = true
ij_groovy_spaces_around_assignment_operators = true
ij_groovy_spaces_around_bitwise_operators = true
ij_groovy_spaces_around_equality_operators = true
ij_groovy_spaces_around_lambda_arrow = true
ij_groovy_spaces_around_logical_operators = true
ij_groovy_spaces_around_multiplicative_operators = true
ij_groovy_spaces_around_regex_operators = true
ij_groovy_spaces_around_relational_operators = true
ij_groovy_spaces_around_shift_operators = true
ij_groovy_spaces_within_annotation_parentheses = false
ij_groovy_spaces_within_array_initializer_braces = false
ij_groovy_spaces_within_braces = true
ij_groovy_spaces_within_brackets = false
ij_groovy_spaces_within_cast_parentheses = false
ij_groovy_spaces_within_catch_parentheses = false
ij_groovy_spaces_within_for_parentheses = false
ij_groovy_spaces_within_gstring_injection_braces = false
ij_groovy_spaces_within_if_parentheses = false
ij_groovy_spaces_within_list_or_map = false
ij_groovy_spaces_within_method_call_parentheses = false
ij_groovy_spaces_within_method_parentheses = false
ij_groovy_spaces_within_parentheses = false
ij_groovy_spaces_within_switch_parentheses = false
ij_groovy_spaces_within_synchronized_parentheses = false
ij_groovy_spaces_within_try_parentheses = false
ij_groovy_spaces_within_tuple_expression = false
ij_groovy_spaces_within_while_parentheses = false
ij_groovy_special_else_if_treatment = true
ij_groovy_ternary_operation_wrap = off
ij_groovy_throws_keyword_wrap = off
ij_groovy_throws_list_wrap = off
ij_groovy_use_flying_geese_braces = false
ij_groovy_use_fq_class_names = false
ij_groovy_use_fq_class_names_in_javadoc = true
ij_groovy_use_relative_indents = false
ij_groovy_use_single_class_imports = true
ij_groovy_variable_annotation_wrap = off
ij_groovy_while_brace_force = never
ij_groovy_while_on_new_line = false
ij_groovy_wrap_long_lines = false
[{*.gemspec,*.jbuilder,*.rake,*.rb,*.rbw,*.ru,*.thor,.simplecov,capfile,cucumber,gemfile,guardfile,isolate,rails,rake,rakefile,rcov,spec,spork,vagrantfile}]
ij_ruby_align_group_field_declarations = false
ij_ruby_align_multiline_parameters = true
ij_ruby_blank_lines_around_class = 1
ij_ruby_blank_lines_around_method = 1
ij_ruby_chain_calls_alignment = 2
ij_ruby_convert_brace_block_by_enter = true
ij_ruby_empty_declarations_style = 1
ij_ruby_force_newlines_around_visibility_mods = true
ij_ruby_indent_private_methods = false
ij_ruby_indent_protected_methods = false
ij_ruby_indent_public_methods = false
ij_ruby_indent_when_cases = false
ij_ruby_keep_blank_lines_in_code = 1
ij_ruby_keep_blank_lines_in_declarations = 1
ij_ruby_keep_line_breaks = true
ij_ruby_parentheses_around_method_arguments = true
ij_ruby_spaces_around_assignment_operators = true
ij_ruby_spaces_around_hashrocket = true
ij_ruby_spaces_around_other_operators = true
ij_ruby_spaces_around_range_operators = false
ij_ruby_spaces_around_relational_operators = true
ij_ruby_spaces_within_array_initializer_braces = true
ij_ruby_spaces_within_braces = true
[{*.gradle.kts,*.kt,*.kts,*.main.kts}]
indent_size = 4
ij_continuation_indent_size = 8
ij_kotlin_align_in_columns_case_branch = false
ij_kotlin_align_multiline_binary_operation = false
ij_kotlin_align_multiline_extends_list = false
ij_kotlin_align_multiline_method_parentheses = false
ij_kotlin_align_multiline_parameters = true
ij_kotlin_align_multiline_parameters_in_calls = false
ij_kotlin_allow_trailing_comma = false
ij_kotlin_allow_trailing_comma_on_call_site = false
ij_kotlin_assignment_wrap = off
ij_kotlin_blank_lines_after_class_header = 0
ij_kotlin_blank_lines_around_block_when_branches = 0
ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1
ij_kotlin_block_comment_at_first_column = true
ij_kotlin_call_parameters_new_line_after_left_paren = false
ij_kotlin_call_parameters_right_paren_on_new_line = false
ij_kotlin_call_parameters_wrap = off
ij_kotlin_catch_on_new_line = false
ij_kotlin_class_annotation_wrap = split_into_lines
ij_kotlin_continuation_indent_for_chained_calls = true
ij_kotlin_continuation_indent_for_expression_bodies = true
ij_kotlin_continuation_indent_in_argument_lists = true
ij_kotlin_continuation_indent_in_elvis = true
ij_kotlin_continuation_indent_in_if_conditions = true
ij_kotlin_continuation_indent_in_parameter_lists = true
ij_kotlin_continuation_indent_in_supertype_lists = true
ij_kotlin_else_on_new_line = false
ij_kotlin_enum_constants_wrap = off
ij_kotlin_extends_list_wrap = off
ij_kotlin_field_annotation_wrap = split_into_lines
ij_kotlin_finally_on_new_line = false
ij_kotlin_if_rparen_on_new_line = false
ij_kotlin_import_nested_classes = false
ij_kotlin_imports_layout = *
ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
ij_kotlin_keep_blank_lines_before_right_brace = 2
ij_kotlin_keep_blank_lines_in_code = 2
ij_kotlin_keep_blank_lines_in_declarations = 2
ij_kotlin_keep_first_column_comment = true
ij_kotlin_keep_indents_on_empty_lines = false
ij_kotlin_keep_line_breaks = true
ij_kotlin_lbrace_on_next_line = false
ij_kotlin_line_comment_add_space = false
ij_kotlin_line_comment_at_first_column = true
ij_kotlin_method_annotation_wrap = split_into_lines
ij_kotlin_method_call_chain_wrap = off
ij_kotlin_method_parameters_new_line_after_left_paren = false
ij_kotlin_method_parameters_right_paren_on_new_line = false
ij_kotlin_method_parameters_wrap = off
ij_kotlin_name_count_to_use_star_import = 999
ij_kotlin_name_count_to_use_star_import_for_members = 999
ij_kotlin_packages_to_use_import_on_demand =
ij_kotlin_parameter_annotation_wrap = off
ij_kotlin_space_after_comma = true
ij_kotlin_space_after_extend_colon = true
ij_kotlin_space_after_type_colon = true
ij_kotlin_space_before_catch_parentheses = true
ij_kotlin_space_before_comma = false
ij_kotlin_space_before_extend_colon = true
ij_kotlin_space_before_for_parentheses = true
ij_kotlin_space_before_if_parentheses = true
ij_kotlin_space_before_lambda_arrow = true
ij_kotlin_space_before_type_colon = false
ij_kotlin_space_before_when_parentheses = true
ij_kotlin_space_before_while_parentheses = true
ij_kotlin_spaces_around_additive_operators = true
ij_kotlin_spaces_around_assignment_operators = true
ij_kotlin_spaces_around_equality_operators = true
ij_kotlin_spaces_around_function_type_arrow = true
ij_kotlin_spaces_around_logical_operators = true
ij_kotlin_spaces_around_multiplicative_operators = true
ij_kotlin_spaces_around_range = false
ij_kotlin_spaces_around_relational_operators = true
ij_kotlin_spaces_around_unary_operator = false
ij_kotlin_spaces_around_when_arrow = true
ij_kotlin_variable_annotation_wrap = off
ij_kotlin_while_on_new_line = false
ij_kotlin_wrap_elvis_expressions = 1
ij_kotlin_wrap_expression_body_functions = 0
ij_kotlin_wrap_first_method_in_call_chain = false
[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,jest.config}]
ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false
ij_json_keep_line_breaks = true
ij_json_space_after_colon = true
ij_json_space_after_comma = true
ij_json_space_before_colon = true
ij_json_space_before_comma = false
ij_json_spaces_within_braces = false
ij_json_spaces_within_brackets = false
ij_json_wrap_long_lines = false
[{*.hcl,*.nomad}]
ij_continuation_indent_size = 8
ij_hcl_array_wrapping = 2
ij_hcl_keep_blank_lines_in_code = 2
ij_hcl_keep_indents_on_empty_lines = false
ij_hcl_keep_line_breaks = true
ij_hcl_object_wrapping = 2
ij_hcl_property_alignment = 0
ij_hcl_property_line_commenter_character = 0
ij_hcl_space_after_comma = true
ij_hcl_space_before_comma = false
ij_hcl_spaces_around_assignment_operators = true
ij_hcl_spaces_within_braces = false
ij_hcl_spaces_within_brackets = false
ij_hcl_wrap_long_lines = false
[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}]
ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
ij_html_align_attributes = true
ij_html_align_text = false
ij_html_attribute_wrap = normal
ij_html_block_comment_at_first_column = true
ij_html_do_not_align_children_of_min_lines = 0
ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p
ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot
ij_html_enforce_quotes = false
ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var
ij_html_keep_blank_lines = 2
ij_html_keep_indents_on_empty_lines = false
ij_html_keep_line_breaks = true
ij_html_keep_line_breaks_in_text = true
ij_html_keep_whitespaces = false
ij_html_keep_whitespaces_inside = span,pre,textarea
ij_html_line_comment_at_first_column = true
ij_html_new_line_after_last_attribute = never
ij_html_new_line_before_first_attribute = never
ij_html_quote_style = double
ij_html_remove_new_line_before_tags = br
ij_html_space_after_tag_name = false
ij_html_space_around_equality_in_attribute = false
ij_html_space_inside_empty_tag = false
ij_html_text_wrap = normal
ij_html_uniform_ident = false
[{*.jsf,*.jsp,*.jspf,*.tag,*.tagf,*.xjsp}]
indent_size = 4
ij_continuation_indent_size = 8
ij_jsp_jsp_prefer_comma_separated_import_list = false
ij_jsp_keep_indents_on_empty_lines = false
[{*.jspx,*.tagx}]
indent_size = 4
ij_continuation_indent_size = 8
ij_jspx_keep_indents_on_empty_lines = false
[{*.lua,*.lua.txt}]
indent_size = 4
ij_continuation_indent_size = 8
ij_lua_align_consecutive_variable_declarations = false
ij_lua_align_multiline_parameters = true
ij_lua_align_multiline_parameters_in_calls = false
ij_lua_call_parameters_wrap = off
ij_lua_keep_indents_on_empty_lines = false
ij_lua_keep_simple_blocks_in_one_line = false
ij_lua_method_parameters_wrap = off
ij_lua_space_after_comma = true
ij_lua_space_before_comma = false
ij_lua_spaces_around_assignment_operators = true
[{*.markdown,*.md}]
indent_size = 4
ij_continuation_indent_size = 8
ij_markdown_force_one_space_after_blockquote_symbol = true
ij_markdown_force_one_space_after_header_symbol = true
ij_markdown_force_one_space_after_list_bullet = true
ij_markdown_force_one_space_between_words = true
ij_markdown_keep_indents_on_empty_lines = false
ij_markdown_max_lines_around_block_elements = 1
ij_markdown_max_lines_around_header = 1
ij_markdown_max_lines_between_paragraphs = 1
ij_markdown_min_lines_around_block_elements = 1
ij_markdown_min_lines_around_header = 1
ij_markdown_min_lines_between_paragraphs = 1
[{*.pb,*.textproto}]
ij_prototext_keep_blank_lines_in_code = 2
ij_prototext_keep_indents_on_empty_lines = false
ij_prototext_keep_line_breaks = true
ij_prototext_space_after_colon = true
ij_prototext_space_after_comma = true
ij_prototext_space_before_colon = false
ij_prototext_space_before_comma = false
ij_prototext_spaces_within_braces = false
ij_prototext_spaces_within_brackets = false
[{*.properties,spring.handlers,spring.schemas}]
ij_properties_align_group_field_declarations = false
ij_properties_keep_blank_lines = false
ij_properties_key_value_delimiter = equals
ij_properties_spaces_around_key_value_delimiter = false
[{*.py,*.pyw}]
max_line_length = 80
ij_python_align_collections_and_comprehensions = true
ij_python_align_multiline_imports = true
ij_python_align_multiline_parameters = false
ij_python_align_multiline_parameters_in_calls = true
ij_python_blank_line_at_file_end = true
ij_python_blank_lines_after_imports = 1
ij_python_blank_lines_after_local_imports = 0
ij_python_blank_lines_around_class = 1
ij_python_blank_lines_around_method = 1
ij_python_blank_lines_around_top_level_classes_functions = 2
ij_python_blank_lines_before_first_method = 0
ij_python_dict_alignment = 0
ij_python_dict_new_line_after_left_brace = false
ij_python_dict_new_line_before_right_brace = false
ij_python_dict_wrapping = 1
ij_python_from_import_new_line_after_left_parenthesis = false
ij_python_from_import_new_line_before_right_parenthesis = false
ij_python_from_import_parentheses_force_if_multiline = false
ij_python_from_import_trailing_comma_if_multiline = false
ij_python_from_import_wrapping = 1
ij_python_hang_closing_brackets = false
ij_python_keep_blank_lines_in_code = 1
ij_python_keep_blank_lines_in_declarations = 1
ij_python_keep_indents_on_empty_lines = false
ij_python_keep_line_breaks = true
ij_python_new_line_after_colon = false
ij_python_new_line_after_colon_multi_clause = true
ij_python_optimize_imports_always_split_from_imports = false
ij_python_optimize_imports_case_insensitive_order = false
ij_python_optimize_imports_join_from_imports_with_same_source = false
ij_python_optimize_imports_sort_by_type_first = true
ij_python_optimize_imports_sort_imports = true
ij_python_optimize_imports_sort_names_in_from_imports = false
ij_python_space_after_comma = true
ij_python_space_after_number_sign = true
ij_python_space_after_py_colon = true
ij_python_space_before_backslash = true
ij_python_space_before_comma = false
ij_python_space_before_for_semicolon = false
ij_python_space_before_lbracket = false
ij_python_space_before_method_call_parentheses = false
ij_python_space_before_method_parentheses = false
ij_python_space_before_number_sign = true
ij_python_space_before_py_colon = false
ij_python_space_within_empty_method_call_parentheses = false
ij_python_space_within_empty_method_parentheses = false
ij_python_spaces_around_additive_operators = true
ij_python_spaces_around_assignment_operators = true
ij_python_spaces_around_bitwise_operators = true
ij_python_spaces_around_eq_in_keyword_argument = false
ij_python_spaces_around_eq_in_named_parameter = false
ij_python_spaces_around_equality_operators = true
ij_python_spaces_around_multiplicative_operators = true
ij_python_spaces_around_power_operator = true
ij_python_spaces_around_relational_operators = true
ij_python_spaces_around_shift_operators = true
ij_python_spaces_within_braces = false
ij_python_spaces_within_brackets = false
ij_python_spaces_within_method_call_parentheses = false
ij_python_spaces_within_method_parentheses = false
ij_python_use_continuation_indent_for_arguments = true
ij_python_use_continuation_indent_for_collection_and_comprehensions = false
ij_python_wrap_long_lines = false
[{*.tf,*.tfvars}]
ij_continuation_indent_size = 8
ij_hcl-terraform_array_wrapping = 2
ij_hcl-terraform_keep_blank_lines_in_code = 2
ij_hcl-terraform_keep_indents_on_empty_lines = false
ij_hcl-terraform_keep_line_breaks = true
ij_hcl-terraform_object_wrapping = 2
ij_hcl-terraform_property_alignment = 0
ij_hcl-terraform_property_line_commenter_character = 0
ij_hcl-terraform_space_after_comma = true
ij_hcl-terraform_space_before_comma = false
ij_hcl-terraform_spaces_around_assignment_operators = true
ij_hcl-terraform_spaces_within_braces = false
ij_hcl-terraform_spaces_within_brackets = false
ij_hcl-terraform_wrap_long_lines = false
[{*.toml,Cargo.lock,Gopkg.lock,Pipfile}]
indent_size = 4
ij_continuation_indent_size = 8
ij_toml_keep_indents_on_empty_lines = false
[{*.yaml,*.yml}]
ij_yaml_align_values_properties = do_not_align
ij_yaml_autoinsert_sequence_marker = true
ij_yaml_block_mapping_on_new_line = false
ij_yaml_indent_sequence_value = true
ij_yaml_keep_indents_on_empty_lines = false
ij_yaml_keep_line_breaks = true
ij_yaml_sequence_on_new_line = false
ij_yaml_space_before_colon = false
ij_yaml_spaces_within_braces = true
ij_yaml_spaces_within_brackets = true
================================================
FILE: .github/FUNDING.yml
================================================
# Copyright 2021 Signal Messenger, LLC
# SPDX-License-Identifier: AGPL-3.0-only
custom: https://signal.org/donate/
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: monthly
groups:
minor-actions-dependencies:
# GitHub Actions: Only group minor and patch updates (we want to carefully review major updates)
update-types: [ minor, patch ]
- package-ecosystem: maven
directory: /
schedule:
interval: monthly
groups:
minor-java-dependencies:
# Java: Only group minor and patch updates (we want to carefully review major updates)
update-types: [ minor, patch ]
================================================
FILE: .github/stale.yml
================================================
================================================
FILE: .github/workflows/documentation.yml
================================================
name: Update Documentation
on:
push:
branches:
- main
jobs:
build:
permissions:
contents: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with:
distribution: 'temurin'
java-version-file: .java-version
cache: 'maven'
- name: Compile and Build OpenAPI file
run: ./mvnw compile
- name: Update Documentation
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cp -r api-doc/target/openapi/signal-server-openapi.yaml /tmp/
git config user.email "github@signal.org"
git config user.name "Documentation Updater"
git fetch origin gh-pages
git checkout gh-pages
cp /tmp/signal-server-openapi.yaml .
git diff --quiet || git commit -a -m "Updating documentation"
git push origin gh-pages -q
================================================
FILE: .github/workflows/integration-tests.yml
================================================
name: Integration Tests
on:
schedule:
- cron: '30 19 * * MON-FRI'
workflow_dispatch:
env:
# This may seem a little redundant, but copying the configuration to an environment variable makes it easier and safer
# to then write its contents to a file
INTEGRATION_TEST_CONFIG: ${{ vars.INTEGRATION_TEST_CONFIG }}
jobs:
build:
if: ${{ vars.INTEGRATION_TEST_CONFIG != '' }}
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with:
distribution: 'temurin'
java-version-file: .java-version
cache: 'maven'
- uses: aws-actions/configure-aws-credentials@8df5847569e6427dd6c4fb1cf565c83acfa8afa7 # v6.0.0
name: Configure AWS credentials from Test account
with:
role-to-assume: ${{ vars.AWS_ROLE }}
aws-region: ${{ vars.AWS_REGION }}
- name: Write integration test configuration
run: |
mkdir -p integration-tests/src/main/resources
echo "${INTEGRATION_TEST_CONFIG}" > integration-tests/src/main/resources/config.yml
- name: Run and verify integration tests
run: ./mvnw clean compile test-compile failsafe:integration-test failsafe:verify -P aws-sso
================================================
FILE: .github/workflows/test.yml
================================================
name: Service CI
on:
pull_request:
push:
branches-ignore:
- gh-pages
jobs:
build:
runs-on: ubuntu-latest
container: ubuntu:24.04
timeout-minutes: 20
services:
foundationdb0:
# Note: this should generally match the version of the FoundationDB SERVER deployed in production; it's okay if
# it's a little behind the CLIENT version.
image: foundationdb/foundationdb:7.3.62
options: --name foundationdb0
foundationdb1:
# Note: this should generally match the version of the FoundationDB SERVER deployed in production; it's okay if
# it's a little behind the CLIENT version.
image: foundationdb/foundationdb:7.3.62
options: --name foundationdb1
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up JDK
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with:
distribution: 'temurin'
java-version-file: .java-version
cache: 'maven'
env:
# work around an issue with actions/runner setting an incorrect HOME in containers, which breaks maven caching
# https://github.com/actions/setup-java/issues/356
HOME: /root
- name: Install APT packages
# ca-certificates: required for AWS CRT client
run: |
# Add Docker's official GPG key:
apt update
apt install -y ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
# Add Docker repository to apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
# ca-certificates: required for AWS CRT client
apt update && apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ca-certificates
- name: Configure FoundationDB0 database
run: docker exec foundationdb0 /usr/bin/fdbcli --exec 'configure new single memory'
- name: Configure FoundationDB1 database
run: docker exec foundationdb1 /usr/bin/fdbcli --exec 'configure new single memory'
- name: Download and install FoundationDB client
run: |
./mvnw -e -B -Pexclude-spam-filter clean prepare-package -DskipTests=true
cp service/target/jib-extra/usr/lib/libfdb_c.x86_64.so /usr/lib/libfdb_c.x86_64.so
ldconfig
- name: Build with Maven
run: ./mvnw -e -B clean verify -DfoundationDb.serviceContainerNamePrefix=foundationdb
================================================
FILE: .gitignore
================================================
target
local.properties
.idea
*.iml
run.sh
*~
local.yml
config/production.yml
config/federated.yml
config/staging.yml
config/testing.yml
config/deploy.properties
/service/config/production.yml
/service/config/federated.yml
/service/config/staging.yml
/service/config/testing.yml
/service/config/deploy.properties
/service/dependency-reduced-pom.xml
.opsmanage
put.sh
deployer-staging.properties
deployer-production.properties
deployer.log
/service/src/main/resources/org/signal/badges/Badges_*.properties
!/service/src/main/resources/org/signal/badges/Badges_en.properties
/service/src/main/resources/org/signal/subscriptions/Subscriptions_*.properties
!/service/src/main/resources/org/signal/subscriptions/Subscriptions_en.properties
.project
.classpath
.settings
.DS_Store
================================================
FILE: .gitmodules
================================================
# Note that the implementation of the spam filter is private; internal
# developers will need to override this URL with:
#
# ```
# git config submodule.spam-filter.url PRIVATE_URL
# ```
#
# External developers may safely ignore this submodule.
[submodule "spam-filter"]
path = spam-filter
url = REDACTED
================================================
FILE: .java-version
================================================
temurin-24
================================================
FILE: .mvn/extensions.xml
================================================
<extensions xmlns="http://maven.apache.org/EXTENSIONS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/EXTENSIONS/1.0.0 http://maven.apache.org/xsd/core-extensions-1.0.0.xsd">
<extension>
<groupId>fr.brouillard.oss</groupId>
<artifactId>jgitver-maven-plugin</artifactId>
<version>1.9.0</version>
</extension>
</extensions>
================================================
FILE: .mvn/jgitver.config.xml
================================================
<configuration xmlns="http://jgitver.github.io/maven/configuration/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jgitver.github.io/maven/configuration/1.1.0 https://jgitver.github.io/maven/configuration/jgitver-configuration-v1_1_0.xsd">
<useDirty>true</useDirty>
<useDefaultBranchingPolicy>false</useDefaultBranchingPolicy>
<branchPolicies>
<branchPolicy>
<pattern>(.*)</pattern>
<transformations>
<transformation>IGNORE</transformation>
</transformations>
</branchPolicy>
</branchPolicies>
</configuration>
================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar
distributionSha256Sum=0d7125e8c91097b36edb990ea5934e6c68b4440eef4ea96510a0f6815e7eeadb
wrapperSha256Sum=4e2fbf6554bc8a4702cdfdd3bef464f423393d784ddbb037216320ce55d5e4e1
================================================
FILE: LICENSE
================================================
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keysManager, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.
================================================
FILE: README.md
================================================
Signal-Server
=================
Documentation
-------------
Looking for protocol documentation? Check out the website!
https://signal.org/docs/
How to Build
------------
This project uses [FoundationDB](https://www.foundationdb.org/) and requires the FoundationDB client library to be installed on the host system. With that in place, the server can be built and tested with:
```shell script
$ ./mvnw clean test
```
Security
--------
Security issues should be sent to <a href=mailto:security@signal.org>security@signal.org</a>.
Help
----
We cannot provide direct technical support. Get help running this software in your own environment in our [unofficial community forum][community forum].
Cryptography Notice
-------------------
This distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software.
BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.
See <https://www.wassenaar.org/> for more information.
The U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms.
The form and manner of this distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code.
License
-------
Copyright 2013 Signal Messenger, LLC
Licensed under the GNU AGPLv3: https://www.gnu.org/licenses/agpl-3.0.html
[community forum]: https://community.signalusers.org
================================================
FILE: TESTING.md
================================================
# Testing
## Automated tests
The full suite of automated tests can be run using Maven from the project root:
```sh
./mvnw verify
```
## Test server
The service can be run in a feature-limited test mode by running the Maven `integration-test`
goal with the `test-server` profile activated:
```sh
./mvnw integration-test -Ptest-server [-DskipTests=true]
```
This runs [`LocalWhisperServerService`][lwss] with [test configuration][test.yml] and [secrets][test secrets]. External
registration clients are stubbed so that:
- a captcha requirement can be satisfied with `noop.noop.registration.noop`
- any string will be accepted for a phone verification code
[lwss]: service/src/test/java/org/whispersystems/textsecuregcm/LocalWhisperServerService.java
[test.yml]: service/src/test/resources/config/test.yml
[test secrets]: service/src/test/resources/config/test-secrets-bundle.yml
================================================
FILE: api-doc/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>TextSecureServer</artifactId>
<groupId>org.whispersystems.textsecure</groupId>
<version>JGITVER</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>api-doc</artifactId>
<dependencies>
<dependency>
<groupId>org.whispersystems.textsecure</groupId>
<artifactId>service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-maven-plugin-jakarta</artifactId>
<version>${swagger.version}</version>
<configuration>
<outputFileName>signal-server-openapi</outputFileName>
<outputPath>${project.build.directory}/openapi</outputPath>
<outputFormat>YAML</outputFormat>
<configurationFilePath>${project.basedir}/src/main/resources/openapi/openapi-configuration.yaml
</configurationFilePath>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>resolve</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<!-- we don't want jib to execute on this module -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
================================================
FILE: api-doc/src/main/java/org/signal/openapi/OpenApiExtension.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.openapi;
import com.fasterxml.jackson.annotation.JsonView;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.SimpleType;
import io.dropwizard.auth.Auth;
import io.swagger.v3.jaxrs2.ResolvedParameter;
import io.swagger.v3.jaxrs2.ext.AbstractOpenAPIExtension;
import io.swagger.v3.jaxrs2.ext.OpenAPIExtension;
import io.swagger.v3.oas.models.Components;
import jakarta.ws.rs.Consumes;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Iterator;
import java.util.List;
import java.util.Optional;
import java.util.ServiceLoader;
import java.util.Set;
import org.whispersystems.textsecuregcm.auth.AuthenticatedDevice;
/**
* One of the extension mechanisms of Swagger Core library (OpenAPI processor) is via custom implementations
* of the {@link AbstractOpenAPIExtension} class.
* <p/>
* The purpose of this extension is to customize certain aspects of the OpenAPI model generation on a lower level.
* This extension works in coordination with {@link OpenApiReader} that has access to the model on a higher level.
* <p/>
* The extension is enabled by being listed in {@code META-INF/services/io.swagger.v3.jaxrs2.ext.OpenAPIExtension} file.
* @see ServiceLoader
* @see OpenApiReader
* @see <a href="https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Extensions">Swagger 2.X Extensions</a>
*/
public class OpenApiExtension extends AbstractOpenAPIExtension {
public static final ResolvedParameter AUTHENTICATED_ACCOUNT = new ResolvedParameter();
public static final ResolvedParameter OPTIONAL_AUTHENTICATED_ACCOUNT = new ResolvedParameter();
/**
* When parsing endpoint methods, Swagger will treat the first parameter not annotated as header/path/query param
* as a request body (and will ignore other not annotated parameters). In our case, this behavior conflicts with
* the {@code @Auth}-annotated parameters. Here we're checking if parameters are known to be anything other than
* a body and return an appropriate {@link ResolvedParameter} representation.
*/
@Override
public ResolvedParameter extractParameters(
final List<Annotation> annotations,
final Type type,
final Set<Type> typesToSkip,
final Components components,
final Consumes classConsumes,
final Consumes methodConsumes,
final boolean includeRequestBody,
final JsonView jsonViewAnnotation,
final Iterator<OpenAPIExtension> chain) {
if (annotations.stream().anyMatch(a -> a.annotationType().equals(Auth.class))) {
// this is the case of authenticated endpoint,
if (type instanceof SimpleType simpleType
&& simpleType.getRawClass().equals(AuthenticatedDevice.class)) {
return AUTHENTICATED_ACCOUNT;
}
if (type instanceof SimpleType simpleType
&& isOptionalOfType(simpleType, AuthenticatedDevice.class)) {
return OPTIONAL_AUTHENTICATED_ACCOUNT;
}
}
return super.extractParameters(
annotations,
type,
typesToSkip,
components,
classConsumes,
methodConsumes,
includeRequestBody,
jsonViewAnnotation,
chain);
}
private static boolean isOptionalOfType(final SimpleType simpleType, final Class<?> expectedType) {
if (!simpleType.getRawClass().equals(Optional.class)) {
return false;
}
final List<JavaType> typeParameters = simpleType.getBindings().getTypeParameters();
if (typeParameters.isEmpty()) {
return false;
}
return typeParameters.get(0) instanceof SimpleType optionalParameterType
&& optionalParameterType.getRawClass().equals(expectedType);
}
}
================================================
FILE: api-doc/src/main/java/org/signal/openapi/OpenApiReader.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.openapi;
import static com.google.common.base.MoreObjects.firstNonNull;
import static org.signal.openapi.OpenApiExtension.AUTHENTICATED_ACCOUNT;
import static org.signal.openapi.OpenApiExtension.OPTIONAL_AUTHENTICATED_ACCOUNT;
import com.fasterxml.jackson.annotation.JsonView;
import com.google.common.collect.ImmutableList;
import io.swagger.v3.jaxrs2.Reader;
import io.swagger.v3.jaxrs2.ResolvedParameter;
import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import jakarta.ws.rs.Consumes;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.List;
/**
* One of the extension mechanisms of Swagger Core library (OpenAPI processor) is via custom implementations
* of the {@link Reader} class.
* <p/>
* The purpose of this extension is to customize certain aspects of the OpenAPI model generation on a higher level.
* This extension works in coordination with {@link OpenApiExtension} that has access to the model on a lower level.
* <p/>
* The extension is enabled by being listed in {@code resources/openapi/openapi-configuration.yaml} file.
* @see OpenApiExtension
* @see <a href="https://github.com/swagger-api/swagger-core/wiki/Swagger-2.X---Extensions">Swagger 2.X Extensions</a>
*/
public class OpenApiReader extends Reader {
private static final String AUTHENTICATED_ACCOUNT_AUTH_SCHEMA = "authenticatedAccount";
/**
* Overriding this method allows converting a resolved parameter into other operation entities,
* in this case, into security requirements.
*/
@Override
protected ResolvedParameter getParameters(
final Type type,
final List<Annotation> annotations,
final Operation operation,
final Consumes classConsumes,
final Consumes methodConsumes,
final JsonView jsonViewAnnotation) {
final ResolvedParameter resolved = super.getParameters(
type, annotations, operation, classConsumes, methodConsumes, jsonViewAnnotation);
if (resolved == AUTHENTICATED_ACCOUNT) {
operation.setSecurity(ImmutableList.<SecurityRequirement>builder()
.addAll(firstNonNull(operation.getSecurity(), Collections.emptyList()))
.add(new SecurityRequirement().addList(AUTHENTICATED_ACCOUNT_AUTH_SCHEMA))
.build());
}
if (resolved == OPTIONAL_AUTHENTICATED_ACCOUNT) {
operation.setSecurity(ImmutableList.<SecurityRequirement>builder()
.addAll(firstNonNull(operation.getSecurity(), Collections.emptyList()))
.add(new SecurityRequirement().addList(AUTHENTICATED_ACCOUNT_AUTH_SCHEMA))
.add(new SecurityRequirement())
.build());
}
return resolved;
}
}
================================================
FILE: api-doc/src/main/resources/META-INF/services/io.swagger.v3.jaxrs2.ext.OpenAPIExtension
================================================
org.signal.openapi.OpenApiExtension
================================================
FILE: api-doc/src/main/resources/openapi/openapi-configuration.yaml
================================================
resourcePackages:
- org.whispersystems.textsecuregcm
prettyPrint: true
cacheTTL: 0
readerClass: org.signal.openapi.OpenApiReader
openAPI:
info:
title: Signal Server API
license:
name: AGPL-3.0-only
url: https://www.gnu.org/licenses/agpl-3.0.txt
servers:
- url: https://chat.signal.org
description: Production service
- url: https://chat.staging.signal.org
description: Staging service
components:
securitySchemes:
authenticatedAccount:
type: http
scheme: basic
description: |
Account authentication is based on Basic authentication schema,
where `username` has a format of `<user_id>[.<device_id>]`. If `device_id` is not specified,
user's `main` device is assumed.
================================================
FILE: integration-tests/.gitignore
================================================
.libs
src/main/resources/config.yml
================================================
FILE: integration-tests/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>TextSecureServer</artifactId>
<groupId>org.whispersystems.textsecure</groupId>
<version>JGITVER</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>integration-tests</artifactId>
<dependencies>
<dependency>
<groupId>org.whispersystems.textsecure</groupId>
<artifactId>service</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludes>
<exclude>**</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<configuration>
<additionalClasspathElements>
<additionalClasspathElement>${project.basedir}/.libs/software.amazon.awssdk-sso.jar</additionalClasspathElement>
</additionalClasspathElements>
<includes>
<include>**/*.java</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<configuration>
<!-- we don't want jib to execute on this module -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>aws-sso</id>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sso</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
</project>
================================================
FILE: integration-tests/src/main/java/org/signal/integration/Codecs.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.Base64;
import org.signal.libsignal.protocol.IdentityKey;
import org.signal.libsignal.protocol.ecc.ECPublicKey;
public final class Codecs {
private Codecs() {
// utility class
}
@FunctionalInterface
public interface CheckedFunction<T, R> {
R apply(T t) throws Exception;
}
public static class Base64BasedSerializer<T> extends JsonSerializer<T> {
private final CheckedFunction<T, byte[]> mapper;
public Base64BasedSerializer(final CheckedFunction<T, byte[]> mapper) {
this.mapper = mapper;
}
@Override
public void serialize(final T value, final JsonGenerator gen, final SerializerProvider serializers) throws IOException {
try {
gen.writeString(Base64.getEncoder().withoutPadding().encodeToString(mapper.apply(value)));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public static class Base64BasedDeserializer<T> extends JsonDeserializer<T> {
private final CheckedFunction<byte[], T> mapper;
public Base64BasedDeserializer(final CheckedFunction<byte[], T> mapper) {
this.mapper = mapper;
}
@Override
public T deserialize(final JsonParser p, final DeserializationContext ctxt) throws IOException {
try {
return mapper.apply(Base64.getDecoder().decode(p.getValueAsString()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public static class ByteArraySerializer extends Base64BasedSerializer<byte[]> {
public ByteArraySerializer() {
super(bytes -> bytes);
}
}
public static class ByteArrayDeserializer extends Base64BasedDeserializer<byte[]> {
public ByteArrayDeserializer() {
super(bytes -> bytes);
}
}
public static class ECPublicKeySerializer extends Base64BasedSerializer<ECPublicKey> {
public ECPublicKeySerializer() {
super(ECPublicKey::serialize);
}
}
public static class ECPublicKeyDeserializer extends Base64BasedDeserializer<ECPublicKey> {
public ECPublicKeyDeserializer() {
super(ECPublicKey::new);
}
}
public static class IdentityKeySerializer extends Base64BasedSerializer<IdentityKey> {
public IdentityKeySerializer() {
super(IdentityKey::serialize);
}
}
public static class IdentityKeyDeserializer extends Base64BasedDeserializer<IdentityKey> {
public IdentityKeyDeserializer() {
super(bytes -> new IdentityKey(bytes, 0));
}
}
}
================================================
FILE: integration-tests/src/main/java/org/signal/integration/IntegrationTools.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration;
import java.time.Clock;
import java.time.Duration;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import org.signal.integration.config.Config;
import org.whispersystems.textsecuregcm.metrics.NoopAwsSdkMetricPublisher;
import org.whispersystems.textsecuregcm.registration.VerificationSession;
import org.whispersystems.textsecuregcm.storage.PhoneNumberIdentifiers;
import org.whispersystems.textsecuregcm.storage.RegistrationRecoveryPasswords;
import org.whispersystems.textsecuregcm.storage.RegistrationRecoveryPasswordsManager;
import org.whispersystems.textsecuregcm.storage.VerificationSessionManager;
import org.whispersystems.textsecuregcm.storage.VerificationSessions;
import org.whispersystems.textsecuregcm.util.Util;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClient;
public class IntegrationTools {
private final RegistrationRecoveryPasswordsManager registrationRecoveryPasswordsManager;
private final VerificationSessionManager verificationSessionManager;
private final PhoneNumberIdentifiers phoneNumberIdentifiers;
public static IntegrationTools create(final Config config) {
final AwsCredentialsProvider credentialsProvider = DefaultCredentialsProvider.builder().build();
final DynamoDbAsyncClient dynamoDbAsyncClient =
config.dynamoDbClient().buildAsyncClient(credentialsProvider, new NoopAwsSdkMetricPublisher());
final RegistrationRecoveryPasswords registrationRecoveryPasswords = new RegistrationRecoveryPasswords(
config.dynamoDbTables().registrationRecovery(), Duration.ofDays(1), dynamoDbAsyncClient, Clock.systemUTC());
final VerificationSessions verificationSessions = new VerificationSessions(
dynamoDbAsyncClient, config.dynamoDbTables().verificationSessions(), Clock.systemUTC());
return new IntegrationTools(
new RegistrationRecoveryPasswordsManager(registrationRecoveryPasswords),
new VerificationSessionManager(verificationSessions),
new PhoneNumberIdentifiers(dynamoDbAsyncClient, config.dynamoDbTables().phoneNumberIdentifiers())
);
}
private IntegrationTools(
final RegistrationRecoveryPasswordsManager registrationRecoveryPasswordsManager,
final VerificationSessionManager verificationSessionManager,
final PhoneNumberIdentifiers phoneNumberIdentifiers) {
this.registrationRecoveryPasswordsManager = registrationRecoveryPasswordsManager;
this.verificationSessionManager = verificationSessionManager;
this.phoneNumberIdentifiers = phoneNumberIdentifiers;
}
public CompletableFuture<Void> populateRecoveryPassword(final String phoneNumber, final byte[] password) {
return phoneNumberIdentifiers
.getPhoneNumberIdentifier(phoneNumber)
.thenCompose(pni -> registrationRecoveryPasswordsManager.store(pni, password))
.thenRun(Util.NOOP);
}
public CompletableFuture<Optional<String>> peekVerificationSessionPushChallenge(final String sessionId) {
return verificationSessionManager.findForId(sessionId)
.thenApply(maybeSession -> maybeSession.map(VerificationSession::pushChallenge));
}
}
================================================
FILE: integration-tests/src/main/java/org/signal/integration/Operations.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration;
import static java.util.Objects.requireNonNull;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.google.common.io.Resources;
import com.google.common.net.HttpHeaders;
import io.dropwizard.configuration.ConfigurationValidationException;
import io.dropwizard.jersey.validation.Validators;
import jakarta.validation.ConstraintViolation;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.net.URI;
import java.net.URL;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Executors;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import org.apache.commons.lang3.tuple.Pair;
import org.signal.integration.config.Config;
import org.signal.libsignal.protocol.IdentityKey;
import org.signal.libsignal.protocol.ecc.ECKeyPair;
import org.signal.libsignal.protocol.ecc.ECPublicKey;
import org.signal.libsignal.protocol.kem.KEMKeyPair;
import org.signal.libsignal.protocol.kem.KEMKeyType;
import org.signal.libsignal.protocol.kem.KEMPublicKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.whispersystems.textsecuregcm.entities.AccountAttributes;
import org.whispersystems.textsecuregcm.entities.AccountIdentityResponse;
import org.whispersystems.textsecuregcm.entities.DeviceActivationRequest;
import org.whispersystems.textsecuregcm.entities.ECSignedPreKey;
import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey;
import org.whispersystems.textsecuregcm.entities.RegistrationRequest;
import org.whispersystems.textsecuregcm.http.FaultTolerantHttpClient;
import org.whispersystems.textsecuregcm.storage.Device;
import org.whispersystems.textsecuregcm.util.HeaderUtils;
import org.whispersystems.textsecuregcm.util.HttpUtils;
import org.whispersystems.textsecuregcm.util.SystemMapper;
public final class Operations {
private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
private static final Config CONFIG = loadConfigFromClasspath("config.yml");
private static final IntegrationTools INTEGRATION_TOOLS = IntegrationTools.create(CONFIG);
private static final String USER_AGENT = "integration-test";
private static final FaultTolerantHttpClient CLIENT = buildClient();
private Operations() {
// utility class
}
public static TestUser newRegisteredUser(final String number) {
final byte[] registrationPassword = populateRandomRecoveryPassword(number);
final String accountPassword = Base64.getEncoder().encodeToString(randomBytes(32));
final TestUser user = TestUser.create(number, accountPassword, registrationPassword);
final AccountAttributes accountAttributes = user.accountAttributes();
final ECKeyPair aciIdentityKeyPair = ECKeyPair.generate();
final ECKeyPair pniIdentityKeyPair = ECKeyPair.generate();
// register account
final RegistrationRequest registrationRequest = new RegistrationRequest(null,
registrationPassword,
accountAttributes,
true,
new IdentityKey(aciIdentityKeyPair.getPublicKey()),
new IdentityKey(pniIdentityKeyPair.getPublicKey()),
new DeviceActivationRequest(generateSignedECPreKey(1, aciIdentityKeyPair),
generateSignedECPreKey(2, pniIdentityKeyPair),
generateSignedKEMPreKey(3, aciIdentityKeyPair),
generateSignedKEMPreKey(4, pniIdentityKeyPair),
Optional.empty(),
Optional.empty()));
final AccountIdentityResponse registrationResponse = apiPost("/v1/registration", registrationRequest)
.authorized(number, accountPassword)
.executeExpectSuccess(AccountIdentityResponse.class);
user.setAciUuid(registrationResponse.uuid());
user.setPniUuid(registrationResponse.pni());
return user;
}
public record PrescribedVerificationNumber(String number, String verificationCode) {}
public static PrescribedVerificationNumber prescribedVerificationNumber() {
return new PrescribedVerificationNumber(
CONFIG.prescribedRegistrationNumber(),
CONFIG.prescribedRegistrationCode());
}
public static void deleteUser(final TestUser user) {
apiDelete("/v1/accounts/me").authorized(user).executeExpectSuccess();
}
public static String peekVerificationSessionPushChallenge(final String sessionId) {
return INTEGRATION_TOOLS.peekVerificationSessionPushChallenge(sessionId).join()
.orElseThrow(() -> new RuntimeException("push challenge not found for the verification session"));
}
public static byte[] populateRandomRecoveryPassword(final String number) {
final byte[] recoveryPassword = randomBytes(32);
INTEGRATION_TOOLS.populateRecoveryPassword(number, recoveryPassword).join();
return recoveryPassword;
}
public static <T> T sendEmptyRequestAuthenticated(
final String endpoint,
final String method,
final String username,
final String password,
final Class<T> outputType) {
try {
final HttpRequest request = HttpRequest.newBuilder()
.uri(serverUri(endpoint, Collections.emptyList()))
.method(method, HttpRequest.BodyPublishers.noBody())
.header(HttpHeaders.AUTHORIZATION, HeaderUtils.basicAuthHeader(username, password))
.header(HttpHeaders.CONTENT_TYPE, "application/json")
.build();
return CLIENT.sendAsync(request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8))
.whenComplete((response, error) -> {
if (error != null) {
logger.error("request error", error);
error.printStackTrace();
} else {
logger.info("response: {}", response.statusCode());
System.out.println("response: " + response.statusCode() + ", " + response.body());
}
})
.thenApply(response -> {
try {
return outputType.equals(Void.class)
? null
: SystemMapper.jsonMapper().readValue(response.body(), outputType);
} catch (final IOException e) {
throw new RuntimeException(e);
}
})
.get();
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
private static byte[] randomBytes(int numBytes) {
final byte[] bytes = new byte[numBytes];
new SecureRandom().nextBytes(bytes);
return bytes;
}
public static RequestBuilder apiGet(final String endpoint) {
return new RequestBuilder(HttpRequest.newBuilder().GET(), endpoint);
}
public static RequestBuilder apiDelete(final String endpoint) {
return new RequestBuilder(HttpRequest.newBuilder().DELETE(), endpoint);
}
public static <R> RequestBuilder apiPost(final String endpoint, final R input) {
return RequestBuilder.withJsonBody(endpoint, "POST", input);
}
public static <R> RequestBuilder apiPut(final String endpoint, final R input) {
return RequestBuilder.withJsonBody(endpoint, "PUT", input);
}
public static <R> RequestBuilder apiPatch(final String endpoint, final R input) {
return RequestBuilder.withJsonBody(endpoint, "PATCH", input);
}
private static URI serverUri(final String endpoint, final List<String> queryParams) {
final String query = queryParams.isEmpty()
? StringUtils.EMPTY
: "?" + String.join("&", queryParams);
return URI.create("https://" + CONFIG.domain() + endpoint + query);
}
public static class RequestBuilder {
private final HttpRequest.Builder builder;
private final String endpoint;
private final List<String> queryParams = new ArrayList<>();
private RequestBuilder(final HttpRequest.Builder builder, final String endpoint) {
this.builder = builder;
this.endpoint = endpoint;
}
private static <R> RequestBuilder withJsonBody(final String endpoint, final String method, final R input) {
try {
final byte[] body = SystemMapper.jsonMapper().writeValueAsBytes(input);
return new RequestBuilder(HttpRequest.newBuilder()
.header(HttpHeaders.CONTENT_TYPE, "application/json")
.method(method, HttpRequest.BodyPublishers.ofByteArray(body)), endpoint);
} catch (final JsonProcessingException e) {
throw new RuntimeException(e);
}
}
public RequestBuilder authorized(final TestUser user) {
return authorized(user, Device.PRIMARY_ID);
}
public RequestBuilder authorized(final TestUser user, final byte deviceId) {
final String username = "%s.%d".formatted(user.aciUuid().toString(), deviceId);
return authorized(username, user.accountPassword());
}
public RequestBuilder authorized(final String username, final String password) {
builder.header(HttpHeaders.AUTHORIZATION, HeaderUtils.basicAuthHeader(username, password));
return this;
}
public RequestBuilder queryParam(final String key, final String value) {
queryParams.add("%s=%s".formatted(key, value));
return this;
}
public RequestBuilder header(final String name, final String value) {
builder.header(name, value);
return this;
}
public Pair<Integer, Void> execute() {
return execute(Void.class);
}
public Pair<Integer, Void> executeExpectSuccess() {
final Pair<Integer, Void> execute = execute();
Validate.isTrue(
HttpUtils.isSuccessfulResponse(execute.getLeft()),
"Unexpected response code: %d",
execute.getLeft());
return execute;
}
public <T> T executeExpectSuccess(final Class<T> expectedType) {
final Pair<Integer, T> execute = execute(expectedType);
Validate.isTrue(
HttpUtils.isSuccessfulResponse(execute.getLeft()),
"Unexpected response code: %d : %s",
execute.getLeft(), execute.getRight());
return requireNonNull(execute.getRight());
}
public void executeExpectStatusCode(final int expectedStatusCode) {
final Pair<Integer, Void> execute = execute(Void.class);
Validate.isTrue(
execute.getLeft() == expectedStatusCode,
"Unexpected response code: %d",
execute.getLeft()
);
}
public <T> Pair<Integer, T> execute(final Class<T> expectedType) {
builder.uri(serverUri(endpoint, queryParams))
.header(HttpHeaders.USER_AGENT, USER_AGENT);
return CLIENT.sendAsync(builder.build(), HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8))
.whenComplete((response, error) -> {
if (error != null) {
logger.error("request error", error);
error.printStackTrace();
}
})
.thenApply(response -> {
try {
final T result = expectedType.equals(Void.class)
? null
: SystemMapper.jsonMapper().readValue(response.body(), expectedType);
return Pair.of(response.statusCode(), result);
} catch (final IOException e) {
throw new RuntimeException(e);
}
})
.join();
}
}
private static FaultTolerantHttpClient buildClient() {
try {
return FaultTolerantHttpClient.newBuilder("integration-test", Executors.newFixedThreadPool(16))
.withTrustedServerCertificates(CONFIG.rootCert())
.build();
} catch (final CertificateException e) {
throw new RuntimeException(e);
}
}
private static Config loadConfigFromClasspath(final String filename) {
try {
final URL configFileUrl = Resources.getResource(filename);
final Config config = SystemMapper.yamlMapper().readValue(Resources.toByteArray(configFileUrl), Config.class);
final Set<ConstraintViolation<Config>> constraintViolations = Validators.newValidator().validate(config);
if (!constraintViolations.isEmpty()) {
throw new ConfigurationValidationException(filename, constraintViolations);
}
return config;
} catch (final Exception e) {
throw new RuntimeException(e);
}
}
public static ECSignedPreKey generateSignedECPreKey(final long id, final ECKeyPair identityKeyPair) {
final ECPublicKey pubKey = ECKeyPair.generate().getPublicKey();
final byte[] signature = identityKeyPair.getPrivateKey().calculateSignature(pubKey.serialize());
return new ECSignedPreKey(id, pubKey, signature);
}
public static KEMSignedPreKey generateSignedKEMPreKey(final long id, final ECKeyPair identityKeyPair) {
final KEMPublicKey pubKey = KEMKeyPair.generate(KEMKeyType.KYBER_1024).getPublicKey();
final byte[] signature = identityKeyPair.getPrivateKey().calculateSignature(pubKey.serialize());
return new KEMSignedPreKey(id, pubKey, signature);
}
}
================================================
FILE: integration-tests/src/main/java/org/signal/integration/TestDevice.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.lang3.tuple.Pair;
import org.signal.libsignal.protocol.IdentityKeyPair;
import org.signal.libsignal.protocol.ecc.ECKeyPair;
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
public class TestDevice {
private final byte deviceId;
private final Map<Integer, Pair<IdentityKeyPair, SignedPreKeyRecord>> signedPreKeys = new ConcurrentHashMap<>();
public static TestDevice create(
final byte deviceId,
final IdentityKeyPair aciIdentityKeyPair,
final IdentityKeyPair pniIdentityKeyPair) {
final TestDevice device = new TestDevice(deviceId);
device.addSignedPreKey(aciIdentityKeyPair);
device.addSignedPreKey(pniIdentityKeyPair);
return device;
}
public TestDevice(final byte deviceId) {
this.deviceId = deviceId;
}
public byte deviceId() {
return deviceId;
}
public SignedPreKeyRecord latestSignedPreKey(final IdentityKeyPair identity) {
final int id = signedPreKeys.entrySet()
.stream()
.filter(p -> p.getValue().getLeft().equals(identity))
.mapToInt(Map.Entry::getKey)
.max()
.orElseThrow();
return signedPreKeys.get(id).getRight();
}
public SignedPreKeyRecord addSignedPreKey(final IdentityKeyPair identity) {
final int nextId = signedPreKeys.keySet().stream().mapToInt(k -> k + 1).max().orElse(0);
final ECKeyPair keyPair = ECKeyPair.generate();
final byte[] signature = keyPair.getPrivateKey().calculateSignature(keyPair.getPublicKey().serialize());
final SignedPreKeyRecord signedPreKeyRecord = new SignedPreKeyRecord(nextId, System.currentTimeMillis(), keyPair, signature);
signedPreKeys.put(nextId, Pair.of(identity, signedPreKeyRecord));
return signedPreKeyRecord;
}
}
================================================
FILE: integration-tests/src/main/java/org/signal/integration/TestUser.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration;
import static java.util.Objects.requireNonNull;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.security.SecureRandom;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import org.signal.libsignal.protocol.IdentityKey;
import org.signal.libsignal.protocol.IdentityKeyPair;
import org.signal.libsignal.protocol.InvalidKeyException;
import org.signal.libsignal.protocol.ecc.ECPublicKey;
import org.signal.libsignal.protocol.state.SignedPreKeyRecord;
import org.signal.libsignal.protocol.util.KeyHelper;
import org.whispersystems.textsecuregcm.auth.UnidentifiedAccessUtil;
import org.whispersystems.textsecuregcm.entities.AccountAttributes;
import org.whispersystems.textsecuregcm.storage.Device;
import org.whispersystems.textsecuregcm.storage.DeviceCapability;
public class TestUser {
private final int registrationId;
private final int pniRegistrationId;
private final IdentityKeyPair aciIdentityKey;
private final Map<Byte, TestDevice> devices = new ConcurrentHashMap<>();
private final byte[] unidentifiedAccessKey;
private String phoneNumber;
private IdentityKeyPair pniIdentityKey;
private String accountPassword;
private byte[] registrationPassword;
private UUID aciUuid;
private UUID pniUuid;
public static TestUser create(final String phoneNumber, final String accountPassword, final byte[] registrationPassword) {
// ACI identity key pair
final IdentityKeyPair aciIdentityKey = IdentityKeyPair.generate();
// PNI identity key pair
final IdentityKeyPair pniIdentityKey = IdentityKeyPair.generate();
// registration id
final int registrationId = KeyHelper.generateRegistrationId(false);
final int pniRegistrationId = KeyHelper.generateRegistrationId(false);
// uak
final byte[] unidentifiedAccessKey = new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH];
new SecureRandom().nextBytes(unidentifiedAccessKey);
return new TestUser(
registrationId,
pniRegistrationId,
aciIdentityKey,
phoneNumber,
pniIdentityKey,
unidentifiedAccessKey,
accountPassword,
registrationPassword);
}
public TestUser(
final int registrationId,
final int pniRegistrationId,
final IdentityKeyPair aciIdentityKey,
final String phoneNumber,
final IdentityKeyPair pniIdentityKey,
final byte[] unidentifiedAccessKey,
final String accountPassword,
final byte[] registrationPassword) {
this.registrationId = registrationId;
this.pniRegistrationId = pniRegistrationId;
this.aciIdentityKey = aciIdentityKey;
this.phoneNumber = phoneNumber;
this.pniIdentityKey = pniIdentityKey;
this.unidentifiedAccessKey = unidentifiedAccessKey;
this.accountPassword = accountPassword;
this.registrationPassword = registrationPassword;
devices.put(Device.PRIMARY_ID, TestDevice.create(Device.PRIMARY_ID, aciIdentityKey, pniIdentityKey));
}
public int registrationId() {
return registrationId;
}
public IdentityKeyPair aciIdentityKey() {
return aciIdentityKey;
}
public String phoneNumber() {
return phoneNumber;
}
public IdentityKeyPair pniIdentityKey() {
return pniIdentityKey;
}
public String accountPassword() {
return accountPassword;
}
public byte[] registrationPassword() {
return registrationPassword;
}
public UUID aciUuid() {
return aciUuid;
}
public UUID pniUuid() {
return pniUuid;
}
public AccountAttributes accountAttributes() {
return new AccountAttributes(true, registrationId, pniRegistrationId, "".getBytes(StandardCharsets.UTF_8), "", true,
DeviceCapability.CAPABILITIES_REQUIRED_FOR_REGISTRATION)
.withUnidentifiedAccessKey(unidentifiedAccessKey)
.withRecoveryPassword(registrationPassword);
}
public void setAciUuid(final UUID aciUuid) {
this.aciUuid = aciUuid;
}
public void setPniUuid(final UUID pniUuid) {
this.pniUuid = pniUuid;
}
public void setPhoneNumber(final String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public void setPniIdentityKey(final IdentityKeyPair pniIdentityKey) {
this.pniIdentityKey = pniIdentityKey;
}
public void setAccountPassword(final String accountPassword) {
this.accountPassword = accountPassword;
}
public void setRegistrationPassword(final byte[] registrationPassword) {
this.registrationPassword = registrationPassword;
}
public PreKeySetPublicView preKeys(final byte deviceId, final boolean pni) {
final IdentityKeyPair identity = pni
? pniIdentityKey
: aciIdentityKey;
final TestDevice device = requireNonNull(devices.get(deviceId));
final SignedPreKeyRecord signedPreKeyRecord = device.latestSignedPreKey(identity);
try {
return new PreKeySetPublicView(
Collections.emptyList(),
identity.getPublicKey(),
new SignedPreKeyPublicView(
signedPreKeyRecord.getId(),
signedPreKeyRecord.getKeyPair().getPublicKey(),
signedPreKeyRecord.getSignature()
)
);
} catch (InvalidKeyException e) {
throw new RuntimeException(e);
}
}
public record SignedPreKeyPublicView(
int keyId,
@JsonSerialize(using = Codecs.ECPublicKeySerializer.class)
@JsonDeserialize(using = Codecs.ECPublicKeyDeserializer.class)
ECPublicKey publicKey,
@JsonSerialize(using = Codecs.ByteArraySerializer.class)
@JsonDeserialize(using = Codecs.ByteArrayDeserializer.class)
byte[] signature) {
}
public record PreKeySetPublicView(
List<String> preKeys,
@JsonSerialize(using = Codecs.IdentityKeySerializer.class)
@JsonDeserialize(using = Codecs.IdentityKeyDeserializer.class)
IdentityKey identityKey,
SignedPreKeyPublicView signedPreKey) {
}
}
================================================
FILE: integration-tests/src/main/java/org/signal/integration/config/Config.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration.config;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.whispersystems.textsecuregcm.configuration.DynamoDbClientFactory;
public record Config(@NotBlank String domain,
@NotBlank String rootCert,
@NotNull @Valid DynamoDbClientFactory dynamoDbClient,
@NotNull @Valid DynamoDbTables dynamoDbTables,
@NotBlank String prescribedRegistrationNumber,
@NotBlank String prescribedRegistrationCode) {
}
================================================
FILE: integration-tests/src/main/java/org/signal/integration/config/DynamoDbTables.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration.config;
import jakarta.validation.constraints.NotBlank;
public record DynamoDbTables(@NotBlank String registrationRecovery,
@NotBlank String verificationSessions,
@NotBlank String phoneNumberIdentifiers) {
}
================================================
FILE: integration-tests/src/test/java/org/signal/integration/AccountTest.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.Test;
import org.signal.libsignal.protocol.IdentityKey;
import org.signal.libsignal.protocol.ecc.ECKeyPair;
import org.signal.libsignal.usernames.BaseUsernameException;
import org.signal.libsignal.usernames.Username;
import org.whispersystems.textsecuregcm.entities.AccountIdentifierResponse;
import org.whispersystems.textsecuregcm.entities.AccountIdentityResponse;
import org.whispersystems.textsecuregcm.entities.ChangeNumberRequest;
import org.whispersystems.textsecuregcm.entities.ConfirmUsernameHashRequest;
import org.whispersystems.textsecuregcm.entities.ReserveUsernameHashRequest;
import org.whispersystems.textsecuregcm.entities.ReserveUsernameHashResponse;
import org.whispersystems.textsecuregcm.entities.UsernameHashResponse;
import org.whispersystems.textsecuregcm.identity.AciServiceIdentifier;
import org.whispersystems.textsecuregcm.storage.Device;
public class AccountTest {
@Test
public void testCreateAccount() {
final TestUser user = Operations.newRegisteredUser("+19995550101");
try {
final Pair<Integer, AccountIdentityResponse> execute = Operations.apiGet("/v1/accounts/whoami")
.authorized(user)
.execute(AccountIdentityResponse.class);
assertEquals(HttpStatus.SC_OK, execute.getLeft());
} finally {
Operations.deleteUser(user);
}
}
@Test
public void changePhoneNumber() {
final TestUser user = Operations.newRegisteredUser("+19995550301");
final String targetNumber = "+19995550302";
final ECKeyPair pniIdentityKeyPair = ECKeyPair.generate();
final ChangeNumberRequest changeNumberRequest = new ChangeNumberRequest(null,
Operations.populateRandomRecoveryPassword(targetNumber),
targetNumber,
null,
new IdentityKey(pniIdentityKeyPair.getPublicKey()),
Collections.emptyList(),
Map.of(Device.PRIMARY_ID, Operations.generateSignedECPreKey(1, pniIdentityKeyPair)),
Map.of(Device.PRIMARY_ID, Operations.generateSignedKEMPreKey(2, pniIdentityKeyPair)),
Map.of(Device.PRIMARY_ID, 17));
final AccountIdentityResponse accountIdentityResponse =
Operations.apiPut("/v2/accounts/number", changeNumberRequest)
.authorized(user)
.executeExpectSuccess(AccountIdentityResponse.class);
assertEquals(user.aciUuid(), accountIdentityResponse.uuid());
assertNotEquals(user.pniUuid(), accountIdentityResponse.pni());
assertEquals(targetNumber, accountIdentityResponse.number());
}
@Test
public void testUsernameOperations() throws Exception {
final TestUser user = Operations.newRegisteredUser("+19995550102");
try {
verifyFullUsernameLifecycle(user);
// no do it again to check changing usernames
verifyFullUsernameLifecycle(user);
} finally {
Operations.deleteUser(user);
}
}
private static void verifyFullUsernameLifecycle(final TestUser user) throws BaseUsernameException {
final String preferred = "test";
final List<Username> candidates = Username.candidatesFrom(preferred, preferred.length(), preferred.length() + 1);
// reserve a username
final ReserveUsernameHashRequest reserveUsernameHashRequest = new ReserveUsernameHashRequest(
candidates.stream().map(Username::getHash).toList());
// try unauthorized
Operations
.apiPut("/v1/accounts/username_hash/reserve", reserveUsernameHashRequest)
.executeExpectStatusCode(HttpStatus.SC_UNAUTHORIZED);
final ReserveUsernameHashResponse reserveUsernameHashResponse = Operations
.apiPut("/v1/accounts/username_hash/reserve", reserveUsernameHashRequest)
.authorized(user)
.executeExpectSuccess(ReserveUsernameHashResponse.class);
// find which one is the reserved username
final byte[] reservedHash = reserveUsernameHashResponse.usernameHash();
final Username reservedUsername = candidates.stream()
.filter(u -> Arrays.equals(u.getHash(), reservedHash))
.findAny()
.orElseThrow();
// confirm a username
final ConfirmUsernameHashRequest confirmUsernameHashRequest = new ConfirmUsernameHashRequest(
reservedUsername.getHash(),
reservedUsername.generateProof(),
"cluck cluck i'm a parrot".getBytes()
);
// try unauthorized
Operations
.apiPut("/v1/accounts/username_hash/confirm", confirmUsernameHashRequest)
.executeExpectStatusCode(HttpStatus.SC_UNAUTHORIZED);
Operations
.apiPut("/v1/accounts/username_hash/confirm", confirmUsernameHashRequest)
.authorized(user)
.executeExpectSuccess(UsernameHashResponse.class);
// lookup username
final AccountIdentifierResponse accountIdentifierResponse = Operations
.apiGet("/v1/accounts/username_hash/" + Base64.getUrlEncoder().encodeToString(reservedHash))
.executeExpectSuccess(AccountIdentifierResponse.class);
assertEquals(new AciServiceIdentifier(user.aciUuid()), accountIdentifierResponse.uuid());
// try authorized
Operations
.apiGet("/v1/accounts/username_hash/" + Base64.getUrlEncoder().encodeToString(reservedHash))
.authorized(user)
.executeExpectStatusCode(HttpStatus.SC_BAD_REQUEST);
// delete username
Operations
.apiDelete("/v1/accounts/username_hash")
.authorized(user)
.executeExpectSuccess();
}
}
================================================
FILE: integration-tests/src/test/java/org/signal/integration/MessagingTest.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import java.nio.charset.StandardCharsets;
import java.util.List;
import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.Test;
import org.whispersystems.textsecuregcm.entities.IncomingMessage;
import org.whispersystems.textsecuregcm.entities.IncomingMessageList;
import org.whispersystems.textsecuregcm.entities.OutgoingMessageEntityList;
import org.whispersystems.textsecuregcm.entities.SendMessageResponse;
import org.whispersystems.textsecuregcm.storage.Device;
public class MessagingTest {
@Test
public void testSendMessageUnsealed() {
final TestUser userA = Operations.newRegisteredUser("+19995550102");
final TestUser userB = Operations.newRegisteredUser("+19995550103");
try {
final byte[] expectedContent = "Hello, World!".getBytes(StandardCharsets.UTF_8);
final IncomingMessage message = new IncomingMessage(1, Device.PRIMARY_ID, userB.registrationId(), expectedContent);
final IncomingMessageList messages = new IncomingMessageList(List.of(message), false, true, System.currentTimeMillis());
Operations
.apiPut("/v1/messages/%s".formatted(userB.aciUuid().toString()), messages)
.authorized(userA)
.execute(SendMessageResponse.class);
final Pair<Integer, OutgoingMessageEntityList> receiveMessages = Operations.apiGet("/v1/messages")
.authorized(userB)
.execute(OutgoingMessageEntityList.class);
final byte[] actualContent = receiveMessages.getRight().messages().getFirst().content();
assertArrayEquals(expectedContent, actualContent);
} finally {
Operations.deleteUser(userA);
Operations.deleteUser(userB);
}
}
}
================================================
FILE: integration-tests/src/test/java/org/signal/integration/RegistrationTest.java
================================================
/*
* Copyright 2023 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.integration;
import io.micrometer.common.util.StringUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.whispersystems.textsecuregcm.entities.CreateVerificationSessionRequest;
import org.whispersystems.textsecuregcm.entities.SubmitVerificationCodeRequest;
import org.whispersystems.textsecuregcm.entities.UpdateVerificationSessionRequest;
import org.whispersystems.textsecuregcm.entities.VerificationCodeRequest;
import org.whispersystems.textsecuregcm.entities.VerificationSessionResponse;
public class RegistrationTest {
@Test
public void testRegistration() throws Exception {
final UpdateVerificationSessionRequest originalRequest = new UpdateVerificationSessionRequest(
"test", UpdateVerificationSessionRequest.PushTokenType.FCM, null, null, null, null);
final Operations.PrescribedVerificationNumber params = Operations.prescribedVerificationNumber();
final CreateVerificationSessionRequest input = new CreateVerificationSessionRequest(params.number(),
originalRequest);
final VerificationSessionResponse verificationSessionResponse = Operations
.apiPost("/v1/verification/session", input)
.executeExpectSuccess(VerificationSessionResponse.class);
final String sessionId = verificationSessionResponse.id();
Assertions.assertTrue(StringUtils.isNotBlank(sessionId));
final String pushChallenge = Operations.peekVerificationSessionPushChallenge(sessionId);
// supply push challenge
final UpdateVerificationSessionRequest updatedRequest = new UpdateVerificationSessionRequest(
"test", UpdateVerificationSessionRequest.PushTokenType.FCM, pushChallenge, null, null, null);
final VerificationSessionResponse pushChallengeSupplied = Operations
.apiPatch("/v1/verification/session/%s".formatted(sessionId), updatedRequest)
.executeExpectSuccess(VerificationSessionResponse.class);
Assertions.assertTrue(pushChallengeSupplied.allowedToRequestCode());
// request code
final VerificationCodeRequest verificationCodeRequest = new VerificationCodeRequest(
VerificationCodeRequest.Transport.SMS, "android-ng");
final VerificationSessionResponse codeRequested = Operations
.apiPost("/v1/verification/session/%s/code".formatted(sessionId), verificationCodeRequest)
.executeExpectSuccess(VerificationSessionResponse.class);
// verify code
final SubmitVerificationCodeRequest submitVerificationCodeRequest = new SubmitVerificationCodeRequest(
params.verificationCode());
final VerificationSessionResponse codeVerified = Operations
.apiPut("/v1/verification/session/%s/code".formatted(sessionId), submitVerificationCodeRequest)
.executeExpectSuccess(VerificationSessionResponse.class);
}
}
================================================
FILE: mvnw
================================================
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.2.0
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "$(uname)" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
else
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=$(java-config --jre-home)
fi
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="$(which javac)"
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=$(which readlink)
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
if $darwin ; then
javaHome="$(dirname "\"$javaExecutable\"")"
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
else
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
fi
javaHome="$(dirname "\"$javaExecutable\"")"
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=$(cd "$wdir/.." || exit 1; pwd)
fi
# end of workaround
done
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
# Remove \r in case we run on Windows within Git Bash
# and check out the repository with auto CRLF management
# enabled. Otherwise, we may read lines that are delimited with
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
# splitting rules.
tr -s '\r\n' ' ' < "$1"
fi
}
log() {
if [ "$MVNW_VERBOSE" = true ]; then
printf '%s\n' "$1"
fi
}
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
log "$MAVEN_PROJECTBASEDIR"
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
if [ -r "$wrapperJarPath" ]; then
log "Found $wrapperJarPath"
else
log "Couldn't find $wrapperJarPath, downloading it ..."
if [ -n "$MVNW_REPOURL" ]; then
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
else
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
fi
while IFS="=" read -r key value; do
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
safeValue=$(echo "$value" | tr -d '\r')
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
log "Downloading from: $wrapperUrl"
if $cygwin; then
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
fi
if command -v wget > /dev/null; then
log "Found wget ... using wget"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
log "Found curl ... using curl"
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
else
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
fi
else
log "Falling back to using Java to download"
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaSource=$(cygpath --path --windows "$javaSource")
javaClass=$(cygpath --path --windows "$javaClass")
fi
if [ -e "$javaSource" ]; then
if [ ! -e "$javaClass" ]; then
log " - Compiling MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/javac" "$javaSource")
fi
if [ -e "$javaClass" ]; then
log " - Running MavenWrapperDownloader.java ..."
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
wrapperSha256Sum=""
while IFS="=" read -r key value; do
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
esac
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
if [ -n "$wrapperSha256Sum" ]; then
wrapperSha256Result=false
if command -v sha256sum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c - > /dev/null 2>&1; then
wrapperSha256Result=true
fi
elif command -v shasum > /dev/null; then
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
wrapperSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
exit 1
fi
if [ $wrapperSha256Result = false ]; then
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
exit 1
fi
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
[ -n "$CLASSPATH" ] &&
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
# shellcheck disable=SC2086 # safe args
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
================================================
FILE: mvnw.cmd
================================================
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.2.0
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %WRAPPER_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
SET WRAPPER_SHA_256_SUM=""
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
)
IF NOT %WRAPPER_SHA_256_SUM%=="" (
powershell -Command "&{"^
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
" exit 1;"^
"}"^
"}"
if ERRORLEVEL 1 goto error
)
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%
================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>signal-build-artifacts</id>
<name>Signal Build Artifacts</name>
<url>https://build-artifacts.signal.org/libraries/maven</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>ossrh-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<modules>
<module>api-doc</module>
<module>integration-tests</module>
<module>service</module>
<module>websocket-resources</module>
</modules>
<properties>
<aws.sdk2.version>2.41.11</aws.sdk2.version>
<braintree.version>3.47.0</braintree.version>
<commons-csv.version>1.14.1</commons-csv.version>
<commons-io.version>2.21.0</commons-io.version>
<dropwizard.version>4.0.16</dropwizard.version>
<!-- Note: when updating FoundationDB, also include a copy of `libfdb_c.so` from the FoundationDB release at
src/main/jib/usr/lib/libfdb_c.so. We use x86_64 builds without AVX instructions enabled (i.e. FoundationDB versions
with even-numbered patch versions). Also when updating FoundationDB, make sure to update the version of FoundationDB
used by GitHub Actions. -->
<foundationdb.version>7.3.62</foundationdb.version>
<foundationdb.api-version>730</foundationdb.api-version>
<foundationdb.client-library-sha256>bfed237b787fae3cde1222676e6bfbb0d218fc27bf9e903397a7a7aa96fb2d33</foundationdb.client-library-sha256>
<google-cloud-libraries.version>26.74.0</google-cloud-libraries.version>
<grpc.version>1.73.0</grpc.version> <!-- should be kept in sync with the value from Google libraries-bom -->
<gson.version>2.13.2</gson.version>
<guava.version>33.5.0-jre</guava.version>
<!-- several libraries (AWS, Google Cloud) use Apache http components transitively, and we need to align them -->
<httpcore.version>4.4.16</httpcore.version>
<httpclient.version>4.5.14</httpclient.version>
<jackson.version>2.21.0</jackson.version>
<junit-pioneer.version>2.3.0</junit-pioneer.version>
<jsr305.version>3.0.2</jsr305.version>
<kotlin.version>2.3.0</kotlin.version>
<logback.version>1.5.25</logback.version>
<logback-access-common.version>2.0.6</logback-access-common.version>
<lettuce.version>6.8.1.RELEASE</lettuce.version>
<libphonenumber.version>9.0.13</libphonenumber.version>
<logstash.logback.version>8.1</logstash.logback.version>
<log4j-bom.version>2.25.3</log4j-bom.version>
<luajava.version>3.5.0</luajava.version>
<micrometer.version>1.16.2</micrometer.version>
<netty.version>4.1.127.Final</netty.version>
<!-- Must be less than or equal to the value from Google libraries-bom which controls the protobuf runtime version.
See https://protobuf.dev/support/cross-version-runtime-guarantee/. -->
<protoc.version>4.29.4</protoc.version>
<pushy.version>0.15.4</pushy.version>
<reactor-bom.version>2025.0.2</reactor-bom.version> <!-- 3.8.2, see https://github.com/reactor/reactor#bom-versioning-scheme -->
<resilience4j.version>2.3.0</resilience4j.version>
<semver4j.version>3.1.0</semver4j.version>
<simple-grpc.version>0.2.0</simple-grpc.version>
<slf4j.version>2.0.17</slf4j.version>
<stripe.version>31.2.0</stripe.version>
<swagger.version>2.2.42</swagger.version>
<testcontainers.version>2.0.3</testcontainers.version>
<!-- images to use in tests via testcontainers -->
<dynamodb.image>amazon/dynamodb-local:3.0.0@sha256:2fed5e3a965a4ba5aa6ac82baec57058b5a3848e959d705518f3fd579a77e76b</dynamodb.image>
<localstack.image>localstack/localstack:4@sha256:5a97e0f9917a3f0d9630bb13b9d8ccf10cbe52f33252807d3b4e21418cc21348</localstack.image>
<redis.image>redis:7.4-alpine@sha256:af1d0fc3f63b02b13ff7906c9baf7c5b390b8881ca08119cd570677fe2f60b55</redis.image>
<redis-cluster.image>docker.io/bitnamilegacy/redis-cluster:7.4.3@sha256:a53d023fdfaf8a8d7ddc58da040d3494e4cb45772644618ffa44c42dcd32b9af</redis-cluster.image>
<!-- eclipse-temurin:24.0.2_12-jre-noble (note: always use the multi-arch manifest *LIST* here) -->
<docker.image.sha256>85ecfc9bbb42af046d2bacbf1219d2005be4840cbfa16c2e6fd910d9ccfec95b</docker.image.sha256>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<groupId>org.whispersystems.textsecure</groupId>
<artifactId>TextSecureServer</artifactId>
<version>JGITVER</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson</groupId>
<artifactId>jackson-bom</artifactId>
<version>${jackson.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.dropwizard</groupId>
<artifactId>dropwizard-dependencies</artifactId>
<version>${dropwizard.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Needed for gRPC with Java 9+ -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>annotations-api</artifactId>
<version>6.0.53</version>
gitextract_qyyfx0yg/
├── .editorconfig
├── .github/
│ ├── FUNDING.yml
│ ├── dependabot.yml
│ ├── stale.yml
│ └── workflows/
│ ├── documentation.yml
│ ├── integration-tests.yml
│ └── test.yml
├── .gitignore
├── .gitmodules
├── .java-version
├── .mvn/
│ ├── extensions.xml
│ ├── jgitver.config.xml
│ └── wrapper/
│ ├── maven-wrapper.jar
│ └── maven-wrapper.properties
├── LICENSE
├── README.md
├── TESTING.md
├── api-doc/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── org/
│ │ └── signal/
│ │ └── openapi/
│ │ ├── OpenApiExtension.java
│ │ └── OpenApiReader.java
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ └── io.swagger.v3.jaxrs2.ext.OpenAPIExtension
│ └── openapi/
│ └── openapi-configuration.yaml
├── integration-tests/
│ ├── .gitignore
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ └── java/
│ │ └── org/
│ │ └── signal/
│ │ └── integration/
│ │ ├── Codecs.java
│ │ ├── IntegrationTools.java
│ │ ├── Operations.java
│ │ ├── TestDevice.java
│ │ ├── TestUser.java
│ │ └── config/
│ │ ├── Config.java
│ │ └── DynamoDbTables.java
│ └── test/
│ └── java/
│ └── org/
│ └── signal/
│ └── integration/
│ ├── AccountTest.java
│ ├── MessagingTest.java
│ └── RegistrationTest.java
├── mvnw
├── mvnw.cmd
├── pom.xml
├── service/
│ ├── assembly.xml
│ ├── config/
│ │ ├── sample-secrets-bundle.yml
│ │ └── sample.yml
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── graphql/
│ │ │ └── braintree/
│ │ │ ├── ChargePayPalOneTimePayment.graphql
│ │ │ ├── CreatePayPalBillingAgreement.graphql
│ │ │ ├── CreatePayPalOneTimePayment.graphql
│ │ │ ├── TokenizePayPalBillingAgreement.graphql
│ │ │ ├── TokenizePayPalOneTimePayment.graphql
│ │ │ ├── VaultPaymentMethod.graphql
│ │ │ └── schema.json
│ │ ├── java/
│ │ │ └── org/
│ │ │ ├── signal/
│ │ │ │ └── i18n/
│ │ │ │ ├── HeaderControlledResourceBundleLookup.java
│ │ │ │ └── ResourceBundleFactory.java
│ │ │ └── whispersystems/
│ │ │ └── textsecuregcm/
│ │ │ ├── WhisperServerConfiguration.java
│ │ │ ├── WhisperServerService.java
│ │ │ ├── asn/
│ │ │ │ ├── AsnInfo.java
│ │ │ │ ├── AsnInfoProvider.java
│ │ │ │ ├── AsnInfoProviderImpl.java
│ │ │ │ └── AsnRange.java
│ │ │ ├── attachments/
│ │ │ │ ├── AttachmentGenerator.java
│ │ │ │ ├── AttachmentUtil.java
│ │ │ │ ├── GcsAttachmentGenerator.java
│ │ │ │ ├── TusAttachmentGenerator.java
│ │ │ │ └── TusConfiguration.java
│ │ │ ├── auth/
│ │ │ │ ├── AccountAuthenticator.java
│ │ │ │ ├── Anonymous.java
│ │ │ │ ├── AuthenticatedBackupUser.java
│ │ │ │ ├── AuthenticatedDevice.java
│ │ │ │ ├── BasicAuthorizationHeader.java
│ │ │ │ ├── CertificateGenerator.java
│ │ │ │ ├── ChangesLinkedDevices.java
│ │ │ │ ├── ChangesPhoneNumber.java
│ │ │ │ ├── CloudflareTurnCredentialsManager.java
│ │ │ │ ├── CombinedUnidentifiedSenderAccessKeys.java
│ │ │ │ ├── DisconnectionRequestListener.java
│ │ │ │ ├── DisconnectionRequestManager.java
│ │ │ │ ├── ExternalServiceCredentials.java
│ │ │ │ ├── ExternalServiceCredentialsGenerator.java
│ │ │ │ ├── ExternalServiceCredentialsSelector.java
│ │ │ │ ├── GroupSendTokenHeader.java
│ │ │ │ ├── IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilter.java
│ │ │ │ ├── InvalidAuthorizationHeaderException.java
│ │ │ │ ├── OptionalAccess.java
│ │ │ │ ├── PhoneVerificationTokenManager.java
│ │ │ │ ├── RedemptionRange.java
│ │ │ │ ├── RegistrationLockVerificationManager.java
│ │ │ │ ├── SaltedTokenHash.java
│ │ │ │ ├── StoredRegistrationLock.java
│ │ │ │ ├── TurnToken.java
│ │ │ │ ├── UnidentifiedAccessChecksum.java
│ │ │ │ ├── UnidentifiedAccessUtil.java
│ │ │ │ └── grpc/
│ │ │ │ ├── AuthenticatedDevice.java
│ │ │ │ ├── AuthenticationUtil.java
│ │ │ │ ├── ProhibitAuthenticationInterceptor.java
│ │ │ │ └── RequireAuthenticationInterceptor.java
│ │ │ ├── backup/
│ │ │ │ ├── BackupAuthManager.java
│ │ │ │ ├── BackupBadReceiptException.java
│ │ │ │ ├── BackupException.java
│ │ │ │ ├── BackupFailedZkAuthenticationException.java
│ │ │ │ ├── BackupInvalidArgumentException.java
│ │ │ │ ├── BackupLevelUtil.java
│ │ │ │ ├── BackupManager.java
│ │ │ │ ├── BackupMissingIdCommitmentException.java
│ │ │ │ ├── BackupNotFoundException.java
│ │ │ │ ├── BackupPermissionException.java
│ │ │ │ ├── BackupPublicKeyConflictException.java
│ │ │ │ ├── BackupUploadDescriptor.java
│ │ │ │ ├── BackupWrongCredentialTypeException.java
│ │ │ │ ├── BackupsDb.java
│ │ │ │ ├── Cdn3BackupCredentialGenerator.java
│ │ │ │ ├── Cdn3RemoteStorageManager.java
│ │ │ │ ├── CopyParameters.java
│ │ │ │ ├── CopyResult.java
│ │ │ │ ├── ExpiredBackup.java
│ │ │ │ ├── InvalidLengthException.java
│ │ │ │ ├── MediaEncryptionParameters.java
│ │ │ │ ├── RemoteStorageManager.java
│ │ │ │ ├── SecureValueRecoveryBCredentialsGeneratorFactory.java
│ │ │ │ ├── SourceObjectNotFoundException.java
│ │ │ │ ├── StoredBackupAttributes.java
│ │ │ │ └── UsageInfo.java
│ │ │ ├── badges/
│ │ │ │ ├── BadgeTranslator.java
│ │ │ │ ├── ConfiguredProfileBadgeConverter.java
│ │ │ │ ├── LevelTranslator.java
│ │ │ │ └── ProfileBadgeConverter.java
│ │ │ ├── captcha/
│ │ │ │ ├── Action.java
│ │ │ │ ├── AssessmentResult.java
│ │ │ │ ├── CaptchaChecker.java
│ │ │ │ ├── CaptchaClient.java
│ │ │ │ ├── RegistrationCaptchaManager.java
│ │ │ │ └── ShortCodeExpander.java
│ │ │ ├── configuration/
│ │ │ │ ├── AccountsTableConfiguration.java
│ │ │ │ ├── ApnConfiguration.java
│ │ │ │ ├── AppleAppStoreConfiguration.java
│ │ │ │ ├── AppleDeviceCheckConfiguration.java
│ │ │ │ ├── AwsCredentialsProviderFactory.java
│ │ │ │ ├── BadgeConfiguration.java
│ │ │ │ ├── BadgesConfiguration.java
│ │ │ │ ├── BraintreeConfiguration.java
│ │ │ │ ├── CallQualitySurveyConfiguration.java
│ │ │ │ ├── Cdn3StorageManagerConfiguration.java
│ │ │ │ ├── CdnConfiguration.java
│ │ │ │ ├── CircuitBreakerConfiguration.java
│ │ │ │ ├── ClientReleaseConfiguration.java
│ │ │ │ ├── CloudflareTurnConfiguration.java
│ │ │ │ ├── DefaultAwsCredentialsFactory.java
│ │ │ │ ├── DefaultPubSubPublisherFactory.java
│ │ │ │ ├── DeviceCheckConfiguration.java
│ │ │ │ ├── DirectoryV2ClientConfiguration.java
│ │ │ │ ├── DirectoryV2Configuration.java
│ │ │ │ ├── DynamoDbClientConfiguration.java
│ │ │ │ ├── DynamoDbClientFactory.java
│ │ │ │ ├── DynamoDbTables.java
│ │ │ │ ├── ExternalRequestFilterConfiguration.java
│ │ │ │ ├── FaultTolerantRedisClientFactory.java
│ │ │ │ ├── FaultTolerantRedisClusterFactory.java
│ │ │ │ ├── FcmConfiguration.java
│ │ │ │ ├── GcpAttachmentsConfiguration.java
│ │ │ │ ├── GenericZkConfig.java
│ │ │ │ ├── GooglePlayBillingConfiguration.java
│ │ │ │ ├── GrpcConfiguration.java
│ │ │ │ ├── HlrLookupConfiguration.java
│ │ │ │ ├── IdlePrimaryDeviceReminderConfiguration.java
│ │ │ │ ├── IssuedReceiptsTableConfiguration.java
│ │ │ │ ├── KeyTransparencyServiceConfiguration.java
│ │ │ │ ├── LinkDeviceSecretConfiguration.java
│ │ │ │ ├── MaxDeviceConfiguration.java
│ │ │ │ ├── MessageByteLimitCardinalityEstimatorConfiguration.java
│ │ │ │ ├── MessageCacheConfiguration.java
│ │ │ │ ├── MonitoredS3ObjectConfiguration.java
│ │ │ │ ├── OneTimeDonationConfiguration.java
│ │ │ │ ├── OneTimeDonationCurrencyConfiguration.java
│ │ │ │ ├── OpenTelemetryConfiguration.java
│ │ │ │ ├── PagedSingleUseKEMPreKeyStoreConfiguration.java
│ │ │ │ ├── PaymentsServiceClientsConfiguration.java
│ │ │ │ ├── PaymentsServiceClientsFactory.java
│ │ │ │ ├── PaymentsServiceConfiguration.java
│ │ │ │ ├── PubSubPublisherFactory.java
│ │ │ │ ├── RedisClusterConfiguration.java
│ │ │ │ ├── RedisConfiguration.java
│ │ │ │ ├── RegistrationServiceClientFactory.java
│ │ │ │ ├── RegistrationServiceConfiguration.java
│ │ │ │ ├── RemoteConfigConfiguration.java
│ │ │ │ ├── ReportMessageConfiguration.java
│ │ │ │ ├── RetryConfiguration.java
│ │ │ │ ├── S3ObjectMonitorFactory.java
│ │ │ │ ├── SecureStorageServiceConfiguration.java
│ │ │ │ ├── SecureValueRecoveryConfiguration.java
│ │ │ │ ├── ShortCodeExpanderConfiguration.java
│ │ │ │ ├── SpamFilterConfiguration.java
│ │ │ │ ├── StaticAwsCredentialsFactory.java
│ │ │ │ ├── StripeConfiguration.java
│ │ │ │ ├── SubscriptionConfiguration.java
│ │ │ │ ├── SubscriptionLevelConfiguration.java
│ │ │ │ ├── SubscriptionPriceConfiguration.java
│ │ │ │ ├── TlsKeyStoreConfiguration.java
│ │ │ │ ├── TurnConfiguration.java
│ │ │ │ ├── TurnUriConfiguration.java
│ │ │ │ ├── URLSerializationConverter.java
│ │ │ │ ├── UnidentifiedDeliveryConfiguration.java
│ │ │ │ ├── VirtualThreadConfiguration.java
│ │ │ │ ├── ZkConfig.java
│ │ │ │ ├── dynamic/
│ │ │ │ │ ├── DynamicBackupConfiguration.java
│ │ │ │ │ ├── DynamicCaptchaConfiguration.java
│ │ │ │ │ ├── DynamicCarrierDataLookupConfiguration.java
│ │ │ │ │ ├── DynamicConfiguration.java
│ │ │ │ │ ├── DynamicE164ExperimentEnrollmentConfiguration.java
│ │ │ │ │ ├── DynamicExperimentEnrollmentConfiguration.java
│ │ │ │ │ ├── DynamicGrpcAllowListConfiguration.java
│ │ │ │ │ ├── DynamicMessagePersisterConfiguration.java
│ │ │ │ │ ├── DynamicMetricsConfiguration.java
│ │ │ │ │ ├── DynamicPaymentsConfiguration.java
│ │ │ │ │ ├── DynamicRegistrationConfiguration.java
│ │ │ │ │ ├── DynamicRemoteDeprecationConfiguration.java
│ │ │ │ │ └── DynamicRestDeprecationConfiguration.java
│ │ │ │ └── secrets/
│ │ │ │ ├── BaseSecretValidator.java
│ │ │ │ ├── Secret.java
│ │ │ │ ├── SecretBytes.java
│ │ │ │ ├── SecretBytesList.java
│ │ │ │ ├── SecretStore.java
│ │ │ │ ├── SecretString.java
│ │ │ │ ├── SecretStringList.java
│ │ │ │ └── SecretsModule.java
│ │ │ ├── controllers/
│ │ │ │ ├── AccountController.java
│ │ │ │ ├── AccountControllerV2.java
│ │ │ │ ├── AccountIdentityResponseBuilder.java
│ │ │ │ ├── ArchiveController.java
│ │ │ │ ├── AttachmentControllerV4.java
│ │ │ │ ├── CallLinkController.java
│ │ │ │ ├── CallQualitySurveyController.java
│ │ │ │ ├── CallRoutingControllerV2.java
│ │ │ │ ├── CertificateController.java
│ │ │ │ ├── ChallengeController.java
│ │ │ │ ├── DeviceCheckController.java
│ │ │ │ ├── DeviceController.java
│ │ │ │ ├── DeviceLimitExceededException.java
│ │ │ │ ├── DirectoryV2Controller.java
│ │ │ │ ├── DonationController.java
│ │ │ │ ├── GetCallingRelaysResponse.java
│ │ │ │ ├── KeepAliveController.java
│ │ │ │ ├── KeyTransparencyController.java
│ │ │ │ ├── KeysController.java
│ │ │ │ ├── MessageController.java
│ │ │ │ ├── MismatchedDevices.java
│ │ │ │ ├── MismatchedDevicesException.java
│ │ │ │ ├── MultiRecipientMismatchedDevicesException.java
│ │ │ │ ├── OneTimeDonationController.java
│ │ │ │ ├── PaymentsController.java
│ │ │ │ ├── ProfileController.java
│ │ │ │ ├── ProvisioningController.java
│ │ │ │ ├── RateLimitExceededException.java
│ │ │ │ ├── RegistrationController.java
│ │ │ │ ├── RemoteConfigController.java
│ │ │ │ ├── SecureStorageController.java
│ │ │ │ ├── SecureValueRecovery2Controller.java
│ │ │ │ ├── ServerRejectedException.java
│ │ │ │ ├── StickerController.java
│ │ │ │ ├── SubscriptionController.java
│ │ │ │ ├── VerificationController.java
│ │ │ │ └── VerificationSessionRateLimitExceededException.java
│ │ │ ├── currency/
│ │ │ │ ├── CoinGeckoClient.java
│ │ │ │ ├── CurrencyConversionManager.java
│ │ │ │ └── FixerClient.java
│ │ │ ├── entities/
│ │ │ │ ├── AccountAttributes.java
│ │ │ │ ├── AccountCreationResponse.java
│ │ │ │ ├── AccountDataReportResponse.java
│ │ │ │ ├── AccountIdentifierResponse.java
│ │ │ │ ├── AccountIdentityResponse.java
│ │ │ │ ├── AccountMismatchedDevices.java
│ │ │ │ ├── AccountStaleDevices.java
│ │ │ │ ├── AnswerCaptchaChallengeRequest.java
│ │ │ │ ├── AnswerChallengeRequest.java
│ │ │ │ ├── AnswerPushChallengeRequest.java
│ │ │ │ ├── ApnRegistrationId.java
│ │ │ │ ├── AttachmentDescriptorV3.java
│ │ │ │ ├── AuthCheckRequest.java
│ │ │ │ ├── AuthCheckResponseV2.java
│ │ │ │ ├── AvatarChange.java
│ │ │ │ ├── Badge.java
│ │ │ │ ├── BadgeSvg.java
│ │ │ │ ├── BaseProfileResponse.java
│ │ │ │ ├── BatchIdentityCheckRequest.java
│ │ │ │ ├── BatchIdentityCheckResponse.java
│ │ │ │ ├── ChangeNumberRequest.java
│ │ │ │ ├── CheckKeysRequest.java
│ │ │ │ ├── ConfirmUsernameHashRequest.java
│ │ │ │ ├── CreateCallLinkCredential.java
│ │ │ │ ├── CreateProfileRequest.java
│ │ │ │ ├── CreateVerificationSessionRequest.java
│ │ │ │ ├── CurrencyConversionEntity.java
│ │ │ │ ├── CurrencyConversionEntityList.java
│ │ │ │ ├── DeliveryCertificate.java
│ │ │ │ ├── DeviceActivationRequest.java
│ │ │ │ ├── DeviceInfo.java
│ │ │ │ ├── DeviceInfoList.java
│ │ │ │ ├── DeviceName.java
│ │ │ │ ├── ECPreKey.java
│ │ │ │ ├── ECSignedPreKey.java
│ │ │ │ ├── EncryptedUsername.java
│ │ │ │ ├── Entitlements.java
│ │ │ │ ├── ExpiringProfileKeyCredentialProfileResponse.java
│ │ │ │ ├── ExpiringProfileKeyCredentialResponseAdapter.java
│ │ │ │ ├── GcmRegistrationId.java
│ │ │ │ ├── GetCreateCallLinkCredentialsRequest.java
│ │ │ │ ├── GroupCredentials.java
│ │ │ │ ├── IncomingMessage.java
│ │ │ │ ├── IncomingMessageList.java
│ │ │ │ ├── IncomingWebsocketMessage.java
│ │ │ │ ├── KEMSignedPreKey.java
│ │ │ │ ├── KeyTransparencyDistinguishedKeyResponse.java
│ │ │ │ ├── KeyTransparencyMonitorRequest.java
│ │ │ │ ├── KeyTransparencyMonitorResponse.java
│ │ │ │ ├── KeyTransparencySearchRequest.java
│ │ │ │ ├── KeyTransparencySearchResponse.java
│ │ │ │ ├── LinkDeviceRequest.java
│ │ │ │ ├── LinkDeviceResponse.java
│ │ │ │ ├── MismatchedDevicesResponse.java
│ │ │ │ ├── OutgoingMessageEntity.java
│ │ │ │ ├── OutgoingMessageEntityList.java
│ │ │ │ ├── PhoneNumberDiscoverabilityRequest.java
│ │ │ │ ├── PhoneNumberIdentityKeyDistributionRequest.java
│ │ │ │ ├── PhoneVerificationRequest.java
│ │ │ │ ├── PreKey.java
│ │ │ │ ├── PreKeyCount.java
│ │ │ │ ├── PreKeyResponse.java
│ │ │ │ ├── PreKeyResponseItem.java
│ │ │ │ ├── PreKeySignatureValidator.java
│ │ │ │ ├── ProfileAvatarUploadAttributes.java
│ │ │ │ ├── ProfileKeyCommitmentAdapter.java
│ │ │ │ ├── ProvisioningMessage.java
│ │ │ │ ├── PurchasableBadge.java
│ │ │ │ ├── RateLimitChallenge.java
│ │ │ │ ├── RedeemReceiptRequest.java
│ │ │ │ ├── RegistrationLock.java
│ │ │ │ ├── RegistrationLockFailure.java
│ │ │ │ ├── RegistrationRequest.java
│ │ │ │ ├── RegistrationServiceSession.java
│ │ │ │ ├── RemoteAttachment.java
│ │ │ │ ├── RemoteAttachmentError.java
│ │ │ │ ├── RemoteConfigurationResponse.java
│ │ │ │ ├── ReserveUsernameHashRequest.java
│ │ │ │ ├── ReserveUsernameHashResponse.java
│ │ │ │ ├── RestoreAccountRequest.java
│ │ │ │ ├── SelfBadge.java
│ │ │ │ ├── SendMessageResponse.java
│ │ │ │ ├── SendMultiRecipientMessageResponse.java
│ │ │ │ ├── SetKeysRequest.java
│ │ │ │ ├── SetPublicKeyRequest.java
│ │ │ │ ├── SignedPreKey.java
│ │ │ │ ├── SpamReport.java
│ │ │ │ ├── StaleDevicesResponse.java
│ │ │ │ ├── StickerPackFormUploadAttributes.java
│ │ │ │ ├── SubmitVerificationCodeRequest.java
│ │ │ │ ├── TransferArchiveResult.java
│ │ │ │ ├── TransferArchiveUploadedRequest.java
│ │ │ │ ├── UpdateVerificationSessionRequest.java
│ │ │ │ ├── UserRemoteConfig.java
│ │ │ │ ├── UserRemoteConfigList.java
│ │ │ │ ├── UsernameHashResponse.java
│ │ │ │ ├── UsernameLinkHandle.java
│ │ │ │ ├── VerificationCodeRequest.java
│ │ │ │ ├── VerificationSessionResponse.java
│ │ │ │ └── VersionedProfileResponse.java
│ │ │ ├── experiment/
│ │ │ │ ├── DeviceLastSeenState.java
│ │ │ │ ├── Experiment.java
│ │ │ │ ├── ExperimentEnrollmentManager.java
│ │ │ │ ├── IdleDevicePushNotificationExperiment.java
│ │ │ │ ├── PushNotificationExperiment.java
│ │ │ │ ├── PushNotificationExperimentSample.java
│ │ │ │ └── PushNotificationExperimentSamples.java
│ │ │ ├── filters/
│ │ │ │ ├── ExternalRequestFilter.java
│ │ │ │ ├── RemoteAddressFilter.java
│ │ │ │ ├── RemoteDeprecationFilter.java
│ │ │ │ ├── RequestStatisticsFilter.java
│ │ │ │ ├── RestDeprecationFilter.java
│ │ │ │ └── TimestampResponseFilter.java
│ │ │ ├── gcp/
│ │ │ │ ├── CanonicalRequest.java
│ │ │ │ ├── CanonicalRequestGenerator.java
│ │ │ │ └── CanonicalRequestSigner.java
│ │ │ ├── grpc/
│ │ │ │ ├── AccountsAnonymousGrpcService.java
│ │ │ │ ├── AccountsGrpcService.java
│ │ │ │ ├── AttachmentsGrpcService.java
│ │ │ │ ├── AvatarChangeUtil.java
│ │ │ │ ├── BackupsAnonymousGrpcService.java
│ │ │ │ ├── BackupsGrpcService.java
│ │ │ │ ├── CallQualitySurveyGrpcService.java
│ │ │ │ ├── ChannelNotFoundException.java
│ │ │ │ ├── ConvertibleToGrpcStatus.java
│ │ │ │ ├── DeviceCapabilityUtil.java
│ │ │ │ ├── DeviceIdUtil.java
│ │ │ │ ├── DevicesGrpcService.java
│ │ │ │ ├── ErrorConformanceInterceptor.java
│ │ │ │ ├── ErrorMappingInterceptor.java
│ │ │ │ ├── ExternalServiceCredentialsAnonymousGrpcService.java
│ │ │ │ ├── ExternalServiceCredentialsGrpcService.java
│ │ │ │ ├── ExternalServiceDefinitions.java
│ │ │ │ ├── GroupSendTokenUtil.java
│ │ │ │ ├── GrpcAllowListInterceptor.java
│ │ │ │ ├── GrpcExceptions.java
│ │ │ │ ├── IdentityTypeUtil.java
│ │ │ │ ├── KeyTransparencyGrpcService.java
│ │ │ │ ├── KeysAnonymousGrpcService.java
│ │ │ │ ├── KeysGrpcHelper.java
│ │ │ │ ├── KeysGrpcService.java
│ │ │ │ ├── MessagesAnonymousGrpcService.java
│ │ │ │ ├── MessagesGrpcHelper.java
│ │ │ │ ├── MessagesGrpcService.java
│ │ │ │ ├── MetricServerInterceptor.java
│ │ │ │ ├── PaymentsGrpcService.java
│ │ │ │ ├── ProfileAnonymousGrpcService.java
│ │ │ │ ├── ProfileGrpcHelper.java
│ │ │ │ ├── ProfileGrpcService.java
│ │ │ │ ├── RateLimitUtil.java
│ │ │ │ ├── RequestAttributes.java
│ │ │ │ ├── RequestAttributesInterceptor.java
│ │ │ │ ├── RequestAttributesUtil.java
│ │ │ │ ├── ServerInterceptorUtil.java
│ │ │ │ ├── ServiceIdentifierUtil.java
│ │ │ │ ├── ValidatingInterceptor.java
│ │ │ │ ├── net/
│ │ │ │ │ ├── ManagedGrpcServer.java
│ │ │ │ │ └── ManagedNioEventLoopGroup.java
│ │ │ │ └── validators/
│ │ │ │ ├── BaseFieldValidator.java
│ │ │ │ ├── E164FieldValidator.java
│ │ │ │ ├── EnumSpecifiedFieldValidator.java
│ │ │ │ ├── ExactlySizeFieldValidator.java
│ │ │ │ ├── FieldValidationException.java
│ │ │ │ ├── FieldValidator.java
│ │ │ │ ├── NonEmptyFieldValidator.java
│ │ │ │ ├── PresentFieldValidator.java
│ │ │ │ ├── Range.java
│ │ │ │ ├── RangeFieldValidator.java
│ │ │ │ ├── SizeFieldValidator.java
│ │ │ │ └── ValidatorUtils.java
│ │ │ ├── http/
│ │ │ │ └── FaultTolerantHttpClient.java
│ │ │ ├── identity/
│ │ │ │ ├── AciServiceIdentifier.java
│ │ │ │ ├── IdentityType.java
│ │ │ │ ├── PniServiceIdentifier.java
│ │ │ │ └── ServiceIdentifier.java
│ │ │ ├── jetty/
│ │ │ │ └── JettyHttpConfigurationCustomizer.java
│ │ │ ├── keytransparency/
│ │ │ │ └── KeyTransparencyServiceClient.java
│ │ │ ├── limits/
│ │ │ │ ├── BaseRateLimiters.java
│ │ │ │ ├── CardinalityEstimator.java
│ │ │ │ ├── LeakyBucketRateLimiter.java
│ │ │ │ ├── MessageDeliveryLoopMonitor.java
│ │ │ │ ├── NoopMessageDeliveryLoopMonitor.java
│ │ │ │ ├── PushChallengeManager.java
│ │ │ │ ├── RateLimitByIpFilter.java
│ │ │ │ ├── RateLimitChallengeManager.java
│ │ │ │ ├── RateLimitChallengeOption.java
│ │ │ │ ├── RateLimitChallengeOptionManager.java
│ │ │ │ ├── RateLimitedByIp.java
│ │ │ │ ├── RateLimiter.java
│ │ │ │ ├── RateLimiterConfig.java
│ │ │ │ ├── RateLimiterDescriptor.java
│ │ │ │ ├── RateLimiters.java
│ │ │ │ └── RedisMessageDeliveryLoopMonitor.java
│ │ │ ├── mappers/
│ │ │ │ ├── BackupExceptionMapper.java
│ │ │ │ ├── CompletionExceptionMapper.java
│ │ │ │ ├── DeviceLimitExceededExceptionMapper.java
│ │ │ │ ├── GrpcStatusRuntimeExceptionMapper.java
│ │ │ │ ├── IOExceptionMapper.java
│ │ │ │ ├── ImpossiblePhoneNumberExceptionMapper.java
│ │ │ │ ├── InvalidWebsocketAddressExceptionMapper.java
│ │ │ │ ├── JsonMappingExceptionMapper.java
│ │ │ │ ├── NonNormalizedPhoneNumberExceptionMapper.java
│ │ │ │ ├── NonNormalizedPhoneNumberResponse.java
│ │ │ │ ├── ObsoletePhoneNumberFormatExceptionMapper.java
│ │ │ │ ├── RateLimitExceededExceptionMapper.java
│ │ │ │ ├── RegistrationServiceSenderExceptionMapper.java
│ │ │ │ ├── ServerRejectedExceptionMapper.java
│ │ │ │ └── SubscriptionExceptionMapper.java
│ │ │ ├── metrics/
│ │ │ │ ├── ApplicationShutdownMonitor.java
│ │ │ │ ├── BackupMetrics.java
│ │ │ │ ├── CallQualityInvalidArgumentsException.java
│ │ │ │ ├── CallQualitySurveyManager.java
│ │ │ │ ├── DevicePlatformUtil.java
│ │ │ │ ├── GarbageCollectionGauges.java
│ │ │ │ ├── LogstashTcpSocketAppenderFactory.java
│ │ │ │ ├── MessageMetrics.java
│ │ │ │ ├── MetricsApplicationEventListener.java
│ │ │ │ ├── MetricsHttpChannelListener.java
│ │ │ │ ├── MetricsRequestEventListener.java
│ │ │ │ ├── MetricsUtil.java
│ │ │ │ ├── MicrometerAwsSdkMetricPublisher.java
│ │ │ │ ├── MicrometerRegistryManager.java
│ │ │ │ ├── NoopAwsSdkMetricPublisher.java
│ │ │ │ ├── OpenTelemetryAppenderFactory.java
│ │ │ │ ├── OpenWebSocketCounter.java
│ │ │ │ ├── ReportedMessageMetricsListener.java
│ │ │ │ ├── TlsCertificateExpirationUtil.java
│ │ │ │ ├── TrafficSource.java
│ │ │ │ └── UserAgentTagUtil.java
│ │ │ ├── providers/
│ │ │ │ └── MultiRecipientMessageProvider.java
│ │ │ ├── push/
│ │ │ │ ├── APNSender.java
│ │ │ │ ├── FcmSender.java
│ │ │ │ ├── IdleDeviceNotificationScheduler.java
│ │ │ │ ├── MessageAvailabilityListener.java
│ │ │ │ ├── MessageSender.java
│ │ │ │ ├── MessageTooLargeException.java
│ │ │ │ ├── MessageUtil.java
│ │ │ │ ├── NotPushRegisteredException.java
│ │ │ │ ├── ProvisioningManager.java
│ │ │ │ ├── PushNotification.java
│ │ │ │ ├── PushNotificationManager.java
│ │ │ │ ├── PushNotificationScheduler.java
│ │ │ │ ├── PushNotificationSender.java
│ │ │ │ ├── ReceiptSender.java
│ │ │ │ ├── RedisMessageAvailabilityManager.java
│ │ │ │ └── SendPushNotificationResult.java
│ │ │ ├── redis/
│ │ │ │ ├── AbstractFaultTolerantPubSubConnection.java
│ │ │ │ ├── ClusterLuaScript.java
│ │ │ │ ├── ConnectionEventLogger.java
│ │ │ │ ├── FaultTolerantPubSubClusterConnection.java
│ │ │ │ ├── FaultTolerantPubSubConnection.java
│ │ │ │ ├── FaultTolerantRedisClient.java
│ │ │ │ ├── FaultTolerantRedisClusterClient.java
│ │ │ │ ├── LettuceShardCircuitBreaker.java
│ │ │ │ ├── NettyUtil.java
│ │ │ │ ├── RedisOperation.java
│ │ │ │ └── RedisUriUtil.java
│ │ │ ├── registration/
│ │ │ │ ├── ClientType.java
│ │ │ │ ├── IdentityTokenCallCredentials.java
│ │ │ │ ├── MessageTransport.java
│ │ │ │ ├── RegistrationFraudException.java
│ │ │ │ ├── RegistrationServiceClient.java
│ │ │ │ ├── RegistrationServiceException.java
│ │ │ │ ├── RegistrationServiceSenderException.java
│ │ │ │ ├── TransportNotAllowedException.java
│ │ │ │ └── VerificationSession.java
│ │ │ ├── s3/
│ │ │ │ ├── ManagedSupplier.java
│ │ │ │ ├── PolicySigner.java
│ │ │ │ ├── PostPolicyGenerator.java
│ │ │ │ ├── S3MonitoringSupplier.java
│ │ │ │ └── S3ObjectMonitor.java
│ │ │ ├── scheduler/
│ │ │ │ ├── JobScheduler.java
│ │ │ │ └── SchedulingUtil.java
│ │ │ ├── securestorage/
│ │ │ │ ├── SecureStorageClient.java
│ │ │ │ └── SecureStorageException.java
│ │ │ ├── securevaluerecovery/
│ │ │ │ ├── SecureValueRecoveryClient.java
│ │ │ │ └── SecureValueRecoveryException.java
│ │ │ ├── spam/
│ │ │ │ ├── ChallengeConstraintChecker.java
│ │ │ │ ├── ChallengeType.java
│ │ │ │ ├── GrpcChallengeResponse.java
│ │ │ │ ├── MessageDeliveryListener.java
│ │ │ │ ├── MessageType.java
│ │ │ │ ├── RateLimitChallengeListener.java
│ │ │ │ ├── RegistrationFraudChecker.java
│ │ │ │ ├── RegistrationRecoveryChecker.java
│ │ │ │ ├── SpamCheckResult.java
│ │ │ │ ├── SpamChecker.java
│ │ │ │ └── SpamFilter.java
│ │ │ ├── storage/
│ │ │ │ ├── AbstractDynamoDbStore.java
│ │ │ │ ├── Account.java
│ │ │ │ ├── AccountAlreadyExistsException.java
│ │ │ │ ├── AccountBadge.java
│ │ │ │ ├── AccountChangeValidator.java
│ │ │ │ ├── AccountLockManager.java
│ │ │ │ ├── AccountUtil.java
│ │ │ │ ├── Accounts.java
│ │ │ │ ├── AccountsManager.java
│ │ │ │ ├── ChangeNumberManager.java
│ │ │ │ ├── ChunkProcessingFailedException.java
│ │ │ │ ├── ClientRelease.java
│ │ │ │ ├── ClientReleaseManager.java
│ │ │ │ ├── ClientReleases.java
│ │ │ │ ├── ConflictingMessageConsumerException.java
│ │ │ │ ├── ContestedOptimisticLockException.java
│ │ │ │ ├── Device.java
│ │ │ │ ├── DeviceCapability.java
│ │ │ │ ├── DeviceIdDeserializer.java
│ │ │ │ ├── DeviceKEMPreKeyPages.java
│ │ │ │ ├── DeviceSpec.java
│ │ │ │ ├── DynamicConfigurationManager.java
│ │ │ │ ├── DynamoDbRecoveryManager.java
│ │ │ │ ├── EnvelopeUtil.java
│ │ │ │ ├── IssuedReceiptsManager.java
│ │ │ │ ├── KEMPreKeyPage.java
│ │ │ │ ├── KeyIdUtil.java
│ │ │ │ ├── KeysManager.java
│ │ │ │ ├── LinkDeviceTokenAlreadyUsedException.java
│ │ │ │ ├── MessagePersistenceException.java
│ │ │ │ ├── MessagePersister.java
│ │ │ │ ├── MessageStream.java
│ │ │ │ ├── MessageStreamEntry.java
│ │ │ │ ├── MessagesCache.java
│ │ │ │ ├── MessagesCacheGetItemsScript.java
│ │ │ │ ├── MessagesCacheInsertScript.java
│ │ │ │ ├── MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScript.java
│ │ │ │ ├── MessagesCacheReleaseNodeClaimScript.java
│ │ │ │ ├── MessagesCacheRemoveByGuidScript.java
│ │ │ │ ├── MessagesCacheRemoveQueueScript.java
│ │ │ │ ├── MessagesCacheRemoveRecipientViewFromMrmDataScript.java
│ │ │ │ ├── MessagesCacheUnlockQueueScript.java
│ │ │ │ ├── MessagesDynamoDb.java
│ │ │ │ ├── MessagesManager.java
│ │ │ │ ├── MrmDataMissingException.java
│ │ │ │ ├── OneTimeDonationsManager.java
│ │ │ │ ├── OptimisticLockRetryLimitExceededException.java
│ │ │ │ ├── PagedSingleUseKEMPreKeyStore.java
│ │ │ │ ├── PaymentTime.java
│ │ │ │ ├── PersistentTimer.java
│ │ │ │ ├── PhoneNumberIdentifiers.java
│ │ │ │ ├── Profiles.java
│ │ │ │ ├── ProfilesManager.java
│ │ │ │ ├── PushChallengeDynamoDb.java
│ │ │ │ ├── RedeemedReceiptsManager.java
│ │ │ │ ├── RedisDynamoDbMessagePublisher.java
│ │ │ │ ├── RedisDynamoDbMessageStream.java
│ │ │ │ ├── RefreshingAccountNotFoundException.java
│ │ │ │ ├── RegistrationRecoveryPasswords.java
│ │ │ │ ├── RegistrationRecoveryPasswordsManager.java
│ │ │ │ ├── RemoteConfig.java
│ │ │ │ ├── RemoteConfigs.java
│ │ │ │ ├── RemoteConfigsManager.java
│ │ │ │ ├── RemovedMessage.java
│ │ │ │ ├── RepeatedUseECSignedPreKeyStore.java
│ │ │ │ ├── RepeatedUseKEMSignedPreKeyStore.java
│ │ │ │ ├── RepeatedUseSignedPreKeyStore.java
│ │ │ │ ├── ReportMessageDynamoDb.java
│ │ │ │ ├── ReportMessageManager.java
│ │ │ │ ├── ReportedMessageListener.java
│ │ │ │ ├── SerializedExpireableJsonDynamoStore.java
│ │ │ │ ├── SingleUseECPreKeyStore.java
│ │ │ │ ├── SubscriberCredentials.java
│ │ │ │ ├── SubscriptionManager.java
│ │ │ │ ├── Subscriptions.java
│ │ │ │ ├── UsernameHashNotAvailableException.java
│ │ │ │ ├── UsernameReservationNotFoundException.java
│ │ │ │ ├── VerificationSessionManager.java
│ │ │ │ ├── VerificationSessions.java
│ │ │ │ ├── VersionedProfile.java
│ │ │ │ ├── devicecheck/
│ │ │ │ │ ├── AppleDeviceCheckManager.java
│ │ │ │ │ ├── AppleDeviceCheckTrustAnchor.java
│ │ │ │ │ ├── AppleDeviceChecks.java
│ │ │ │ │ ├── ChallengeNotFoundException.java
│ │ │ │ │ ├── DeviceCheckKeyIdNotFoundException.java
│ │ │ │ │ ├── DeviceCheckVerificationFailedException.java
│ │ │ │ │ ├── DuplicatePublicKeyException.java
│ │ │ │ │ ├── RequestReuseException.java
│ │ │ │ │ └── TooManyKeysException.java
│ │ │ │ └── foundationdb/
│ │ │ │ └── FoundationDbMessageStore.java
│ │ │ ├── subscriptions/
│ │ │ │ ├── AppleAppStoreClient.java
│ │ │ │ ├── AppleAppStoreDecodedTransaction.java
│ │ │ │ ├── AppleAppStoreManager.java
│ │ │ │ ├── BankMandateTranslator.java
│ │ │ │ ├── BankTransferType.java
│ │ │ │ ├── BraintreeGraphqlClient.java
│ │ │ │ ├── BraintreeManager.java
│ │ │ │ ├── BraintreePlanMetadata.java
│ │ │ │ ├── ChargeFailure.java
│ │ │ │ ├── CustomerAwareSubscriptionPaymentProcessor.java
│ │ │ │ ├── GooglePlayBillingManager.java
│ │ │ │ ├── PayPalDonationsTranslator.java
│ │ │ │ ├── PaymentDetails.java
│ │ │ │ ├── PaymentMethod.java
│ │ │ │ ├── PaymentProvider.java
│ │ │ │ ├── PaymentStatus.java
│ │ │ │ ├── ProcessorCustomer.java
│ │ │ │ ├── StripeManager.java
│ │ │ │ ├── SubscriptionChargeFailurePaymentRequiredException.java
│ │ │ │ ├── SubscriptionCurrencyUtil.java
│ │ │ │ ├── SubscriptionException.java
│ │ │ │ ├── SubscriptionForbiddenException.java
│ │ │ │ ├── SubscriptionInformation.java
│ │ │ │ ├── SubscriptionInvalidAmountException.java
│ │ │ │ ├── SubscriptionInvalidArgumentsException.java
│ │ │ │ ├── SubscriptionInvalidLevelException.java
│ │ │ │ ├── SubscriptionNotFoundException.java
│ │ │ │ ├── SubscriptionPaymentProcessor.java
│ │ │ │ ├── SubscriptionPaymentRequiredException.java
│ │ │ │ ├── SubscriptionPaymentRequiresActionException.java
│ │ │ │ ├── SubscriptionPrice.java
│ │ │ │ ├── SubscriptionProcessorConflictException.java
│ │ │ │ ├── SubscriptionProcessorException.java
│ │ │ │ ├── SubscriptionReceiptRequestedForOpenPaymentException.java
│ │ │ │ └── SubscriptionStatus.java
│ │ │ ├── telephony/
│ │ │ │ ├── CarrierData.java
│ │ │ │ ├── CarrierDataException.java
│ │ │ │ ├── CarrierDataProvider.java
│ │ │ │ └── hlrlookup/
│ │ │ │ ├── HlrLookupCarrierDataProvider.java
│ │ │ │ ├── HlrLookupRequest.java
│ │ │ │ ├── HlrLookupResponse.java
│ │ │ │ ├── HlrLookupResult.java
│ │ │ │ ├── NetworkDetails.java
│ │ │ │ └── TelephoneNumberRequest.java
│ │ │ ├── util/
│ │ │ │ ├── AbstractPublicKeyDeserializer.java
│ │ │ │ ├── AbstractPublicKeySerializer.java
│ │ │ │ ├── AsyncTimerUtil.java
│ │ │ │ ├── AttributeValues.java
│ │ │ │ ├── BackupAuthCredentialAdapter.java
│ │ │ │ ├── BoundedVirtualThreadFactory.java
│ │ │ │ ├── BufferingInterceptor.java
│ │ │ │ ├── ByteArrayAdapter.java
│ │ │ │ ├── ByteArrayBase64UrlAdapter.java
│ │ │ │ ├── ByteArrayBase64WithPaddingAdapter.java
│ │ │ │ ├── CertificateUtil.java
│ │ │ │ ├── ClosableEpoch.java
│ │ │ │ ├── CompletableFutureUtil.java
│ │ │ │ ├── Constants.java
│ │ │ │ ├── Conversions.java
│ │ │ │ ├── DeviceCapabilityAdapter.java
│ │ │ │ ├── DeviceNameByteArrayAdapter.java
│ │ │ │ ├── E164.java
│ │ │ │ ├── ECPublicKeyAdapter.java
│ │ │ │ ├── EncryptDeviceCreationTimestampUtil.java
│ │ │ │ ├── EnumMapUtil.java
│ │ │ │ ├── ExactlySize.java
│ │ │ │ ├── ExactlySizeValidator.java
│ │ │ │ ├── ExactlySizeValidatorForArraysOfByte.java
│ │ │ │ ├── ExactlySizeValidatorForCollection.java
│ │ │ │ ├── ExactlySizeValidatorForSecretBytes.java
│ │ │ │ ├── ExactlySizeValidatorForString.java
│ │ │ │ ├── ExceptionUtils.java
│ │ │ │ ├── ExecutorUtil.java
│ │ │ │ ├── Futures.java
│ │ │ │ ├── GoogleApiUtil.java
│ │ │ │ ├── HeaderUtils.java
│ │ │ │ ├── HmacUtils.java
│ │ │ │ ├── HostnameUtil.java
│ │ │ │ ├── HttpServletRequestUtil.java
│ │ │ │ ├── HttpUtils.java
│ │ │ │ ├── IdentityKeyAdapter.java
│ │ │ │ ├── ImpossiblePhoneNumberException.java
│ │ │ │ ├── InetAddressRange.java
│ │ │ │ ├── InstantAdapter.java
│ │ │ │ ├── JmxDumper.java
│ │ │ │ ├── KEMPublicKeyAdapter.java
│ │ │ │ ├── LinkDeviceToken.java
│ │ │ │ ├── ManagedAwsCrt.java
│ │ │ │ ├── ManagedExecutors.java
│ │ │ │ ├── NoStackTraceException.java
│ │ │ │ ├── NoStackTraceRuntimeException.java
│ │ │ │ ├── NonNormalizedPhoneNumberException.java
│ │ │ │ ├── ObsoletePhoneNumberFormatException.java
│ │ │ │ ├── Optionals.java
│ │ │ │ ├── Pair.java
│ │ │ │ ├── ProfileHelper.java
│ │ │ │ ├── RedisClusterUtil.java
│ │ │ │ ├── RegistrationIdValidator.java
│ │ │ │ ├── ResilienceUtil.java
│ │ │ │ ├── ServiceIdentifierAdapter.java
│ │ │ │ ├── SystemMapper.java
│ │ │ │ ├── ThrowingConsumer.java
│ │ │ │ ├── ThrowingSupplier.java
│ │ │ │ ├── UUIDUtil.java
│ │ │ │ ├── UsernameHashZkProofVerifier.java
│ │ │ │ ├── Util.java
│ │ │ │ ├── ValidBase64URLString.java
│ │ │ │ ├── ValidHexString.java
│ │ │ │ ├── VirtualExecutorServiceProvider.java
│ │ │ │ ├── VirtualThreadPinEventMonitor.java
│ │ │ │ ├── WeightedRandomSelect.java
│ │ │ │ ├── logging/
│ │ │ │ │ ├── LoggingUnhandledExceptionMapper.java
│ │ │ │ │ ├── RequestLogEnabledFilter.java
│ │ │ │ │ ├── RequestLogEnabledFilterFactory.java
│ │ │ │ │ ├── RequestLogManager.java
│ │ │ │ │ ├── UncaughtExceptionHandler.java
│ │ │ │ │ ├── UnknownKeepaliveOptionFilter.java
│ │ │ │ │ ├── UnknownKeepaliveOptionFilterFactory.java
│ │ │ │ │ └── UriInfoUtil.java
│ │ │ │ └── ua/
│ │ │ │ ├── ClientPlatform.java
│ │ │ │ ├── UnrecognizedUserAgentException.java
│ │ │ │ ├── UserAgent.java
│ │ │ │ └── UserAgentUtil.java
│ │ │ ├── websocket/
│ │ │ │ ├── AuthenticatedConnectListener.java
│ │ │ │ ├── InvalidWebsocketAddressException.java
│ │ │ │ ├── NoContextTakeoverPerMessageDeflateExtension.java
│ │ │ │ ├── ProvisioningConnectListener.java
│ │ │ │ ├── WebSocketAccountAuthenticator.java
│ │ │ │ └── WebSocketConnection.java
│ │ │ └── workers/
│ │ │ ├── AbstractCommandWithDependencies.java
│ │ │ ├── AbstractSinglePassCrawlAccountsCommand.java
│ │ │ ├── BackupMetricsCommand.java
│ │ │ ├── BackupUsageRecalculationCommand.java
│ │ │ ├── CertificateCommand.java
│ │ │ ├── CheckDynamicConfigurationCommand.java
│ │ │ ├── ClearIssuedReceiptRedemptionsCommand.java
│ │ │ ├── CommandDependencies.java
│ │ │ ├── DeleteUserCommand.java
│ │ │ ├── DiscardPushNotificationExperimentSamplesCommand.java
│ │ │ ├── FinishPushNotificationExperimentCommand.java
│ │ │ ├── IdleDeviceNotificationSchedulerFactory.java
│ │ │ ├── IdleWakeupEligibilityChecker.java
│ │ │ ├── JobSchedulerFactory.java
│ │ │ ├── MessagePersisterServiceCommand.java
│ │ │ ├── NotifyIdleDevicesCommand.java
│ │ │ ├── ProcessScheduledJobsServiceCommand.java
│ │ │ ├── PushNotificationExperimentFactory.java
│ │ │ ├── RegenerateSecondaryDynamoDbTableDataCommand.java
│ │ │ ├── RemoveExpiredAccountsCommand.java
│ │ │ ├── RemoveExpiredBackupsCommand.java
│ │ │ ├── RemoveExpiredLinkedDevicesCommand.java
│ │ │ ├── RemoveExpiredUsernameHoldsCommand.java
│ │ │ ├── RemoveOrphanedPreKeyPagesCommand.java
│ │ │ ├── ScheduledApnPushNotificationSenderServiceCommand.java
│ │ │ ├── ServerVersionCommand.java
│ │ │ ├── SetRequestLoggingEnabledTask.java
│ │ │ ├── SetUserDiscoverabilityCommand.java
│ │ │ ├── StartPushNotificationExperimentCommand.java
│ │ │ ├── UnlinkDeviceCommand.java
│ │ │ ├── UnlinkDevicesWithIdlePrimaryCommand.java
│ │ │ └── ZkParamsCommand.java
│ │ ├── java-templates/
│ │ │ └── org/
│ │ │ └── whispersystems/
│ │ │ └── textsecuregcm/
│ │ │ ├── WhisperServerVersion.java
│ │ │ └── storage/
│ │ │ └── FoundationDbVersion.java
│ │ ├── proto/
│ │ │ ├── CallQualitySurveyPubSub.proto
│ │ │ ├── DisconnectionRequests.proto
│ │ │ ├── DonationsPubsub.proto
│ │ │ ├── KeyTransparencyService.proto
│ │ │ ├── PubSubMessage.proto
│ │ │ ├── RegistrationService.proto
│ │ │ ├── TextSecure.proto
│ │ │ ├── WebSocketConnectionEvent.proto
│ │ │ └── org/
│ │ │ └── signal/
│ │ │ └── chat/
│ │ │ ├── README.md
│ │ │ ├── account.proto
│ │ │ ├── attachments.proto
│ │ │ ├── backups.proto
│ │ │ ├── call_quality.proto
│ │ │ ├── calling.proto
│ │ │ ├── common.proto
│ │ │ ├── credentials.proto
│ │ │ ├── device.proto
│ │ │ ├── errors.proto
│ │ │ ├── keys.proto
│ │ │ ├── messages.proto
│ │ │ ├── payments.proto
│ │ │ ├── profile.proto
│ │ │ ├── require.proto
│ │ │ └── tag.proto
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ ├── services/
│ │ │ │ ├── io.dropwizard.jackson.Discoverable
│ │ │ │ ├── io.dropwizard.logging.common.AppenderFactory
│ │ │ │ ├── io.dropwizard.logging.common.filter.FilterFactory
│ │ │ │ └── org.whispersystems.textsecuregcm.configuration.AwsCredentialsProviderFactory
│ │ │ ├── validation/
│ │ │ │ └── constraints-custom.xml
│ │ │ └── validation.xml
│ │ ├── banner.txt
│ │ ├── lua/
│ │ │ ├── apn/
│ │ │ │ └── schedule_background_notification.lua
│ │ │ ├── get_delivery_attempt_count.lua
│ │ │ ├── get_items.lua
│ │ │ ├── insert_item.lua
│ │ │ ├── insert_shared_multirecipient_message_data.lua
│ │ │ ├── release_node_claim.lua
│ │ │ ├── remove_item_by_guid.lua
│ │ │ ├── remove_queue.lua
│ │ │ ├── remove_recipient_view_from_mrm_data.lua
│ │ │ ├── unlock_queue.lua
│ │ │ └── validate_rate_limit.lua
│ │ └── org/
│ │ ├── signal/
│ │ │ ├── badges/
│ │ │ │ ├── Badges.properties
│ │ │ │ └── Badges_en.properties
│ │ │ ├── bankmandate/
│ │ │ │ └── BankMandate.properties
│ │ │ └── donations/
│ │ │ └── PayPal.properties
│ │ └── whispersystems/
│ │ └── textsecuregcm/
│ │ ├── push/
│ │ │ └── apns-certificates.pem
│ │ └── storage/
│ │ └── devicecheck/
│ │ └── apple_device_check.pem
│ └── test/
│ ├── java/
│ │ └── org/
│ │ └── whispersystems/
│ │ └── textsecuregcm/
│ │ ├── BufferingInterceptorIntegrationTest.java
│ │ ├── CheckServiceConfigurations.java
│ │ ├── LocalWhisperServerService.java
│ │ ├── ProvisioningTimeoutIntegrationTest.java
│ │ ├── WebsocketResourceProviderIntegrationTest.java
│ │ ├── WhisperServerServiceTest.java
│ │ ├── asn/
│ │ │ └── AsnInfoProviderImplTest.java
│ │ ├── auth/
│ │ │ ├── AccountAuthenticatorTest.java
│ │ │ ├── BasicAuthorizationHeaderTest.java
│ │ │ ├── CertificateGeneratorTest.java
│ │ │ ├── CloudflareTurnCredentialsManagerTest.java
│ │ │ ├── DisconnectionRequestManagerTest.java
│ │ │ ├── ExternalServiceCredentialsGeneratorTest.java
│ │ │ ├── ExternalServiceCredentialsSelectorTest.java
│ │ │ ├── IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilterTest.java
│ │ │ ├── OptionalAccessTest.java
│ │ │ ├── RedemptionRangeTest.java
│ │ │ ├── RegistrationLockError.java
│ │ │ ├── RegistrationLockVerificationManagerTest.java
│ │ │ ├── SaltedTokenHashTest.java
│ │ │ ├── StoredRegistrationLockTest.java
│ │ │ ├── UnidentifiedAccessChecksumTest.java
│ │ │ ├── UnidentifiedAccessUtilTest.java
│ │ │ └── grpc/
│ │ │ ├── BasicAuthCallCredentials.java
│ │ │ ├── MockAuthenticationInterceptor.java
│ │ │ ├── ProhibitAuthenticationInterceptorTest.java
│ │ │ └── RequireAuthenticationInterceptorTest.java
│ │ ├── backup/
│ │ │ ├── BackupAuthManagerTest.java
│ │ │ ├── BackupAuthTestUtil.java
│ │ │ ├── BackupManagerTest.java
│ │ │ ├── BackupsDbTest.java
│ │ │ ├── Cdn3BackupCredentialGeneratorTest.java
│ │ │ └── Cdn3RemoteStorageManagerTest.java
│ │ ├── badges/
│ │ │ └── ConfiguredProfileBadgeConverterTest.java
│ │ ├── captcha/
│ │ │ ├── CaptchaCheckerTest.java
│ │ │ └── ShortCodeExpanderTest.java
│ │ ├── configuration/
│ │ │ ├── LocalDynamoDbFactory.java
│ │ │ ├── LocalFaultTolerantRedisClientFactory.java
│ │ │ ├── LocalFaultTolerantRedisClusterFactory.java
│ │ │ ├── StaticS3ObjectMonitorFactory.java
│ │ │ ├── StubPaymentsServiceClientsFactory.java
│ │ │ ├── StubPubSubPublisherFactory.java
│ │ │ ├── StubRegistrationServiceClientFactory.java
│ │ │ ├── dynamic/
│ │ │ │ └── DynamicConfigurationTest.java
│ │ │ └── secrets/
│ │ │ └── SecretsTest.java
│ │ ├── controllers/
│ │ │ ├── AbstractV1SubscriptionControllerTest.java
│ │ │ ├── AccountControllerTest.java
│ │ │ ├── AccountControllerV2Test.java
│ │ │ ├── AccountIdentityResponseBuilderTest.java
│ │ │ ├── ArchiveControllerTest.java
│ │ │ ├── AttachmentControllerV4Test.java
│ │ │ ├── CallLinkControllerTest.java
│ │ │ ├── CallQualitySurveyControllerTest.java
│ │ │ ├── CallRoutingControllerV2Test.java
│ │ │ ├── CertificateControllerTest.java
│ │ │ ├── ChallengeControllerTest.java
│ │ │ ├── DeviceCheckControllerTest.java
│ │ │ ├── DeviceControllerTest.java
│ │ │ ├── DirectoryControllerV2Test.java
│ │ │ ├── DonationControllerTest.java
│ │ │ ├── KeyTransparencyControllerTest.java
│ │ │ ├── KeysControllerTest.java
│ │ │ ├── MessageControllerTest.java
│ │ │ ├── OneTimeDonationControllerTest.java
│ │ │ ├── PaymentsControllerTest.java
│ │ │ ├── ProfileControllerTest.java
│ │ │ ├── ProvisioningControllerTest.java
│ │ │ ├── RegistrationControllerTest.java
│ │ │ ├── RemoteConfigControllerTest.java
│ │ │ ├── SecureStorageControllerTest.java
│ │ │ ├── SecureValueRecovery2ControllerTest.java
│ │ │ ├── StickerControllerTest.java
│ │ │ ├── SubscriptionControllerTest.java
│ │ │ └── VerificationControllerTest.java
│ │ ├── currency/
│ │ │ ├── CoinGeckoClientTest.java
│ │ │ ├── CurrencyConversionManagerTest.java
│ │ │ └── FixerClientTest.java
│ │ ├── entities/
│ │ │ ├── AnswerChallengeRequestTest.java
│ │ │ ├── IncomingMessageListTest.java
│ │ │ ├── OutgoingMessageEntityTest.java
│ │ │ └── PreKeyTest.java
│ │ ├── experiment/
│ │ │ ├── ExperimentEnrollmentManagerTest.java
│ │ │ ├── ExperimentTest.java
│ │ │ ├── IdleDevicePushNotificationExperimentTest.java
│ │ │ └── PushNotificationExperimentSamplesTest.java
│ │ ├── filters/
│ │ │ ├── ExternalRequestFilterTest.java
│ │ │ ├── RemoteAddressFilterIntegrationTest.java
│ │ │ ├── RemoteAddressFilterTest.java
│ │ │ ├── RemoteDeprecationFilterTest.java
│ │ │ ├── RequestStatisticsFilterTest.java
│ │ │ ├── RestDeprecationFilterTest.java
│ │ │ └── TimestampResponseFilterTest.java
│ │ ├── grpc/
│ │ │ ├── AccountsAnonymousGrpcServiceTest.java
│ │ │ ├── AccountsGrpcServiceTest.java
│ │ │ ├── AttachmentsGrpcServiceTest.java
│ │ │ ├── BackupsAnonymousGrpcServiceTest.java
│ │ │ ├── BackupsGrpcServiceTest.java
│ │ │ ├── CallQualitySurveyGrpcServiceTest.java
│ │ │ ├── DevicesGrpcServiceTest.java
│ │ │ ├── EchoServiceImpl.java
│ │ │ ├── ErrorMappingInterceptorTest.java
│ │ │ ├── ExternalServiceCredentialsAnonymousGrpcServiceTest.java
│ │ │ ├── ExternalServiceCredentialsGrpcServiceTest.java
│ │ │ ├── GrpcAllowListInterceptorTest.java
│ │ │ ├── GrpcServerExtension.java
│ │ │ ├── GrpcTestUtils.java
│ │ │ ├── KeyTransparencyGrpcServiceTest.java
│ │ │ ├── KeysAnonymousGrpcServiceTest.java
│ │ │ ├── KeysGrpcServiceTest.java
│ │ │ ├── MessagesAnonymousGrpcServiceTest.java
│ │ │ ├── MessagesGrpcServiceTest.java
│ │ │ ├── MetricServerInterceptorTest.java
│ │ │ ├── MockRequestAttributesInterceptor.java
│ │ │ ├── PaymentsGrpcServiceTest.java
│ │ │ ├── ProfileAnonymousGrpcServiceTest.java
│ │ │ ├── ProfileGrpcServiceTest.java
│ │ │ ├── RequestAttributesInterceptorTest.java
│ │ │ ├── RequestAttributesServiceImpl.java
│ │ │ ├── RequestAttributesUtilTest.java
│ │ │ ├── SimpleBaseGrpcTest.java
│ │ │ └── ValidatingInterceptorTest.java
│ │ ├── http/
│ │ │ └── FaultTolerantHttpClientTest.java
│ │ ├── identity/
│ │ │ ├── AciServiceIdentifierTest.java
│ │ │ ├── PniServiceIdentifierTest.java
│ │ │ └── ServiceIdentifierTest.java
│ │ ├── limits/
│ │ │ ├── CardinalityEstimatorTest.java
│ │ │ ├── LeakyBucketRateLimiterTest.java
│ │ │ ├── MessageDeliveryLoopMonitorTest.java
│ │ │ ├── RateLimitChallengeManagerTest.java
│ │ │ ├── RateLimitChallengeOptionManagerTest.java
│ │ │ ├── RateLimitedByIpTest.java
│ │ │ ├── RateLimiterConfigTest.java
│ │ │ ├── RateLimitersLuaScriptTest.java
│ │ │ └── RateLimitersTest.java
│ │ ├── mappers/
│ │ │ ├── GrpcStatusRuntimeExceptionMapperTest.java
│ │ │ └── IOExceptionMapperTest.java
│ │ ├── metrics/
│ │ │ ├── CallQualitySurveyManagerTest.java
│ │ │ ├── MessageMetricsTest.java
│ │ │ ├── MetricsHttpChannelListenerIntegrationTest.java
│ │ │ ├── MetricsHttpChannelListenerTest.java
│ │ │ ├── MetricsRequestEventListenerTest.java
│ │ │ ├── MetricsUtilTest.java
│ │ │ ├── TlsCertificateExpirationUtilTest.java
│ │ │ └── UserAgentTagUtilTest.java
│ │ ├── push/
│ │ │ ├── APNSenderTest.java
│ │ │ ├── FcmSenderTest.java
│ │ │ ├── IdleDeviceNotificationSchedulerTest.java
│ │ │ ├── MessageSenderTest.java
│ │ │ ├── ProvisioningManagerTest.java
│ │ │ ├── PushNotificationManagerTest.java
│ │ │ ├── PushNotificationSchedulerTest.java
│ │ │ └── RedisMessageAvailabilityManagerTest.java
│ │ ├── redis/
│ │ │ ├── ClusterLuaScriptTest.java
│ │ │ ├── FaultTolerantPubSubClusterConnectionTest.java
│ │ │ ├── FaultTolerantRedisClientTest.java
│ │ │ ├── FaultTolerantRedisClusterClientTest.java
│ │ │ ├── LettuceShardCircuitBreakerTest.java
│ │ │ ├── RedisClusterExtension.java
│ │ │ └── RedisServerExtension.java
│ │ ├── registration/
│ │ │ └── IdentityTokenCallCredentialsTest.java
│ │ ├── s3/
│ │ │ ├── PolicySignerTest.java
│ │ │ └── S3ObjectMonitorTest.java
│ │ ├── scheduler/
│ │ │ ├── JobSchedulerTest.java
│ │ │ └── SchedulingUtilTest.java
│ │ ├── securestorage/
│ │ │ └── SecureStorageClientTest.java
│ │ ├── securevaluerecovery/
│ │ │ └── SecureValueRecoveryClientTest.java
│ │ ├── storage/
│ │ │ ├── AccountChangeValidatorTest.java
│ │ │ ├── AccountCreationDeletionIntegrationTest.java
│ │ │ ├── AccountLockManagerTest.java
│ │ │ ├── AccountTest.java
│ │ │ ├── AccountsManagerChangeNumberIntegrationTest.java
│ │ │ ├── AccountsManagerConcurrentModificationIntegrationTest.java
│ │ │ ├── AccountsManagerDeviceTransferIntegrationTest.java
│ │ │ ├── AccountsManagerTest.java
│ │ │ ├── AccountsManagerUsernameIntegrationTest.java
│ │ │ ├── AccountsTest.java
│ │ │ ├── AddRemoveDeviceIntegrationTest.java
│ │ │ ├── ChangeNumberManagerTest.java
│ │ │ ├── ClientReleaseManagerTest.java
│ │ │ ├── ClientReleasesTest.java
│ │ │ ├── DeviceTest.java
│ │ │ ├── DynamicConfigurationManagerTest.java
│ │ │ ├── DynamoDbExtension.java
│ │ │ ├── DynamoDbExtensionSchema.java
│ │ │ ├── EnvelopeUtilTest.java
│ │ │ ├── FoundationDbClusterExtension.java
│ │ │ ├── FoundationDbDatabaseLifecycleManager.java
│ │ │ ├── IssuedReceiptsManagerTest.java
│ │ │ ├── KEMPreKeyPageTest.java
│ │ │ ├── KeysManagerTest.java
│ │ │ ├── MessagePersisterIntegrationTest.java
│ │ │ ├── MessagePersisterTest.java
│ │ │ ├── MessagesCacheGetItemsScriptTest.java
│ │ │ ├── MessagesCacheInsertScriptTest.java
│ │ │ ├── MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScriptTest.java
│ │ │ ├── MessagesCacheRemoveByGuidScriptTest.java
│ │ │ ├── MessagesCacheRemoveQueueScriptTest.java
│ │ │ ├── MessagesCacheRemoveRecipientViewFromMrmDataScriptTest.java
│ │ │ ├── MessagesCacheTest.java
│ │ │ ├── MessagesDynamoDbTest.java
│ │ │ ├── MessagesManagerTest.java
│ │ │ ├── OnetimeDonationsManagerTest.java
│ │ │ ├── PagedSingleUseKEMPreKeyStoreTest.java
│ │ │ ├── PersistentTimerTest.java
│ │ │ ├── PhoneNumberIdentifiersTest.java
│ │ │ ├── ProfilesManagerTest.java
│ │ │ ├── ProfilesTest.java
│ │ │ ├── PushChallengeDynamoDbTest.java
│ │ │ ├── RedeemedReceiptsManagerTest.java
│ │ │ ├── RedisDynamoDbMessagePublisherTest.java
│ │ │ ├── RedisDynamoDbMessageStreamTest.java
│ │ │ ├── RegistrationRecoveryTest.java
│ │ │ ├── RemoteConfigsManagerTest.java
│ │ │ ├── RemoteConfigsTest.java
│ │ │ ├── RepeatedUseECSignedPreKeyStoreTest.java
│ │ │ ├── RepeatedUseKEMSignedPreKeyStoreTest.java
│ │ │ ├── RepeatedUseSignedPreKeyStoreTest.java
│ │ │ ├── ReportMessageDynamoDbTest.java
│ │ │ ├── ReportMessageManagerTest.java
│ │ │ ├── S3LocalStackExtension.java
│ │ │ ├── SerializedExpireableJsonDynamoStoreTest.java
│ │ │ ├── ServiceContainerFoundationDbDatabaseLifecycleManager.java
│ │ │ ├── SingleUseECPreKeyStoreTest.java
│ │ │ ├── SubscriptionsTest.java
│ │ │ ├── TestcontainersFoundationDbDatabaseLifecycleManager.java
│ │ │ ├── VerificationSessionsTest.java
│ │ │ ├── devicecheck/
│ │ │ │ ├── AppleDeviceCheckManagerTest.java
│ │ │ │ ├── AppleDeviceChecksTest.java
│ │ │ │ └── DeviceCheckTestUtil.java
│ │ │ └── foundationdb/
│ │ │ └── FoundationDbMessageStoreTest.java
│ │ ├── subscriptions/
│ │ │ ├── AppleAppStoreClientTest.java
│ │ │ ├── AppleAppStoreManagerTest.java
│ │ │ ├── BraintreeGraphqlClientTest.java
│ │ │ ├── BraintreeManagerTest.java
│ │ │ ├── GooglePlayBillingManagerTest.java
│ │ │ ├── PayPalDonationsTranslatorTest.java
│ │ │ ├── ProcessorCustomerTest.java
│ │ │ ├── StripeManagerTest.java
│ │ │ └── SubscriptionCurrencyUtilTest.java
│ │ ├── telephony/
│ │ │ └── hlrlookup/
│ │ │ └── HlrLookupCarrierDataProviderTest.java
│ │ ├── tests/
│ │ │ └── util/
│ │ │ ├── AccountsHelper.java
│ │ │ ├── AuthHelper.java
│ │ │ ├── DevicesHelper.java
│ │ │ ├── ExperimentHelper.java
│ │ │ ├── FakeDynamicConfigurationManager.java
│ │ │ ├── JsonHelpers.java
│ │ │ ├── KeysHelper.java
│ │ │ ├── MessageHelper.java
│ │ │ ├── MockRedisFuture.java
│ │ │ ├── MultiRecipientMessageHelper.java
│ │ │ ├── ProfileTestHelper.java
│ │ │ ├── RedisClusterHelper.java
│ │ │ ├── RedisServerHelper.java
│ │ │ ├── SynchronousExecutorService.java
│ │ │ ├── TestPrincipal.java
│ │ │ ├── TestRecipient.java
│ │ │ └── TestWebsocketListener.java
│ │ ├── util/
│ │ │ ├── AttributeValuesTest.java
│ │ │ ├── BoundedVirtualThreadFactoryTest.java
│ │ │ ├── ClosableEpochTest.java
│ │ │ ├── CompletableFutureTestUtil.java
│ │ │ ├── DeviceCapabilityAdapterTest.java
│ │ │ ├── DeviceNameByteArrayAdapterTest.java
│ │ │ ├── E164Test.java
│ │ │ ├── ECPublicKeyAdapterTest.java
│ │ │ ├── EncryptDeviceCreationTimestampUtilTest.java
│ │ │ ├── ExecutorUtilTest.java
│ │ │ ├── HttpServletRequestUtilIntegrationTest.java
│ │ │ ├── HttpServletRequestUtilTest.java
│ │ │ ├── HttpUtilsTest.java
│ │ │ ├── IdentityKeyAdapterTest.java
│ │ │ ├── InetAddressRangeTest.java
│ │ │ ├── KEMPublicKeyAdapterTest.java
│ │ │ ├── LocaleTest.java
│ │ │ ├── MockUtils.java
│ │ │ ├── MutableClock.java
│ │ │ ├── RedisClusterUtilTest.java
│ │ │ ├── SystemMapperTest.java
│ │ │ ├── TestClock.java
│ │ │ ├── TestRandomUtil.java
│ │ │ ├── TestRemoteAddressFilterProvider.java
│ │ │ ├── UtilTest.java
│ │ │ ├── ValidNumberTest.java
│ │ │ ├── VirtualExecutorServiceProviderTest.java
│ │ │ ├── VirtualThreadPinEventMonitorTest.java
│ │ │ ├── WeightedRandomSelectTest.java
│ │ │ ├── jetty/
│ │ │ │ └── TestResource.java
│ │ │ ├── logging/
│ │ │ │ ├── LoggingUnhandledExceptionMapperTest.java
│ │ │ │ └── UriInfoUtilTest.java
│ │ │ ├── redis/
│ │ │ │ ├── BaseRedisCommandsHandler.java
│ │ │ │ ├── RedisCommandsHandler.java
│ │ │ │ ├── RedisLuaScriptSandbox.java
│ │ │ │ └── SimpleCacheCommandsHandler.java
│ │ │ └── ua/
│ │ │ └── UserAgentUtilTest.java
│ │ ├── websocket/
│ │ │ ├── AuthenticatedConnectListenerTest.java
│ │ │ ├── ProvisioningConnectListenerTest.java
│ │ │ ├── WebSocketAccountAuthenticatorTest.java
│ │ │ ├── WebSocketConnectionIntegrationTest.java
│ │ │ └── WebSocketConnectionTest.java
│ │ └── workers/
│ │ ├── FinishPushNotificationExperimentCommandTest.java
│ │ ├── IdleWakeupEligibilityCheckerTest.java
│ │ ├── NotifyIdleDevicesCommandTest.java
│ │ ├── ProcessScheduledJobsServiceCommandTest.java
│ │ ├── RegenerateSecondaryDynamoDbTableDataCommandTest.java
│ │ ├── RemoveExpiredAccountsCommandTest.java
│ │ ├── RemoveExpiredLinkedDevicesCommandTest.java
│ │ ├── RemoveExpiredUsernameHoldsCommandTest.java
│ │ ├── RemoveOrphanedPreKeyPagesCommandTest.java
│ │ ├── StartPushNotificationExperimentCommandTest.java
│ │ └── UnlinkDevicesWithIdlePrimaryCommandTest.java
│ ├── java-templates/
│ │ └── org/
│ │ └── whispersystems/
│ │ └── textsecuregcm/
│ │ └── util/
│ │ └── TestcontainersImages.java
│ ├── proto/
│ │ ├── echo_service.proto
│ │ ├── request_attributes_service.proto
│ │ ├── tag_test.proto
│ │ ├── test_tree_head.proto
│ │ └── validation_test.proto
│ └── resources/
│ ├── META-INF/
│ │ └── services/
│ │ ├── org.whispersystems.textsecuregcm.configuration.DynamicConfigurationManagerFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.DynamoDbClientFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.FaultTolerantRedisClientFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.FaultTolerantRedisClusterFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.PaymentsServiceClientsFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.PubSubPublisherFactory
│ │ ├── org.whispersystems.textsecuregcm.configuration.RegistrationServiceClientFactory
│ │ └── org.whispersystems.textsecuregcm.configuration.S3ObjectMonitorFactory
│ ├── config/
│ │ ├── test-secrets-bundle.yml
│ │ └── test.yml
│ ├── fixtures/
│ │ ├── current_message_duplicate_device.json
│ │ ├── current_message_extra_device.json
│ │ ├── current_message_multi_device.json
│ │ ├── current_message_multi_device_not_urgent.json
│ │ ├── current_message_multi_device_pni.json
│ │ ├── current_message_null_message_in_list.json
│ │ ├── current_message_registration_id.json
│ │ ├── current_message_single_device.json
│ │ ├── current_message_single_device_bad_type.json
│ │ ├── current_message_single_device_not_urgent.json
│ │ ├── current_message_single_device_server_receipt_type.json
│ │ ├── current_message_sync.json
│ │ ├── fixer.res.json
│ │ ├── mismatched_registration_id.json
│ │ ├── missing_device_response.json
│ │ ├── missing_device_response2.json
│ │ └── prekey_v2.json
│ ├── logback-test.xml
│ └── org/
│ └── whispersystems/
│ └── textsecuregcm/
│ ├── asn/
│ │ └── ip2asn-test.tsv
│ └── storage/
│ ├── AccountsManagerTest-testJsonRoundTripSerialization.json
│ └── devicecheck/
│ ├── apple-sample-attestation
│ ├── webauthn4j-sample-assertion
│ └── webauthn4j-sample-attestation
└── websocket-resources/
├── pom.xml
└── src/
├── main/
│ ├── java/
│ │ └── org/
│ │ └── whispersystems/
│ │ └── websocket/
│ │ ├── WebSocketClient.java
│ │ ├── WebSocketResourceProvider.java
│ │ ├── WebSocketResourceProviderFactory.java
│ │ ├── WebSocketSecurityContext.java
│ │ ├── WebsocketHeaders.java
│ │ ├── auth/
│ │ │ ├── AuthenticatedWebSocketUpgradeFilter.java
│ │ │ ├── InvalidCredentialsException.java
│ │ │ ├── WebSocketAuthenticator.java
│ │ │ └── WebsocketAuthValueFactoryProvider.java
│ │ ├── configuration/
│ │ │ └── WebSocketConfiguration.java
│ │ ├── logging/
│ │ │ ├── AsyncWebsocketEventAppenderFactory.java
│ │ │ ├── WebsocketEvent.java
│ │ │ ├── WebsocketRequestLog.java
│ │ │ ├── WebsocketRequestLoggerFactory.java
│ │ │ └── layout/
│ │ │ ├── WebsocketEventLayout.java
│ │ │ ├── WebsocketEventLayoutFactory.java
│ │ │ └── converters/
│ │ │ ├── ContentLengthConverter.java
│ │ │ ├── DateConverter.java
│ │ │ ├── EnsureLineSeparation.java
│ │ │ ├── LineSeparatorConverter.java
│ │ │ ├── NAConverter.java
│ │ │ ├── RemoteHostConverter.java
│ │ │ ├── RequestHeaderConverter.java
│ │ │ ├── RequestUrlConverter.java
│ │ │ ├── StatusCodeConverter.java
│ │ │ └── WebSocketEventConverter.java
│ │ ├── messages/
│ │ │ ├── InvalidMessageException.java
│ │ │ ├── WebSocketMessage.java
│ │ │ ├── WebSocketMessageFactory.java
│ │ │ ├── WebSocketRequestMessage.java
│ │ │ ├── WebSocketResponseMessage.java
│ │ │ └── protobuf/
│ │ │ ├── ProtobufWebSocketMessage.java
│ │ │ ├── ProtobufWebSocketMessageFactory.java
│ │ │ ├── ProtobufWebSocketRequestMessage.java
│ │ │ └── ProtobufWebSocketResponseMessage.java
│ │ ├── session/
│ │ │ ├── ContextPrincipal.java
│ │ │ ├── WebSocketSession.java
│ │ │ ├── WebSocketSessionContainerRequestValueFactory.java
│ │ │ ├── WebSocketSessionContext.java
│ │ │ └── WebSocketSessionContextValueFactoryProvider.java
│ │ └── setup/
│ │ ├── WebSocketConnectListener.java
│ │ └── WebSocketEnvironment.java
│ └── proto/
│ └── WebSocketProtocol.proto
└── test/
└── java/
└── org/
└── whispersystems/
└── websocket/
├── WebSocketResourceProviderFactoryTest.java
├── WebSocketResourceProviderTest.java
└── logging/
└── WebSocketRequestLogTest.java
Showing preview only (686K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7296 symbols across 1001 files)
FILE: api-doc/src/main/java/org/signal/openapi/OpenApiExtension.java
class OpenApiExtension (line 38) | public class OpenApiExtension extends AbstractOpenAPIExtension {
method extractParameters (line 50) | @Override
method isOptionalOfType (line 86) | private static boolean isOptionalOfType(final SimpleType simpleType, f...
FILE: api-doc/src/main/java/org/signal/openapi/OpenApiReader.java
class OpenApiReader (line 35) | public class OpenApiReader extends Reader {
method getParameters (line 44) | @Override
FILE: integration-tests/src/main/java/org/signal/integration/Codecs.java
class Codecs (line 19) | public final class Codecs {
method Codecs (line 21) | private Codecs() {
type CheckedFunction (line 25) | @FunctionalInterface
method apply (line 27) | R apply(T t) throws Exception;
class Base64BasedSerializer (line 30) | public static class Base64BasedSerializer<T> extends JsonSerializer<T> {
method Base64BasedSerializer (line 34) | public Base64BasedSerializer(final CheckedFunction<T, byte[]> mapper) {
method serialize (line 38) | @Override
class Base64BasedDeserializer (line 48) | public static class Base64BasedDeserializer<T> extends JsonDeserialize...
method Base64BasedDeserializer (line 52) | public Base64BasedDeserializer(final CheckedFunction<byte[], T> mapp...
method deserialize (line 56) | @Override
class ByteArraySerializer (line 66) | public static class ByteArraySerializer extends Base64BasedSerializer<...
method ByteArraySerializer (line 67) | public ByteArraySerializer() {
class ByteArrayDeserializer (line 72) | public static class ByteArrayDeserializer extends Base64BasedDeseriali...
method ByteArrayDeserializer (line 73) | public ByteArrayDeserializer() {
class ECPublicKeySerializer (line 78) | public static class ECPublicKeySerializer extends Base64BasedSerialize...
method ECPublicKeySerializer (line 79) | public ECPublicKeySerializer() {
class ECPublicKeyDeserializer (line 84) | public static class ECPublicKeyDeserializer extends Base64BasedDeseria...
method ECPublicKeyDeserializer (line 85) | public ECPublicKeyDeserializer() {
class IdentityKeySerializer (line 90) | public static class IdentityKeySerializer extends Base64BasedSerialize...
method IdentityKeySerializer (line 91) | public IdentityKeySerializer() {
class IdentityKeyDeserializer (line 96) | public static class IdentityKeyDeserializer extends Base64BasedDeseria...
method IdentityKeyDeserializer (line 97) | public IdentityKeyDeserializer() {
FILE: integration-tests/src/main/java/org/signal/integration/IntegrationTools.java
class IntegrationTools (line 26) | public class IntegrationTools {
method create (line 35) | public static IntegrationTools create(final Config config) {
method IntegrationTools (line 54) | private IntegrationTools(
method populateRecoveryPassword (line 63) | public CompletableFuture<Void> populateRecoveryPassword(final String p...
method peekVerificationSessionPushChallenge (line 70) | public CompletableFuture<Optional<String>> peekVerificationSessionPush...
FILE: integration-tests/src/main/java/org/signal/integration/Operations.java
class Operations (line 56) | public final class Operations {
method Operations (line 69) | private Operations() {
method newRegisteredUser (line 73) | public static TestUser newRegisteredUser(final String number) {
method prescribedVerificationNumber (line 109) | public static PrescribedVerificationNumber prescribedVerificationNumbe...
method deleteUser (line 115) | public static void deleteUser(final TestUser user) {
method peekVerificationSessionPushChallenge (line 119) | public static String peekVerificationSessionPushChallenge(final String...
method populateRandomRecoveryPassword (line 124) | public static byte[] populateRandomRecoveryPassword(final String numbe...
method sendEmptyRequestAuthenticated (line 131) | public static <T> T sendEmptyRequestAuthenticated(
method randomBytes (line 169) | private static byte[] randomBytes(int numBytes) {
method apiGet (line 175) | public static RequestBuilder apiGet(final String endpoint) {
method apiDelete (line 179) | public static RequestBuilder apiDelete(final String endpoint) {
method apiPost (line 183) | public static <R> RequestBuilder apiPost(final String endpoint, final ...
method apiPut (line 187) | public static <R> RequestBuilder apiPut(final String endpoint, final R...
method apiPatch (line 191) | public static <R> RequestBuilder apiPatch(final String endpoint, final...
method serverUri (line 195) | private static URI serverUri(final String endpoint, final List<String>...
class RequestBuilder (line 202) | public static class RequestBuilder {
method RequestBuilder (line 211) | private RequestBuilder(final HttpRequest.Builder builder, final Stri...
method withJsonBody (line 216) | private static <R> RequestBuilder withJsonBody(final String endpoint...
method authorized (line 227) | public RequestBuilder authorized(final TestUser user) {
method authorized (line 231) | public RequestBuilder authorized(final TestUser user, final byte dev...
method authorized (line 236) | public RequestBuilder authorized(final String username, final String...
method queryParam (line 241) | public RequestBuilder queryParam(final String key, final String valu...
method header (line 246) | public RequestBuilder header(final String name, final String value) {
method execute (line 251) | public Pair<Integer, Void> execute() {
method executeExpectSuccess (line 255) | public Pair<Integer, Void> executeExpectSuccess() {
method executeExpectSuccess (line 264) | public <T> T executeExpectSuccess(final Class<T> expectedType) {
method executeExpectStatusCode (line 273) | public void executeExpectStatusCode(final int expectedStatusCode) {
method execute (line 282) | public <T> Pair<Integer, T> execute(final Class<T> expectedType) {
method buildClient (line 306) | private static FaultTolerantHttpClient buildClient() {
method loadConfigFromClasspath (line 316) | private static Config loadConfigFromClasspath(final String filename) {
method generateSignedECPreKey (line 333) | public static ECSignedPreKey generateSignedECPreKey(final long id, fin...
method generateSignedKEMPreKey (line 339) | public static KEMSignedPreKey generateSignedKEMPreKey(final long id, f...
FILE: integration-tests/src/main/java/org/signal/integration/TestDevice.java
class TestDevice (line 15) | public class TestDevice {
method create (line 22) | public static TestDevice create(
method TestDevice (line 32) | public TestDevice(final byte deviceId) {
method deviceId (line 36) | public byte deviceId() {
method latestSignedPreKey (line 40) | public SignedPreKeyRecord latestSignedPreKey(final IdentityKeyPair ide...
method addSignedPreKey (line 50) | public SignedPreKeyRecord addSignedPreKey(final IdentityKeyPair identi...
FILE: integration-tests/src/main/java/org/signal/integration/TestUser.java
class TestUser (line 31) | public class TestUser {
method create (line 56) | public static TestUser create(final String phoneNumber, final String a...
method TestUser (line 79) | public TestUser(
method registrationId (line 99) | public int registrationId() {
method aciIdentityKey (line 103) | public IdentityKeyPair aciIdentityKey() {
method phoneNumber (line 107) | public String phoneNumber() {
method pniIdentityKey (line 111) | public IdentityKeyPair pniIdentityKey() {
method accountPassword (line 115) | public String accountPassword() {
method registrationPassword (line 119) | public byte[] registrationPassword() {
method aciUuid (line 123) | public UUID aciUuid() {
method pniUuid (line 127) | public UUID pniUuid() {
method accountAttributes (line 131) | public AccountAttributes accountAttributes() {
method setAciUuid (line 138) | public void setAciUuid(final UUID aciUuid) {
method setPniUuid (line 142) | public void setPniUuid(final UUID pniUuid) {
method setPhoneNumber (line 146) | public void setPhoneNumber(final String phoneNumber) {
method setPniIdentityKey (line 150) | public void setPniIdentityKey(final IdentityKeyPair pniIdentityKey) {
method setAccountPassword (line 154) | public void setAccountPassword(final String accountPassword) {
method setRegistrationPassword (line 158) | public void setRegistrationPassword(final byte[] registrationPassword) {
method preKeys (line 162) | public PreKeySetPublicView preKeys(final byte deviceId, final boolean ...
FILE: integration-tests/src/test/java/org/signal/integration/AccountTest.java
class AccountTest (line 33) | public class AccountTest {
method testCreateAccount (line 35) | @Test
method changePhoneNumber (line 48) | @Test
method testUsernameOperations (line 75) | @Test
method verifyFullUsernameLifecycle (line 87) | private static void verifyFullUsernameLifecycle(final TestUser user) t...
FILE: integration-tests/src/test/java/org/signal/integration/MessagingTest.java
class MessagingTest (line 20) | public class MessagingTest {
method testSendMessageUnsealed (line 22) | @Test
FILE: integration-tests/src/test/java/org/signal/integration/RegistrationTest.java
class RegistrationTest (line 17) | public class RegistrationTest {
method testRegistration (line 19) | @Test
FILE: service/src/main/java-templates/org/whispersystems/textsecuregcm/WhisperServerVersion.java
class WhisperServerVersion (line 8) | public class WhisperServerVersion {
method getServerVersion (line 12) | public static String getServerVersion() {
FILE: service/src/main/java-templates/org/whispersystems/textsecuregcm/storage/FoundationDbVersion.java
class FoundationDbVersion (line 8) | public class FoundationDbVersion {
method getFoundationDbVersion (line 13) | public static String getFoundationDbVersion() {
method getFoundationDbApiVersion (line 17) | public static int getFoundationDbApiVersion() {
FILE: service/src/main/java/org/signal/i18n/HeaderControlledResourceBundleLookup.java
class HeaderControlledResourceBundleLookup (line 17) | public class HeaderControlledResourceBundleLookup {
method HeaderControlledResourceBundleLookup (line 23) | public HeaderControlledResourceBundleLookup() {
method HeaderControlledResourceBundleLookup (line 27) | @VisibleForTesting
method getAcceptableLocales (line 33) | @Nonnull
method getResourceBundle (line 38) | @Nonnull
FILE: service/src/main/java/org/signal/i18n/ResourceBundleFactory.java
type ResourceBundleFactory (line 11) | public interface ResourceBundleFactory {
method createBundle (line 12) | ResourceBundle createBundle(String baseName, Locale locale, ResourceBu...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java
class WhisperServerConfiguration (line 73) | public class WhisperServerConfiguration extends Configuration {
method getTlsKeyStoreConfiguration (line 367) | public TlsKeyStoreConfiguration getTlsKeyStoreConfiguration() {
method getAwsCredentialsConfiguration (line 371) | public AwsCredentialsProviderFactory getAwsCredentialsConfiguration() {
method getStripe (line 375) | public StripeConfiguration getStripe() {
method getBraintree (line 379) | public BraintreeConfiguration getBraintree() {
method getGooglePlayBilling (line 383) | public GooglePlayBillingConfiguration getGooglePlayBilling() {
method getAppleAppStore (line 387) | public AppleAppStoreConfiguration getAppleAppStore() {
method getAppleDeviceCheck (line 391) | public AppleDeviceCheckConfiguration getAppleDeviceCheck() {
method getDeviceCheck (line 395) | public DeviceCheckConfiguration getDeviceCheck() {
method getDynamoDbClientConfiguration (line 399) | public DynamoDbClientFactory getDynamoDbClientConfiguration() {
method getDynamoDbTables (line 403) | public DynamoDbTables getDynamoDbTables() {
method getShortCodeRetrieverConfiguration (line 407) | public ShortCodeExpanderConfiguration getShortCodeRetrieverConfigurati...
method getWebSocketConfiguration (line 411) | public WebSocketConfiguration getWebSocketConfiguration() {
method getGcpAttachmentsConfiguration (line 415) | public GcpAttachmentsConfiguration getGcpAttachmentsConfiguration() {
method getCacheClusterConfiguration (line 419) | public FaultTolerantRedisClusterFactory getCacheClusterConfiguration() {
method getRedisPubSubConfiguration (line 423) | public FaultTolerantRedisClientFactory getRedisPubSubConfiguration() {
method getSvr2Configuration (line 427) | public SecureValueRecoveryConfiguration getSvr2Configuration() {
method getSvrbConfiguration (line 431) | public SecureValueRecoveryConfiguration getSvrbConfiguration() {
method getDirectoryV2Configuration (line 435) | public DirectoryV2Configuration getDirectoryV2Configuration() {
method getSecureStorageServiceConfiguration (line 439) | public SecureStorageServiceConfiguration getSecureStorageServiceConfig...
method getMessageCacheConfiguration (line 443) | public MessageCacheConfiguration getMessageCacheConfiguration() {
method getPushSchedulerCluster (line 447) | public FaultTolerantRedisClusterFactory getPushSchedulerCluster() {
method getRateLimitersCluster (line 451) | public FaultTolerantRedisClusterFactory getRateLimitersCluster() {
method getFcmConfiguration (line 455) | public FcmConfiguration getFcmConfiguration() {
method getApnConfiguration (line 459) | public ApnConfiguration getApnConfiguration() {
method getCdnConfiguration (line 463) | public CdnConfiguration getCdnConfiguration() {
method getCdn3StorageManagerConfiguration (line 467) | public Cdn3StorageManagerConfiguration getCdn3StorageManagerConfigurat...
method getOpenTelemetryConfiguration (line 471) | public OpenTelemetryConfiguration getOpenTelemetryConfiguration() {
method getDeliveryCertificate (line 475) | public UnidentifiedDeliveryConfiguration getDeliveryCertificate() {
method getMaxDevices (line 479) | public Map<String, Integer> getMaxDevices() {
method getPaymentsServiceConfiguration (line 490) | public PaymentsServiceConfiguration getPaymentsServiceConfiguration() {
method getZkConfig (line 494) | public ZkConfig getZkConfig() {
method getCallingZkConfig (line 498) | public GenericZkConfig getCallingZkConfig() {
method getBackupsZkConfig (line 502) | public GenericZkConfig getBackupsZkConfig() {
method getRemoteConfigConfiguration (line 506) | public RemoteConfigConfiguration getRemoteConfigConfiguration() {
method getDynamicConfig (line 510) | public S3ObjectMonitorFactory getDynamicConfig() {
method getBadges (line 514) | public BadgesConfiguration getBadges() {
method getSubscription (line 518) | public SubscriptionConfiguration getSubscription() {
method getOneTimeDonations (line 522) | public OneTimeDonationConfiguration getOneTimeDonations() {
method getPagedSingleUseKEMPreKeyStore (line 526) | public PagedSingleUseKEMPreKeyStoreConfiguration getPagedSingleUseKEMP...
method getReportMessageConfiguration (line 530) | public ReportMessageConfiguration getReportMessageConfiguration() {
method getSpamFilterConfiguration (line 534) | public SpamFilterConfiguration getSpamFilterConfiguration() {
method getRegistrationServiceConfiguration (line 538) | public RegistrationServiceClientFactory getRegistrationServiceConfigur...
method getTurnConfiguration (line 542) | public TurnConfiguration getTurnConfiguration() {
method getTus (line 546) | public TusConfiguration getTus() {
method getClientReleaseConfiguration (line 550) | public ClientReleaseConfiguration getClientReleaseConfiguration() {
method getMessageByteLimitCardinalityEstimator (line 554) | public MessageByteLimitCardinalityEstimatorConfiguration getMessageByt...
method getLinkDeviceSecretConfiguration (line 558) | public LinkDeviceSecretConfiguration getLinkDeviceSecretConfiguration() {
method getVirtualThreadConfiguration (line 562) | public VirtualThreadConfiguration getVirtualThreadConfiguration() {
method getExternalRequestFilterConfiguration (line 566) | public ExternalRequestFilterConfiguration getExternalRequestFilterConf...
method getKeyTransparencyServiceConfiguration (line 570) | public KeyTransparencyServiceConfiguration getKeyTransparencyServiceCo...
method logMessageDeliveryLoops (line 574) | public boolean logMessageDeliveryLoops() {
method idlePrimaryDeviceReminderConfiguration (line 578) | public IdlePrimaryDeviceReminderConfiguration idlePrimaryDeviceReminde...
method getCircuitBreakerConfigurations (line 582) | public Map<String, CircuitBreakerConfiguration> getCircuitBreakerConfi...
method getRetryConfigurations (line 586) | public Map<String, RetryConfiguration> getRetryConfigurations() {
method getGeneralRedisRetryConfiguration (line 590) | public RetryConfiguration getGeneralRedisRetryConfiguration() {
method getGrpc (line 594) | public GrpcConfiguration getGrpc() {
method getGrpcAllowList (line 598) | public DynamicGrpcAllowListConfiguration getGrpcAllowList() {
method getAsnTableConfiguration (line 602) | public S3ObjectMonitorFactory getAsnTableConfiguration() {
method getCallQualitySurveyConfiguration (line 606) | public CallQualitySurveyConfiguration getCallQualitySurveyConfiguratio...
method getHlrLookupConfiguration (line 610) | public HlrLookupConfiguration getHlrLookupConfiguration() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
class WhisperServerService (line 315) | public class WhisperServerService extends Application<WhisperServerConfi...
method initialize (line 321) | @Override
method getName (line 373) | @Override
method run (line 378) | @Override
method registerExceptionMappers (line 1198) | private void registerExceptionMappers(Environment environment,
class ExecutorServiceBuilder (line 1225) | public static class ExecutorServiceBuilder extends io.dropwizard.lifec...
method ExecutorServiceBuilder (line 1228) | public ExecutorServiceBuilder(final LifecycleEnvironment environment...
method build (line 1233) | @Override
method of (line 1238) | public static ExecutorServiceBuilder of(final Environment environmen...
class ScheduledExecutorServiceBuilder (line 1243) | public static class ScheduledExecutorServiceBuilder extends io.dropwiz...
method ScheduledExecutorServiceBuilder (line 1246) | public ScheduledExecutorServiceBuilder(final LifecycleEnvironment en...
method build (line 1251) | @Override
method of (line 1256) | public static ScheduledExecutorServiceBuilder of(final Environment e...
method main (line 1261) | public static void main(String[] args) throws Exception {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/asn/AsnInfoProvider.java
type AsnInfoProvider (line 11) | public interface AsnInfoProvider {
method lookup (line 18) | Optional<AsnInfo> lookup(@Nonnull String ipString);
FILE: service/src/main/java/org/whispersystems/textsecuregcm/asn/AsnInfoProviderImpl.java
class AsnInfoProviderImpl (line 37) | public class AsnInfoProviderImpl implements AsnInfoProvider {
method fromTsvGz (line 52) | @Nonnull
method fromTsv (line 66) | @Nonnull
method AsnInfoProviderImpl (line 115) | public AsnInfoProviderImpl(
method lookup (line 122) | @Nonnull
method ip4BytesToLong (line 143) | @VisibleForTesting
method ip6BytesToBigInteger (line 150) | @VisibleForTesting
method lookupInMap (line 157) | @Nonnull
FILE: service/src/main/java/org/whispersystems/textsecuregcm/asn/AsnRange.java
method contains (line 23) | boolean contains(@Nonnull final T element) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/attachments/AttachmentGenerator.java
type AttachmentGenerator (line 9) | public interface AttachmentGenerator {
method generateAttachment (line 13) | Descriptor generateAttachment(final String key);
FILE: service/src/main/java/org/whispersystems/textsecuregcm/attachments/AttachmentUtil.java
class AttachmentUtil (line 10) | public class AttachmentUtil {
method AttachmentUtil (line 13) | private AttachmentUtil() {}
method generateAttachmentKey (line 15) | public static String generateAttachmentKey(final SecureRandom secureRa...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/attachments/GcsAttachmentGenerator.java
class GcsAttachmentGenerator (line 19) | public class GcsAttachmentGenerator implements AttachmentGenerator {
method GcsAttachmentGenerator (line 26) | public GcsAttachmentGenerator(@Nonnull String domain, @Nonnull String ...
method generateAttachment (line 33) | @Override
method getSignedUploadLocation (line 40) | private String getSignedUploadLocation(@Nonnull CanonicalRequest canon...
method getHeaderMap (line 46) | private static Map<String, String> getHeaderMap(@Nonnull CanonicalRequ...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/attachments/TusAttachmentGenerator.java
class TusAttachmentGenerator (line 17) | public class TusAttachmentGenerator implements AttachmentGenerator {
method TusAttachmentGenerator (line 24) | public TusAttachmentGenerator(final TusConfiguration cfg) {
method credentialsGenerator (line 29) | private static ExternalServiceCredentialsGenerator credentialsGenerato...
method generateAttachment (line 37) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/AccountAuthenticator.java
class AccountAuthenticator (line 30) | public class AccountAuthenticator implements Authenticator<BasicCredenti...
method AccountAuthenticator (line 48) | public AccountAuthenticator(AccountsManager accountsManager) {
method AccountAuthenticator (line 52) | @VisibleForTesting
method getIdentifierAndDeviceId (line 58) | static Pair<String, Byte> getIdentifierAndDeviceId(final String basicU...
method authenticate (line 75) | @Override
method updateLastSeen (line 137) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/Anonymous.java
class Anonymous (line 12) | public class Anonymous {
method Anonymous (line 16) | public Anonymous(String header) {
method getAccessKey (line 24) | public byte[] getAccessKey() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/AuthenticatedDevice.java
method getName (line 16) | @Override
method implies (line 21) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/BasicAuthorizationHeader.java
class BasicAuthorizationHeader (line 11) | public class BasicAuthorizationHeader {
method BasicAuthorizationHeader (line 17) | private BasicAuthorizationHeader(final String username, final byte dev...
method fromString (line 23) | public static BasicAuthorizationHeader fromString(final String header)...
method getUsername (line 83) | public String getUsername() {
method getDeviceId (line 87) | public long getDeviceId() {
method getPassword (line 91) | public String getPassword() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java
class CertificateGenerator (line 18) | public class CertificateGenerator {
method CertificateGenerator (line 26) | public CertificateGenerator(byte[] serverCertificate, ECPrivateKey pri...
method createFor (line 37) | public byte[] createFor(final Account account, final byte deviceId, bo...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/CloudflareTurnCredentialsManager.java
class CloudflareTurnCredentialsManager (line 29) | public class CloudflareTurnCredentialsManager {
method CloudflareTurnCredentialsManager (line 54) | public CloudflareTurnCredentialsManager(final String cloudflareTurnApi...
method retrieveFromCloudflare (line 98) | public TurnToken retrieveFromCloudflare() throws IOException {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/CombinedUnidentifiedSenderAccessKeys.java
class CombinedUnidentifiedSenderAccessKeys (line 13) | public class CombinedUnidentifiedSenderAccessKeys {
method CombinedUnidentifiedSenderAccessKeys (line 16) | public CombinedUnidentifiedSenderAccessKeys(String header) {
method getAccessKeys (line 27) | public byte[] getAccessKeys() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestListener.java
type DisconnectionRequestListener (line 12) | public interface DisconnectionRequestListener {
method handleDisconnectionRequest (line 18) | void handleDisconnectionRequest();
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java
class DisconnectionRequestManager (line 45) | public class DisconnectionRequestManager extends RedisPubSubAdapter<byte...
method DisconnectionRequestManager (line 73) | public DisconnectionRequestManager(final FaultTolerantRedisClient pubS...
method start (line 82) | @Override
method stop (line 109) | @Override
method addListener (line 128) | public void addListener(final UUID accountIdentifier, final byte devic...
method removeListener (line 146) | public void removeListener(final UUID accountIdentifier, final byte de...
method getListeners (line 154) | @VisibleForTesting
method requestDisconnection (line 166) | public CompletionStage<Void> requestDisconnection(final Account accoun...
method requestDisconnection (line 180) | public CompletionStage<Void> requestDisconnection(final UUID accountId...
method message (line 193) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/ExternalServiceCredentialsGenerator.java
class ExternalServiceCredentialsGenerator (line 23) | public class ExternalServiceCredentialsGenerator {
method builder (line 46) | public static ExternalServiceCredentialsGenerator.Builder builder(fina...
method builder (line 50) | @VisibleForTesting
method ExternalServiceCredentialsGenerator (line 55) | private ExternalServiceCredentialsGenerator(
method generateForUuid (line 83) | public ExternalServiceCredentials generateForUuid(final UUID uuid) {
method generateFor (line 92) | public ExternalServiceCredentials generateFor(final String identity) {
method generateWithTimestampAsUsername (line 104) | public ExternalServiceCredentials generateWithTimestampAsUsername() {
method generate (line 113) | private ExternalServiceCredentials generate(final String identity) {
method identityFromSignature (line 138) | public Optional<String> identityFromSignature(final String password) {
method validateAndGetTimestamp (line 162) | public Optional<Long> validateAndGetTimestamp(final ExternalServiceCre...
method isCredentialExpired (line 195) | @VisibleForTesting
method shouldDeriveUsername (line 200) | private boolean shouldDeriveUsername() {
method hasUsernameTimestampPrefix (line 204) | private boolean hasUsernameTimestampPrefix() {
method hasUsernameTimestampTruncator (line 208) | private boolean hasUsernameTimestampTruncator() {
method usernameIsTimestamp (line 212) | private boolean usernameIsTimestamp() {
method currentTimeSeconds (line 216) | private long currentTimeSeconds() {
class Builder (line 220) | public static class Builder {
method Builder (line 239) | private Builder(final byte[] key) {
method withUserDerivationKey (line 243) | public Builder withUserDerivationKey(final SecretBytes userDerivatio...
method withUserDerivationKey (line 247) | public Builder withUserDerivationKey(final byte[] userDerivationKey) {
method withClock (line 253) | public Builder withClock(final Clock clock) {
method withDerivedUsernameTruncateLength (line 258) | public Builder withDerivedUsernameTruncateLength(int truncateLength) {
method prependUsername (line 264) | public Builder prependUsername(final boolean prependUsername) {
method truncateSignature (line 269) | public Builder truncateSignature(final boolean truncateSignature) {
method withUsernameTimestampTruncatorAndPrefix (line 274) | public Builder withUsernameTimestampTruncatorAndPrefix(final Functio...
method build (line 280) | public ExternalServiceCredentialsGenerator build() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/ExternalServiceCredentialsSelector.java
class ExternalServiceCredentialsSelector (line 14) | public class ExternalServiceCredentialsSelector {
method ExternalServiceCredentialsSelector (line 16) | private ExternalServiceCredentialsSelector() {}
type CredentialStatus (line 18) | public enum CredentialStatus {
method replaced (line 33) | private CredentialInfo replaced() {
method valid (line 37) | public boolean valid() {
method check (line 52) | public static List<CredentialInfo> check(
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/GroupSendTokenHeader.java
method valueOf (line 16) | public static GroupSendTokenHeader valueOf(String header) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilter.java
class IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilter (line 21) | public class IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilter implem...
method IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilter (line 37) | public IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilter(final Dura...
method handleAuthentication (line 42) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/InvalidAuthorizationHeaderException.java
class InvalidAuthorizationHeaderException (line 11) | public class InvalidAuthorizationHeaderException extends WebApplicationE...
method InvalidAuthorizationHeaderException (line 12) | public InvalidAuthorizationHeaderException(String s) {
method InvalidAuthorizationHeaderException (line 16) | public InvalidAuthorizationHeaderException(Exception e) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/OptionalAccess.java
class OptionalAccess (line 19) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method verify (line 24) | public static void verify(Optional<Account> requestAccount,
method verify (line 53) | public static void verify(Optional<Account> requestAccount,
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/PhoneVerificationTokenManager.java
class PhoneVerificationTokenManager (line 31) | public class PhoneVerificationTokenManager {
method PhoneVerificationTokenManager (line 43) | public PhoneVerificationTokenManager(final PhoneNumberIdentifiers phon...
method verify (line 68) | public PhoneVerificationRequest.VerificationType verify(final Containe...
method verifyBySessionId (line 80) | private void verifyBySessionId(final String number, final byte[] sessi...
method verifyByRecoveryPassword (line 111) | private void verifyByRecoveryPassword(final ContainerRequestContext re...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/RedemptionRange.java
class RedemptionRange (line 19) | public class RedemptionRange implements Iterable<Instant> {
method RedemptionRange (line 29) | private RedemptionRange(final LocalDate from, final LocalDate end) {
method inclusive (line 49) | public static RedemptionRange inclusive(Clock clock, Instant redemptio...
method iterator (line 80) | @Override
method equals (line 90) | @Override
method hashCode (line 99) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManager.java
class RegistrationLockVerificationManager (line 35) | public class RegistrationLockVerificationManager {
type Flow (line 36) | public enum Flow {
method RegistrationLockVerificationManager (line 62) | public RegistrationLockVerificationManager(
method verifyRegistrationLock (line 85) | public void verifyRegistrationLock(final Account account, @Nullable fi...
method svr2FailureCredentials (line 178) | private @Nullable ExternalServiceCredentials svr2FailureCredentials(fi...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/SaltedTokenHash.java
type Version (line 16) | public enum Version {
method generateFor (line 32) | public static SaltedTokenHash generateFor(final String token) {
method getVersion (line 38) | public Version getVersion() {
method verify (line 42) | public boolean verify(final String token) {
method generateSalt (line 52) | private static String generateSalt() {
method calculateV1Hash (line 58) | private static String calculateV1Hash(final String salt, final String to...
method calculateV2Hash (line 67) | private static String calculateV2Hash(final String salt, final String to...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/StoredRegistrationLock.java
class StoredRegistrationLock (line 16) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
type Status (line 18) | public enum Status {
method timeSinceLastSeen (line 36) | private long timeSinceLastSeen() {
method hasLockAndSalt (line 43) | private boolean hasLockAndSalt() {
method isPresent (line 47) | public boolean isPresent() {
method StoredRegistrationLock (line 51) | public StoredRegistrationLock(Optional<String> registrationLock, Optio...
method getStatus (line 57) | public Status getStatus() {
method needsFailureCredentials (line 67) | public boolean needsFailureCredentials() {
method getTimeRemaining (line 71) | public Duration getTimeRemaining() {
method verify (line 75) | public boolean verify(@Nullable String clientRegistrationLock) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessChecksum.java
class UnidentifiedAccessChecksum (line 13) | public class UnidentifiedAccessChecksum {
method generateFor (line 15) | public static byte[] generateFor(byte[] unidentifiedAccessKey) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessUtil.java
class UnidentifiedAccessUtil (line 14) | public class UnidentifiedAccessUtil {
method UnidentifiedAccessUtil (line 18) | private UnidentifiedAccessUtil() {
method checkUnidentifiedAccess (line 31) | public static boolean checkUnidentifiedAccess(final Account targetAcco...
method checkUnidentifiedAccess (line 48) | public static boolean checkUnidentifiedAccess(final Collection<Account...
method getCombinedUnidentifiedAccessKey (line 61) | public static byte[] getCombinedUnidentifiedAccessKey(final Collection...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/grpc/AuthenticationUtil.java
class AuthenticationUtil (line 16) | public class AuthenticationUtil {
method requireAuthenticatedDevice (line 27) | public static AuthenticatedDevice requireAuthenticatedDevice() {
method requireAuthenticatedPrimaryDevice (line 48) | public static AuthenticatedDevice requireAuthenticatedPrimaryDevice() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/grpc/ProhibitAuthenticationInterceptor.java
class ProhibitAuthenticationInterceptor (line 20) | public class ProhibitAuthenticationInterceptor implements ServerIntercep...
method interceptCall (line 22) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/auth/grpc/RequireAuthenticationInterceptor.java
class RequireAuthenticationInterceptor (line 27) | public class RequireAuthenticationInterceptor implements ServerIntercept...
method RequireAuthenticationInterceptor (line 33) | public RequireAuthenticationInterceptor(final AccountAuthenticator aut...
method interceptCall (line 37) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupAuthManager.java
class BackupAuthManager (line 57) | public class BackupAuthManager {
method BackupAuthManager (line 72) | public BackupAuthManager(
method commitBackupId (line 100) | public void commitBackupId(
method checkBackupIdRotationLimit (line 152) | public BackupIdRotationLimit checkBackupIdRotationLimit(final Account ...
method getBackupAuthCredentials (line 192) | public Map<BackupCredentialType, List<Credential>> getBackupAuthCreden...
method redeemReceipt (line 243) | public void redeemReceipt(
method extendBackupVoucher (line 283) | public void extendBackupVoucher(final Account account, final Account.B...
method merge (line 295) | private static Account.BackupVoucher merge(@Nullable final Account.Bac...
method hasActiveVoucher (line 316) | private boolean hasActiveVoucher(final Account account) {
method hasExpiredVoucher (line 320) | private boolean hasExpiredVoucher(final Account account) {
method storedBackupLevel (line 331) | private Optional<BackupLevel> storedBackupLevel(final Account account,...
method configuredBackupLevel (line 345) | private BackupLevel configuredBackupLevel(final Account account) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupBadReceiptException.java
class BackupBadReceiptException (line 7) | public class BackupBadReceiptException extends BackupException {
method BackupBadReceiptException (line 9) | public BackupBadReceiptException(String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupException.java
class BackupException (line 7) | public class BackupException extends Exception {
method BackupException (line 9) | public BackupException() {
method BackupException (line 13) | public BackupException(String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupFailedZkAuthenticationException.java
class BackupFailedZkAuthenticationException (line 7) | public class BackupFailedZkAuthenticationException extends BackupExcepti...
method BackupFailedZkAuthenticationException (line 9) | public BackupFailedZkAuthenticationException(String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupInvalidArgumentException.java
class BackupInvalidArgumentException (line 7) | public class BackupInvalidArgumentException extends BackupException {
method BackupInvalidArgumentException (line 8) | public BackupInvalidArgumentException(final String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupLevelUtil.java
class BackupLevelUtil (line 9) | public class BackupLevelUtil {
method fromReceiptLevel (line 10) | public static BackupLevel fromReceiptLevel(long receiptLevel) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupManager.java
class BackupManager (line 61) | public class BackupManager {
method BackupManager (line 97) | public BackupManager(
method setPublicKey (line 132) | public void setPublicKey(
method createMessageBackupUploadDescriptor (line 165) | public BackupUploadDescriptor createMessageBackupUploadDescriptor(
method createTemporaryAttachmentUploadDescriptor (line 175) | public BackupUploadDescriptor createTemporaryAttachmentUploadDescripto...
method ttlRefresh (line 192) | public void ttlRefresh(final AuthenticatedBackupUser backupUser) throw...
method backupInfo (line 232) | public BackupInfo backupInfo(final AuthenticatedBackupUser backupUser)...
method copyToBackup (line 257) | public Flux<CopyResult> copyToBackup(final CopyQuota copyQuota) {
method copyToBackup (line 295) | private Mono<CopyResult> copyToBackup(final AuthenticatedBackupUser ba...
method create (line 316) | private static CopyQuota create(AuthenticatedBackupUser backupUser, fi...
method getCopyQuota (line 333) | public CopyQuota getCopyQuota(
method recalculateQuota (line 379) | public CompletionStage<Optional<RecalculationResult>> recalculateQuota...
method indexWhereTotalExceeds (line 394) | private static <T> int indexWhereTotalExceeds(List<T> ts, Function<T, ...
method generateReadAuth (line 419) | public Map<String, String> generateReadAuth(final AuthenticatedBackupU...
method generateSvrbAuth (line 436) | public ExternalServiceCredentials generateSvrbAuth(final Authenticated...
method svrbIdentifier (line 444) | private static String svrbIdentifier(final AuthenticatedBackupUser bac...
method svrbIdentifier (line 448) | private static String svrbIdentifier(final byte[] hashedBackupId) {
method list (line 469) | public ListMediaResult list(
method deleteEntireBackup (line 488) | public void deleteEntireBackup(final AuthenticatedBackupUser backupUse...
method deleteMedia (line 513) | public Flux<StorageDescriptor> deleteMedia(final AuthenticatedBackupUs...
class UsageBatcher (line 572) | private static class UsageBatcher {
method UsageBatcher (line 578) | UsageBatcher(int usageCheckpointCount) {
method update (line 591) | boolean update(long bytesDelta) {
method getAndReset (line 601) | UsageUpdate getAndReset() {
method authenticateBackupUser (line 625) | public AuthenticatedBackupUser authenticateBackupUser(
method listBackupAttributes (line 665) | public Flux<StoredBackupAttributes> listBackupAttributes(final int seg...
method getExpiredBackups (line 679) | public Flux<ExpiredBackup> getExpiredBackups(final int segments, final...
method expireBackup (line 690) | public CompletableFuture<Void> expireBackup(final ExpiredBackup expire...
method deletePrefix (line 709) | private CompletableFuture<Void> deletePrefix(final String prefixToDele...
type PresentationSignatureVerifier (line 735) | interface PresentationSignatureVerifier {
method verifySignature (line 737) | Pair<BackupCredentialType, BackupLevel> verifySignature(byte[] signa...
method verifyPresentation (line 746) | private PresentationSignatureVerifier verifyPresentation(final BackupA...
method checkBackupLevel (line 776) | @VisibleForTesting
method checkBackupCredentialType (line 797) | @VisibleForTesting
method encodeMediaIdForCdn (line 808) | @VisibleForTesting
method decodeMediaIdFromCdn (line 813) | private static byte[] decodeMediaIdFromCdn(final String base64) {
method cdnMessageBackupName (line 817) | private static String cdnMessageBackupName(final AuthenticatedBackupUs...
method cdnMediaDirectory (line 821) | private static String cdnMediaDirectory(final String backupDir, final ...
method cdnMediaDirectory (line 825) | private static String cdnMediaDirectory(final AuthenticatedBackupUser ...
method cdnMediaPath (line 829) | private static String cdnMediaPath(final AuthenticatedBackupUser backu...
method rateLimitKey (line 833) | static String rateLimitKey(final AuthenticatedBackupUser backupUser) {
method parseUserAgent (line 837) | private static @Nullable UserAgent parseUserAgent(final String userAge...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupMissingIdCommitmentException.java
class BackupMissingIdCommitmentException (line 7) | public class BackupMissingIdCommitmentException extends BackupException {
method BackupMissingIdCommitmentException (line 8) | public BackupMissingIdCommitmentException() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupNotFoundException.java
class BackupNotFoundException (line 7) | public class BackupNotFoundException extends BackupException {
method BackupNotFoundException (line 9) | public BackupNotFoundException(final String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupPermissionException.java
class BackupPermissionException (line 7) | public class BackupPermissionException extends BackupException {
method BackupPermissionException (line 8) | public BackupPermissionException(String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupPublicKeyConflictException.java
class BackupPublicKeyConflictException (line 7) | public class BackupPublicKeyConflictException extends BackupException {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupWrongCredentialTypeException.java
class BackupWrongCredentialTypeException (line 7) | public class BackupWrongCredentialTypeException extends BackupException {
method BackupWrongCredentialTypeException (line 8) | public BackupWrongCredentialTypeException(String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupsDb.java
class BackupsDb (line 70) | public class BackupsDb {
method BackupsDb (line 113) | public BackupsDb(
method setPublicKey (line 132) | CompletableFuture<Void> setPublicKey(
method retrieveAuthenticationData (line 165) | CompletableFuture<Optional<AuthenticationData>> retrieveAuthentication...
method getDirName (line 184) | private static String getDirName(final Map<String, AttributeValue> ite...
method extractStoredPublicKey (line 191) | private static Optional<ECPublicKey> extractStoredPublicKey(final Map<...
method deserializeStoredPublicKey (line 198) | private static ECPublicKey deserializeStoredPublicKey(final byte[] pub...
method trackMedia (line 215) | CompletableFuture<Void> trackMedia(final AuthenticatedBackupUser backu...
method ttlRefresh (line 234) | CompletableFuture<StoredBackupAttributes> ttlRefresh(final Authenticat...
method addMessageBackup (line 252) | CompletableFuture<StoredBackupAttributes> addMessageBackup(final Authe...
class PendingDeletionException (line 269) | static class PendingDeletionException extends IOException {}
method scheduleBackupDeletion (line 285) | CompletableFuture<Void> scheduleBackupDeletion(final AuthenticatedBack...
method describeBackup (line 324) | CompletableFuture<BackupDescription> describeBackup(final Authenticate...
method getMediaUsage (line 350) | CompletableFuture<TimestampedUsageInfo> getMediaUsage(final Authentica...
method setMediaUsage (line 371) | CompletableFuture<Void> setMediaUsage(final AuthenticatedBackupUser ba...
method setMediaUsage (line 375) | CompletableFuture<Void> setMediaUsage(final StoredBackupAttributes bac...
method setMediaUsage (line 379) | private CompletableFuture<Void> setMediaUsage(final UpdateBuilder upda...
method startExpiration (line 407) | CompletableFuture<Void> startExpiration(final ExpiredBackup expiredBac...
method finishExpiration (line 435) | CompletableFuture<Void> finishExpiration(final ExpiredBackup expiredBa...
method listBackupAttributes (line 456) | Flux<StoredBackupAttributes> listBackupAttributes(final int segments) {
method fromItem (line 483) | private static StoredBackupAttributes fromItem(Map<String, AttributeVa...
method getExpiredBackups (line 494) | Flux<ExpiredBackup> getExpiredBackups(final int segments, final Schedu...
method isValid (line 572) | private static boolean isValid(final ExpiredBackup expiredBackup) {
class UpdateBuilder (line 585) | private static class UpdateBuilder {
method forUser (line 597) | static UpdateBuilder forUser(String tableName, AuthenticatedBackupUs...
method UpdateBuilder (line 601) | UpdateBuilder(String tableName, BackupLevel backupLevel, byte[] hash...
method addAttrValue (line 607) | private void addAttrValue(Map.Entry<String, AttributeValue> attrValu...
method addAttrName (line 614) | private void addAttrName(Map.Entry<String, String> attrName) {
method addAttrs (line 621) | private void addAttrs(final Map.Entry<String, String> attrName, fina...
method addSetExpression (line 626) | UpdateBuilder addSetExpression(
method addSetExpression (line 635) | UpdateBuilder addSetExpression(final String update) {
method addRemoveExpression (line 640) | UpdateBuilder addRemoveExpression(final Map.Entry<String, String> at...
method withConditionExpression (line 646) | UpdateBuilder withConditionExpression(final String conditionExpressi...
method withConditionExpression (line 651) | UpdateBuilder withConditionExpression(
method setCdn (line 660) | UpdateBuilder setCdn(final int cdn) {
method incrementMediaCount (line 667) | UpdateBuilder incrementMediaCount(long delta) {
method incrementMediaBytes (line 675) | UpdateBuilder incrementMediaBytes(long delta) {
method clearMediaUsage (line 683) | UpdateBuilder clearMediaUsage(final Clock clock) {
method setDirectoryNamesIfMissing (line 696) | UpdateBuilder setDirectoryNamesIfMissing(final SecureRandom secureRa...
method expireDirectoryNames (line 709) | UpdateBuilder expireDirectoryNames(
method setRefreshTimes (line 729) | UpdateBuilder setRefreshTimes(final Clock clock) {
method setRefreshTimes (line 739) | UpdateBuilder setRefreshTimes(final Instant refreshTime) {
method updateExpression (line 756) | private String updateExpression() {
method updateItemBuilder (line 774) | UpdateItemRequest.Builder updateItemBuilder() {
method transactItemBuilder (line 794) | Update.Builder transactItemBuilder() {
method generateDirName (line 808) | static String generateDirName(final SecureRandom secureRandom) {
method hashedBackupId (line 814) | private static byte[] hashedBackupId(final AuthenticatedBackupUser bac...
method hashedBackupId (line 818) | static byte[] hashedBackupId(final byte[] backupId) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/Cdn3BackupCredentialGenerator.java
class Cdn3BackupCredentialGenerator (line 19) | public class Cdn3BackupCredentialGenerator {
method Cdn3BackupCredentialGenerator (line 38) | public Cdn3BackupCredentialGenerator(final TusConfiguration cfg) {
method credentialsGenerator (line 43) | private static ExternalServiceCredentialsGenerator credentialsGenerato...
method generateUpload (line 52) | public BackupUploadDescriptor generateUpload(final String key) {
method readHeaders (line 70) | public Map<String, String> readHeaders(final String hashedBackupId) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManager.java
class Cdn3RemoteStorageManager (line 36) | public class Cdn3RemoteStorageManager implements RemoteStorageManager {
method Cdn3RemoteStorageManager (line 59) | public Cdn3RemoteStorageManager(
method cdnNumber (line 80) | @Override
method copy (line 85) | @Override
method Cdn3CopyRequest (line 138) | Cdn3CopyRequest(MediaEncryptionParameters parameters, SourceDescriptor...
method json (line 147) | String json() {
method list (line 156) | @Override
method parseListResponse (line 198) | private static ListResult parseListResponse(final HttpResponse<InputSt...
method calculateBytesUsed (line 225) | @Override
method parseUsageResponse (line 251) | private static UsageInfo parseUsageResponse(final HttpResponse<InputSt...
method delete (line 264) | public CompletionStage<Long> delete(final String key) {
method parseDeleteResponse (line 291) | private long parseDeleteResponse(final HttpResponse<InputStream> httpD...
method deleteUrl (line 298) | private String deleteUrl(final String key) {
method usageUrl (line 302) | private String usageUrl() {
method listUrl (line 306) | private String listUrl() {
method copyUrl (line 310) | private String copyUrl() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/CopyParameters.java
method destinationObjectSize (line 26) | long destinationObjectSize() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/CopyResult.java
type Outcome (line 22) | public enum Outcome {
method fromCopyError (line 36) | static Optional<CopyResult> fromCopyError(final Throwable throwable, fin...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/ExpiredBackup.java
type ExpirationType (line 23) | public enum ExpirationType {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/InvalidLengthException.java
class InvalidLengthException (line 5) | public class InvalidLengthException extends IOException {
method InvalidLengthException (line 7) | public InvalidLengthException(String s) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/MediaEncryptionParameters.java
method MediaEncryptionParameters (line 9) | public MediaEncryptionParameters(byte[] encryptionKey, byte[] macKey) {
method outputSize (line 15) | public int outputSize(final int inputSize) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/RemoteStorageManager.java
type RemoteStorageManager (line 10) | public interface RemoteStorageManager {
method cdnNumber (line 15) | int cdnNumber();
method copy (line 35) | CompletionStage<Void> copy(
method list (line 69) | CompletionStage<ListResult> list(final String prefix, final Optional<S...
method calculateBytesUsed (line 77) | CompletionStage<UsageInfo> calculateBytesUsed(final String prefix);
method delete (line 85) | CompletionStage<Long> delete(final String key);
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/SecureValueRecoveryBCredentialsGeneratorFactory.java
class SecureValueRecoveryBCredentialsGeneratorFactory (line 13) | public class SecureValueRecoveryBCredentialsGeneratorFactory {
method SecureValueRecoveryBCredentialsGeneratorFactory (line 14) | private SecureValueRecoveryBCredentialsGeneratorFactory() {}
method svrbCredentialsGenerator (line 17) | @VisibleForTesting
method svrbCredentialsGenerator (line 30) | public static ExternalServiceCredentialsGenerator svrbCredentialsGener...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/backup/SourceObjectNotFoundException.java
class SourceObjectNotFoundException (line 10) | public class SourceObjectNotFoundException extends IOException {
method SourceObjectNotFoundException (line 11) | public SourceObjectNotFoundException() {
method SourceObjectNotFoundException (line 14) | public SourceObjectNotFoundException(String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/badges/BadgeTranslator.java
type BadgeTranslator (line 12) | public interface BadgeTranslator {
method translate (line 13) | Badge translate(List<Locale> acceptableLanguages, String badgeId);
FILE: service/src/main/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverter.java
class ConfiguredProfileBadgeConverter (line 27) | public class ConfiguredProfileBadgeConverter implements ProfileBadgeConv...
method ConfiguredProfileBadgeConverter (line 37) | public ConfiguredProfileBadgeConverter(
method translate (line 48) | @Override
method convert (line 66) | @Override
method newBadge (line 114) | private Badge newBadge(
FILE: service/src/main/java/org/whispersystems/textsecuregcm/badges/LevelTranslator.java
type LevelTranslator (line 11) | public interface LevelTranslator {
method translate (line 12) | String translate(List<Locale> acceptableLanguages, String badgeId);
FILE: service/src/main/java/org/whispersystems/textsecuregcm/badges/ProfileBadgeConverter.java
type ProfileBadgeConverter (line 13) | public interface ProfileBadgeConverter {
method convert (line 19) | List<Badge> convert(List<Locale> acceptableLanguages, List<AccountBadg...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/captcha/Action.java
type Action (line 16) | public enum Action {
method Action (line 22) | Action(String actionName) {
method getActionName (line 26) | public String getActionName() {
method fromString (line 35) | @JsonCreator
method parse (line 40) | static Optional<Action> parse(final String action) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/captcha/AssessmentResult.java
class AssessmentResult (line 11) | public class AssessmentResult {
method AssessmentResult (line 26) | private AssessmentResult(boolean solved, float actualScore, float defa...
method fromScore (line 39) | public static AssessmentResult fromScore(float actualScore, float defa...
method invalid (line 49) | public static AssessmentResult invalid() {
method alwaysValid (line 56) | public static AssessmentResult alwaysValid() {
method isValid (line 65) | public boolean isValid() {
method isValid (line 75) | public boolean isValid(Optional<Float> scoreThreshold) {
method normalizedIntScore (line 84) | private static int normalizedIntScore(final float score) {
method getScoreString (line 88) | public String getScoreString() {
method getScore (line 92) | public float getScore() {
method scoreString (line 100) | private static String scoreString(final float score) {
method equals (line 105) | @Override
method hashCode (line 117) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/captcha/CaptchaChecker.java
class CaptchaChecker (line 22) | public class CaptchaChecker {
method CaptchaChecker (line 36) | public CaptchaChecker(
method verify (line 58) | public AssessmentResult verify(
FILE: service/src/main/java/org/whispersystems/textsecuregcm/captcha/CaptchaClient.java
type CaptchaClient (line 13) | public interface CaptchaClient {
method scheme (line 19) | String scheme();
method validSiteKeys (line 25) | Set<String> validSiteKeys(final Action action);
method verify (line 39) | AssessmentResult verify(
method noop (line 47) | static CaptchaClient noop() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/captcha/RegistrationCaptchaManager.java
class RegistrationCaptchaManager (line 12) | public class RegistrationCaptchaManager {
method RegistrationCaptchaManager (line 16) | public RegistrationCaptchaManager(final CaptchaChecker captchaChecker) {
method assessCaptcha (line 20) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
FILE: service/src/main/java/org/whispersystems/textsecuregcm/captcha/ShortCodeExpander.java
class ShortCodeExpander (line 21) | public class ShortCodeExpander {
method ShortCodeExpander (line 27) | public ShortCodeExpander(final HttpClient client, final String shorten...
method retrieve (line 32) | public Optional<String> retrieve(final String shortCode) throws IOExce...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/AccountsTableConfiguration.java
class AccountsTableConfiguration (line 8) | public class AccountsTableConfiguration extends Table {
method AccountsTableConfiguration (line 15) | @JsonCreator
method getPhoneNumberTableName (line 31) | @NotBlank
method getPhoneNumberIdentifierTableName (line 36) | @NotBlank
method getUsernamesTableName (line 41) | @NotBlank
method getUsedLinkDeviceTokensTableName (line 46) | @NotBlank
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/AwsCredentialsProviderFactory.java
type AwsCredentialsProviderFactory (line 12) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl...
method build (line 15) | AwsCredentialsProvider build();
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/BadgeConfiguration.java
class BadgeConfiguration (line 16) | public class BadgeConfiguration {
method BadgeConfiguration (line 25) | @JsonCreator
method getId (line 39) | @NotEmpty
method getCategory (line 44) | @NotEmpty
method getSprites (line 49) | @NotNull
method getSvg (line 55) | @NotEmpty
method getSvgs (line 60) | @NotNull
method isTestBadge (line 65) | public boolean isTestBadge() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/BadgesConfiguration.java
class BadgesConfiguration (line 22) | public class BadgesConfiguration {
method BadgesConfiguration (line 27) | @JsonCreator
method getBadges (line 37) | @Valid
method getBadgeIdsEnabledForAll (line 43) | @Valid
method getReceiptLevels (line 49) | @Valid
method isAllReceiptLevelsConfigured (line 55) | @JsonIgnore
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/CircuitBreakerConfiguration.java
class CircuitBreakerConfiguration (line 19) | public class CircuitBreakerConfiguration {
method getFailureRateThreshold (line 50) | public int getFailureRateThreshold() {
method getPermittedNumberOfCallsInHalfOpenState (line 54) | public int getPermittedNumberOfCallsInHalfOpenState() {
method getSlidingWindowSize (line 58) | public int getSlidingWindowSize() {
method getSlidingWindowMinimumNumberOfCalls (line 62) | public int getSlidingWindowMinimumNumberOfCalls() {
method getWaitDurationInOpenState (line 66) | public Duration getWaitDurationInOpenState() {
method getIgnoredExceptions (line 70) | public List<Class<?>> getIgnoredExceptions() {
method setFailureRateThreshold (line 82) | @VisibleForTesting
method setSlidingWindowSize (line 87) | @VisibleForTesting
method setSlidingWindowMinimumNumberOfCalls (line 92) | @VisibleForTesting
method setPermittedNumberOfCallsInHalfOpenState (line 97) | @VisibleForTesting
method setWaitDurationInOpenState (line 102) | @VisibleForTesting
method setIgnoredExceptions (line 107) | @VisibleForTesting
method toCircuitBreakerConfig (line 112) | public CircuitBreakerConfig toCircuitBreakerConfig() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/CloudflareTurnConfiguration.java
method isClientTtlShorterThanRequestedTtl (line 50) | @AssertTrue
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/DefaultAwsCredentialsFactory.java
method build (line 15) | public AwsCredentialsProvider build() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/DefaultPubSubPublisherFactory.java
method build (line 28) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryV2Configuration.java
class DirectoryV2Configuration (line 11) | public class DirectoryV2Configuration {
method DirectoryV2Configuration (line 15) | @JsonCreator
method getDirectoryV2ClientConfiguration (line 20) | @Valid
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/DynamoDbClientConfiguration.java
method buildSyncClient (line 42) | @Override
method buildAsyncClient (line 57) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/DynamoDbClientFactory.java
type DynamoDbClientFactory (line 15) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl...
method buildSyncClient (line 18) | DynamoDbClient buildSyncClient(AwsCredentialsProvider awsCredentialsPr...
method buildAsyncClient (line 20) | DynamoDbAsyncClient buildAsyncClient(AwsCredentialsProvider awsCredent...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/DynamoDbTables.java
class DynamoDbTables (line 15) | public class DynamoDbTables {
class Table (line 17) | public static class Table {
method Table (line 20) | @JsonCreator
method getTableName (line 26) | @NotEmpty
class TableWithExpiration (line 32) | public static class TableWithExpiration extends Table {
method TableWithExpiration (line 35) | @JsonCreator
method getExpiration (line 43) | @NotNull
method DynamoDbTables (line 77) | public DynamoDbTables(
method getAccounts (line 133) | @NotNull
method getAppleDeviceChecks (line 139) | @NotNull
method getAppleDeviceCheckPublicKeys (line 145) | @NotNull
method getBackups (line 151) | @NotNull
method getClientPublicKeys (line 157) | @NotNull
method getClientReleases (line 163) | @NotNull
method getDeletedAccounts (line 169) | @NotNull
method getDeletedAccountsLock (line 175) | @NotNull
method getIssuedReceipts (line 181) | @NotNull
method getEcKeys (line 187) | @NotNull
method getEcSignedPreKeys (line 193) | @NotNull
method getPagedKemKeys (line 199) | @NotNull
method getKemLastResortKeys (line 205) | @NotNull
method getMessages (line 211) | @NotNull
method getOnetimeDonations (line 217) | @NotNull
method getPhoneNumberIdentifiers (line 223) | @NotNull
method getProfiles (line 229) | @NotNull
method getPushChallenge (line 235) | @NotNull
method getPushNotificationExperimentSamples (line 241) | @NotNull
method getRedeemedReceipts (line 247) | @NotNull
method getRegistrationRecovery (line 253) | @NotNull
method getRemoteConfig (line 259) | @NotNull
method getReportMessage (line 265) | @NotNull
method getScheduledJobs (line 271) | @NotNull
method getSubscriptions (line 277) | @NotNull
method getVerificationSessions (line 283) | @NotNull
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/FaultTolerantRedisClientFactory.java
type FaultTolerantRedisClientFactory (line 13) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl...
method build (line 16) | FaultTolerantRedisClient build(String name, ClientResources clientReso...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/FaultTolerantRedisClusterFactory.java
type FaultTolerantRedisClusterFactory (line 13) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl...
method build (line 16) | FaultTolerantRedisClusterClient build(String name, ClientResources.Bui...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/GcpAttachmentsConfiguration.java
method isPathPrefixValid (line 20) | @SuppressWarnings("unused")
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/IssuedReceiptsTableConfiguration.java
class IssuedReceiptsTableConfiguration (line 16) | public class IssuedReceiptsTableConfiguration extends DynamoDbTables.Tab...
method IssuedReceiptsTableConfiguration (line 25) | public IssuedReceiptsTableConfiguration(
method getGenerator (line 35) | @NotEmpty
method getmaxIssuedReceiptsPerPaymentId (line 40) | public EnumMap<PaymentProvider, Integer> getmaxIssuedReceiptsPerPaymen...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/MaxDeviceConfiguration.java
class MaxDeviceConfiguration (line 12) | public class MaxDeviceConfiguration {
method getNumber (line 22) | public String getNumber() {
method getCount (line 26) | public int getCount() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/MessageCacheConfiguration.java
class MessageCacheConfiguration (line 12) | public class MessageCacheConfiguration {
method getRedisClusterConfiguration (line 22) | public FaultTolerantRedisClusterFactory getRedisClusterConfiguration() {
method getPersistDelayMinutes (line 26) | public int getPersistDelayMinutes() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/MonitoredS3ObjectConfiguration.java
method build (line 38) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/OpenTelemetryConfiguration.java
method get (line 24) | @Override
method maxBucketsPerMeter (line 29) | @Override
method histogramFlavor (line 37) | @Override
method shutdownWaitDuration (line 42) | public Duration shutdownWaitDuration() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/PaymentsServiceClientsConfiguration.java
method buildFixerClient (line 24) | @Override
method buildCoinGeckoClient (line 29) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/PaymentsServiceClientsFactory.java
type PaymentsServiceClientsFactory (line 14) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl...
method buildFixerClient (line 17) | FixerClient buildFixerClient(final HttpClient httpClient);
method buildCoinGeckoClient (line 19) | CoinGeckoClient buildCoinGeckoClient(HttpClient httpClient);
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/PubSubPublisherFactory.java
type PubSubPublisherFactory (line 13) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl...
method build (line 16) | PublisherInterface build() throws IOException;
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/RedisClusterConfiguration.java
class RedisClusterConfiguration (line 18) | @JsonTypeName("default")
method setConfigurationUri (line 33) | @VisibleForTesting
method getConfigurationUri (line 38) | public String getConfigurationUri() {
method getTimeout (line 42) | public Duration getTimeout() {
method getCircuitBreakerConfigurationName (line 46) | @Nullable public String getCircuitBreakerConfigurationName() {
method build (line 50) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/RedisConfiguration.java
class RedisConfiguration (line 18) | @JsonTypeName("default")
method getUri (line 33) | public String getUri() {
method setUri (line 37) | @VisibleForTesting
method getTimeout (line 42) | public Duration getTimeout() {
method getCircuitBreakerConfigurationName (line 46) | @Nullable public String getCircuitBreakerConfigurationName() {
method build (line 50) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/RegistrationServiceClientFactory.java
type RegistrationServiceClientFactory (line 15) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl...
method build (line 18) | RegistrationServiceClient build(Environment environment, Executor call...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/RegistrationServiceConfiguration.java
method build (line 23) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/ReportMessageConfiguration.java
class ReportMessageConfiguration (line 12) | public class ReportMessageConfiguration {
method getReportTtl (line 22) | public Duration getReportTtl() {
method getCounterTtl (line 26) | public Duration getCounterTtl() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/RetryConfiguration.java
class RetryConfiguration (line 13) | public class RetryConfiguration {
method getMaxAttempts (line 23) | public int getMaxAttempts() {
method setMaxAttempts (line 27) | public void setMaxAttempts(final int maxAttempts) {
method getWaitDuration (line 31) | public long getWaitDuration() {
method setWaitDuration (line 35) | public void setWaitDuration(final long waitDuration) {
method toRetryConfigBuilder (line 39) | public <T> RetryConfig.Builder<T> toRetryConfigBuilder() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/S3ObjectMonitorFactory.java
type S3ObjectMonitorFactory (line 14) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl...
method build (line 17) | S3ObjectMonitor build(AwsCredentialsProvider awsCredentialsProvider,
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/SpamFilterConfiguration.java
class SpamFilterConfiguration (line 12) | public class SpamFilterConfiguration {
method SpamFilterConfiguration (line 18) | @JsonCreator
method getEnvironment (line 23) | public String getEnvironment() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/StaticAwsCredentialsFactory.java
method build (line 22) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/SubscriptionConfiguration.java
class SubscriptionConfiguration (line 24) | public class SubscriptionConfiguration {
method SubscriptionConfiguration (line 35) | @JsonCreator
method getBadgeGracePeriod (line 53) | public Duration getBadgeGracePeriod() {
method getBadgeExpiration (line 58) | public Duration getBadgeExpiration() {
method getBackupExpiration (line 62) | public Duration getBackupExpiration() {
method getBackupGracePeriod (line 66) | public Duration getBackupGracePeriod() {
method getSubscriptionLevel (line 70) | public SubscriptionLevelConfiguration getSubscriptionLevel(long level) {
method getDonationLevels (line 76) | public Map<Long, SubscriptionLevelConfiguration.Donation> getDonationL...
method getBackupLevels (line 80) | public Map<Long, SubscriptionLevelConfiguration.Backup> getBackupLevel...
method areLevelConstraintsSatisfied (line 84) | @JsonIgnore
method isCurrencyListSameAcrossAllLevels (line 102) | @JsonIgnore
method isCurrencyListSameAccrossLevelConfigurations (line 109) | private static boolean isCurrencyListSameAccrossLevelConfigurations(
method getbackupFreeTierMediaDuration (line 120) | public Duration getbackupFreeTierMediaDuration() {
method isValidBackupLevel (line 124) | private static boolean isValidBackupLevel(final long receiptLevel) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/SubscriptionLevelConfiguration.java
type SubscriptionLevelConfiguration (line 15) | public sealed interface SubscriptionLevelConfiguration permits
method prices (line 18) | Map<String, SubscriptionPriceConfiguration> prices();
type Type (line 20) | enum Type {
method type (line 25) | default Type type() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/TurnUriConfiguration.java
class TurnUriConfiguration (line 11) | public class TurnUriConfiguration {
method getUris (line 29) | public List<String> getUris() {
method getWeight (line 33) | public long getWeight() {
method getEnrolledAcis (line 37) | public Set<UUID> getEnrolledAcis() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/URLSerializationConverter.java
class URLSerializationConverter (line 11) | final class URLSerializationConverter extends StdConverter<URL, String> {
method convert (line 13) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/UnidentifiedDeliveryConfiguration.java
method ecPrivateKey (line 19) | public ECPrivateKey ecPrivateKey() throws InvalidKeyException {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/VirtualThreadConfiguration.java
method VirtualThreadConfiguration (line 13) | public VirtualThreadConfiguration() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicBackupConfiguration.java
method DynamicBackupConfiguration (line 45) | public DynamicBackupConfiguration() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicCaptchaConfiguration.java
class DynamicCaptchaConfiguration (line 19) | public class DynamicCaptchaConfiguration {
method getScoreFloor (line 38) | public BigDecimal getScoreFloor() {
method isAllowHCaptcha (line 42) | public boolean isAllowHCaptcha() {
method getScoreFloorByAction (line 46) | public Map<Action, BigDecimal> getScoreFloorByAction() {
method setAllowHCaptcha (line 50) | @VisibleForTesting
method setScoreFloor (line 55) | @VisibleForTesting
method getHCaptchaSiteKeys (line 60) | public Map<Action, Set<String>> getHCaptchaSiteKeys() {
method setHCaptchaSiteKeys (line 64) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicCarrierDataLookupConfiguration.java
method DynamicCarrierDataLookupConfiguration (line 15) | public DynamicCarrierDataLookupConfiguration() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicConfiguration.java
class DynamicConfiguration (line 17) | public class DynamicConfiguration {
method getExperimentEnrollmentConfiguration (line 79) | public Optional<DynamicExperimentEnrollmentConfiguration> getExperimen...
method getE164ExperimentEnrollmentConfiguration (line 84) | public Optional<DynamicE164ExperimentEnrollmentConfiguration> getE164E...
method getLimits (line 89) | public Map<String, RateLimiterConfig> getLimits() {
method getRemoteDeprecationConfiguration (line 93) | public DynamicRemoteDeprecationConfiguration getRemoteDeprecationConfi...
method getPaymentsConfiguration (line 97) | public DynamicPaymentsConfiguration getPaymentsConfiguration() {
method getCaptchaConfiguration (line 101) | public DynamicCaptchaConfiguration getCaptchaConfiguration() {
method getMessagePersisterConfiguration (line 105) | public DynamicMessagePersisterConfiguration getMessagePersisterConfigu...
method getRegistrationConfiguration (line 109) | public DynamicRegistrationConfiguration getRegistrationConfiguration() {
method getMetricsConfiguration (line 113) | public DynamicMetricsConfiguration getMetricsConfiguration() {
method getSvr2StatusCodesToIgnoreForAccountDeletion (line 117) | public List<Integer> getSvr2StatusCodesToIgnoreForAccountDeletion() {
method getSvrbStatusCodesToIgnoreForAccountDeletion (line 121) | public List<Integer> getSvrbStatusCodesToIgnoreForAccountDeletion() {
method restDeprecation (line 125) | public DynamicRestDeprecationConfiguration restDeprecation() {
method getBackupConfiguration (line 129) | public DynamicBackupConfiguration getBackupConfiguration() {
method getCarrierDataLookupConfiguration (line 133) | public DynamicCarrierDataLookupConfiguration getCarrierDataLookupConfi...
method getGrpcAllowList (line 137) | public DynamicGrpcAllowListConfiguration getGrpcAllowList() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicE164ExperimentEnrollmentConfiguration.java
class DynamicE164ExperimentEnrollmentConfiguration (line 15) | public class DynamicE164ExperimentEnrollmentConfiguration {
method getEnrolledE164s (line 39) | public Set<String> getEnrolledE164s() {
method getExcludedE164s (line 43) | public Set<String> getExcludedE164s() {
method getIncludedCountryCodes (line 47) | public Set<String> getIncludedCountryCodes() {
method getExcludedCountryCodes (line 51) | public Set<String> getExcludedCountryCodes() {
method getEnrollmentPercentage (line 55) | public int getEnrollmentPercentage() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicExperimentEnrollmentConfiguration.java
class DynamicExperimentEnrollmentConfiguration (line 17) | public class DynamicExperimentEnrollmentConfiguration {
class UuidSelector (line 19) | public static class UuidSelector {
method getUuids (line 38) | public Set<UUID> getUuids() {
method getUuidEnrollmentPercentage (line 42) | public int getUuidEnrollmentPercentage() {
method getEnrollmentPercentage (line 71) | public int getEnrollmentPercentage() {
method getUuidSelector (line 75) | public UuidSelector getUuidSelector() {
method getExcludedUuids (line 79) | public Set<UUID> getExcludedUuids() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicGrpcAllowListConfiguration.java
method DynamicGrpcAllowListConfiguration (line 34) | public DynamicGrpcAllowListConfiguration() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicMessagePersisterConfiguration.java
class DynamicMessagePersisterConfiguration (line 12) | public class DynamicMessagePersisterConfiguration {
method DynamicMessagePersisterConfiguration (line 29) | public DynamicMessagePersisterConfiguration() {}
method DynamicMessagePersisterConfiguration (line 31) | @VisibleForTesting
method isPersistenceEnabled (line 43) | public boolean isPersistenceEnabled() {
method getTrimOversizedQueueExtraRoomRatio (line 47) | public double getTrimOversizedQueueExtraRoomRatio() {
method getNodeClaimTtl (line 51) | public Duration getNodeClaimTtl() {
method getSleepBetweenNodes (line 55) | public Duration getSleepBetweenNodes() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicPaymentsConfiguration.java
class DynamicPaymentsConfiguration (line 12) | public class DynamicPaymentsConfiguration {
method getDisallowedPrefixes (line 17) | public List<String> getDisallowedPrefixes() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicRemoteDeprecationConfiguration.java
class DynamicRemoteDeprecationConfiguration (line 17) | public class DynamicRemoteDeprecationConfiguration {
method setMinimumVersions (line 34) | @VisibleForTesting
method getMinimumVersions (line 39) | public Map<ClientPlatform, Semver> getMinimumVersions() {
method setVersionsPendingDeprecation (line 43) | @VisibleForTesting
method getVersionsPendingDeprecation (line 48) | public Map<ClientPlatform, Semver> getVersionsPendingDeprecation() {
method setUnrecognizedUserAgentAllowed (line 52) | @VisibleForTesting
method isUnrecognizedUserAgentAllowed (line 57) | public boolean isUnrecognizedUserAgentAllowed() {
method setBlockedVersions (line 61) | @VisibleForTesting
method getBlockedVersions (line 66) | public Map<ClientPlatform, Set<Semver>> getBlockedVersions() {
method setVersionsPendingBlock (line 70) | @VisibleForTesting
method getVersionsPendingBlock (line 75) | public Map<ClientPlatform, Set<Semver>> getVersionsPendingBlock() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/secrets/BaseSecretValidator.java
class BaseSecretValidator (line 14) | public abstract class BaseSecretValidator<A extends Annotation, T, S ext...
method BaseSecretValidator (line 19) | protected BaseSecretValidator(final ConstraintValidator<A, T> validato...
method initialize (line 23) | @Override
method isValid (line 28) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/secrets/Secret.java
class Secret (line 8) | public class Secret<T> {
method Secret (line 13) | public Secret(final T value) {
method value (line 17) | public T value() {
method toString (line 21) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/secrets/SecretBytes.java
class SecretBytes (line 10) | public class SecretBytes extends Secret<byte[]> {
method SecretBytes (line 12) | public SecretBytes(final byte[] value) {
method requireNotEmpty (line 16) | private static byte[] requireNotEmpty(final byte[] value) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/secrets/SecretBytesList.java
class SecretBytesList (line 14) | public class SecretBytesList extends Secret<List<byte[]>> {
class ValidatorNotEmpty (line 16) | @SuppressWarnings("rawtypes")
method ValidatorNotEmpty (line 18) | public ValidatorNotEmpty() {
method SecretBytesList (line 23) | public SecretBytesList(final List<byte[]> value) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/secrets/SecretStore.java
class SecretStore (line 18) | public class SecretStore {
method fromYamlFileSecretsBundle (line 23) | public static SecretStore fromYamlFileSecretsBundle(final String filen...
method SecretStore (line 35) | public SecretStore(final Map<String, Secret<?>> secrets) {
method secretString (line 39) | public SecretString secretString(final String reference) {
method secretBytesFromBase64String (line 43) | public SecretBytes secretBytesFromBase64String(final String reference) {
method secretStringList (line 48) | public SecretStringList secretStringList(final String reference) {
method secretBytesListFromBase64Strings (line 52) | public SecretBytesList secretBytesListFromBase64Strings(final String r...
method fromStore (line 58) | private <T extends Secret<?>> T fromStore(final String name, final Cla...
method fromYamlStringSecretsBundle (line 70) | @VisibleForTesting
method fromSecretsBundle (line 81) | private static SecretStore fromSecretsBundle(final Map<String, Object>...
method decodeBase64 (line 103) | private static byte[] decodeBase64(final String str) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/secrets/SecretString.java
class SecretString (line 10) | public class SecretString extends Secret<String> {
method SecretString (line 11) | public SecretString(final String value) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/secrets/SecretStringList.java
class SecretStringList (line 14) | public class SecretStringList extends Secret<List<String>> {
class ValidatorNotEmpty (line 16) | @SuppressWarnings("rawtypes")
method ValidatorNotEmpty (line 18) | public ValidatorNotEmpty() {
method SecretStringList (line 23) | public SecretStringList(final List<String> value) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/configuration/secrets/SecretsModule.java
class SecretsModule (line 19) | public class SecretsModule extends SimpleModule {
method SecretsModule (line 28) | private SecretsModule() {
method setSecretStore (line 35) | public void setSecretStore(final SecretStore secretStore) {
method createDeserializer (line 39) | private <T> JsonDeserializer<T> createDeserializer(final BiFunction<Se...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java
class AccountController (line 76) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method AccountController (line 93) | public AccountController(
method setGcmRegistrationId (line 104) | @PUT
method deleteGcmRegistrationId (line 128) | @DELETE
method setApnRegistrationId (line 144) | @PUT
method deleteApnRegistrationId (line 166) | @DELETE
method setRegistrationLock (line 186) | @PUT
method removeRegistrationLock (line 199) | @DELETE
method setName (line 208) | @PUT
method setAccountAttributes (line 246) | @PUT
method whoAmI (line 287) | @GET
method deleteUsernameHash (line 297) | @DELETE
method reserveUsernameHash (line 315) | @PUT
method confirmUsernameHash (line 356) | @PUT
method lookupUsernameHash (line 404) | @GET
method updateUsernameLink (line 439) | @PUT
method deleteUsernameLink (line 481) | @DELETE
method lookupUsernameLink (line 503) | @GET
method accountExists (line 531) | @Operation(
method deleteAccount (line 559) | @DELETE
method clearUsernameLink (line 568) | private void clearUsernameLink(final Account account) {
method updateUsernameLink (line 572) | private void updateUsernameLink(
method requireNotAuthenticated (line 582) | private void requireNotAuthenticated(final Optional<AuthenticatedDevic...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountControllerV2.java
class AccountControllerV2 (line 58) | @Path("/v2/accounts")
method AccountControllerV2 (line 71) | public AccountControllerV2(final AccountsManager accountsManager,
method changeNumber (line 84) | @PUT
method setPhoneNumberDiscoverability (line 172) | @PUT
method getAccountDataReport (line 189) | @GET
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountIdentityResponseBuilder.java
class AccountIdentityResponseBuilder (line 15) | public class AccountIdentityResponseBuilder {
method AccountIdentityResponseBuilder (line 21) | public AccountIdentityResponseBuilder(Account account) {
method storageCapable (line 27) | public AccountIdentityResponseBuilder storageCapable(boolean storageCa...
method clock (line 32) | public AccountIdentityResponseBuilder clock(Clock clock) {
method build (line 37) | public AccountIdentityResponse build() {
method fromAccount (line 59) | public static AccountIdentityResponse fromAccount(final Account accoun...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/ArchiveController.java
class ArchiveController (line 94) | @Path("/v1/archives")
method ArchiveController (line 106) | public ArchiveController(
method setBackupId (line 138) | @PUT
method checkLimits (line 181) | @GET
class Deserializer (line 206) | public static class Deserializer extends JsonDeserializer<ReceiptCrede...
method deserialize (line 208) | @Override
method redeemReceipt (line 220) | @POST
type CredentialType (line 257) | public enum CredentialType {
method toValue (line 261) | @JsonValue
method fromValue (line 266) | @JsonCreator
method fromLibsignalType (line 271) | @VisibleForTesting
method getBackupZKCredentials (line 287) | @GET
method BackupAuthCredentialPresentationHeader (line 365) | public BackupAuthCredentialPresentationHeader(final String header) {
method deserialize (line 369) | private static BackupAuthCredentialPresentation deserialize(final Stri...
method BackupAuthCredentialPresentationSignature (line 383) | public BackupAuthCredentialPresentationSignature(final String header) {
method readAuth (line 391) | @GET
method svrbAuth (line 424) | @GET
method backupInfo (line 477) | @GET
method setPublicKey (line 520) | @PUT
method backup (line 565) | @GET
method uploadTemporaryAttachment (line 615) | @GET
method toCopyParameters (line 687) | CopyParameters toCopyParameters() {
method copyMedia (line 701) | @PUT
method fromCopyResult (line 792) | static Entry fromCopyResult(final CopyResult copyResult) {
method copyMedia (line 803) | @PUT
method refresh (line 855) | @POST
method listMedia (line 920) | @GET
method deleteMedia (line 984) | @POST
method deleteBackup (line 1020) | @DELETE
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/AttachmentControllerV4.java
class AttachmentControllerV4 (line 35) | @Path("/v4/attachments")
method AttachmentControllerV4 (line 47) | public AttachmentControllerV4(
method getAttachmentUploadForm (line 61) | @GET
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/CallLinkController.java
class CallLinkController (line 24) | @Path("/v1/call-link")
method CallLinkController (line 30) | public CallLinkController(
method getCreateAuth (line 38) | @POST
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/CallQualitySurveyController.java
class CallQualitySurveyController (line 35) | @Path("/v1/call_quality_survey")
method CallQualitySurveyController (line 41) | public CallQualitySurveyController(final CallQualitySurveyManager call...
method submitCallQualitySurvey (line 45) | @PUT
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/CallRoutingControllerV2.java
class CallRoutingControllerV2 (line 25) | @io.swagger.v3.oas.annotations.tags.Tag(name = "Calling")
method CallRoutingControllerV2 (line 35) | public CallRoutingControllerV2(
method getCallingRelays (line 43) | @GET
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/CertificateController.java
class CertificateController (line 45) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method CertificateController (line 61) | public CertificateController(
method getDeliveryCertificate (line 75) | @GET
method getGroupAuthenticationCredentials (line 92) | @GET
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/ChallengeController.java
class ChallengeController (line 49) | @Path("/v1/challenge")
method ChallengeController (line 62) | public ChallengeController(
method handleChallengeResponse (line 71) | @PUT
method requestPushChallenge (line 139) | @POST
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceCheckController.java
class DeviceCheckController (line 53) | @Path("/v1/devicecheck")
method DeviceCheckController (line 65) | public DeviceCheckController(
method attestChallenge (line 86) | @GET
method attest (line 113) | @PUT
method assertChallenge (line 160) | @GET
method assertion (line 193) | @POST
type Action (line 259) | public enum Action {
method fromString (line 262) | @JsonCreator
method fromString (line 285) | public static AssertionRequestWrapper fromString(String requestBase64)...
method toChallengeType (line 293) | private static AppleDeviceCheckManager.ChallengeType toChallengeType(f...
method parseKeyId (line 299) | private static byte[] parseKeyId(final String base64KeyId) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java
class DeviceController (line 87) | @Path("/v1/devices")
method DeviceController (line 118) | public DeviceController(final AccountsManager accounts,
method buildGauge (line 134) | private static AtomicInteger buildGauge(final String clientPlatformNam...
method getDevices (line 140) | @GET
method removeDevice (line 152) | @DELETE
method createDeviceToken (line 186) | @GET
method linkDevice (line 226) | @PUT
method waitForLinkedDevice (line 320) | @GET
method getCounterForLinkedDeviceListeners (line 387) | private AtomicInteger getCounterForLinkedDeviceListeners(final String ...
method setCapabilities (line 395) | @PUT
method isCapabilityDowngrade (line 410) | private static boolean isCapabilityDowngrade(final Account account, fi...
method recordRestoreAccountRequest (line 421) | @PUT
method waitForDeviceTransferRequest (line 449) | @GET
method recordTransferArchiveUploaded (line 485) | @PUT
method waitForTransferArchive (line 516) | @GET
method primaryPlatformTag (line 577) | private static io.micrometer.core.instrument.Tag primaryPlatformTag(fi...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceLimitExceededException.java
class DeviceLimitExceededException (line 9) | public class DeviceLimitExceededException extends Exception {
method DeviceLimitExceededException (line 14) | public DeviceLimitExceededException(int currentDevices, int maxDevices) {
method getCurrentDevices (line 19) | public int getCurrentDevices() {
method getMaxDevices (line 23) | public int getMaxDevices() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/DirectoryV2Controller.java
class DirectoryV2Controller (line 22) | @Path("/v2/directory")
method credentialsGenerator (line 28) | @VisibleForTesting
method credentialsGenerator (line 39) | public static ExternalServiceCredentialsGenerator credentialsGenerator...
method DirectoryV2Controller (line 43) | public DirectoryV2Controller(final ExternalServiceCredentialsGenerator...
method getAuthToken (line 47) | @GET
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/DonationController.java
class DonationController (line 43) | @Path("/v1/donation")
type ReceiptCredentialPresentationFactory (line 47) | public interface ReceiptCredentialPresentationFactory {
method build (line 48) | ReceiptCredentialPresentation build(byte[] bytes) throws InvalidInpu...
method DonationController (line 58) | public DonationController(
method redeemReceipt (line 73) | @POST
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeepAliveController.java
class KeepAliveController (line 30) | @Path("/v1/keepalive")
method KeepAliveController (line 42) | public KeepAliveController(final RedisMessageAvailabilityManager redis...
method getKeepAlive (line 46) | @GET
method getProvisioningKeepAlive (line 71) | @GET
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeyTransparencyController.java
class KeyTransparencyController (line 49) | @Path("/v1/key-transparency")
method KeyTransparencyController (line 56) | public KeyTransparencyController(
method search (line 61) | @Operation(
method monitor (line 120) | @Operation(
method getDistinguishedKey (line 180) | @Operation(
method handleKeyTransparencyServiceError (line 217) | private void handleKeyTransparencyServiceError(final StatusRuntimeExce...
method requireNotAuthenticated (line 231) | private void requireNotAuthenticated(final Optional<AuthenticatedDevic...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java
class KeysController (line 80) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method KeysController (line 98) | public KeysController(RateLimiters rateLimiters, KeysManager keysManag...
method getStatus (line 106) | @GET
method setKeys (line 129) | @PUT
method checkSignedPreKeySignatures (line 203) | private void checkSignedPreKeySignatures(final SetKeysRequest setKeysR...
method checkKeys (line 225) | @POST
method getDeviceKeys (line 320) | @GET
method parseDeviceId (line 400) | private List<Device> parseDeviceId(String deviceId, Account account) {
method getPreKeysLimiterKey (line 412) | private String getPreKeysLimiterKey(
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java
class MessageController (line 113) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method MessageController (line 173) | public MessageController(
method sendMessage (line 208) | @Path("/{destination}")
method sendIdentifiedSenderIndividualMessage (line 297) | private void sendIdentifiedSenderIndividualMessage(final Authenticated...
method sendSyncMessage (line 317) | private void sendSyncMessage(final AuthenticatedDevice source,
method sendSealedSenderMessage (line 337) | private void sendSealedSenderMessage(final ServiceIdentifier destinati...
method sendStoryMessage (line 367) | private void sendStoryMessage(final ServiceIdentifier destinationIdent...
method sendIndividualMessage (line 389) | private void sendIndividualMessage(final Account destination,
method sendMultiRecipientMessage (line 477) | @Path("/multi_recipient")
method sendMultiRecipientMessage (line 563) | private SendMultiRecipientMessageResponse sendMultiRecipientMessage(fi...
method sendMultiRecipientStoryMessage (line 621) | @SuppressWarnings("SameReturnValue")
method sendMultiRecipientMessage (line 664) | private void sendMultiRecipientMessage(final SealedSenderMultiRecipien...
method checkGroupSendToken (line 730) | private void checkGroupSendToken(final Collection<ServiceId> recipient...
method checkGroupSendToken (line 734) | private void checkGroupSendToken(final Collection<ServiceId> recipient...
method checkAccessKeys (line 744) | private void checkAccessKeys(
method getPendingMessages (line 765) | @GET
method estimateMessageListSizeBytes (line 832) | private static long estimateMessageListSizeBytes(final OutgoingMessage...
method reportSpamMessage (line 843) | @POST
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/MismatchedDevicesException.java
class MismatchedDevicesException (line 8) | public class MismatchedDevicesException extends Exception {
method MismatchedDevicesException (line 12) | public MismatchedDevicesException(final MismatchedDevices mismatchedDe...
method getMismatchedDevices (line 16) | public MismatchedDevices getMismatchedDevices() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/MultiRecipientMismatchedDevicesException.java
class MultiRecipientMismatchedDevicesException (line 11) | public class MultiRecipientMismatchedDevicesException extends Exception {
method MultiRecipientMismatchedDevicesException (line 15) | public MultiRecipientMismatchedDevicesException(
method getMismatchedDevicesByServiceIdentifier (line 25) | public Map<ServiceIdentifier, MismatchedDevices> getMismatchedDevicesB...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/OneTimeDonationController.java
class OneTimeDonationController (line 83) | @Path("/v1/subscription/boost")
method OneTimeDonationController (line 100) | public OneTimeDonationController(
class CreateBoostRequest (line 119) | public static class CreateBoostRequest {
method createBoostPaymentIntent (line 141) | @POST
method validateRequestCurrencyAmount (line 206) | private void validateRequestCurrencyAmount(CreateBoostRequest request,...
class CreatePayPalBoostRequest (line 237) | public static class CreatePayPalBoostRequest extends CreateBoostRequest {
method CreatePayPalBoostRequest (line 244) | public CreatePayPalBoostRequest() {
method createPayPalBoost (line 251) | @POST
class ConfirmPayPalBoostRequest (line 295) | public static class ConfirmPayPalBoostRequest extends CreateBoostReque...
method confirmPayPalBoost (line 307) | @POST
class CreateBoostReceiptCredentialsRequest (line 333) | public static class CreateBoostReceiptCredentialsRequest {
method createBoostReceiptCredentials (line 353) | @POST
method getClientPlatform (line 441) | @Nullable
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/PaymentsController.java
class PaymentsController (line 21) | @Path("/v1/payments")
method credentialsGenerator (line 29) | public static ExternalServiceCredentialsGenerator credentialsGenerator...
method PaymentsController (line 36) | public PaymentsController(final CurrencyConversionManager currencyMana...
method getAuth (line 42) | @GET
method getConversions (line 49) | @GET
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java
class ProfileController (line 102) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method ProfileController (line 126) | public ProfileController(
method setProfile (line 154) | @PUT
method getProfile (line 231) | @GET
method getProfile (line 266) | @GET
method getUnversionedProfile (line 313) | @GET
method runBatchIdentityCheck (line 363) | @POST
method checkFingerprintAndAdd (line 408) | private void checkFingerprintAndAdd(BatchIdentityCheckRequest.Element ...
method buildExpiringProfileKeyCredentialProfileResponse (line 430) | private ExpiringProfileKeyCredentialProfileResponse buildExpiringProfi...
method buildVersionedProfileResponse (line 455) | private VersionedProfileResponse buildVersionedProfileResponse(final A...
method buildBaseProfileResponseForAccountIdentity (line 492) | private BaseProfileResponse buildBaseProfileResponseForAccountIdentity...
method buildBaseProfileResponseForPhoneNumberIdentity (line 507) | private BaseProfileResponse buildBaseProfileResponseForPhoneNumberIden...
method verifyPermissionToReceiveProfile (line 530) | private Account verifyPermissionToReceiveProfile(final Optional<Accoun...
method generateAvatarUploadForm (line 554) | private ProfileAvatarUploadAttributes generateAvatarUploadForm(
method getAccountCapabilities (line 565) | private static Map<String, Boolean> getAccountCapabilities(final Accou...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProvisioningController.java
class ProvisioningController (line 48) | @Path("/v1/provisioning")
method ProvisioningController (line 61) | public ProvisioningController(RateLimiters rateLimiters, ProvisioningM...
method sendProvisioningMessage (line 66) | @Path("/{destination}")
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/RateLimitExceededException.java
class RateLimitExceededException (line 14) | public class RateLimitExceededException extends Exception implements Con...
method RateLimitExceededException (line 24) | public RateLimitExceededException(@Nullable final Duration retryDurati...
method getRetryDuration (line 29) | public Optional<Duration> getRetryDuration() {
method toStatusRuntimeException (line 33) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/RegistrationController.java
class RegistrationController (line 54) | @Path("/v1/registration")
method RegistrationController (line 73) | public RegistrationController(final AccountsManager accounts,
method register (line 84) | @POST
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/RemoteConfigController.java
class RemoteConfigController (line 52) | @Path("/v2/config")
method RemoteConfigController (line 64) | public RemoteConfigController(RemoteConfigsManager remoteConfigsManager,
method getAll (line 71) | @GET
method platformPrefix (line 134) | private static String platformPrefix(final String userAgent) {
method isInBucket (line 142) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/SecureStorageController.java
class SecureStorageController (line 21) | @Path("/v1/storage")
method credentialsGenerator (line 27) | public static ExternalServiceCredentialsGenerator credentialsGenerator...
method SecureStorageController (line 34) | public SecureStorageController(ExternalServiceCredentialsGenerator sto...
method getAuth (line 38) | @GET
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/SecureValueRecovery2Controller.java
class SecureValueRecovery2Controller (line 49) | @Path("/v2/{name: backup|svr}")
method credentialsGenerator (line 59) | public static ExternalServiceCredentialsGenerator credentialsGenerator...
method credentialsGenerator (line 63) | @VisibleForTesting
method SecureValueRecovery2Controller (line 77) | public SecureValueRecovery2Controller(final ExternalServiceCredentials...
method getAuth (line 83) | @GET
method authCheck (line 100) | @POST
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/ServerRejectedException.java
class ServerRejectedException (line 8) | public class ServerRejectedException extends Exception {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/StickerController.java
class StickerController (line 32) | @Path("/v1/sticker")
method StickerController (line 40) | public StickerController(RateLimiters rateLimiters, String accessKey, ...
method getStickersForm (line 46) | @GET
method generatePackId (line 79) | private String generatePackId() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/SubscriptionController.java
class SubscriptionController (line 99) | @Path("/v1/subscription")
method SubscriptionController (line 119) | public SubscriptionController(
method buildCurrencyConfiguration (line 144) | private Map<String, CurrencyConfiguration> buildCurrencyConfiguration() {
method buildGetSubscriptionConfigurationResponse (line 184) | @VisibleForTesting
method deleteSubscriber (line 230) | @DELETE
method updateSubscriber (line 256) | @PUT
method createPaymentMethod (line 284) | @POST
method createPayPalPaymentMethod (line 321) | @POST
method getCustomerAwareProcessor (line 352) | private CustomerAwareSubscriptionPaymentProcessor getCustomerAwareProc...
method setDefaultPaymentMethodWithProcessor (line 360) | @POST
type Type (line 386) | public enum Type {
method setSubscriptionLevel (line 399) | @PUT
method subscriptionsAreSameType (line 448) | public boolean subscriptionsAreSameType(long level1, long level2) {
method setAppStoreSubscription (line 453) | @POST
method setPlayStoreSubscription (line 489) | @POST
method getConfiguration (line 583) | @GET
method getBankMandate (line 598) | @GET
method getSubscriptionInformation (line 657) | @GET
method createSubscriptionReceiptCredentials (line 710) | @POST
method setDefaultPaymentMethodForIdeal (line 786) | @POST
method setDefaultPaymentMethod (line 802) | private void setDefaultPaymentMethod(final CustomerAwareSubscriptionPa...
method receiptExpirationWithGracePeriod (line 822) | private Instant receiptExpirationWithGracePeriod(CustomerAwareSubscrip...
method getSubscriptionTemplateId (line 835) | private String getSubscriptionTemplateId(long level, String currency, ...
method getClientPlatform (line 854) | @Nullable
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/VerificationController.java
class VerificationController (line 109) | @Path("/v1/verification")
method VerificationController (line 148) | public VerificationController(final RegistrationServiceClient registra...
method createSession (line 174) | @POST
method updateSession (line 262) | @PATCH
method storeVerificationSession (line 336) | private void storeVerificationSession(final VerificationSession verifi...
method updateStoredVerificationSession (line 342) | private void updateStoredVerificationSession(final VerificationSession...
method handlePushToken (line 353) | private VerificationSession handlePushToken(
method handlePushChallenge (line 393) | private VerificationSession handlePushChallenge(
method handleCaptcha (line 465) | private VerificationSession handleCaptcha(
method getSession (line 531) | @GET
method requestVerificationCode (line 551) | @POST
method verifyCode (line 705) | @PUT
method buildResponseForRateLimitExceeded (line 824) | private Response buildResponseForRateLimitExceeded(final VerificationS...
method retrieveRegistrationServiceSession (line 842) | private RegistrationServiceSession retrieveRegistrationServiceSession(...
method retrieveVerificationSession (line 878) | private VerificationSession retrieveVerificationSession(final Registra...
method validateAndExtractPushToken (line 888) | private Pair<String, PushNotification.TokenType> validateAndExtractPus...
method buildResponse (line 907) | private VerificationSessionResponse buildResponse(final RegistrationSe...
method decodeSessionId (line 916) | public static byte[] decodeSessionId(final String sessionId) {
method generatePushChallenge (line 920) | private static String generatePushChallenge() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/controllers/VerificationSessionRateLimitExceededException.java
class VerificationSessionRateLimitExceededException (line 12) | public class VerificationSessionRateLimitExceededException extends RateL...
method VerificationSessionRateLimitExceededException (line 24) | public VerificationSessionRateLimitExceededException(
method getRegistrationSession (line 31) | public RegistrationServiceSession getRegistrationSession() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/currency/CoinGeckoClient.java
class CoinGeckoClient (line 24) | public class CoinGeckoClient {
method CoinGeckoClient (line 34) | public CoinGeckoClient(final HttpClient httpClient, final String apiKe...
method getSpotPrice (line 40) | public BigDecimal getSpotPrice(final String currency, final String bas...
method parseResponse (line 70) | @VisibleForTesting
method extractConversionRate (line 75) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/currency/CurrencyConversionManager.java
class CurrencyConversionManager (line 35) | public class CurrencyConversionManager implements Managed {
method CurrencyConversionManager (line 75) | public CurrencyConversionManager(
method getCurrencyConversions (line 90) | public Optional<CurrencyConversionEntityList> getCurrencyConversions() {
method start (line 94) | @Override
method stop (line 106) | @Override
method update (line 113) | @VisibleForTesting
method updateEntity (line 120) | private void updateEntity() {
method updateFixerCacheIfNecessary (line 139) | private void updateFixerCacheIfNecessary() throws IOException {
method updateCoinGeckoCacheIfNecessary (line 162) | private void updateCoinGeckoCacheIfNecessary() throws IOException {
method getCachedData (line 190) | private Map<String, BigDecimal> getCachedData(final String cacheKey) {
method shouldUpdateSharedCache (line 201) | private boolean shouldUpdateSharedCache(final String cacheKey, final D...
method updateCachedData (line 206) | private void updateCachedData(final String cacheKey, final Map<String,...
method stripTrailingZerosAfterDecimal (line 216) | private BigDecimal stripTrailingZerosAfterDecimal(BigDecimal bigDecima...
method setCachedFixerValues (line 225) | @VisibleForTesting
method convertToUsd (line 230) | public Optional<BigDecimal> convertToUsd(final BigDecimal amount, fina...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/currency/FixerClient.java
class FixerClient (line 19) | public class FixerClient {
method FixerClient (line 24) | public FixerClient(HttpClient client, String apiKey) {
method getConversionsForBase (line 29) | public Map<String, BigDecimal> getConversionsForBase(String base) thro...
class FixerResponse (line 56) | private static class FixerResponse {
class FixerException (line 75) | public static class FixerException extends IOException {
method FixerException (line 76) | public FixerException(String message) {
method FixerException (line 80) | public FixerException(Exception exception) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java
class AccountAttributes (line 25) | public class AccountAttributes {
method AccountAttributes (line 68) | public AccountAttributes() {
method AccountAttributes (line 71) | @VisibleForTesting
method getFetchesMessages (line 89) | public boolean getFetchesMessages() {
method getRegistrationId (line 93) | public int getRegistrationId() {
method getPhoneNumberIdentityRegistrationId (line 97) | public int getPhoneNumberIdentityRegistrationId() {
method getName (line 101) | public byte[] getName() {
method getRegistrationLock (line 105) | public String getRegistrationLock() {
method getUnidentifiedAccessKey (line 109) | public byte[] getUnidentifiedAccessKey() {
method isUnrestrictedUnidentifiedAccess (line 113) | public boolean isUnrestrictedUnidentifiedAccess() {
method getCapabilities (line 117) | @Nullable
method isDiscoverableByPhoneNumber (line 122) | public boolean isDiscoverableByPhoneNumber() {
method recoveryPassword (line 126) | public Optional<byte[]> recoveryPassword() {
method withUnidentifiedAccessKey (line 130) | @VisibleForTesting
method withRecoveryPassword (line 136) | @VisibleForTesting
method isEachRegistrationIdValid (line 142) | @AssertTrue
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountDataReportResponse.java
method text (line 29) | @JsonProperty
method BadgeDataReport (line 116) | public BadgeDataReport(AccountBadge badge) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/AnswerCaptchaChallengeRequest.java
class AnswerCaptchaChallengeRequest (line 11) | public class AnswerCaptchaChallengeRequest extends AnswerChallengeRequest {
method getToken (line 23) | public String getToken() {
method getCaptcha (line 27) | public String getCaptcha() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/AnswerChallengeRequest.java
class AnswerChallengeRequest (line 11) | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/AnswerPushChallengeRequest.java
class AnswerPushChallengeRequest (line 11) | public class AnswerPushChallengeRequest extends AnswerChallengeRequest {
method getChallenge (line 17) | public String getChallenge() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/AuthCheckResponseV2.java
type Result (line 16) | public enum Result {
method Result (line 23) | Result(final String clientCode) {
method clientCode (line 27) | @JsonValue
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/AvatarChange.java
type AvatarChange (line 3) | public enum AvatarChange {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/Badge.java
class Badge (line 14) | public class Badge {
method Badge (line 23) | @JsonCreator
method getId (line 47) | public String getId() {
method getCategory (line 51) | public String getCategory() {
method getName (line 55) | public String getName() {
method getDescription (line 59) | public String getDescription() {
method getSprites6 (line 63) | public List<String> getSprites6() {
method getSvg (line 67) | public String getSvg() {
method getSvgs (line 71) | public List<BadgeSvg> getSvgs() {
method getImageUrl (line 78) | @Deprecated
method equals (line 84) | @Override
method hashCode (line 102) | @Override
method toString (line 107) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/BadgeSvg.java
class BadgeSvg (line 14) | public class BadgeSvg {
method BadgeSvg (line 18) | @JsonCreator
method getLight (line 32) | @NotEmpty
method getDark (line 37) | @NotEmpty
method equals (line 42) | @Override
method hashCode (line 55) | @Override
method toString (line 60) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/BaseProfileResponse.java
class BaseProfileResponse (line 21) | @Schema(description = "Unversioned profile containing basic information")
method BaseProfileResponse (line 54) | public BaseProfileResponse() {
method BaseProfileResponse (line 57) | public BaseProfileResponse(final IdentityKey identityKey,
method getIdentityKey (line 72) | public IdentityKey getIdentityKey() {
method getUnidentifiedAccess (line 76) | public byte[] getUnidentifiedAccess() {
method isUnrestrictedUnidentifiedAccess (line 80) | public boolean isUnrestrictedUnidentifiedAccess() {
method getCapabilities (line 84) | public Map<String, Boolean> getCapabilities() {
method getBadges (line 88) | public List<Badge> getBadges() {
method getUuid (line 92) | public ServiceIdentifier getUuid() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/ChangeNumberRequest.java
method isSignatureValidOnEachSignedPreKey (line 71) | public boolean isSignatureValidOnEachSignedPreKey(@Nullable final String...
method isEachPniRegistrationIdValid (line 78) | @AssertTrue
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/CreateProfileRequest.java
type AvatarChange (line 85) | public enum AvatarChange {
method getAvatarChange (line 91) | public AvatarChange getAvatarChange() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/CurrencyConversionEntity.java
class CurrencyConversionEntity (line 8) | public class CurrencyConversionEntity {
method CurrencyConversionEntity (line 16) | public CurrencyConversionEntity(String base, Map<String, BigDecimal> c...
method CurrencyConversionEntity (line 21) | public CurrencyConversionEntity() {}
method getBase (line 23) | public String getBase() {
method getConversions (line 27) | public Map<String, BigDecimal> getConversions() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/CurrencyConversionEntityList.java
class CurrencyConversionEntityList (line 7) | public class CurrencyConversionEntityList {
method CurrencyConversionEntityList (line 15) | public CurrencyConversionEntityList(List<CurrencyConversionEntity> cur...
method CurrencyConversionEntityList (line 20) | public CurrencyConversionEntityList() {}
method getCurrencies (line 22) | public List<CurrencyConversionEntity> getCurrencies() {
method getTimestamp (line 26) | public long getTimestamp() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/DeliveryCertificate.java
class DeliveryCertificate (line 11) | public class DeliveryCertificate {
method DeliveryCertificate (line 15) | @JsonCreator
method getCertificate (line 21) | public byte[] getCertificate() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/DeviceInfo.java
method forDevice (line 35) | public static DeviceInfo forDevice(final Device device) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/ECPreKey.java
method serializedPublicKey (line 33) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/ECSignedPreKey.java
method serializedPublicKey (line 43) | @Override
method equals (line 48) | @Override
method hashCode (line 58) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/EncryptedUsername.java
method EncryptedUsername (line 31) | public EncryptedUsername(final byte[] usernameLinkEncryptedValue) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/ExpiringProfileKeyCredentialProfileResponse.java
class ExpiringProfileKeyCredentialProfileResponse (line 16) | @Schema(description = "Profile response with an expiring profile key cre...
method ExpiringProfileKeyCredentialProfileResponse (line 29) | public ExpiringProfileKeyCredentialProfileResponse() {
method ExpiringProfileKeyCredentialProfileResponse (line 32) | public ExpiringProfileKeyCredentialProfileResponse(final VersionedProf...
method getCredential (line 39) | @Nullable
method getVersionedProfileResponse (line 44) | public VersionedProfileResponse getVersionedProfileResponse() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/ExpiringProfileKeyCredentialResponseAdapter.java
class ExpiringProfileKeyCredentialResponseAdapter (line 19) | public class ExpiringProfileKeyCredentialResponseAdapter {
class Serializing (line 21) | public static class Serializing extends JsonSerializer<ExpiringProfile...
method serialize (line 22) | @Override
class Deserializing (line 30) | public static class Deserializing extends JsonDeserializer<ExpiringPro...
method deserialize (line 31) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java
method toEnvelope (line 37) | public MessageProtos.Envelope toEnvelope(final ServiceIdentifier destina...
method isValidEnvelopeType (line 77) | @AssertTrue
method equals (line 91) | @Override
method hashCode (line 99) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessageList.java
method IncomingMessageList (line 40) | @JsonCreator
method isNotDuplicateRecipients (line 49) | @AssertTrue
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingWebsocketMessage.java
class IncomingWebsocketMessage (line 11) | @JsonIgnoreProperties(ignoreUnknown = true)
method IncomingWebsocketMessage (line 21) | public IncomingWebsocketMessage() {}
method IncomingWebsocketMessage (line 23) | public IncomingWebsocketMessage(int type) {
method getType (line 27) | public int getType() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/KEMSignedPreKey.java
method serializedPublicKey (line 44) | @Override
method equals (line 49) | @Override
method hashCode (line 59) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/KeyTransparencySearchRequest.java
method isUnidentifiedAccessKeyProvidedWithE164 (line 59) | @AssertTrue
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/LinkDeviceRequest.java
method LinkDeviceRequest (line 30) | @JsonCreator
method isExactlyOneMessageDeliveryChannel (line 45) | @AssertTrue
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java
method toEnvelope (line 41) | @VisibleForTesting
method fromEnvelope (line 76) | public static OutgoingMessageEntity fromEnvelope(final MessageProtos.Env...
method equals (line 93) | @Override
method hashCode (line 116) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/PhoneNumberIdentityKeyDistributionRequest.java
method isSignatureValidOnEachSignedPreKey (line 59) | public boolean isSignatureValidOnEachSignedPreKey(@Nullable final String...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/PhoneVerificationRequest.java
type PhoneVerificationRequest (line 16) | public interface PhoneVerificationRequest {
type VerificationType (line 18) | enum VerificationType {
method sessionId (line 23) | String sessionId();
method recoveryPassword (line 25) | byte[] recoveryPassword();
method isValid (line 28) | @AssertTrue
method verificationType (line 35) | default PhoneVerificationRequest.VerificationType verificationType() {
method decodeSessionId (line 40) | default byte[] decodeSessionId() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKey.java
type PreKey (line 8) | public interface PreKey<K> {
method keyId (line 10) | long keyId();
method publicKey (line 12) | K publicKey();
method serializedPublicKey (line 14) | byte[] serializedPublicKey();
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyCount.java
class PreKeyCount (line 11) | public class PreKeyCount {
method PreKeyCount (line 21) | public PreKeyCount(int ecCount, int pqCount) {
method PreKeyCount (line 26) | public PreKeyCount() {}
method getCount (line 28) | public int getCount() {
method getPqCount (line 32) | public int getPqCount() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponse.java
class PreKeyResponse (line 17) | public class PreKeyResponse {
method PreKeyResponse (line 29) | public PreKeyResponse() {}
method PreKeyResponse (line 31) | public PreKeyResponse(IdentityKey identityKey, List<PreKeyResponseItem...
method getIdentityKey (line 36) | @VisibleForTesting
method getDevice (line 41) | @VisibleForTesting
method getDevicesCount (line 51) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeyResponseItem.java
class PreKeyResponseItem (line 11) | public class PreKeyResponseItem {
method PreKeyResponseItem (line 34) | public PreKeyResponseItem() {}
method PreKeyResponseItem (line 36) | public PreKeyResponseItem(byte deviceId, int registrationId, ECSignedP...
method getSignedPreKey (line 45) | @VisibleForTesting
method getPreKey (line 50) | @VisibleForTesting
method getPqPreKey (line 55) | @VisibleForTesting
method getRegistrationId (line 60) | @VisibleForTesting
method getDeviceId (line 65) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/PreKeySignatureValidator.java
class PreKeySignatureValidator (line 17) | public abstract class PreKeySignatureValidator {
method validatePreKeySignatures (line 21) | public static boolean validatePreKeySignatures(final IdentityKey ident...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/ProfileAvatarUploadAttributes.java
class ProfileAvatarUploadAttributes (line 11) | @Schema(description = "Profile avatar upload form (S3 Post Policy, AWS S...
method ProfileAvatarUploadAttributes (line 42) | public ProfileAvatarUploadAttributes() {}
method ProfileAvatarUploadAttributes (line 44) | public ProfileAvatarUploadAttributes(String key, String credential, St...
method getKey (line 56) | public String getKey() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/ProfileKeyCommitmentAdapter.java
class ProfileKeyCommitmentAdapter (line 19) | public class ProfileKeyCommitmentAdapter {
class Serializing (line 21) | public static class Serializing extends JsonSerializer<ProfileKeyCommi...
method serialize (line 22) | @Override
class Deserializing (line 28) | public static class Deserializing extends JsonDeserializer<ProfileKeyC...
method deserialize (line 30) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/PurchasableBadge.java
class PurchasableBadge (line 17) | public class PurchasableBadge extends Badge {
method PurchasableBadge (line 20) | @JsonCreator
method PurchasableBadge (line 34) | public PurchasableBadge(final Badge badge, final Duration duration) {
method getDuration (line 46) | @JsonFormat(shape = Shape.NUMBER_INT)
method equals (line 51) | @Override
method hashCode (line 66) | @Override
method toString (line 71) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/RateLimitChallenge.java
class RateLimitChallenge (line 8) | public class RateLimitChallenge {
method RateLimitChallenge (line 18) | @JsonCreator
method getToken (line 25) | public String getToken() {
method getOptions (line 29) | public List<String> getOptions() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/RedeemReceiptRequest.java
class RedeemReceiptRequest (line 13) | public class RedeemReceiptRequest {
method RedeemReceiptRequest (line 22) | @JsonCreator
method getReceiptCredentialPresentation (line 32) | @NotEmpty
method isVisible (line 37) | public boolean isVisible() {
method isPrimary (line 41) | public boolean isPrimary() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationRequest.java
method isEverySignedKeyValid (line 76) | public boolean isEverySignedKeyValid(@Nullable final String userAgent) {
method isExactlyOneMessageDeliveryChannel (line 88) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/RegistrationServiceSession.java
method encodedSessionId (line 21) | public String encodedSessionId() {
method encodeSessionId (line 25) | public static String encodeSessionId(final byte[] sessionId) {
method RegistrationServiceSession (line 29) | public RegistrationServiceSession(byte[] id, String number, Registration...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/RemoteAttachmentError.java
type ErrorType (line 17) | public enum ErrorType {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/RestoreAccountRequest.java
type Method (line 31) | public enum Method {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/SelfBadge.java
class SelfBadge (line 16) | public class SelfBadge extends Badge {
method SelfBadge (line 20) | public SelfBadge(
method getExpiration (line 35) | public Instant getExpiration() {
method isVisible (line 39) | public boolean isVisible() {
method equals (line 43) | @Override
method hashCode (line 58) | @Override
method toString (line 63) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/SendMessageResponse.java
class SendMessageResponse (line 10) | public class SendMessageResponse {
method SendMessageResponse (line 15) | public SendMessageResponse() {}
method SendMessageResponse (line 17) | public SendMessageResponse(boolean needsSync) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/SignedPreKey.java
type SignedPreKey (line 10) | public interface SignedPreKey<K> extends PreKey<K> {
method signature (line 12) | byte[] signature();
method signatureValid (line 14) | default boolean signatureValid(final IdentityKey identityKey) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/StickerPackFormUploadAttributes.java
class StickerPackFormUploadAttributes (line 12) | public class StickerPackFormUploadAttributes {
method StickerPackFormUploadAttributes (line 23) | public StickerPackFormUploadAttributes() {}
method StickerPackFormUploadAttributes (line 25) | public StickerPackFormUploadAttributes(String packId, StickerPackFormU...
method getManifest (line 31) | public StickerPackFormUploadItem getManifest() {
method getStickers (line 35) | public List<StickerPackFormUploadItem> getStickers() {
method getPackId (line 39) | public String getPackId() {
class StickerPackFormUploadItem (line 43) | public static class StickerPackFormUploadItem {
method StickerPackFormUploadItem (line 68) | public StickerPackFormUploadItem() {}
method StickerPackFormUploadItem (line 70) | public StickerPackFormUploadItem(int id, String key, String credenti...
method getKey (line 81) | public String getKey() {
method getCredential (line 85) | public String getCredential() {
method getAcl (line 89) | public String getAcl() {
method getAlgorithm (line 93) | public String getAlgorithm() {
method getDate (line 97) | public String getDate() {
method getPolicy (line 101) | public String getPolicy() {
method getSignature (line 105) | public String getSignature() {
method getId (line 109) | public int getId() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/TransferArchiveResult.java
type TransferArchiveResult (line 12) | @JsonTypeInfo(use = JsonTypeInfo.Id.DEDUCTION)
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/UpdateVerificationSessionRequest.java
type PushTokenType (line 31) | public enum PushTokenType {
method toTokenType (line 37) | public PushNotification.TokenType toTokenType() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/UserRemoteConfig.java
class UserRemoteConfig (line 11) | public class UserRemoteConfig {
method UserRemoteConfig (line 25) | public UserRemoteConfig() {
method UserRemoteConfig (line 28) | public UserRemoteConfig(String name, boolean enabled, String value) {
method getName (line 34) | public String getName() {
method isEnabled (line 38) | public boolean isEnabled() {
method getValue (line 42) | public String getValue() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/UserRemoteConfigList.java
class UserRemoteConfigList (line 16) | public class UserRemoteConfigList {
method UserRemoteConfigList (line 31) | public UserRemoteConfigList() {}
method UserRemoteConfigList (line 33) | public UserRemoteConfigList(List<UserRemoteConfig> config, Instant ser...
method getConfig (line 38) | public List<UserRemoteConfig> getConfig() {
method getServerEpochTime (line 42) | public Instant getServerEpochTime() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/entities/VerificationCodeRequest.java
type Transport (line 19) | public enum Transport {
method toMessageTransport (line 25) | public MessageTransport toMessageTransport() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/experiment/DeviceLastSeenState.java
type PushTokenType (line 17) | public enum PushTokenType {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/experiment/Experiment.java
class Experiment (line 26) | public class Experiment {
method Experiment (line 49) | public Experiment(final String... names) {
method Experiment (line 61) | @VisibleForTesting
method compareMonoResult (line 74) | public <T> void compareMonoResult(final T expected, final Mono<T> expe...
method compareFutureResult (line 82) | public <T> void compareFutureResult(final T expected, final Completion...
method compareSupplierResult (line 94) | public <T> void compareSupplierResult(final T expected, final Supplier...
method compareSupplierResultAsync (line 106) | public <T> void compareSupplierResultAsync(final T expected, final Sup...
method recordError (line 116) | private void recordError(final Throwable cause, final Timer.Sample sam...
method recordResult (line 121) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/experiment/ExperimentEnrollmentManager.java
class ExperimentEnrollmentManager (line 21) | public class ExperimentEnrollmentManager {
method ExperimentEnrollmentManager (line 27) | public ExperimentEnrollmentManager(
method ExperimentEnrollmentManager (line 32) | @VisibleForTesting
method isEnrolled (line 40) | public boolean isEnrolled(final UUID accountUuid, final String experim...
method isAccountEnrolled (line 50) | private Optional<Boolean> isAccountEnrolled(final UUID accountUuid, Dy...
method isEnrolled (line 66) | public boolean isEnrolled(final String e164, final UUID accountUuid, f...
method isEnrolled (line 76) | public boolean isEnrolled(final String e164, final String experimentNa...
method isEnrolled (line 108) | private static boolean isEnrolled(final Object entity, final int enrol...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/experiment/IdleDevicePushNotificationExperiment.java
class IdleDevicePushNotificationExperiment (line 18) | abstract class IdleDevicePushNotificationExperiment implements PushNotif...
type Population (line 24) | @VisibleForTesting
type Outcome (line 32) | @VisibleForTesting
method IdleDevicePushNotificationExperiment (line 40) | protected IdleDevicePushNotificationExperiment(final IdleWakeupEligibi...
method hasPushToken (line 44) | @VisibleForTesting
method isIdleDeviceEligible (line 49) | abstract boolean isIdleDeviceEligible(final Account account, final Dev...
method isDeviceEligible (line 51) | @Override
method getState (line 57) | @Override
method analyzeResults (line 74) | @Override
method getPopulation (line 104) | @VisibleForTesting
method getOutcome (line 114) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/experiment/PushNotificationExperiment.java
type PushNotificationExperiment (line 16) | public interface PushNotificationExperiment<T> {
method getExperimentName (line 23) | String getExperimentName();
method isDeviceEligible (line 34) | CompletableFuture<Boolean> isDeviceEligible(Account account, Device de...
method getStateClass (line 41) | Class<T> getStateClass();
method getState (line 52) | T getState(@Nullable Account account, @Nullable Device device);
method applyControlTreatment (line 63) | default CompletableFuture<Void> applyControlTreatment(Account account,...
method applyExperimentTreatment (line 76) | CompletableFuture<Void> applyExperimentTreatment(Account account, Devi...
method analyzeResults (line 84) | void analyzeResults(Flux<PushNotificationExperimentSample<T>> samples);
FILE: service/src/main/java/org/whispersystems/textsecuregcm/experiment/PushNotificationExperimentSamples.java
class PushNotificationExperimentSamples (line 31) | public class PushNotificationExperimentSamples {
method PushNotificationExperimentSamples (line 61) | public PushNotificationExperimentSamples(final DynamoDbAsyncClient dyn...
method recordInitialState (line 86) | public <T> CompletableFuture<Boolean> recordInitialState(final UUID ac...
method recordFinalState (line 140) | public <T> CompletableFuture<PushNotificationExperimentSample<T>> reco...
method getSamples (line 208) | public <T> Flux<PushNotificationExperimentSample<T>> getSamples(final ...
method discardSamples (line 234) | public CompletableFuture<Void> discardSamples(final String experimentN...
method buildSortKey (line 261) | @VisibleForTesting
method parseSortKey (line 270) | private static Tuple2<UUID, Byte> parseSortKey(final AttributeValue so...
method parseState (line 276) | private static <T> T parseState(final String state, final Class<T> cla...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/filters/ExternalRequestFilter.java
class ExternalRequestFilter (line 31) | public class ExternalRequestFilter implements Filter, ServerInterceptor {
method ExternalRequestFilter (line 42) | public ExternalRequestFilter(final Set<InetAddressRange> permittedInte...
method interceptCall (line 48) | @Override
method doFilter (line 71) | @Override
method shouldBlock (line 96) | public boolean shouldBlock(InetAddress remoteAddress) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/filters/RemoteAddressFilter.java
class RemoteAddressFilter (line 24) | public class RemoteAddressFilter implements Filter {
method RemoteAddressFilter (line 30) | public RemoteAddressFilter() {
method doFilter (line 33) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/filters/RemoteDeprecationFilter.java
class RemoteDeprecationFilter (line 45) | public class RemoteDeprecationFilter implements Filter, ServerInterceptor {
method RemoteDeprecationFilter (line 57) | public RemoteDeprecationFilter(final DynamicConfigurationManager<Dynam...
method doFilter (line 61) | @Override
method interceptCall (line 79) | @Override
method shouldBlock (line 101) | private boolean shouldBlock(@Nullable final UserAgent userAgent) {
method recordDeprecation (line 149) | private void recordDeprecation(final UserAgent userAgent, final String...
method recordPendingDeprecation (line 155) | private void recordPendingDeprecation(final UserAgent userAgent, final...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/filters/RequestStatisticsFilter.java
class RequestStatisticsFilter (line 25) | public class RequestStatisticsFilter implements ContainerRequestFilter {
method RequestStatisticsFilter (line 41) | public RequestStatisticsFilter(@Nonnull final TrafficSource trafficeSo...
method filter (line 45) | @Override
method resolveIpVersion (line 58) | @Nonnull
FILE: service/src/main/java/org/whispersystems/textsecuregcm/filters/RestDeprecationFilter.java
class RestDeprecationFilter (line 34) | public class RestDeprecationFilter implements ContainerRequestFilter {
method RestDeprecationFilter (line 45) | public RestDeprecationFilter(
method RestDeprecationFilter (line 51) | @VisibleForTesting
method filter (line 61) | @Override
method isEnrolled (line 88) | private boolean isEnrolled(final ContainerRequestContext requestContex...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/filters/TimestampResponseFilter.java
class TimestampResponseFilter (line 23) | public class TimestampResponseFilter implements Filter, ContainerRespons...
method doFilter (line 25) | @Override
method filter (line 36) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/gcp/CanonicalRequest.java
class CanonicalRequest (line 10) | public class CanonicalRequest {
method CanonicalRequest (line 32) | public CanonicalRequest(@Nonnull String canonicalRequest, @Nonnull Str...
method getCanonicalRequest (line 42) | @Nonnull
method getResourcePath (line 47) | @Nonnull
method getCanonicalQuery (line 52) | @Nonnull
method getActiveDatetime (line 57) | @Nonnull
method getCredentialScope (line 62) | @Nonnull
method getDomain (line 67) | @Nonnull
method getMaxSizeInBytes (line 72) | public int getMaxSizeInBytes() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/gcp/CanonicalRequestGenerator.java
class CanonicalRequestGenerator (line 19) | public class CanonicalRequestGenerator {
method CanonicalRequestGenerator (line 34) | public CanonicalRequestGenerator(@Nonnull String domain, @Nonnull Stri...
method createFor (line 41) | public CanonicalRequest createFor(@Nonnull final String key, @Nonnull ...
method makeCredentialScope (line 72) | private String makeCredentialScope(@Nonnull ZonedDateTime now) {
method makeCredential (line 76) | private String makeCredential(@Nonnull String email, @Nonnull ZonedDat...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/gcp/CanonicalRequestSigner.java
class CanonicalRequestSigner (line 25) | public class CanonicalRequestSigner {
method CanonicalRequestSigner (line 33) | public CanonicalRequestSigner(@Nonnull String rsaSigningKey) throws IO...
method sign (line 37) | public String sign(@Nonnull CanonicalRequest canonicalRequest) {
method makeStringToSign (line 41) | private String makeStringToSign(@Nonnull final CanonicalRequest canoni...
method sign (line 60) | private String sign(@Nonnull String stringToSign) {
method initializeRsaSigningKey (line 73) | private static PrivateKey initializeRsaSigningKey(String rsaSigningKey...
method testKeyIsValidForSigning (line 92) | private static void testKeyIsValidForSigning(PrivateKey key) throws In...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/AccountsAnonymousGrpcService.java
class AccountsAnonymousGrpcService (line 26) | public class AccountsAnonymousGrpcService extends SimpleAccountsAnonymou...
method AccountsAnonymousGrpcService (line 31) | public AccountsAnonymousGrpcService(final AccountsManager accountsMana...
method checkAccountExistence (line 36) | @Override
method lookupUsernameHash (line 50) | @Override
method lookupUsernameLink (line 63) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcService.java
class AccountsGrpcService (line 60) | public class AccountsGrpcService extends SimpleAccountsGrpc.AccountsImpl...
method AccountsGrpcService (line 67) | public AccountsGrpcService(final AccountsManager accountsManager,
method getAccountIdentity (line 78) | @Override
method deleteAccount (line 95) | @Override
method setRegistrationLock (line 103) | @Override
method clearRegistrationLock (line 116) | @Override
method reserveUsernameHash (line 124) | @Override
method confirmUsernameHash (line 158) | @Override
method deleteUsernameHash (line 194) | @Override
method setUsernameLink (line 201) | @Override
method deleteUsernameLink (line 225) | @Override
method configureUnidentifiedAccess (line 237) | @Override
method setDiscoverableByPhoneNumber (line 253) | @Override
method setRegistrationRecoveryPassword (line 261) | @Override
method getAuthenticatedAccount (line 270) | private Account getAuthenticatedAccount() {
method getAuthenticatedAccount (line 274) | private Account getAuthenticatedAccount(final AuthenticatedDevice auth...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/AttachmentsGrpcService.java
class AttachmentsGrpcService (line 25) | public class AttachmentsGrpcService extends SimpleAttachmentsGrpc.Attach...
method AttachmentsGrpcService (line 32) | public AttachmentsGrpcService(
method getUploadForm (line 45) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/AvatarChangeUtil.java
class AvatarChangeUtil (line 11) | public class AvatarChangeUtil {
method fromGrpcAvatarChange (line 12) | public static AvatarChange fromGrpcAvatarChange(final org.signal.chat....
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/BackupsAnonymousGrpcService.java
class BackupsAnonymousGrpcService (line 59) | public class BackupsAnonymousGrpcService extends SimpleBackupsAnonymousG...
method BackupsAnonymousGrpcService (line 64) | public BackupsAnonymousGrpcService(final BackupManager backupManager, ...
method getCdnCredentials (line 69) | @Override
method getSvrBCredentials (line 85) | @Override
method getMessageBackupInfo (line 103) | @Override
method getMediaBackupInfo (line 123) | @Override
method refresh (line 143) | @Override
method setPublicKey (line 156) | @Override
method getUploadForm (line 170) | @Override
method copyMedia (line 212) | @Override
method listMedia (line 253) | @Override
method deleteAll (line 281) | @Override
method deleteMedia (line 294) | @Override
method mapException (line 319) | @Override
method authenticateBackupUser (line 329) | private AuthenticatedBackupUser authenticateBackupUser(final SignedPre...
method fromUnsignedExact (line 348) | private static int fromUnsignedExact(final int i) {
type Deserializer (line 355) | private interface Deserializer<T> {
method deserialize (line 357) | T deserialize(byte[] bytes) throws InvalidInputException, InvalidKey...
method deserialize (line 360) | private static <T> T deserialize(Deserializer<T> deserializer, byte[] ...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/BackupsGrpcService.java
class BackupsGrpcService (line 47) | public class BackupsGrpcService extends SimpleBackupsGrpc.BackupsImplBase {
method BackupsGrpcService (line 53) | public BackupsGrpcService(final AccountsManager accountManager, final ...
method setBackupId (line 59) | @Override
method redeemReceipt (line 80) | public RedeemReceiptResponse redeemReceipt(RedeemReceiptRequest reques...
method getBackupAuthCredentials (line 97) | @Override
method mapException (line 141) | @Override
method authenticatedAccount (line 151) | private Account authenticatedAccount() {
type Deserializer (line 157) | private interface Deserializer<T> {
method deserialize (line 159) | T deserialize(byte[] bytes) throws InvalidInputException;
method deserializeWithEmptyPresenceCheck (line 162) | private <T> Optional<T> deserializeWithEmptyPresenceCheck(Deserializer...
method deserialize (line 169) | private <T> T deserialize(Deserializer<T> deserializer, byte[] bytes) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/CallQualitySurveyGrpcService.java
class CallQualitySurveyGrpcService (line 18) | public class CallQualitySurveyGrpcService extends SimpleCallQualityGrpc....
method CallQualitySurveyGrpcService (line 23) | public CallQualitySurveyGrpcService(final CallQualitySurveyManager cal...
method submitCallQualitySurvey (line 30) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ChannelNotFoundException.java
class ChannelNotFoundException (line 11) | public class ChannelNotFoundException extends Exception {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ConvertibleToGrpcStatus.java
type ConvertibleToGrpcStatus (line 16) | public interface ConvertibleToGrpcStatus {
method toStatusRuntimeException (line 17) | StatusRuntimeException toStatusRuntimeException();
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/DeviceCapabilityUtil.java
class DeviceCapabilityUtil (line 10) | public class DeviceCapabilityUtil {
method DeviceCapabilityUtil (line 12) | private DeviceCapabilityUtil() {
method fromGrpcDeviceCapability (line 15) | public static DeviceCapability fromGrpcDeviceCapability(final org.sign...
method toGrpcDeviceCapability (line 26) | public static org.signal.chat.common.DeviceCapability toGrpcDeviceCapa...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/DeviceIdUtil.java
class DeviceIdUtil (line 11) | public class DeviceIdUtil {
method isValid (line 13) | public static boolean isValid(int deviceId) {
method validate (line 17) | static byte validate(int deviceId) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/DevicesGrpcService.java
class DevicesGrpcService (line 37) | public class DevicesGrpcService extends SimpleDevicesGrpc.DevicesImplBase {
method DevicesGrpcService (line 41) | public DevicesGrpcService(final AccountsManager accountsManager) {
method getDevices (line 45) | @Override
method removeDevice (line 71) | @Override
method setDeviceName (line 90) | @Override
method setPushToken (line 114) | @Override
method clearPushToken (line 154) | @Override
method setCapabilities (line 174) | @Override
method getAuthenticatedAccount (line 188) | private Account getAuthenticatedAccount() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ErrorConformanceInterceptor.java
class ErrorConformanceInterceptor (line 16) | public class ErrorConformanceInterceptor implements ServerInterceptor {
method interceptCall (line 23) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ErrorMappingInterceptor.java
class ErrorMappingInterceptor (line 28) | public class ErrorMappingInterceptor implements ServerInterceptor {
method interceptCall (line 32) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ExternalServiceCredentialsAnonymousGrpcService.java
class ExternalServiceCredentialsAnonymousGrpcService (line 26) | public class ExternalServiceCredentialsAnonymousGrpcService extends
method create (line 36) | public static ExternalServiceCredentialsAnonymousGrpcService create(
method ExternalServiceCredentialsAnonymousGrpcService (line 45) | @VisibleForTesting
method checkSvrCredentials (line 53) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ExternalServiceCredentialsGrpcService.java
class ExternalServiceCredentialsGrpcService (line 25) | public class ExternalServiceCredentialsGrpcService extends SimpleExterna...
method createForAllExternalServices (line 32) | public static ExternalServiceCredentialsGrpcService createForAllExtern...
method ExternalServiceCredentialsGrpcService (line 41) | @VisibleForTesting
method getExternalServiceCredentials (line 49) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ExternalServiceDefinitions.java
type ExternalServiceDefinitions (line 23) | enum ExternalServiceDefinitions {
method ExternalServiceDefinitions (line 63) | ExternalServiceDefinitions(
method createExternalServiceList (line 70) | public static Map<ExternalServiceType, ExternalServiceCredentialsGener...
method generatorFactory (line 78) | public BiFunction<WhisperServerConfiguration, Clock, ExternalServiceCr...
method externalService (line 82) | ExternalServiceType externalService() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/GroupSendTokenUtil.java
class GroupSendTokenUtil (line 22) | public class GroupSendTokenUtil {
method GroupSendTokenUtil (line 27) | public GroupSendTokenUtil(final ServerSecretParams serverSecretParams,...
method checkGroupSendToken (line 33) | public boolean checkGroupSendToken(final ByteString groupSendToken, fi...
method checkGroupSendToken (line 37) | public boolean checkGroupSendToken(final ByteString groupSendToken, fi...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/GrpcAllowListInterceptor.java
class GrpcAllowListInterceptor (line 17) | public class GrpcAllowListInterceptor implements ServerInterceptor {
method GrpcAllowListInterceptor (line 22) | public GrpcAllowListInterceptor(
method interceptCall (line 27) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/GrpcExceptions.java
class GrpcExceptions (line 18) | public class GrpcExceptions {
method GrpcExceptions (line 52) | private GrpcExceptions() {
method upgradeRequired (line 58) | public static StatusRuntimeException upgradeRequired() {
method fieldViolation (line 69) | public static StatusRuntimeException fieldViolation(final String field...
method invalidArguments (line 88) | public static StatusRuntimeException invalidArguments(@Nullable final ...
method constraintViolation (line 102) | public static StatusRuntimeException constraintViolation(@Nullable fin...
method badAuthentication (line 118) | public static StatusRuntimeException badAuthentication(@Nullable final...
method invalidCredentials (line 130) | public static StatusRuntimeException invalidCredentials(@Nullable fina...
method rateLimitExceeded (line 146) | public static StatusRuntimeException rateLimitExceeded(@Nullable final...
method unavailable (line 164) | public static StatusRuntimeException unavailable(@Nullable final Strin...
method messageOrDefault (line 175) | private static String messageOrDefault(@Nullable final String message,...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/IdentityTypeUtil.java
class IdentityTypeUtil (line 11) | public class IdentityTypeUtil {
method IdentityTypeUtil (line 13) | private IdentityTypeUtil() {
method fromGrpcIdentityType (line 16) | public static IdentityType fromGrpcIdentityType(final org.signal.chat....
method toGrpcIdentityType (line 24) | public static org.signal.chat.common.IdentityType toGrpcIdentityType(f...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/KeyTransparencyGrpcService.java
class KeyTransparencyGrpcService (line 28) | public class KeyTransparencyGrpcService extends
method KeyTransparencyGrpcService (line 35) | public KeyTransparencyGrpcService(final RateLimiters rateLimiters,
method search (line 41) | @Override
method monitor (line 47) | @Override
method distinguished (line 53) | @Override
method validateSearchRequest (line 63) | private SearchRequest validateSearchRequest(final SearchRequest reques...
method validateMonitorRequest (line 79) | private MonitorRequest validateMonitorRequest(final MonitorRequest req...
method validateConsistencyParameters (line 131) | private static void validateConsistencyParameters(final ConsistencyPar...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcService.java
class KeysAnonymousGrpcService (line 33) | public class KeysAnonymousGrpcService extends SimpleKeysAnonymousGrpc.Ke...
method KeysAnonymousGrpcService (line 39) | public KeysAnonymousGrpcService(
method getPreKeys (line 46) | @Override
method checkIdentityKeys (line 91) | @Override
method fingerprintMatches (line 109) | private static boolean fingerprintMatches(final IdentityKey identityKe...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/KeysGrpcHelper.java
class KeysGrpcHelper (line 25) | class KeysGrpcHelper {
method getPreKeys (line 38) | static Optional<AccountPreKeyBundles> getPreKeys(final Account targetA...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/KeysGrpcService.java
class KeysGrpcService (line 44) | public class KeysGrpcService extends SimpleKeysGrpc.KeysImplBase {
method KeysGrpcService (line 56) | public KeysGrpcService(final AccountsManager accountsManager,
method getPreKeyCount (line 65) | @Override
method getPreKeys (line 92) | @Override
method setOneTimeEcPreKeys (line 120) | @Override
method setOneTimeKemSignedPreKeys (line 133) | @Override
method storeOneTimePreKeys (line 146) | private <K, R> void storeOneTimePreKeys(final UUID authenticatedAccoun...
method setEcSignedPreKey (line 161) | @Override
method setKemLastResortPreKey (line 179) | @Override
method storeRepeatedUseKey (line 197) | private <K, R> void storeRepeatedUseKey(final UUID authenticatedAccoun...
method checkEcPreKey (line 211) | private static ECPreKey checkEcPreKey(final EcPreKey preKey) {
method checkEcSignedPreKey (line 219) | private static ECSignedPreKey checkEcSignedPreKey(final EcSignedPreKey...
method checkKemSignedPreKey (line 235) | private static KEMSignedPreKey checkKemSignedPreKey(final KemSignedPre...
method getAuthenticatedAccount (line 251) | private Account getAuthenticatedAccount(final UUID authenticatedAccoun...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcService.java
class MessagesAnonymousGrpcService (line 49) | public class MessagesAnonymousGrpcService extends SimpleMessagesAnonymou...
method MessagesAnonymousGrpcService (line 64) | public MessagesAnonymousGrpcService(final AccountsManager accountsMana...
method sendSingleRecipientMessage (line 81) | @Override
method sendStory (line 129) | @Override
method sendIndividualMessage (line 155) | private SendMessageResponse sendIndividualMessage(final Account destin...
method sendMultiRecipientMessage (line 235) | @Override
method sendMultiRecipientStory (line 254) | @Override
method sendMultiRecipientMessage (line 277) | private SendMultiRecipientMessageResponse sendMultiRecipientMessage(
method parseAndValidateMultiRecipientMessage (line 329) | private SealedSenderMultiRecipientMessage parseAndValidateMultiRecipie...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/MessagesGrpcHelper.java
class MessagesGrpcHelper (line 11) | public class MessagesGrpcHelper {
method buildMismatchedDevices (line 22) | public static MismatchedDevices buildMismatchedDevices(final ServiceId...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/MessagesGrpcService.java
class MessagesGrpcService (line 41) | public class MessagesGrpcService extends SimpleMessagesGrpc.MessagesImpl...
method MessagesGrpcService (line 53) | public MessagesGrpcService(final AccountsManager accountsManager,
method sendMessage (line 68) | @Override
method sendSyncMessage (line 103) | @Override
method sendMessage (line 121) | private SendMessageAuthenticatedSenderResponse sendMessage(final Accou...
method getEnvelopeType (line 198) | private static MessageProtos.Envelope.Type getEnvelopeType(final SendM...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/MetricServerInterceptor.java
class MetricServerInterceptor (line 38) | public class MetricServerInterceptor implements ServerInterceptor {
method MetricServerInterceptor (line 65) | public MetricServerInterceptor(final MeterRegistry meterRegistry, fina...
method interceptCall (line 70) | @Override
class MetricServerCall (line 99) | private class MetricServerCall<ReqT, RespT> extends ForwardingServerCa...
method MetricServerCall (line 105) | MetricServerCall(final ServerCall<ReqT, RespT> delegate, final Tags ...
method close (line 111) | @Override
method sendMessage (line 126) | @Override
method reason (line 138) | @Nullable
class MetricServerCallListener (line 171) | private class MetricServerCallListener<ReqT> extends ForwardingServerC...
method MetricServerCallListener (line 177) | MetricServerCallListener(final ServerCall.Listener<ReqT> delegate, f...
method onMessage (line 184) | @Override
method onComplete (line 190) | @Override
method onCancel (line 196) | @Override
method errorInfo (line 203) | private static Optional<ErrorInfo> errorInfo(final com.google.rpc.Stat...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/PaymentsGrpcService.java
class PaymentsGrpcService (line 23) | public class PaymentsGrpcService extends SimplePaymentsGrpc.PaymentsImpl...
method PaymentsGrpcService (line 28) | public PaymentsGrpcService(final CurrencyConversionManager currencyMan...
method getCurrencyConversions (line 32) | @Override
method transformBigDecimalsToStrings (line 54) | @Nonnull
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ProfileAnonymousGrpcService.java
class ProfileAnonymousGrpcService (line 29) | public class ProfileAnonymousGrpcService extends SimpleProfileAnonymousG...
method ProfileAnonymousGrpcService (line 36) | public ProfileAnonymousGrpcService(
method getUnversionedProfile (line 48) | @Override
method getVersionedProfile (line 77) | @Override
method getExpiringProfileKeyCredential (line 89) | @Override
method getTargetAccountAndValidateUnidentifiedAccess (line 108) | private Account getTargetAccountAndValidateUnidentifiedAccess(final Se...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ProfileGrpcHelper.java
class ProfileGrpcHelper (line 35) | public class ProfileGrpcHelper {
method getVersionedProfile (line 36) | static GetVersionedProfileResponse getVersionedProfile(final Account a...
method buildBadges (line 61) | @VisibleForTesting
method buildAccountCapabilities (line 78) | @VisibleForTesting
method buildBadgeSvgs (line 87) | private static List<BadgeSvg> buildBadgeSvgs(final List<org.whispersys...
method buildUnversionedProfileResponse (line 98) | static GetUnversionedProfileResponse buildUnversionedProfileResponse(
method getExpiringProfileKeyCredentialResponse (line 126) | static GetExpiringProfileKeyCredentialResponse getExpiringProfileKeyCr...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ProfileGrpcService.java
class ProfileGrpcService (line 53) | public class ProfileGrpcService extends SimpleProfileGrpc.ProfileImplBase {
method ProfileGrpcService (line 70) | public ProfileGrpcService(
method setProfile (line 94) | @Override
method getUnversionedProfile (line 158) | @Override
method getVersionedProfile (line 171) | @Override
method getExpiringProfileKeyCredential (line 186) | @Override
method validateRateLimitAndGetAccount (line 207) | private Account validateRateLimitAndGetAccount(final UUID requesterUuid,
method validateRequest (line 214) | private void validateRequest(final SetProfileRequest request) throws S...
method checkByteStringLength (line 229) | private static void checkByteStringLength(final ByteString byteString,...
method generateAvatarUploadForm (line 243) | private ProfileAvatarUploadAttributes generateAvatarUploadForm(final S...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/RateLimitUtil.java
class RateLimitUtil (line 11) | class RateLimitUtil {
method rateLimitByRemoteAddress (line 13) | static void rateLimitByRemoteAddress(final RateLimiter rateLimiter) th...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/RequestAttributes.java
method RequestAttributes (line 24) | public RequestAttributes(InetAddress remoteAddress,
method parseAcceptLanguage (line 30) | private static List<Locale.LanguageRange> parseAcceptLanguage(final Stri...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/RequestAttributesInterceptor.java
class RequestAttributesInterceptor (line 30) | public class RequestAttributesInterceptor implements ServerInterceptor {
method interceptCall (line 43) | @Override
method getMostRecentProxy (line 89) | public static Optional<String> getMostRecentProxy(@Nullable final Stri...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/RequestAttributesUtil.java
class RequestAttributesUtil (line 11) | public class RequestAttributesUtil {
method getAcceptableLanguages (line 22) | public static List<Locale.LanguageRange> getAcceptableLanguages() {
method getAcceptLanguageRaw (line 31) | public static @Nullable String getAcceptLanguageRaw() {
method getAvailableAcceptedLocales (line 42) | public static List<Locale> getAvailableAcceptedLocales() {
method getRemoteAddress (line 51) | public static InetAddress getRemoteAddress() {
method getUserAgent (line 60) | public static Optional<String> getUserAgent() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ServerInterceptorUtil.java
class ServerInterceptorUtil (line 13) | public class ServerInterceptorUtil {
method ServerInterceptorUtil (line 18) | private ServerInterceptorUtil() {
method closeWithStatus (line 32) | public static <ReqT, RespT> ServerCall.Listener<ReqT> closeWithStatus(...
method closeWithStatusException (line 50) | public static <ReqT, RespT> ServerCall.Listener<ReqT> closeWithStatusE...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ServiceIdentifierUtil.java
class ServiceIdentifierUtil (line 16) | public class ServiceIdentifierUtil {
method ServiceIdentifierUtil (line 18) | private ServiceIdentifierUtil() {
method fromGrpcServiceIdentifier (line 21) | public static ServiceIdentifier fromGrpcServiceIdentifier(final org.si...
method toGrpcServiceIdentifier (line 39) | public static org.signal.chat.common.ServiceIdentifier toGrpcServiceId...
method toCompactByteString (line 46) | public static ByteString toCompactByteString(final ServiceIdentifier s...
method fromByteString (line 50) | public static ServiceIdentifier fromByteString(final ByteString byteSt...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/ValidatingInterceptor.java
class ValidatingInterceptor (line 30) | public class ValidatingInterceptor implements ServerInterceptor {
method interceptCall (line 43) | @Override
method validateMessage (line 90) | private void validateMessage(final Object message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/net/ManagedGrpcServer.java
class ManagedGrpcServer (line 9) | public class ManagedGrpcServer implements Managed {
method ManagedGrpcServer (line 12) | public ManagedGrpcServer(Server server) {
method start (line 16) | @Override
method stop (line 21) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/net/ManagedNioEventLoopGroup.java
class ManagedNioEventLoopGroup (line 10) | public class ManagedNioEventLoopGroup extends NioEventLoopGroup implemen...
method stop (line 12) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/BaseFieldValidator.java
class BaseFieldValidator (line 15) | public abstract class BaseFieldValidator<T> implements FieldValidator {
type MissingOptionalAction (line 25) | protected enum MissingOptionalAction {
method BaseFieldValidator (line 32) | protected BaseFieldValidator(
method validate (line 43) | @Override
method resolveExtensionValue (line 98) | protected abstract T resolveExtensionValue(final Object extensionValue...
method validateRepeatedField (line 100) | protected void validateRepeatedField(
method validateIntegerNumber (line 107) | protected void validateIntegerNumber(
method validateStringValue (line 113) | protected void validateStringValue(
method validateBytesValue (line 119) | protected void validateBytesValue(
method validateEnumValue (line 125) | protected void validateEnumValue(
method validateMessageValue (line 131) | protected void validateMessageValue(
method requireFlagExtension (line 137) | protected static boolean requireFlagExtension(final Object extensionVa...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/E164FieldValidator.java
class E164FieldValidator (line 14) | public class E164FieldValidator extends BaseFieldValidator<Boolean> {
method E164FieldValidator (line 16) | public E164FieldValidator() {
method resolveExtensionValue (line 20) | @Override
method validateStringValue (line 25) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/EnumSpecifiedFieldValidator.java
class EnumSpecifiedFieldValidator (line 11) | public class EnumSpecifiedFieldValidator extends BaseFieldValidator<Bool...
method EnumSpecifiedFieldValidator (line 13) | public EnumSpecifiedFieldValidator() {
method resolveExtensionValue (line 17) | @Override
method validateEnumValue (line 22) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/ExactlySizeFieldValidator.java
class ExactlySizeFieldValidator (line 14) | public class ExactlySizeFieldValidator extends BaseFieldValidator<Set<In...
method ExactlySizeFieldValidator (line 16) | public ExactlySizeFieldValidator() {
method resolveExtensionValue (line 23) | @Override
method validateBytesValue (line 29) | @Override
method validateStringValue (line 39) | @Override
method validateRepeatedField (line 49) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/FieldValidationException.java
class FieldValidationException (line 7) | public class FieldValidationException extends Exception {
method FieldValidationException (line 8) | public FieldValidationException(String message) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/FieldValidator.java
type FieldValidator (line 11) | public interface FieldValidator {
method validate (line 13) | void validate(Object extensionValue, Descriptors.FieldDescriptor fd, M...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/NonEmptyFieldValidator.java
class NonEmptyFieldValidator (line 14) | public class NonEmptyFieldValidator extends BaseFieldValidator<Boolean> {
method NonEmptyFieldValidator (line 16) | public NonEmptyFieldValidator() {
method resolveExtensionValue (line 23) | @Override
method validateBytesValue (line 28) | @Override
method validateStringValue (line 38) | @Override
method validateRepeatedField (line 48) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/PresentFieldValidator.java
class PresentFieldValidator (line 12) | public class PresentFieldValidator extends BaseFieldValidator<Boolean> {
method PresentFieldValidator (line 14) | public PresentFieldValidator() {
method resolveExtensionValue (line 21) | @Override
method validateMessageValue (line 26) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/RangeFieldValidator.java
class RangeFieldValidator (line 12) | public class RangeFieldValidator extends BaseFieldValidator<Range> {
method RangeFieldValidator (line 21) | public RangeFieldValidator() {
method resolveExtensionValue (line 36) | @Override
method validateIntegerNumber (line 44) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/SizeFieldValidator.java
class SizeFieldValidator (line 14) | public class SizeFieldValidator extends BaseFieldValidator<Range> {
method SizeFieldValidator (line 16) | public SizeFieldValidator() {
method resolveExtensionValue (line 23) | @Override
method validateBytesValue (line 31) | @Override
method validateStringValue (line 39) | @Override
method validateRepeatedField (line 47) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/grpc/validators/ValidatorUtils.java
class ValidatorUtils (line 18) | public final class ValidatorUtils {
method ValidatorUtils (line 22) | private ValidatorUtils() {
method serviceAuthExtensionValue (line 26) | public static Optional<Auth> serviceAuthExtensionValue(final ServerSer...
method serviceExtensionValueByName (line 31) | private static Optional<Object> serviceExtensionValueByName(
FILE: service/src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java
class FaultTolerantHttpClient (line 37) | public class FaultTolerantHttpClient {
method newBuilder (line 48) | public static Builder newBuilder(final String name, final Executor exe...
method FaultTolerantHttpClient (line 52) | @VisibleForTesting
method httpClient (line 66) | private HttpClient httpClient() {
method send (line 70) | public <T> HttpResponse<T> send(final HttpRequest request, final HttpR...
method sendAsync (line 90) | public <T> CompletableFuture<HttpResponse<T>> sendAsync(final HttpRequ...
method requestWithTimeout (line 106) | private static HttpRequest requestWithTimeout(final HttpRequest reques...
class Builder (line 114) | public static class Builder {
method Builder (line 131) | private Builder(final String name, final Executor executor) {
method withVersion (line 136) | public Builder withVersion(HttpClient.Version version) {
method withRedirect (line 141) | public Builder withRedirect(HttpClient.Redirect redirect) {
method withConnectTimeout (line 146) | public Builder withConnectTimeout(Duration connectTimeout) {
method withRequestTimeout (line 151) | public Builder withRequestTimeout(Duration requestTimeout) {
method withRetry (line 156) | public Builder withRetry(@Nullable final String retryConfigurationNa...
method withCircuitBreaker (line 163) | public Builder withCircuitBreaker(@Nullable final String circuitBrea...
method withSecurityProtocol (line 168) | public Builder withSecurityProtocol(final String securityProtocol) {
method withTrustedServerCertificates (line 173) | public Builder withTrustedServerCertificates(final String... certifi...
method withRetryOnException (line 178) | public Builder withRetryOnException(final Predicate<Throwable> predi...
method withNumClients (line 198) | public Builder withNumClients(final int numClients) {
method build (line 203) | public FaultTolerantHttpClient build() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/identity/AciServiceIdentifier.java
method identityType (line 30) | @Override
method toServiceIdentifierString (line 35) | @Override
method toCompactByteArray (line 40) | @Override
method toFixedWidthByteArray (line 45) | @Override
method toLibsignal (line 56) | @Override
method valueOf (line 61) | public static AciServiceIdentifier valueOf(final String string) {
method fromBytes (line 65) | public static AciServiceIdentifier fromBytes(final byte[] bytes) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/identity/IdentityType.java
type IdentityType (line 8) | public enum IdentityType {
method IdentityType (line 15) | IdentityType(final byte bytePrefix, final String stringPrefix) {
method getBytePrefix (line 20) | byte getBytePrefix() {
method getStringPrefix (line 24) | String getStringPrefix() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/identity/PniServiceIdentifier.java
method identityType (line 30) | @Override
method toServiceIdentifierString (line 35) | @Override
method toCompactByteArray (line 40) | @Override
method toFixedWidthByteArray (line 45) | @Override
method toLibsignal (line 56) | @Override
method valueOf (line 61) | public static PniServiceIdentifier valueOf(final String string) {
method fromBytes (line 69) | public static PniServiceIdentifier fromBytes(final byte[] bytes) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/identity/ServiceIdentifier.java
type ServiceIdentifier (line 16) | @Schema(
method identityType (line 28) | IdentityType identityType();
method uuid (line 35) | UUID uuid();
method toServiceIdentifierString (line 43) | String toServiceIdentifierString();
method toCompactByteArray (line 50) | byte[] toCompactByteArray();
method toFixedWidthByteArray (line 57) | byte[] toFixedWidthByteArray();
method valueOf (line 65) | static ServiceIdentifier valueOf(final String string) {
method fromBytes (line 73) | static ServiceIdentifier fromBytes(final byte[] bytes) {
method fromLibsignal (line 81) | static ServiceIdentifier fromLibsignal(final ServiceId libsignalServic...
method toLibsignal (line 91) | ServiceId toLibsignal();
FILE: service/src/main/java/org/whispersystems/textsecuregcm/jetty/JettyHttpConfigurationCustomizer.java
class JettyHttpConfigurationCustomizer (line 23) | public class JettyHttpConfigurationCustomizer implements Container.Liste...
method beanAdded (line 27) | @Override
method beanRemoved (line 48) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/keytransparency/KeyTransparencyServiceClient.java
class KeyTransparencyServiceClient (line 39) | public class KeyTransparencyServiceClient implements Managed {
method KeyTransparencyServiceClient (line 53) | public KeyTransparencyServiceClient(
method configureClientCertificateMetrics (line 79) | private void configureClientCertificateMetrics(String clientCertificat...
method search (line 112) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method search (line 135) | public SearchResponse search(final SearchRequest request) {
method monitor (line 140) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method monitor (line 158) | public MonitorResponse monitor(final MonitorRequest request) {
method getDistinguishedKey (line 164) | @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
method distinguished (line 172) | public DistinguishedResponse distinguished(final DistinguishedRequest ...
method toDeadline (line 177) | private static Deadline toDeadline(final Duration timeout) {
method start (line 181) | @Override
method stop (line 189) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/BaseRateLimiters.java
class BaseRateLimiters (line 25) | public abstract class BaseRateLimiters<T extends RateLimiterDescriptor> {
method BaseRateLimiters (line 29) | protected BaseRateLimiters(
method forDescriptor (line 43) | public RateLimiter forDescriptor(final T handle) {
method defaultScript (line 47) | public static ClusterLuaScript defaultScript(final FaultTolerantRedisC...
method createForDescriptor (line 56) | private static RateLimiter createForDescriptor(
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/CardinalityEstimator.java
class CardinalityEstimator (line 23) | public class CardinalityEstimator {
method CardinalityEstimator (line 30) | public CardinalityEstimator(final FaultTolerantRedisClusterClient redi...
method add (line 41) | public void add(final String element) {
method addAsync (line 45) | public CompletionStage<Void> addAsync(final String element) {
method estimate (line 62) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/LeakyBucketRateLimiter.java
class LeakyBucketRateLimiter (line 27) | public class LeakyBucketRateLimiter implements RateLimiter {
method LeakyBucketRateLimiter (line 43) | public LeakyBucketRateLimiter(
method LeakyBucketRateLimiter (line 54) | public LeakyBucketRateLimiter(
method validate (line 70) | @Override
method validateAsync (line 92) | @Override
method hasAvailablePermits (line 119) | @Override
method hasAvailablePermitsAsync (line 134) | @Override
method clear (line 147) | @Override
method clearAsync (line 153) | @Override
method config (line 160) | @Override
method executeValidateScript (line 165) | private long executeValidateScript(final RateLimiterConfig config, fin...
method executeValidateScriptAsync (line 177) | private CompletionStage<Long> executeValidateScriptAsync(final RateLim...
method bucketName (line 189) | private static String bucketName(final String name, final String key) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/MessageDeliveryLoopMonitor.java
type MessageDeliveryLoopMonitor (line 5) | public interface MessageDeliveryLoopMonitor {
method recordDeliveryAttempt (line 19) | void recordDeliveryAttempt(UUID accountIdentifier, byte deviceId, UUID...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/NoopMessageDeliveryLoopMonitor.java
class NoopMessageDeliveryLoopMonitor (line 5) | public class NoopMessageDeliveryLoopMonitor implements MessageDeliveryLo...
method NoopMessageDeliveryLoopMonitor (line 7) | public NoopMessageDeliveryLoopMonitor() {
method recordDeliveryAttempt (line 10) | public void recordDeliveryAttempt(final UUID accountIdentifier, final ...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/PushChallengeManager.java
class PushChallengeManager (line 23) | public class PushChallengeManager {
method PushChallengeManager (line 40) | public PushChallengeManager(final PushNotificationManager pushNotifica...
method sendChallenge (line 47) | public void sendChallenge(final Account account) throws NotPushRegiste...
method answerChallenge (line 81) | public boolean answerChallenge(final Account account, final String cha...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimitByIpFilter.java
class RateLimitByIpFilter (line 30) | public class RateLimitByIpFilter implements ContainerRequestFilter {
method RateLimitByIpFilter (line 44) | public RateLimitByIpFilter(final RateLimiters rateLimiters) {
method filter (line 48) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeManager.java
class RateLimitChallengeManager (line 26) | public class RateLimitChallengeManager {
method RateLimitChallengeManager (line 41) | public RateLimitChallengeManager(
method answerPushChallenge (line 53) | public void answerPushChallenge(final Account account, final String ch...
method answerCaptchaChallenge (line 64) | public boolean answerCaptchaChallenge(final Account account, final Str...
method resetRateLimits (line 87) | private void resetRateLimits(final Account account, final ChallengeTyp...
method sendPushChallenge (line 100) | public void sendPushChallenge(final Account account) throws NotPushReg...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeOption.java
type RateLimitChallengeOption (line 8) | public enum RateLimitChallengeOption {
method RateLimitChallengeOption (line 14) | RateLimitChallengeOption(final String apiName) {
method getApiName (line 18) | public String getApiName() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimitChallengeOptionManager.java
class RateLimitChallengeOptionManager (line 12) | public class RateLimitChallengeOptionManager {
method RateLimitChallengeOptionManager (line 16) | public RateLimitChallengeOptionManager(final RateLimiters rateLimiters) {
method getChallengeOptions (line 20) | public List<RateLimitChallengeOption> getChallengeOptions(final Accoun...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiter.java
type RateLimiter (line 14) | public interface RateLimiter {
method validate (line 16) | void validate(String key, long amount) throws RateLimitExceededException;
method validateAsync (line 18) | CompletionStage<Void> validateAsync(String key, long amount);
method hasAvailablePermits (line 20) | boolean hasAvailablePermits(String key, long permits);
method hasAvailablePermitsAsync (line 22) | CompletionStage<Boolean> hasAvailablePermitsAsync(String key, long amo...
method clear (line 24) | void clear(String key);
method clearAsync (line 26) | CompletionStage<Void> clearAsync(String key);
method config (line 28) | RateLimiterConfig config();
method validate (line 30) | default void validate(final String key) throws RateLimitExceededExcept...
method validate (line 34) | default void validate(final UUID accountUuid) throws RateLimitExceeded...
method validate (line 38) | default void validate(final UUID accountUuid, final long permits) thro...
method validate (line 42) | default void validate(final UUID srcAccountUuid, final UUID dstAccount...
method validateAsync (line 46) | default CompletionStage<Void> validateAsync(final String key) {
method validateAsync (line 50) | default CompletionStage<Void> validateAsync(final UUID accountUuid) {
method validateAsync (line 54) | default CompletionStage<Void> validateAsync(final UUID srcAccountUuid,...
method validateReactive (line 58) | default Mono<Void> validateReactive(final String key) {
method validateReactive (line 62) | default Mono<Void> validateReactive(final UUID accountUuid) {
method hasAvailablePermits (line 66) | default boolean hasAvailablePermits(final UUID accountUuid, final long...
method hasAvailablePermitsAsync (line 70) | default CompletionStage<Boolean> hasAvailablePermitsAsync(final UUID a...
method clear (line 74) | default void clear(final UUID accountUuid) {
method clearAsync (line 78) | default CompletionStage<Void> clearAsync(final UUID accountUuid) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiterConfig.java
method leakRatePerMillis (line 14) | public double leakRatePerMillis() {
method isPositiveRegenerationRate (line 18) | @AssertTrue
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiterDescriptor.java
type RateLimiterDescriptor (line 11) | public interface RateLimiterDescriptor {
method id (line 16) | String id();
method defaultConfig (line 22) | RateLimiterConfig defaultConfig();
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RateLimiters.java
class RateLimiters (line 16) | public class RateLimiters extends BaseRateLimiters<RateLimiters.For> {
type For (line 18) | public enum For implements RateLimiterDescriptor {
method For (line 66) | For(final String id, final RateLimiterConfig defaultConfig) {
method id (line 71) | public String id() {
method defaultConfig (line 75) | public RateLimiterConfig defaultConfig() {
method create (line 80) | public static RateLimiters create(
method RateLimiters (line 88) | @VisibleForTesting
method getAllocateDeviceLimiter (line 98) | public RateLimiter getAllocateDeviceLimiter() {
method getVerifyDeviceLimiter (line 102) | public RateLimiter getVerifyDeviceLimiter() {
method getMessagesLimiter (line 106) | public RateLimiter getMessagesLimiter() {
method getPreKeysLimiter (line 110) | public RateLimiter getPreKeysLimiter() {
method getAttachmentLimiter (line 114) | public RateLimiter getAttachmentLimiter() {
method getPinLimiter (line 118) | public RateLimiter getPinLimiter() {
method getProfileLimiter (line 122) | public RateLimiter getProfileLimiter() {
method getStickerPackLimiter (line 126) | public RateLimiter getStickerPackLimiter() {
method getUsernameLookupLimiter (line 130) | public RateLimiter getUsernameLookupLimiter() {
method getUsernameLinkLookupLimiter (line 134) | public RateLimiter getUsernameLinkLookupLimiter() {
method getUsernameLinkOperationLimiter (line 138) | public RateLimiter getUsernameLinkOperationLimiter() {
method getUsernameSetLimiter (line 142) | public RateLimiter getUsernameSetLimiter() {
method getUsernameReserveLimiter (line 146) | public RateLimiter getUsernameReserveLimiter() {
method getCheckAccountExistenceLimiter (line 150) | public RateLimiter getCheckAccountExistenceLimiter() {
method getRegistrationLimiter (line 154) | public RateLimiter getRegistrationLimiter() {
method getRateLimitResetLimiter (line 158) | public RateLimiter getRateLimitResetLimiter() {
method getCaptchaChallengeAttemptLimiter (line 162) | public RateLimiter getCaptchaChallengeAttemptLimiter() {
method getCaptchaChallengeSuccessLimiter (line 166) | public RateLimiter getCaptchaChallengeSuccessLimiter() {
method getPushChallengeAttemptLimiter (line 170) | public RateLimiter getPushChallengeAttemptLimiter() {
method getPushChallengeSuccessLimiter (line 174) | public RateLimiter getPushChallengeSuccessLimiter() {
method getVerificationPushChallengeLimiter (line 178) | public RateLimiter getVerificationPushChallengeLimiter() {
method getVerificationCaptchaLimiter (line 182) | public RateLimiter getVerificationCaptchaLimiter() {
method getCreateCallLinkLimiter (line 186) | public RateLimiter getCreateCallLinkLimiter() {
method getCallEndpointLimiter (line 190) | public RateLimiter getCallEndpointLimiter() {
method getInboundMessageBytes (line 194) | public RateLimiter getInboundMessageBytes() {
method getStoriesLimiter (line 198) | public RateLimiter getStoriesLimiter() {
method getWaitForLinkedDeviceLimiter (line 202) | public RateLimiter getWaitForLinkedDeviceLimiter() {
method getUploadTransferArchiveLimiter (line 206) | public RateLimiter getUploadTransferArchiveLimiter() {
method getWaitForTransferArchiveLimiter (line 210) | public RateLimiter getWaitForTransferArchiveLimiter() {
method getKeyTransparencySearchLimiter (line 214) | public RateLimiter getKeyTransparencySearchLimiter() {
method getKeyTransparencyDistinguishedLimiter (line 218) | public RateLimiter getKeyTransparencyDistinguishedLimiter() {
method getKeyTransparencyMonitorLimiter (line 222) | public RateLimiter getKeyTransparencyMonitorLimiter() {
method getSubmitCallQualitySurveyLimiter (line 226) | public RateLimiter getSubmitCallQualitySurveyLimiter() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/limits/RedisMessageDeliveryLoopMonitor.java
class RedisMessageDeliveryLoopMonitor (line 16) | public class RedisMessageDeliveryLoopMonitor implements MessageDeliveryL...
method RedisMessageDeliveryLoopMonitor (line 25) | public RedisMessageDeliveryLoopMonitor(final FaultTolerantRedisCluster...
method recordDeliveryAttempt (line 47) | public void recordDeliveryAttempt(final UUID accountIdentifier,
method incrementDeliveryAttemptCount (line 62) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/BackupExceptionMapper.java
class BackupExceptionMapper (line 22) | public class BackupExceptionMapper implements ExceptionMapper<BackupExce...
method toResponse (line 24) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/CompletionExceptionMapper.java
class CompletionExceptionMapper (line 17) | @Provider
method toResponse (line 23) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/DeviceLimitExceededExceptionMapper.java
class DeviceLimitExceededExceptionMapper (line 15) | @Provider
method toResponse (line 17) | @Override
class DeviceLimitExceededDetails (line 25) | private static class DeviceLimitExceededDetails {
method DeviceLimitExceededDetails (line 31) | public DeviceLimitExceededDetails(int current, int max) {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/GrpcStatusRuntimeExceptionMapper.java
class GrpcStatusRuntimeExceptionMapper (line 15) | @Provider
method toResponse (line 18) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/IOExceptionMapper.java
class IOExceptionMapper (line 14) | @Provider
method toResponse (line 19) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/ImpossiblePhoneNumberExceptionMapper.java
class ImpossiblePhoneNumberExceptionMapper (line 16) | public class ImpossiblePhoneNumberExceptionMapper implements ExceptionMa...
method toResponse (line 21) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/InvalidWebsocketAddressExceptionMapper.java
class InvalidWebsocketAddressExceptionMapper (line 13) | @Provider
method toResponse (line 15) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/JsonMappingExceptionMapper.java
class JsonMappingExceptionMapper (line 7) | public class JsonMappingExceptionMapper implements ExceptionMapper<JsonM...
method toResponse (line 8) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/NonNormalizedPhoneNumberExceptionMapper.java
class NonNormalizedPhoneNumberExceptionMapper (line 18) | public class NonNormalizedPhoneNumberExceptionMapper implements Exceptio...
method toResponse (line 23) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/NonNormalizedPhoneNumberResponse.java
class NonNormalizedPhoneNumberResponse (line 11) | public class NonNormalizedPhoneNumberResponse {
method NonNormalizedPhoneNumberResponse (line 16) | @JsonCreator
method getOriginalNumber (line 24) | public String getOriginalNumber() {
method getNormalizedNumber (line 28) | public String getNormalizedNumber() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/ObsoletePhoneNumberFormatExceptionMapper.java
class ObsoletePhoneNumberFormatExceptionMapper (line 9) | public class ObsoletePhoneNumberFormatExceptionMapper implements Excepti...
method toResponse (line 13) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/RateLimitExceededExceptionMapper.java
class RateLimitExceededExceptionMapper (line 14) | @Provider
method toResponse (line 26) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/RegistrationServiceSenderExceptionMapper.java
class RegistrationServiceSenderExceptionMapper (line 13) | public class RegistrationServiceSenderExceptionMapper implements Excepti...
method toResponse (line 17) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/ServerRejectedExceptionMapper.java
class ServerRejectedExceptionMapper (line 12) | public class ServerRejectedExceptionMapper implements ExceptionMapper<Se...
method toResponse (line 14) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/mappers/SubscriptionExceptionMapper.java
class SubscriptionExceptionMapper (line 26) | public class SubscriptionExceptionMapper implements ExceptionMapper<Subs...
method toResponse (line 32) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/metrics/ApplicationShutdownMonitor.java
class ApplicationShutdownMonitor (line 23) | public class ApplicationShutdownMonitor extends AbstractLifeCycle {
method ApplicationShutdownMonitor (line 28) | public ApplicationShutdownMonitor(final MeterRegistry meterRegistry) {
method register (line 36) | public void register() {
method doStop (line 49) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/metrics/BackupMetrics.java
class BackupMetrics (line 21) | public class BackupMetrics {
method BackupMetrics (line 30) | public BackupMetrics() {
method BackupMetrics (line 34) | @VisibleForTesting
method updateCopyCounter (line 39) | public void updateCopyCounter(final CopyResult copyResult, final Tag p...
method updateGetCredentialCounter (line 46) | public void updateGetCredentialCounter(final Tag platformTag, BackupCr...
method updateMessageBackupSizeDistribution (line 55) | public void updateMessageBackupSizeDistribution(
FILE: service/src/main/java/org/whispersystems/textsecuregcm/metrics/CallQualityInvalidArgumentsException.java
class CallQualityInvalidArgumentsException (line 10) | public class CallQualityInvalidArgumentsException extends Exception {
method CallQualityInvalidArgumentsException (line 13) | public CallQualityInvalidArgumentsException(final String message) {
method CallQualityInvalidArgumentsException (line 17) | public CallQualityInvalidArgumentsException(final String message, fina...
method getField (line 22) | public Optional<String> getField() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/metrics/CallQualitySurveyManager.java
class CallQualitySurveyManager (line 28) | public class CallQualitySurveyManager {
method CallQualitySurveyManager (line 39) | public CallQualitySurveyManager(final Supplier<AsnInfoProvider> asnInf...
method submitCallQualitySurvey (line 50) | public void submitCallQualitySurvey(final SubmitCallQualitySurveyReque...
method validateRequest (line 154) | @VisibleForTesting
FILE: service/src/main/java/org/whispersystems/textsecuregcm/metrics/DevicePlatformUtil.java
class DevicePlatformUtil (line 13) | public class DevicePlatformUtil {
method DevicePlatformUtil (line 15) | private DevicePlatformUtil() {
method getDevicePlatform (line 25) | public static Optional<ClientPlatform> getDevicePlatform(final Device ...
FILE: service/src/main/java/org/whispersystems/textsecuregcm/metrics/GarbageCollectionGauges.java
class GarbageCollectionGauges (line 16) | public class GarbageCollectionGauges {
method GarbageCollectionGauges (line 18) | private GarbageCollectionGauges() {
method registerMetrics (line 21) | public static void registerMetrics() {
FILE: service/src/main/java/org/whispersystems/textsecuregcm/metrics/LogstashTcpSocketAppenderFactory.java
class LogstashTcpSocketAppenderFactory (line 33) | @JsonTypeName("logstashtcpsocket")
method getDestination (line 49) | @JsonProperty
method getKeepAlive (line 55) | @JsonProperty
method getApiKey (line 60) | @JsonProperty
method getEnvironment (line 65) | @JsonProperty
method build (line 71) | @Override
FILE: service/src/main/java/org/whispersystems/textsecuregcm/metrics/MessageMetrics.java
class MessageMetrics (line
Condensed preview — 1245 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,934K chars).
[
{
"path": ".editorconfig",
"chars": 72186,
"preview": "[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_newline = true\nmax_line_length = "
},
{
"path": ".github/FUNDING.yml",
"chars": 116,
"preview": "# Copyright 2021 Signal Messenger, LLC\n# SPDX-License-Identifier: AGPL-3.0-only\n\ncustom: https://signal.org/donate/\n"
},
{
"path": ".github/dependabot.yml",
"chars": 534,
"preview": "version: 2\nupdates:\n- package-ecosystem: github-actions\n directory: /\n schedule:\n interval: monthly\n groups:\n m"
},
{
"path": ".github/stale.yml",
"chars": 0,
"preview": ""
},
{
"path": ".github/workflows/documentation.yml",
"chars": 1032,
"preview": "name: Update Documentation\n\non:\n push:\n branches:\n - main\n\njobs:\n build:\n permissions:\n contents: writ"
},
{
"path": ".github/workflows/integration-tests.yml",
"chars": 1398,
"preview": "name: Integration Tests\n\non:\n schedule:\n - cron: '30 19 * * MON-FRI'\n workflow_dispatch:\n\nenv:\n # This may seem a "
},
{
"path": ".github/workflows/test.yml",
"chars": 2916,
"preview": "name: Service CI\n\non:\n pull_request:\n push:\n branches-ignore:\n - gh-pages\n\njobs:\n build:\n runs-on: ubuntu-"
},
{
"path": ".gitignore",
"chars": 775,
"preview": "target\nlocal.properties\n.idea\n*.iml\nrun.sh\n*~\nlocal.yml\nconfig/production.yml\nconfig/federated.yml\nconfig/staging.yml\nco"
},
{
"path": ".gitmodules",
"chars": 306,
"preview": "# Note that the implementation of the spam filter is private; internal\n# developers will need to override this URL with:"
},
{
"path": ".java-version",
"chars": 11,
"preview": "temurin-24\n"
},
{
"path": ".mvn/extensions.xml",
"chars": 399,
"preview": "<extensions xmlns=\"http://maven.apache.org/EXTENSIONS/1.0.0\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n x"
},
{
"path": ".mvn/jgitver.config.xml",
"chars": 597,
"preview": "<configuration xmlns=\"http://jgitver.github.io/maven/configuration/1.1.0\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-"
},
{
"path": ".mvn/wrapper/maven-wrapper.properties",
"chars": 1190,
"preview": "# Licensed to the Apache Software Foundation (ASF) under one\n# or more contributor license agreements. See the NOTICE f"
},
{
"path": "LICENSE",
"chars": 34530,
"preview": " GNU AFFERO GENERAL PUBLIC LICENSE\n Version 3, 19 November 2007\n\n Copyright (C)"
},
{
"path": "README.md",
"chars": 1933,
"preview": "Signal-Server\n=================\n\nDocumentation\n-------------\n\nLooking for protocol documentation? Check out the website!"
},
{
"path": "TESTING.md",
"chars": 888,
"preview": "# Testing\n\n## Automated tests\n\nThe full suite of automated tests can be run using Maven from the project root:\n\n```sh\n./"
},
{
"path": "api-doc/pom.xml",
"chars": 1782,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www"
},
{
"path": "api-doc/src/main/java/org/signal/openapi/OpenApiExtension.java",
"chars": 3804,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.openapi;\n\ni"
},
{
"path": "api-doc/src/main/java/org/signal/openapi/OpenApiReader.java",
"chars": 2847,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.openapi;\n\ni"
},
{
"path": "api-doc/src/main/resources/META-INF/services/io.swagger.v3.jaxrs2.ext.OpenAPIExtension",
"chars": 36,
"preview": "org.signal.openapi.OpenApiExtension\n"
},
{
"path": "api-doc/src/main/resources/openapi/openapi-configuration.yaml",
"chars": 779,
"preview": "resourcePackages:\n - org.whispersystems.textsecuregcm\nprettyPrint: true\ncacheTTL: 0\nreaderClass: org.signal.openapi.Ope"
},
{
"path": "integration-tests/.gitignore",
"chars": 36,
"preview": ".libs\nsrc/main/resources/config.yml\n"
},
{
"path": "integration-tests/pom.xml",
"chars": 2163,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www"
},
{
"path": "integration-tests/src/main/java/org/signal/integration/Codecs.java",
"chars": 2943,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/main/java/org/signal/integration/IntegrationTools.java",
"chars": 3428,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/main/java/org/signal/integration/Operations.java",
"chars": 13212,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/main/java/org/signal/integration/TestDevice.java",
"chars": 1949,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/main/java/org/signal/integration/TestUser.java",
"chars": 6228,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/main/java/org/signal/integration/config/Config.java",
"chars": 711,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/main/java/org/signal/integration/config/DynamoDbTables.java",
"chars": 389,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/test/java/org/signal/integration/AccountTest.java",
"chars": 5839,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/test/java/org/signal/integration/MessagingTest.java",
"chars": 1866,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "integration-tests/src/test/java/org/signal/integration/RegistrationTest.java",
"chars": 2916,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.integration"
},
{
"path": "mvnw",
"chars": 11292,
"preview": "#!/bin/sh\n# ----------------------------------------------------------------------------\n# Licensed to the Apache Softwa"
},
{
"path": "mvnw.cmd",
"chars": 7796,
"preview": "@REM ----------------------------------------------------------------------------\r\n@REM Licensed to the Apache Software "
},
{
"path": "pom.xml",
"chars": 20481,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www.w3.org"
},
{
"path": "service/assembly.xml",
"chars": 926,
"preview": "<assembly xmlns=\"http://maven.apache.org/ASSEMBLY/2.1.0\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
},
{
"path": "service/config/sample-secrets-bundle.yml",
"chars": 11515,
"preview": "stripe.apiKey: unset\nstripe.idempotencyKeyGenerator: abcdefg12345678= # base64 for creating request idempotency hash\n\nbr"
},
{
"path": "service/config/sample.yml",
"chars": 19694,
"preview": "# Example, relatively minimal, configuration that passes validation (see `io.dropwizard.cli.CheckCommand`)\n#\n# `unset` v"
},
{
"path": "service/pom.xml",
"chars": 27897,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n xmlns:xsi=\"http://www.w3.org"
},
{
"path": "service/src/main/graphql/braintree/ChargePayPalOneTimePayment.graphql",
"chars": 246,
"preview": "# https://graphql.braintreepayments.com/reference/#Mutation--chargePaymentMethod\nmutation ChargePayPalOneTimePayment($in"
},
{
"path": "service/src/main/graphql/braintree/CreatePayPalBillingAgreement.graphql",
"chars": 181,
"preview": "mutation CreatePayPalBillingAgreement($input: CreatePayPalBillingAgreementInput!) {\n createPayPalBillingAgreement(input"
},
{
"path": "service/src/main/graphql/braintree/CreatePayPalOneTimePayment.graphql",
"chars": 251,
"preview": "# https://graphql.braintreepayments.com/reference/#Mutation--createPayPalOneTimePayment\nmutation CreatePayPalOneTimePaym"
},
{
"path": "service/src/main/graphql/braintree/TokenizePayPalBillingAgreement.graphql",
"chars": 179,
"preview": "mutation TokenizePayPalBillingAgreement($input: TokenizePayPalBillingAgreementInput!) {\n tokenizePayPalBillingAgreement"
},
{
"path": "service/src/main/graphql/braintree/TokenizePayPalOneTimePayment.graphql",
"chars": 263,
"preview": "# https://graphql.braintreepayments.com/reference/#Mutation--tokenizePayPalOneTimePayment\nmutation TokenizePayPalOneTime"
},
{
"path": "service/src/main/graphql/braintree/VaultPaymentMethod.graphql",
"chars": 143,
"preview": "mutation VaultPaymentMethod($input: VaultPaymentMethodInput!) {\n vaultPaymentMethod(input: $input) {\n paymentMethod "
},
{
"path": "service/src/main/graphql/braintree/schema.json",
"chars": 1197683,
"preview": "{\n \"data\": {\n \"__schema\": {\n \"queryType\": {\n \"name\": \"Query\"\n },\n \"mutationType\": {\n \"n"
},
{
"path": "service/src/main/java/org/signal/i18n/HeaderControlledResourceBundleLookup.java",
"chars": 2336,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.i18n;\n\nimpo"
},
{
"path": "service/src/main/java/org/signal/i18n/ResourceBundleFactory.java",
"chars": 313,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.signal.i18n;\n\nimpo"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java",
"chars": 16724,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java",
"chars": 79430,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/asn/AsnInfo.java",
"chars": 429,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/asn/AsnInfoProvider.java",
"chars": 587,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/asn/AsnInfoProviderImpl.java",
"chars": 6297,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/asn/AsnRange.java",
"chars": 782,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/attachments/AttachmentGenerator.java",
"chars": 343,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/attachments/AttachmentUtil.java",
"chars": 544,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/attachments/GcsAttachmentGenerator.java",
"chars": 2181,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/attachments/TusAttachmentGenerator.java",
"chars": 1767,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/attachments/TusConfiguration.java",
"chars": 460,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/AccountAuthenticator.java",
"chars": 6435,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/Anonymous.java",
"chars": 660,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/AuthenticatedBackupUser.java",
"chars": 567,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/AuthenticatedDevice.java",
"chars": 536,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/BasicAuthorizationHeader.java",
"chars": 2965,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/CertificateGenerator.java",
"chars": 2468,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/ChangesLinkedDevices.java",
"chars": 643,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/ChangesPhoneNumber.java",
"chars": 620,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/CloudflareTurnCredentialsManager.java",
"chars": 5337,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/CombinedUnidentifiedSenderAccessKeys.java",
"chars": 1075,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestListener.java",
"chars": 578,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java",
"chars": 9272,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/ExternalServiceCredentials.java",
"chars": 224,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/ExternalServiceCredentialsGenerator.java",
"chars": 10726,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/ExternalServiceCredentialsSelector.java",
"chars": 4320,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/GroupSendTokenHeader.java",
"chars": 860,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/IdlePrimaryDeviceAuthenticatedWebSocketUpgradeFilter.java",
"chars": 2327,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/InvalidAuthorizationHeaderException.java",
"chars": 514,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/OptionalAccess.java",
"chars": 3749,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/PhoneVerificationTokenManager.java",
"chars": 6057,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/RedemptionRange.java",
"chars": 3861,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManager.java",
"chars": 8760,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/SaltedTokenHash.java",
"chars": 2298,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/StoredRegistrationLock.java",
"chars": 2295,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/TurnToken.java",
"chars": 503,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessChecksum.java",
"chars": 897,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/UnidentifiedAccessUtil.java",
"chars": 3407,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/grpc/AuthenticatedDevice.java",
"chars": 244,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/grpc/AuthenticationUtil.java",
"chars": 2393,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/grpc/ProhibitAuthenticationInterceptor.java",
"chars": 1385,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/auth/grpc/RequireAuthenticationInterceptor.java",
"chars": 2933,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupAuthManager.java",
"chars": 16374,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupBadReceiptException.java",
"chars": 284,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupException.java",
"chars": 305,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupFailedZkAuthenticationException.java",
"chars": 308,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupInvalidArgumentException.java",
"chars": 299,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupLevelUtil.java",
"chars": 505,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupManager.java",
"chars": 41520,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupMissingIdCommitmentException.java",
"chars": 280,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupNotFoundException.java",
"chars": 286,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupPermissionException.java",
"chars": 283,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupPublicKeyConflictException.java",
"chars": 213,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupUploadDescriptor.java",
"chars": 299,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupWrongCredentialTypeException.java",
"chars": 301,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/BackupsDb.java",
"chars": 39832,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/Cdn3BackupCredentialGenerator.java",
"chars": 3046,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/Cdn3RemoteStorageManager.java",
"chars": 13173,
"preview": "package org.whispersystems.textsecuregcm.backup;\n\nimport com.fasterxml.jackson.core.JsonProcessingException;\nimport io.m"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/CopyParameters.java",
"chars": 936,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/CopyResult.java",
"chars": 1461,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/ExpiredBackup.java",
"chars": 975,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/InvalidLengthException.java",
"chars": 202,
"preview": "package org.whispersystems.textsecuregcm.backup;\n\nimport java.io.IOException;\n\npublic class InvalidLengthException exten"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/MediaEncryptionParameters.java",
"chars": 761,
"preview": "package org.whispersystems.textsecuregcm.backup;\n\nimport javax.crypto.spec.SecretKeySpec;\n\npublic record MediaEncryption"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/RemoteStorageManager.java",
"chars": 3492,
"preview": "package org.whispersystems.textsecuregcm.backup;\n\nimport java.util.List;\nimport java.util.Optional;\nimport java.util.con"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/SecureValueRecoveryBCredentialsGeneratorFactory.java",
"chars": 1183,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/SourceObjectNotFoundException.java",
"chars": 377,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/StoredBackupAttributes.java",
"chars": 996,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/backup/UsageInfo.java",
"chars": 199,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/badges/BadgeTranslator.java",
"chars": 351,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/badges/ConfiguredProfileBadgeConverter.java",
"chars": 5030,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/badges/LevelTranslator.java",
"chars": 296,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/badges/ProfileBadgeConverter.java",
"chars": 588,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/captcha/Action.java",
"chars": 1044,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/captcha/AssessmentResult.java",
"chars": 4110,
"preview": "/*\n * Copyright 2022 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/captcha/CaptchaChecker.java",
"chars": 4674,
"preview": "/*\n * Copyright 2022 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/captcha/CaptchaClient.java",
"chars": 1940,
"preview": "/*\n * Copyright 2022 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/captcha/RegistrationCaptchaManager.java",
"chars": 849,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/captcha/ShortCodeExpander.java",
"chars": 1734,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/AccountsTableConfiguration.java",
"chars": 1695,
"preview": "package org.whispersystems.textsecuregcm.configuration;\n\nimport com.fasterxml.jackson.annotation.JsonCreator;\nimport com"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/ApnConfiguration.java",
"chars": 615,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/AppleAppStoreConfiguration.java",
"chars": 2038,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/AppleDeviceCheckConfiguration.java",
"chars": 588,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/AwsCredentialsProviderFactory.java",
"chars": 534,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/BadgeConfiguration.java",
"chars": 1607,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/BadgesConfiguration.java",
"chars": 2074,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/BraintreeConfiguration.java",
"chars": 2061,
"preview": "/*\n * Copyright 2022 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/CallQualitySurveyConfiguration.java",
"chars": 334,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/Cdn3StorageManagerConfiguration.java",
"chars": 1949,
"preview": "package org.whispersystems.textsecuregcm.configuration;\n\nimport jakarta.validation.Valid;\nimport jakarta.validation.cons"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/CdnConfiguration.java",
"chars": 598,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/CircuitBreakerConfiguration.java",
"chars": 3416,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/ClientReleaseConfiguration.java",
"chars": 302,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/CloudflareTurnConfiguration.java",
"chars": 3146,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/DefaultAwsCredentialsFactory.java",
"chars": 584,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/DefaultPubSubPublisherFactory.java",
"chars": 2328,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/DeviceCheckConfiguration.java",
"chars": 526,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryV2ClientConfiguration.java",
"chars": 494,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/DirectoryV2Configuration.java",
"chars": 711,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/DynamoDbClientConfiguration.java",
"chars": 2865,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/DynamoDbClientFactory.java",
"chars": 914,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/DynamoDbTables.java",
"chars": 7855,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/ExternalRequestFilterConfiguration.java",
"chars": 630,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/FaultTolerantRedisClientFactory.java",
"chars": 622,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/FaultTolerantRedisClusterFactory.java",
"chars": 659,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/FcmConfiguration.java",
"chars": 341,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/GcpAttachmentsConfiguration.java",
"chars": 1025,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/GenericZkConfig.java",
"chars": 339,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/GooglePlayBillingConfiguration.java",
"chars": 904,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/GrpcConfiguration.java",
"chars": 410,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/HlrLookupConfiguration.java",
"chars": 546,
"preview": "/*\n * Copyright 2026 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/IdlePrimaryDeviceReminderConfiguration.java",
"chars": 258,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/IssuedReceiptsTableConfiguration.java",
"chars": 1519,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/KeyTransparencyServiceConfiguration.java",
"chars": 772,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/LinkDeviceSecretConfiguration.java",
"chars": 291,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/MaxDeviceConfiguration.java",
"chars": 549,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/MessageByteLimitCardinalityEstimatorConfiguration.java",
"chars": 315,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/MessageCacheConfiguration.java",
"chars": 653,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/MonitoredS3ObjectConfiguration.java",
"chars": 1721,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/OneTimeDonationConfiguration.java",
"chars": 1256,
"preview": "/*\n * Copyright 2022 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/OneTimeDonationCurrencyConfiguration.java",
"chars": 914,
"preview": "/*\n * Copyright 2022 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/OpenTelemetryConfiguration.java",
"chars": 1336,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/PagedSingleUseKEMPreKeyStoreConfiguration.java",
"chars": 406,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/PaymentsServiceClientsConfiguration.java",
"chars": 1296,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/PaymentsServiceClientsFactory.java",
"chars": 722,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/PaymentsServiceConfiguration.java",
"chars": 672,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/PubSubPublisherFactory.java",
"chars": 554,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/RedisClusterConfiguration.java",
"chars": 1537,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/RedisConfiguration.java",
"chars": 1405,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/RegistrationServiceClientFactory.java",
"chars": 796,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/RegistrationServiceConfiguration.java",
"chars": 1856,
"preview": "package org.whispersystems.textsecuregcm.configuration;\n\nimport com.fasterxml.jackson.annotation.JsonTypeName;\nimport io"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/RemoteConfigConfiguration.java",
"chars": 305,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/ReportMessageConfiguration.java",
"chars": 622,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/RetryConfiguration.java",
"chars": 1033,
"preview": "/*\n * Copyright 2013-2020 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/S3ObjectMonitorFactory.java",
"chars": 736,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/SecureStorageServiceConfiguration.java",
"chars": 894,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/SecureValueRecoveryConfiguration.java",
"chars": 874,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/ShortCodeExpanderConfiguration.java",
"chars": 212,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/SpamFilterConfiguration.java",
"chars": 624,
"preview": "/*\n * Copyright 2013-2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/StaticAwsCredentialsFactory.java",
"chars": 1111,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/StripeConfiguration.java",
"chars": 934,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/SubscriptionConfiguration.java",
"chars": 5094,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/SubscriptionLevelConfiguration.java",
"chars": 1326,
"preview": "/*\n * Copyright 2021-2022 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystem"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/SubscriptionPriceConfiguration.java",
"chars": 709,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/TlsKeyStoreConfiguration.java",
"chars": 346,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/TurnConfiguration.java",
"chars": 223,
"preview": "/*\n * Copyright 2023 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/TurnUriConfiguration.java",
"chars": 866,
"preview": "package org.whispersystems.textsecuregcm.configuration;\n\nimport com.fasterxml.jackson.annotation.JsonProperty;\nimport ja"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/URLSerializationConverter.java",
"chars": 391,
"preview": "/*\n * Copyright 2021 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/UnidentifiedDeliveryConfiguration.java",
"chars": 923,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/VirtualThreadConfiguration.java",
"chars": 606,
"preview": "/*\n * Copyright 2024 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\npackage org.whispersystems.text"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/ZkConfig.java",
"chars": 434,
"preview": "/*\n * Copyright 2013 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicBackupConfiguration.java",
"chars": 1589,
"preview": "/*\n * Copyright 2025 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
},
{
"path": "service/src/main/java/org/whispersystems/textsecuregcm/configuration/dynamic/DynamicCaptchaConfiguration.java",
"chars": 1713,
"preview": "/*\n * Copyright 2022 Signal Messenger, LLC\n * SPDX-License-Identifier: AGPL-3.0-only\n */\n\npackage org.whispersystems.tex"
}
]
// ... and 1045 more files (download for full content)
About this extraction
This page contains the full source code of the signalapp/Signal-Server GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1245 files (7.2 MB), approximately 2.0M tokens, and a symbol index with 7296 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.