summaryrefslogtreecommitdiff
path: root/internal/ap
diff options
context:
space:
mode:
Diffstat (limited to 'internal/ap')
-rw-r--r--internal/ap/extract.go54
-rw-r--r--internal/ap/extractpolicy_test.go112
-rw-r--r--internal/ap/interfaces.go6
-rw-r--r--internal/ap/normalize.go30
4 files changed, 160 insertions, 42 deletions
diff --git a/internal/ap/extract.go b/internal/ap/extract.go
index 40578b8fc..14b7bb059 100644
--- a/internal/ap/extract.go
+++ b/internal/ap/extract.go
@@ -1173,15 +1173,7 @@ func extractCanLike(
return gtsmodel.PolicyRules{}
}
- withRules := propIter.Get()
- if withRules == nil {
- return gtsmodel.PolicyRules{}
- }
-
- return gtsmodel.PolicyRules{
- Always: extractPolicyValues(withRules.GetGoToSocialAlways(), owner),
- WithApproval: extractPolicyValues(withRules.GetGoToSocialApprovalRequired(), owner),
- }
+ return extractPolicyRules(propIter.Get(), owner)
}
func extractCanReply(
@@ -1197,15 +1189,7 @@ func extractCanReply(
return gtsmodel.PolicyRules{}
}
- withRules := propIter.Get()
- if withRules == nil {
- return gtsmodel.PolicyRules{}
- }
-
- return gtsmodel.PolicyRules{
- Always: extractPolicyValues(withRules.GetGoToSocialAlways(), owner),
- WithApproval: extractPolicyValues(withRules.GetGoToSocialApprovalRequired(), owner),
- }
+ return extractPolicyRules(propIter.Get(), owner)
}
func extractCanAnnounce(
@@ -1226,9 +1210,39 @@ func extractCanAnnounce(
return gtsmodel.PolicyRules{}
}
+ return extractPolicyRules(propIter.Get(), owner)
+}
+
+func extractPolicyRules(
+ withRules WithPolicyRules,
+ owner *gtsmodel.Account,
+) gtsmodel.PolicyRules {
+ if withRules == nil {
+ return gtsmodel.PolicyRules{}
+ }
+
+ // Check for `automaticApproval` and
+ // `manualApproval` properties first.
+ var (
+ automaticApproval = withRules.GetGoToSocialAutomaticApproval()
+ manualApproval = withRules.GetGoToSocialManualApproval()
+ )
+ if (automaticApproval != nil && automaticApproval.Len() != 0) ||
+ (manualApproval != nil && manualApproval.Len() != 0) {
+ // At least one is set, use these props.
+ return gtsmodel.PolicyRules{
+ AutomaticApproval: extractPolicyValues(automaticApproval, owner),
+ ManualApproval: extractPolicyValues(manualApproval, owner),
+ }
+ }
+
+ // Fall back to deprecated `always`
+ // and `withApproval` properties.
+ //
+ // TODO: Remove this in GtS v0.21.0.
return gtsmodel.PolicyRules{
- Always: extractPolicyValues(withRules.GetGoToSocialAlways(), owner),
- WithApproval: extractPolicyValues(withRules.GetGoToSocialApprovalRequired(), owner),
+ AutomaticApproval: extractPolicyValues(withRules.GetGoToSocialAlways(), owner),
+ ManualApproval: extractPolicyValues(withRules.GetGoToSocialApprovalRequired(), owner),
}
}
diff --git a/internal/ap/extractpolicy_test.go b/internal/ap/extractpolicy_test.go
index a5e8db6a7..d735b9618 100644
--- a/internal/ap/extractpolicy_test.go
+++ b/internal/ap/extractpolicy_test.go
@@ -45,6 +45,106 @@ func (suite *ExtractPolicyTestSuite) TestExtractPolicy() {
},
"interactionPolicy": {
"canLike": {
+ "automaticApproval": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ],
+ "manualApproval": []
+ },
+ "canReply": {
+ "automaticApproval": [
+ "http://localhost:8080/users/the_mighty_zork",
+ "http://localhost:8080/users/the_mighty_zork/followers",
+ "https://gts.superseriousbusiness.org/users/dumpsterqueer",
+ "https://gts.superseriousbusiness.org/users/f0x"
+ ],
+ "manualApproval": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ]
+ },
+ "canAnnounce": {
+ "automaticApproval": [
+ "http://localhost:8080/users/the_mighty_zork"
+ ],
+ "manualApproval": [
+ "https://www.w3.org/ns/activitystreams#Public"
+ ]
+ }
+ },
+ "tag": [
+ {
+ "href": "https://gts.superseriousbusiness.org/users/dumpsterqueer",
+ "name": "@dumpsterqueer@superseriousbusiness.org",
+ "type": "Mention"
+ },
+ {
+ "href": "https://gts.superseriousbusiness.org/users/f0x",
+ "name": "@f0x@superseriousbusiness.org",
+ "type": "Mention"
+ }
+ ],
+ "type": "Note"
+}`
+
+ statusable, err := ap.ResolveStatusable(
+ context.Background(),
+ io.NopCloser(
+ bytes.NewBufferString(rawNote),
+ ),
+ )
+ if err != nil {
+ suite.FailNow(err.Error())
+ }
+
+ policy := ap.ExtractInteractionPolicy(
+ statusable,
+ // Zork didn't actually create
+ // this status but nevermind.
+ suite.testAccounts["local_account_1"],
+ )
+
+ expectedPolicy := &gtsmodel.InteractionPolicy{
+ CanLike: gtsmodel.PolicyRules{
+ AutomaticApproval: gtsmodel.PolicyValues{
+ gtsmodel.PolicyValuePublic,
+ },
+ ManualApproval: gtsmodel.PolicyValues{},
+ },
+ CanReply: gtsmodel.PolicyRules{
+ AutomaticApproval: gtsmodel.PolicyValues{
+ gtsmodel.PolicyValueAuthor,
+ gtsmodel.PolicyValueFollowers,
+ "https://gts.superseriousbusiness.org/users/dumpsterqueer",
+ "https://gts.superseriousbusiness.org/users/f0x",
+ },
+ ManualApproval: gtsmodel.PolicyValues{
+ gtsmodel.PolicyValuePublic,
+ },
+ },
+ CanAnnounce: gtsmodel.PolicyRules{
+ AutomaticApproval: gtsmodel.PolicyValues{
+ gtsmodel.PolicyValueAuthor,
+ },
+ ManualApproval: gtsmodel.PolicyValues{
+ gtsmodel.PolicyValuePublic,
+ },
+ },
+ }
+ suite.EqualValues(expectedPolicy, policy)
+}
+
+func (suite *ExtractPolicyTestSuite) TestExtractPolicyDeprecated() {
+ rawNote := `{
+ "@context": [
+ "https://gotosocial.org/ns",
+ "https://www.w3.org/ns/activitystreams"
+ ],
+ "content": "hey @f0x and @dumpsterqueer",
+ "contentMap": {
+ "en": "hey @f0x and @dumpsterqueer",
+ "fr": "bonjour @f0x et @dumpsterqueer"
+ },
+ "interactionPolicy": {
+ "canLike": {
"always": [
"https://www.w3.org/ns/activitystreams#Public"
],
@@ -104,27 +204,27 @@ func (suite *ExtractPolicyTestSuite) TestExtractPolicy() {
expectedPolicy := &gtsmodel.InteractionPolicy{
CanLike: gtsmodel.PolicyRules{
- Always: gtsmodel.PolicyValues{
+ AutomaticApproval: gtsmodel.PolicyValues{
gtsmodel.PolicyValuePublic,
},
- WithApproval: gtsmodel.PolicyValues{},
+ ManualApproval: gtsmodel.PolicyValues{},
},
CanReply: gtsmodel.PolicyRules{
- Always: gtsmodel.PolicyValues{
+ AutomaticApproval: gtsmodel.PolicyValues{
gtsmodel.PolicyValueAuthor,
gtsmodel.PolicyValueFollowers,
"https://gts.superseriousbusiness.org/users/dumpsterqueer",
"https://gts.superseriousbusiness.org/users/f0x",
},
- WithApproval: gtsmodel.PolicyValues{
+ ManualApproval: gtsmodel.PolicyValues{
gtsmodel.PolicyValuePublic,
},
},
CanAnnounce: gtsmodel.PolicyRules{
- Always: gtsmodel.PolicyValues{
+ AutomaticApproval: gtsmodel.PolicyValues{
gtsmodel.PolicyValueAuthor,
},
- WithApproval: gtsmodel.PolicyValues{
+ ManualApproval: gtsmodel.PolicyValues{
gtsmodel.PolicyValuePublic,
},
},
diff --git a/internal/ap/interfaces.go b/internal/ap/interfaces.go
index 28b5c0d20..faf793bd8 100644
--- a/internal/ap/interfaces.go
+++ b/internal/ap/interfaces.go
@@ -755,8 +755,10 @@ type WithInteractionPolicy interface {
// WithPolicyRules represents an activity with always and approvalRequired properties.
type WithPolicyRules interface {
- GetGoToSocialAlways() vocab.GoToSocialAlwaysProperty
- GetGoToSocialApprovalRequired() vocab.GoToSocialApprovalRequiredProperty
+ GetGoToSocialAutomaticApproval() vocab.GoToSocialAutomaticApprovalProperty
+ GetGoToSocialManualApproval() vocab.GoToSocialManualApprovalProperty
+ GetGoToSocialAlways() vocab.GoToSocialAlwaysProperty // Deprecated
+ GetGoToSocialApprovalRequired() vocab.GoToSocialApprovalRequiredProperty // Deprecated
}
// WithApprovedBy represents a Statusable with the approvedBy property.
diff --git a/internal/ap/normalize.go b/internal/ap/normalize.go
index f6608ed94..fb9dbe0a6 100644
--- a/internal/ap/normalize.go
+++ b/internal/ap/normalize.go
@@ -582,16 +582,16 @@ func NormalizeOutgoingContentProp(item WithContent, rawJSON map[string]interface
//
// "interactionPolicy": {
// "canAnnounce": {
-// "always": "https://www.w3.org/ns/activitystreams#Public",
-// "approvalRequired": []
+// "automaticApproval": "https://www.w3.org/ns/activitystreams#Public",
+// "manualApproval": []
// },
// "canLike": {
-// "always": "https://www.w3.org/ns/activitystreams#Public",
-// "approvalRequired": []
+// "automaticApproval": "https://www.w3.org/ns/activitystreams#Public",
+// "manualApproval": []
// },
// "canReply": {
-// "always": "https://www.w3.org/ns/activitystreams#Public",
-// "approvalRequired": []
+// "automaticApproval": "https://www.w3.org/ns/activitystreams#Public",
+// "manualApproval": []
// }
// }
//
@@ -599,22 +599,22 @@ func NormalizeOutgoingContentProp(item WithContent, rawJSON map[string]interface
//
// "interactionPolicy": {
// "canAnnounce": {
-// "always": [
+// "automaticApproval": [
// "https://www.w3.org/ns/activitystreams#Public"
// ],
-// "approvalRequired": []
+// "manualApproval": []
// },
// "canLike": {
-// "always": [
+// "automaticApproval": [
// "https://www.w3.org/ns/activitystreams#Public"
// ],
-// "approvalRequired": []
+// "manualApproval": []
// },
// "canReply": {
-// "always": [
+// "automaticApproval": [
// "https://www.w3.org/ns/activitystreams#Public"
// ],
-// "approvalRequired": []
+// "manualApproval": []
// }
// }
//
@@ -655,8 +655,10 @@ func NormalizeOutgoingInteractionPolicyProp(item WithInteractionPolicy, rawJSON
}
for _, PolicyValuesKey := range []string{
- "always",
- "approvalRequired",
+ "automaticApproval",
+ "manualApproval",
+ "always", // deprecated
+ "approvalRequired", // deprecated
} {
PolicyValuesVal, ok := rulesValMap[PolicyValuesKey]
if !ok {