Add mechanism for 3PID invites expiration (#120)
This commit is contained in:
@@ -38,6 +38,8 @@ public interface IStorage {
|
||||
|
||||
void deleteInvite(String id);
|
||||
|
||||
void insertHistoricalInvite(IThreePidInviteReply data, String resolvedTo, Instant resolvedAt, boolean couldPublish);
|
||||
|
||||
Optional<IThreePidSessionDao> getThreePidSession(String sid);
|
||||
|
||||
Optional<IThreePidSessionDao> findThreePidSession(ThreePid tpid, String secret);
|
||||
|
||||
@@ -47,7 +47,7 @@ public class Ed25519KeyManager implements KeyManager {
|
||||
private final KeyStore store;
|
||||
|
||||
public Ed25519KeyManager(KeyStore store) {
|
||||
this.keySpecs = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519);
|
||||
this.keySpecs = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.CURVE_ED25519_SHA512);
|
||||
this.store = store;
|
||||
|
||||
if (!store.getCurrentKey().isPresent()) {
|
||||
@@ -106,7 +106,7 @@ public class Ed25519KeyManager implements KeyManager {
|
||||
}
|
||||
|
||||
public EdDSAPrivateKeySpec getPrivateKeySpecs(KeyIdentifier id) {
|
||||
return new EdDSAPrivateKeySpec(java.util.Base64.getDecoder().decode(getKey(id).getPrivateKeyBase64()), keySpecs);
|
||||
return new EdDSAPrivateKeySpec(Base64.decodeBase64(getKey(id).getPrivateKeyBase64()), keySpecs);
|
||||
}
|
||||
|
||||
public EdDSAPrivateKey getPrivateKey(KeyIdentifier id) {
|
||||
|
||||
@@ -43,7 +43,6 @@ public class Ed25519SignatureManager implements SignatureManager {
|
||||
Signature sign = sign(message);
|
||||
|
||||
JsonObject keySignature = new JsonObject();
|
||||
// FIXME should create a signing key object what would give this ed and index values
|
||||
keySignature.addProperty(sign.getKey().getAlgorithm() + ":" + sign.getKey().getSerial(), sign.getSignature());
|
||||
JsonObject signature = new JsonObject();
|
||||
signature.add(domain, keySignature);
|
||||
@@ -53,7 +52,6 @@ public class Ed25519SignatureManager implements SignatureManager {
|
||||
|
||||
@Override
|
||||
public Signature sign(JsonObject obj) {
|
||||
|
||||
return sign(MatrixJson.encodeCanonical(obj));
|
||||
}
|
||||
|
||||
|
||||
@@ -34,24 +34,18 @@ import io.kamax.mxisd.invitation.IThreePidInviteReply;
|
||||
import io.kamax.mxisd.storage.IStorage;
|
||||
import io.kamax.mxisd.storage.dao.IThreePidSessionDao;
|
||||
import io.kamax.mxisd.storage.ormlite.dao.ASTransactionDao;
|
||||
import io.kamax.mxisd.storage.ormlite.dao.HistoricalThreePidInviteIO;
|
||||
import io.kamax.mxisd.storage.ormlite.dao.ThreePidInviteIO;
|
||||
import io.kamax.mxisd.storage.ormlite.dao.ThreePidSessionDao;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.sql.SQLException;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.*;
|
||||
|
||||
public class OrmLiteSqlStorage implements IStorage {
|
||||
|
||||
private transient final Logger log = LoggerFactory.getLogger(OrmLiteSqlStorage.class);
|
||||
|
||||
@FunctionalInterface
|
||||
private interface Getter<T> {
|
||||
|
||||
@@ -67,6 +61,7 @@ public class OrmLiteSqlStorage implements IStorage {
|
||||
}
|
||||
|
||||
private Dao<ThreePidInviteIO, String> invDao;
|
||||
private Dao<HistoricalThreePidInviteIO, String> expInvDao;
|
||||
private Dao<ThreePidSessionDao, String> sessionDao;
|
||||
private Dao<ASTransactionDao, String> asTxnDao;
|
||||
|
||||
@@ -86,6 +81,7 @@ public class OrmLiteSqlStorage implements IStorage {
|
||||
withCatcher(() -> {
|
||||
ConnectionSource connPool = new JdbcConnectionSource("jdbc:" + backend + ":" + path);
|
||||
invDao = createDaoAndTable(connPool, ThreePidInviteIO.class);
|
||||
expInvDao = createDaoAndTable(connPool, HistoricalThreePidInviteIO.class);
|
||||
sessionDao = createDaoAndTable(connPool, ThreePidSessionDao.class);
|
||||
asTxnDao = createDaoAndTable(connPool, ASTransactionDao.class);
|
||||
});
|
||||
@@ -150,6 +146,24 @@ public class OrmLiteSqlStorage implements IStorage {
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertHistoricalInvite(IThreePidInviteReply data, String resolvedTo, Instant resolvedAt, boolean couldPublish) {
|
||||
withCatcher(() -> {
|
||||
HistoricalThreePidInviteIO io = new HistoricalThreePidInviteIO(data, resolvedTo, resolvedAt, couldPublish);
|
||||
int updated = expInvDao.create(io);
|
||||
if (updated != 1) {
|
||||
throw new RuntimeException("Unexpected row count after DB action: " + updated);
|
||||
}
|
||||
|
||||
// Ugly, but it avoids touching the structure of the historical parent class
|
||||
// and avoid any possible regression at this point.
|
||||
updated = expInvDao.updateId(io, UUID.randomUUID().toString().replace("-", ""));
|
||||
if (updated != 1) {
|
||||
throw new RuntimeException("Unexpected row count after DB action: " + updated);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<IThreePidSessionDao> getThreePidSession(String sid) {
|
||||
return withCatcher(() -> Optional.ofNullable(sessionDao.queryForId(sid)));
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* mxisd - Matrix Identity Server Daemon
|
||||
* Copyright (C) 2019 Kamax Sarl
|
||||
*
|
||||
* https://www.kamax.io/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package io.kamax.mxisd.storage.ormlite.dao;
|
||||
|
||||
import com.j256.ormlite.field.DatabaseField;
|
||||
import com.j256.ormlite.table.DatabaseTable;
|
||||
import io.kamax.mxisd.invitation.IThreePidInviteReply;
|
||||
|
||||
import java.time.Instant;
|
||||
|
||||
@DatabaseTable(tableName = "invite_3pid_history")
|
||||
public class HistoricalThreePidInviteIO extends ThreePidInviteIO {
|
||||
|
||||
@DatabaseField(canBeNull = false)
|
||||
private String resolvedTo;
|
||||
|
||||
@DatabaseField(canBeNull = false)
|
||||
private long resolvedAt;
|
||||
|
||||
@DatabaseField(canBeNull = false)
|
||||
private boolean couldPublish;
|
||||
|
||||
@DatabaseField(canBeNull = false)
|
||||
private long publishAttempts = 1; // Placeholder for retry mechanism, if ever implemented
|
||||
|
||||
public HistoricalThreePidInviteIO() {
|
||||
// Needed for ORMLite
|
||||
}
|
||||
|
||||
public HistoricalThreePidInviteIO(IThreePidInviteReply data, String resolvedTo, Instant resolvedAt, boolean couldPublish) {
|
||||
super(data);
|
||||
|
||||
this.resolvedTo = resolvedTo;
|
||||
this.resolvedAt = resolvedAt.toEpochMilli();
|
||||
this.couldPublish = couldPublish;
|
||||
}
|
||||
|
||||
public String getResolvedTo() {
|
||||
return resolvedTo;
|
||||
}
|
||||
|
||||
public Instant getResolvedAt() {
|
||||
return Instant.ofEpochMilli(resolvedAt);
|
||||
}
|
||||
|
||||
public boolean isCouldPublish() {
|
||||
return couldPublish;
|
||||
}
|
||||
|
||||
public long getPublishAttempts() {
|
||||
return publishAttempts;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user