diff --git a/feeds/feed.go b/feeds/feed.go deleted file mode 100644 index 00c4aa2..0000000 --- a/feeds/feed.go +++ /dev/null @@ -1,4 +0,0 @@ -package feeds - -type Feed struct { -} diff --git a/mailer/NewUserRequest.go b/mailer/NewUserRequest.go new file mode 100644 index 0000000..47e5e6b --- /dev/null +++ b/mailer/NewUserRequest.go @@ -0,0 +1,5 @@ +package mailer + +type NewUserMailData struct { + Domain string +} diff --git a/mailer/mail.go b/mailer/mail.go new file mode 100644 index 0000000..b1f09a1 --- /dev/null +++ b/mailer/mail.go @@ -0,0 +1,12 @@ +package mailer + +import ( + "io/fs" + + mail "github.com/xhit/go-simple-mail/v2" +) + +type MailClient struct { + mailServer *mail.SMTPServer + templatesFs fs.FS +} diff --git a/mailer/templates/NewUserRequest.html b/mailer/templates/NewUserRequest.html new file mode 100644 index 0000000..a805bee --- /dev/null +++ b/mailer/templates/NewUserRequest.html @@ -0,0 +1,23 @@ + + + +
+ + +New user is awaiting account approval
+{{ .Reason }}
+ + + diff --git a/main.go b/main.go index 36aa1d2..71bd806 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ import ( "git.mstar.dev/mstar/linstrom/shared" "git.mstar.dev/mstar/linstrom/storage" "git.mstar.dev/mstar/linstrom/storage/cache" + "git.mstar.dev/mstar/linstrom/util" ) // TODO: Add frontend overwrite @@ -28,7 +29,7 @@ var reactiveFS embed.FS var nojsFS embed.FS //go:embed duck.webp -var defaultDuck string +var placeholderFile string func main() { other.SetupFlags() @@ -76,7 +77,7 @@ func main() { UserStore: store, SessionStore: store, SessionMaxAge: time.Hour * 24, - }, passkey.WithLogger(&shared.ZerologWrapper{})) + }, passkey.WithLogger(&util.ZerologWrapper{})) if err != nil { log.Fatal().Err(err).Msg("Failed to setup passkey support") } @@ -84,9 +85,9 @@ func main() { server := server.NewServer( store, pkey, - shared.NewFSWrapper(reactiveFS, "frontend-reactive/dist/", false), - shared.NewFSWrapper(nojsFS, "frontend-noscript/", false), - &defaultDuck, + util.NewFSWrapper(reactiveFS, "frontend-reactive/dist/", false), + util.NewFSWrapper(nojsFS, "frontend-noscript/", false), + &placeholderFile, ) server.Start(":8000") // TODO: Set up media server diff --git a/server/apiLinstromNotes.go b/server/apiLinstromNotes.go index d478647..2aea464 100644 --- a/server/apiLinstromNotes.go +++ b/server/apiLinstromNotes.go @@ -8,8 +8,8 @@ import ( "github.com/google/jsonapi" "github.com/rs/zerolog/hlog" - "git.mstar.dev/mstar/linstrom/shared" "git.mstar.dev/mstar/linstrom/storage" + "git.mstar.dev/mstar/linstrom/util" ) // Notes @@ -98,7 +98,7 @@ func linstromNewNote(w http.ResponseWriter, r *http.Request) { return } - rawTags := shared.TagsFromText(newNote.RawContent) + rawTags := util.TagsFromText(newNote.RawContent) note, err := store.CreateNoteLocal( actorId, diff --git a/storage-new/models/MediaMetadata.go b/storage-new/models/MediaMetadata.go index 777364a..a090bb4 100644 --- a/storage-new/models/MediaMetadata.go +++ b/storage-new/models/MediaMetadata.go @@ -31,20 +31,3 @@ type MediaMetadata struct { // Whether the media is to be blurred by default Blurred bool } - -// TODO: Implement special handling for the linstrom URI type -// Linstrom URIs indicate resource either generated on the fly, like identicons, -// or embedded data, such as the default duck -// For external users, transform them into normal http URIs with a "special" path -const DefaultDuckLocationName = "linstrom://default-media" - -var DefaultDuckMedia = MediaMetadata{ - ID: "3b562a45-36b7-4c42-a944-3672f319ff7b", - OwnedById: "", // FIXME: Add default user ID here - Remote: false, - Location: DefaultDuckLocationName, - Type: "image/webp", - Name: "default-duck.webp", - AltText: "a greyscale image of a pidgeon on some smooth surface, likely a liquid. It is captioned with the text \"Duck\"", - Blurred: false, -} diff --git a/storage-new/models/RemoteServer.go b/storage-new/models/RemoteServer.go index 9f5d8e6..457d2c7 100644 --- a/storage-new/models/RemoteServer.go +++ b/storage-new/models/RemoteServer.go @@ -3,7 +3,6 @@ package models import ( "database/sql" - "git.mstar.dev/mstar/linstrom/config" "gorm.io/gorm" ) @@ -18,17 +17,3 @@ type RemoteServer struct { IconId sql.NullString // ID of a media file IsSelf bool // Whether this server is yours truly } - -func BuildDefaultServer() *RemoteServer { - return &RemoteServer{ - Model: gorm.Model{ - ID: 1, - }, - ServerType: ServerSoftwareLinstrom, - Domain: config.GlobalConfig.General.GetFullDomain(), - Name: config.GlobalConfig.Self.ServerDisplayName, - Icon: &DefaultDuckMedia, - IconId: sql.NullString{String: DefaultDuckMedia.ID, Valid: true}, - IsSelf: true, - } -} diff --git a/storage-new/models/RolesDefaults.go b/storage-new/models/RolesDefaults.go index 3d6274e..fc1b746 100644 --- a/storage-new/models/RolesDefaults.go +++ b/storage-new/models/RolesDefaults.go @@ -232,7 +232,7 @@ var ServerActorRole = Role{ CanSendAnnouncements: other.IntoPointer(true), } -var AllDefaultRoles = []*Role{ +var allDefaultRoles = []*Role{ &DefaultUserRole, &FullAdminRole, &AccountFreezeRole, diff --git a/storage-new/models/User.go b/storage-new/models/User.go index f8051c0..e1ea2bd 100644 --- a/storage-new/models/User.go +++ b/storage-new/models/User.go @@ -6,8 +6,6 @@ import ( "gorm.io/gen" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/config" ) // A user describes an account for creating content and events. @@ -38,8 +36,8 @@ type User struct { // When this entry was deleted (for soft deletions) // Soft delete means that this entry still exists in the db, but gorm won't include it anymore unless specifically told to // If not null, this entry is marked as deleted - DeletedAt gorm.DeletedAt `gorm:"index"` - Server RemoteServer + DeletedAt gorm.DeletedAt `gorm:"index"` + // Server RemoteServer // `gorm:"foreignKey:ServerId;references:ID"` // The server this user is from ServerId uint // Id of the server this user is from, needed for including RemoteServer DisplayName string // The display name of the user. Can be different from the handle Description string // The description of a user account @@ -80,25 +78,6 @@ type User struct { AuthMethods []UserAuthMethod } -func BuildLinstromUser() *User { - server := BuildDefaultServer() - return &User{ - ID: "e3f4bb33-6d39-4349-b13e-f5c6fde56141", - Username: "linstrom", - Server: *server, - ServerId: server.ID, - DisplayName: config.GlobalConfig.Self.ServerActorDisplayName, - Description: "The default linstrom server user", - IsBot: true, - Icon: DefaultDuckMedia, - IconId: DefaultDuckMedia.ID, - Background: nil, - BackgroundId: sql.NullString{Valid: false}, - Banner: nil, - BannerId: sql.NullString{Valid: false}, - } -} - type IUser interface { // Get a user by a username // diff --git a/storage/cache.go b/storage/cache.go index dc4a26d..77e36b6 100644 --- a/storage/cache.go +++ b/storage/cache.go @@ -6,8 +6,7 @@ import ( "github.com/redis/go-redis/v9" "github.com/rs/zerolog/log" - - "git.mstar.dev/mstar/linstrom/shared" + "git.mstar.dev/mstar/linstrom/util" ) // various prefixes for accessing items in the cache (since it's a simple key-value store) @@ -27,7 +26,7 @@ var errCacheNotFound = errors.New("not found in cache") // err contains an error describing why an account's id couldn't be found // The most common one should be errCacheNotFound func (s *Storage) cacheHandleToAccUid(handle string) (accId *string, err error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) // Where to put the data (in case it's found) var target string found, err := s.cache.Get(cacheUserHandleToIdPrefix+strings.TrimLeft(handle, "@"), &target) @@ -49,7 +48,7 @@ func (s *Storage) cacheHandleToAccUid(handle string) (accId *string, err error) // err contains an error describing why an account's id couldn't be found // The most common one should be errCacheNotFound func (s *Storage) cacheLocalUsernameToAccUid(username string) (accId *string, err error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) // Where to put the data (in case it's found) var target string found, err := s.cache.Get(cacheLocalUsernameToIdPrefix+username, &target) @@ -67,7 +66,7 @@ func (s *Storage) cacheLocalUsernameToAccUid(username string) (accId *string, er } func (s *Storage) cachePkeyIdToAccId(pkeyId []byte) (accId *string, err error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) // Where to put the data (in case it's found) var target string found, err := s.cache.Get(cachePasskeyIdToAccIdPrefix+string(pkeyId), &target) @@ -89,7 +88,7 @@ func (s *Storage) cachePkeyIdToAccId(pkeyId []byte) (accId *string, err error) { // err contains an error describing why an account couldn't be found // The most common one should be errCacheNotFound func (s *Storage) cacheAccIdToData(id string) (acc *Account, err error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) var target Account found, err := s.cache.Get(cacheUserIdToAccPrefix+id, &target) if !found { @@ -107,7 +106,7 @@ func (s *Storage) cacheAccIdToData(id string) (acc *Account, err error) { // err contains an error describing why a note couldn't be found // The most common one should be errCacheNotFound func (s *Storage) cacheNoteIdToData(id string) (note *Note, err error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) target := Note{} found, err := s.cache.Get(cacheNoteIdToNotePrefix+id, &target) if !found { diff --git a/storage/cache/cache.go b/storage/cache/cache.go index d3a563f..264f718 100644 --- a/storage/cache/cache.go +++ b/storage/cache/cache.go @@ -12,9 +12,8 @@ import ( ristretto_store "github.com/eko/gocache/store/ristretto/v4" "github.com/redis/go-redis/v9" "github.com/rs/zerolog/log" - "git.mstar.dev/mstar/linstrom/config" - "git.mstar.dev/mstar/linstrom/shared" + "git.mstar.dev/mstar/linstrom/util" ) type Cache struct { @@ -74,7 +73,7 @@ func NewCache(maxSize int64, redisUrl *string) (*Cache, error) { } func (c *Cache) Get(key string, target any) (bool, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return false, nil data, err := c.cache.Get(ctxBackground, key) if err != nil { @@ -88,7 +87,7 @@ func (c *Cache) Get(key string, target any) (bool, error) { } func (c *Cache) Set(key string, value any) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return nil data, err := c.encoders.Encode(value) if err != nil { @@ -99,7 +98,7 @@ func (c *Cache) Set(key string, value any) error { } func (c *Cache) Delete(key string) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) // Error return doesn't matter here. Delete is delete is gone _ = c.cache.Delete(ctxBackground, key) } diff --git a/storage/inboundJobs.go b/storage/inboundJobs.go index 52018ad..df3c0e2 100644 --- a/storage/inboundJobs.go +++ b/storage/inboundJobs.go @@ -2,9 +2,8 @@ package storage import ( "github.com/rs/zerolog/log" + "git.mstar.dev/mstar/linstrom/util" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/shared" ) // Auto-generate string names for the various constants @@ -38,7 +37,7 @@ type InboundJob struct { } func (s *Storage) AddNewInboundJob(data []byte, source InboundJobSource, inboxOwner *string) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) newJob := InboundJob{ RawData: data, Source: source, @@ -49,7 +48,7 @@ func (s *Storage) AddNewInboundJob(data []byte, source InboundJobSource, inboxOw // Get the specified amount of jobs, sorted by age (oldest first) func (s *Storage) GetOldestInboundJobs(amount uint) ([]InboundJob, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) jobs := []InboundJob{} switch err := s.db.Order("id asc, created_at asc").Limit(int(amount)).Find(jobs).Error; err { case gorm.ErrRecordNotFound: @@ -62,7 +61,7 @@ func (s *Storage) GetOldestInboundJobs(amount uint) ([]InboundJob, error) { } func (s *Storage) CompleteInboundJob(id uint) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) s.db.Delete(InboundJob{Model: gorm.Model{ID: id}}) return nil } diff --git a/storage/mediaFile.go b/storage/mediaFile.go index 4f45079..e83cb25 100644 --- a/storage/mediaFile.go +++ b/storage/mediaFile.go @@ -4,9 +4,8 @@ import ( "time" "github.com/rs/zerolog/log" + "git.mstar.dev/mstar/linstrom/util" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/shared" ) // MediaMetadata contains metadata about some media @@ -37,7 +36,7 @@ type MediaMetadata struct { func (s *Storage) NewMediaMetadata( ownerId, location, mediaType, name string, ) (*MediaMetadata, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) newMedia := MediaMetadata{ OwnedBy: ownerId, Location: location, @@ -49,7 +48,7 @@ func (s *Storage) NewMediaMetadata( } func (s *Storage) FuzzyFindMediaMetadataByName(name string) ([]MediaMetadata, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) notes := []MediaMetadata{} err := s.db.Where("name LIKE %?%", name).Find(notes).Error if err != nil { @@ -59,7 +58,7 @@ func (s *Storage) FuzzyFindMediaMetadataByName(name string) ([]MediaMetadata, er } func (s *Storage) GetMediaMetadataById(id string) (*MediaMetadata, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) media := MediaMetadata{ID: id} err := s.db.First(&media).Error if err != nil { @@ -69,7 +68,7 @@ func (s *Storage) GetMediaMetadataById(id string) (*MediaMetadata, error) { } func (s *Storage) FuzzyFindMediaMetadataByLocation(location string) ([]MediaMetadata, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) data := []MediaMetadata{} if err := s.db.Where("location LIKE %?%", location).Find(data).Error; err != nil { return nil, err @@ -78,18 +77,18 @@ func (s *Storage) FuzzyFindMediaMetadataByLocation(location string) ([]MediaMeta } func (s *Storage) DeleteMediaMetadataById(id string) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return s.db.Delete(MediaMetadata{ID: id}).Error } func (s *Storage) DeleteMediaMetadataByFuzzyLocation(location string) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) var tmp MediaMetadata return s.db.Where("location LIKE %?%", location).Delete(&tmp).Error } func (s *Storage) DeleteMediaMetadataByFuzzyName(name string) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) var tmp MediaMetadata return s.db.Where("name LIKE %?%", name).Delete(&tmp).Error } diff --git a/storage/notes.go b/storage/notes.go index 3c40fae..fd87cec 100644 --- a/storage/notes.go +++ b/storage/notes.go @@ -5,9 +5,8 @@ import ( "time" "github.com/rs/zerolog/log" + "git.mstar.dev/mstar/linstrom/util" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/shared" ) // Note represents an ActivityPub note @@ -42,7 +41,7 @@ type Note struct { } func (s *Storage) FindNoteById(id string) (*Note, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) note := &Note{} cacheNote, err := s.cacheNoteIdToData(id) switch err { @@ -71,7 +70,7 @@ func (s *Storage) FindNoteById(id string) (*Note, error) { } func (s *Storage) FindNotesByFuzzyContent(fuzzyContent string) ([]Note, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) notes := []Note{} // TODO: Figure out if cache can be used here too err := s.db.Where("raw_content LIKE %?%", fuzzyContent).Find(notes).Error @@ -82,7 +81,7 @@ func (s *Storage) FindNotesByFuzzyContent(fuzzyContent string) ([]Note, error) { } func (s *Storage) FindNotesByAuthorHandle(handle string) ([]Note, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) acc, err := s.FindAccountByFullHandle(handle) if err != nil { return nil, fmt.Errorf("account with handle %s not found: %w", handle, err) @@ -91,7 +90,7 @@ func (s *Storage) FindNotesByAuthorHandle(handle string) ([]Note, error) { } func (s *Storage) FindNotesByAuthorId(id string) ([]Note, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) notes := []Note{} err := s.db.Where("creator = ?", id).Find(notes).Error switch err { @@ -105,7 +104,7 @@ func (s *Storage) FindNotesByAuthorId(id string) ([]Note, error) { } func (s *Storage) UpdateNote(note *Note) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) if note == nil || note.ID == "" { return ErrInvalidData } @@ -134,7 +133,7 @@ func (s *Storage) CreateNoteLocal( accessLevel NoteAccessLevel, tags []string, ) (*Note, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) // TODO: Implement me panic("not implemented") } @@ -152,13 +151,13 @@ func (s *Storage) CreateNoteRemote( tags []string, originId string, ) (*Note, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) // TODO: Implement me panic("not implemented") } func (s *Storage) DeleteNote(id string) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) s.cache.Delete(cacheNoteIdToNotePrefix + id) s.db.Delete(Note{ID: id}) } diff --git a/storage/outboundJobs.go b/storage/outboundJobs.go index 0fe6995..99e3eac 100644 --- a/storage/outboundJobs.go +++ b/storage/outboundJobs.go @@ -2,9 +2,8 @@ package storage import ( "github.com/rs/zerolog/log" + "git.mstar.dev/mstar/linstrom/util" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/shared" ) type OutboundJob struct { @@ -16,7 +15,7 @@ type OutboundJob struct { } func (s *Storage) AddNewOutboundJob(data []byte, targetDomain string, targetUrl string) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) newJob := OutboundJob{ Data: data, TargetServer: targetDomain, @@ -27,7 +26,7 @@ func (s *Storage) AddNewOutboundJob(data []byte, targetDomain string, targetUrl // Get the specified amount of jobs, sorted by age (oldest first) func (s *Storage) GetOldestOutboundJobs(amount uint) ([]OutboundJob, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) jobs := []OutboundJob{} err := s.db.Order("id asc, created_at asc").Limit(int(amount)).Find(jobs).Error switch err { @@ -41,7 +40,7 @@ func (s *Storage) GetOldestOutboundJobs(amount uint) ([]OutboundJob, error) { } func (s *Storage) GetOutboundJobsForDomain(domain string, amount uint) ([]OutboundJob, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) jobs := []OutboundJob{} err := s.db.Where("target_server = ?", domain). Order("id asc, created_at asc"). @@ -59,7 +58,7 @@ func (s *Storage) GetOutboundJobsForDomain(domain string, amount uint) ([]Outbou } func (s *Storage) CompleteOutboundJob(id uint) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) s.db.Delete(OutboundJob{Model: gorm.Model{ID: id}}) return nil } diff --git a/storage/passkeySessions.go b/storage/passkeySessions.go index 97ca0d6..62c0cf6 100644 --- a/storage/passkeySessions.go +++ b/storage/passkeySessions.go @@ -4,8 +4,7 @@ import ( "github.com/go-webauthn/webauthn/webauthn" "github.com/google/uuid" "github.com/rs/zerolog/log" - - "git.mstar.dev/mstar/linstrom/shared" + "git.mstar.dev/mstar/linstrom/util" ) // Session data used during login attempts with a passkey @@ -20,7 +19,7 @@ type PasskeySession struct { // Generate some id for a new session. Just returns a new uuid func (s *Storage) GenSessionID() (string, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) x := uuid.NewString() log.Debug().Str("session-id", x).Msg("Generated new passkey session id") return x, nil @@ -29,7 +28,7 @@ func (s *Storage) GenSessionID() (string, error) { // Look for an active session with a given id // Returns the session if found and a bool indicating if a session was found func (s *Storage) GetSession(sessionId string) (*webauthn.SessionData, bool) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Str("id", sessionId).Msg("Looking for passkey session") session := PasskeySession{} res := s.db.Where("id = ?", sessionId).First(&session) @@ -42,7 +41,7 @@ func (s *Storage) GetSession(sessionId string) (*webauthn.SessionData, bool) { // Save (or update) a session with the new data func (s *Storage) SaveSession(token string, data *webauthn.SessionData) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Str("id", token).Any("webauthn-data", data).Msg("Saving passkey session") session := PasskeySession{ ID: token, @@ -54,7 +53,7 @@ func (s *Storage) SaveSession(token string, data *webauthn.SessionData) { // Delete a session // NOTE: This is a hard delete since the session struct contains no DeletedAt field func (s *Storage) DeleteSession(token string) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Str("id", token).Msg("Deleting passkey session (if one exists)") s.db.Delete(&PasskeySession{ID: token}) } diff --git a/storage/remoteServerInfo.go b/storage/remoteServerInfo.go index fec15ad..6fdd90e 100644 --- a/storage/remoteServerInfo.go +++ b/storage/remoteServerInfo.go @@ -2,9 +2,8 @@ package storage import ( "github.com/rs/zerolog/log" + "git.mstar.dev/mstar/linstrom/util" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/shared" ) type RemoteServer struct { @@ -17,7 +16,7 @@ type RemoteServer struct { } func (s *Storage) FindRemoteServerByDomain(url string) (*RemoteServer, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) server := RemoteServer{} err := s.db.Where("domain = ?").First(&server).Error switch err { @@ -32,7 +31,7 @@ func (s *Storage) FindRemoteServerByDomain(url string) (*RemoteServer, error) { // Find a remote server with a given display name func (s *Storage) FindRemoteServerByDisplayName(displayName string) (*RemoteServer, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) server := RemoteServer{} err := s.db.Where("name = ?", displayName).First(&server).Error switch err { @@ -46,7 +45,7 @@ func (s *Storage) FindRemoteServerByDisplayName(displayName string) (*RemoteServ } func (s *Storage) FindRemoteServerById(id uint) (*RemoteServer, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) server := RemoteServer{} err := s.db.First(&server, id).Error switch err { @@ -64,7 +63,7 @@ func (s *Storage) NewRemoteServer( url, displayName, icon string, serverType RemoteServerType, ) (*RemoteServer, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) _, err := s.FindRemoteServerByDomain(url) switch err { case nil: @@ -91,7 +90,7 @@ func (s *Storage) NewRemoteServer( // If icon is set, update that // Returns the updated version func (s *Storage) UpdateRemoteServer(url string, displayName, icon *string) (*RemoteServer, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) if displayName == nil && icon == nil { return nil, ErrNothingToChange } diff --git a/storage/roles.go b/storage/roles.go index c822883..2f50d37 100644 --- a/storage/roles.go +++ b/storage/roles.go @@ -2,10 +2,9 @@ package storage import ( "git.mstar.dev/mstar/goutils/sliceutils" + "git.mstar.dev/mstar/linstrom/util" "github.com/rs/zerolog/log" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/shared" ) // Could I collapse all these go:generate command into more condensed ones? @@ -15,7 +14,7 @@ import ( // This is explicit in what is being done. And easier to understand //go:generate go build -o RolesGenerator ../cmd/RolesGenerator/main.go -//go:generate ./RolesGenerator -input=roles.go -output=rolesshared_generated.go +//go:generate ./RolesGenerator -input=roles.go -output=rolesUtil_generated.go //go:generate rm RolesGenerator //go:generate go build -o ApiGenerator ../cmd/RolesApiTypeGenerator/main.go @@ -187,7 +186,7 @@ Misskey "permissions" (no order): */ func (s *Storage) NewEmptyRole(name string) (*Role, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) // Check if a role with the given name already exists _, err := s.FindRoleByName(name) switch err { @@ -208,7 +207,7 @@ func (s *Storage) NewEmptyRole(name string) (*Role, error) { } func (s *Storage) FindRoleByName(name string) (*Role, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) role := Role{} err := s.db.Where("name = ?", name).First(&role).Error switch err { @@ -222,7 +221,7 @@ func (s *Storage) FindRoleByName(name string) (*Role, error) { } func (s *Storage) FindRolesByNames(names []string) ([]Role, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) roles := []Role{} err := s.db.Where("name IN ?", names).Find(&roles).Error switch err { @@ -236,7 +235,7 @@ func (s *Storage) FindRolesByNames(names []string) ([]Role, error) { } func (s *Storage) UpdateRole(role *Role) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return s.db.Save(role).Error } @@ -248,6 +247,6 @@ func (s *Storage) DeleteRoleByName(name string) error { ) { return ErrNotAllowed } - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return s.db.Where(&Role{Name: name, IsBuiltIn: false}).Delete(&Role{}).Error } diff --git a/storage/storage.go b/storage/storage.go index 47f92ce..527d134 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -10,12 +10,11 @@ import ( "fmt" "github.com/rs/zerolog/log" + "git.mstar.dev/mstar/linstrom/config" + "git.mstar.dev/mstar/linstrom/storage/cache" + "git.mstar.dev/mstar/linstrom/util" "gorm.io/driver/postgres" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/config" - "git.mstar.dev/mstar/linstrom/shared" - "git.mstar.dev/mstar/linstrom/storage/cache" ) // Always keep a reference of the server's own RemoteServer entry here @@ -31,7 +30,7 @@ type Storage struct { } func NewStorage(dbUrl string, cache *cache.Cache) (*Storage, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) db, err := gorm.Open(postgres.Open(dbUrl), &gorm.Config{ Logger: newGormLogger(log.Logger), }) @@ -74,7 +73,7 @@ func NewStorage(dbUrl string, cache *cache.Cache) (*Storage, error) { } func (s *Storage) insertSelfFromConfig() error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) const ServerActorId = "self" var err error @@ -140,7 +139,7 @@ func (s *Storage) insertSelfFromConfig() error { } func (s *Storage) insertDefaultRoles() error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) for _, role := range allDefaultRoles { log.Debug().Str("role-name", role.Name).Msg("Inserting default role") if err := s.db.FirstOrCreate(role).Error; err != nil { @@ -151,7 +150,7 @@ func (s *Storage) insertDefaultRoles() error { } func (s *Storage) insertPlaceholderFile() error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return s.db.Model(&MediaMetadata{}).Assign(&MediaMetadata{ ID: "placeholder", Type: "image/webp", diff --git a/storage/user.go b/storage/user.go index 725a19f..1c8a4b6 100644 --- a/storage/user.go +++ b/storage/user.go @@ -8,12 +8,12 @@ import ( "strings" "time" - "git.mstar.dev/mstar/linstrom/ap" - "git.mstar.dev/mstar/linstrom/shared" "github.com/go-webauthn/webauthn/webauthn" "github.com/google/uuid" "github.com/mstarongithub/passkey" "github.com/rs/zerolog/log" + "git.mstar.dev/mstar/linstrom/ap" + "git.mstar.dev/mstar/linstrom/util" "gorm.io/gorm" ) @@ -102,7 +102,7 @@ type RemoteAccountLinks struct { // Find an account in the db using a given full handle (@max@example.com) // Returns an account and nil if an account is found, otherwise nil and the error func (s *Storage) FindAccountByFullHandle(handle string) (*Account, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Str("account-handle", handle).Msg("Looking for account by handle") log.Debug().Str("account-handle", handle).Msg("Checking if there's a cache hit") @@ -155,7 +155,7 @@ func (s *Storage) FindAccountByFullHandle(handle string) (*Account, error) { // Find an account given a specific ID func (s *Storage) FindAccountById(id string) (*Account, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Str("account-id", id).Msg("Looking for account by id") log.Debug().Str("account-id", id).Msg("First trying to hit cache") acc, err := s.cacheAccIdToData(id) @@ -187,7 +187,7 @@ func (s *Storage) FindAccountById(id string) (*Account, error) { } func (s *Storage) FindLocalAccountByUsername(username string) (*Account, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Str("account-username", username).Msg("Looking for local account") log.Debug().Str("account-username", username).Msg("Checking cache first") @@ -238,7 +238,7 @@ func (s *Storage) FindLocalAccountByUsername(username string) (*Account, error) } func (s *Storage) FindAccountByPasskeyId(pkeyId []byte) (*Account, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Bytes("account-passkey-id", pkeyId).Msg("Looking for account") log.Debug().Bytes("account-passkey-id", pkeyId).Msg("Checking cache first") @@ -290,7 +290,7 @@ func (s *Storage) FindAccountByPasskeyId(pkeyId []byte) (*Account, error) { // Update a given account in storage and cache func (s *Storage) UpdateAccount(acc *Account) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) // If the account is nil or doesn't have an id, error out if acc == nil || acc.ID == "" { return ErrInvalidData @@ -307,7 +307,7 @@ func (s *Storage) UpdateAccount(acc *Account) error { // Create a new empty account for future use func (s *Storage) NewEmptyAccount() (*Account, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Msg("Creating new empty account") acc := Account{} // Generate the 64 bit id for passkey and webauthn stuff @@ -353,7 +353,7 @@ func (s *Storage) NewEmptyAccount() (*Account, error) { // The handle in this case is only the part before the domain (example: @bob@example.com would have a handle of bob) // It also sets up a bunch of values that tend to be obvious for local accounts func (s *Storage) NewLocalAccount(handle string) (*Account, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Trace().Caller().Send() log.Debug().Str("account-handle", handle).Msg("Creating new local account") acc, err := s.NewEmptyAccount() @@ -391,7 +391,7 @@ func (s *Storage) NewLocalAccount(handle string) (*Account, error) { } func (s *Storage) DeleteAccount(accId string) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return s.db.Delete(&Account{ID: accId}).Error } @@ -399,27 +399,27 @@ func (s *Storage) DeleteAccount(accId string) error { // Implements the webauthn.User interface for interaction with passkeys func (a *Account) WebAuthnID() []byte { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return a.WebAuthnId } func (u *Account) WebAuthnName() string { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return u.Username } func (u *Account) WebAuthnDisplayName() string { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return u.DisplayName } func (u *Account) WebAuthnCredentials() []webauthn.Credential { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return u.PasskeyCredentials } func (u *Account) WebAuthnIcon() string { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return "" } @@ -427,7 +427,7 @@ func (u *Account) WebAuthnIcon() string { // Implements the passkey.User interface func (u *Account) PutCredential(new webauthn.Credential) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) u.PasskeyCredentials = append(u.PasskeyCredentials, new) } @@ -435,7 +435,7 @@ func (u *Account) PutCredential(new webauthn.Credential) { // Implements the passkey.UserStore interface func (s *Storage) GetOrCreateUser(userID string) passkey.User { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug(). Str("account-handle", userID). Msg("Looking for or creating account for passkey stuff") @@ -458,7 +458,7 @@ func (s *Storage) GetOrCreateUser(userID string) passkey.User { } func (s *Storage) GetUserByWebAuthnId(id []byte) passkey.User { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) log.Debug().Bytes("webauthn-id", id).Msg("Looking for account with webauthn id") acc := Account{} res := s.db.Where(Account{WebAuthnId: id}).First(&acc) @@ -474,7 +474,7 @@ func (s *Storage) GetUserByWebAuthnId(id []byte) passkey.User { } func (s *Storage) SaveUser(rawUser passkey.User) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) user, ok := rawUser.(*Account) if !ok { log.Error().Any("raw-user", rawUser).Msg("Failed to cast raw user to db account") diff --git a/storage/userInfoFields.go b/storage/userInfoFields.go index 3c66b90..8cb1658 100644 --- a/storage/userInfoFields.go +++ b/storage/userInfoFields.go @@ -4,9 +4,8 @@ import ( "time" "github.com/rs/zerolog/log" + "git.mstar.dev/mstar/linstrom/util" "gorm.io/gorm" - - "git.mstar.dev/mstar/linstrom/shared" ) // Describes a custom attribute field for accounts @@ -25,7 +24,7 @@ type UserInfoField struct { // TODO: Add functions to store, load, update and delete these func (s *Storage) FindUserFieldById(id uint) (*UserInfoField, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) entry := UserInfoField{} err := s.db.First(&entry, id).Error switch err { @@ -39,7 +38,7 @@ func (s *Storage) FindUserFieldById(id uint) (*UserInfoField, error) { } func (s *Storage) FindMultipleUserFieldsById(ids []uint) ([]UserInfoField, error) { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) entries := []UserInfoField{} err := s.db.Where(ids).Find(&entries).Error switch err { @@ -58,12 +57,12 @@ func (s *Storage) AddNewUserField(name, value, belongsToId string) (*UserInfoFie } func (s *Storage) DeleteUserField(id uint) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return s.db.Delete(UserInfoField{Model: gorm.Model{ID: id}}).Error } func (s *Storage) DeleteAllUserFieldsForAccountId(id string) error { - defer shared.Untrace(shared.Trace(&log.Logger)) + defer util.Untrace(util.Trace(&log.Logger)) return s.db.Model(&UserInfoField{}). Where(&UserInfoField{BelongsTo: id}). Delete(&UserInfoField{}). diff --git a/shared/fswrapper.go b/util/fswrapper.go similarity index 97% rename from shared/fswrapper.go rename to util/fswrapper.go index d500142..466c991 100644 --- a/shared/fswrapper.go +++ b/util/fswrapper.go @@ -1,4 +1,4 @@ -package shared +package util import ( "io/fs" diff --git a/shared/tagsFromString.go b/util/tagsFromString.go similarity index 95% rename from shared/tagsFromString.go rename to util/tagsFromString.go index 8190d5f..7a9e62e 100644 --- a/shared/tagsFromString.go +++ b/util/tagsFromString.go @@ -1,4 +1,4 @@ -package shared +package util import ( "regexp" diff --git a/shared/tracing.go b/util/tracing.go similarity index 95% rename from shared/tracing.go rename to util/tracing.go index 6c0c37a..0319a2e 100644 --- a/shared/tracing.go +++ b/util/tracing.go @@ -1,4 +1,4 @@ -package shared +package util import ( "github.com/rs/zerolog" diff --git a/shared/zerologPasskey.go b/util/zerologPasskey.go similarity index 96% rename from shared/zerologPasskey.go rename to util/zerologPasskey.go index f9d0b89..1fdb032 100644 --- a/shared/zerologPasskey.go +++ b/util/zerologPasskey.go @@ -1,4 +1,4 @@ -package shared +package util import "github.com/rs/zerolog/log"