140 lines
3.9 KiB
Go

package control
import (
"encoding/json"
"fmt"
"github.com/spf13/cobra"
"github.com/yukimochi/Activity-Relay/models"
)
func domainCmdInit() *cobra.Command {
var domain = &cobra.Command{
Use: "domain",
Short: "Manage subscriber domain",
Long: "List all subscriber, set/unset domain as limited or blocked and undo subscribe domain.",
}
var domainList = &cobra.Command{
Use: "list [flags]",
Short: "List domain",
Long: "List domain which filtered given type.",
RunE: func(cmd *cobra.Command, args []string) error {
return initProxyE(listDomains, cmd, args)
},
}
domainList.Flags().StringP("type", "t", "subscriber", "domain type [subscriber,limited,blocked]")
domain.AddCommand(domainList)
var domainSet = &cobra.Command{
Use: "set [flags]",
Short: "Set or unset domain as limited or blocked",
Long: "Set or unset domain as limited or blocked.",
Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
return initProxyE(setDomainType, cmd, args)
},
}
domainSet.Flags().StringP("type", "t", "", "Apply domain type [limited,blocked]")
domainSet.MarkFlagRequired("type")
domainSet.Flags().BoolP("undo", "u", false, "Unset domain as limited or blocked")
domain.AddCommand(domainSet)
var domainUnfollow = &cobra.Command{
Use: "unfollow [flags]",
Short: "Send Unfollow request for given domains",
Long: "Send unfollow request for given domains.",
RunE: func(cmd *cobra.Command, args []string) error {
return initProxyE(unfollowDomains, cmd, args)
},
}
domain.AddCommand(domainUnfollow)
return domain
}
func createUnfollowRequestResponse(subscription models.Subscription) error {
activity := models.Activity{
Context: []string{"https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1"},
ID: subscription.ActivityID,
Actor: subscription.ActorID,
Type: "Follow",
Object: "https://www.w3.org/ns/activitystreams#Public",
}
resp := activity.GenerateResponse(globalConfig.ServerHostname(), "Reject")
jsonData, _ := json.Marshal(&resp)
pushRegisterJob(subscription.InboxURL, jsonData)
return nil
}
func listDomains(cmd *cobra.Command, args []string) error {
var domains []string
switch cmd.Flag("type").Value.String() {
case "limited":
cmd.Println(" - Limited domain :")
domains = relayState.LimitedDomains
case "blocked":
cmd.Println(" - Blocked domain :")
domains = relayState.BlockedDomains
default:
cmd.Println(" - Subscriber domain :")
temp := relayState.Subscriptions
for _, domain := range temp {
domains = append(domains, domain.Domain)
}
}
for _, domain := range domains {
cmd.Println(domain)
}
cmd.Println(fmt.Sprintf("Total : %d", len(domains)))
return nil
}
func setDomainType(cmd *cobra.Command, args []string) error {
undo := cmd.Flag("undo").Value.String() == "true"
switch cmd.Flag("type").Value.String() {
case "limited":
for _, domain := range args {
relayState.SetLimitedDomain(domain, !undo)
if undo {
cmd.Println("Unset [" + domain + "] as limited domain")
} else {
cmd.Println("Set [" + domain + "] as limited domain")
}
}
case "blocked":
for _, domain := range args {
relayState.SetBlockedDomain(domain, !undo)
if undo {
cmd.Println("Unset [" + domain + "] as blocked domain")
} else {
cmd.Println("Set [" + domain + "] as blocked domain")
}
}
default:
cmd.Println("Invalid type given")
}
return nil
}
func unfollowDomains(cmd *cobra.Command, args []string) error {
subscriptions := relayState.Subscriptions
for _, domain := range args {
if contains(subscriptions, domain) {
subscription := *relayState.SelectSubscription(domain)
createUnfollowRequestResponse(subscription)
relayState.DelSubscription(subscription.Domain)
cmd.Println("Unfollow [" + subscription.Domain + "]")
break
} else {
cmd.Println("Invalid domain [" + domain + "] given")
}
}
return nil
}