1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2024-06-13 23:24:50 +02:00
Smack/smack-omemo/src/main/java/org/jivesoftware/smackx/omemo/internal/OmemoCachedDeviceList.java
Paul Schaub 1f731f6318
Rework support for XEP-0384: OMEMO Encryption
Changes:

    Rework integration tests
    New structure of base integration test classes
    bump dependency on signal-protocol-java from 2.4.0 to 2.6.2
    Introduced CachingOmemoStore implementations
    Use CachingOmemoStore classes in integration tests
    Removed OmemoSession classes (replaced with more logical OmemoRatchet classes)
    Consequently also removed load/storeOmemoSession methods from OmemoStore
    Removed some clutter from KeyUtil classes
    Moved trust decision related code from OmemoStore to TrustCallback
    Require authenticated connection for many functions
    Add async initialization function in OmemoStore
    Refactor omemo test package (/java/org/jivesoftware/smack/omemo -> /java/org/jivesoftware/smackx)
    Remove OmemoStore method isFreshInstallation() as well as defaultDeviceId related stuff
    FileBasedOmemoStore: Add cleaner methods to store/load base data types (Using tryWithResource, only for future releases, once Android API gets bumped)
    Attempt to make OmemoManager thread safe
    new logic for getInstanceFor() deviceId determination
    OmemoManagers encrypt methods now don't throw exceptions when encryption for some devices fails. Instead message gets encrypted when possible and more information about failures gets returned alongside the message itself
    Added OmemoMessage class for that purpose
    Reworked entire OmemoService class
    Use safer logic for creating trust-ignoring messages (like ratchet-update messages)
    Restructure elements/provider in order to prepare for OMEMO namespace bumps
    Remove OmemoManager.regenerate() methods in favor of getInstanceFor(connection, randomDeviceId)
    Removed some unnecessary configuration options
    Prepare for support of more AES message key types
    Simplify session creation
    Where possible, avoid side effects in methods
    Add UntrustedOmemoIdentityException
    Add TrustState enum
    More improved tests
2018-06-13 12:29:16 +02:00

145 lines
4.5 KiB
Java

/**
*
* Copyright 2017 Paul Schaub
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.smackx.omemo.internal;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
* This class is used to represent device lists of contacts.
* There are active devices (a set of device ids, which was published with the last device list update)
* and inactive devices (set of devices that once were active, but are not included in recent list updates).
* Both kinds are cached by the client. When a device that was active in the last update is not included in
* a new update, it becomes an inactive device. Vice versa, inactive devices can also become active again, by
* being included in the latest device list update.
* <p>
* The client ensures, that his own device id is on the list of active devices, as soon as he gets online.
*
* @author Paul Schaub
*/
public class OmemoCachedDeviceList implements Serializable {
private static final long serialVersionUID = 3153579238321261203L;
private final Set<Integer> activeDevices;
private final Set<Integer> inactiveDevices;
public OmemoCachedDeviceList() {
this.activeDevices = new HashSet<>();
this.inactiveDevices = new HashSet<>();
}
public OmemoCachedDeviceList(Set<Integer> activeDevices, Set<Integer> inactiveDevices) {
this();
this.activeDevices.addAll(activeDevices);
this.inactiveDevices.addAll(inactiveDevices);
}
public OmemoCachedDeviceList(OmemoCachedDeviceList original) {
this(original.getActiveDevices(), original.getInactiveDevices());
}
/**
* Returns all active devices.
* Active devices are all devices that were in the latest DeviceList update.
*
* @return active devices
*/
public Set<Integer> getActiveDevices() {
return activeDevices;
}
/**
* Return all inactive devices.
* Inactive devices are devices which were in a past DeviceList update once, but were not included in
* the latest update.
*
* @return inactive devices
*/
public Set<Integer> getInactiveDevices() {
return inactiveDevices;
}
/**
* Returns an OmemoDeviceListElement containing all devices (active and inactive).
*
* @return all devices
*/
public Set<Integer> getAllDevices() {
Set<Integer> all = new HashSet<>();
all.addAll(activeDevices);
all.addAll(inactiveDevices);
return all;
}
/**
* Merge a device list update into the CachedDeviceList.
* The source code should be self explanatory.
*
* @param deviceListUpdate received device list update
*/
public void merge(Set<Integer> deviceListUpdate) {
inactiveDevices.addAll(activeDevices);
activeDevices.clear();
activeDevices.addAll(deviceListUpdate);
inactiveDevices.removeAll(activeDevices);
}
/**
* Add a device to the list of active devices and remove it from inactive.
*
* @param deviceId deviceId that will be added
*/
public void addDevice(int deviceId) {
activeDevices.add(deviceId);
inactiveDevices.remove(deviceId);
}
public void addInactiveDevice(int deviceId) {
activeDevices.remove(deviceId);
inactiveDevices.add(deviceId);
}
/**
* Returns true if deviceId is either in the list of active or inactive devices.
*
* @param deviceId id
* @return true or false
*/
public boolean contains(int deviceId) {
return activeDevices.contains(deviceId) || inactiveDevices.contains(deviceId);
}
public boolean isActive(int deviceId) {
return getActiveDevices().contains(deviceId);
}
@Override
public String toString() {
String out = "active: [";
for (int id : activeDevices) {
out += id + " ";
}
out += "] inacitve: [";
for (int id : inactiveDevices) {
out += id + " ";
}
out += "]";
return out;
}
}