From 7e9a0bc0d417bc64ff72768a7ebb2b0c5d6f1476 Mon Sep 17 00:00:00 2001 From: Adimarantis <> Date: Fri, 11 Aug 2023 06:55:16 +0000 Subject: [PATCH] 50_Signalbot: Trust handling, Chat history git-svn-id: https://svn.fhem.de/fhem/trunk@27833 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/50_Signalbot.pm | 304 ++++++++++++++++++++++---- fhem/contrib/signal/signal_install.sh | 13 +- 3 files changed, 277 insertions(+), 41 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 486f6e6c1..c481e0255 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 50_Signalbot: Trust handling, Chat history - change: 74_AutomowerConnect: Common.pm pervent JSON decoding error if more than one complete JSON string is in DevIo buffer, addPositionPolling is only settable if addPollingMinInterval > 0 diff --git a/fhem/FHEM/50_Signalbot.pm b/fhem/FHEM/50_Signalbot.pm index 669b3fa41..e294037ad 100755 --- a/fhem/FHEM/50_Signalbot.pm +++ b/fhem/FHEM/50_Signalbot.pm @@ -1,6 +1,6 @@ ############################################## #$Id$ -my $Signalbot_VERSION="3.13"; +my $Signalbot_VERSION="3.15"; # Simple Interface to Signal CLI running as Dbus service # Author: Adimarantis # License: GPL @@ -23,6 +23,7 @@ use Encode; use Time::HiRes qw( usleep ); use URI::Escape; use HttpUtils; +use MIME::Base64; eval "use Protocol::DBus;1"; eval "use Protocol::DBus::Client;1" or my $DBus_missing = "yes"; @@ -63,8 +64,10 @@ use vars qw($FW_wname); "setPin" => "s", #V0.10.0 "removePin" => "", #V0.10.0 "getGroup" => "ay", #V0.10.0 + "getIdentity" => "s", #V0.12.0 "addDevice" => "s", "listDevices" => "", + "listIdentities" => "", #V0.12.0 "unregister" => "", "sendEndSessionMessage" => "as", #unused "sendRemoteDeleteMessage" => "xas", #unused @@ -83,6 +86,12 @@ use vars qw($FW_wname); "removeAdmins" => "as", ); +my %identitysignatures = ( + #methods in the "Identities" object from V0.11.12 + "trust" => "", + "trustVerified" => "s", +); + #dbus interfaces that only exist in registration mode my %regsig = ( "listAccounts" => "", @@ -115,6 +124,7 @@ sub Signalbot_Initialize($) { $hash->{createGroup} = "Signalbot_UpdateGroup_cb"; $hash->{joinGroup} = "Signalbot_UpdateGroup_cb"; $hash->{listNumbers} = "Signalbot_ListNumbers_cb"; + $hash->{listIdentities} = "Signalbot_ListIdentities_cb"; $hash->{AttrList} = "IODev do_not_notify:1,0 ignore:1,0 showtime:1,0 ". "defaultPeer: ". "allowedPeer ". @@ -123,6 +133,7 @@ sub Signalbot_Initialize($) { "babbleExclude ". "authTimeout ". "authDev ". + "authTrusted:yes,no ". "cmdKeyword ". "cmdFavorite ". "favorites:textField-long ". @@ -181,6 +192,22 @@ sub Signalbot_Set($@) { # "updateGroup:textField ". "quitGroup:textField ". "joinGroup:textField " if $version <1000; + if ($version>=1200) { + my $ident_t=""; + my $idcnt_t=1; + my $ident_u=""; + foreach my $ids (keys %{$hash->{helper}{identities}}) { + if ($hash->{helper}{identities}{$ids}{TrustLevel} ne "TRUSTED_VERIFIED") { + $ident_t.= ",".$ids; + $idcnt_t++; + } + if ($hash->{helper}{identities}{$ids}{TrustLevel} eq "UNTRUSTED") { + $ident_u.= ",".$ids; + } + } + $sets.= "trustVerified:widgetList,".$idcnt_t.",select".$ident_t.",1,textField "; + $sets.= "trust:all".$ident_u." "; + } $sets.= "group:widgetList,13,select,addMembers,removeMembers,addAdmins,removeAdmins,invite,". "create,delete,block,unblock,update,". "quit,join,1,textField contact:widgetList,5,select,add,delete,block,unblock,1,textField " if $version >=1000; @@ -200,10 +227,6 @@ sub Signalbot_Set($@) { # # Works always if ( $cmd eq "reinit") { - $hash->{helper}{qr}=undef; - $hash->{helper}{register}=undef; - $hash->{helper}{verification}=undef; - $hash->{helper}{captcha}=undef; my $ret = Signalbot_setup($hash); $hash->{STATE} = $ret if defined $ret; Signalbot_createRegfiles($hash); @@ -230,9 +253,6 @@ sub Signalbot_Set($@) { # my $ret = Signalbot_setAccount($hash, $number); # undef is success if (!defined $ret) { - $hash->{helper}{qr}=undef; - $hash->{helper}{register}=undef; - $hash->{helper}{verification}=undef; $ret=Signalbot_setup($hash); $hash->{STATE} = $ret if defined $ret; return undef; @@ -270,10 +290,6 @@ sub Signalbot_Set($@) { # #delete account and do a reinit Signalbot_disconnect($hash); readingsSingleUpdate($hash, 'account', "none", 0); - $hash->{helper}{qr}=undef; - $hash->{helper}{register}=undef; - $hash->{helper}{verification}=undef; - $hash->{helper}{captcha}=undef; $ret = Signalbot_setup($hash); $hash->{STATE} = $ret if defined $ret; Signalbot_createRegfiles($hash); @@ -441,6 +457,15 @@ sub Signalbot_Set($@) { # return $ret if defined $ret; } return undef; + } elsif ( $cmd eq "trust" ) { + my $number = shift @args; + return "not implemented" if $number eq "all"; + my $ret=Signalbot_CallSI($hash,"trust",$number); + return $ret; + } elsif ( $cmd eq "trustVerified") { + my @cm = split(",",$args[0]); + my $ret=Signalbot_CallSI($hash,"trustVerified",$cm[0],$cm[1]); + return $ret; } elsif ( $cmd eq "send" || $cmd eq "reply" || $cmd eq "msg") { return "Usage: set ".$hash->{NAME}." send [@ ... @] [# ... #] [& ... &] []" if ( @args==0); @@ -539,6 +564,7 @@ sub Signalbot_prepareSend($@) { return "Specify either a message text or an attachment" if((@attachments==0) && (@args==0)); $message = join(" ", @args); + my @orgatt=@attachments; if (@attachments>0) { #create copy in /tmp to mitigate incomplete files and relative paths in fhem my @newatt; @@ -570,11 +596,15 @@ sub Signalbot_prepareSend($@) { #Send message to individuals (bulk) if (@recipients > 0) { $ret=Signalbot_sendMessage($hash,join(",",@recipients),join(",",@attachments),$message); + foreach my $sender (@recipients) { + Signalbot_AddToChat($hash,"Me",$sender,"",$message.(@attachments>0?"(".join(",",@orgatt).")":"")); + } } if (@groups > 0) { #Send message to groups (one at time) while(my $currgroup = shift @groups){ $ret=Signalbot_sendGroupMessage($hash,$currgroup,join(",",@attachments),$message); + Signalbot_AddToChat($hash,"Me","",$currgroup,$message.(@attachments>0?"(".join(",",@orgatt).")":"")); } } #Remember temp files @@ -603,7 +633,46 @@ sub Signalbot_Get($@) { my $gets="favorites:noArg accounts:noArg helpUnicode:noArg "; $gets.="contacts:all,nonblocked ". "groups:all,active,nonblocked devices:noArg " if $account ne "none"; - $gets .="groupProperties:textField " if $version >= 1000; + + my $chat_t=""; + my $chat_cnt=0; + foreach my $chat (keys %{$hash->{helper}{chat}}) { + $chat_t.="," if $chat_cnt>0; + $chat_t.=$chat; + $chat_cnt++; + } + if ($chat_cnt>0) { + $chat_t=~s/ / /g; + $gets.= "chat:".($chat_cnt<20?$chat_t:"textField")." "; + } + + my $group_t=""; + my $grcnt_t=0; + foreach my $group (keys %{$hash->{helper}{groups}}) { + $group_t.="," if $grcnt_t>0; + $group_t.=$hash->{helper}{groups}{$group}{name}; + $grcnt_t++; + } + if ($grcnt_t>0) { + $group_t=~s/ / /g; + $gets.= "groupProperties:".($grcnt_t<20?$group_t:"textField")." "; + } + if ($version>=1200) { + my $ident_t=""; + my $idcnt_t=0; + foreach my $number (keys %{$hash->{helper}{identities}}) { + $ident_t.="," if $idcnt_t>0; + $ident_t.= $number; + if (exists $hash->{helper}{contacts}{$number}) { + my $cname=$hash->{helper}{contacts}{$number} ne ""?$hash->{helper}{contacts}{$number}:"Unknown"; + $ident_t.="($cname)"; + } + $idcnt_t++; + } + + $ident_t=~s/ /_/g; + $gets.= "identityDetails:".($idcnt_t<20?$ident_t:"textField")." "; + } return "Signalbot_Get: Unknown argument $cmd, choose one of ".$gets; } @@ -632,6 +701,55 @@ sub Signalbot_Get($@) { $str.=sprintf("%2i %s\n",$devid,$devname); } return $str; + } elsif ($cmd eq "identityDetails") { + $arg=~/(^.*)(\(.*\)$)/; + my $number; + if ($1) { + $number=$1; + } else { + $number=$arg; + } + my $str="Details for $number\n\n"; + if ($number =~ /^\+[1-9][0-9]{5,}$/) { + my $contact=Signalbot_getContactName($hash,$number); + my $path=Signalbot_getIdentityPath($hash,$number); + return "Unknown identity ".$number if !defined $path; + my $ret=Signalbot_getIdentityProperties($hash,$path); + if (defined $ret) { + my %props=%$ret; + $str.="Contact Name :".$contact."\n"; + $str.="Trust Level :".$props{TrustLevel}."\n"; + $str.="Safety Number :".$props{SafetyNumber}."\n"; + #Don't display as it is very long and not sure what it's used for anyway + my $fp=$props{Fingerprint}; + #$str.="Fingerprint :".join(" ",@$fp)."\n"; + $str.="Added date :". strftime("%d-%m-%Y %H:%M:%S", localtime($props{AddedDate}/1000))."\n"; + my $sf=$props{ScannableSafetyNumber}; + my $cstr=pack("C*",@$sf); + my $fn=Signalbot_copyToFile($cstr,"dat"); + unlink "www/signal/qr.png"; + my $ret=qx(qrencode -r $fn -o www/signal/qr.png); + unlink $fn; + if (-e "www/signal/qr.png") { + $str.="Scannable Safety Number to validate FHEM from Mobile:\n"; + my $qr_url .= "fhem/signal/qr.png?".gettimeofday(); #adding timestamp to prevent image caching by the browser + $str .= "<\/a>
"; + } else { + $str.="Could not generate QR Code. Check if qrencode is installed.\n".$ret."\n"; + } + } + } + return $str; + } elsif ($cmd eq "chat") { + my $ret=""; + my $chat=$hash->{helper}{chat}{$arg}; + if (defined $chat) { + $ret.="Chat history with $arg\n\n"; + $ret.=$chat; + } else { + $ret="No chat history with $arg"; + } + return $ret; } elsif ($cmd eq "favorites") { my $favs = AttrVal($name,"favorites",""); $favs =~ s/[\n\r]//g; @@ -712,6 +830,8 @@ sub Signalbot_Get($@) { return $ret; } elsif ($cmd eq "groupProperties") { return if $version<1000; + $arg=decode_utf8($arg); #required to fully replace   + $arg=~s/$&\x{00a0}/ /g; #Restore normal spaces my $ret=Signalbot_getGroupProperties($hash,$arg); return "Error:".$hash->{helper}{lasterr} if !defined $ret; my %props=%$ret; @@ -754,38 +874,48 @@ sub Signalbot_command($@){ return $message if $timeout==0; my $cmd=AttrVal($hash->{NAME},"cmdKeyword",undef); return $message unless defined $cmd; + my $trust=0; + if (exists $hash->{helper}{identities}{$sender} and exists $hash->{helper}{identities}{$sender}{TrustLevel} and + $hash->{helper}{identities}{$sender}{TrustLevel} eq "TRUSTED_VERIFIED" and AttrVal($hash->{NAME},"authTrusted","no") eq "yes") { + $trust=1; + LogUnicode $hash->{NAME}, 5, $hash->{NAME}.": $sender is trusted"; + } else { + LogUnicode $hash->{NAME}, 5, $hash->{NAME}.": $sender is not trusted"; + } my @arr=(); if ($message =~ /^$cmd(.*)/) { $cmd=$1; LogUnicode $hash->{NAME}, 5, $hash->{NAME}.": Command received:$cmd"; my $device=AttrVal($hash->{NAME},"authDev",undef); - if (!defined $device) { + if (!defined $device and $trust==0) { readingsSingleUpdate($hash, 'lastError', "Missing GoogleAuth device in authDev to execute remote command",1); return $message; } my @cc=split(" ",$cmd); if ($cc[0] =~ /^\d+$/) { - #This could be a token - my $token=shift @cc; my $restcmd=join(" ",@cc); - my $ret = gAuth($device,$token); - if ($ret == 1) { - LogUnicode $hash->{NAME}, 5, $hash->{NAME}.": Token valid for sender $sender for $timeout seconds"; - $hash->{helper}{auth}{$sender}=1; - #Remove potential old timer so countdown start from scratch - RemoveInternalTimer("$hash->{NAME} $sender"); - InternalTimer(gettimeofday() + $timeout, 'Signalbot_authTimeout', "$hash->{NAME} $sender", 0); - Signalbot_sendMessage($hash,$sender,"","You have control for ".$timeout."s"); - $cmd=$restcmd; - } else { - LogUnicode $hash->{NAME}, 3, $hash->{NAME}.": Invalid token sent by $sender"; - $hash->{helper}{auth}{$sender}=0; - Signalbot_sendMessage($hash,$sender,"","Invalid token"); - LogUnicode $hash->{NAME}, 2, $hash->{NAME}.": Invalid token sent by $sender:$message"; - return $cmd; + if ($trust == 0) { + #This could be a token + my $token=shift @cc; + my $ret = gAuth($device,$token); + if ($ret == 1) { + LogUnicode $hash->{NAME}, 5, $hash->{NAME}.": Token valid for sender $sender for $timeout seconds"; + $hash->{helper}{auth}{$sender}=1; + #Remove potential old timer so countdown start from scratch + RemoveInternalTimer("$hash->{NAME} $sender"); + InternalTimer(gettimeofday() + $timeout, 'Signalbot_authTimeout', "$hash->{NAME} $sender", 0); + Signalbot_sendMessage($hash,$sender,"","You have control for ".$timeout."s"); + $cmd=$restcmd; + } else { + LogUnicode $hash->{NAME}, 3, $hash->{NAME}.": Invalid token sent by $sender"; + $hash->{helper}{auth}{$sender}=0; + Signalbot_sendMessage($hash,$sender,"","Invalid token"); + LogUnicode $hash->{NAME}, 2, $hash->{NAME}.": Invalid token sent by $sender:$message"; + return $cmd; + } } } - my $auth=0; + my $auth=$trust; if (defined $hash->{helper}{auth}{$sender} && $hash->{helper}{auth}{$sender}==1) { $auth=1; } @@ -992,6 +1122,8 @@ sub Signalbot_MessageReceived ($@) { readingsBulkUpdate($hash, "msgText", $message); readingsBulkUpdate($hash, "msgSender", $sender); readingsBulkUpdate($hash, "msgGroupName", $group); + Signalbot_AddToChat($hash,$sender,$sender,$group,$message); + #Check if for command execution my $auth=0; if (defined $hash->{helper}{auth}{$source}) { $auth=$hash->{helper}{auth}{$source}; } @@ -1031,6 +1163,25 @@ sub Signalbot_MessageReceived ($@) { } } +sub Signalbot_AddToChat($$$$$) { + my ($hash,$name,$sender,$group,$message) = @_; + $group=~s/#//g; + $group=~s/ /_/g; + $sender=~s/ /_/g; + print "$group:$sender:\n"; + my $index=$sender; + $index="+".$group if $group ne ""; + my $text=$hash->{helper}{chat}{$index}; + $text.="$name (".strftime("%d-%m-%Y %H:%M", localtime)."): $message\n"; + my $line_count =()= $text =~ m//g; + while ($line_count>20) { + $text=~s/.*?//ms; + $text="".$text; #restore that was removed before + $line_count =()= $text =~ m//g; + } + $hash->{helper}{chat}{$index}=$text; +} + sub Signalbot_ReceiptReceived { my ($hash, $timestamp, $source) = @_; LogUnicode $hash->{NAME}, 5, $hash->{NAME}.": Signalbot_receive_callback $timestamp $source "; @@ -1099,7 +1250,13 @@ sub Signalbot_setup($@){ } #Clear error on init to avoid confusion with old erros readingsSingleUpdate($hash, 'lastError', "ok",0); - delete $hash->{helper}{contacts}; + $hash->{helper}{contacts}=undef; + $hash->{helper}{qr}=undef; + $hash->{helper}{register}=undef; + $hash->{helper}{verification}=undef; + $hash->{helper}{captcha}=undef; + $hash->{helper}{chat}=undef; + my $dbus = Protocol::DBus::Client::system(); if (!defined $dbus) { Log3 $name, 3, $hash->{NAME}.": Error while initializing Dbus"; @@ -1141,6 +1298,7 @@ sub Signalbot_setup2($@) { } if (!$dbus->initialize()) { $dbus->init_pending_send(); return; } $hash->{helper}{init}=1; + delete $hash->{helper}{identities}; #Restore contactlist into internal hash my $clist=ReadingsVal($hash->{NAME}, "contactList",undef); @@ -1214,6 +1372,7 @@ sub Signalbot_setup2($@) { #-u Mode or already registered if ($num<0 || $account ne "none") { Signalbot_CallA($hash,"listNumbers"); + Signalbot_CallA($hash,"listIdentities") if $version>=1200; #Might make sense to call refreshGroups here, however, that is a sync call and might potentially take longer, so maybe no good idea in startup readingsBeginUpdate($hash); readingsBulkUpdate($hash, 'account', $account) if defined $account; @@ -1247,6 +1406,25 @@ sub Signalbot_ListNumbers_cb($@) { } } +#Async Callback after getting list of Numbers, results will also be filled asynchronous +sub Signalbot_ListIdentities_cb($@) { + my ($hash,$rec) = @_; + return if !defined $rec or $rec ==0; + foreach my $ident (@$rec) { + my ($idpath,$uuid,$number)=@$ident; + #Only for valid numbers - ignore numbers that only have uuids to avoid an error + if ($number =~ /^\+[1-9][0-9]{5,}$/) { + my $ret=Signalbot_getIdentityProperties($hash,$idpath); + if (defined $ret) { + my %props=%$ret; + my $level=$props{TrustLevel}; + $hash->{helper}{identities}{$number}{TrustLevel}=$props{TrustLevel}; + $hash->{helper}{identities}{$number}{SafetyNumber}=$props{SafetyNumber}; + } + } + } +} + #async sub Signalbot_CallA($@) { my ($hash,$function,@args) = @_; @@ -1278,6 +1456,17 @@ sub Signalbot_CallSG($@) { return Signalbot_CallDbus($hash,1,$path,$function,$prototype,'org.asamk.Signal',@args); } +#sync, identity +sub Signalbot_CallSI($@) { + my ($hash,$function,$identity,@args) = @_; + print "Calling $function for $identity with"; + my $prototype=$identitysignatures{$function}; + my $path=Signalbot_getIdentityPath($hash,$identity); + return if !defined $path; + LogUnicode $hash->{NAME}, 5, $hash->{NAME}.": Calling $function($prototype) $path Args:$args[0]"; + return Signalbot_CallDbus($hash,1,$path,$function,$prototype,'org.asamk.Signal',@args); +} + #all group properties sub Signalbot_getGroupProperties($@) { my ($hash,$group) = @_; @@ -1287,6 +1476,14 @@ sub Signalbot_getGroupProperties($@) { return Signalbot_CallDbus($hash,1,$path,'GetAll',$prototype,'org.freedesktop.DBus.Properties','org.asamk.Signal.Group'); } +#all identity properties by path +sub Signalbot_getIdentityProperties($@) { + my ($hash,$path) = @_; + my $prototype="s"; + return if !defined $path; + return Signalbot_CallDbus($hash,1,$path,'GetAll',$prototype,'org.freedesktop.DBus.Properties','org.asamk.Signal.Identity'); +} + sub Signalbot_removeDevice($@) { my ($hash,$devid) = @_; return "DeviceID needs to be numeric" if (!looks_like_number($devid)); @@ -1326,9 +1523,9 @@ sub Signalbot_CallDbus($@) { ) ->then ( sub () { $got_response = 1; return if $sync; # Synchronous mode, handling of return data in main loop - #Only for asynchronous case: my $msg = shift; + my $sig = $msg->get_header('SIGNATURE'); if (!defined $sig) { #Empty signature is probably a reply from a function without return data, nothing to do @@ -1350,6 +1547,10 @@ sub Signalbot_CallDbus($@) { readingsSingleUpdate($hash, 'lastError', $hash->{helper}{lasterr},1); return; } + + if (!(ref $msg eq ref {})) { + return; + } my $sig = $msg->get_header('SIGNATURE'); if (!defined $sig) { $hash->{helper}{lasterr}="Error in $function: message without signature"; @@ -1370,7 +1571,6 @@ sub Signalbot_CallDbus($@) { while ($counter>0) { $dbus->blocking(1); my $msg=$dbus->get_message(); - #print Dumper($msg); if (defined $msg) { my $sig = $msg->get_header('SIGNATURE'); if (!defined $sig) { @@ -1413,6 +1613,18 @@ sub Signalbot_getGroupPath($@) { return $path } +sub Signalbot_getIdentityPath($@) { + my ($hash,$identity) = @_; + my $path=Signalbot_CallS($hash,"getIdentity",$identity); + return if !defined $path; + LogUnicode $hash->{NAME}, 5, $hash->{NAME}.": Identity Dbus Path=".$path; + if (! ($path =~ /^\//)) { + $hash->{helper}{lasterr}=$path; + return undef; + } + return $path +} + sub Signalbot_Read($@){ my ($hash) = @_; if (!defined $hash->{helper}{init}) { Signalbot_setup2($hash); return;}; @@ -2630,6 +2842,15 @@ For German documentation see
Wiki<
  • block/unblock <contact> : block/unblock receiving messages from contact
  • +
  • set trust <number|all>
    +
    + Set the unverified trust for a number. Specifying all will set it for all known contacts
    +
  • +
  • set trustVerified <number> <safetynumber>
    + + Set the verified trust for a number. You can get the safetynumber via "get identityDetails" though the safest way is to ask your contact to send you + the number via a safe channel and use that one.
    +

  • @@ -2663,10 +2884,15 @@ For German documentation see Wiki< Opens a cheat sheet for all supported replacements to format text or add emoticons using html-like tags or markdown.
    Note: This functionality needs to be enabled using the "formatting" attribute.
    -
  • get groupPropertiese <group>
    -
    +
  • get groupProperties <group>
    + Shows all known properties of the given group, like members, admins and permissions.
  • +
  • get identityDetails <group>
    + + Shows all known details of a contacts identity.
    + This includes the safetynumber for verification purposes. +

  • @@ -2688,6 +2914,10 @@ For German documentation see Wiki< Name of GoogleAuth device. Will normally be automatically filled when setting an authTimeout or cmdKeyword if a GoogleAuth device is already existing.
    +
  • authTrusted yes|no
    + + Do not require GoogleAuth for TRUSTED_VERIFIED contacts (see "set trustedVerified") if set to "yes".
    +
  • autoJoin no|yes
    If set to yes, Signalbot will automatically inspect incoming messages for group invite links and join that group.
    diff --git a/fhem/contrib/signal/signal_install.sh b/fhem/contrib/signal/signal_install.sh index 8f7756bba..173ca349e 100755 --- a/fhem/contrib/signal/signal_install.sh +++ b/fhem/contrib/signal/signal_install.sh @@ -1,14 +1,17 @@ #!/bin/bash #$Id:$ -SCRIPTVERSION="3.16" +SCRIPTVERSION="3.18" # Author: Adimarantis # License: GPL #Install script for signal-cli SIGNALPATH=/opt SIGNALUSER=signal-cli LIBPATH=/usr/lib -SIGNALVERSION="0.11.10" -LIBRARYVERSION="0.23.1" +SIGNALVERSION="0.12.0" +#Check for latest valid version at https://github.com/AsamK/signal-cli/releases +LIBRARYVERSION="0.30.0" +#Check for latest valid version at https://github.com/exquo/signal-libs-build/releases +#Make sure this matches the required version for signal-cli (see lib/libsignal-client-0.xx.x.jar version in signal-cli) LIBSIG=libsignal_jni.tgz SIGNALVAR=/var/lib/$SIGNALUSER DBSYSTEMD=/etc/dbus-1/system.d @@ -245,6 +248,8 @@ install_and_check diff diffutils install_and_check dbus-send dbus install_and_check cpan cpanminus install_and_check zip zip +install_and_check qrencode + if [ -z "$BASH" ]; then echo "This script requires bash for some functions. Check if bash is installed." install_and_check bash bash @@ -410,7 +415,7 @@ if [ $NEEDINSTALL = 1 ]; then fi echo "done" rm -f /tmp/signal-cli-$SIGNALVERSION.tar.gz - #rm -f /tmp/$LIBSIG + rm -f /tmp/$LIBSIG fi fi