[omemo] Set devices inactive after 300 unacknowledged messages
This commit is contained in:
@@ -19,6 +19,8 @@ from collections import defaultdict
|
|||||||
|
|
||||||
from gajim.common import app
|
from gajim.common import app
|
||||||
|
|
||||||
|
from omemo.backend.util import UNACKNOWLEDGED_COUNT
|
||||||
|
|
||||||
log = logging.getLogger('gajim.plugin_system.omemo')
|
log = logging.getLogger('gajim.plugin_system.omemo')
|
||||||
|
|
||||||
|
|
||||||
@@ -39,6 +41,15 @@ class DeviceManager:
|
|||||||
self.add_device(jid, device)
|
self.add_device(jid, device)
|
||||||
|
|
||||||
def update_devicelist(self, jid, devicelist):
|
def update_devicelist(self, jid, devicelist):
|
||||||
|
for device in list(devicelist):
|
||||||
|
if device == self.own_device:
|
||||||
|
continue
|
||||||
|
count = self._storage.getUnacknowledgedCount(jid, device)
|
||||||
|
if count > UNACKNOWLEDGED_COUNT:
|
||||||
|
log.warning('Ignore device because of %s unacknowledged'
|
||||||
|
' messages: %s %s', count, jid, device)
|
||||||
|
devicelist.remove(device)
|
||||||
|
|
||||||
self.__device_store[jid] = set(devicelist)
|
self.__device_store[jid] = set(devicelist)
|
||||||
log.info('Saved devices for %s', jid)
|
log.info('Saved devices for %s', jid)
|
||||||
self._storage.setActiveState(jid, devicelist)
|
self._storage.setActiveState(jid, devicelist)
|
||||||
@@ -60,6 +71,10 @@ class DeviceManager:
|
|||||||
def add_device(self, jid, device):
|
def add_device(self, jid, device):
|
||||||
self.__device_store[jid].add(device)
|
self.__device_store[jid].add(device)
|
||||||
|
|
||||||
|
def remove_device(self, jid, device):
|
||||||
|
self.__device_store[jid].discard(device)
|
||||||
|
self._storage.setInactive(jid, device)
|
||||||
|
|
||||||
def get_devices(self, jid, without_self=False):
|
def get_devices(self, jid, without_self=False):
|
||||||
devices = set(self.__device_store[jid])
|
devices = set(self.__device_store[jid])
|
||||||
if without_self:
|
if without_self:
|
||||||
|
|||||||
@@ -320,16 +320,22 @@ class LiteAxolotlStore(AxolotlStore):
|
|||||||
', '.join(['?'] * len(recipientIds)))
|
', '.join(['?'] * len(recipientIds)))
|
||||||
return self._con.execute(query, recipientIds).fetchall()
|
return self._con.execute(query, recipientIds).fetchall()
|
||||||
|
|
||||||
def setActiveState(self, jid, deviceList):
|
def setActiveState(self, jid, devicelist):
|
||||||
query = '''UPDATE sessions SET active = 1
|
query = '''UPDATE sessions SET active = 1
|
||||||
WHERE recipient_id = ? AND device_id IN ({})'''.format(
|
WHERE recipient_id = ? AND device_id IN ({})'''.format(
|
||||||
', '.join(['?'] * len(deviceList)))
|
', '.join(['?'] * len(devicelist)))
|
||||||
self._con.execute(query, (jid,) + tuple(deviceList))
|
self._con.execute(query, (jid,) + tuple(devicelist))
|
||||||
|
|
||||||
query = '''UPDATE sessions SET active = 0
|
query = '''UPDATE sessions SET active = 0
|
||||||
WHERE recipient_id = ? AND device_id NOT IN ({})'''.format(
|
WHERE recipient_id = ? AND device_id NOT IN ({})'''.format(
|
||||||
', '.join(['?'] * len(deviceList)))
|
', '.join(['?'] * len(devicelist)))
|
||||||
self._con.execute(query, (jid,) + tuple(deviceList))
|
self._con.execute(query, (jid,) + tuple(devicelist))
|
||||||
|
self._con.commit()
|
||||||
|
|
||||||
|
def setInactive(self, jid, device_id):
|
||||||
|
query = '''UPDATE sessions SET active = 0
|
||||||
|
WHERE recipient_id = ? AND device_id = ?'''
|
||||||
|
self._con.execute(query, (jid, device_id))
|
||||||
self._con.commit()
|
self._con.commit()
|
||||||
|
|
||||||
def getInactiveSessionsKeys(self, recipientId):
|
def getInactiveSessionsKeys(self, recipientId):
|
||||||
@@ -515,3 +521,8 @@ class LiteAxolotlStore(AxolotlStore):
|
|||||||
WHERE recipient_id = ? AND public_key = ?'''
|
WHERE recipient_id = ? AND public_key = ?'''
|
||||||
self._con.execute(query, (timestamp, recipient_id, identity_key))
|
self._con.execute(query, (timestamp, recipient_id, identity_key))
|
||||||
self._con.commit()
|
self._con.commit()
|
||||||
|
|
||||||
|
def getUnacknowledgedCount(self, recipient_id, device_id):
|
||||||
|
record = self.loadSession(recipient_id, device_id)
|
||||||
|
state = record.getSessionState()
|
||||||
|
return state.getSenderChainKey().getIndex()
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ from omemo.backend.util import DEFAULT_PREKEY_AMOUNT
|
|||||||
from omemo.backend.util import MIN_PREKEY_AMOUNT
|
from omemo.backend.util import MIN_PREKEY_AMOUNT
|
||||||
from omemo.backend.util import SPK_CYCLE_TIME
|
from omemo.backend.util import SPK_CYCLE_TIME
|
||||||
from omemo.backend.util import SPK_ARCHIVE_TIME
|
from omemo.backend.util import SPK_ARCHIVE_TIME
|
||||||
|
from omemo.backend.util import UNACKNOWLEDGED_COUNT
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger('gajim.plugin_system.omemo')
|
log = logging.getLogger('gajim.plugin_system.omemo')
|
||||||
@@ -172,6 +173,12 @@ class OmemoState(DeviceManager):
|
|||||||
whisper_messages = defaultdict(dict)
|
whisper_messages = defaultdict(dict)
|
||||||
|
|
||||||
for jid_, device in devices_for_encryption:
|
for jid_, device in devices_for_encryption:
|
||||||
|
count = self._storage.getUnacknowledgedCount(jid_, device)
|
||||||
|
if count >= UNACKNOWLEDGED_COUNT:
|
||||||
|
log.warning('Set device inactive %s because of %s '
|
||||||
|
'unacknowledged messages', device, count)
|
||||||
|
self.remove_device(jid_, device)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
whisper_messages[jid_][device] = self._get_whisper_message(
|
whisper_messages[jid_][device] = self._get_whisper_message(
|
||||||
jid_, device, result.key)
|
jid_, device, result.key)
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ DEFAULT_PREKEY_AMOUNT = 100
|
|||||||
MIN_PREKEY_AMOUNT = 80
|
MIN_PREKEY_AMOUNT = 80
|
||||||
SPK_ARCHIVE_TIME = 86400 * 15 # 15 Days
|
SPK_ARCHIVE_TIME = 86400 * 15 # 15 Days
|
||||||
SPK_CYCLE_TIME = 86400 # 24 Hours
|
SPK_CYCLE_TIME = 86400 # 24 Hours
|
||||||
|
UNACKNOWLEDGED_COUNT = 300
|
||||||
|
|
||||||
|
|
||||||
class Trust(IntEnum):
|
class Trust(IntEnum):
|
||||||
|
|||||||
Reference in New Issue
Block a user