diff --git a/app/Roster.php b/app/Roster.php index f7c86e8f2..b75ecea63 100644 --- a/app/Roster.php +++ b/app/Roster.php @@ -15,6 +15,15 @@ class Roster extends Model 'session_id' => SESSION_ID ]; + public function save(array $options = []) + { + try { + parent::save($options); + } catch (\Exception $e) { + \Utils::error($e->getMessage()); + } + } + public function session() { return $this->hasOne('App\Session'); diff --git a/app/widgets/Chat/Chat.php b/app/widgets/Chat/Chat.php index a18794654..f6950caa0 100644 --- a/app/widgets/Chat/Chat.php +++ b/app/widgets/Chat/Chat.php @@ -411,8 +411,6 @@ class Chat extends \Movim\Widget\Base // OMEMO if ($conference->isGroupChat()) { - $sessions = []; - $this->rpc('Chat.setGroupChatMembers', $conference->members->pluck('jid')->toArray()); $this->rpc( 'Chat.setBundlesIds', diff --git a/app/widgets/ContactActions/_contactactions_drawer_fingerprints.tpl b/app/widgets/ContactActions/_contactactions_drawer_fingerprints.tpl index 61fae0faf..3283ee80c 100644 --- a/app/widgets/ContactActions/_contactactions_drawer_fingerprints.tpl +++ b/app/widgets/ContactActions/_contactactions_drawer_fingerprints.tpl @@ -8,7 +8,7 @@ {loop="$fingerprints"}
  • - + fingerprint @@ -16,10 +16,10 @@ - +
    diff --git a/app/widgets/ContactActions/contactactions.js b/app/widgets/ContactActions/contactactions.js index 8a678fb8d..a4f321bec 100644 --- a/app/widgets/ContactActions/contactactions.js +++ b/app/widgets/ContactActions/contactactions.js @@ -13,19 +13,19 @@ var ContactActions = { button.remove(); ContactActions_ajaxHttpGetLinks(jid, page); }, - resolveSessionsStates : function(jid) { + resolveSessionsStates : function(jid, room = false) { var store = new ChatOmemoStorage(); store.getSessionsIds(jid).map(id => { store.getSessionState(jid + '.' + id).then(state => { if (state) { - let icon = document.querySelector('span#sessionicon_' + id); + let icon = document.querySelector('span#sessionicon_' + MovimUtils.cleanupId(jid) + '_' + id); if (icon) { icon.classList.remove('blue'); icon.classList.add('blue'); } - let checkbox = document.querySelector('input[name=sessionstate_' + id + ']'); + let checkbox = document.querySelector('input[name=sessionstate_' + MovimUtils.cleanupId(jid) + '_'+ id + ']'); if (checkbox) { checkbox.checked = true; @@ -34,11 +34,13 @@ var ContactActions = { }) }); - store.getContactState(jid).then(enabled => { - if (!enabled) { - document.querySelector('#omemo_fingerprints ul.list').classList.add('disabled'); - } - }); + if (room == false) { + store.getContactState(jid).then(enabled => { + if (!enabled) { + document.querySelector('#omemo_fingerprints ul.list').classList.add('disabled'); + } + }); + } }, toggleFingerprintState : function(checkbox) { var store = new ChatOmemoStorage(); diff --git a/app/widgets/RoomsUtils/RoomsUtils.php b/app/widgets/RoomsUtils/RoomsUtils.php index 5b3577f78..7a7322311 100644 --- a/app/widgets/RoomsUtils/RoomsUtils.php +++ b/app/widgets/RoomsUtils/RoomsUtils.php @@ -16,6 +16,7 @@ use Movim\Widget\Base; use Movim\Image; use App\Conference; +use App\Contact; use App\Info; use Respect\Validation\Validator; @@ -93,6 +94,14 @@ class RoomsUtils extends Base $view->assign('me', $this->user->id); + $hasFingerprints = ($this->user->bundles()->whereIn('jid', function ($query) use ($room) { + $query->select('jid') + ->from('members') + ->where('conference', $room); + })->count() > 0); + + $view->assign('hasfingerprints', $hasFingerprints); + Drawer::fill($view->draw('_rooms_drawer')); $this->rpc('Tabs.create'); @@ -103,6 +112,37 @@ class RoomsUtils extends Base if ($linksCount > 0) { $this->rpc('RoomsUtils_ajaxHttpGetLinks', $room); } + + if ($hasFingerprints) { + $this->rpc('RoomsUtils.getDrawerFingerprints', $room); + } + } + + public function ajaxGetDrawerFingerprints($room, $deviceId) + { + $fingerprints = $this->user->bundles() + ->whereIn('jid', function ($query) use ($room) { + $query->select('jid') + ->from('members') + ->where('conference', $room); + }) + ->with('capability.identities') + ->get() + ->mapToGroups(function ($tuple) { + return [$tuple['jid'] => $tuple]; + }); + + $tpl = $this->tpl(); + $tpl->assign('fingerprints', $fingerprints); + $tpl->assign('deviceid', $deviceId); + $tpl->assign('clienttype', getClientTypes()); + $tpl->assign('contacts', Contact::whereIn('id', $fingerprints->keys())->get()->keyBy('id')); + + $this->rpc('MovimTpl.fill', '#room_omemo_fingerprints', $tpl->draw('_rooms_drawer_fingerprints')); + foreach ($fingerprints as $jid => $value) { + $this->rpc('ContactActions.resolveSessionsStates', $jid, true); + } + $this->rpc('RoomsUtils.resolveRoomEncryptionState', $room); } /** diff --git a/app/widgets/RoomsUtils/_rooms_drawer.tpl b/app/widgets/RoomsUtils/_rooms_drawer.tpl index 4aeb42e0a..8ac67328d 100644 --- a/app/widgets/RoomsUtils/_rooms_drawer.tpl +++ b/app/widgets/RoomsUtils/_rooms_drawer.tpl @@ -391,4 +391,8 @@ {if="$conference->links()->count() > 0"} {/if} + + {if="$hasfingerprints"} +
    + {/if} \ No newline at end of file diff --git a/app/widgets/RoomsUtils/_rooms_drawer_fingerprints.tpl b/app/widgets/RoomsUtils/_rooms_drawer_fingerprints.tpl new file mode 100644 index 000000000..0dbda2a5d --- /dev/null +++ b/app/widgets/RoomsUtils/_rooms_drawer_fingerprints.tpl @@ -0,0 +1,53 @@ +
    +
    +
      +
    • +
      +

      {$c->__('omemo.fingerprints')}

      +
      +
    • + {loop="$fingerprints"} +
    • +
      + {if="$contacts->has($key)"} +

      {$contacts->get($key)->truename} {$key}

      + {else} +

      {$key}

      + {/if} +
      +
    • + {loop="$value"} +
    • + jid == $c->getUser()->id"}blue{else}gray{/if}" id="sessionicon_{$value->jid}_{$value->bundleid}"> + fingerprint + + +
      + + +
      +
      +
      +

      + + {$value->fingerprint} + +

      +

      + {if="$value->capability"} + {$value->capability->name}  + {$value->capability->getDeviceIcon()} + {/if} +

      +
      +
    • + {/loop} + {/loop} +
    +
    +
    diff --git a/app/widgets/RoomsUtils/roomsutils.js b/app/widgets/RoomsUtils/roomsutils.js index f8438751a..bf1a7bbf3 100644 --- a/app/widgets/RoomsUtils/roomsutils.js +++ b/app/widgets/RoomsUtils/roomsutils.js @@ -1,4 +1,10 @@ var RoomsUtils = { + getDrawerFingerprints: function (room) { + var store = new ChatOmemoStorage(); + store.getLocalRegistrationId().then(deviceId => { + RoomsUtils_ajaxGetDrawerFingerprints(room, deviceId); + }); + }, morePictures(button, room, page) { button.remove(); RoomsUtils_ajaxHttpGetPictures(room, page); @@ -14,5 +20,13 @@ var RoomsUtils = { setTimeout(e => { Rooms_ajaxExit(room); }, 2000) + }, + resolveRoomEncryptionState(room) { + var store = new ChatOmemoStorage(); + store.getContactState(room).then(enabled => { + if (!enabled) { + document.querySelector('#room_omemo_fingerprints ul.list').classList.add('disabled'); + } + }); } } \ No newline at end of file diff --git a/lib/moxl/src/Xec/Payload/Presence.php b/lib/moxl/src/Xec/Payload/Presence.php index 8fd83a045..3a25d9b49 100644 --- a/lib/moxl/src/Xec/Payload/Presence.php +++ b/lib/moxl/src/Xec/Payload/Presence.php @@ -13,7 +13,7 @@ class Presence extends Payload // Subscribe request if ((string)$stanza->attributes()->type == 'subscribe') { $session = Session::start(); - $notifs = $session->get('activenotifs'); + $notifs = $session->get('activenotifs', []); $notifs[(string)$stanza->attributes()->from] = 'sub'; $session->set('activenotifs', $notifs);