From ff5b5e2b5a91c112ad092c356a408ada04b30a55 Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Sat, 27 Feb 2021 19:29:39 -0500 Subject: [PATCH 1/4] testing unlisted --- src/BirdsiteLive/Controllers/DebugingController.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/BirdsiteLive/Controllers/DebugingController.cs b/src/BirdsiteLive/Controllers/DebugingController.cs index ff8f0b4..252486e 100644 --- a/src/BirdsiteLive/Controllers/DebugingController.cs +++ b/src/BirdsiteLive/Controllers/DebugingController.cs @@ -90,10 +90,17 @@ public async Task PostNote() published = nowString, url = noteUrl, attributedTo = actor, + + // Unlisted to = new[] { to }, - //cc = new [] { "https://www.w3.org/ns/activitystreams#Public" }, + cc = new [] { "https://www.w3.org/ns/activitystreams#Public" }, + + //// Public + //to = new[] { "https://www.w3.org/ns/activitystreams#Public" }, + //cc = new[] { to }, + sensitive = false, - content = "

Woooot

", + content = "

TEST PUBLIC

", attachment = new Attachment[0], tag = new Tag[0] } From 834c999d5347ae68bdb6678db3286ac967c5db92 Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Sat, 27 Feb 2021 22:12:50 -0500 Subject: [PATCH 2/4] added unlisted publication capability --- .../Settings/InstanceSettings.cs | 2 ++ .../Repository/ModerationRepository.cs | 8 ++--- .../Repository/PublicationRepository.cs | 30 +++++++++++++++++++ src/BirdsiteLive.Domain/StatusService.cs | 15 +++++++--- ...{ModerationParser.cs => PatternsParser.cs} | 2 +- src/BirdsiteLive/appsettings.json | 5 ++-- ...nParserTests.cs => PatternsParserTests.cs} | 20 ++++++------- 7 files changed, 61 insertions(+), 21 deletions(-) create mode 100644 src/BirdsiteLive.Domain/Repository/PublicationRepository.cs rename src/BirdsiteLive.Domain/Tools/{ModerationParser.cs => PatternsParser.cs} (95%) rename src/Tests/BirdsiteLive.Domain.Tests/Tools/{ModerationParserTests.cs => PatternsParserTests.cs} (86%) diff --git a/src/BirdsiteLive.Common/Settings/InstanceSettings.cs b/src/BirdsiteLive.Common/Settings/InstanceSettings.cs index 1214002..678c45d 100644 --- a/src/BirdsiteLive.Common/Settings/InstanceSettings.cs +++ b/src/BirdsiteLive.Common/Settings/InstanceSettings.cs @@ -8,5 +8,7 @@ public class InstanceSettings public bool ResolveMentionsInProfiles { get; set; } public bool PublishReplies { get; set; } public int MaxUsersCapacity { get; set; } + + public string UnlistedTwitterAccounts { get; set; } } } \ No newline at end of file diff --git a/src/BirdsiteLive.Domain/Repository/ModerationRepository.cs b/src/BirdsiteLive.Domain/Repository/ModerationRepository.cs index f3e23f5..6afc05d 100644 --- a/src/BirdsiteLive.Domain/Repository/ModerationRepository.cs +++ b/src/BirdsiteLive.Domain/Repository/ModerationRepository.cs @@ -26,10 +26,10 @@ public class ModerationRepository : IModerationRepository #region Ctor public ModerationRepository(ModerationSettings settings) { - var parsedFollowersWhiteListing = ModerationParser.Parse(settings.FollowersWhiteListing); - var parsedFollowersBlackListing = ModerationParser.Parse(settings.FollowersBlackListing); - var parsedTwitterAccountsWhiteListing = ModerationParser.Parse(settings.TwitterAccountsWhiteListing); - var parsedTwitterAccountsBlackListing = ModerationParser.Parse(settings.TwitterAccountsBlackListing); + var parsedFollowersWhiteListing = PatternsParser.Parse(settings.FollowersWhiteListing); + var parsedFollowersBlackListing = PatternsParser.Parse(settings.FollowersBlackListing); + var parsedTwitterAccountsWhiteListing = PatternsParser.Parse(settings.TwitterAccountsWhiteListing); + var parsedTwitterAccountsBlackListing = PatternsParser.Parse(settings.TwitterAccountsBlackListing); _followersWhiteListing = parsedFollowersWhiteListing .Select(x => ModerationRegexParser.Parse(ModerationEntityTypeEnum.Follower, x)) diff --git a/src/BirdsiteLive.Domain/Repository/PublicationRepository.cs b/src/BirdsiteLive.Domain/Repository/PublicationRepository.cs new file mode 100644 index 0000000..31e94ef --- /dev/null +++ b/src/BirdsiteLive.Domain/Repository/PublicationRepository.cs @@ -0,0 +1,30 @@ +using System.Linq; +using BirdsiteLive.Common.Settings; +using BirdsiteLive.Domain.Tools; + +namespace BirdsiteLive.Domain.Repository +{ + public interface IPublicationRepository + { + bool IsUnlisted(string twitterAcct); + } + + public class PublicationRepository : IPublicationRepository + { + private readonly string[] _unlistedAccounts; + + #region Ctor + public PublicationRepository(InstanceSettings settings) + { + _unlistedAccounts = PatternsParser.Parse(settings.UnlistedTwitterAccounts); + } + #endregion + + public bool IsUnlisted(string twitterAcct) + { + if (_unlistedAccounts == null || !_unlistedAccounts.Any()) return false; + + return _unlistedAccounts.Contains(twitterAcct.ToLowerInvariant()); + } + } +} \ No newline at end of file diff --git a/src/BirdsiteLive.Domain/StatusService.cs b/src/BirdsiteLive.Domain/StatusService.cs index e25d52b..e901db8 100644 --- a/src/BirdsiteLive.Domain/StatusService.cs +++ b/src/BirdsiteLive.Domain/StatusService.cs @@ -7,6 +7,7 @@ using BirdsiteLive.ActivityPub.Converters; using BirdsiteLive.ActivityPub.Models; using BirdsiteLive.Common.Settings; +using BirdsiteLive.Domain.Repository; using BirdsiteLive.Domain.Statistics; using BirdsiteLive.Domain.Tools; using BirdsiteLive.Twitter.Models; @@ -25,13 +26,15 @@ public class StatusService : IStatusService private readonly InstanceSettings _instanceSettings; private readonly IStatusExtractor _statusExtractor; private readonly IExtractionStatisticsHandler _statisticsHandler; - + private readonly IPublicationRepository _publicationRepository; + #region Ctor - public StatusService(InstanceSettings instanceSettings, IStatusExtractor statusExtractor, IExtractionStatisticsHandler statisticsHandler) + public StatusService(InstanceSettings instanceSettings, IStatusExtractor statusExtractor, IExtractionStatisticsHandler statisticsHandler, IPublicationRepository publicationRepository) { _instanceSettings = instanceSettings; _statusExtractor = statusExtractor; _statisticsHandler = statisticsHandler; + _publicationRepository = publicationRepository; } #endregion @@ -42,6 +45,11 @@ public Note GetStatus(string username, ExtractedTweet tweet) var to = $"{actorUrl}/followers"; + var isUnlisted = _publicationRepository.IsUnlisted(username); + var cc = new string[0]; + if (isUnlisted) + cc = new[] {"https://www.w3.org/ns/activitystreams#Public"}; + var extractedTags = _statusExtractor.Extract(tweet.MessageContent); _statisticsHandler.ExtractedStatus(extractedTags.tags.Count(x => x.type == "Mention")); @@ -71,8 +79,7 @@ public Note GetStatus(string username, ExtractedTweet tweet) inReplyTo = inReplyTo, to = new[] { to }, - //cc = new[] { "https://www.w3.org/ns/activitystreams#Public" }, - cc = new string[0], + cc = cc, sensitive = false, content = $"

{content}

", diff --git a/src/BirdsiteLive.Domain/Tools/ModerationParser.cs b/src/BirdsiteLive.Domain/Tools/PatternsParser.cs similarity index 95% rename from src/BirdsiteLive.Domain/Tools/ModerationParser.cs rename to src/BirdsiteLive.Domain/Tools/PatternsParser.cs index a338b20..bd77c62 100644 --- a/src/BirdsiteLive.Domain/Tools/ModerationParser.cs +++ b/src/BirdsiteLive.Domain/Tools/PatternsParser.cs @@ -3,7 +3,7 @@ namespace BirdsiteLive.Domain.Tools { - public class ModerationParser + public class PatternsParser { public static string[] Parse(string entry) { diff --git a/src/BirdsiteLive/appsettings.json b/src/BirdsiteLive/appsettings.json index e5b4c7c..e25c7ca 100644 --- a/src/BirdsiteLive/appsettings.json +++ b/src/BirdsiteLive/appsettings.json @@ -19,8 +19,9 @@ "Domain": "domain.name", "AdminEmail": "me@domain.name", "ResolveMentionsInProfiles": true, - "PublishReplies": false, - "MaxUsersCapacity": 800 + "PublishReplies": false, + "MaxUsersCapacity": 800, + "UnlistedTwitterAccounts": null }, "Db": { "Type": "postgres", diff --git a/src/Tests/BirdsiteLive.Domain.Tests/Tools/ModerationParserTests.cs b/src/Tests/BirdsiteLive.Domain.Tests/Tools/PatternsParserTests.cs similarity index 86% rename from src/Tests/BirdsiteLive.Domain.Tests/Tools/ModerationParserTests.cs rename to src/Tests/BirdsiteLive.Domain.Tests/Tools/PatternsParserTests.cs index 59030fa..848be99 100644 --- a/src/Tests/BirdsiteLive.Domain.Tests/Tools/ModerationParserTests.cs +++ b/src/Tests/BirdsiteLive.Domain.Tests/Tools/PatternsParserTests.cs @@ -5,7 +5,7 @@ namespace BirdsiteLive.Domain.Tests.Tools { [TestClass] - public class ModerationParserTests + public class PatternsParserTests { [TestMethod] public void Parse_Simple_Test() @@ -14,7 +14,7 @@ public void Parse_Simple_Test() var entry = "test"; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(1, result.Length); @@ -29,7 +29,7 @@ public void Parse_Null_Test() string entry = null; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(0, result.Length); @@ -43,7 +43,7 @@ public void Parse_WhiteSpace_Test() var entry = " "; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(0, result.Length); @@ -57,7 +57,7 @@ public void Parse_PipeSeparator_Test() var entry = "test|test2"; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(2, result.Length); @@ -73,7 +73,7 @@ public void Parse_SemicolonSeparator_Test() var entry = "test;test2"; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(2, result.Length); @@ -89,7 +89,7 @@ public void Parse_CommaSeparator_Test() var entry = "test,test2"; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(2, result.Length); @@ -105,7 +105,7 @@ public void Parse_SemicolonSeparator_EmptyEntry_Test() var entry = "test;test2;"; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(2, result.Length); @@ -121,7 +121,7 @@ public void Parse_SemicolonSeparator_WhiteSpace_Test() var entry = "test; test2"; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(2, result.Length); @@ -137,7 +137,7 @@ public void Parse_SemicolonSeparator_EmptyEntry_WhiteSpace_Test() var entry = "test; test2; "; #endregion - var result = ModerationParser.Parse(entry); + var result = PatternsParser.Parse(entry); #region Validations Assert.AreEqual(2, result.Length); From d421cd1163ec37423d11154ea92fdead38a4240a Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Sat, 27 Feb 2021 22:19:03 -0500 Subject: [PATCH 3/4] added doc for unlisted accounts --- VARIABLES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/VARIABLES.md b/VARIABLES.md index 32176f9..42276d4 100644 --- a/VARIABLES.md +++ b/VARIABLES.md @@ -46,6 +46,7 @@ If both whitelisting and blacklisting are set, only the whitelisting will be act * `Instance:Name` (default: BirdsiteLIVE) the name of the instance * `Instance:ResolveMentionsInProfiles` (default: true) to enable or disable mentions parsing in profile's description. Resolving it will consume more User's API calls since newly discovered account can also contain references to others accounts as well. On a big instance it is recommended to disable it. * `Instance:PublishReplies` (default: false) to enable or disable replies publishing. +* `Instance:UnlistedTwitterAccounts` (default: null) to enable unlisted publication for selected twitter accounts, separated by `;` (please limit this to brands and other public profiles). # Docker Compose full example @@ -76,6 +77,7 @@ services: + - Instance:Name=MyTwitterRelay + - Instance:ResolveMentionsInProfiles=false + - Instance:PublishReplies=true ++ - Instance:UnlistedTwitterAccounts=cocacola;twitter networks: [...] From 699f422e1bfe33ee06d384e3c79ad9d4efee7c88 Mon Sep 17 00:00:00 2001 From: Nicolas Constant Date: Sat, 27 Feb 2021 22:19:29 -0500 Subject: [PATCH 4/4] road to 0.16.0 --- src/BirdsiteLive/BirdsiteLive.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BirdsiteLive/BirdsiteLive.csproj b/src/BirdsiteLive/BirdsiteLive.csproj index e57b4a4..42670a7 100644 --- a/src/BirdsiteLive/BirdsiteLive.csproj +++ b/src/BirdsiteLive/BirdsiteLive.csproj @@ -4,7 +4,7 @@ netcoreapp3.1 d21486de-a812-47eb-a419-05682bb68856 Linux - 0.15.0 + 0.16.0