diff --git a/main.go b/main.go index 0022054..570a500 100644 --- a/main.go +++ b/main.go @@ -159,6 +159,10 @@ func newServer() { if err = storagenew.InsertSelf(); err != nil { log.Fatal().Err(err).Msg("Failed to insert self properly") } + log.Info().Msg("Inserting placeholder/unknown user") + if err = storagenew.InsertUnknownActorPlaceholder(); err != nil { + log.Fatal().Err(err).Msg("Failed to insert self properly") + } if *shared.FlagStartDebugServer { go func() { log.Info().Msg("Starting debug server") diff --git a/shared/constants.go b/shared/constants.go index 937d84e..bcb6028 100644 --- a/shared/constants.go +++ b/shared/constants.go @@ -8,6 +8,9 @@ const ( // where multiple releases in a day are required Version = "0.0.1 pre-alpha" // Username for the server actor - ServerActorName = "server.actor" + ServerActorName = "server.actor" + // Username for the placeholder actor where the actual actor is unknown + // Examples include likes, boosts and followers / following + UnknownActorName = "unknown.actor" FeedUsernameSuffix = "-feed" ) diff --git a/storage-new/unknown.go b/storage-new/unknown.go new file mode 100644 index 0000000..c9dd121 --- /dev/null +++ b/storage-new/unknown.go @@ -0,0 +1,74 @@ +package storage + +import ( + "crypto/rand" + "database/sql" + + "git.mstar.dev/mstar/goutils/other" + "gorm.io/gorm" + + "git.mstar.dev/mstar/linstrom/shared" + "git.mstar.dev/mstar/linstrom/storage-new/dbgen" + "git.mstar.dev/mstar/linstrom/storage-new/models" +) + +var UnknownActorId string + +func InsertUnknownActorPlaceholder() error { + dbUser, err := dbgen.User.GetByUsername(shared.UnknownActorName) + if err == nil { + UnknownActorId = dbUser.ID + return nil + } + if err != gorm.ErrRecordNotFound { + return err + } + server, err := dbgen.RemoteServer.Where(dbgen.RemoteServer.IsSelf.Is(true)).First() + if err != nil { + return err + } + publicEdKeyBytes, privateEdKeyBytes, err := shared.GenerateKeypair(true) + if err != nil { + return err + } + publicRsaKeyBytes, privateRsaKeyBytes, err := shared.GenerateKeypair(false) + if err != nil { + return err + } + pkeyId := make([]byte, 64) + _, err = rand.Read(pkeyId) + if err != nil { + return other.Error( + "storage", + "failed to generate passkey ID for linstrom account", + err, + ) + } + user := models.User{ + ID: shared.NewId(), + Username: shared.UnknownActorName, + Server: *server, + ServerId: server.ID, + DisplayName: "Placeholder user", + Description: "Placeholder user for when the actual users are unknown, like with Mastodon likes and boosts", + IsBot: true, + IconId: sql.NullString{Valid: false}, + Background: nil, + BackgroundId: sql.NullString{Valid: false}, + Banner: nil, + BannerId: sql.NullString{Valid: false}, + Indexable: false, + PublicKeyEd: publicEdKeyBytes, + PrivateKeyEd: privateEdKeyBytes, + PublicKeyRsa: publicRsaKeyBytes, + PrivateKeyRsa: privateRsaKeyBytes, + Verified: true, + FinishedRegistration: true, + PasskeyId: pkeyId, + } + err = dbgen.User.Save(&user) + if err != nil { + return err + } + return nil +}