mirror of
https://github.com/bisq-network/bisq.git
synced 2025-03-13 11:09:10 +01:00
Merge pull request #6977 from alvasw/FilterManagerAddFilterToNetworkTests
Add FilterManagerAddFilterToNetworkTests
This commit is contained in:
commit
1f072bf774
9 changed files with 383 additions and 13 deletions
|
@ -29,7 +29,8 @@ dependencies {
|
||||||
testImplementation libs.hamcrest
|
testImplementation libs.hamcrest
|
||||||
testImplementation libs.junit.jupiter.api
|
testImplementation libs.junit.jupiter.api
|
||||||
testImplementation libs.junit.jupiter.params
|
testImplementation libs.junit.jupiter.params
|
||||||
testImplementation libs.mockito
|
testImplementation libs.mockito.core
|
||||||
|
testImplementation libs.mockito.junit.jupiter
|
||||||
|
|
||||||
testRuntimeOnly libs.junit.jupiter.engine
|
testRuntimeOnly libs.junit.jupiter.engine
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,8 @@ import java.util.Optional;
|
||||||
|
|
||||||
import ch.qos.logback.classic.Level;
|
import ch.qos.logback.classic.Level;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static java.lang.String.format;
|
import static java.lang.String.format;
|
||||||
import static java.util.stream.Collectors.toList;
|
import static java.util.stream.Collectors.toList;
|
||||||
|
@ -157,7 +159,8 @@ public class Config {
|
||||||
|
|
||||||
// Options supported only at the command-line interface (cli)
|
// Options supported only at the command-line interface (cli)
|
||||||
public final boolean helpRequested;
|
public final boolean helpRequested;
|
||||||
public final File configFile;
|
@Getter
|
||||||
|
private final File configFile;
|
||||||
|
|
||||||
// Options supported on cmd line and in the config file
|
// Options supported on cmd line and in the config file
|
||||||
public final String appName;
|
public final String appName;
|
||||||
|
|
|
@ -53,7 +53,7 @@ public class ConfigTests {
|
||||||
assertThat(config.appName, equalTo(config.defaultAppName));
|
assertThat(config.appName, equalTo(config.defaultAppName));
|
||||||
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
||||||
assertThat(config.appDataDir, equalTo(config.defaultAppDataDir));
|
assertThat(config.appDataDir, equalTo(config.defaultAppDataDir));
|
||||||
assertThat(config.configFile, equalTo(config.defaultConfigFile));
|
assertThat(config.getConfigFile(), equalTo(config.defaultConfigFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -62,7 +62,7 @@ public class ConfigTests {
|
||||||
assertThat(config.appName, equalTo("My-Bisq"));
|
assertThat(config.appName, equalTo("My-Bisq"));
|
||||||
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
||||||
assertThat(config.appDataDir, equalTo(new File(config.userDataDir, "My-Bisq")));
|
assertThat(config.appDataDir, equalTo(new File(config.userDataDir, "My-Bisq")));
|
||||||
assertThat(config.configFile, equalTo(new File(config.appDataDir, DEFAULT_CONFIG_FILE_NAME)));
|
assertThat(config.getConfigFile(), equalTo(new File(config.appDataDir, DEFAULT_CONFIG_FILE_NAME)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -72,7 +72,7 @@ public class ConfigTests {
|
||||||
assertThat(config.appName, equalTo(config.defaultAppName));
|
assertThat(config.appName, equalTo(config.defaultAppName));
|
||||||
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
||||||
assertThat(config.appDataDir, equalTo(appDataDir));
|
assertThat(config.appDataDir, equalTo(appDataDir));
|
||||||
assertThat(config.configFile, equalTo(new File(config.appDataDir, DEFAULT_CONFIG_FILE_NAME)));
|
assertThat(config.getConfigFile(), equalTo(new File(config.appDataDir, DEFAULT_CONFIG_FILE_NAME)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -82,7 +82,7 @@ public class ConfigTests {
|
||||||
assertThat(config.appName, equalTo(config.defaultAppName));
|
assertThat(config.appName, equalTo(config.defaultAppName));
|
||||||
assertThat(config.userDataDir, equalTo(userDataDir));
|
assertThat(config.userDataDir, equalTo(userDataDir));
|
||||||
assertThat(config.appDataDir, equalTo(new File(userDataDir, config.defaultAppName)));
|
assertThat(config.appDataDir, equalTo(new File(userDataDir, config.defaultAppName)));
|
||||||
assertThat(config.configFile, equalTo(new File(config.appDataDir, DEFAULT_CONFIG_FILE_NAME)));
|
assertThat(config.getConfigFile(), equalTo(new File(config.appDataDir, DEFAULT_CONFIG_FILE_NAME)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -92,7 +92,7 @@ public class ConfigTests {
|
||||||
assertThat(config.appName, equalTo("My-Bisq"));
|
assertThat(config.appName, equalTo("My-Bisq"));
|
||||||
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
||||||
assertThat(config.appDataDir, equalTo(appDataDir));
|
assertThat(config.appDataDir, equalTo(appDataDir));
|
||||||
assertThat(config.configFile, equalTo(new File(config.appDataDir, DEFAULT_CONFIG_FILE_NAME)));
|
assertThat(config.getConfigFile(), equalTo(new File(config.appDataDir, DEFAULT_CONFIG_FILE_NAME)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -166,7 +166,7 @@ public class ConfigTests {
|
||||||
public void whenConfigFileOptionIsSetToExistingFile_thenConfigFilePropertyReflectsItsValue() throws IOException {
|
public void whenConfigFileOptionIsSetToExistingFile_thenConfigFilePropertyReflectsItsValue() throws IOException {
|
||||||
File configFile = File.createTempFile("bisq", "properties");
|
File configFile = File.createTempFile("bisq", "properties");
|
||||||
Config config = configWithOpts(opt(CONFIG_FILE, configFile.getAbsolutePath()));
|
Config config = configWithOpts(opt(CONFIG_FILE, configFile.getAbsolutePath()));
|
||||||
assertThat(config.configFile, equalTo(configFile));
|
assertThat(config.getConfigFile(), equalTo(configFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -175,7 +175,7 @@ public class ConfigTests {
|
||||||
File appDataDir = configFile.getParentFile();
|
File appDataDir = configFile.getParentFile();
|
||||||
String relativeConfigFilePath = configFile.getName();
|
String relativeConfigFilePath = configFile.getName();
|
||||||
Config config = configWithOpts(opt(APP_DATA_DIR, appDataDir), opt(CONFIG_FILE, relativeConfigFilePath));
|
Config config = configWithOpts(opt(APP_DATA_DIR, appDataDir), opt(CONFIG_FILE, relativeConfigFilePath));
|
||||||
assertThat(config.configFile, equalTo(configFile));
|
assertThat(config.getConfigFile(), equalTo(configFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -188,7 +188,7 @@ public class ConfigTests {
|
||||||
assertThat(config.appName, equalTo("My-Bisq"));
|
assertThat(config.appName, equalTo("My-Bisq"));
|
||||||
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
assertThat(config.userDataDir, equalTo(config.defaultUserDataDir));
|
||||||
assertThat(config.appDataDir, equalTo(new File(config.userDataDir, config.appName)));
|
assertThat(config.appDataDir, equalTo(new File(config.userDataDir, config.appName)));
|
||||||
assertThat(config.configFile, equalTo(configFile));
|
assertThat(config.getConfigFile(), equalTo(configFile));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -128,7 +128,7 @@ public class FilterManager {
|
||||||
this.keyRing = keyRing;
|
this.keyRing = keyRing;
|
||||||
this.user = user;
|
this.user = user;
|
||||||
this.preferences = preferences;
|
this.preferences = preferences;
|
||||||
this.configFileEditor = new ConfigFileEditor(config.configFile);
|
this.configFileEditor = new ConfigFileEditor(config.getConfigFile());
|
||||||
this.providersRepository = providersRepository;
|
this.providersRepository = providersRepository;
|
||||||
this.ignoreDevMsg = ignoreDevMsg;
|
this.ignoreDevMsg = ignoreDevMsg;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,244 @@
|
||||||
|
/*
|
||||||
|
* This file is part of Bisq.
|
||||||
|
*
|
||||||
|
* Bisq 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.
|
||||||
|
*
|
||||||
|
* Bisq 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 Bisq. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package bisq.core.filter;
|
||||||
|
|
||||||
|
import bisq.core.provider.ProvidersRepository;
|
||||||
|
import bisq.core.user.Preferences;
|
||||||
|
import bisq.core.user.User;
|
||||||
|
|
||||||
|
import bisq.network.p2p.P2PService;
|
||||||
|
import bisq.network.p2p.network.BanFilter;
|
||||||
|
import bisq.network.p2p.storage.P2PDataStorage;
|
||||||
|
import bisq.network.p2p.storage.payload.ProtectedStorageEntry;
|
||||||
|
|
||||||
|
import bisq.common.app.DevEnv;
|
||||||
|
import bisq.common.config.Config;
|
||||||
|
import bisq.common.crypto.KeyRing;
|
||||||
|
import bisq.common.crypto.Sig;
|
||||||
|
|
||||||
|
import org.bitcoinj.core.ECKey;
|
||||||
|
|
||||||
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
|
|
||||||
|
import java.security.KeyPair;
|
||||||
|
import java.security.KeyPairGenerator;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.NoSuchProviderException;
|
||||||
|
import java.security.PublicKey;
|
||||||
|
import java.security.Security;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
import java.math.BigInteger;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.junit.jupiter.api.io.TempDir;
|
||||||
|
|
||||||
|
import static org.bitcoinj.core.Utils.HEX;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
|
import static org.mockito.Mockito.doReturn;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
|
||||||
|
@ExtendWith(MockitoExtension.class)
|
||||||
|
public class FilterManagerAddFilterToNetworkTests {
|
||||||
|
static {
|
||||||
|
Security.addProvider(new BouncyCastleProvider());
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<P2PDataStorage.ByteArray, ProtectedStorageEntry> p2pStorageMap;
|
||||||
|
private FilterManager filterManager;
|
||||||
|
|
||||||
|
private final PublicKey ownerPublicKey;
|
||||||
|
private final String privilegedDevPubKeyHex;
|
||||||
|
private final ECKey privilegedDevEcKey;
|
||||||
|
|
||||||
|
public FilterManagerAddFilterToNetworkTests() throws NoSuchAlgorithmException, NoSuchProviderException {
|
||||||
|
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(Sig.KEY_ALGO, "BC");
|
||||||
|
KeyPair ownerKeyPair = keyPairGenerator.generateKeyPair();
|
||||||
|
ownerPublicKey = ownerKeyPair.getPublic();
|
||||||
|
|
||||||
|
privilegedDevEcKey = ECKey.fromPrivate(new BigInteger(1, HEX.decode(DevEnv.DEV_PRIVILEGE_PRIV_KEY)));
|
||||||
|
privilegedDevPubKeyHex = HEX.encode(privilegedDevEcKey.getPubKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
void beforeEach(@TempDir Path tmpDir, @Mock P2PService p2PService, @Mock P2PDataStorage p2pDataStorage) {
|
||||||
|
doReturn(p2pDataStorage).when(p2PService).getP2PDataStorage();
|
||||||
|
|
||||||
|
p2pStorageMap = new HashMap<>();
|
||||||
|
doReturn(p2pStorageMap).when(p2pDataStorage).getMap();
|
||||||
|
|
||||||
|
Config config = mock(Config.class);
|
||||||
|
File configFile = tmpDir.resolve("configFile").toFile();
|
||||||
|
doReturn(configFile).when(config).getConfigFile();
|
||||||
|
|
||||||
|
filterManager = new FilterManager(
|
||||||
|
p2PService,
|
||||||
|
mock(KeyRing.class),
|
||||||
|
mock(User.class),
|
||||||
|
mock(Preferences.class),
|
||||||
|
config,
|
||||||
|
mock(ProvidersRepository.class),
|
||||||
|
mock(BanFilter.class),
|
||||||
|
false,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addFilterWithInvalidPublicKey() {
|
||||||
|
// There should exist no filter before we add our filter
|
||||||
|
assertNull(filterManager.getFilter());
|
||||||
|
|
||||||
|
Filter filter = TestFilter.createFilter(ownerPublicKey, "invalidPubKeyAsHex");
|
||||||
|
p2pStorageMap.put(
|
||||||
|
new P2PDataStorage.ByteArray(new byte[100]),
|
||||||
|
TestFilter.createProtectedStorageEntryForFilter(filter)
|
||||||
|
);
|
||||||
|
|
||||||
|
filterManager.onAllServicesInitialized();
|
||||||
|
|
||||||
|
// FilterManager didn't add our filter
|
||||||
|
assertNull(filterManager.getFilter());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addFilterWithInvalidSignature() {
|
||||||
|
// No filter before adding our filter
|
||||||
|
assertNull(filterManager.getFilter());
|
||||||
|
|
||||||
|
Filter filter = TestFilter.createFilter(ownerPublicKey, privilegedDevPubKeyHex);
|
||||||
|
p2pStorageMap.put(
|
||||||
|
new P2PDataStorage.ByteArray(new byte[100]),
|
||||||
|
TestFilter.createProtectedStorageEntryForFilter(filter)
|
||||||
|
);
|
||||||
|
|
||||||
|
filterManager.onAllServicesInitialized();
|
||||||
|
|
||||||
|
// FilterManager didn't add our filter
|
||||||
|
assertNull(filterManager.getFilter());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void publishValidFilter() {
|
||||||
|
// No filter before adding our filter
|
||||||
|
assertNull(filterManager.getFilter());
|
||||||
|
|
||||||
|
Filter filterWithSig = TestFilter.createSignedFilter(ownerPublicKey, privilegedDevEcKey);
|
||||||
|
p2pStorageMap.put(
|
||||||
|
new P2PDataStorage.ByteArray(new byte[100]),
|
||||||
|
TestFilter.createProtectedStorageEntryForFilter(filterWithSig)
|
||||||
|
);
|
||||||
|
|
||||||
|
filterManager.onAllServicesInitialized();
|
||||||
|
|
||||||
|
// Our filter got set
|
||||||
|
Filter currentFilter = filterManager.getFilter();
|
||||||
|
assertNotNull(currentFilter);
|
||||||
|
assertEquals(filterWithSig, currentFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addTooOldFilter() {
|
||||||
|
// No filter before adding our filter
|
||||||
|
assertNull(filterManager.getFilter());
|
||||||
|
|
||||||
|
long creationTime = System.currentTimeMillis();
|
||||||
|
Filter firstFilterWithSig = TestFilter.createSignedFilter(ownerPublicKey, privilegedDevEcKey, creationTime);
|
||||||
|
Filter secondFilterWithSig = TestFilter.createSignedFilter(ownerPublicKey, privilegedDevEcKey,
|
||||||
|
creationTime + 100);
|
||||||
|
|
||||||
|
assertNotEquals(firstFilterWithSig, secondFilterWithSig);
|
||||||
|
|
||||||
|
p2pStorageMap.put(
|
||||||
|
new P2PDataStorage.ByteArray(new byte[100]),
|
||||||
|
TestFilter.createProtectedStorageEntryForFilter(secondFilterWithSig)
|
||||||
|
);
|
||||||
|
|
||||||
|
filterManager.onAllServicesInitialized();
|
||||||
|
|
||||||
|
// Our filter got set
|
||||||
|
Filter currentFilter = filterManager.getFilter();
|
||||||
|
assertNotNull(currentFilter);
|
||||||
|
assertEquals(secondFilterWithSig, currentFilter);
|
||||||
|
|
||||||
|
p2pStorageMap.clear();
|
||||||
|
p2pStorageMap.put(
|
||||||
|
new P2PDataStorage.ByteArray(new byte[100]),
|
||||||
|
TestFilter.createProtectedStorageEntryForFilter(firstFilterWithSig)
|
||||||
|
);
|
||||||
|
|
||||||
|
filterManager.onAllServicesInitialized();
|
||||||
|
|
||||||
|
// Our filter got set
|
||||||
|
currentFilter = filterManager.getFilter();
|
||||||
|
assertNotNull(currentFilter);
|
||||||
|
assertEquals(secondFilterWithSig, currentFilter);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void addNewerFilter() {
|
||||||
|
// No filter before adding our filter
|
||||||
|
assertNull(filterManager.getFilter());
|
||||||
|
|
||||||
|
long creationTime = System.currentTimeMillis();
|
||||||
|
Filter firstFilterWithSig = TestFilter.createSignedFilter(ownerPublicKey, privilegedDevEcKey, creationTime);
|
||||||
|
Filter secondFilterWithSig = TestFilter.createSignedFilter(ownerPublicKey, privilegedDevEcKey,
|
||||||
|
creationTime + 100);
|
||||||
|
|
||||||
|
assertNotEquals(firstFilterWithSig, secondFilterWithSig);
|
||||||
|
|
||||||
|
p2pStorageMap.put(
|
||||||
|
new P2PDataStorage.ByteArray(new byte[100]),
|
||||||
|
TestFilter.createProtectedStorageEntryForFilter(firstFilterWithSig)
|
||||||
|
);
|
||||||
|
|
||||||
|
filterManager.onAllServicesInitialized();
|
||||||
|
|
||||||
|
// Our filter got set
|
||||||
|
Filter currentFilter = filterManager.getFilter();
|
||||||
|
assertNotNull(currentFilter);
|
||||||
|
assertEquals(firstFilterWithSig, currentFilter);
|
||||||
|
|
||||||
|
p2pStorageMap.clear();
|
||||||
|
p2pStorageMap.put(
|
||||||
|
new P2PDataStorage.ByteArray(new byte[100]),
|
||||||
|
TestFilter.createProtectedStorageEntryForFilter(secondFilterWithSig)
|
||||||
|
);
|
||||||
|
|
||||||
|
filterManager.onAllServicesInitialized();
|
||||||
|
|
||||||
|
// Our filter got set
|
||||||
|
currentFilter = filterManager.getFilter();
|
||||||
|
assertNotNull(currentFilter);
|
||||||
|
assertEquals(secondFilterWithSig, currentFilter);
|
||||||
|
}
|
||||||
|
}
|
113
core/src/test/java/bisq/core/filter/TestFilter.java
Normal file
113
core/src/test/java/bisq/core/filter/TestFilter.java
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/*
|
||||||
|
* This file is part of Bisq.
|
||||||
|
*
|
||||||
|
* Bisq 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.
|
||||||
|
*
|
||||||
|
* Bisq 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 Bisq. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package bisq.core.filter;
|
||||||
|
|
||||||
|
import bisq.network.p2p.storage.payload.ProtectedStorageEntry;
|
||||||
|
|
||||||
|
import org.bitcoinj.core.ECKey;
|
||||||
|
import org.bitcoinj.core.Sha256Hash;
|
||||||
|
|
||||||
|
import org.bouncycastle.util.encoders.Base64;
|
||||||
|
|
||||||
|
import java.security.PublicKey;
|
||||||
|
|
||||||
|
import java.time.Clock;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static org.bitcoinj.core.Utils.HEX;
|
||||||
|
|
||||||
|
public class TestFilter {
|
||||||
|
|
||||||
|
public static ProtectedStorageEntry createProtectedStorageEntryForFilter(Filter filter) {
|
||||||
|
return new ProtectedStorageEntry(
|
||||||
|
filter,
|
||||||
|
filter.getOwnerPubKey(),
|
||||||
|
1000,
|
||||||
|
new byte[100],
|
||||||
|
Clock.systemDefaultZone()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Filter createSignedFilter(PublicKey ownerPublicKey, ECKey signerKey) {
|
||||||
|
return createSignedFilter(ownerPublicKey, signerKey, System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Filter createSignedFilter(PublicKey ownerPublicKey, ECKey signerKey, long creationDate) {
|
||||||
|
Filter unsignedFilter = createFilter(ownerPublicKey, HEX.encode(signerKey.getPubKey()), creationDate);
|
||||||
|
return signFilter(unsignedFilter, signerKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Filter createFilter(PublicKey ownerPublicKey, String signerPubKeyAsHex) {
|
||||||
|
return createFilter(ownerPublicKey, signerPubKeyAsHex, System.currentTimeMillis());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Filter createFilter(PublicKey ownerPublicKey, String signerPubKeyAsHex, long creationDate) {
|
||||||
|
return new Filter(
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
false,
|
||||||
|
Collections.emptyList(),
|
||||||
|
false,
|
||||||
|
"",
|
||||||
|
"",
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptyList(),
|
||||||
|
ownerPublicKey.getEncoded(),
|
||||||
|
creationDate,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
signerPubKeyAsHex,
|
||||||
|
Collections.emptyList(),
|
||||||
|
false,
|
||||||
|
Collections.emptyList(),
|
||||||
|
Collections.emptySet(),
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
1,
|
||||||
|
Collections.emptyList(),
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
Collections.emptyList()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Filter signFilter(Filter unsignedFilter, ECKey signerKey) {
|
||||||
|
byte[] filterData = unsignedFilter.toProtoMessage().toByteArray();
|
||||||
|
Sha256Hash hash = Sha256Hash.of(filterData);
|
||||||
|
|
||||||
|
ECKey.ECDSASignature ecdsaSignature = signerKey.sign(hash);
|
||||||
|
byte[] encodeToDER = ecdsaSignature.encodeToDER();
|
||||||
|
|
||||||
|
String signatureAsBase64 = new String(Base64.encode(encodeToDER), StandardCharsets.UTF_8);
|
||||||
|
return Filter.cloneWithSig(unsignedFilter, signatureAsBase64);
|
||||||
|
}
|
||||||
|
}
|
|
@ -158,7 +158,7 @@ public class NetworkSettingsView extends ActivatableView<GridPane, Void> {
|
||||||
this.localBitcoinNode = localBitcoinNode;
|
this.localBitcoinNode = localBitcoinNode;
|
||||||
this.torNetworkSettingsWindow = torNetworkSettingsWindow;
|
this.torNetworkSettingsWindow = torNetworkSettingsWindow;
|
||||||
this.clockWatcher = clockWatcher;
|
this.clockWatcher = clockWatcher;
|
||||||
this.configFileEditor = new ConfigFileEditor(config.configFile);
|
this.configFileEditor = new ConfigFileEditor(config.getConfigFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
|
|
|
@ -98,7 +98,8 @@ logback-core = { module = "ch.qos.logback:logback-core", version.ref = "logback"
|
||||||
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback" }
|
logback-classic = { module = "ch.qos.logback:logback-classic", version.ref = "logback" }
|
||||||
|
|
||||||
lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" }
|
lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" }
|
||||||
mockito = { module = "org.mockito:mockito-core", version.ref = "mockito" }
|
mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" }
|
||||||
|
mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version.ref = "mockito" }
|
||||||
natpryce-make-it-easy = { module = "com.natpryce:make-it-easy", version.ref = "natpryce-make-it-easy" }
|
natpryce-make-it-easy = { module = "com.natpryce:make-it-easy", version.ref = "natpryce-make-it-easy" }
|
||||||
|
|
||||||
netlayer-tor-external = { module = "com.github.bisq-network.netlayer:tor.external", version.ref = "netlayer" }
|
netlayer-tor-external = { module = "com.github.bisq-network.netlayer:tor.external", version.ref = "netlayer" }
|
||||||
|
|
|
@ -1739,6 +1739,14 @@
|
||||||
<sha256 value="9146f147483ae9dfdb226eb928e81926122fadc1665648262e6e095d15762ebf" origin="Generated by Gradle"/>
|
<sha256 value="9146f147483ae9dfdb226eb928e81926122fadc1665648262e6e095d15762ebf" origin="Generated by Gradle"/>
|
||||||
</artifact>
|
</artifact>
|
||||||
</component>
|
</component>
|
||||||
|
<component group="org.mockito" name="mockito-junit-jupiter" version="4.0.0">
|
||||||
|
<artifact name="mockito-junit-jupiter-4.0.0.jar">
|
||||||
|
<sha256 value="b87fc61d4810f1705f7aa69ca944fee862e6ba2b5283dc6dd12fcd36db56653f" origin="Generated by Gradle"/>
|
||||||
|
</artifact>
|
||||||
|
<artifact name="mockito-junit-jupiter-4.0.0.pom">
|
||||||
|
<sha256 value="c134b460992fba8e93d1114fb4a8cb90a5657e11f22f5dbbbf15cf3a9b6b2f63" origin="Generated by Gradle"/>
|
||||||
|
</artifact>
|
||||||
|
</component>
|
||||||
<component group="org.objenesis" name="objenesis" version="3.2">
|
<component group="org.objenesis" name="objenesis" version="3.2">
|
||||||
<artifact name="objenesis-3.2.jar">
|
<artifact name="objenesis-3.2.jar">
|
||||||
<sha256 value="03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3" origin="Generated by Gradle"/>
|
<sha256 value="03d960bd5aef03c653eb000413ada15eb77cdd2b8e4448886edf5692805e35f3" origin="Generated by Gradle"/>
|
||||||
|
|
Loading…
Add table
Reference in a new issue