From d32818af09651afc32fc27b52c6b48524b5ac2e5 Mon Sep 17 00:00:00 2001 From: mstar Date: Mon, 28 Apr 2025 17:28:28 +0200 Subject: [PATCH] Start move to unify ID generation --- auth-new/password.go | 4 ++-- config/config.go | 13 ++++++++++++- go.mod | 8 +++++--- go.sum | 11 +++++++++++ shared/identicon/identicons.go | 1 + shared/ids.go | 17 +++++++++++++++++ storage-new/models/User.go | 2 ++ storage-new/self.go | 3 +-- 8 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 shared/ids.go diff --git a/auth-new/password.go b/auth-new/password.go index 09d7d18..8994fbc 100644 --- a/auth-new/password.go +++ b/auth-new/password.go @@ -5,10 +5,10 @@ import ( "git.mstar.dev/mstar/goutils/other" "git.mstar.dev/mstar/goutils/sliceutils" - "github.com/google/uuid" "gorm.io/gorm" "gorm.io/gorm/clause" + "git.mstar.dev/mstar/linstrom/shared" "git.mstar.dev/mstar/linstrom/storage-new/dbgen" "git.mstar.dev/mstar/linstrom/storage-new/models" ) @@ -88,7 +88,7 @@ func (a *Authenticator) PerformPasswordLogin( User: *acc, UserId: acc.ID, ExpiresAt: calcAccessExpirationTimestamp(), - Token: uuid.NewString(), + Token: shared.NewId(), } err = dbgen.LoginProcessToken.Clauses(clause.OnConflict{UpdateAll: true}). Create(&loginToken) diff --git a/config/config.go b/config/config.go index a3adeb4..1ef82ac 100644 --- a/config/config.go +++ b/config/config.go @@ -103,8 +103,10 @@ type ConfigMail struct { } type ConfigSelf struct { + // The display name of the server actor ServerActorDisplayName string `toml:"server_actor_display_name"` - ServerDisplayName string `toml:"server_display_name"` + // The name of the server provided via nodeinfo + ServerDisplayName string `toml:"server_display_name"` } // Contains experimental features that could be good to have @@ -120,11 +122,20 @@ type ConfigExperimental struct { // implementations // Both are created and stored for each local user. If this flag is enabled, // Linstrom shares the ED25519 key on request, otherwise the RSA key + // Changing this setting after connections to other servers have been made might cause + // invalid signature problems where the remote server will use the old key instead + // of the new one. This is not really viable to fix within Linstrom UseEd25519Keys bool `toml:"use_ed25519_keys"` // Require authorized fetch signing for requests to the server actor too // The implementation itself is stable, but might cause issues during initial connect // if the other server also requires authorized fetch for the server actor + // Changing this setting is not expected to cause permanent problems AuthFetchForServerActor bool `toml:"auth_fetch_for_server_actor"` + // Use cuid2 for generation of new IDs that are expected to be used via Activitypub + // They are shorter than the main method used (uuid v4) but should still provide enough + // uniqueness such that collisions are not to be expected. + // Changing this option will only affect new ID generations, not update existing ones + UseCuid2Ids bool `toml:"use_cuid2_ids"` } type Config struct { diff --git a/go.mod b/go.mod index ad0601c..70035c6 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.23.7 require ( git.mstar.dev/mstar/canvas v0.13.1 - git.mstar.dev/mstar/goutils v1.12.3 + git.mstar.dev/mstar/goutils v1.13.0 github.com/BurntSushi/toml v1.5.0 github.com/dgraph-io/ristretto v0.2.0 github.com/eko/gocache/lib/v4 v4.2.0 @@ -20,7 +20,7 @@ require ( github.com/google/uuid v1.6.0 github.com/gorilla/websocket v1.5.3 github.com/jackc/pgx/v5 v5.7.4 - github.com/minio/minio-go/v7 v7.0.80 + github.com/minio/minio-go/v7 v7.0.91 github.com/mstarongithub/passkey v0.0.0-20240817142622-de6912c8303e github.com/pquerna/otp v1.4.0 github.com/redis/go-redis/v9 v9.7.3 @@ -64,7 +64,7 @@ require ( github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/klauspost/compress v1.18.0 // indirect - github.com/klauspost/cpuid/v2 v2.2.8 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/text v0.2.0 // indirect github.com/lestrrat-go/blackmagic v1.0.3 // indirect github.com/lestrrat-go/httpcc v1.0.1 // indirect @@ -75,9 +75,11 @@ require ( github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/minio/crc64nvme v1.0.1 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/nrednav/cuid2 v1.0.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.22.0 // indirect diff --git a/go.sum b/go.sum index 06e4263..b2058b6 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,8 @@ git.mstar.dev/mstar/canvas v0.13.1 h1:+oJRv3O+1vDOqMQFXfV6r+o2JiZGBARadlWXOrK6WU git.mstar.dev/mstar/canvas v0.13.1/go.mod h1:CzLWCvOvHXsLbwU9l8WBL/RU5VAorgJ9+Ald5yhWoMs= git.mstar.dev/mstar/goutils v1.12.3 h1:Wx7i8/a99Cp+Y/XcXgqQr0r9cSsJu7QkWBlKyprTH44= git.mstar.dev/mstar/goutils v1.12.3/go.mod h1:juxY0eZEMnA95fedRp2LVXvUBgEjz66nE8SEdGKcxMA= +git.mstar.dev/mstar/goutils v1.13.0 h1:j2AA3izqTumZyUgC2wi/JdIZAtnDQLve2iexI5kWMgM= +git.mstar.dev/mstar/goutils v1.13.0/go.mod h1:juxY0eZEMnA95fedRp2LVXvUBgEjz66nE8SEdGKcxMA= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= @@ -256,10 +258,13 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc= github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= @@ -304,10 +309,14 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zk github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY= +github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/minio-go/v7 v7.0.80 h1:2mdUHXEykRdY/BigLt3Iuu1otL0JTogT0Nmltg0wujk= github.com/minio/minio-go/v7 v7.0.80/go.mod h1:84gmIilaX4zcvAWWzJ5Z1WI5axN+hAbM5w25xf8xvC0= +github.com/minio/minio-go/v7 v7.0.91 h1:tWLZnEfo3OZl5PoXQwcwTAPNNrjyWwOh6cbZitW5JQc= +github.com/minio/minio-go/v7 v7.0.91/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -321,6 +330,8 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nrednav/cuid2 v1.0.1 h1:aYLDCmGxEij7xCdiV6GVSPSlqFOS6sqHKKvBeKjddVY= +github.com/nrednav/cuid2 v1.0.1/go.mod h1:nH9lUYqbtoVsnpy20etw5q1guTjE99Xy4EpmnK5nKm0= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= diff --git a/shared/identicon/identicons.go b/shared/identicon/identicons.go index a7cc217..648d212 100644 --- a/shared/identicon/identicons.go +++ b/shared/identicon/identicons.go @@ -47,6 +47,7 @@ var ( } ) +// TODO: See if this can be translated to use sr.ht/~sbinet/gg instead // Deprecated: Doesn't work func GenerateIdenticon(text string) *image.RGBA { backend := softwarebackend.New(canvasSize, canvasSize) diff --git a/shared/ids.go b/shared/ids.go new file mode 100644 index 0000000..f1b2610 --- /dev/null +++ b/shared/ids.go @@ -0,0 +1,17 @@ +package shared + +import ( + "github.com/google/uuid" + "github.com/nrednav/cuid2" + + "git.mstar.dev/mstar/linstrom/config" +) + +// Generate a new string ID +func NewId() string { + if config.GlobalConfig.Experimental.UseCuid2Ids { + return cuid2.Generate() + } else { + return uuid.NewString() + } +} diff --git a/storage-new/models/User.go b/storage-new/models/User.go index e476a83..69f2224 100644 --- a/storage-new/models/User.go +++ b/storage-new/models/User.go @@ -25,6 +25,8 @@ type User struct { // identifier for users and other servers, especially when changing the username // (username != display name) might be a future feature // Same also applies for other types that use a UUID as primary key + // TODO: Change this to generate via cuid or uuid, depending on config + // Or remove autogeneration alltogether ID string `gorm:"primarykey;default:gen_random_uuid()"` // Username of the user (eg "max" if the full username is @max@example.com) // Assume unchangable (once set by a user) to be kind to other implementations diff --git a/storage-new/self.go b/storage-new/self.go index a62d3a7..bd86989 100644 --- a/storage-new/self.go +++ b/storage-new/self.go @@ -5,7 +5,6 @@ import ( "database/sql" "git.mstar.dev/mstar/goutils/other" - "github.com/google/uuid" "gorm.io/gorm" "git.mstar.dev/mstar/linstrom/config" @@ -57,7 +56,7 @@ func insertDefaultDuck() (*models.MediaMetadata, error) { return nil, err } duck := models.MediaMetadata{ - ID: uuid.NewString(), + ID: shared.NewId(), // NOTE: Default duck technically belongs to the server // but to avoid cyclic dependency, declare it as unowned OwnedById: sql.NullString{Valid: false},