Skip to content
This repository has been archived by the owner on Feb 12, 2022. It is now read-only.

Commit

Permalink
Support for setting profile name and avatar
Browse files Browse the repository at this point in the history
// FREEBIE
  • Loading branch information
moxie0 committed Aug 13, 2017
1 parent 1484d74 commit db27669
Show file tree
Hide file tree
Showing 28 changed files with 895 additions and 217 deletions.
36 changes: 25 additions & 11 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ buildscript {
}

dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'com.android.tools.build:gradle:2.3.0'
}
}

Expand All @@ -30,8 +30,8 @@ dependencies {
}

android {
compileSdkVersion 21
buildToolsVersion '21.1.2'
compileSdkVersion 25
buildToolsVersion '25.0.2'

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
Expand All @@ -56,23 +56,36 @@ tasks.whenTaskAdded { task ->
}
}

signing {
required { has("release") && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
def isReleaseBuild() {
return version.contains("SNAPSHOT") == false
}

def getReleaseRepositoryUrl() {
return hasProperty('sonatypeRepo') ? sonatypeRepo
: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}

def getRepositoryUsername() {
return hasProperty('whisperSonatypeUsername') ? whisperSonatypeUsername : ""
}

def getRepositoryPassword() {
return hasProperty('whisperSonatypePassword') ? whisperSonatypePassword : ""
}


def sonatypeRepo = sonatypeRepo != null ? sonatypeRepo : ""
def whisperSonatypeUsername = whisperSonatypeUsername != null ? whisperSonatypeUsername : ""
def whisperSonatypePassword = whisperSonatypePassword != null ? whisperSonatypePassword : ""
signing {
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}

uploadArchives {
configuration = configurations.archives
repositories.mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

repository(url: sonatypeRepo) {
authentication(userName: whisperSonatypeUsername, password: whisperSonatypePassword)
repository(url: getReleaseRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}

pom.project {
Expand Down Expand Up @@ -113,3 +126,4 @@ task installArchives(type: Upload) {
}
}
}

4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Mon May 18 15:02:07 PDT 2015
#Tue Aug 08 18:07:10 PDT 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
27 changes: 18 additions & 9 deletions java/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ dependencies {
compile 'com.fasterxml.jackson.core:jackson-databind:2.5.0'

compile "org.whispersystems:signal-protocol-java:${signal_version}"
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'org.apache.httpcomponents:httpclient:4.4'
compile 'com.madgag.spongycastle:prov:1.51.0.0'

testCompile 'junit:junit:3.8.2'
testCompile 'org.assertj:assertj-core:1.7.1'
Expand All @@ -31,23 +32,31 @@ tasks.whenTaskAdded { task ->
}
}

signing {
required { has("release") && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives

def isReleaseBuild() {
return version.contains("SNAPSHOT") == false
}

def getReleaseRepositoryUrl() {
return hasProperty('sonatypeRepo') ? sonatypeRepo
: "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
}

def sonatypeRepo = sonatypeRepo != null ? sonatypeRepo : ""
def whisperSonatypeUsername = whisperSonatypeUsername != null ? whisperSonatypeUsername : ""
def whisperSonatypePassword = whisperSonatypePassword != null ? whisperSonatypePassword : ""
def getRepositoryUsername() {
return hasProperty('whisperSonatypeUsername') ? whisperSonatypeUsername : ""
}

def getRepositoryPassword() {
return hasProperty('whisperSonatypePassword') ? whisperSonatypePassword : ""
}

uploadArchives {
configuration = configurations.archives
repositories.mavenDeployer {
beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

repository(url: sonatypeRepo) {
authentication(userName: whisperSonatypeUsername, password: whisperSonatypePassword)
repository(url: getReleaseRepositoryUrl()) {
authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
}

pom.project {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,25 @@
import org.whispersystems.libsignal.state.PreKeyRecord;
import org.whispersystems.libsignal.state.SignedPreKeyRecord;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.crypto.ProfileCipher;
import org.whispersystems.signalservice.api.crypto.ProfileCipherInputStream;
import org.whispersystems.signalservice.api.messages.calls.TurnServerInfo;
import org.whispersystems.signalservice.api.messages.multidevice.DeviceInfo;
import org.whispersystems.signalservice.api.push.ContactTokenDetails;
import org.whispersystems.signalservice.api.push.SignedPreKeyEntity;
import org.whispersystems.signalservice.api.push.TrustStore;
import org.whispersystems.signalservice.api.util.StreamDetails;
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration;
import org.whispersystems.signalservice.internal.crypto.ProvisioningCipher;
import org.whispersystems.signalservice.internal.push.ProfileAvatarData;
import org.whispersystems.signalservice.internal.push.PushServiceSocket;
import org.whispersystems.signalservice.internal.push.SignalServiceUrl;
import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl;
import org.whispersystems.signalservice.internal.push.http.ProfileCipherOutputStreamFactory;
import org.whispersystems.signalservice.internal.util.Base64;
import org.whispersystems.signalservice.internal.util.StaticCredentialsProvider;
import org.whispersystems.signalservice.internal.util.Util;

import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collection;
Expand All @@ -54,16 +60,16 @@ public class SignalServiceAccountManager {
/**
* Construct a SignalServiceAccountManager.
*
* @param urls The URL for the Signal Service.
* @param configuration The URL for the Signal Service.
* @param user A Signal Service phone number.
* @param password A Signal Service password.
* @param userAgent A string which identifies the client software.
*/
public SignalServiceAccountManager(SignalServiceUrl[] urls,
public SignalServiceAccountManager(SignalServiceConfiguration configuration,
String user, String password,
String userAgent)
{
this.pushServiceSocket = new PushServiceSocket(urls, new StaticCredentialsProvider(user, password, null), userAgent);
this.pushServiceSocket = new PushServiceSocket(configuration, new StaticCredentialsProvider(user, password, null), userAgent);
this.user = user;
this.userAgent = userAgent;
}
Expand Down Expand Up @@ -260,6 +266,32 @@ public TurnServerInfo getTurnServerInfo() throws IOException {
return this.pushServiceSocket.getTurnServerInfo();
}

public void setProfileName(byte[] key, String name)
throws IOException
{
String ciphertextName = null;

if (name != null) {
ciphertextName = Base64.encodeBytesWithoutPadding(new ProfileCipher(key).encrypt(name.getBytes("UTF-8"), ProfileCipher.NAME_PADDED_LENGTH));
}

this.pushServiceSocket.setProfileName(ciphertextName);

}

public void setProfileAvatar(byte[] key, StreamDetails avatar)
throws IOException
{
ProfileAvatarData profileAvatarData = null;

if (avatar != null) {
profileAvatarData = new ProfileAvatarData(avatar.getStream(), avatar.getLength(), avatar.getContentType(),
new ProfileCipherOutputStreamFactory(key));
}

this.pushServiceSocket.setProfileAvatar(profileAvatarData);
}

public void setSoTimeoutMillis(long soTimeoutMillis) {
this.pushServiceSocket.setSoTimeoutMillis(soTimeoutMillis);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import org.whispersystems.libsignal.util.Pair;
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.SignalServiceProfile;
import org.whispersystems.signalservice.api.profiles.SignalServiceProfile;
import org.whispersystems.signalservice.api.util.CredentialsProvider;
import org.whispersystems.signalservice.internal.push.OutgoingPushMessageList;
import org.whispersystems.signalservice.internal.push.SendMessageResponse;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.SignalServiceProfile;
import org.whispersystems.signalservice.api.profiles.SignalServiceProfile;
import org.whispersystems.signalservice.api.util.CredentialsProvider;
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration;
import org.whispersystems.signalservice.internal.push.PushServiceSocket;
import org.whispersystems.signalservice.internal.push.SignalServiceEnvelopeEntity;
import org.whispersystems.signalservice.internal.push.SignalServiceUrl;
import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl;
import org.whispersystems.signalservice.internal.util.StaticCredentialsProvider;
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection;

Expand All @@ -34,10 +35,10 @@
*/
public class SignalServiceMessageReceiver {

private final PushServiceSocket socket;
private final SignalServiceUrl[] urls;
private final CredentialsProvider credentialsProvider;
private final String userAgent;
private final PushServiceSocket socket;
private final SignalServiceConfiguration urls;
private final CredentialsProvider credentialsProvider;
private final String userAgent;

/**
* Construct a SignalServiceMessageReceiver.
Expand All @@ -47,7 +48,7 @@ public class SignalServiceMessageReceiver {
* @param password The Signal Service user password.
* @param signalingKey The 52 byte signaling key assigned to this user at registration.
*/
public SignalServiceMessageReceiver(SignalServiceUrl[] urls,
public SignalServiceMessageReceiver(SignalServiceConfiguration urls,
String user, String password,
String signalingKey, String userAgent)
{
Expand All @@ -60,7 +61,7 @@ public SignalServiceMessageReceiver(SignalServiceUrl[] urls,
* @param urls The URL of the Signal Service.
* @param credentials The Signal Service user's credentials.
*/
public SignalServiceMessageReceiver(SignalServiceUrl[] urls, CredentialsProvider credentials, String userAgent)
public SignalServiceMessageReceiver(SignalServiceConfiguration urls, CredentialsProvider credentials, String userAgent)
{
this.urls = urls;
this.credentialsProvider = credentials;
Expand Down Expand Up @@ -118,7 +119,7 @@ public InputStream retrieveAttachment(SignalServiceAttachmentPointer pointer, Fi
* @return A SignalServiceMessagePipe for receiving Signal Service messages.
*/
public SignalServiceMessagePipe createMessagePipe() {
WebSocketConnection webSocket = new WebSocketConnection(urls[0].getUrl(), urls[0].getTrustStore(), credentialsProvider, userAgent);
WebSocketConnection webSocket = new WebSocketConnection(urls.getSignalServiceUrls()[0].getUrl(), urls.getSignalServiceUrls()[0].getTrustManagers(), credentialsProvider, userAgent);
return new SignalServiceMessagePipe(webSocket, credentialsProvider);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException;
import org.whispersystems.signalservice.api.push.exceptions.PushNetworkException;
import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration;
import org.whispersystems.signalservice.internal.push.MismatchedDevices;
import org.whispersystems.signalservice.internal.push.OutgoingPushMessage;
import org.whispersystems.signalservice.internal.push.OutgoingPushMessageList;
Expand All @@ -50,10 +51,10 @@
import org.whispersystems.signalservice.internal.push.SignalServiceProtos.NullMessage;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos.SyncMessage;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos.Verified;
import org.whispersystems.signalservice.internal.push.SignalServiceUrl;
import org.whispersystems.signalservice.internal.push.StaleDevices;
import org.whispersystems.signalservice.internal.push.exceptions.MismatchedDevicesException;
import org.whispersystems.signalservice.internal.push.exceptions.StaleDevicesException;
import org.whispersystems.signalservice.internal.push.http.AttachmentCipherOutputStreamFactory;
import org.whispersystems.signalservice.internal.util.Base64;
import org.whispersystems.signalservice.internal.util.StaticCredentialsProvider;
import org.whispersystems.signalservice.internal.util.Util;
Expand Down Expand Up @@ -88,7 +89,7 @@ public class SignalServiceMessageSender {
* @param eventListener An optional event listener, which fires whenever sessions are
* setup or torn down for a recipient.
*/
public SignalServiceMessageSender(SignalServiceUrl[] urls,
public SignalServiceMessageSender(SignalServiceConfiguration urls,
String user, String password,
SignalProtocolStore store,
String userAgent,
Expand Down Expand Up @@ -512,8 +513,8 @@ private AttachmentPointer createAttachmentPointer(SignalServiceAttachmentStream
PushAttachmentData attachmentData = new PushAttachmentData(attachment.getContentType(),
attachment.getInputStream(),
attachment.getLength(),
attachment.getListener(),
attachmentKey);
new AttachmentCipherOutputStreamFactory(attachmentKey),
attachment.getListener());

Pair<Long, byte[]> attachmentIdAndDigest = socket.sendAttachment(attachmentData);

Expand Down
Loading

0 comments on commit db27669

Please sign in to comment.