| 
									
										
										
										
											2023-09-04 15:55:17 +02:00
										 |  |  | // GoToSocial | 
					
						
							|  |  |  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | // SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program 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. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package gtsmodel | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"path" | 
					
						
							| 
									
										
										
										
											2024-11-28 11:54:22 +00:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2023-09-04 15:55:17 +02:00
										 |  |  | 	"time" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // AdminActionCategory describes the category | 
					
						
							|  |  |  | // of entity that this admin action targets. | 
					
						
							|  |  |  | type AdminActionCategory uint8 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Only ever add new action categories to the *END* of the list | 
					
						
							|  |  |  | // below, DO NOT insert them before/between other entries! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	AdminActionCategoryUnknown AdminActionCategory = iota | 
					
						
							|  |  |  | 	AdminActionCategoryAccount | 
					
						
							|  |  |  | 	AdminActionCategoryDomain | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c AdminActionCategory) String() string { | 
					
						
							|  |  |  | 	switch c { | 
					
						
							|  |  |  | 	case AdminActionCategoryAccount: | 
					
						
							|  |  |  | 		return "account" | 
					
						
							|  |  |  | 	case AdminActionCategoryDomain: | 
					
						
							|  |  |  | 		return "domain" | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2023-09-21 12:12:04 +02:00
										 |  |  | 		return "unknown" //nolint:goconst | 
					
						
							| 
									
										
										
										
											2023-09-04 15:55:17 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-28 11:54:22 +00:00
										 |  |  | func ParseAdminActionCategory(in string) AdminActionCategory { | 
					
						
							|  |  |  | 	switch strings.ToLower(in) { | 
					
						
							| 
									
										
										
										
											2023-09-04 15:55:17 +02:00
										 |  |  | 	case "account": | 
					
						
							|  |  |  | 		return AdminActionCategoryAccount | 
					
						
							|  |  |  | 	case "domain": | 
					
						
							|  |  |  | 		return AdminActionCategoryDomain | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		return AdminActionCategoryUnknown | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // AdminActionType describes a type of | 
					
						
							|  |  |  | // action taken on an entity by an admin. | 
					
						
							|  |  |  | type AdminActionType uint8 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Only ever add new action types to the *END* of the list | 
					
						
							|  |  |  | // below, DO NOT insert them before/between other entries! | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	AdminActionUnknown AdminActionType = iota | 
					
						
							|  |  |  | 	AdminActionDisable | 
					
						
							|  |  |  | 	AdminActionReenable | 
					
						
							|  |  |  | 	AdminActionSilence | 
					
						
							|  |  |  | 	AdminActionUnsilence | 
					
						
							|  |  |  | 	AdminActionSuspend | 
					
						
							|  |  |  | 	AdminActionUnsuspend | 
					
						
							| 
									
										
										
										
											2023-09-12 11:43:12 +02:00
										 |  |  | 	AdminActionExpireKeys | 
					
						
							| 
									
										
										
										
											2025-06-15 12:36:51 +02:00
										 |  |  | 	AdminActionUnallow | 
					
						
							| 
									
										
										
										
											2023-09-04 15:55:17 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (t AdminActionType) String() string { | 
					
						
							|  |  |  | 	switch t { | 
					
						
							|  |  |  | 	case AdminActionDisable: | 
					
						
							|  |  |  | 		return "disable" | 
					
						
							|  |  |  | 	case AdminActionReenable: | 
					
						
							|  |  |  | 		return "reenable" | 
					
						
							|  |  |  | 	case AdminActionSilence: | 
					
						
							|  |  |  | 		return "silence" | 
					
						
							|  |  |  | 	case AdminActionUnsilence: | 
					
						
							|  |  |  | 		return "unsilence" | 
					
						
							|  |  |  | 	case AdminActionSuspend: | 
					
						
							|  |  |  | 		return "suspend" | 
					
						
							|  |  |  | 	case AdminActionUnsuspend: | 
					
						
							|  |  |  | 		return "unsuspend" | 
					
						
							| 
									
										
										
										
											2023-09-12 11:43:12 +02:00
										 |  |  | 	case AdminActionExpireKeys: | 
					
						
							|  |  |  | 		return "expire-keys" | 
					
						
							| 
									
										
										
										
											2025-06-15 12:36:51 +02:00
										 |  |  | 	case AdminActionUnallow: | 
					
						
							|  |  |  | 		return "unallow" | 
					
						
							| 
									
										
										
										
											2023-09-04 15:55:17 +02:00
										 |  |  | 	default: | 
					
						
							|  |  |  | 		return "unknown" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-28 11:54:22 +00:00
										 |  |  | func ParseAdminActionType(in string) AdminActionType { | 
					
						
							|  |  |  | 	switch strings.ToLower(in) { | 
					
						
							| 
									
										
										
										
											2023-09-04 15:55:17 +02:00
										 |  |  | 	case "disable": | 
					
						
							|  |  |  | 		return AdminActionDisable | 
					
						
							|  |  |  | 	case "reenable": | 
					
						
							|  |  |  | 		return AdminActionReenable | 
					
						
							|  |  |  | 	case "silence": | 
					
						
							|  |  |  | 		return AdminActionSilence | 
					
						
							|  |  |  | 	case "unsilence": | 
					
						
							|  |  |  | 		return AdminActionUnsilence | 
					
						
							|  |  |  | 	case "suspend": | 
					
						
							|  |  |  | 		return AdminActionSuspend | 
					
						
							|  |  |  | 	case "unsuspend": | 
					
						
							|  |  |  | 		return AdminActionUnsuspend | 
					
						
							| 
									
										
										
										
											2023-09-12 11:43:12 +02:00
										 |  |  | 	case "expire-keys": | 
					
						
							|  |  |  | 		return AdminActionExpireKeys | 
					
						
							| 
									
										
										
										
											2025-06-15 12:36:51 +02:00
										 |  |  | 	case "unallow": | 
					
						
							|  |  |  | 		return AdminActionUnallow | 
					
						
							| 
									
										
										
										
											2023-09-04 15:55:17 +02:00
										 |  |  | 	default: | 
					
						
							|  |  |  | 		return AdminActionUnknown | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // AdminAction models an action taken by an instance administrator towards an account, domain, etc. | 
					
						
							|  |  |  | type AdminAction struct { | 
					
						
							|  |  |  | 	ID             string              `bun:"type:CHAR(26),pk,nullzero,notnull,unique"`                    // ID of this item in the database. | 
					
						
							|  |  |  | 	CreatedAt      time.Time           `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // Creation time of this item. | 
					
						
							|  |  |  | 	UpdatedAt      time.Time           `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // Last updated time of this item. | 
					
						
							|  |  |  | 	CompletedAt    time.Time           `bun:"type:timestamptz,nullzero"`                                   // Completion time of this item. | 
					
						
							|  |  |  | 	TargetCategory AdminActionCategory `bun:",nullzero,notnull"`                                           // Category of the entity targeted by this action. | 
					
						
							|  |  |  | 	TargetID       string              `bun:",nullzero,notnull"`                                           // Identifier of the target. May be a ULID (in case of accounts), or a domain name (in case of domains). | 
					
						
							|  |  |  | 	Target         interface{}         `bun:"-"`                                                           // Target of the action. Might be a domain string, might be an account. | 
					
						
							|  |  |  | 	Type           AdminActionType     `bun:",nullzero,notnull"`                                           // Type of action that was taken. | 
					
						
							|  |  |  | 	AccountID      string              `bun:"type:CHAR(26),notnull,nullzero"`                              // Who performed this admin action. | 
					
						
							|  |  |  | 	Account        *Account            `bun:"rel:has-one"`                                                 // Account corresponding to accountID | 
					
						
							|  |  |  | 	Text           string              `bun:",nullzero"`                                                   // Free text field for explaining why this action was taken, or adding a note about this action. | 
					
						
							|  |  |  | 	SendEmail      *bool               `bun:",nullzero,notnull,default:false"`                             // Send an email to the target account's user to explain what happened (local accounts only). | 
					
						
							|  |  |  | 	ReportIDs      []string            `bun:"reports,array"`                                               // IDs of any reports cited when creating this action. | 
					
						
							|  |  |  | 	Reports        []*Report           `bun:"-"`                                                           // Reports corresponding to ReportIDs. | 
					
						
							|  |  |  | 	Errors         []string            `bun:",array"`                                                      // String value of any error(s) encountered while processing. May be helpful for admins to debug. | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Key returns a key for the AdminAction which is | 
					
						
							|  |  |  | // unique only on its TargetCategory and TargetID | 
					
						
							|  |  |  | // fields. This key can be used to check if this | 
					
						
							|  |  |  | // AdminAction overlaps with another action performed | 
					
						
							|  |  |  | // on the same target, regardless of the Type of | 
					
						
							|  |  |  | // either this or the other action. | 
					
						
							|  |  |  | func (a *AdminAction) Key() string { | 
					
						
							|  |  |  | 	return path.Join( | 
					
						
							|  |  |  | 		a.TargetCategory.String(), | 
					
						
							|  |  |  | 		a.TargetID, | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | } |