conversations-classic/src/main/java/eu/siacs/conversations/xmpp/jingle/OmemoVerification.java
2021-03-02 21:13:49 +01:00

84 lines
2.9 KiB
Java

package eu.siacs.conversations.xmpp.jingle;
import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import java.util.concurrent.atomic.AtomicBoolean;
import eu.siacs.conversations.crypto.axolotl.AxolotlService;
public class OmemoVerification {
private final AtomicBoolean deviceIdWritten = new AtomicBoolean(false);
private final AtomicBoolean sessionFingerprintWritten = new AtomicBoolean(false);
private Integer deviceId;
private String sessionFingerprint;
public void setDeviceId(final Integer id) {
if (deviceIdWritten.compareAndSet(false, true)) {
this.deviceId = id;
return;
}
throw new IllegalStateException("Device Id has already been set");
}
public int getDeviceId() {
Preconditions.checkNotNull(this.deviceId, "Device ID is null");
return this.deviceId;
}
public boolean hasDeviceId() {
return this.deviceId != null;
}
public void setSessionFingerprint(final String fingerprint) {
Preconditions.checkNotNull(fingerprint, "Session fingerprint must not be null");
if (sessionFingerprintWritten.compareAndSet(false, true)) {
this.sessionFingerprint = fingerprint;
return;
}
throw new IllegalStateException("Session fingerprint has already been set");
}
public String getFingerprint() {
return this.sessionFingerprint;
}
public void setOrEnsureEqual(AxolotlService.OmemoVerifiedPayload<?> omemoVerifiedPayload) {
setOrEnsureEqual(omemoVerifiedPayload.getDeviceId(), omemoVerifiedPayload.getFingerprint());
}
public void setOrEnsureEqual(final int deviceId, final String sessionFingerprint) {
Preconditions.checkNotNull(sessionFingerprint, "Session fingerprint must not be null");
if (this.deviceIdWritten.get() || this.sessionFingerprintWritten.get()) {
if (this.sessionFingerprint == null) {
throw new IllegalStateException("No session fingerprint has been previously provided");
}
if (!sessionFingerprint.equals(this.sessionFingerprint)) {
throw new IllegalStateException("Session Fingerprints did not match");
}
if (this.deviceId == null) {
throw new IllegalStateException("No Device Id has been previously provided");
}
if (this.deviceId != deviceId) {
throw new IllegalStateException("Device Ids did not match");
}
} else {
this.setSessionFingerprint(sessionFingerprint);
this.setDeviceId(deviceId);
}
}
public boolean hasFingerprint() {
return this.sessionFingerprint != null;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("deviceId", deviceId)
.add("fingerprint", sessionFingerprint)
.toString();
}
}