Commit 7d004e2

Eric Bower  ·  2026-07-16 22:11:42 -0400 EDT
parent b18549a
feat: block account creation by ip
7 files changed,  +111, -79
+2, -1
......@@ -158,10 +158,11 @@ migrate:
158158 $(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260305_add_forms_table.sql
159159 $(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260503_add_analytics_summary_tables.sql
160160 $(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260504_add_analytics_summary_indexes.sql
161+ $(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260716_block_signups.sql
161162 .PHONY: migrate
162163
163164 latest:
164- $(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260504_add_analytics_summary_indexes.sql
165+ $(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260716_block_signups.sql
165166 .PHONY: latest
166167
167168 psql:
+8, -1
......@@ -31,6 +31,13 @@ func tcast(value any) ([]byte, error) {
3131 }
3232 }
3333
34+type BlockSignups struct {
35+ ID int64 `db:"id"`
36+ IP string `db:"ip"`
37+ Reason string `db:"reason"`
38+ CreatedAt *time.Time `db:"created_at"`
39+}
40+
3441 type PublicKey struct {
3542 ID string `json:"id" db:"id"`
3643 UserID string `json:"user_id" db:"user_id"`
......@@ -559,7 +566,7 @@ var DenyList = []string{
559566 }
560567
561568 type DB interface {
562- RegisterUser(name, pubkey, comment string) (*User, error)
569+ RegisterUser(name, pubkey, comment, ip string) (*User, error)
563570 UpdatePublicKey(pubkeyID, name string) (*PublicKey, error)
564571 InsertPublicKey(userID, pubkey, name string) error
565572 FindKeysByUser(user *User) ([]*PublicKey, error)
+16, -1
......@@ -91,13 +91,28 @@ func NewDB(databaseUrl string, logger *slog.Logger) *PsqlDB {
9191 return d
9292 }
9393
94-func (me *PsqlDB) RegisterUser(username, pubkey, comment string) (*db.User, error) {
94+func (me *PsqlDB) shouldBlockSingup(ip string) error {
95+ blocked := &db.BlockSignups{}
96+ err := me.Db.Get(blocked, `SELECT * FROM block_signups WHERE ip = $1`, ip)
97+ // an error in this case means the result is empty (no record found)
98+ if err != nil {
99+ return nil
100+ }
101+ return fmt.Errorf("your IP address has been blocked: %s", blocked.Reason)
102+}
103+
104+func (me *PsqlDB) RegisterUser(username, pubkey, comment, ip string) (*db.User, error) {
95105 lowerName := strings.ToLower(username)
96106 valid, err := me.validateName(lowerName)
97107 if !valid {
98108 return nil, err
99109 }
100110
111+ err = me.shouldBlockSingup(ip)
112+ if err != nil {
113+ return nil, err
114+ }
115+
101116 tx, err := me.Db.Beginx()
102117 if err != nil {
103118 return nil, err
+74, -74
......@@ -190,7 +190,7 @@ func mustInsertPost(t *testing.T, post *db.Post) *db.Post {
190190 func TestRegisterUser_Success(t *testing.T) {
191191 cleanupTestData(t)
192192
193- user, err := testDB.RegisterUser("testuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI testkey", "test comment")
193+ user, err := testDB.RegisterUser("testuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI testkey", "test comment", "")
194194 if err != nil {
195195 t.Fatalf("RegisterUser failed: %v", err)
196196 return
......@@ -210,12 +210,12 @@ func TestRegisterUser_Success(t *testing.T) {
210210 func TestRegisterUser_DuplicateName(t *testing.T) {
211211 cleanupTestData(t)
212212
213- _, err := testDB.RegisterUser("duplicateuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI key1", "comment1")
213+ _, err := testDB.RegisterUser("duplicateuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI key1", "comment1", "")
214214 if err != nil {
215215 t.Fatalf("first RegisterUser failed: %v", err)
216216 }
217217
218- _, err = testDB.RegisterUser("duplicateuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI key2", "comment2")
218+ _, err = testDB.RegisterUser("duplicateuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI key2", "comment2", "")
219219 if err == nil {
220220 t.Error("expected error for duplicate name, got nil")
221221 }
......@@ -224,7 +224,7 @@ func TestRegisterUser_DuplicateName(t *testing.T) {
224224 func TestRegisterUser_DeniedName(t *testing.T) {
225225 cleanupTestData(t)
226226
227- _, err := testDB.RegisterUser("admin", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI adminkey", "comment")
227+ _, err := testDB.RegisterUser("admin", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI adminkey", "comment", "")
228228 if err == nil {
229229 t.Error("expected error for denied name 'admin', got nil")
230230 }
......@@ -233,7 +233,7 @@ func TestRegisterUser_DeniedName(t *testing.T) {
233233 func TestRegisterUser_InvalidName(t *testing.T) {
234234 cleanupTestData(t)
235235
236- _, err := testDB.RegisterUser("user@invalid", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI invalidkey", "comment")
236+ _, err := testDB.RegisterUser("user@invalid", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI invalidkey", "comment", "")
237237 if err == nil {
238238 t.Error("expected error for invalid name, got nil")
239239 }
......@@ -242,7 +242,7 @@ func TestRegisterUser_InvalidName(t *testing.T) {
242242 func TestFindUser(t *testing.T) {
243243 cleanupTestData(t)
244244
245- created, err := testDB.RegisterUser("findme", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findmekey", "comment")
245+ created, err := testDB.RegisterUser("findme", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findmekey", "comment", "")
246246 if err != nil {
247247 t.Fatalf("RegisterUser failed: %v", err)
248248 }
......@@ -259,7 +259,7 @@ func TestFindUser(t *testing.T) {
259259 func TestFindUserByName(t *testing.T) {
260260 cleanupTestData(t)
261261
262- _, err := testDB.RegisterUser("nameduser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI namedkey", "comment")
262+ _, err := testDB.RegisterUser("nameduser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI namedkey", "comment", "")
263263 if err != nil {
264264 t.Fatalf("RegisterUser failed: %v", err)
265265 }
......@@ -277,7 +277,7 @@ func TestFindUserByPubkey(t *testing.T) {
277277 cleanupTestData(t)
278278
279279 pubkey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pubkeyuser"
280- _, err := testDB.RegisterUser("pubkeyuser", pubkey, "comment")
280+ _, err := testDB.RegisterUser("pubkeyuser", pubkey, "comment", "")
281281 if err != nil {
282282 t.Fatalf("RegisterUser failed: %v", err)
283283 }
......@@ -295,7 +295,7 @@ func TestFindUserByKey(t *testing.T) {
295295 cleanupTestData(t)
296296
297297 pubkey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI forkeyfind"
298- _, err := testDB.RegisterUser("forkeyfind", pubkey, "comment")
298+ _, err := testDB.RegisterUser("forkeyfind", pubkey, "comment", "")
299299 if err != nil {
300300 t.Fatalf("RegisterUser failed: %v", err)
301301 }
......@@ -312,8 +312,8 @@ func TestFindUserByKey(t *testing.T) {
312312 func TestFindUsers(t *testing.T) {
313313 cleanupTestData(t)
314314
315- _, _ = testDB.RegisterUser("user1", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI user1key", "comment")
316- _, _ = testDB.RegisterUser("user2", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI user2key", "comment")
315+ _, _ = testDB.RegisterUser("user1", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI user1key", "comment", "")
316+ _, _ = testDB.RegisterUser("user2", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI user2key", "comment", "")
317317
318318 users, err := testDB.FindUsers()
319319 if err != nil {
......@@ -329,7 +329,7 @@ func TestFindUsers(t *testing.T) {
329329 func TestInsertPublicKey_Success(t *testing.T) {
330330 cleanupTestData(t)
331331
332- user, err := testDB.RegisterUser("keyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI keyowner1", "comment")
332+ user, err := testDB.RegisterUser("keyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI keyowner1", "comment", "")
333333 if err != nil {
334334 t.Fatalf("RegisterUser failed: %v", err)
335335 }
......@@ -351,7 +351,7 @@ func TestInsertPublicKey_Success(t *testing.T) {
351351 func TestInsertPublicKey_Duplicate(t *testing.T) {
352352 cleanupTestData(t)
353353
354- user, _ := testDB.RegisterUser("dupkeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI dupkey", "comment")
354+ user, _ := testDB.RegisterUser("dupkeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI dupkey", "comment", "")
355355
356356 err := testDB.InsertPublicKey(user.ID, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI dupkey", "same key")
357357 if err == nil {
......@@ -362,7 +362,7 @@ func TestInsertPublicKey_Duplicate(t *testing.T) {
362362 func TestUpdatePublicKey(t *testing.T) {
363363 cleanupTestData(t)
364364
365- user, _ := testDB.RegisterUser("updatekeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI updatekeyowner", "original")
365+ user, _ := testDB.RegisterUser("updatekeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI updatekeyowner", "original", "")
366366
367367 updated, err := testDB.UpdatePublicKey(user.PublicKey.ID, "new-name")
368368 if err != nil {
......@@ -376,7 +376,7 @@ func TestUpdatePublicKey(t *testing.T) {
376376 func TestFindKeysByUser(t *testing.T) {
377377 cleanupTestData(t)
378378
379- user, _ := testDB.RegisterUser("multikeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI multikeyowner1", "key1")
379+ user, _ := testDB.RegisterUser("multikeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI multikeyowner1", "key1", "")
380380 _ = testDB.InsertPublicKey(user.ID, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI multikeyowner2", "key2")
381381
382382 keys, err := testDB.FindKeysByUser(user)
......@@ -391,7 +391,7 @@ func TestFindKeysByUser(t *testing.T) {
391391 func TestRemoveKeys(t *testing.T) {
392392 cleanupTestData(t)
393393
394- user, _ := testDB.RegisterUser("removekeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removekeyowner", "key1")
394+ user, _ := testDB.RegisterUser("removekeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removekeyowner", "key1", "")
395395 _ = testDB.InsertPublicKey(user.ID, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removekeyowner2", "key2")
396396
397397 keys, _ := testDB.FindKeysByUser(user)
......@@ -415,7 +415,7 @@ func TestRemoveKeys(t *testing.T) {
415415 func TestInsertToken(t *testing.T) {
416416 cleanupTestData(t)
417417
418- user, _ := testDB.RegisterUser("tokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tokenowner", "comment")
418+ user, _ := testDB.RegisterUser("tokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tokenowner", "comment", "")
419419
420420 token, err := testDB.InsertToken(user.ID, "my-token")
421421 if err != nil {
......@@ -429,7 +429,7 @@ func TestInsertToken(t *testing.T) {
429429 func TestUpsertToken(t *testing.T) {
430430 cleanupTestData(t)
431431
432- user, _ := testDB.RegisterUser("upserttokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI upserttokenowner", "comment")
432+ user, _ := testDB.RegisterUser("upserttokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI upserttokenowner", "comment", "")
433433
434434 token1, err := testDB.UpsertToken(user.ID, "upsert-token")
435435 if err != nil {
......@@ -449,7 +449,7 @@ func TestUpsertToken(t *testing.T) {
449449 func TestFindTokensByUser(t *testing.T) {
450450 cleanupTestData(t)
451451
452- user, _ := testDB.RegisterUser("tokensowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tokensowner", "comment")
452+ user, _ := testDB.RegisterUser("tokensowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tokensowner", "comment", "")
453453 _, _ = testDB.InsertToken(user.ID, "token1")
454454 _, _ = testDB.InsertToken(user.ID, "token2")
455455
......@@ -465,7 +465,7 @@ func TestFindTokensByUser(t *testing.T) {
465465 func TestFindUserByToken_Valid(t *testing.T) {
466466 cleanupTestData(t)
467467
468- user, _ := testDB.RegisterUser("validtokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI validtokenowner", "comment")
468+ user, _ := testDB.RegisterUser("validtokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI validtokenowner", "comment", "")
469469 token, _ := testDB.InsertToken(user.ID, "valid-token")
470470
471471 found, err := testDB.FindUserByToken(token)
......@@ -480,7 +480,7 @@ func TestFindUserByToken_Valid(t *testing.T) {
480480 func TestFindUserByToken_Expired(t *testing.T) {
481481 cleanupTestData(t)
482482
483- user, _ := testDB.RegisterUser("expiredtokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI expiredtokenowner", "comment")
483+ user, _ := testDB.RegisterUser("expiredtokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI expiredtokenowner", "comment", "")
484484 token, _ := testDB.InsertToken(user.ID, "expired-token")
485485
486486 _, err := testDB.Db.Exec("UPDATE tokens SET expires_at = NOW() - INTERVAL '1 day' WHERE token = $1", token)
......@@ -497,7 +497,7 @@ func TestFindUserByToken_Expired(t *testing.T) {
497497 func TestRemoveToken(t *testing.T) {
498498 cleanupTestData(t)
499499
500- user, _ := testDB.RegisterUser("removetokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removetokenowner", "comment")
500+ user, _ := testDB.RegisterUser("removetokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removetokenowner", "comment", "")
501501 _, _ = testDB.InsertToken(user.ID, "remove-token")
502502
503503 tokens, _ := testDB.FindTokensByUser(user.ID)
......@@ -521,7 +521,7 @@ func TestRemoveToken(t *testing.T) {
521521 func TestInsertPost(t *testing.T) {
522522 cleanupTestData(t)
523523
524- user, _ := testDB.RegisterUser("postowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postowner", "comment")
524+ user, _ := testDB.RegisterUser("postowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postowner", "comment", "")
525525
526526 now := time.Now()
527527 post := &db.Post{
......@@ -552,7 +552,7 @@ func TestInsertPost(t *testing.T) {
552552 func TestUpdatePost(t *testing.T) {
553553 cleanupTestData(t)
554554
555- user, _ := testDB.RegisterUser("updatepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI updatepostowner", "comment")
555+ user, _ := testDB.RegisterUser("updatepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI updatepostowner", "comment", "")
556556
557557 now := time.Now()
558558 post := mustInsertPost(t, &db.Post{
......@@ -580,7 +580,7 @@ func TestUpdatePost(t *testing.T) {
580580 func TestRemovePosts(t *testing.T) {
581581 cleanupTestData(t)
582582
583- user, _ := testDB.RegisterUser("removepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removepostowner", "comment")
583+ user, _ := testDB.RegisterUser("removepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removepostowner", "comment", "")
584584
585585 post := mustInsertPost(t, &db.Post{
586586 UserID: user.ID,
......@@ -604,7 +604,7 @@ func TestRemovePosts(t *testing.T) {
604604 func TestFindPost(t *testing.T) {
605605 cleanupTestData(t)
606606
607- user, _ := testDB.RegisterUser("findpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findpostowner", "comment")
607+ user, _ := testDB.RegisterUser("findpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findpostowner", "comment", "")
608608
609609 created := mustInsertPost(t, &db.Post{
610610 UserID: user.ID,
......@@ -626,7 +626,7 @@ func TestFindPost(t *testing.T) {
626626 func TestFindPostWithFilename(t *testing.T) {
627627 cleanupTestData(t)
628628
629- user, _ := testDB.RegisterUser("filenamepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI filenamepostowner", "comment")
629+ user, _ := testDB.RegisterUser("filenamepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI filenamepostowner", "comment", "")
630630
631631 _ = mustInsertPost(t, &db.Post{
632632 UserID: user.ID,
......@@ -648,7 +648,7 @@ func TestFindPostWithFilename(t *testing.T) {
648648 func TestFindPostWithSlug(t *testing.T) {
649649 cleanupTestData(t)
650650
651- user, _ := testDB.RegisterUser("slugpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI slugpostowner", "comment")
651+ user, _ := testDB.RegisterUser("slugpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI slugpostowner", "comment", "")
652652
653653 _ = mustInsertPost(t, &db.Post{
654654 UserID: user.ID,
......@@ -670,7 +670,7 @@ func TestFindPostWithSlug(t *testing.T) {
670670 func TestFindPosts(t *testing.T) {
671671 cleanupTestData(t)
672672
673- user, _ := testDB.RegisterUser("postsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postsowner", "comment")
673+ user, _ := testDB.RegisterUser("postsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postsowner", "comment", "")
674674
675675 _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "post1.md", Slug: "post1", Title: "Post 1", Space: "prose"})
676676 _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "post2.md", Slug: "post2", Title: "Post 2", Space: "prose"})
......@@ -687,7 +687,7 @@ func TestFindPosts(t *testing.T) {
687687 func TestFindPostsByUser(t *testing.T) {
688688 cleanupTestData(t)
689689
690- user, _ := testDB.RegisterUser("userpostsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI userpostsowner", "comment")
690+ user, _ := testDB.RegisterUser("userpostsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI userpostsowner", "comment", "")
691691 now := time.Now()
692692
693693 _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "userpost1.md", Slug: "userpost1", Title: "User Post 1", Space: "prose", PublishAt: &now})
......@@ -706,7 +706,7 @@ func TestFindPostsByUser(t *testing.T) {
706706 func TestFindAllPostsByUser(t *testing.T) {
707707 cleanupTestData(t)
708708
709- user, _ := testDB.RegisterUser("allpostsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI allpostsowner", "comment")
709+ user, _ := testDB.RegisterUser("allpostsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI allpostsowner", "comment", "")
710710
711711 _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "allpost1.md", Slug: "allpost1", Title: "All Post 1", Space: "prose"})
712712 _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "allpost2.md", Slug: "allpost2", Title: "All Post 2", Space: "prose"})
......@@ -723,7 +723,7 @@ func TestFindAllPostsByUser(t *testing.T) {
723723 func TestFindUsersWithPost(t *testing.T) {
724724 cleanupTestData(t)
725725
726- user, _ := testDB.RegisterUser("feedspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedspostowner", "comment")
726+ user, _ := testDB.RegisterUser("feedspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedspostowner", "comment", "")
727727
728728 _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feed.txt", Slug: "feed", Title: "Feed", Space: "feeds"})
729729
......@@ -739,7 +739,7 @@ func TestFindUsersWithPost(t *testing.T) {
739739 func TestFindExpiredPosts(t *testing.T) {
740740 cleanupTestData(t)
741741
742- user, _ := testDB.RegisterUser("expiredpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI expiredpostowner", "comment")
742+ user, _ := testDB.RegisterUser("expiredpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI expiredpostowner", "comment", "")
743743
744744 expired := time.Now().Add(-24 * time.Hour)
745745 _ = mustInsertPost(t, &db.Post{
......@@ -763,7 +763,7 @@ func TestFindExpiredPosts(t *testing.T) {
763763 func TestFindPostsByFeed(t *testing.T) {
764764 cleanupTestData(t)
765765
766- user, _ := testDB.RegisterUser("feedowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedowner", "comment")
766+ user, _ := testDB.RegisterUser("feedowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedowner", "comment", "")
767767
768768 now := time.Now()
769769 _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feedpost.md", Slug: "feedpost", Title: "Feed Post", Space: "prose", PublishAt: &now})
......@@ -783,7 +783,7 @@ func TestFindPostsByFeed(t *testing.T) {
783783 func TestReplaceTagsByPost(t *testing.T) {
784784 cleanupTestData(t)
785785
786- user, _ := testDB.RegisterUser("tagspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tagspostowner", "comment")
786+ user, _ := testDB.RegisterUser("tagspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tagspostowner", "comment", "")
787787 post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "tagged.md", Slug: "tagged", Title: "Tagged", Space: "prose"})
788788
789789 err := testDB.ReplaceTagsByPost([]string{"tag1", "tag2"}, post.ID)
......@@ -800,7 +800,7 @@ func TestReplaceTagsByPost(t *testing.T) {
800800 func TestFindUserPostsByTag(t *testing.T) {
801801 cleanupTestData(t)
802802
803- user, _ := testDB.RegisterUser("usertagowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI usertagowner", "comment")
803+ user, _ := testDB.RegisterUser("usertagowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI usertagowner", "comment", "")
804804 now := time.Now()
805805 post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "usertag.md", Slug: "usertag", Title: "User Tag", Space: "prose", PublishAt: &now})
806806 _ = testDB.ReplaceTagsByPost([]string{"mytag"}, post.ID)
......@@ -818,7 +818,7 @@ func TestFindUserPostsByTag(t *testing.T) {
818818 func TestFindPostsByTag(t *testing.T) {
819819 cleanupTestData(t)
820820
821- user, _ := testDB.RegisterUser("tagsearchowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tagsearchowner", "comment")
821+ user, _ := testDB.RegisterUser("tagsearchowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tagsearchowner", "comment", "")
822822 now := time.Now()
823823 post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "tagsearch.md", Slug: "tagsearch", Title: "Tag Search", Space: "prose", PublishAt: &now})
824824 _ = testDB.ReplaceTagsByPost([]string{"searchtag"}, post.ID)
......@@ -836,7 +836,7 @@ func TestFindPostsByTag(t *testing.T) {
836836 func TestFindPopularTags(t *testing.T) {
837837 cleanupTestData(t)
838838
839- user, _ := testDB.RegisterUser("populartagowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI populartagowner", "comment")
839+ user, _ := testDB.RegisterUser("populartagowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI populartagowner", "comment", "")
840840 post1 := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "pop1.md", Slug: "pop1", Title: "Pop 1", Space: "prose"})
841841 post2 := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "pop2.md", Slug: "pop2", Title: "Pop 2", Space: "prose"})
842842 _ = testDB.ReplaceTagsByPost([]string{"popular"}, post1.ID)
......@@ -856,7 +856,7 @@ func TestFindPopularTags(t *testing.T) {
856856 func TestReplaceAliasesByPost(t *testing.T) {
857857 cleanupTestData(t)
858858
859- user, _ := testDB.RegisterUser("aliasowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aliasowner", "comment")
859+ user, _ := testDB.RegisterUser("aliasowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aliasowner", "comment", "")
860860 post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "aliased.md", Slug: "aliased", Title: "Aliased", Space: "prose"})
861861
862862 err := testDB.ReplaceAliasesByPost([]string{"alias1", "alias2"}, post.ID)
......@@ -868,7 +868,7 @@ func TestReplaceAliasesByPost(t *testing.T) {
868868 func TestFindPostWithSlug_Alias(t *testing.T) {
869869 cleanupTestData(t)
870870
871- user, _ := testDB.RegisterUser("aliassearchowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aliassearchowner", "comment")
871+ user, _ := testDB.RegisterUser("aliassearchowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aliassearchowner", "comment", "")
872872 post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "original.md", Slug: "original", Title: "Original", Space: "prose"})
873873 _ = testDB.ReplaceAliasesByPost([]string{"my-alias"}, post.ID)
874874
......@@ -886,7 +886,7 @@ func TestFindPostWithSlug_Alias(t *testing.T) {
886886 func TestInsertVisit(t *testing.T) {
887887 cleanupTestData(t)
888888
889- user, _ := testDB.RegisterUser("visitowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI visitowner", "comment")
889+ user, _ := testDB.RegisterUser("visitowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI visitowner", "comment", "")
890890
891891 visit := &db.AnalyticsVisits{
892892 UserID: user.ID,
......@@ -907,7 +907,7 @@ func TestInsertVisit(t *testing.T) {
907907 func TestVisitSummary(t *testing.T) {
908908 cleanupTestData(t)
909909
910- user, _ := testDB.RegisterUser("summaryowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI summaryowner", "comment")
910+ user, _ := testDB.RegisterUser("summaryowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI summaryowner", "comment", "")
911911
912912 visit := &db.AnalyticsVisits{
913913 UserID: user.ID,
......@@ -937,7 +937,7 @@ func TestVisitSummary(t *testing.T) {
937937 func TestFindVisitSiteList(t *testing.T) {
938938 cleanupTestData(t)
939939
940- user, _ := testDB.RegisterUser("sitelistowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI sitelistowner", "comment")
940+ user, _ := testDB.RegisterUser("sitelistowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI sitelistowner", "comment", "")
941941
942942 _ = testDB.InsertVisit(&db.AnalyticsVisits{
943943 UserID: user.ID,
......@@ -960,7 +960,7 @@ func TestFindVisitSiteList(t *testing.T) {
960960 func TestVisitUrlNotFound(t *testing.T) {
961961 cleanupTestData(t)
962962
963- user, _ := testDB.RegisterUser("notfoundowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI notfoundowner", "comment")
963+ user, _ := testDB.RegisterUser("notfoundowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI notfoundowner", "comment", "")
964964
965965 _ = testDB.InsertVisit(&db.AnalyticsVisits{
966966 UserID: user.ID,
......@@ -989,7 +989,7 @@ func TestVisitUrlNotFound(t *testing.T) {
989989 func TestInsertFeature(t *testing.T) {
990990 cleanupTestData(t)
991991
992- user, _ := testDB.RegisterUser("featureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featureowner", "comment")
992+ user, _ := testDB.RegisterUser("featureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featureowner", "comment", "")
993993
994994 expiresAt := time.Now().Add(365 * 24 * time.Hour)
995995 feature, err := testDB.InsertFeature(user.ID, "plus", expiresAt)
......@@ -1004,7 +1004,7 @@ func TestInsertFeature(t *testing.T) {
10041004 func TestFindFeature(t *testing.T) {
10051005 cleanupTestData(t)
10061006
1007- user, _ := testDB.RegisterUser("findfeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeatureowner", "comment")
1007+ user, _ := testDB.RegisterUser("findfeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeatureowner", "comment", "")
10081008 expiresAt := time.Now().Add(365 * 24 * time.Hour)
10091009 _, _ = testDB.InsertFeature(user.ID, "plus", expiresAt)
10101010
......@@ -1020,7 +1020,7 @@ func TestFindFeature(t *testing.T) {
10201020 func TestFindFeaturesByUser(t *testing.T) {
10211021 cleanupTestData(t)
10221022
1023- user, _ := testDB.RegisterUser("featuresowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featuresowner", "comment")
1023+ user, _ := testDB.RegisterUser("featuresowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featuresowner", "comment", "")
10241024 expiresAt := time.Now().Add(365 * 24 * time.Hour)
10251025 _, _ = testDB.InsertFeature(user.ID, "plus", expiresAt)
10261026 _, _ = testDB.InsertFeature(user.ID, "pro", expiresAt)
......@@ -1037,7 +1037,7 @@ func TestFindFeaturesByUser(t *testing.T) {
10371037 func TestHasFeatureByUser(t *testing.T) {
10381038 cleanupTestData(t)
10391039
1040- user, _ := testDB.RegisterUser("hasfeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI hasfeatureowner", "comment")
1040+ user, _ := testDB.RegisterUser("hasfeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI hasfeatureowner", "comment", "")
10411041 expiresAt := time.Now().Add(365 * 24 * time.Hour)
10421042 _, _ = testDB.InsertFeature(user.ID, "plus", expiresAt)
10431043
......@@ -1055,7 +1055,7 @@ func TestHasFeatureByUser(t *testing.T) {
10551055 func TestRemoveFeature(t *testing.T) {
10561056 cleanupTestData(t)
10571057
1058- user, _ := testDB.RegisterUser("removefeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removefeatureowner", "comment")
1058+ user, _ := testDB.RegisterUser("removefeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removefeatureowner", "comment", "")
10591059 expiresAt := time.Now().Add(365 * 24 * time.Hour)
10601060 _, _ = testDB.InsertFeature(user.ID, "plus", expiresAt)
10611061
......@@ -1073,7 +1073,7 @@ func TestRemoveFeature(t *testing.T) {
10731073 func TestAddPicoPlusUser(t *testing.T) {
10741074 cleanupTestData(t)
10751075
1076- _, _ = testDB.RegisterUser("picoplusowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI picoplusowner", "comment")
1076+ _, _ = testDB.RegisterUser("picoplusowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI picoplusowner", "comment", "")
10771077
10781078 err := testDB.AddPicoPlusUser("picoplusowner", "test@example.com", "stripe", "tx123")
10791079 if err != nil {
......@@ -1086,7 +1086,7 @@ func TestAddPicoPlusUser(t *testing.T) {
10861086 func TestInsertFeedItems(t *testing.T) {
10871087 cleanupTestData(t)
10881088
1089- user, _ := testDB.RegisterUser("feeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feeditemsowner", "comment")
1089+ user, _ := testDB.RegisterUser("feeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feeditemsowner", "comment", "")
10901090 post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feed.txt", Slug: "feed", Title: "Feed", Space: "feeds"})
10911091
10921092 items := []*db.FeedItem{
......@@ -1103,7 +1103,7 @@ func TestInsertFeedItems(t *testing.T) {
11031103 func TestFindFeedItemsByPostID(t *testing.T) {
11041104 cleanupTestData(t)
11051105
1106- user, _ := testDB.RegisterUser("findfeeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeeditemsowner", "comment")
1106+ user, _ := testDB.RegisterUser("findfeeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeeditemsowner", "comment", "")
11071107 post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "findfeed.txt", Slug: "findfeed", Title: "Find Feed", Space: "feeds"})
11081108
11091109 items := []*db.FeedItem{
......@@ -1125,7 +1125,7 @@ func TestFindFeedItemsByPostID(t *testing.T) {
11251125 func TestUpsertProject(t *testing.T) {
11261126 cleanupTestData(t)
11271127
1128- user, _ := testDB.RegisterUser("projectowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI projectowner", "comment")
1128+ user, _ := testDB.RegisterUser("projectowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI projectowner", "comment", "")
11291129
11301130 project, err := testDB.UpsertProject(user.ID, "my-project", "my-project")
11311131 if err != nil {
......@@ -1147,7 +1147,7 @@ func TestUpsertProject(t *testing.T) {
11471147 func TestFindProjectByName(t *testing.T) {
11481148 cleanupTestData(t)
11491149
1150- user, _ := testDB.RegisterUser("findprojectowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findprojectowner", "comment")
1150+ user, _ := testDB.RegisterUser("findprojectowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findprojectowner", "comment", "")
11511151 _, _ = testDB.UpsertProject(user.ID, "findme-project", "findme-project")
11521152
11531153 project, err := testDB.FindProjectByName(user.ID, "findme-project")
......@@ -1164,7 +1164,7 @@ func TestFindProjectByName(t *testing.T) {
11641164 func TestFindUserStats(t *testing.T) {
11651165 cleanupTestData(t)
11661166
1167- user, _ := testDB.RegisterUser("statsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI statsowner", "comment")
1167+ user, _ := testDB.RegisterUser("statsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI statsowner", "comment", "")
11681168 _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "stat.md", Slug: "stat", Title: "Stat", Space: "prose"})
11691169 _, _ = testDB.UpsertProject(user.ID, "stat-project", "stat-project")
11701170
......@@ -1185,7 +1185,7 @@ func TestFindUserStats(t *testing.T) {
11851185 func TestInsertTunsEventLog(t *testing.T) {
11861186 cleanupTestData(t)
11871187
1188- user, _ := testDB.RegisterUser("tunsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tunsowner", "comment")
1188+ user, _ := testDB.RegisterUser("tunsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tunsowner", "comment", "")
11891189
11901190 log := &db.TunsEventLog{
11911191 UserId: user.ID,
......@@ -1206,7 +1206,7 @@ func TestInsertTunsEventLog(t *testing.T) {
12061206 func TestFindTunsEventLogs(t *testing.T) {
12071207 cleanupTestData(t)
12081208
1209- user, _ := testDB.RegisterUser("findtunsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findtunsowner", "comment")
1209+ user, _ := testDB.RegisterUser("findtunsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findtunsowner", "comment", "")
12101210 _ = testDB.InsertTunsEventLog(&db.TunsEventLog{
12111211 UserId: user.ID,
12121212 ServerID: "server-1",
......@@ -1229,7 +1229,7 @@ func TestFindTunsEventLogs(t *testing.T) {
12291229 func TestFindTunsEventLogsByAddr(t *testing.T) {
12301230 cleanupTestData(t)
12311231
1232- user, _ := testDB.RegisterUser("tunsaddrowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tunsaddrowner", "comment")
1232+ user, _ := testDB.RegisterUser("tunsaddrowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tunsaddrowner", "comment", "")
12331233 _ = testDB.InsertTunsEventLog(&db.TunsEventLog{
12341234 UserId: user.ID,
12351235 ServerID: "server-1",
......@@ -1254,7 +1254,7 @@ func TestFindTunsEventLogsByAddr(t *testing.T) {
12541254 func TestInsertAccessLog(t *testing.T) {
12551255 cleanupTestData(t)
12561256
1257- user, _ := testDB.RegisterUser("accesslogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accesslogowner", "comment")
1257+ user, _ := testDB.RegisterUser("accesslogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accesslogowner", "comment", "")
12581258
12591259 log := &db.AccessLog{
12601260 UserID: user.ID,
......@@ -1272,7 +1272,7 @@ func TestInsertAccessLog(t *testing.T) {
12721272 func TestFindAccessLogs(t *testing.T) {
12731273 cleanupTestData(t)
12741274
1275- user, _ := testDB.RegisterUser("findaccesslogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findaccesslogowner", "comment")
1275+ user, _ := testDB.RegisterUser("findaccesslogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findaccesslogowner", "comment", "")
12761276 _ = testDB.InsertAccessLog(&db.AccessLog{
12771277 UserID: user.ID,
12781278 Service: "pgs",
......@@ -1293,7 +1293,7 @@ func TestFindAccessLogs(t *testing.T) {
12931293 func TestFindPubkeysInAccessLogs(t *testing.T) {
12941294 cleanupTestData(t)
12951295
1296- user, _ := testDB.RegisterUser("pubkeylogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pubkeylogowner", "comment")
1296+ user, _ := testDB.RegisterUser("pubkeylogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pubkeylogowner", "comment", "")
12971297 _ = testDB.InsertAccessLog(&db.AccessLog{
12981298 UserID: user.ID,
12991299 Service: "pgs",
......@@ -1313,7 +1313,7 @@ func TestFindPubkeysInAccessLogs(t *testing.T) {
13131313 func TestFindAccessLogsByPubkey(t *testing.T) {
13141314 cleanupTestData(t)
13151315
1316- user, _ := testDB.RegisterUser("accessbypubkeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accessbypubkeyowner", "comment")
1316+ user, _ := testDB.RegisterUser("accessbypubkeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accessbypubkeyowner", "comment", "")
13171317 pubkey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accessbypubkeyowner"
13181318 _ = testDB.InsertAccessLog(&db.AccessLog{
13191319 UserID: user.ID,
......@@ -1337,7 +1337,7 @@ func TestFindAccessLogsByPubkey(t *testing.T) {
13371337 func TestPostData_JSONBRoundtrip(t *testing.T) {
13381338 cleanupTestData(t)
13391339
1340- user, _ := testDB.RegisterUser("postdataowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postdataowner", "comment")
1340+ user, _ := testDB.RegisterUser("postdataowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postdataowner", "comment", "")
13411341
13421342 now := time.Now().Truncate(time.Second)
13431343 postData := db.PostData{
......@@ -1370,7 +1370,7 @@ func TestPostData_JSONBRoundtrip(t *testing.T) {
13701370 func TestProjectAcl_JSONBRoundtrip(t *testing.T) {
13711371 cleanupTestData(t)
13721372
1373- user, _ := testDB.RegisterUser("aclowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aclowner", "comment")
1373+ user, _ := testDB.RegisterUser("aclowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aclowner", "comment", "")
13741374
13751375 project, err := testDB.UpsertProject(user.ID, "acl-project", "acl-project")
13761376 if err != nil {
......@@ -1390,7 +1390,7 @@ func TestProjectAcl_JSONBRoundtrip(t *testing.T) {
13901390 func TestFeedItemData_JSONBRoundtrip(t *testing.T) {
13911391 cleanupTestData(t)
13921392
1393- user, _ := testDB.RegisterUser("feedjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedjsonbowner", "comment")
1393+ user, _ := testDB.RegisterUser("feedjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedjsonbowner", "comment", "")
13941394 post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feedjsonb.txt", Slug: "feedjsonb", Title: "Feed JSONB", Space: "feeds"})
13951395
13961396 now := time.Now().Truncate(time.Second)
......@@ -1424,7 +1424,7 @@ func TestFeedItemData_JSONBRoundtrip(t *testing.T) {
14241424 func TestFeatureFlagData_JSONBRoundtrip(t *testing.T) {
14251425 cleanupTestData(t)
14261426
1427- user, _ := testDB.RegisterUser("featurejsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featurejsonbowner", "comment")
1427+ user, _ := testDB.RegisterUser("featurejsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featurejsonbowner", "comment", "")
14281428
14291429 err := testDB.AddPicoPlusUser("featurejsonbowner", "test@example.com", "stripe", "tx456")
14301430 if err != nil {
......@@ -1446,7 +1446,7 @@ func TestFeatureFlagData_JSONBRoundtrip(t *testing.T) {
14461446 func TestPaymentHistoryData_JSONBRoundtrip(t *testing.T) {
14471447 cleanupTestData(t)
14481448
1449- user, _ := testDB.RegisterUser("paymentjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI paymentjsonbowner", "comment")
1449+ user, _ := testDB.RegisterUser("paymentjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI paymentjsonbowner", "comment", "")
14501450
14511451 err := testDB.AddPicoPlusUser("paymentjsonbowner", "payment@example.com", "stripe", "tx789")
14521452 if err != nil {
......@@ -1468,7 +1468,7 @@ func TestPaymentHistoryData_JSONBRoundtrip(t *testing.T) {
14681468 func TestUpsertPipeMonitor(t *testing.T) {
14691469 cleanupTestData(t)
14701470
1471- user, _ := testDB.RegisterUser("pipemonitorowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipemonitorowner", "comment")
1471+ user, _ := testDB.RegisterUser("pipemonitorowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipemonitorowner", "comment", "")
14721472
14731473 winEnd := time.Now().Add(time.Hour)
14741474 err := testDB.UpsertPipeMonitor(user.ID, "test-topic", 5*time.Minute, &winEnd)
......@@ -1491,7 +1491,7 @@ func TestUpsertPipeMonitor(t *testing.T) {
14911491 func TestUpsertPipeMonitor_Update(t *testing.T) {
14921492 cleanupTestData(t)
14931493
1494- user, _ := testDB.RegisterUser("pipeupdateowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipeupdateowner", "comment")
1494+ user, _ := testDB.RegisterUser("pipeupdateowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipeupdateowner", "comment", "")
14951495
14961496 winEnd1 := time.Now().Add(time.Hour)
14971497 err := testDB.UpsertPipeMonitor(user.ID, "update-topic", 5*time.Minute, &winEnd1)
......@@ -1517,7 +1517,7 @@ func TestUpsertPipeMonitor_Update(t *testing.T) {
15171517 func TestUpdatePipeMonitorLastPing(t *testing.T) {
15181518 cleanupTestData(t)
15191519
1520- user, _ := testDB.RegisterUser("pipepingowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipepingowner", "comment")
1520+ user, _ := testDB.RegisterUser("pipepingowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipepingowner", "comment", "")
15211521
15221522 winEnd := time.Now().Add(time.Hour)
15231523 err := testDB.UpsertPipeMonitor(user.ID, "ping-topic", 5*time.Minute, &winEnd)
......@@ -1543,7 +1543,7 @@ func TestUpdatePipeMonitorLastPing(t *testing.T) {
15431543 func TestRemovePipeMonitor(t *testing.T) {
15441544 cleanupTestData(t)
15451545
1546- user, _ := testDB.RegisterUser("piperemoveowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI piperemoveowner", "comment")
1546+ user, _ := testDB.RegisterUser("piperemoveowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI piperemoveowner", "comment", "")
15471547
15481548 winEnd := time.Now().Add(time.Hour)
15491549 err := testDB.UpsertPipeMonitor(user.ID, "remove-topic", 5*time.Minute, &winEnd)
......@@ -1565,7 +1565,7 @@ func TestRemovePipeMonitor(t *testing.T) {
15651565 func TestFindPipeMonitorByTopic_NotFound(t *testing.T) {
15661566 cleanupTestData(t)
15671567
1568- user, _ := testDB.RegisterUser("pipenotfoundowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipenotfoundowner", "comment")
1568+ user, _ := testDB.RegisterUser("pipenotfoundowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipenotfoundowner", "comment", "")
15691569
15701570 _, err := testDB.FindPipeMonitorByTopic(user.ID, "nonexistent-topic")
15711571 if err == nil {
......@@ -1576,7 +1576,7 @@ func TestFindPipeMonitorByTopic_NotFound(t *testing.T) {
15761576 func TestFindPipeMonitorsByUser(t *testing.T) {
15771577 cleanupTestData(t)
15781578
1579- user, _ := testDB.RegisterUser("pipemonlistowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipemonlistowner", "comment")
1579+ user, _ := testDB.RegisterUser("pipemonlistowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipemonlistowner", "comment", "")
15801580
15811581 winEnd := time.Now().Add(time.Hour)
15821582 _ = testDB.UpsertPipeMonitor(user.ID, "service-a", 5*time.Minute, &winEnd)
......@@ -1607,7 +1607,7 @@ func TestFindPipeMonitorsByUser(t *testing.T) {
16071607 func TestFindPipeMonitorsByUser_Empty(t *testing.T) {
16081608 cleanupTestData(t)
16091609
1610- user, _ := testDB.RegisterUser("pipenomonitors", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipenomonitors", "comment")
1610+ user, _ := testDB.RegisterUser("pipenomonitors", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipenomonitors", "comment", "")
16111611
16121612 monitors, err := testDB.FindPipeMonitorsByUser(user.ID)
16131613 if err != nil {
+1, -1
......@@ -24,7 +24,7 @@ func NewStubDB(logger *slog.Logger) *StubDB {
2424
2525 var errNotImpl = fmt.Errorf("not implemented")
2626
27-func (me *StubDB) RegisterUser(username, pubkey, comment string) (*db.User, error) {
27+func (me *StubDB) RegisterUser(username, pubkey, comment, ip string) (*db.User, error) {
2828 return nil, errNotImpl
2929 }
3030
+4, -1
......@@ -2,6 +2,7 @@ package tui
22
33 import (
44 "fmt"
5+ "net"
56
67 "git.sr.ht/~rockorager/vaxis"
78 "git.sr.ht/~rockorager/vaxis/vxfw"
......@@ -45,7 +46,9 @@ func (m *SignupPage) createAccount(name string) (*db.User, error) {
4546 return nil, fmt.Errorf("name cannot be empty")
4647 }
4748 key := shared.KeyForKeyText(m.shared.Session.PublicKey())
48- return m.shared.Dbpool.RegisterUser(name, key, "")
49+ remoteAddr := m.shared.Session.Conn.RemoteAddr().String()
50+ userIp, _, _ := net.SplitHostPort(remoteAddr)
51+ return m.shared.Dbpool.RegisterUser(name, key, "", userIp)
4952 }
5053
5154 func (m *SignupPage) CaptureEvent(ev vaxis.Event) (vxfw.Command, error) {
+6, -0
......@@ -0,0 +1,6 @@
1+CREATE TABLE IF NOT EXISTS block_signups (
2+ id SERIAL PRIMARY KEY,
3+ ip inet NOT NULL,
4+ reason TEXT not null,
5+ created_at timestamp without time zone NOT NULL DEFAULT NOW()
6+);