From 43ec78594c0c6b753e4578bc14184e471f3262a5 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 31 Dec 2015 13:17:41 +0100 Subject: [PATCH 01/16] Implement fetch messages Uses a patched libtextsecure-java https://github.com/AsamK/libtextsecure-java/commits/master --- build.gradle | 2 +- src/main/java/org/asamk/textsecure/Manager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 0bd5b3c6..1b1c9e35 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ repositories { } dependencies { - compile 'org.whispersystems:textsecure-java:1.8.3' + compile 'org.whispersystems:textsecure-java:1.8.3fetchMessages' compile 'com.madgag.spongycastle:prov:1.54.0.0' compile 'commons-io:commons-io:2.4' compile 'net.sourceforge.argparse4j:argparse4j:0.7.0' diff --git a/src/main/java/org/asamk/textsecure/Manager.java b/src/main/java/org/asamk/textsecure/Manager.java index dfae49de..2a2b5e4f 100644 --- a/src/main/java/org/asamk/textsecure/Manager.java +++ b/src/main/java/org/asamk/textsecure/Manager.java @@ -239,7 +239,7 @@ class Manager implements TextSecure { public void verifyAccount(String verificationCode) throws IOException { verificationCode = verificationCode.replace("-", ""); signalingKey = Util.getSecret(52); - accountManager.verifyAccountWithCode(verificationCode, signalingKey, axolotlStore.getLocalRegistrationId(), false); + accountManager.verifyAccountWithCode(verificationCode, signalingKey, axolotlStore.getLocalRegistrationId(), false, true); //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID))); registered = true; -- 2.51.0 From 13aafc6712943d553d0ef5971940cf1914ad1383 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 31 Dec 2015 15:17:34 +0100 Subject: [PATCH 02/16] Add systemd service file with instance variable --- data/textsecure-cli@.service | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 data/textsecure-cli@.service diff --git a/data/textsecure-cli@.service b/data/textsecure-cli@.service new file mode 100644 index 00000000..b8221bc2 --- /dev/null +++ b/data/textsecure-cli@.service @@ -0,0 +1,15 @@ +[Unit] +Description=Send secure messages to TextSecure/Signal clients +Requires=dbus.socket +After=dbus.socket +Wants=network.target +After=network.target + +[Service] +Type=dbus +ExecStart=%dir%/bin/textsecure-cli -u %I daemon --system +User=textsecure-cli +BusName=org.asamk.TextSecure + +[Install] +WantedBy=multi-user.target -- 2.51.0 From df0ae3b8dd7d77ddaeb829b10d804e1cbcadbf8b Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 31 Dec 2015 15:21:23 +0100 Subject: [PATCH 03/16] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 184d7595..b3c93982 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ It’s advisable to run textsecure-cli as a separate unix user, the following st These steps, executed as root, should work on all distributions using systemd. ```bash -cp data/org.asamk.TextSecure.config /etc/dbus-1/system.d/ +cp data/org.asamk.TextSecure.conf /etc/dbus-1/system.d/ cp data/org.asamk.TextSecure.service /usr/share/dbus-1/system-services/ cp data/textsecure.service /etc/systemd/system/ sed -i -e "s|%dir%||" -e "s|%number%||" /etc/systemd/system/textsecure.service -- 2.51.0 From 506bc5df13b35b3f9f94fc9faa099ac8a72ad5b8 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 31 Dec 2015 15:21:44 +0100 Subject: [PATCH 04/16] Service: use user textsecure-cli --- README.md | 2 +- data/org.asamk.TextSecure.conf | 2 +- data/textsecure.service | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b3c93982..634fa30f 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ For dbus support you need jni/unix-java.so installed on your system (Debian: lib ### System bus To run on the system bus you need to take some additional steps. -It’s advisable to run textsecure-cli as a separate unix user, the following steps assume you created a user named *textsecure*. +It’s advisable to run textsecure-cli as a separate unix user, the following steps assume you created a user named *textsecure-cli*. These steps, executed as root, should work on all distributions using systemd. ```bash diff --git a/data/org.asamk.TextSecure.conf b/data/org.asamk.TextSecure.conf index 5267a799..79883753 100644 --- a/data/org.asamk.TextSecure.conf +++ b/data/org.asamk.TextSecure.conf @@ -3,7 +3,7 @@ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> - + diff --git a/data/textsecure.service b/data/textsecure.service index 2ed892ce..abdb0767 100644 --- a/data/textsecure.service +++ b/data/textsecure.service @@ -4,7 +4,7 @@ Description=Send secure messages to TextSecure/Signal clients [Service] Type=dbus ExecStart=%dir%/bin/textsecure-cli -u %number% daemon --system -User=textsecure +User=textsecure-cli BusName=org.asamk.TextSecure [Install] -- 2.51.0 From 0130585355b82eb10f8d8e836182d9877aa21ab8 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 31 Dec 2015 15:39:40 +0100 Subject: [PATCH 05/16] Make config path configurable --- data/textsecure-cli@.service | 2 +- data/textsecure.service | 2 +- src/main/java/org/asamk/textsecure/Main.java | 10 +++++++++- src/main/java/org/asamk/textsecure/Manager.java | 12 ++++++++---- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/data/textsecure-cli@.service b/data/textsecure-cli@.service index b8221bc2..002d347b 100644 --- a/data/textsecure-cli@.service +++ b/data/textsecure-cli@.service @@ -7,7 +7,7 @@ After=network.target [Service] Type=dbus -ExecStart=%dir%/bin/textsecure-cli -u %I daemon --system +ExecStart=%dir%/bin/textsecure-cli -u %I --config /var/lib/textsecure-cli daemon --system User=textsecure-cli BusName=org.asamk.TextSecure diff --git a/data/textsecure.service b/data/textsecure.service index abdb0767..b40debcb 100644 --- a/data/textsecure.service +++ b/data/textsecure.service @@ -3,7 +3,7 @@ Description=Send secure messages to TextSecure/Signal clients [Service] Type=dbus -ExecStart=%dir%/bin/textsecure-cli -u %number% daemon --system +ExecStart=%dir%/bin/textsecure-cli -u %number% --config /var/lib/textsecure-cli daemon --system User=textsecure-cli BusName=org.asamk.TextSecure diff --git a/src/main/java/org/asamk/textsecure/Main.java b/src/main/java/org/asamk/textsecure/Main.java index 8a252b99..4227e65e 100644 --- a/src/main/java/org/asamk/textsecure/Main.java +++ b/src/main/java/org/asamk/textsecure/Main.java @@ -20,6 +20,7 @@ import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.*; import org.apache.commons.io.IOUtils; +import org.apache.http.util.TextUtils; import org.asamk.TextSecure; import org.freedesktop.dbus.DBusConnection; import org.freedesktop.dbus.exceptions.DBusException; @@ -79,7 +80,12 @@ public class Main { return; } } else { - m = new Manager(username); + String settingsPath = ns.getString("config"); + if (TextUtils.isEmpty(settingsPath)) { + settingsPath = System.getProperty("user.home") + "/.config/textsecure"; + } + + m = new Manager(username, settingsPath); ts = m; if (m.userExists()) { try { @@ -355,6 +361,8 @@ public class Main { parser.addArgument("-v", "--version") .help("Show package version.") .action(Arguments.version()); + parser.addArgument("--config") + .help("Set the path, where to store the config (Default: $HOME/.config/textsecure-cli)."); MutuallyExclusiveGroup mut = parser.addMutuallyExclusiveGroup(); mut.addArgument("-u", "--username") diff --git a/src/main/java/org/asamk/textsecure/Manager.java b/src/main/java/org/asamk/textsecure/Manager.java index 2a2b5e4f..e5a77dcd 100644 --- a/src/main/java/org/asamk/textsecure/Manager.java +++ b/src/main/java/org/asamk/textsecure/Manager.java @@ -59,9 +59,9 @@ class Manager implements TextSecure { public final static String PROJECT_VERSION = Manager.class.getPackage().getImplementationVersion(); private final static String USER_AGENT = PROJECT_NAME + " " + PROJECT_VERSION; - private final static String settingsPath = System.getProperty("user.home") + "/.config/textsecure"; - private final static String dataPath = settingsPath + "/data"; - private final static String attachmentsPath = settingsPath + "/attachments"; + private final String settingsPath; + private final String dataPath; + private final String attachmentsPath; private final ObjectMapper jsonProcessot = new ObjectMapper(); private String username; @@ -76,8 +76,12 @@ class Manager implements TextSecure { private TextSecureAccountManager accountManager; private JsonGroupStore groupStore; - public Manager(String username) { + public Manager(String username, String settingsPath) { this.username = username; + this.settingsPath = settingsPath; + this.dataPath = this.settingsPath + "/data"; + this.attachmentsPath = this.settingsPath + "/attachments"; + jsonProcessot.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); // disable autodetect jsonProcessot.enable(SerializationFeature.INDENT_OUTPUT); // for pretty print, you can disable it. jsonProcessot.enable(SerializationFeature.WRITE_NULL_MAP_VALUES); -- 2.51.0 From ea2b0f9d52c52545eaf61a14dafdee1409e3a480 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 31 Dec 2015 16:16:39 +0100 Subject: [PATCH 06/16] Bump version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1b1c9e35..45bddee6 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ targetCompatibility = JavaVersion.VERSION_1_7 mainClassName = 'org.asamk.textsecure.Main' -version = '0.2.0' +version = '0.2.1' repositories { maven { -- 2.51.0 From de4a1d193324174cedd0549cc219d340bc11a900 Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 4 Jan 2016 12:11:23 +0100 Subject: [PATCH 07/16] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 634fa30f..1f4597d5 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # textsecure-cli -textsecure-cli is a commandline interface for [libtextsecure-java](https://github.com/WhisperSystems/libtextsecure-java). It supports registering, verifying, sending and receiving messages. However receiving messages currently only works with a patched libtextsecure-java, because libtextsecure-java [does not yet support registering for the websocket support](https://github.com/WhisperSystems/libtextsecure-java/pull/5). For registering you need a phone number where you can receive SMS or incoming calls. -It is primarily intended to be used on servers to notify admins of important events. +textsecure-cli is a commandline interface for [libtextsecure-java](https://github.com/WhisperSystems/libtextsecure-java). It supports registering, verifying, sending and receiving messages. To be able to receiving messages textsecure-cli uses a [patched libtextsecure-java](https://github.com/AsamK/libtextsecure-java), because libtextsecure-java [does not yet support registering for the websocket support](https://github.com/WhisperSystems/libtextsecure-java/pull/5). For registering you need a phone number where you can receive SMS or incoming calls. +It is primarily intended to be used on servers to notify admins of important events. For this use-case, it has a dbus interface, that can be used to send messages from any programming language that has dbus bindings. ## Usage -- 2.51.0 From 11e5dfbcf5cac40cf9eeed447e7a1229f63ef392 Mon Sep 17 00:00:00 2001 From: AsamK Date: Wed, 10 Feb 2016 12:47:31 +0100 Subject: [PATCH 08/16] Update gradle --- gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 53638 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew.bat | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 13372aef5e24af05341d49695ee84e5f9b594659..5ccda13e9cb94678ba179b32452cf3d60dc36353 100644 GIT binary patch delta 2494 zcmZo!%-pt^nJ>VbnT3mifrEoV%EQBBBA+TJh)&=0Bi~`7O@ye_r=pKVj0^}>{2)~; z6j;FY8FdK#T^~$O)?$1BW^CqTDq;e&CbzIW12Z<~u`Y%PZ5HJaVuOfj^WA`ou?y<6 zLd2}Z`k`WHB|_ODVrmMZ!Vp%yF*j6QpM@wlL~Ob9H!cWkq2C>-$&I0GP*b|YLpV4< zu8mfxlbifJ-b2FMH^^W^fWd|>Mg|*<%mNC^cmoZL3``zRc2CgcWcKjzm~_j`@ciV; z1m$|$e#iX73Oudv|4d!UahYur^YnXazI$_Sl`=hE7Q(2caIx;+q^+~_-*28j|Lrt` zpQnXnMJE?2JuCYlsB|^$an2G3)g>=l-?0VgCuz4?9=i~?_vNq2G(2KW!H*yxS(d z;p@gHIogsZAIjUvTK{51#3RU`lPeOnSwM`<%M;s~1VJpL_|*Po3=9k}7#J8dCSNR3 znVg)m9im1q^&b<2rI7Ig%HqkM#0b`BFP`!LI6DJFyD$TTEm)t(DVfdhb1t$&v>Yjs zV}`Jvm0L0Mfvi%hIvF*Im4RUt7~H^?9Y3SG`DafE)K!7~%Y`7C|1A6f75lK{K9qHN`BoN)Y|k1d zX0YqG9oSGjgNcD*6&u9$T9c*Di*3HYei2kl>!ui}Yo2a)fNIv ze79w0U^vCez+eq_SN~bo$vhWDH_zMS&ddSwbk3Z>DU;vscR@{r2Em9#=y^bq1(XFR z=N&Lc4g}bel4oQqmSPFfd$YU|>*&+r+@IrBRk~ za^q3a$?L*7CZ9Pdq5yK%(R;1eM3@*D3RoBzTu>ACJqj;`4$`slOvAs zfE{y&H_mM$69dCfHgvsme3KiG%1oYhSRP`)-osK%zXZSrygRH35tBY5#iT0+7K;_* zfg5_R=yjJUI|D-=9|MCLih~YFfE9m`5T3l|2oJ=NJx8RNBo)BoZ;wbq#JG-1F%=nu z#jKC2fqm(5ZM({4E(Qi=2?hoY6hj*)HykyG=-Yi%ifNWJSl^qY%3vSfJSSMOfQ^A+ z3m?JM9 z!NB0n&%mIFqPQ*`tax2G-(-&Ckbnji!T}5n41O3%7J4ndTb=!r?98tf3iYM#kEk3kHalM{1(IU@tZGK~0p zH@We&JH#<(PD?SpZkjx6jnZVUGm!FfvcefDro&y6?{?XMLJw>)N@0uQxamEUH}-gd zd;u}=&lxEu*Z#>Hdz2(dp@Xkuq#VA##Vz+i-;@54^8KHXh{lMPPsfEA0@s UWuiQa!n>1wE*h~V8~_Od0DI^1ga7~l delta 2495 zcmZo$%-ph=nJ>VbnT3mifrEoVYtvNsiF~S@Ao}{$8A0|FZ6ZXNzJ4lVWI!kq11Vam zzyhYvszc}>`e1spHsb>@V>3Tf5fhj-xs~M^n6WvZbumO}vlxdE8$?Wp?*>$iLr|X; zB4#bt4;4En5y}n`Q&$KThOiopxuNR%EkwB?Vk?}#aq)rNbMu^F#R4`4hAn)P`&pzW ze>lQ6+4mU7<|}@y*n~jxSqfPbwlFdVqmn%$YisTVPHWSZ=ivZfyvX!9toP9T$`r4tK6KHdTw%6f^xlS z|K7aA20Sh0`@94lr_>u~oD5rV;?kmQNAE3*4@~0mH2d{q>+F`>wNE~tNG#pFcU|3s zCC)rNhZ*!P=^>_D3%Yl*d|IQMud&RfEKTq-i(WljRO}~RG22UXB;RehXukYS(gh7G#rh>p zGuF5NJly)VTzq|<>IR`tS5{p<(m2_8!;*^h;4jLIlPc@jvY&macQD+-FW&NY;}fTu zTZJ^@AH1}y|6~xBYrCY?)g%}u)X-zh$R+#*ugl%(kf4LAu{lA4Dm;^!Ya=)1NW)c$v z!yHxy2II*K*K2LoT)G14w5!XvvOtvgtzm*XW6JvXP}%lPF;FX?Z+3vH)826&D)w(@ zFjQUWo=MCcAgeO()iO+ezuyHlr^*t{>pd$RxrH$*&+Clcf(zS?_~NrWYlq1-L>f$PX=Iqpcqmu_q~`gXh~iZY3=Fp!7#NhmvJhfRV;Re2!((ETyADZ#6|$_X zx*Nm9z!1p7z@Q6J117gLCa_N4cu;imyQ6HA?;lbCE0%c_d;2IW1H&&a1_ooWG6=Dy zk(~pq*pfqGa?}wXu;Mekac-bQ`I8OZWLZA2Vt+oV$?FgEfQx|1`wvSo{S*L;e>kiO z5tBV4#iSz!7V|qI0TIhOBE_^{Vshg#rOE#!*e0(#0@c6oh!m5A!eql^GLyd@5rU}Y zIV#0eXbjeGdsGeVD35E~RW5TeFepnfFlay=4<@%XHdufa`tz|*o_|ydV!+;`QcN?Q z!Q$_ZDuV+bQO=-jh;HLK$H3hEwd5BQwM%zdOSNHt2;i?JC&+VMonU6V3^6v zz@P?E2PU^PidBQ%8BonLdG|4h;yF1n=a(}wFf0StQDAjoVoT$j2C&JXP*{6f781PY zPD?SpY??f0jnZVEGeTfLbUT{n)G#tIa5FP7Sb?=dh%Jo=yC&c7vO&a6*BL3MsXbsr zPn Date: Tue, 16 Feb 2016 13:46:01 +0100 Subject: [PATCH 09/16] Set initial java heap size to 2MB in service files Make it more usable in memory restricted environments --- data/textsecure-cli@.service | 1 + data/textsecure.service | 1 + 2 files changed, 2 insertions(+) diff --git a/data/textsecure-cli@.service b/data/textsecure-cli@.service index 002d347b..3e39571e 100644 --- a/data/textsecure-cli@.service +++ b/data/textsecure-cli@.service @@ -7,6 +7,7 @@ After=network.target [Service] Type=dbus +Environment=TEXTSECURE_CLI_OPTS="-Xms2m" ExecStart=%dir%/bin/textsecure-cli -u %I --config /var/lib/textsecure-cli daemon --system User=textsecure-cli BusName=org.asamk.TextSecure diff --git a/data/textsecure.service b/data/textsecure.service index b40debcb..8b302d84 100644 --- a/data/textsecure.service +++ b/data/textsecure.service @@ -3,6 +3,7 @@ Description=Send secure messages to TextSecure/Signal clients [Service] Type=dbus +Environment=TEXTSECURE_CLI_OPTS="-Xms2m" ExecStart=%dir%/bin/textsecure-cli -u %number% --config /var/lib/textsecure-cli daemon --system User=textsecure-cli BusName=org.asamk.TextSecure -- 2.51.0 From 78252a13df63baf83a8bb17b88bae03db708a3d0 Mon Sep 17 00:00:00 2001 From: AsamK Date: Mon, 21 Mar 2016 16:01:10 +0100 Subject: [PATCH 10/16] Update gradle --- gradle/wrapper/gradle-wrapper.jar | Bin 53638 -> 53639 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 5ccda13e9cb94678ba179b32452cf3d60dc36353..2c6137b87896c8f70315ae454e00a969ef5f6019 100644 GIT binary patch delta 1762 zcmZo$%-p`1nK!_jnT3mifrEp=z$b4auNsGePoBs2V-Xq?t)qlL7JV#YWI!lU^~syK zLXjCnozVbO-wi<2WG%*rAbK+&Q!x{WF}a21If&kz$GQY8uvwHtm<=qV&36+b!Y*jQ z3Kp>vn*b3xD-p&H7Ex0O69zNtjd>ty`Ygn_!6M6@zjJ{Z3;pgw3~UT#hiLB(59Q!c z^~v+dTfMw?@{4$Pfe*eqK?Wv)1{<~*nQb#N37Kr4V8kimljkvYmY(E=$yEu;^``xM z^9~#Ew3P4j5^S6#V=1|%L^~iQ^TO5({BJcjs5npRwX1up_OML8(&mz0;-~4VQCe0{ zT@uO*cqe8V7hYr9>2%WC#X?B&m31eM;Q3s?)ywX{%VuH_yt~GJUed^0nl@1r0I! zyMG!ld0H;KeqTzAkQfx{1BmS-~Q|8-76)|7g0(4i>r4brB-6q-Qk~A1IJpmu?YH z7h+&IrZw51T4C~s61L6F{pCVn)qfX$gxLCV$pZ-E%JOY2V5#0U%n-{aum1p%YTFbG zG5XnNM~E7&9Ty-Xe|LsJ)P(Gr%*+9@bwgiq=;ZhNolzoxlhMYI$xa8fm<@dLCg&e8 zfv57xs}ER#lGEfD2lTa9emIZOiwxJ2d1AM%m>rqhkU{G@%n)@h3UE0xLFn`a{P%tfW3}SA|v1Bm+)G;4KT9!NR ziIi*$j@yC)YVwBT(u}#2&m5Nn^WGkpW}1^Y+2EYyPmatG zoBZw!57?X+%DkW485tP7nHU%h5ymiVX=KcvoY*fjdBaI%utIzBjQ_{k85r7y85nF) z6i&|pn=E=t6YN;WQ_@U3OTa=6ryzQtBwba1$i%>q$IifDkD~W>Iar}Yh5Y1wry(v< zsyZ1piIst2CNBen8j51cYOsp}s(B{wJ_b=dCnx6oaz+M*Wy}l=7AT6}H-JqB`FHJU zS+L8_o|a~M(=>U`8l}lRXTV8#vf>$OrXyXG?|0e21H1E#G}DY8u;vqIjKCWIo{?s9 z>z|z1uQ9pvJS0j2&q_0WTnJV*;jBD3gxoKty_v+sz%YlEfx#HXEl-z#6@uKNxs*pc zz?+dtgc(v`gW|G6?NLYq3j>1`Hv@w;ipCR@_0M^MoltX5nyGQk5ArP7&CVCap1opbV5s3nPe!*kgUz^p zUPB(_#>ouUGiw+b82&IZFj%6vQEsx_1rM+tnHQv)KJEl-)7vEkicqld$qUj<9(%yT m6V9?t=DVl}HW8G^-53}cTo@P_vn*b3xD-p&H7Ex0O69zNtjd>ty`Ygn_!6M6@zjJ{Z3;pgw3~UT#hiLB(59Q$C z_wewDR;ZJk{3706pupQV$Y4W&!G!qJvHCGIk!rg9xn@FR8qKD_ixhH+4=7`&!7Kxn!(T0Lb9Th zi?c`rl~0(%@D4 zuIn7%uJr9O(VHgrEEoL|v1We9bE8cG_b1PdeXVO=yfs+0Z2RiJOM;yJ*mgX7{;V$G?9sc zp_z5^{PntjFsp3DeVxgmo#CY0qkiMXgJ>h^GrNFdWmGY*?)@`9crd=9d0)A+YLy3qLXmf?VT%G40JH zCI*H%tPBjslN0-uC+jw{Z`NA60^+Ev%eS$BHT11vhB#r$`VSDP_D!)63!iUxgs9Qp zaRDOoZ)XTZP3WG<%p4$Va^?h1nfzhDGg<;M2%hYGK#N(*!((#60TXymn7rnI6)4F~ zetAG2OiLd$1JfY~?ZEWZgMMK8*};4;9dXDPOs_Z;0j8M`$ARgT!w~-d!_i>A>=7?8 zopmG-Oz%754W@aHLe!-n4F>b~9t{Q4qQ@ZSrXEWM^G_f1L8N#21V zGHhvN$ewJNAv4)BTYPflX^3Kb@r?h+*%=txg&7!ZQ4~+h0b3+~N&{@FOt#p@vrG&O zx7ipN%uy8XD4A@Sp*i_qi2&RQPm->xKV)KH$YW<rSj`>+tK*I<#5PJlNflL#}UPzU)D zB~zhjda`6P<5E*?bPW}1k3tey7#O6u85pclG#sC7aLx%rk9dtM0~DC#U8Jd%tI4Cx@BpqO8|37klB&PanTnR#BC>E>pz z$8Mfi2S?as2J4xi0R6+nz+j1@S9Y@e1rM;ctP9diA9jMZ8SD}S#Wh&?)CFlK_dO8d lMXZzgFDimf1QiBu3=9k|3=9nNC??*W?0?aSE#Ux25CF7VLm~hG diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 49a5dd8d..a17aed60 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Feb 10 12:41:27 CET 2016 +#Mon Mar 21 16:00:33 CET 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.11-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.12-bin.zip -- 2.51.0 From b06fafbf627b1c03259828507c17a83d1b722c5c Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 25 Mar 2016 16:50:51 +0100 Subject: [PATCH 11/16] Update to signal-service-java 2.1.1 --- build.gradle | 2 +- src/main/java/org/asamk/TextSecure.java | 2 +- .../asamk/textsecure/JsonAxolotlStore.java | 26 ++-- .../textsecure/JsonIdentityKeyStore.java | 8 +- .../org/asamk/textsecure/JsonPreKeyStore.java | 6 +- .../asamk/textsecure/JsonSessionStore.java | 28 ++-- .../textsecure/JsonSignedPreKeyStore.java | 6 +- src/main/java/org/asamk/textsecure/Main.java | 48 +++---- .../java/org/asamk/textsecure/Manager.java | 124 +++++++++--------- .../asamk/textsecure/WhisperTrustStore.java | 2 +- 10 files changed, 126 insertions(+), 126 deletions(-) diff --git a/build.gradle b/build.gradle index 45bddee6..7d9d9655 100644 --- a/build.gradle +++ b/build.gradle @@ -16,7 +16,7 @@ repositories { } dependencies { - compile 'org.whispersystems:textsecure-java:1.8.3fetchMessages' + compile 'org.whispersystems:signal-service-java:2.1.1fetchMessages' compile 'com.madgag.spongycastle:prov:1.54.0.0' compile 'commons-io:commons-io:2.4' compile 'net.sourceforge.argparse4j:argparse4j:0.7.0' diff --git a/src/main/java/org/asamk/TextSecure.java b/src/main/java/org/asamk/TextSecure.java index 3aa514c1..991342b7 100644 --- a/src/main/java/org/asamk/TextSecure.java +++ b/src/main/java/org/asamk/TextSecure.java @@ -5,7 +5,7 @@ import org.asamk.textsecure.GroupNotFoundException; import org.freedesktop.dbus.DBusInterface; import org.freedesktop.dbus.DBusSignal; import org.freedesktop.dbus.exceptions.DBusException; -import org.whispersystems.textsecure.api.push.exceptions.EncapsulatedExceptions; +import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import java.io.IOException; import java.util.List; diff --git a/src/main/java/org/asamk/textsecure/JsonAxolotlStore.java b/src/main/java/org/asamk/textsecure/JsonAxolotlStore.java index f054e337..afc448a2 100644 --- a/src/main/java/org/asamk/textsecure/JsonAxolotlStore.java +++ b/src/main/java/org/asamk/textsecure/JsonAxolotlStore.java @@ -3,18 +3,18 @@ package org.asamk.textsecure; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import org.whispersystems.libaxolotl.AxolotlAddress; -import org.whispersystems.libaxolotl.IdentityKey; -import org.whispersystems.libaxolotl.IdentityKeyPair; -import org.whispersystems.libaxolotl.InvalidKeyIdException; -import org.whispersystems.libaxolotl.state.AxolotlStore; -import org.whispersystems.libaxolotl.state.PreKeyRecord; -import org.whispersystems.libaxolotl.state.SessionRecord; -import org.whispersystems.libaxolotl.state.SignedPreKeyRecord; +import org.whispersystems.libsignal.IdentityKey; +import org.whispersystems.libsignal.IdentityKeyPair; +import org.whispersystems.libsignal.InvalidKeyIdException; +import org.whispersystems.libsignal.SignalProtocolAddress; +import org.whispersystems.libsignal.state.PreKeyRecord; +import org.whispersystems.libsignal.state.SessionRecord; +import org.whispersystems.libsignal.state.SignalProtocolStore; +import org.whispersystems.libsignal.state.SignedPreKeyRecord; import java.util.List; -class JsonAxolotlStore implements AxolotlStore { +class JsonAxolotlStore implements SignalProtocolStore { @JsonProperty("preKeys") @JsonDeserialize(using = JsonPreKeyStore.JsonPreKeyStoreDeserializer.class) @@ -94,7 +94,7 @@ class JsonAxolotlStore implements AxolotlStore { } @Override - public SessionRecord loadSession(AxolotlAddress address) { + public SessionRecord loadSession(SignalProtocolAddress address) { return sessionStore.loadSession(address); } @@ -104,17 +104,17 @@ class JsonAxolotlStore implements AxolotlStore { } @Override - public void storeSession(AxolotlAddress address, SessionRecord record) { + public void storeSession(SignalProtocolAddress address, SessionRecord record) { sessionStore.storeSession(address, record); } @Override - public boolean containsSession(AxolotlAddress address) { + public boolean containsSession(SignalProtocolAddress address) { return sessionStore.containsSession(address); } @Override - public void deleteSession(AxolotlAddress address) { + public void deleteSession(SignalProtocolAddress address) { sessionStore.deleteSession(address); } diff --git a/src/main/java/org/asamk/textsecure/JsonIdentityKeyStore.java b/src/main/java/org/asamk/textsecure/JsonIdentityKeyStore.java index 050158fc..eaf97388 100644 --- a/src/main/java/org/asamk/textsecure/JsonIdentityKeyStore.java +++ b/src/main/java/org/asamk/textsecure/JsonIdentityKeyStore.java @@ -4,10 +4,10 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.*; -import org.whispersystems.libaxolotl.IdentityKey; -import org.whispersystems.libaxolotl.IdentityKeyPair; -import org.whispersystems.libaxolotl.InvalidKeyException; -import org.whispersystems.libaxolotl.state.IdentityKeyStore; +import org.whispersystems.libsignal.IdentityKey; +import org.whispersystems.libsignal.IdentityKeyPair; +import org.whispersystems.libsignal.InvalidKeyException; +import org.whispersystems.libsignal.state.IdentityKeyStore; import java.io.IOException; import java.util.HashMap; diff --git a/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java b/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java index 9688cf3e..a522f177 100644 --- a/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java +++ b/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java @@ -4,9 +4,9 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.*; -import org.whispersystems.libaxolotl.InvalidKeyIdException; -import org.whispersystems.libaxolotl.state.PreKeyRecord; -import org.whispersystems.libaxolotl.state.PreKeyStore; +import org.whispersystems.libsignal.InvalidKeyIdException; +import org.whispersystems.libsignal.state.PreKeyRecord; +import org.whispersystems.libsignal.state.PreKeyStore; import java.io.IOException; import java.util.HashMap; diff --git a/src/main/java/org/asamk/textsecure/JsonSessionStore.java b/src/main/java/org/asamk/textsecure/JsonSessionStore.java index db352d3b..2fec85a3 100644 --- a/src/main/java/org/asamk/textsecure/JsonSessionStore.java +++ b/src/main/java/org/asamk/textsecure/JsonSessionStore.java @@ -4,28 +4,28 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.*; -import org.whispersystems.libaxolotl.AxolotlAddress; -import org.whispersystems.libaxolotl.state.SessionRecord; -import org.whispersystems.libaxolotl.state.SessionStore; +import org.whispersystems.libsignal.SignalProtocolAddress; +import org.whispersystems.libsignal.state.SessionRecord; +import org.whispersystems.libsignal.state.SessionStore; import java.io.IOException; import java.util.*; class JsonSessionStore implements SessionStore { - private final Map sessions = new HashMap<>(); + private final Map sessions = new HashMap<>(); public JsonSessionStore() { } - public void addSessions(Map sessions) { + public void addSessions(Map sessions) { this.sessions.putAll(sessions); } @Override - public synchronized SessionRecord loadSession(AxolotlAddress remoteAddress) { + public synchronized SessionRecord loadSession(SignalProtocolAddress remoteAddress) { try { if (containsSession(remoteAddress)) { return new SessionRecord(sessions.get(remoteAddress)); @@ -41,7 +41,7 @@ class JsonSessionStore implements SessionStore { public synchronized List getSubDeviceSessions(String name) { List deviceIds = new LinkedList<>(); - for (AxolotlAddress key : sessions.keySet()) { + for (SignalProtocolAddress key : sessions.keySet()) { if (key.getName().equals(name) && key.getDeviceId() != 1) { deviceIds.add(key.getDeviceId()); @@ -52,23 +52,23 @@ class JsonSessionStore implements SessionStore { } @Override - public synchronized void storeSession(AxolotlAddress address, SessionRecord record) { + public synchronized void storeSession(SignalProtocolAddress address, SessionRecord record) { sessions.put(address, record.serialize()); } @Override - public synchronized boolean containsSession(AxolotlAddress address) { + public synchronized boolean containsSession(SignalProtocolAddress address) { return sessions.containsKey(address); } @Override - public synchronized void deleteSession(AxolotlAddress address) { + public synchronized void deleteSession(SignalProtocolAddress address) { sessions.remove(address); } @Override public synchronized void deleteAllSessions(String name) { - for (AxolotlAddress key : new ArrayList<>(sessions.keySet())) { + for (SignalProtocolAddress key : new ArrayList<>(sessions.keySet())) { if (key.getName().equals(name)) { sessions.remove(key); } @@ -81,12 +81,12 @@ class JsonSessionStore implements SessionStore { public JsonSessionStore deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { JsonNode node = jsonParser.getCodec().readTree(jsonParser); - Map sessionMap = new HashMap<>(); + Map sessionMap = new HashMap<>(); if (node.isArray()) { for (JsonNode session : node) { String sessionName = session.get("name").asText(); try { - sessionMap.put(new AxolotlAddress(sessionName, session.get("deviceId").asInt()), Base64.decode(session.get("record").asText())); + sessionMap.put(new SignalProtocolAddress(sessionName, session.get("deviceId").asInt()), Base64.decode(session.get("record").asText())); } catch (IOException e) { System.out.println(String.format("Error while decoding session for: %s", sessionName)); } @@ -106,7 +106,7 @@ class JsonSessionStore implements SessionStore { @Override public void serialize(JsonSessionStore jsonSessionStore, JsonGenerator json, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { json.writeStartArray(); - for (Map.Entry preKey : jsonSessionStore.sessions.entrySet()) { + for (Map.Entry preKey : jsonSessionStore.sessions.entrySet()) { json.writeStartObject(); json.writeStringField("name", preKey.getKey().getName()); json.writeNumberField("deviceId", preKey.getKey().getDeviceId()); diff --git a/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java b/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java index d8dbeb9a..f890fe88 100644 --- a/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java +++ b/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java @@ -4,9 +4,9 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.*; -import org.whispersystems.libaxolotl.InvalidKeyIdException; -import org.whispersystems.libaxolotl.state.SignedPreKeyRecord; -import org.whispersystems.libaxolotl.state.SignedPreKeyStore; +import org.whispersystems.libsignal.InvalidKeyIdException; +import org.whispersystems.libsignal.state.SignedPreKeyRecord; +import org.whispersystems.libsignal.state.SignedPreKeyStore; import java.io.IOException; import java.util.HashMap; diff --git a/src/main/java/org/asamk/textsecure/Main.java b/src/main/java/org/asamk/textsecure/Main.java index 4227e65e..404a8988 100644 --- a/src/main/java/org/asamk/textsecure/Main.java +++ b/src/main/java/org/asamk/textsecure/Main.java @@ -25,13 +25,13 @@ import org.asamk.TextSecure; import org.freedesktop.dbus.DBusConnection; import org.freedesktop.dbus.exceptions.DBusException; import org.freedesktop.dbus.exceptions.DBusExecutionException; -import org.whispersystems.textsecure.api.crypto.UntrustedIdentityException; -import org.whispersystems.textsecure.api.messages.*; -import org.whispersystems.textsecure.api.messages.multidevice.TextSecureSyncMessage; -import org.whispersystems.textsecure.api.push.exceptions.EncapsulatedExceptions; -import org.whispersystems.textsecure.api.push.exceptions.NetworkFailureException; -import org.whispersystems.textsecure.api.push.exceptions.UnregisteredUserException; -import org.whispersystems.textsecure.api.util.PhoneNumberFormatter; +import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; +import org.whispersystems.signalservice.api.messages.*; +import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; +import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; +import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException; +import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; +import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; import java.io.File; import java.io.IOException; @@ -486,18 +486,18 @@ public class Main { } @Override - public void handleMessage(TextSecureEnvelope envelope, TextSecureContent content, GroupInfo group) { + public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, GroupInfo group) { System.out.println("Envelope from: " + envelope.getSource()); System.out.println("Timestamp: " + envelope.getTimestamp()); if (envelope.isReceipt()) { System.out.println("Got receipt."); - } else if (envelope.isWhisperMessage() | envelope.isPreKeyWhisperMessage()) { + } else if (envelope.isSignalMessage() | envelope.isPreKeySignalMessage()) { if (content == null) { System.out.println("Failed to decrypt message."); } else { if (content.getDataMessage().isPresent()) { - TextSecureDataMessage message = content.getDataMessage().get(); + SignalServiceDataMessage message = content.getDataMessage().get(); System.out.println("Message timestamp: " + message.getTimestamp()); @@ -505,7 +505,7 @@ public class Main { System.out.println("Body: " + message.getBody().get()); } if (message.getGroupInfo().isPresent()) { - TextSecureGroup groupInfo = message.getGroupInfo().get(); + SignalServiceGroup groupInfo = message.getGroupInfo().get(); System.out.println("Group info:"); System.out.println(" Id: " + Base64.encodeBytes(groupInfo.getGroupId())); if (groupInfo.getName().isPresent()) { @@ -532,13 +532,13 @@ public class Main { if (message.getAttachments().isPresent()) { System.out.println("Attachments: "); - for (TextSecureAttachment attachment : message.getAttachments().get()) { + for (SignalServiceAttachment attachment : message.getAttachments().get()) { printAttachment(attachment); } } } if (content.getSyncMessage().isPresent()) { - TextSecureSyncMessage syncMessage = content.getSyncMessage().get(); + SignalServiceSyncMessage syncMessage = content.getSyncMessage().get(); System.out.println("Received sync message"); } } @@ -548,10 +548,10 @@ public class Main { System.out.println(); } - private void printAttachment(TextSecureAttachment attachment) { + private void printAttachment(SignalServiceAttachment attachment) { System.out.println("- " + attachment.getContentType() + " (" + (attachment.isPointer() ? "Pointer" : "") + (attachment.isStream() ? "Stream" : "") + ")"); if (attachment.isPointer()) { - final TextSecureAttachmentPointer pointer = attachment.asPointer(); + final SignalServiceAttachmentPointer pointer = attachment.asPointer(); System.out.println(" Id: " + pointer.getId() + " Key length: " + pointer.getKey().length + (pointer.getRelay().isPresent() ? " Relay: " + pointer.getRelay().get() : "")); System.out.println(" Size: " + (pointer.getSize().isPresent() ? pointer.getSize().get() + " bytes" : "") + (pointer.getPreview().isPresent() ? " (Preview is available: " + pointer.getPreview().get().length + " bytes)" : "")); File file = m.getAttachmentFile(pointer.getId()); @@ -572,18 +572,18 @@ public class Main { } @Override - public void handleMessage(TextSecureEnvelope envelope, TextSecureContent content, GroupInfo group) { + public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, GroupInfo group) { System.out.println("Envelope from: " + envelope.getSource()); System.out.println("Timestamp: " + envelope.getTimestamp()); if (envelope.isReceipt()) { System.out.println("Got receipt."); - } else if (envelope.isWhisperMessage() | envelope.isPreKeyWhisperMessage()) { + } else if (envelope.isSignalMessage() | envelope.isPreKeySignalMessage()) { if (content == null) { System.out.println("Failed to decrypt message."); } else { if (content.getDataMessage().isPresent()) { - TextSecureDataMessage message = content.getDataMessage().get(); + SignalServiceDataMessage message = content.getDataMessage().get(); System.out.println("Message timestamp: " + message.getTimestamp()); @@ -592,7 +592,7 @@ public class Main { } if (message.getGroupInfo().isPresent()) { - TextSecureGroup groupInfo = message.getGroupInfo().get(); + SignalServiceGroup groupInfo = message.getGroupInfo().get(); System.out.println("Group info:"); System.out.println(" Id: " + Base64.encodeBytes(groupInfo.getGroupId())); if (groupInfo.getName().isPresent()) { @@ -620,7 +620,7 @@ public class Main { List attachments = new ArrayList<>(); if (message.getAttachments().isPresent()) { System.out.println("Attachments: "); - for (TextSecureAttachment attachment : message.getAttachments().get()) { + for (SignalServiceAttachment attachment : message.getAttachments().get()) { if (attachment.isPointer()) { attachments.add(m.getAttachmentFile(attachment.asPointer().getId()).getAbsolutePath()); } @@ -628,7 +628,7 @@ public class Main { } } if (!message.isEndSession() && - !(message.getGroupInfo().isPresent() && message.getGroupInfo().get().getType() != TextSecureGroup.Type.DELIVER)) { + !(message.getGroupInfo().isPresent() && message.getGroupInfo().get().getType() != SignalServiceGroup.Type.DELIVER)) { try { conn.sendSignal(new TextSecure.MessageReceived( TEXTSECURE_OBJECTPATH, @@ -642,7 +642,7 @@ public class Main { } } if (content.getSyncMessage().isPresent()) { - TextSecureSyncMessage syncMessage = content.getSyncMessage().get(); + SignalServiceSyncMessage syncMessage = content.getSyncMessage().get(); System.out.println("Received sync message"); } } @@ -652,10 +652,10 @@ public class Main { System.out.println(); } - private void printAttachment(TextSecureAttachment attachment) { + private void printAttachment(SignalServiceAttachment attachment) { System.out.println("- " + attachment.getContentType() + " (" + (attachment.isPointer() ? "Pointer" : "") + (attachment.isStream() ? "Stream" : "") + ")"); if (attachment.isPointer()) { - final TextSecureAttachmentPointer pointer = attachment.asPointer(); + final SignalServiceAttachmentPointer pointer = attachment.asPointer(); System.out.println(" Id: " + pointer.getId() + " Key length: " + pointer.getKey().length + (pointer.getRelay().isPresent() ? " Relay: " + pointer.getRelay().get() : "")); System.out.println(" Size: " + (pointer.getSize().isPresent() ? pointer.getSize().get() + " bytes" : "") + (pointer.getPreview().isPresent() ? " (Preview is available: " + pointer.getPreview().get().length + " bytes)" : "")); File file = m.getAttachmentFile(pointer.getId()); diff --git a/src/main/java/org/asamk/textsecure/Manager.java b/src/main/java/org/asamk/textsecure/Manager.java index e5a77dcd..77c46e9b 100644 --- a/src/main/java/org/asamk/textsecure/Manager.java +++ b/src/main/java/org/asamk/textsecure/Manager.java @@ -24,25 +24,25 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ObjectNode; import org.asamk.TextSecure; -import org.whispersystems.libaxolotl.*; -import org.whispersystems.libaxolotl.ecc.Curve; -import org.whispersystems.libaxolotl.ecc.ECKeyPair; -import org.whispersystems.libaxolotl.state.PreKeyRecord; -import org.whispersystems.libaxolotl.state.SignedPreKeyRecord; -import org.whispersystems.libaxolotl.util.KeyHelper; -import org.whispersystems.libaxolotl.util.Medium; -import org.whispersystems.libaxolotl.util.guava.Optional; -import org.whispersystems.textsecure.api.TextSecureAccountManager; -import org.whispersystems.textsecure.api.TextSecureMessagePipe; -import org.whispersystems.textsecure.api.TextSecureMessageReceiver; -import org.whispersystems.textsecure.api.TextSecureMessageSender; -import org.whispersystems.textsecure.api.crypto.TextSecureCipher; -import org.whispersystems.textsecure.api.messages.*; -import org.whispersystems.textsecure.api.push.TextSecureAddress; -import org.whispersystems.textsecure.api.push.TrustStore; -import org.whispersystems.textsecure.api.push.exceptions.EncapsulatedExceptions; -import org.whispersystems.textsecure.api.util.InvalidNumberException; -import org.whispersystems.textsecure.api.util.PhoneNumberFormatter; +import org.whispersystems.libsignal.*; +import org.whispersystems.libsignal.ecc.Curve; +import org.whispersystems.libsignal.ecc.ECKeyPair; +import org.whispersystems.libsignal.state.PreKeyRecord; +import org.whispersystems.libsignal.state.SignedPreKeyRecord; +import org.whispersystems.libsignal.util.KeyHelper; +import org.whispersystems.libsignal.util.Medium; +import org.whispersystems.libsignal.util.guava.Optional; +import org.whispersystems.signalservice.api.SignalServiceAccountManager; +import org.whispersystems.signalservice.api.SignalServiceMessagePipe; +import org.whispersystems.signalservice.api.SignalServiceMessageReceiver; +import org.whispersystems.signalservice.api.SignalServiceMessageSender; +import org.whispersystems.signalservice.api.crypto.SignalServiceCipher; +import org.whispersystems.signalservice.api.messages.*; +import org.whispersystems.signalservice.api.push.SignalServiceAddress; +import org.whispersystems.signalservice.api.push.TrustStore; +import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; +import org.whispersystems.signalservice.api.util.InvalidNumberException; +import org.whispersystems.signalservice.api.util.PhoneNumberFormatter; import java.io.*; import java.nio.file.Files; @@ -52,7 +52,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; class Manager implements TextSecure { - private final static String URL = "https://textsecure-service.whispersystems.org"; + private final static String URL = "https://SignalService-service.whispersystems.org"; private final static TrustStore TRUST_STORE = new WhisperTrustStore(); public final static String PROJECT_NAME = Manager.class.getPackage().getImplementationTitle(); @@ -73,7 +73,7 @@ class Manager implements TextSecure { private boolean registered = false; private JsonAxolotlStore axolotlStore; - private TextSecureAccountManager accountManager; + private SignalServiceAccountManager accountManager; private JsonGroupStore groupStore; public Manager(String username, String settingsPath) { @@ -138,7 +138,7 @@ class Manager implements TextSecure { if (groupStore == null) { groupStore = new JsonGroupStore(); } - accountManager = new TextSecureAccountManager(URL, TRUST_STORE, username, password, USER_AGENT); + accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, USER_AGENT); } private void save() { @@ -175,7 +175,7 @@ class Manager implements TextSecure { public void register(boolean voiceVerication) throws IOException { password = Util.getSecret(18); - accountManager = new TextSecureAccountManager(URL, TRUST_STORE, username, password, USER_AGENT); + accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, USER_AGENT); if (voiceVerication) accountManager.requestVoiceVerificationCode(); @@ -259,54 +259,54 @@ class Manager implements TextSecure { } - private static List getTextSecureAttachments(List attachments) throws AttachmentInvalidException { - List textSecureAttachments = null; + private static List getSignalServiceAttachments(List attachments) throws AttachmentInvalidException { + List SignalServiceAttachments = null; if (attachments != null) { - textSecureAttachments = new ArrayList<>(attachments.size()); + SignalServiceAttachments = new ArrayList<>(attachments.size()); for (String attachment : attachments) { try { - textSecureAttachments.add(createAttachment(attachment)); + SignalServiceAttachments.add(createAttachment(attachment)); } catch (IOException e) { throw new AttachmentInvalidException(attachment, e); } } } - return textSecureAttachments; + return SignalServiceAttachments; } - private static TextSecureAttachmentStream createAttachment(String attachment) throws IOException { + private static SignalServiceAttachmentStream createAttachment(String attachment) throws IOException { File attachmentFile = new File(attachment); InputStream attachmentStream = new FileInputStream(attachmentFile); final long attachmentSize = attachmentFile.length(); String mime = Files.probeContentType(Paths.get(attachment)); - return new TextSecureAttachmentStream(attachmentStream, mime, attachmentSize, null); + return new SignalServiceAttachmentStream(attachmentStream, mime, attachmentSize, null); } @Override public void sendGroupMessage(String messageText, List attachments, byte[] groupId) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException { - final TextSecureDataMessage.Builder messageBuilder = TextSecureDataMessage.newBuilder().withBody(messageText); + final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText); if (attachments != null) { - messageBuilder.withAttachments(getTextSecureAttachments(attachments)); + messageBuilder.withAttachments(getSignalServiceAttachments(attachments)); } if (groupId != null) { - TextSecureGroup group = TextSecureGroup.newBuilder(TextSecureGroup.Type.DELIVER) + SignalServiceGroup group = SignalServiceGroup.newBuilder(SignalServiceGroup.Type.DELIVER) .withId(groupId) .build(); messageBuilder.asGroupMessage(group); } - TextSecureDataMessage message = messageBuilder.build(); + SignalServiceDataMessage message = messageBuilder.build(); sendMessage(message, groupStore.getGroup(groupId).members); } public void sendQuitGroupMessage(byte[] groupId) throws GroupNotFoundException, IOException, EncapsulatedExceptions { - TextSecureGroup group = TextSecureGroup.newBuilder(TextSecureGroup.Type.QUIT) + SignalServiceGroup group = SignalServiceGroup.newBuilder(SignalServiceGroup.Type.QUIT) .withId(groupId) .build(); - TextSecureDataMessage message = TextSecureDataMessage.newBuilder() + SignalServiceDataMessage message = SignalServiceDataMessage.newBuilder() .asGroupMessage(group) .build(); @@ -339,7 +339,7 @@ class Manager implements TextSecure { } } - TextSecureGroup.Builder group = TextSecureGroup.newBuilder(TextSecureGroup.Type.UPDATE) + SignalServiceGroup.Builder group = SignalServiceGroup.newBuilder(SignalServiceGroup.Type.UPDATE) .withId(g.groupId) .withName(g.name) .withMembers(new ArrayList<>(g.members)); @@ -356,7 +356,7 @@ class Manager implements TextSecure { groupStore.updateGroup(g); - TextSecureDataMessage message = TextSecureDataMessage.newBuilder() + SignalServiceDataMessage message = SignalServiceDataMessage.newBuilder() .asGroupMessage(group.build()) .build(); @@ -376,30 +376,30 @@ class Manager implements TextSecure { public void sendMessage(String messageText, List attachments, List recipients) throws IOException, EncapsulatedExceptions, AttachmentInvalidException { - final TextSecureDataMessage.Builder messageBuilder = TextSecureDataMessage.newBuilder().withBody(messageText); + final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText); if (attachments != null) { - messageBuilder.withAttachments(getTextSecureAttachments(attachments)); + messageBuilder.withAttachments(getSignalServiceAttachments(attachments)); } - TextSecureDataMessage message = messageBuilder.build(); + SignalServiceDataMessage message = messageBuilder.build(); sendMessage(message, recipients); } @Override public void sendEndSessionMessage(List recipients) throws IOException, EncapsulatedExceptions { - TextSecureDataMessage message = TextSecureDataMessage.newBuilder() + SignalServiceDataMessage message = SignalServiceDataMessage.newBuilder() .asEndSessionMessage() .build(); sendMessage(message, recipients); } - private void sendMessage(TextSecureDataMessage message, Collection recipients) + private void sendMessage(SignalServiceDataMessage message, Collection recipients) throws IOException, EncapsulatedExceptions { - TextSecureMessageSender messageSender = new TextSecureMessageSender(URL, TRUST_STORE, username, password, - axolotlStore, USER_AGENT, Optional.absent()); + SignalServiceMessageSender messageSender = new SignalServiceMessageSender(URL, TRUST_STORE, username, password, + axolotlStore, USER_AGENT, Optional.absent()); - Set recipientsTS = new HashSet<>(recipients.size()); + Set recipientsTS = new HashSet<>(recipients.size()); for (String recipient : recipients) { try { recipientsTS.add(getPushAddress(recipient)); @@ -414,15 +414,15 @@ class Manager implements TextSecure { messageSender.sendMessage(new ArrayList<>(recipientsTS), message); if (message.isEndSession()) { - for (TextSecureAddress recipient : recipientsTS) { + for (SignalServiceAddress recipient : recipientsTS) { handleEndSession(recipient.getNumber()); } } save(); } - private TextSecureContent decryptMessage(TextSecureEnvelope envelope) { - TextSecureCipher cipher = new TextSecureCipher(new TextSecureAddress(username), axolotlStore); + private SignalServiceContent decryptMessage(SignalServiceEnvelope envelope) { + SignalServiceCipher cipher = new SignalServiceCipher(new SignalServiceAddress(username), axolotlStore); try { return cipher.decrypt(envelope); } catch (Exception e) { @@ -437,19 +437,19 @@ class Manager implements TextSecure { } public interface ReceiveMessageHandler { - void handleMessage(TextSecureEnvelope envelope, TextSecureContent decryptedContent, GroupInfo group); + void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent decryptedContent, GroupInfo group); } public void receiveMessages(int timeoutSeconds, boolean returnOnTimeout, ReceiveMessageHandler handler) throws IOException { - final TextSecureMessageReceiver messageReceiver = new TextSecureMessageReceiver(URL, TRUST_STORE, username, password, signalingKey, USER_AGENT); - TextSecureMessagePipe messagePipe = null; + final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, signalingKey, USER_AGENT); + SignalServiceMessagePipe messagePipe = null; try { messagePipe = messageReceiver.createMessagePipe(); while (true) { - TextSecureEnvelope envelope; - TextSecureContent content = null; + SignalServiceEnvelope envelope; + SignalServiceContent content = null; GroupInfo group = null; try { envelope = messagePipe.read(timeoutSeconds, TimeUnit.SECONDS); @@ -457,9 +457,9 @@ class Manager implements TextSecure { content = decryptMessage(envelope); if (content != null) { if (content.getDataMessage().isPresent()) { - TextSecureDataMessage message = content.getDataMessage().get(); + SignalServiceDataMessage message = content.getDataMessage().get(); if (message.getGroupInfo().isPresent()) { - TextSecureGroup groupInfo = message.getGroupInfo().get(); + SignalServiceGroup groupInfo = message.getGroupInfo().get(); switch (groupInfo.getType()) { case UPDATE: try { @@ -469,7 +469,7 @@ class Manager implements TextSecure { } if (groupInfo.getAvatar().isPresent()) { - TextSecureAttachment avatar = groupInfo.getAvatar().get(); + SignalServiceAttachment avatar = groupInfo.getAvatar().get(); if (avatar.isPointer()) { long avatarId = avatar.asPointer().getId(); try { @@ -510,7 +510,7 @@ class Manager implements TextSecure { handleEndSession(envelope.getSource()); } if (message.getAttachments().isPresent()) { - for (TextSecureAttachment attachment : message.getAttachments().get()) { + for (SignalServiceAttachment attachment : message.getAttachments().get()) { if (attachment.isPointer()) { try { retrieveAttachment(attachment.asPointer()); @@ -542,8 +542,8 @@ class Manager implements TextSecure { return new File(attachmentsPath, attachmentId + ""); } - private File retrieveAttachment(TextSecureAttachmentPointer pointer) throws IOException, InvalidMessageException { - final TextSecureMessageReceiver messageReceiver = new TextSecureMessageReceiver(URL, TRUST_STORE, username, password, signalingKey, USER_AGENT); + private File retrieveAttachment(SignalServiceAttachmentPointer pointer) throws IOException, InvalidMessageException { + final SignalServiceMessageReceiver messageReceiver = new SignalServiceMessageReceiver(URL, TRUST_STORE, username, password, signalingKey, USER_AGENT); File tmpFile = File.createTempFile("ts_attach_" + pointer.getId(), ".tmp"); InputStream input = messageReceiver.retrieveAttachment(pointer, tmpFile); @@ -594,9 +594,9 @@ class Manager implements TextSecure { return PhoneNumberFormatter.formatNumber(number, localNumber); } - private TextSecureAddress getPushAddress(String number) throws InvalidNumberException { + private SignalServiceAddress getPushAddress(String number) throws InvalidNumberException { String e164number = canonicalizeNumber(number); - return new TextSecureAddress(e164number); + return new SignalServiceAddress(e164number); } @Override diff --git a/src/main/java/org/asamk/textsecure/WhisperTrustStore.java b/src/main/java/org/asamk/textsecure/WhisperTrustStore.java index 48d96e8f..1f129c5a 100644 --- a/src/main/java/org/asamk/textsecure/WhisperTrustStore.java +++ b/src/main/java/org/asamk/textsecure/WhisperTrustStore.java @@ -1,6 +1,6 @@ package org.asamk.textsecure; -import org.whispersystems.textsecure.api.push.TrustStore; +import org.whispersystems.signalservice.api.push.TrustStore; import java.io.InputStream; -- 2.51.0 From 10719a443a88d06ef5734f0e17f71316b1473edf Mon Sep 17 00:00:00 2001 From: AsamK Date: Fri, 25 Mar 2016 16:57:40 +0100 Subject: [PATCH 12/16] Rename axolotl -> signalProtocol --- ...tore.java => JsonSignalProtocolStore.java} | 8 ++--- .../java/org/asamk/textsecure/Manager.java | 35 ++++++++++--------- 2 files changed, 22 insertions(+), 21 deletions(-) rename src/main/java/org/asamk/textsecure/{JsonAxolotlStore.java => JsonSignalProtocolStore.java} (92%) diff --git a/src/main/java/org/asamk/textsecure/JsonAxolotlStore.java b/src/main/java/org/asamk/textsecure/JsonSignalProtocolStore.java similarity index 92% rename from src/main/java/org/asamk/textsecure/JsonAxolotlStore.java rename to src/main/java/org/asamk/textsecure/JsonSignalProtocolStore.java index afc448a2..f440a709 100644 --- a/src/main/java/org/asamk/textsecure/JsonAxolotlStore.java +++ b/src/main/java/org/asamk/textsecure/JsonSignalProtocolStore.java @@ -14,7 +14,7 @@ import org.whispersystems.libsignal.state.SignedPreKeyRecord; import java.util.List; -class JsonAxolotlStore implements SignalProtocolStore { +class JsonSignalProtocolStore implements SignalProtocolStore { @JsonProperty("preKeys") @JsonDeserialize(using = JsonPreKeyStore.JsonPreKeyStoreDeserializer.class) @@ -36,17 +36,17 @@ class JsonAxolotlStore implements SignalProtocolStore { @JsonSerialize(using = JsonIdentityKeyStore.JsonIdentityKeyStoreSerializer.class) protected JsonIdentityKeyStore identityKeyStore; - public JsonAxolotlStore() { + public JsonSignalProtocolStore() { } - public JsonAxolotlStore(JsonPreKeyStore preKeyStore, JsonSessionStore sessionStore, JsonSignedPreKeyStore signedPreKeyStore, JsonIdentityKeyStore identityKeyStore) { + public JsonSignalProtocolStore(JsonPreKeyStore preKeyStore, JsonSessionStore sessionStore, JsonSignedPreKeyStore signedPreKeyStore, JsonIdentityKeyStore identityKeyStore) { this.preKeyStore = preKeyStore; this.sessionStore = sessionStore; this.signedPreKeyStore = signedPreKeyStore; this.identityKeyStore = identityKeyStore; } - public JsonAxolotlStore(IdentityKeyPair identityKeyPair, int registrationId) { + public JsonSignalProtocolStore(IdentityKeyPair identityKeyPair, int registrationId) { preKeyStore = new JsonPreKeyStore(); sessionStore = new JsonSessionStore(); signedPreKeyStore = new JsonSignedPreKeyStore(); diff --git a/src/main/java/org/asamk/textsecure/Manager.java b/src/main/java/org/asamk/textsecure/Manager.java index 77c46e9b..2d675170 100644 --- a/src/main/java/org/asamk/textsecure/Manager.java +++ b/src/main/java/org/asamk/textsecure/Manager.java @@ -28,6 +28,7 @@ import org.whispersystems.libsignal.*; import org.whispersystems.libsignal.ecc.Curve; import org.whispersystems.libsignal.ecc.ECKeyPair; import org.whispersystems.libsignal.state.PreKeyRecord; +import org.whispersystems.libsignal.state.SignalProtocolStore; import org.whispersystems.libsignal.state.SignedPreKeyRecord; import org.whispersystems.libsignal.util.KeyHelper; import org.whispersystems.libsignal.util.Medium; @@ -72,7 +73,7 @@ class Manager implements TextSecure { private boolean registered = false; - private JsonAxolotlStore axolotlStore; + private SignalProtocolStore signalProtocolStore; private SignalServiceAccountManager accountManager; private JsonGroupStore groupStore; @@ -99,7 +100,7 @@ class Manager implements TextSecure { } public boolean userHasKeys() { - return axolotlStore != null; + return signalProtocolStore != null; } private JsonNode getNotNullNode(JsonNode parent, String name) throws InvalidObjectException { @@ -129,7 +130,7 @@ class Manager implements TextSecure { } else { nextSignedPreKeyId = 0; } - axolotlStore = jsonProcessot.convertValue(getNotNullNode(rootNode, "axolotlStore"), JsonAxolotlStore.class); //new JsonAxolotlStore(in.getJSONObject("axolotlStore")); + signalProtocolStore = jsonProcessot.convertValue(getNotNullNode(rootNode, "axolotlStore"), JsonSignalProtocolStore.class); registered = getNotNullNode(rootNode, "registered").asBoolean(); JsonNode groupStoreNode = rootNode.get("groupStore"); if (groupStoreNode != null) { @@ -149,7 +150,7 @@ class Manager implements TextSecure { .put("preKeyIdOffset", preKeyIdOffset) .put("nextSignedPreKeyId", nextSignedPreKeyId) .put("registered", registered) - .putPOJO("axolotlStore", axolotlStore) + .putPOJO("axolotlStore", signalProtocolStore) .putPOJO("groupStore", groupStore) ; try { @@ -162,7 +163,7 @@ class Manager implements TextSecure { public void createNewIdentity() { IdentityKeyPair identityKey = KeyHelper.generateIdentityKeyPair(); int registrationId = KeyHelper.generateRegistrationId(false); - axolotlStore = new JsonAxolotlStore(identityKey, registrationId); + signalProtocolStore = new JsonSignalProtocolStore(identityKey, registrationId); groupStore = new JsonGroupStore(); registered = false; save(); @@ -196,7 +197,7 @@ class Manager implements TextSecure { ECKeyPair keyPair = Curve.generateKeyPair(); PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); - axolotlStore.storePreKey(preKeyId, record); + signalProtocolStore.storePreKey(preKeyId, record); records.add(record); } @@ -207,18 +208,18 @@ class Manager implements TextSecure { } private PreKeyRecord generateLastResortPreKey() { - if (axolotlStore.containsPreKey(Medium.MAX_VALUE)) { + if (signalProtocolStore.containsPreKey(Medium.MAX_VALUE)) { try { - return axolotlStore.loadPreKey(Medium.MAX_VALUE); + return signalProtocolStore.loadPreKey(Medium.MAX_VALUE); } catch (InvalidKeyIdException e) { - axolotlStore.removePreKey(Medium.MAX_VALUE); + signalProtocolStore.removePreKey(Medium.MAX_VALUE); } } ECKeyPair keyPair = Curve.generateKeyPair(); PreKeyRecord record = new PreKeyRecord(Medium.MAX_VALUE, keyPair); - axolotlStore.storePreKey(Medium.MAX_VALUE, record); + signalProtocolStore.storePreKey(Medium.MAX_VALUE, record); save(); return record; @@ -230,7 +231,7 @@ class Manager implements TextSecure { byte[] signature = Curve.calculateSignature(identityKeyPair.getPrivateKey(), keyPair.getPublicKey().serialize()); SignedPreKeyRecord record = new SignedPreKeyRecord(nextSignedPreKeyId, System.currentTimeMillis(), keyPair, signature); - axolotlStore.storeSignedPreKey(nextSignedPreKeyId, record); + signalProtocolStore.storeSignedPreKey(nextSignedPreKeyId, record); nextSignedPreKeyId = (nextSignedPreKeyId + 1) % Medium.MAX_VALUE; save(); @@ -243,7 +244,7 @@ class Manager implements TextSecure { public void verifyAccount(String verificationCode) throws IOException { verificationCode = verificationCode.replace("-", ""); signalingKey = Util.getSecret(52); - accountManager.verifyAccountWithCode(verificationCode, signalingKey, axolotlStore.getLocalRegistrationId(), false, true); + accountManager.verifyAccountWithCode(verificationCode, signalingKey, signalProtocolStore.getLocalRegistrationId(), false, true); //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID))); registered = true; @@ -252,9 +253,9 @@ class Manager implements TextSecure { PreKeyRecord lastResortKey = generateLastResortPreKey(); - SignedPreKeyRecord signedPreKeyRecord = generateSignedPreKey(axolotlStore.getIdentityKeyPair()); + SignedPreKeyRecord signedPreKeyRecord = generateSignedPreKey(signalProtocolStore.getIdentityKeyPair()); - accountManager.setPreKeys(axolotlStore.getIdentityKeyPair().getPublicKey(), lastResortKey, signedPreKeyRecord, oneTimePreKeys); + accountManager.setPreKeys(signalProtocolStore.getIdentityKeyPair().getPublicKey(), lastResortKey, signedPreKeyRecord, oneTimePreKeys); save(); } @@ -397,7 +398,7 @@ class Manager implements TextSecure { private void sendMessage(SignalServiceDataMessage message, Collection recipients) throws IOException, EncapsulatedExceptions { SignalServiceMessageSender messageSender = new SignalServiceMessageSender(URL, TRUST_STORE, username, password, - axolotlStore, USER_AGENT, Optional.absent()); + signalProtocolStore, USER_AGENT, Optional.absent()); Set recipientsTS = new HashSet<>(recipients.size()); for (String recipient : recipients) { @@ -422,7 +423,7 @@ class Manager implements TextSecure { } private SignalServiceContent decryptMessage(SignalServiceEnvelope envelope) { - SignalServiceCipher cipher = new SignalServiceCipher(new SignalServiceAddress(username), axolotlStore); + SignalServiceCipher cipher = new SignalServiceCipher(new SignalServiceAddress(username), signalProtocolStore); try { return cipher.decrypt(envelope); } catch (Exception e) { @@ -433,7 +434,7 @@ class Manager implements TextSecure { } private void handleEndSession(String source) { - axolotlStore.deleteAllSessions(source); + signalProtocolStore.deleteAllSessions(source); } public interface ReceiveMessageHandler { -- 2.51.0 From eabd361405a54a5b7122bf537cb299306f098e45 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 27 Mar 2016 13:53:04 +0200 Subject: [PATCH 13/16] Rename to signal-cli Changes experimental dbus interface from org.asamk.TextSecure to org.asamk.Signal --- README.md | 46 +++++++++--------- build.gradle | 2 +- data/org.asamk.Signal.conf | 16 ++++++ data/org.asamk.Signal.service | 4 ++ data/org.asamk.TextSecure.conf | 16 ------ data/org.asamk.TextSecure.service | 4 -- data/signal-cli@.service | 16 ++++++ data/signal.service | 12 +++++ data/textsecure-cli@.service | 16 ------ data/textsecure.service | 12 ----- settings.gradle | 2 +- .../asamk/{TextSecure.java => Signal.java} | 6 +-- .../AttachmentInvalidException.java | 2 +- .../asamk/{textsecure => signal}/Base64.java | 2 +- .../{textsecure => signal}/GroupInfo.java | 2 +- .../GroupNotFoundException.java | 2 +- .../JsonGroupStore.java | 2 +- .../JsonIdentityKeyStore.java | 2 +- .../JsonPreKeyStore.java | 2 +- .../JsonSessionStore.java | 2 +- .../JsonSignalProtocolStore.java | 2 +- .../JsonSignedPreKeyStore.java | 2 +- .../asamk/{textsecure => signal}/Main.java | 32 ++++++------ .../asamk/{textsecure => signal}/Manager.java | 8 +-- .../asamk/{textsecure => signal}/Util.java | 2 +- .../WhisperTrustStore.java | 2 +- .../{textsecure => signal}/whisper.store | Bin 27 files changed, 108 insertions(+), 108 deletions(-) create mode 100644 data/org.asamk.Signal.conf create mode 100644 data/org.asamk.Signal.service delete mode 100644 data/org.asamk.TextSecure.conf delete mode 100644 data/org.asamk.TextSecure.service create mode 100644 data/signal-cli@.service create mode 100644 data/signal.service delete mode 100644 data/textsecure-cli@.service delete mode 100644 data/textsecure.service rename src/main/java/org/asamk/{TextSecure.java => Signal.java} (87%) rename src/main/java/org/asamk/{textsecure => signal}/AttachmentInvalidException.java (92%) rename src/main/java/org/asamk/{textsecure => signal}/Base64.java (99%) rename src/main/java/org/asamk/{textsecure => signal}/GroupInfo.java (96%) rename src/main/java/org/asamk/{textsecure => signal}/GroupNotFoundException.java (91%) rename src/main/java/org/asamk/{textsecure => signal}/JsonGroupStore.java (98%) rename src/main/java/org/asamk/{textsecure => signal}/JsonIdentityKeyStore.java (99%) rename src/main/java/org/asamk/{textsecure => signal}/JsonPreKeyStore.java (99%) rename src/main/java/org/asamk/{textsecure => signal}/JsonSessionStore.java (99%) rename src/main/java/org/asamk/{textsecure => signal}/JsonSignalProtocolStore.java (99%) rename src/main/java/org/asamk/{textsecure => signal}/JsonSignedPreKeyStore.java (99%) rename src/main/java/org/asamk/{textsecure => signal}/Main.java (97%) rename src/main/java/org/asamk/{textsecure => signal}/Manager.java (99%) rename src/main/java/org/asamk/{textsecure => signal}/Util.java (95%) rename src/main/java/org/asamk/{textsecure => signal}/WhisperTrustStore.java (92%) rename src/main/resources/org/asamk/{textsecure => signal}/whisper.store (100%) diff --git a/README.md b/README.md index 1f4597d5..f951669d 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,72 @@ -# textsecure-cli +# signal-cli -textsecure-cli is a commandline interface for [libtextsecure-java](https://github.com/WhisperSystems/libtextsecure-java). It supports registering, verifying, sending and receiving messages. To be able to receiving messages textsecure-cli uses a [patched libtextsecure-java](https://github.com/AsamK/libtextsecure-java), because libtextsecure-java [does not yet support registering for the websocket support](https://github.com/WhisperSystems/libtextsecure-java/pull/5). For registering you need a phone number where you can receive SMS or incoming calls. +signal-cli is a commandline interface for [libtextsecure-java](https://github.com/WhisperSystems/libtextsecure-java). It supports registering, verifying, sending and receiving messages. To be able to receiving messages signal-cli uses a [patched libtextsecure-java](https://github.com/AsamK/libtextsecure-java), because libtextsecure-java [does not yet support registering for the websocket support](https://github.com/WhisperSystems/libtextsecure-java/pull/5). For registering you need a phone number where you can receive SMS or incoming calls. It is primarily intended to be used on servers to notify admins of important events. For this use-case, it has a dbus interface, that can be used to send messages from any programming language that has dbus bindings. ## Usage -usage: textsecure-cli [-h] [-u USERNAME] [-v] {register,verify,send,quitGroup,updateGroup,receive} ... +usage: signal-cli [-h] [-u USERNAME] [-v] {register,verify,send,quitGroup,updateGroup,receive} ... * Register a number (with SMS verification) - textsecure-cli -u USERNAME register + signal-cli -u USERNAME register * Register a number (with voice verification) - textsecure-cli -u USERNAME register -v + signal-cli -u USERNAME register -v * Verify the number using the code received via SMS or voice - textsecure-cli -u USERNAME verify CODE + signal-cli -u USERNAME verify CODE * Send a message to one or more recipients - textsecure-cli -u USERNAME send -m "This is a message" [RECIPIENT [RECIPIENT ...]] [-a [ATTACHMENT [ATTACHMENT ...]]] + signal-cli -u USERNAME send -m "This is a message" [RECIPIENT [RECIPIENT ...]] [-a [ATTACHMENT [ATTACHMENT ...]]] * Pipe the message content from another process. - uname -a | textsecure-cli -u USERNAME send [RECIPIENT [RECIPIENT ...]] + uname -a | signal-cli -u USERNAME send [RECIPIENT [RECIPIENT ...]] * Groups * Create a group - textsecure-cli -u USERNAME updateGroup -n "Group name" -m [MEMBER [MEMBER ...]] + signal-cli -u USERNAME updateGroup -n "Group name" -m [MEMBER [MEMBER ...]] * Update a group - textsecure-cli -u USERNAME updateGroup -g GROUP_ID -n "New group name" + signal-cli -u USERNAME updateGroup -g GROUP_ID -n "New group name" * Send a message to a group - textsecure-cli -u USERNAME send -m "This is a message" -g GROUP_ID + signal-cli -u USERNAME send -m "This is a message" -g GROUP_ID ## DBus service -textsecure-cli can run in daemon mode and provides an experimental dbus interface. +signal-cli can run in daemon mode and provides an experimental dbus interface. For dbus support you need jni/unix-java.so installed on your system (Debian: libunixsocket-java ArchLinux: libmatthew-unix-java (AUR)). * Run in daemon mode (dbus session bus) - textsecure-cli -u USERNAME daemon + signal-cli -u USERNAME daemon * Send a message via dbus - textsecure-cli --dbus send -m "Message" [RECIPIENT [RECIPIENT ...]] [-a [ATTACHMENT [ATTACHMENT ...]]] + signal-cli --dbus send -m "Message" [RECIPIENT [RECIPIENT ...]] [-a [ATTACHMENT [ATTACHMENT ...]]] ### System bus To run on the system bus you need to take some additional steps. -It’s advisable to run textsecure-cli as a separate unix user, the following steps assume you created a user named *textsecure-cli*. +It’s advisable to run signal-cli as a separate unix user, the following steps assume you created a user named *signal-cli*. These steps, executed as root, should work on all distributions using systemd. ```bash -cp data/org.asamk.TextSecure.conf /etc/dbus-1/system.d/ -cp data/org.asamk.TextSecure.service /usr/share/dbus-1/system-services/ -cp data/textsecure.service /etc/systemd/system/ -sed -i -e "s|%dir%||" -e "s|%number%||" /etc/systemd/system/textsecure.service +cp data/org.asamk.Signal.conf /etc/dbus-1/system.d/ +cp data/org.asamk.Signal.service /usr/share/dbus-1/system-services/ +cp data/signal.service /etc/systemd/system/ +sed -i -e "s|%dir%||" -e "s|%number%||" /etc/systemd/system/signal.service systemctl daemon-reload -systemctl enable textsecure.service +systemctl enable signal.service systemctl reload dbus.service ``` @@ -76,7 +76,7 @@ Then just execute the send command from above, the service will be autostarted b The password and cryptographic keys are created when registering and stored in the current users home directory: - $HOME/.config/textsecure/data/ + $HOME/.config/signal/data/ ## Building @@ -85,13 +85,13 @@ dependencies. 1. Checkout the source somewhere on your filesystem with - git clone https://github.com/AsamK/textsecure-cli.git + git clone https://github.com/AsamK/signal-cli.git 2. Execute Gradle: ./gradlew build -3. Create shell wrapper in *build/install/textsecure-cli/bin*: +3. Create shell wrapper in *build/install/signal-cli/bin*: ./gradlew installDist diff --git a/build.gradle b/build.gradle index 7d9d9655..8402bd05 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'application' sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 -mainClassName = 'org.asamk.textsecure.Main' +mainClassName = 'org.asamk.signal.Main' version = '0.2.1' diff --git a/data/org.asamk.Signal.conf b/data/org.asamk.Signal.conf new file mode 100644 index 00000000..a30c5013 --- /dev/null +++ b/data/org.asamk.Signal.conf @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/data/org.asamk.Signal.service b/data/org.asamk.Signal.service new file mode 100644 index 00000000..89bffd8a --- /dev/null +++ b/data/org.asamk.Signal.service @@ -0,0 +1,4 @@ +[D-BUS Service] +Name=org.asamk.Signal +Exec=/bin/false +SystemdService=dbus-org.asamk.Signal.service diff --git a/data/org.asamk.TextSecure.conf b/data/org.asamk.TextSecure.conf deleted file mode 100644 index 79883753..00000000 --- a/data/org.asamk.TextSecure.conf +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/data/org.asamk.TextSecure.service b/data/org.asamk.TextSecure.service deleted file mode 100644 index a031626b..00000000 --- a/data/org.asamk.TextSecure.service +++ /dev/null @@ -1,4 +0,0 @@ -[D-BUS Service] -Name=org.asamk.TextSecure -Exec=/bin/false -SystemdService=dbus-org.asamk.TextSecure.service diff --git a/data/signal-cli@.service b/data/signal-cli@.service new file mode 100644 index 00000000..34409f6d --- /dev/null +++ b/data/signal-cli@.service @@ -0,0 +1,16 @@ +[Unit] +Description=Send secure messages to Signal clients +Requires=dbus.socket +After=dbus.socket +Wants=network.target +After=network.target + +[Service] +Type=dbus +Environment=SIGNAL_CLI_OPTS="-Xms2m" +ExecStart=%dir%/bin/signal-cli -u %I --config /var/lib/signal-cli daemon --system +User=signal-cli +BusName=org.asamk.Signal + +[Install] +WantedBy=multi-user.target diff --git a/data/signal.service b/data/signal.service new file mode 100644 index 00000000..126bbd2e --- /dev/null +++ b/data/signal.service @@ -0,0 +1,12 @@ +[Unit] +Description=Send secure messages to Signal clients + +[Service] +Type=dbus +Environment=SIGNAL_CLI_OPTS="-Xms2m" +ExecStart=%dir%/bin/signal-cli -u %number% --config /var/lib/signal-cli daemon --system +User=signal-cli +BusName=org.asamk.Signal + +[Install] +Alias=dbus-org.asamk.Signal.service diff --git a/data/textsecure-cli@.service b/data/textsecure-cli@.service deleted file mode 100644 index 3e39571e..00000000 --- a/data/textsecure-cli@.service +++ /dev/null @@ -1,16 +0,0 @@ -[Unit] -Description=Send secure messages to TextSecure/Signal clients -Requires=dbus.socket -After=dbus.socket -Wants=network.target -After=network.target - -[Service] -Type=dbus -Environment=TEXTSECURE_CLI_OPTS="-Xms2m" -ExecStart=%dir%/bin/textsecure-cli -u %I --config /var/lib/textsecure-cli daemon --system -User=textsecure-cli -BusName=org.asamk.TextSecure - -[Install] -WantedBy=multi-user.target diff --git a/data/textsecure.service b/data/textsecure.service deleted file mode 100644 index 8b302d84..00000000 --- a/data/textsecure.service +++ /dev/null @@ -1,12 +0,0 @@ -[Unit] -Description=Send secure messages to TextSecure/Signal clients - -[Service] -Type=dbus -Environment=TEXTSECURE_CLI_OPTS="-Xms2m" -ExecStart=%dir%/bin/textsecure-cli -u %number% --config /var/lib/textsecure-cli daemon --system -User=textsecure-cli -BusName=org.asamk.TextSecure - -[Install] -Alias=dbus-org.asamk.TextSecure.service diff --git a/settings.gradle b/settings.gradle index a2c308d3..9f877185 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,4 +15,4 @@ include 'api' include 'services:webservice' */ -rootProject.name = 'textsecure-cli' +rootProject.name = 'signal-cli' diff --git a/src/main/java/org/asamk/TextSecure.java b/src/main/java/org/asamk/Signal.java similarity index 87% rename from src/main/java/org/asamk/TextSecure.java rename to src/main/java/org/asamk/Signal.java index 991342b7..cb2025ab 100644 --- a/src/main/java/org/asamk/TextSecure.java +++ b/src/main/java/org/asamk/Signal.java @@ -1,7 +1,7 @@ package org.asamk; -import org.asamk.textsecure.AttachmentInvalidException; -import org.asamk.textsecure.GroupNotFoundException; +import org.asamk.signal.AttachmentInvalidException; +import org.asamk.signal.GroupNotFoundException; import org.freedesktop.dbus.DBusInterface; import org.freedesktop.dbus.DBusSignal; import org.freedesktop.dbus.exceptions.DBusException; @@ -10,7 +10,7 @@ import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptio import java.io.IOException; import java.util.List; -public interface TextSecure extends DBusInterface { +public interface Signal extends DBusInterface { void sendMessage(String message, List attachments, String recipient) throws EncapsulatedExceptions, AttachmentInvalidException, IOException; void sendMessage(String message, List attachments, List recipients) throws EncapsulatedExceptions, AttachmentInvalidException, IOException; diff --git a/src/main/java/org/asamk/textsecure/AttachmentInvalidException.java b/src/main/java/org/asamk/signal/AttachmentInvalidException.java similarity index 92% rename from src/main/java/org/asamk/textsecure/AttachmentInvalidException.java rename to src/main/java/org/asamk/signal/AttachmentInvalidException.java index 5afa67e3..8a023f62 100644 --- a/src/main/java/org/asamk/textsecure/AttachmentInvalidException.java +++ b/src/main/java/org/asamk/signal/AttachmentInvalidException.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import org.freedesktop.dbus.exceptions.DBusExecutionException; diff --git a/src/main/java/org/asamk/textsecure/Base64.java b/src/main/java/org/asamk/signal/Base64.java similarity index 99% rename from src/main/java/org/asamk/textsecure/Base64.java rename to src/main/java/org/asamk/signal/Base64.java index f8f6b4cd..517bb7dd 100644 --- a/src/main/java/org/asamk/textsecure/Base64.java +++ b/src/main/java/org/asamk/signal/Base64.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; /** *

Encodes and decodes to and from Base64 notation.

diff --git a/src/main/java/org/asamk/textsecure/GroupInfo.java b/src/main/java/org/asamk/signal/GroupInfo.java similarity index 96% rename from src/main/java/org/asamk/textsecure/GroupInfo.java rename to src/main/java/org/asamk/signal/GroupInfo.java index dd6cacf7..4ad7003e 100644 --- a/src/main/java/org/asamk/textsecure/GroupInfo.java +++ b/src/main/java/org/asamk/signal/GroupInfo.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/org/asamk/textsecure/GroupNotFoundException.java b/src/main/java/org/asamk/signal/GroupNotFoundException.java similarity index 91% rename from src/main/java/org/asamk/textsecure/GroupNotFoundException.java rename to src/main/java/org/asamk/signal/GroupNotFoundException.java index 6c4cf5b1..0218c508 100644 --- a/src/main/java/org/asamk/textsecure/GroupNotFoundException.java +++ b/src/main/java/org/asamk/signal/GroupNotFoundException.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import org.freedesktop.dbus.exceptions.DBusExecutionException; diff --git a/src/main/java/org/asamk/textsecure/JsonGroupStore.java b/src/main/java/org/asamk/signal/JsonGroupStore.java similarity index 98% rename from src/main/java/org/asamk/textsecure/JsonGroupStore.java rename to src/main/java/org/asamk/signal/JsonGroupStore.java index 17a59f87..a75c5148 100644 --- a/src/main/java/org/asamk/textsecure/JsonGroupStore.java +++ b/src/main/java/org/asamk/signal/JsonGroupStore.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/src/main/java/org/asamk/textsecure/JsonIdentityKeyStore.java b/src/main/java/org/asamk/signal/JsonIdentityKeyStore.java similarity index 99% rename from src/main/java/org/asamk/textsecure/JsonIdentityKeyStore.java rename to src/main/java/org/asamk/signal/JsonIdentityKeyStore.java index eaf97388..c1ef428b 100644 --- a/src/main/java/org/asamk/textsecure/JsonIdentityKeyStore.java +++ b/src/main/java/org/asamk/signal/JsonIdentityKeyStore.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java b/src/main/java/org/asamk/signal/JsonPreKeyStore.java similarity index 99% rename from src/main/java/org/asamk/textsecure/JsonPreKeyStore.java rename to src/main/java/org/asamk/signal/JsonPreKeyStore.java index a522f177..d4c8d521 100644 --- a/src/main/java/org/asamk/textsecure/JsonPreKeyStore.java +++ b/src/main/java/org/asamk/signal/JsonPreKeyStore.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/org/asamk/textsecure/JsonSessionStore.java b/src/main/java/org/asamk/signal/JsonSessionStore.java similarity index 99% rename from src/main/java/org/asamk/textsecure/JsonSessionStore.java rename to src/main/java/org/asamk/signal/JsonSessionStore.java index 2fec85a3..cd4d55ad 100644 --- a/src/main/java/org/asamk/textsecure/JsonSessionStore.java +++ b/src/main/java/org/asamk/signal/JsonSessionStore.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/org/asamk/textsecure/JsonSignalProtocolStore.java b/src/main/java/org/asamk/signal/JsonSignalProtocolStore.java similarity index 99% rename from src/main/java/org/asamk/textsecure/JsonSignalProtocolStore.java rename to src/main/java/org/asamk/signal/JsonSignalProtocolStore.java index f440a709..0d9c4b69 100644 --- a/src/main/java/org/asamk/textsecure/JsonSignalProtocolStore.java +++ b/src/main/java/org/asamk/signal/JsonSignalProtocolStore.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; diff --git a/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java b/src/main/java/org/asamk/signal/JsonSignedPreKeyStore.java similarity index 99% rename from src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java rename to src/main/java/org/asamk/signal/JsonSignedPreKeyStore.java index f890fe88..cdcd506b 100644 --- a/src/main/java/org/asamk/textsecure/JsonSignedPreKeyStore.java +++ b/src/main/java/org/asamk/signal/JsonSignedPreKeyStore.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/org/asamk/textsecure/Main.java b/src/main/java/org/asamk/signal/Main.java similarity index 97% rename from src/main/java/org/asamk/textsecure/Main.java rename to src/main/java/org/asamk/signal/Main.java index 404a8988..a4e50bb4 100644 --- a/src/main/java/org/asamk/textsecure/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -14,14 +14,14 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.asamk.textsecure; +package org.asamk.signal; import net.sourceforge.argparse4j.ArgumentParsers; import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.*; import org.apache.commons.io.IOUtils; import org.apache.http.util.TextUtils; -import org.asamk.TextSecure; +import org.asamk.Signal; import org.freedesktop.dbus.DBusConnection; import org.freedesktop.dbus.exceptions.DBusException; import org.freedesktop.dbus.exceptions.DBusExecutionException; @@ -41,8 +41,8 @@ import java.util.List; public class Main { - public static final String TEXTSECURE_BUSNAME = "org.asamk.TextSecure"; - public static final String TEXTSECURE_OBJECTPATH = "/org/asamk/TextSecure"; + public static final String SIGNAL_BUSNAME = "org.asamk.Signal"; + public static final String SIGNAL_OBJECTPATH = "/org/asamk/Signal"; public static void main(String[] args) { // Workaround for BKS truststore @@ -55,7 +55,7 @@ public class Main { final String username = ns.getString("username"); Manager m; - TextSecure ts; + Signal ts; DBusConnection dBusConn = null; try { if (ns.getBoolean("dbus") || ns.getBoolean("dbus_system")) { @@ -68,9 +68,9 @@ public class Main { busType = DBusConnection.SESSION; } dBusConn = DBusConnection.getConnection(busType); - ts = (TextSecure) dBusConn.getRemoteObject( - TEXTSECURE_BUSNAME, TEXTSECURE_OBJECTPATH, - TextSecure.class); + ts = (Signal) dBusConn.getRemoteObject( + SIGNAL_BUSNAME, SIGNAL_OBJECTPATH, + Signal.class); } catch (DBusException e) { e.printStackTrace(); if (dBusConn != null) { @@ -82,7 +82,7 @@ public class Main { } else { String settingsPath = ns.getString("config"); if (TextUtils.isEmpty(settingsPath)) { - settingsPath = System.getProperty("user.home") + "/.config/textsecure"; + settingsPath = System.getProperty("user.home") + "/.config/signal"; } m = new Manager(username, settingsPath); @@ -299,8 +299,8 @@ public class Main { busType = DBusConnection.SESSION; } conn = DBusConnection.getConnection(busType); - conn.exportObject(TEXTSECURE_OBJECTPATH, m); - conn.requestBusName(TEXTSECURE_BUSNAME); + conn.exportObject(SIGNAL_OBJECTPATH, m); + conn.requestBusName(SIGNAL_BUSNAME); } catch (DBusException e) { e.printStackTrace(); System.exit(3); @@ -353,16 +353,16 @@ public class Main { } private static Namespace parseArgs(String[] args) { - ArgumentParser parser = ArgumentParsers.newArgumentParser("textsecure-cli") + ArgumentParser parser = ArgumentParsers.newArgumentParser("signal-cli") .defaultHelp(true) - .description("Commandline interface for TextSecure.") + .description("Commandline interface for Signal.") .version(Manager.PROJECT_NAME + " " + Manager.PROJECT_VERSION); parser.addArgument("-v", "--version") .help("Show package version.") .action(Arguments.version()); parser.addArgument("--config") - .help("Set the path, where to store the config (Default: $HOME/.config/textsecure-cli)."); + .help("Set the path, where to store the config (Default: $HOME/.config/signal-cli)."); MutuallyExclusiveGroup mut = parser.addMutuallyExclusiveGroup(); mut.addArgument("-u", "--username") @@ -630,8 +630,8 @@ public class Main { if (!message.isEndSession() && !(message.getGroupInfo().isPresent() && message.getGroupInfo().get().getType() != SignalServiceGroup.Type.DELIVER)) { try { - conn.sendSignal(new TextSecure.MessageReceived( - TEXTSECURE_OBJECTPATH, + conn.sendSignal(new Signal.MessageReceived( + SIGNAL_OBJECTPATH, envelope.getSource(), message.getGroupInfo().isPresent() ? message.getGroupInfo().get().getGroupId() : new byte[0], message.getBody().isPresent() ? message.getBody().get() : "", diff --git a/src/main/java/org/asamk/textsecure/Manager.java b/src/main/java/org/asamk/signal/Manager.java similarity index 99% rename from src/main/java/org/asamk/textsecure/Manager.java rename to src/main/java/org/asamk/signal/Manager.java index 2d675170..94bb555a 100644 --- a/src/main/java/org/asamk/textsecure/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -14,7 +14,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -package org.asamk.textsecure; +package org.asamk.signal; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; @@ -23,7 +23,7 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.node.ObjectNode; -import org.asamk.TextSecure; +import org.asamk.Signal; import org.whispersystems.libsignal.*; import org.whispersystems.libsignal.ecc.Curve; import org.whispersystems.libsignal.ecc.ECKeyPair; @@ -52,8 +52,8 @@ import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -class Manager implements TextSecure { - private final static String URL = "https://SignalService-service.whispersystems.org"; +class Manager implements Signal { + private final static String URL = "https://textsecure-service.whispersystems.org"; private final static TrustStore TRUST_STORE = new WhisperTrustStore(); public final static String PROJECT_NAME = Manager.class.getPackage().getImplementationTitle(); diff --git a/src/main/java/org/asamk/textsecure/Util.java b/src/main/java/org/asamk/signal/Util.java similarity index 95% rename from src/main/java/org/asamk/textsecure/Util.java rename to src/main/java/org/asamk/signal/Util.java index 7cbc851e..66a08731 100644 --- a/src/main/java/org/asamk/textsecure/Util.java +++ b/src/main/java/org/asamk/signal/Util.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; diff --git a/src/main/java/org/asamk/textsecure/WhisperTrustStore.java b/src/main/java/org/asamk/signal/WhisperTrustStore.java similarity index 92% rename from src/main/java/org/asamk/textsecure/WhisperTrustStore.java rename to src/main/java/org/asamk/signal/WhisperTrustStore.java index 1f129c5a..e9468c2e 100644 --- a/src/main/java/org/asamk/textsecure/WhisperTrustStore.java +++ b/src/main/java/org/asamk/signal/WhisperTrustStore.java @@ -1,4 +1,4 @@ -package org.asamk.textsecure; +package org.asamk.signal; import org.whispersystems.signalservice.api.push.TrustStore; diff --git a/src/main/resources/org/asamk/textsecure/whisper.store b/src/main/resources/org/asamk/signal/whisper.store similarity index 100% rename from src/main/resources/org/asamk/textsecure/whisper.store rename to src/main/resources/org/asamk/signal/whisper.store -- 2.51.0 From 95278a95ce4cb52b0f4c42f79a8939b413c9eed1 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 27 Mar 2016 14:02:28 +0200 Subject: [PATCH 14/16] Use the old config directory .config/textsecure as fallback --- README.md | 4 ++++ src/main/java/org/asamk/signal/Main.java | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index f951669d..e2a3145e 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,10 @@ The password and cryptographic keys are created when registering and stored in t $HOME/.config/signal/data/ +For legacy users, the old config directory is used as a fallback: + + $HOME/.config/textsecure/data/ + ## Building This project uses [Gradle](http://gradle.org) for building and maintaining diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index a4e50bb4..5d6e419b 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -83,6 +83,12 @@ public class Main { String settingsPath = ns.getString("config"); if (TextUtils.isEmpty(settingsPath)) { settingsPath = System.getProperty("user.home") + "/.config/signal"; + if (!new File(settingsPath).exists()) { + String legacySettingsPath = System.getProperty("user.home") + "/.config/textsecure"; + if (new File(legacySettingsPath).exists()) { + settingsPath = legacySettingsPath; + } + } } m = new Manager(username, settingsPath); -- 2.51.0 From 900b648f09fa1a1c6e2d35df94c5a9d75286af01 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 27 Mar 2016 16:15:49 +0200 Subject: [PATCH 15/16] Refresh prekeys if there are less than 20 left on the server --- src/main/java/org/asamk/signal/Manager.java | 25 +++++++++++++-------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/asamk/signal/Manager.java b/src/main/java/org/asamk/signal/Manager.java index 94bb555a..a4a9c37a 100644 --- a/src/main/java/org/asamk/signal/Manager.java +++ b/src/main/java/org/asamk/signal/Manager.java @@ -60,6 +60,9 @@ class Manager implements Signal { public final static String PROJECT_VERSION = Manager.class.getPackage().getImplementationVersion(); private final static String USER_AGENT = PROJECT_NAME + " " + PROJECT_VERSION; + private final static int PREKEY_MINIMUM_COUNT = 20; + private static final int PREKEY_BATCH_SIZE = 100; + private final String settingsPath; private final String dataPath; private final String attachmentsPath; @@ -140,6 +143,10 @@ class Manager implements Signal { groupStore = new JsonGroupStore(); } accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, USER_AGENT); + if (accountManager.getPreKeysCount() < PREKEY_MINIMUM_COUNT) { + refreshPreKeys(); + save(); + } } private void save() { @@ -187,12 +194,10 @@ class Manager implements Signal { save(); } - private static final int BATCH_SIZE = 100; - private List generatePreKeys() { List records = new LinkedList<>(); - for (int i = 0; i < BATCH_SIZE; i++) { + for (int i = 0; i < PREKEY_BATCH_SIZE; i++) { int preKeyId = (preKeyIdOffset + i) % Medium.MAX_VALUE; ECKeyPair keyPair = Curve.generateKeyPair(); PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair); @@ -201,13 +206,13 @@ class Manager implements Signal { records.add(record); } - preKeyIdOffset = (preKeyIdOffset + BATCH_SIZE + 1) % Medium.MAX_VALUE; + preKeyIdOffset = (preKeyIdOffset + PREKEY_BATCH_SIZE + 1) % Medium.MAX_VALUE; save(); return records; } - private PreKeyRecord generateLastResortPreKey() { + private PreKeyRecord getOrGenerateLastResortPreKey() { if (signalProtocolStore.containsPreKey(Medium.MAX_VALUE)) { try { return signalProtocolStore.loadPreKey(Medium.MAX_VALUE); @@ -249,14 +254,16 @@ class Manager implements Signal { //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID))); registered = true; - List oneTimePreKeys = generatePreKeys(); - - PreKeyRecord lastResortKey = generateLastResortPreKey(); + refreshPreKeys(); + save(); + } + private void refreshPreKeys() throws IOException { + List oneTimePreKeys = generatePreKeys(); + PreKeyRecord lastResortKey = getOrGenerateLastResortPreKey(); SignedPreKeyRecord signedPreKeyRecord = generateSignedPreKey(signalProtocolStore.getIdentityKeyPair()); accountManager.setPreKeys(signalProtocolStore.getIdentityKeyPair().getPublicKey(), lastResortKey, signedPreKeyRecord, oneTimePreKeys); - save(); } -- 2.51.0 From cc0177da108ca7edd2731baaffdacad98f6e7364 Mon Sep 17 00:00:00 2001 From: AsamK Date: Sun, 27 Mar 2016 16:49:20 +0200 Subject: [PATCH 16/16] Show source deviceId and relay, when receiving messages --- src/main/java/org/asamk/signal/Main.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index 5d6e419b..076d3cc5 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -28,6 +28,7 @@ import org.freedesktop.dbus.exceptions.DBusExecutionException; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; import org.whispersystems.signalservice.api.messages.*; import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage; +import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException; import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; @@ -493,7 +494,11 @@ public class Main { @Override public void handleMessage(SignalServiceEnvelope envelope, SignalServiceContent content, GroupInfo group) { - System.out.println("Envelope from: " + envelope.getSource()); + SignalServiceAddress source = envelope.getSourceAddress(); + System.out.println(String.format("Envelope from: %s (device: %d)", source.getNumber(), envelope.getSourceDevice())); + if (source.getRelay().isPresent()) { + System.out.println("Relayed by: " + source.getRelay().get()); + } System.out.println("Timestamp: " + envelope.getTimestamp()); if (envelope.isReceipt()) { -- 2.51.0