Browse Source

Add OMEMO Fingerprints tab to Chat groups

Fix an error in Presence payload
pull/1058/head
Timothée Jaussoin 4 years ago
parent
commit
1108d1b775
  1. 9
      app/Roster.php
  2. 2
      app/widgets/Chat/Chat.php
  3. 8
      app/widgets/ContactActions/_contactactions_drawer_fingerprints.tpl
  4. 18
      app/widgets/ContactActions/contactactions.js
  5. 40
      app/widgets/RoomsUtils/RoomsUtils.php
  6. 4
      app/widgets/RoomsUtils/_rooms_drawer.tpl
  7. 53
      app/widgets/RoomsUtils/_rooms_drawer_fingerprints.tpl
  8. 14
      app/widgets/RoomsUtils/roomsutils.js
  9. 2
      lib/moxl/src/Xec/Payload/Presence.php

9
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');

2
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',

8
app/widgets/ContactActions/_contactactions_drawer_fingerprints.tpl

@ -8,7 +8,7 @@
</li>
{loop="$fingerprints"}
<li>
<span class="primary icon gray" id="sessionicon_{$value->bundleid}">
<span class="primary icon gray" id="sessionicon_{$value->jid}_{$value->bundleid}">
<i class="material-icons">fingerprint</i>
</span>
<span class="control">
@ -16,10 +16,10 @@
<input
type="checkbox"
data-identifier="{$value->jid}.{$value->bundleid}"
id="sessionstate_{$value->bundleid}"
name="sessionstate_{$value->bundleid}"
id="sessionstate_{$value->jid|cleanupId}_{$value->bundleid}"
name="sessionstate_{$value->jid|cleanupId}_{$value->bundleid}"
onchange="ContactActions.toggleFingerprintState(this)"/>
<label for="sessionstate_{$value->bundleid}"></label>
<label for="sessionstate_{$value->jid|cleanupId}_{$value->bundleid}"></label>
</div>
</span>
<div>

18
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();

40
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);
}
/**

4
app/widgets/RoomsUtils/_rooms_drawer.tpl

@ -391,4 +391,8 @@
{if="$conference->links()->count() > 0"}
<div class="tabelem spin" title="{$c->__('general.links')}" id="room_links"></div>
{/if}
{if="$hasfingerprints"}
<div class="tabelem spin" title="{$c->__('omemo.fingerprints_title')}" id="room_omemo_fingerprints"></div>
{/if}
</section>

53
app/widgets/RoomsUtils/_rooms_drawer_fingerprints.tpl

@ -0,0 +1,53 @@
<form>
<div>
<ul class="list middle">
<li class="subheader">
<div>
<p>{$c->__('omemo.fingerprints')}</p>
</div>
</li>
{loop="$fingerprints"}
<li class="subheader">
<div>
{if="$contacts->has($key)"}
<p>{$contacts->get($key)->truename} <span class="second">{$key}</span></p>
{else}
<p>{$key}</p>
{/if}
</div>
</li>
{loop="$value"}
<li>
<span class="primary icon {if="$value->jid == $c->getUser()->id"}blue{else}gray{/if}" id="sessionicon_{$value->jid}_{$value->bundleid}">
<i class="material-icons">fingerprint</i>
</span>
<span class="control">
<div class="checkbox">
<input
type="checkbox"
data-identifier="{$value->jid}.{$value->bundleid}"
id="sessionstate_{$value->jid|cleanupId}_{$value->bundleid}"
name="sessionstate_{$value->jid|cleanupId}_{$value->bundleid}"
onchange="ContactActions.toggleFingerprintState(this)"/>
<label for="sessionstate_{$value->jid|cleanupId}_{$value->bundleid}"></label>
</div>
</span>
<div>
<p class="normal">
<span class="fingerprint" title="{$value->bundleid}">
{$value->fingerprint}
</span>
</p>
<p class="line">
{if="$value->capability"}
{$value->capability->name}&nbsp;
<i class="material-icons">{$value->capability->getDeviceIcon()}</i>
{/if}
</p>
</div>
</li>
{/loop}
{/loop}
</ul>
</div>
</form>

14
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');
}
});
}
}

2
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);

Loading…
Cancel
Save