2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-16 04:36:02 +00:00

50_Signalbot: Trust handling, Chat history

git-svn-id: https://svn.fhem.de/fhem/trunk@27833 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
Adimarantis 2023-08-11 06:55:16 +00:00
parent a66bb6db9d
commit 7e9a0bc0d4
3 changed files with 277 additions and 41 deletions

View File

@ -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

View File

@ -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 [@<Recipient1> ... @<RecipientN>] [#<GroupId1> ... #<GroupIdN>] [&<Attachment1> ... &<AttachmentN>] [<Text>]" 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/ /&nbsp;/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/ /&nbsp;/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 href=\"$qr_url\"><img src=\"$qr_url\"><\/a><br>";
} 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 &nbsp
$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.="<b>$name</b> (".strftime("%d-%m-%Y %H:%M", localtime)."): $message\n";
my $line_count =()= $text =~ m/<b>/g;
while ($line_count>20) {
$text=~s/<b>.*?<b>//ms;
$text="<b>".$text; #restore <b> that was removed before
$line_count =()= $text =~ m/<b>/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 <a href="https://wiki.fhem.de/wiki/Signalbot">Wiki<
<li>block/unblock &ltcontact&gt : block/unblock receiving messages from contact</li>
</ul>
</li>
<li><b>set trust &ltnumber|all&gt</b><br>
<a id="Signalbot-set-trust"></a>
Set the unverified trust for a number. Specifying all will set it for all known contacts<br>
</li>
<li><b>set trustVerified &ltnumber&gt &ltsafetynumber&gt</b><br>
<a id="Signalbot-set-trustVerified"></a>
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.<br>
</li>
<br>
</ul>
@ -2663,10 +2884,15 @@ For German documentation see <a href="https://wiki.fhem.de/wiki/Signalbot">Wiki<
Opens a cheat sheet for all supported replacements to format text or add emoticons using html-like tags or markdown.<br>
<b>Note:</b> This functionality needs to be enabled using the "formatting" attribute.<br>
</li>
<li><b>get groupPropertiese &ltgroup&gt</b><br>
<a id="Signalbot-get-groupPropertiese"></a>
<li><b>get groupProperties &ltgroup&gt</b><br>
<a id="Signalbot-get-groupProperties"></a>
Shows all known properties of the given group, like members, admins and permissions.
</li>
<li><b>get identityDetails &ltgroup&gt</b><br>
<a id="Signalbot-get-identityDetails"></a>
Shows all known details of a contacts identity.<br>
This includes the safetynumber for verification purposes.
</li>
<br>
</ul>
@ -2688,6 +2914,10 @@ For German documentation see <a href="https://wiki.fhem.de/wiki/Signalbot">Wiki<
<a id="Signalbot-attr-authDev"></a>
Name of GoogleAuth device. Will normally be automatically filled when setting an authTimeout or cmdKeyword if a GoogleAuth device is already existing.<br>
</li>
<li><b>authTrusted yes|no</b><br>
<a id="Signalbot-attr-authTrusted"></a>
Do not require GoogleAuth for TRUSTED_VERIFIED contacts (see "set trustedVerified") if set to "yes".<br>
</li>
<li><b>autoJoin no|yes</b><br>
<a id="Signalbot-attr-autoJoin"></a>
If set to yes, Signalbot will automatically inspect incoming messages for group invite links and join that group.<br>

View File

@ -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