diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java index dd870587..779e4024 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java @@ -19,10 +19,7 @@ import org.qortal.repository.RepositoryManager; import org.qortal.arbitrary.ArbitraryDataFile.*; import org.qortal.settings.Settings; import org.qortal.transform.Transformer; -import org.qortal.utils.ArbitraryTransactionUtils; -import org.qortal.utils.Base58; -import org.qortal.utils.FilesystemUtils; -import org.qortal.utils.ZipUtils; +import org.qortal.utils.*; import javax.crypto.BadPaddingException; import javax.crypto.IllegalBlockSizeException; @@ -373,7 +370,7 @@ public class ArbitraryDataReader { ArbitraryTransactionUtils.checkAndRelocateMiscFiles(transactionData); if (!arbitraryDataFile.allFilesExist()) { - if (ArbitraryDataStorageManager.getInstance().isNameBlocked(transactionData.getName())) { + if (ListUtils.isNameBlocked(transactionData.getName())) { throw new DataException( String.format("Unable to request missing data for file %s because the name is blocked", arbitraryDataFile)); } else { diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java index b3175e71..79bb882b 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataResource.java @@ -11,13 +11,13 @@ import org.qortal.controller.arbitrary.ArbitraryDataManager; import org.qortal.controller.arbitrary.ArbitraryDataStorageManager; import org.qortal.data.arbitrary.ArbitraryResourceStatus; import org.qortal.data.transaction.ArbitraryTransactionData; -import org.qortal.list.ResourceListManager; import org.qortal.repository.DataException; import org.qortal.repository.Repository; import org.qortal.repository.RepositoryManager; import org.qortal.settings.Settings; import org.qortal.utils.ArbitraryTransactionUtils; import org.qortal.utils.FilesystemUtils; +import org.qortal.utils.ListUtils; import org.qortal.utils.NTP; import java.io.IOException; @@ -74,8 +74,7 @@ public class ArbitraryDataResource { } // Check if the name is blocked - if (ResourceListManager.getInstance() - .listContains("blockedNames", this.resourceId, false)) { + if (ListUtils.isNameBlocked(this.resourceId)) { return new ArbitraryResourceStatus(Status.BLOCKED, this.localChunkCount, this.totalChunkCount); } diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java index f3d9d8cd..9d57ce8a 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCleanupManager.java @@ -11,10 +11,7 @@ import org.qortal.repository.RepositoryManager; import org.qortal.settings.Settings; import org.qortal.transaction.Transaction; import org.qortal.transaction.Transaction.TransactionType; -import org.qortal.utils.ArbitraryTransactionUtils; -import org.qortal.utils.Base58; -import org.qortal.utils.FilesystemUtils; -import org.qortal.utils.NTP; +import org.qortal.utils.*; import java.io.File; import java.io.IOException; @@ -239,7 +236,7 @@ public class ArbitraryDataCleanupManager extends Thread { // Delete random data associated with name if we're over our storage limit for this name // Use the DELETION_THRESHOLD, for the same reasons as above - for (String followedName : storageManager.followedNames()) { + for (String followedName : ListUtils.followedNames()) { if (isStopping) { return; } @@ -487,7 +484,7 @@ public class ArbitraryDataCleanupManager extends Thread { // Delete data relating to blocked names String name = directory.getName(); - if (name != null && storageManager.isNameBlocked(name)) { + if (name != null && ListUtils.isNameBlocked(name)) { this.safeDeleteDirectory(directory, "blocked name"); } diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java index 9f61bd15..2fd6033e 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataFileListManager.java @@ -20,6 +20,7 @@ import org.qortal.repository.Repository; import org.qortal.repository.RepositoryManager; import org.qortal.settings.Settings; import org.qortal.utils.Base58; +import org.qortal.utils.ListUtils; import org.qortal.utils.NTP; import org.qortal.utils.Triple; @@ -503,7 +504,7 @@ public class ArbitraryDataFileListManager { // Forwarding if (isRelayRequest && Settings.getInstance().isRelayModeEnabled()) { - boolean isBlocked = (arbitraryTransactionData == null || ArbitraryDataStorageManager.getInstance().isNameBlocked(arbitraryTransactionData.getName())); + boolean isBlocked = (arbitraryTransactionData == null || ListUtils.isNameBlocked(arbitraryTransactionData.getName())); if (!isBlocked) { Peer requestingPeer = request.getB(); if (requestingPeer != null) { @@ -682,7 +683,7 @@ public class ArbitraryDataFileListManager { } // We may need to forward this request on - boolean isBlocked = (transactionData == null || ArbitraryDataStorageManager.getInstance().isNameBlocked(transactionData.getName())); + boolean isBlocked = (transactionData == null || ListUtils.isNameBlocked(transactionData.getName())); if (Settings.getInstance().isRelayModeEnabled() && !isBlocked) { // In relay mode - so ask our other peers if they have it diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java index 99e490b6..567dcdd3 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataManager.java @@ -27,6 +27,7 @@ import org.qortal.transaction.ArbitraryTransaction; import org.qortal.transaction.Transaction.TransactionType; import org.qortal.utils.ArbitraryTransactionUtils; import org.qortal.utils.Base58; +import org.qortal.utils.ListUtils; import org.qortal.utils.NTP; public class ArbitraryDataManager extends Thread { @@ -172,7 +173,7 @@ public class ArbitraryDataManager extends Thread { private void processNames() throws InterruptedException { // Fetch latest list of followed names - List followedNames = ResourceListManager.getInstance().getStringsInList("followedNames"); + List followedNames = ListUtils.followedNames(); if (followedNames == null || followedNames.isEmpty()) { return; } diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java index ededbfa6..8b7d1a69 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataStorageManager.java @@ -5,15 +5,11 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.data.transaction.ArbitraryTransactionData; import org.qortal.data.transaction.TransactionData; -import org.qortal.list.ResourceListManager; import org.qortal.repository.DataException; import org.qortal.repository.Repository; import org.qortal.settings.Settings; import org.qortal.transaction.Transaction; -import org.qortal.utils.ArbitraryTransactionUtils; -import org.qortal.utils.Base58; -import org.qortal.utils.FilesystemUtils; -import org.qortal.utils.NTP; +import org.qortal.utils.*; import java.io.IOException; import java.io.UncheckedIOException; @@ -135,11 +131,11 @@ public class ArbitraryDataStorageManager extends Thread { case ALL: case VIEWED: // If the policy includes viewed data, we can host it as long as it's not blocked - return !this.isNameBlocked(name); + return !ListUtils.isNameBlocked(name); case FOLLOWED: // If the policy is for followed data only, we have to be following it - return this.isFollowingName(name); + return ListUtils.isFollowingName(name); // For NONE or all else, we shouldn't host this data case NONE: @@ -188,14 +184,14 @@ public class ArbitraryDataStorageManager extends Thread { } // Never fetch data from blocked names, even if they are followed - if (this.isNameBlocked(name)) { + if (ListUtils.isNameBlocked(name)) { return false; } switch (Settings.getInstance().getStoragePolicy()) { case FOLLOWED: case FOLLOWED_OR_VIEWED: - return this.isFollowingName(name); + return ListUtils.isFollowingName(name); case ALL: return true; @@ -235,7 +231,7 @@ public class ArbitraryDataStorageManager extends Thread { * @return boolean - whether the resource is blocked or not */ public boolean isBlocked(ArbitraryTransactionData arbitraryTransactionData) { - return isNameBlocked(arbitraryTransactionData.getName()); + return ListUtils.isNameBlocked(arbitraryTransactionData.getName()); } private boolean isDataTypeAllowed(ArbitraryTransactionData arbitraryTransactionData) { @@ -253,22 +249,6 @@ public class ArbitraryDataStorageManager extends Thread { return true; } - public boolean isNameBlocked(String name) { - return ResourceListManager.getInstance().listContains("blockedNames", name, false); - } - - private boolean isFollowingName(String name) { - return ResourceListManager.getInstance().listContains("followedNames", name, false); - } - - public List followedNames() { - return ResourceListManager.getInstance().getStringsInList("followedNames"); - } - - private int followedNamesCount() { - return ResourceListManager.getInstance().getItemCountForList("followedNames"); - } - public List loadAllHostedTransactions(Repository repository) { @@ -513,7 +493,7 @@ public class ArbitraryDataStorageManager extends Thread { return true; } - int followedNamesCount = this.followedNamesCount(); + int followedNamesCount = ListUtils.followedNamesCount(); if (followedNamesCount == 0) { // Not following any names, so we have space return true; @@ -543,7 +523,7 @@ public class ArbitraryDataStorageManager extends Thread { } public long storageCapacityPerName(double threshold) { - int followedNamesCount = this.followedNamesCount(); + int followedNamesCount = ListUtils.followedNamesCount(); if (followedNamesCount == 0) { // Not following any names, so we have the total space available return this.getStorageCapacityIncludingThreshold(threshold); diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryMetadataManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryMetadataManager.java index eec0d935..97d659ad 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryMetadataManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryMetadataManager.java @@ -16,6 +16,7 @@ import org.qortal.repository.Repository; import org.qortal.repository.RepositoryManager; import org.qortal.settings.Settings; import org.qortal.utils.Base58; +import org.qortal.utils.ListUtils; import org.qortal.utils.NTP; import org.qortal.utils.Triple; @@ -332,7 +333,7 @@ public class ArbitraryMetadataManager { } // Check if the name is blocked - boolean isBlocked = (arbitraryTransactionData == null || ArbitraryDataStorageManager.getInstance().isNameBlocked(arbitraryTransactionData.getName())); + boolean isBlocked = (arbitraryTransactionData == null || ListUtils.isNameBlocked(arbitraryTransactionData.getName())); if (!isBlocked) { Peer requestingPeer = request.getB(); if (requestingPeer != null) { @@ -420,7 +421,7 @@ public class ArbitraryMetadataManager { } // We may need to forward this request on - boolean isBlocked = (transactionData == null || ArbitraryDataStorageManager.getInstance().isNameBlocked(transactionData.getName())); + boolean isBlocked = (transactionData == null || ListUtils.isNameBlocked(transactionData.getName())); if (Settings.getInstance().isRelayModeEnabled() && !isBlocked) { // In relay mode - so ask our other peers if they have it diff --git a/src/main/java/org/qortal/transaction/ChatTransaction.java b/src/main/java/org/qortal/transaction/ChatTransaction.java index 5ed96494..f6e26802 100644 --- a/src/main/java/org/qortal/transaction/ChatTransaction.java +++ b/src/main/java/org/qortal/transaction/ChatTransaction.java @@ -8,6 +8,7 @@ import java.util.function.Predicate; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; +import org.qortal.controller.arbitrary.ArbitraryDataStorageManager; import org.qortal.crypto.Crypto; import org.qortal.crypto.MemoryPoW; import org.qortal.data.naming.NameData; @@ -22,6 +23,7 @@ import org.qortal.settings.Settings; import org.qortal.transform.TransformationException; import org.qortal.transform.transaction.ChatTransactionTransformer; import org.qortal.transform.transaction.TransactionTransformer; +import org.qortal.utils.ListUtils; import org.qortal.utils.NTP; public class ChatTransaction extends Transaction { @@ -156,8 +158,7 @@ public class ChatTransaction extends Transaction { } // Check for blocked author by address - ResourceListManager listManager = ResourceListManager.getInstance(); - if (listManager.listContains("blockedAddresses", this.chatTransactionData.getSender(), true)) { + if (ListUtils.isAddressBlocked(this.chatTransactionData.getSender())) { return ValidationResult.ADDRESS_BLOCKED; } @@ -166,7 +167,7 @@ public class ChatTransaction extends Transaction { if (names != null && names.size() > 0) { for (NameData nameData : names) { if (nameData != null && nameData.getName() != null) { - if (listManager.listContains("blockedNames", nameData.getName(), false)) { + if (ListUtils.isNameBlocked(nameData.getName())) { return ValidationResult.NAME_BLOCKED; } } diff --git a/src/main/java/org/qortal/utils/ListUtils.java b/src/main/java/org/qortal/utils/ListUtils.java new file mode 100644 index 00000000..80aa9bfd --- /dev/null +++ b/src/main/java/org/qortal/utils/ListUtils.java @@ -0,0 +1,38 @@ +package org.qortal.utils; + +import org.qortal.list.ResourceListManager; + +import java.util.List; + +public class ListUtils { + + /* Blocking */ + + public static List blockedNames() { + return ResourceListManager.getInstance().getStringsInList("blockedNames"); + } + + public static boolean isNameBlocked(String name) { + return ResourceListManager.getInstance().listContains("blockedNames", name, false); + } + + public static boolean isAddressBlocked(String address) { + return ResourceListManager.getInstance().listContains("blockedAddresses", address, true); + } + + + /* Following */ + + public static List followedNames() { + return ResourceListManager.getInstance().getStringsInList("followedNames"); + } + + public static boolean isFollowingName(String name) { + return ResourceListManager.getInstance().listContains("followedNames", name, false); + } + + public static int followedNamesCount() { + return ListUtils.followedNames().size(); + } + +} diff --git a/src/test/java/org/qortal/test/arbitrary/ArbitraryDataStorageCapacityTests.java b/src/test/java/org/qortal/test/arbitrary/ArbitraryDataStorageCapacityTests.java index 2042a30c..028c054d 100644 --- a/src/test/java/org/qortal/test/arbitrary/ArbitraryDataStorageCapacityTests.java +++ b/src/test/java/org/qortal/test/arbitrary/ArbitraryDataStorageCapacityTests.java @@ -24,6 +24,7 @@ import org.qortal.test.common.TransactionUtils; import org.qortal.test.common.transaction.TestTransaction; import org.qortal.transaction.RegisterNameTransaction; import org.qortal.utils.Base58; +import org.qortal.utils.ListUtils; import org.qortal.utils.NTP; import java.io.IOException; @@ -103,6 +104,7 @@ public class ArbitraryDataStorageCapacityTests extends Common { // Storage capacity should initially equal the total assertEquals(0, resourceListManager.getItemCountForList("followedNames")); + assertEquals(0, ListUtils.followedNamesCount()); long totalStorageCapacity = storageManager.getStorageCapacityIncludingThreshold(storageFullThreshold); assertEquals(totalStorageCapacity, storageManager.storageCapacityPerName(storageFullThreshold)); @@ -114,6 +116,7 @@ public class ArbitraryDataStorageCapacityTests extends Common { // Ensure the followed name count is correct assertEquals(4, resourceListManager.getItemCountForList("followedNames")); + assertEquals(4, ListUtils.followedNamesCount()); // Storage space per name should be the total storage capacity divided by the number of names long expectedStorageCapacityPerName = (long)(totalStorageCapacity / 4.0f);