/// <summary> /// If the OMEMO device list got changed and does not contain the local device id update it and add it again. /// </summary> /// <param name="msg">The received OmemoDeviceListEventMessage.</param> private async Task onOmemoDeviceListEventMessageAsync(OmemoDeviceListEventMessage msg) { string senderBareJid = Utils.getBareJidFromFullJid(msg.getFrom()); if (string.Equals(senderBareJid, CONNECTION.account.getBareJid())) { if (CONNECTION.account.omemoDeviceId != 0) { if (!msg.DEVICES.DEVICES.Any(d => d.ID == CONNECTION.account.omemoDeviceId)) { msg.DEVICES.DEVICES.Add(new OmemoXmlDevice(CONNECTION.account.omemoDeviceId, CONNECTION.account.omemoDeviceLabel)); OmemoSetDeviceListMessage setMsg = new OmemoSetDeviceListMessage(CONNECTION.account.getFullJid(), msg.DEVICES); await CONNECTION.SendAsync(setMsg, false); } DEVICES = msg.DEVICES; } else { return; } } OMEMO_STORAGE.StoreDevices(msg.DEVICES.toOmemoProtocolAddress(senderBareJid), senderBareJid); OMEMO_STORAGE.StoreDeviceListSubscription(senderBareJid, new Tuple <OmemoDeviceListSubscriptionState, DateTime>(OmemoDeviceListSubscriptionState.SUBSCRIBED, DateTime.Now)); }
/// <summary> /// Sends an OmemoSetDeviceListMessage to update your OMEMO device list with the given devices. /// </summary> /// <param name="devices">The new OMEMO device list.</param> /// <returns>The OmemoSetDeviceListMessage result.</returns> public Task <MessageResponseHelperResult <IQMessage> > setDeviceListAsync(OmemoXmlDevices devices) { Predicate <IQMessage> predicate = (x) => { return(true); }; AsyncMessageResponseHelper <IQMessage> helper = new AsyncMessageResponseHelper <IQMessage>(CONNECTION, predicate); OmemoSetDeviceListMessage msg = new OmemoSetDeviceListMessage(CONNECTION.account.getFullJid(), devices); return(helper.startAsync(msg)); }
//--------------------------------------------------------Constructor:----------------------------------------------------------------\\ #region --Constructors-- #endregion //--------------------------------------------------------Set-, Get- Methods:---------------------------------------------------------\\ #region --Set-, Get- Methods-- #endregion //--------------------------------------------------------Misc Methods:---------------------------------------------------------------\\ #region --Misc Methods (Public)-- public async Task ResetOmemoDevicesAsync(Client client) { MODEL.ResettingDevices = true; OmemoXmlDevices devices = new OmemoXmlDevices(); devices.DEVICES.Add(new OmemoXmlDevice(client.dbAccount.omemoInfo.deviceId, client.dbAccount.omemoInfo.deviceLabel)); await client.xmppClient.OMEMO_COMMAND_HELPER.setDeviceListAsync(devices); MODEL.ResettingDevices = false; }
private async Task updateDevicesIfNeededAsync(OmemoXmlDevices devicesRemote) { if (devicesRemote is null) { devicesRemote = new OmemoXmlDevices(); } bool updateDeviceList = false; /** * Device id hasn't been set or we have an invalid one. Pick a random, unique one. * Versions of UWPX < v.0.41.0.0 had an invalid one. * OMEMO allows only device IDs between 1 and (2^31 - 1) * https://xmpp.org/extensions/xep-0384.html#usecases-setup **/ if (CONNECTION.account.omemoDeviceId == 0 || CONNECTION.account.omemoDeviceId > 0x7FFFFFFF) { tmpDeviceId = CryptoUtils.GenerateUniqueDeviceId(devicesRemote.DEVICES.Select(d => d.ID).ToList()); devicesRemote.DEVICES.Add(new OmemoXmlDevice(tmpDeviceId, CONNECTION.account.omemoDeviceLabel)); updateDeviceList = true; } else { tmpDeviceId = CONNECTION.account.omemoDeviceId; OmemoXmlDevice remoteDevice = devicesRemote.DEVICES.Where(d => d.ID == tmpDeviceId).FirstOrDefault(); // Device does not exist: if (remoteDevice is null) { devicesRemote.DEVICES.Add(new OmemoXmlDevice(tmpDeviceId, CONNECTION.account.omemoDeviceLabel)); updateDeviceList = true; } // Device label changed: else if (!string.Equals(remoteDevice.label, CONNECTION.account.omemoDeviceLabel)) { remoteDevice.label = CONNECTION.account.omemoDeviceLabel; updateDeviceList = true; } } if (updateDeviceList) { await updateDeviceListAsync(devicesRemote); } else if (!CONNECTION.account.omemoBundleInfoAnnounced || updateDeviceList) { await announceBundleInfoAsync(); } else { setState(OmemoHelperState.ENABLED); } DEVICES = devicesRemote; // Store the new list in the DB: OMEMO_STORAGE.StoreDevices(DEVICES.toOmemoProtocolAddress(CONNECTION.account.getBareJid()), CONNECTION.account.getBareJid()); }
private async Task updateDevicesIfNeededAsync(OmemoXmlDevices devicesRemote) { if (devicesRemote is null) { devicesRemote = new OmemoXmlDevices(); } bool updateDeviceList = false; // Device id hasn't been set. Pick a random, unique one: if (CONNECTION.account.omemoDeviceId == 0) { tmpDeviceId = CryptoUtils.GenerateUniqueDeviceId(devicesRemote.DEVICES.Select(d => d.ID).ToList()); devicesRemote.DEVICES.Add(new OmemoXmlDevice(tmpDeviceId, CONNECTION.account.omemoDeviceLabel)); updateDeviceList = true; } else { tmpDeviceId = CONNECTION.account.omemoDeviceId; OmemoXmlDevice remoteDevice = devicesRemote.DEVICES.Where(d => d.ID == tmpDeviceId).FirstOrDefault(); // Device does not exist: if (remoteDevice is null) { devicesRemote.DEVICES.Add(new OmemoXmlDevice(tmpDeviceId, CONNECTION.account.omemoDeviceLabel)); updateDeviceList = true; } // Device label changed: else if (!string.Equals(remoteDevice.label, CONNECTION.account.omemoDeviceLabel)) { remoteDevice.label = CONNECTION.account.omemoDeviceLabel; updateDeviceList = true; } } if (updateDeviceList) { await updateDeviceListAsync(devicesRemote); } else if (!CONNECTION.account.omemoBundleInfoAnnounced || true) { await announceBundleInfoAsync(); } else { setState(OmemoHelperState.ENABLED); } DEVICES = devicesRemote; }
private async Task updateDeviceListAsync(OmemoXmlDevices devices) { setState(OmemoHelperState.UPDATING_DEVICE_LIST); // Make sure we set the item ID to "current": devices.setId(); Logger.Info("[OMEMO HELPER](" + CONNECTION.account.getBareJid() + ") Updating device list."); MessageResponseHelperResult <IQMessage> result = await CONNECTION.OMEMO_COMMAND_HELPER.setDeviceListAsync(devices); if (result.STATE == MessageResponseHelperResultState.SUCCESS) { if (result.RESULT is IQErrorMessage errMsg) { Logger.Error("[OMEMO HELPER](" + CONNECTION.account.getBareJid() + ") Failed to set OMEMO device list to: " + CONNECTION.account.user.domainPart + "\n" + errMsg.ERROR_OBJ.ToString()); setState(OmemoHelperState.ERROR); } else { Logger.Info("[OMEMO HELPER](" + CONNECTION.account.getBareJid() + ") Device list updated."); if (tmpDeviceId != 0) { if (CONNECTION.account.omemoDeviceId != tmpDeviceId) { CONNECTION.account.omemoDeviceId = tmpDeviceId; CONNECTION.account.omemoBundleInfoAnnounced = false; } } if (!CONNECTION.account.omemoBundleInfoAnnounced) { await announceBundleInfoAsync(); } else { setState(OmemoHelperState.ENABLED); } } } else { onRequestError(result); } }
public async Task refreshDevicesAsync() { MessageResponseHelperResult <IQMessage> result = await CONNECTION.OMEMO_COMMAND_HELPER.requestDeviceListAsync(CONNECTION.account.getBareJid()); if (result.STATE == MessageResponseHelperResultState.SUCCESS) { if (result.RESULT is OmemoDeviceListResultMessage devMsg) { DEVICES = devMsg.DEVICES; // Store the new list in the DB: OMEMO_STORAGE.StoreDevices(DEVICES.toOmemoProtocolAddress(CONNECTION.account.getBareJid()), CONNECTION.account.getBareJid()); } else if (result.RESULT is IQErrorMessage errMsg) { Logger.Error("[OMEMO HELPER](" + CONNECTION.account.getBareJid() + ") Failed to request OMEMO device list form: " + CONNECTION.account.user.domainPart + "\n" + errMsg.ERROR_OBJ.ToString()); } } else { Logger.Error("[OMEMO HELPER](" + CONNECTION.account.getBareJid() + ") Failed to request OMEMO device list form: " + CONNECTION.account.user.domainPart + " with: " + result.STATE); } }