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
M
Makefile
+2,
-1
| ... | ... | @@ -158,10 +158,11 @@ migrate: | |
| 158 | 158 | $(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260305_add_forms_table.sql | |
| 159 | 159 | $(DOCKER_CMD) exec -i $(DB_CONTAINER) psql -U $(PGUSER) -d $(PGDATABASE) < ./sql/migrations/20260503_add_analytics_summary_tables.sql | |
| 160 | 160 | $(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 | |
| 161 | 162 | .PHONY: migrate | |
| 162 | 163 | ||
| 163 | 164 | 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 | |
| 165 | 166 | .PHONY: latest | |
| 166 | 167 | ||
| 167 | 168 | psql: |
+8,
-1
| ... | ... | @@ -31,6 +31,13 @@ func tcast(value any) ([]byte, error) { | |
| 31 | 31 | } | |
| 32 | 32 | } | |
| 33 | 33 | ||
| 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 | + | ||
| 34 | 41 | type PublicKey struct { | |
| 35 | 42 | ID string `json:"id" db:"id"` | |
| 36 | 43 | UserID string `json:"user_id" db:"user_id"` |
| ... | ... | @@ -559,7 +566,7 @@ var DenyList = []string{ | |
| 559 | 566 | } | |
| 560 | 567 | ||
| 561 | 568 | type DB interface { | |
| 562 | - | RegisterUser(name, pubkey, comment string) (*User, error) | |
| 569 | + | RegisterUser(name, pubkey, comment, ip string) (*User, error) | |
| 563 | 570 | UpdatePublicKey(pubkeyID, name string) (*PublicKey, error) | |
| 564 | 571 | InsertPublicKey(userID, pubkey, name string) error | |
| 565 | 572 | FindKeysByUser(user *User) ([]*PublicKey, error) |
+16,
-1
| ... | ... | @@ -91,13 +91,28 @@ func NewDB(databaseUrl string, logger *slog.Logger) *PsqlDB { | |
| 91 | 91 | return d | |
| 92 | 92 | } | |
| 93 | 93 | ||
| 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) { | |
| 95 | 105 | lowerName := strings.ToLower(username) | |
| 96 | 106 | valid, err := me.validateName(lowerName) | |
| 97 | 107 | if !valid { | |
| 98 | 108 | return nil, err | |
| 99 | 109 | } | |
| 100 | 110 | ||
| 111 | + | err = me.shouldBlockSingup(ip) | |
| 112 | + | if err != nil { | |
| 113 | + | return nil, err | |
| 114 | + | } | |
| 115 | + | ||
| 101 | 116 | tx, err := me.Db.Beginx() | |
| 102 | 117 | if err != nil { | |
| 103 | 118 | return nil, err |
+74,
-74
| ... | ... | @@ -190,7 +190,7 @@ func mustInsertPost(t *testing.T, post *db.Post) *db.Post { | |
| 190 | 190 | func TestRegisterUser_Success(t *testing.T) { | |
| 191 | 191 | cleanupTestData(t) | |
| 192 | 192 | ||
| 193 | - | user, err := testDB.RegisterUser("testuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI testkey", "test comment") | |
| 193 | + | user, err := testDB.RegisterUser("testuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI testkey", "test comment", "") | |
| 194 | 194 | if err != nil { | |
| 195 | 195 | t.Fatalf("RegisterUser failed: %v", err) | |
| 196 | 196 | return |
| ... | ... | @@ -210,12 +210,12 @@ func TestRegisterUser_Success(t *testing.T) { | |
| 210 | 210 | func TestRegisterUser_DuplicateName(t *testing.T) { | |
| 211 | 211 | cleanupTestData(t) | |
| 212 | 212 | ||
| 213 | - | _, err := testDB.RegisterUser("duplicateuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI key1", "comment1") | |
| 213 | + | _, err := testDB.RegisterUser("duplicateuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI key1", "comment1", "") | |
| 214 | 214 | if err != nil { | |
| 215 | 215 | t.Fatalf("first RegisterUser failed: %v", err) | |
| 216 | 216 | } | |
| 217 | 217 | ||
| 218 | - | _, err = testDB.RegisterUser("duplicateuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI key2", "comment2") | |
| 218 | + | _, err = testDB.RegisterUser("duplicateuser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI key2", "comment2", "") | |
| 219 | 219 | if err == nil { | |
| 220 | 220 | t.Error("expected error for duplicate name, got nil") | |
| 221 | 221 | } |
| ... | ... | @@ -224,7 +224,7 @@ func TestRegisterUser_DuplicateName(t *testing.T) { | |
| 224 | 224 | func TestRegisterUser_DeniedName(t *testing.T) { | |
| 225 | 225 | cleanupTestData(t) | |
| 226 | 226 | ||
| 227 | - | _, err := testDB.RegisterUser("admin", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI adminkey", "comment") | |
| 227 | + | _, err := testDB.RegisterUser("admin", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI adminkey", "comment", "") | |
| 228 | 228 | if err == nil { | |
| 229 | 229 | t.Error("expected error for denied name 'admin', got nil") | |
| 230 | 230 | } |
| ... | ... | @@ -233,7 +233,7 @@ func TestRegisterUser_DeniedName(t *testing.T) { | |
| 233 | 233 | func TestRegisterUser_InvalidName(t *testing.T) { | |
| 234 | 234 | cleanupTestData(t) | |
| 235 | 235 | ||
| 236 | - | _, err := testDB.RegisterUser("user@invalid", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI invalidkey", "comment") | |
| 236 | + | _, err := testDB.RegisterUser("user@invalid", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI invalidkey", "comment", "") | |
| 237 | 237 | if err == nil { | |
| 238 | 238 | t.Error("expected error for invalid name, got nil") | |
| 239 | 239 | } |
| ... | ... | @@ -242,7 +242,7 @@ func TestRegisterUser_InvalidName(t *testing.T) { | |
| 242 | 242 | func TestFindUser(t *testing.T) { | |
| 243 | 243 | cleanupTestData(t) | |
| 244 | 244 | ||
| 245 | - | created, err := testDB.RegisterUser("findme", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findmekey", "comment") | |
| 245 | + | created, err := testDB.RegisterUser("findme", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findmekey", "comment", "") | |
| 246 | 246 | if err != nil { | |
| 247 | 247 | t.Fatalf("RegisterUser failed: %v", err) | |
| 248 | 248 | } |
| ... | ... | @@ -259,7 +259,7 @@ func TestFindUser(t *testing.T) { | |
| 259 | 259 | func TestFindUserByName(t *testing.T) { | |
| 260 | 260 | cleanupTestData(t) | |
| 261 | 261 | ||
| 262 | - | _, err := testDB.RegisterUser("nameduser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI namedkey", "comment") | |
| 262 | + | _, err := testDB.RegisterUser("nameduser", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI namedkey", "comment", "") | |
| 263 | 263 | if err != nil { | |
| 264 | 264 | t.Fatalf("RegisterUser failed: %v", err) | |
| 265 | 265 | } |
| ... | ... | @@ -277,7 +277,7 @@ func TestFindUserByPubkey(t *testing.T) { | |
| 277 | 277 | cleanupTestData(t) | |
| 278 | 278 | ||
| 279 | 279 | pubkey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pubkeyuser" | |
| 280 | - | _, err := testDB.RegisterUser("pubkeyuser", pubkey, "comment") | |
| 280 | + | _, err := testDB.RegisterUser("pubkeyuser", pubkey, "comment", "") | |
| 281 | 281 | if err != nil { | |
| 282 | 282 | t.Fatalf("RegisterUser failed: %v", err) | |
| 283 | 283 | } |
| ... | ... | @@ -295,7 +295,7 @@ func TestFindUserByKey(t *testing.T) { | |
| 295 | 295 | cleanupTestData(t) | |
| 296 | 296 | ||
| 297 | 297 | pubkey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI forkeyfind" | |
| 298 | - | _, err := testDB.RegisterUser("forkeyfind", pubkey, "comment") | |
| 298 | + | _, err := testDB.RegisterUser("forkeyfind", pubkey, "comment", "") | |
| 299 | 299 | if err != nil { | |
| 300 | 300 | t.Fatalf("RegisterUser failed: %v", err) | |
| 301 | 301 | } |
| ... | ... | @@ -312,8 +312,8 @@ func TestFindUserByKey(t *testing.T) { | |
| 312 | 312 | func TestFindUsers(t *testing.T) { | |
| 313 | 313 | cleanupTestData(t) | |
| 314 | 314 | ||
| 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", "") | |
| 317 | 317 | ||
| 318 | 318 | users, err := testDB.FindUsers() | |
| 319 | 319 | if err != nil { |
| ... | ... | @@ -329,7 +329,7 @@ func TestFindUsers(t *testing.T) { | |
| 329 | 329 | func TestInsertPublicKey_Success(t *testing.T) { | |
| 330 | 330 | cleanupTestData(t) | |
| 331 | 331 | ||
| 332 | - | user, err := testDB.RegisterUser("keyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI keyowner1", "comment") | |
| 332 | + | user, err := testDB.RegisterUser("keyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI keyowner1", "comment", "") | |
| 333 | 333 | if err != nil { | |
| 334 | 334 | t.Fatalf("RegisterUser failed: %v", err) | |
| 335 | 335 | } |
| ... | ... | @@ -351,7 +351,7 @@ func TestInsertPublicKey_Success(t *testing.T) { | |
| 351 | 351 | func TestInsertPublicKey_Duplicate(t *testing.T) { | |
| 352 | 352 | cleanupTestData(t) | |
| 353 | 353 | ||
| 354 | - | user, _ := testDB.RegisterUser("dupkeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI dupkey", "comment") | |
| 354 | + | user, _ := testDB.RegisterUser("dupkeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI dupkey", "comment", "") | |
| 355 | 355 | ||
| 356 | 356 | err := testDB.InsertPublicKey(user.ID, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI dupkey", "same key") | |
| 357 | 357 | if err == nil { |
| ... | ... | @@ -362,7 +362,7 @@ func TestInsertPublicKey_Duplicate(t *testing.T) { | |
| 362 | 362 | func TestUpdatePublicKey(t *testing.T) { | |
| 363 | 363 | cleanupTestData(t) | |
| 364 | 364 | ||
| 365 | - | user, _ := testDB.RegisterUser("updatekeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI updatekeyowner", "original") | |
| 365 | + | user, _ := testDB.RegisterUser("updatekeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI updatekeyowner", "original", "") | |
| 366 | 366 | ||
| 367 | 367 | updated, err := testDB.UpdatePublicKey(user.PublicKey.ID, "new-name") | |
| 368 | 368 | if err != nil { |
| ... | ... | @@ -376,7 +376,7 @@ func TestUpdatePublicKey(t *testing.T) { | |
| 376 | 376 | func TestFindKeysByUser(t *testing.T) { | |
| 377 | 377 | cleanupTestData(t) | |
| 378 | 378 | ||
| 379 | - | user, _ := testDB.RegisterUser("multikeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI multikeyowner1", "key1") | |
| 379 | + | user, _ := testDB.RegisterUser("multikeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI multikeyowner1", "key1", "") | |
| 380 | 380 | _ = testDB.InsertPublicKey(user.ID, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI multikeyowner2", "key2") | |
| 381 | 381 | ||
| 382 | 382 | keys, err := testDB.FindKeysByUser(user) |
| ... | ... | @@ -391,7 +391,7 @@ func TestFindKeysByUser(t *testing.T) { | |
| 391 | 391 | func TestRemoveKeys(t *testing.T) { | |
| 392 | 392 | cleanupTestData(t) | |
| 393 | 393 | ||
| 394 | - | user, _ := testDB.RegisterUser("removekeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removekeyowner", "key1") | |
| 394 | + | user, _ := testDB.RegisterUser("removekeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removekeyowner", "key1", "") | |
| 395 | 395 | _ = testDB.InsertPublicKey(user.ID, "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removekeyowner2", "key2") | |
| 396 | 396 | ||
| 397 | 397 | keys, _ := testDB.FindKeysByUser(user) |
| ... | ... | @@ -415,7 +415,7 @@ func TestRemoveKeys(t *testing.T) { | |
| 415 | 415 | func TestInsertToken(t *testing.T) { | |
| 416 | 416 | cleanupTestData(t) | |
| 417 | 417 | ||
| 418 | - | user, _ := testDB.RegisterUser("tokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tokenowner", "comment") | |
| 418 | + | user, _ := testDB.RegisterUser("tokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tokenowner", "comment", "") | |
| 419 | 419 | ||
| 420 | 420 | token, err := testDB.InsertToken(user.ID, "my-token") | |
| 421 | 421 | if err != nil { |
| ... | ... | @@ -429,7 +429,7 @@ func TestInsertToken(t *testing.T) { | |
| 429 | 429 | func TestUpsertToken(t *testing.T) { | |
| 430 | 430 | cleanupTestData(t) | |
| 431 | 431 | ||
| 432 | - | user, _ := testDB.RegisterUser("upserttokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI upserttokenowner", "comment") | |
| 432 | + | user, _ := testDB.RegisterUser("upserttokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI upserttokenowner", "comment", "") | |
| 433 | 433 | ||
| 434 | 434 | token1, err := testDB.UpsertToken(user.ID, "upsert-token") | |
| 435 | 435 | if err != nil { |
| ... | ... | @@ -449,7 +449,7 @@ func TestUpsertToken(t *testing.T) { | |
| 449 | 449 | func TestFindTokensByUser(t *testing.T) { | |
| 450 | 450 | cleanupTestData(t) | |
| 451 | 451 | ||
| 452 | - | user, _ := testDB.RegisterUser("tokensowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tokensowner", "comment") | |
| 452 | + | user, _ := testDB.RegisterUser("tokensowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tokensowner", "comment", "") | |
| 453 | 453 | _, _ = testDB.InsertToken(user.ID, "token1") | |
| 454 | 454 | _, _ = testDB.InsertToken(user.ID, "token2") | |
| 455 | 455 |
| ... | ... | @@ -465,7 +465,7 @@ func TestFindTokensByUser(t *testing.T) { | |
| 465 | 465 | func TestFindUserByToken_Valid(t *testing.T) { | |
| 466 | 466 | cleanupTestData(t) | |
| 467 | 467 | ||
| 468 | - | user, _ := testDB.RegisterUser("validtokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI validtokenowner", "comment") | |
| 468 | + | user, _ := testDB.RegisterUser("validtokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI validtokenowner", "comment", "") | |
| 469 | 469 | token, _ := testDB.InsertToken(user.ID, "valid-token") | |
| 470 | 470 | ||
| 471 | 471 | found, err := testDB.FindUserByToken(token) |
| ... | ... | @@ -480,7 +480,7 @@ func TestFindUserByToken_Valid(t *testing.T) { | |
| 480 | 480 | func TestFindUserByToken_Expired(t *testing.T) { | |
| 481 | 481 | cleanupTestData(t) | |
| 482 | 482 | ||
| 483 | - | user, _ := testDB.RegisterUser("expiredtokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI expiredtokenowner", "comment") | |
| 483 | + | user, _ := testDB.RegisterUser("expiredtokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI expiredtokenowner", "comment", "") | |
| 484 | 484 | token, _ := testDB.InsertToken(user.ID, "expired-token") | |
| 485 | 485 | ||
| 486 | 486 | _, 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) { | |
| 497 | 497 | func TestRemoveToken(t *testing.T) { | |
| 498 | 498 | cleanupTestData(t) | |
| 499 | 499 | ||
| 500 | - | user, _ := testDB.RegisterUser("removetokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removetokenowner", "comment") | |
| 500 | + | user, _ := testDB.RegisterUser("removetokenowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removetokenowner", "comment", "") | |
| 501 | 501 | _, _ = testDB.InsertToken(user.ID, "remove-token") | |
| 502 | 502 | ||
| 503 | 503 | tokens, _ := testDB.FindTokensByUser(user.ID) |
| ... | ... | @@ -521,7 +521,7 @@ func TestRemoveToken(t *testing.T) { | |
| 521 | 521 | func TestInsertPost(t *testing.T) { | |
| 522 | 522 | cleanupTestData(t) | |
| 523 | 523 | ||
| 524 | - | user, _ := testDB.RegisterUser("postowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postowner", "comment") | |
| 524 | + | user, _ := testDB.RegisterUser("postowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postowner", "comment", "") | |
| 525 | 525 | ||
| 526 | 526 | now := time.Now() | |
| 527 | 527 | post := &db.Post{ |
| ... | ... | @@ -552,7 +552,7 @@ func TestInsertPost(t *testing.T) { | |
| 552 | 552 | func TestUpdatePost(t *testing.T) { | |
| 553 | 553 | cleanupTestData(t) | |
| 554 | 554 | ||
| 555 | - | user, _ := testDB.RegisterUser("updatepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI updatepostowner", "comment") | |
| 555 | + | user, _ := testDB.RegisterUser("updatepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI updatepostowner", "comment", "") | |
| 556 | 556 | ||
| 557 | 557 | now := time.Now() | |
| 558 | 558 | post := mustInsertPost(t, &db.Post{ |
| ... | ... | @@ -580,7 +580,7 @@ func TestUpdatePost(t *testing.T) { | |
| 580 | 580 | func TestRemovePosts(t *testing.T) { | |
| 581 | 581 | cleanupTestData(t) | |
| 582 | 582 | ||
| 583 | - | user, _ := testDB.RegisterUser("removepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removepostowner", "comment") | |
| 583 | + | user, _ := testDB.RegisterUser("removepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removepostowner", "comment", "") | |
| 584 | 584 | ||
| 585 | 585 | post := mustInsertPost(t, &db.Post{ | |
| 586 | 586 | UserID: user.ID, |
| ... | ... | @@ -604,7 +604,7 @@ func TestRemovePosts(t *testing.T) { | |
| 604 | 604 | func TestFindPost(t *testing.T) { | |
| 605 | 605 | cleanupTestData(t) | |
| 606 | 606 | ||
| 607 | - | user, _ := testDB.RegisterUser("findpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findpostowner", "comment") | |
| 607 | + | user, _ := testDB.RegisterUser("findpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findpostowner", "comment", "") | |
| 608 | 608 | ||
| 609 | 609 | created := mustInsertPost(t, &db.Post{ | |
| 610 | 610 | UserID: user.ID, |
| ... | ... | @@ -626,7 +626,7 @@ func TestFindPost(t *testing.T) { | |
| 626 | 626 | func TestFindPostWithFilename(t *testing.T) { | |
| 627 | 627 | cleanupTestData(t) | |
| 628 | 628 | ||
| 629 | - | user, _ := testDB.RegisterUser("filenamepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI filenamepostowner", "comment") | |
| 629 | + | user, _ := testDB.RegisterUser("filenamepostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI filenamepostowner", "comment", "") | |
| 630 | 630 | ||
| 631 | 631 | _ = mustInsertPost(t, &db.Post{ | |
| 632 | 632 | UserID: user.ID, |
| ... | ... | @@ -648,7 +648,7 @@ func TestFindPostWithFilename(t *testing.T) { | |
| 648 | 648 | func TestFindPostWithSlug(t *testing.T) { | |
| 649 | 649 | cleanupTestData(t) | |
| 650 | 650 | ||
| 651 | - | user, _ := testDB.RegisterUser("slugpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI slugpostowner", "comment") | |
| 651 | + | user, _ := testDB.RegisterUser("slugpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI slugpostowner", "comment", "") | |
| 652 | 652 | ||
| 653 | 653 | _ = mustInsertPost(t, &db.Post{ | |
| 654 | 654 | UserID: user.ID, |
| ... | ... | @@ -670,7 +670,7 @@ func TestFindPostWithSlug(t *testing.T) { | |
| 670 | 670 | func TestFindPosts(t *testing.T) { | |
| 671 | 671 | cleanupTestData(t) | |
| 672 | 672 | ||
| 673 | - | user, _ := testDB.RegisterUser("postsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postsowner", "comment") | |
| 673 | + | user, _ := testDB.RegisterUser("postsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postsowner", "comment", "") | |
| 674 | 674 | ||
| 675 | 675 | _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "post1.md", Slug: "post1", Title: "Post 1", Space: "prose"}) | |
| 676 | 676 | _ = 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) { | |
| 687 | 687 | func TestFindPostsByUser(t *testing.T) { | |
| 688 | 688 | cleanupTestData(t) | |
| 689 | 689 | ||
| 690 | - | user, _ := testDB.RegisterUser("userpostsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI userpostsowner", "comment") | |
| 690 | + | user, _ := testDB.RegisterUser("userpostsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI userpostsowner", "comment", "") | |
| 691 | 691 | now := time.Now() | |
| 692 | 692 | ||
| 693 | 693 | _ = 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) { | |
| 706 | 706 | func TestFindAllPostsByUser(t *testing.T) { | |
| 707 | 707 | cleanupTestData(t) | |
| 708 | 708 | ||
| 709 | - | user, _ := testDB.RegisterUser("allpostsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI allpostsowner", "comment") | |
| 709 | + | user, _ := testDB.RegisterUser("allpostsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI allpostsowner", "comment", "") | |
| 710 | 710 | ||
| 711 | 711 | _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "allpost1.md", Slug: "allpost1", Title: "All Post 1", Space: "prose"}) | |
| 712 | 712 | _ = 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) { | |
| 723 | 723 | func TestFindUsersWithPost(t *testing.T) { | |
| 724 | 724 | cleanupTestData(t) | |
| 725 | 725 | ||
| 726 | - | user, _ := testDB.RegisterUser("feedspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedspostowner", "comment") | |
| 726 | + | user, _ := testDB.RegisterUser("feedspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedspostowner", "comment", "") | |
| 727 | 727 | ||
| 728 | 728 | _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feed.txt", Slug: "feed", Title: "Feed", Space: "feeds"}) | |
| 729 | 729 |
| ... | ... | @@ -739,7 +739,7 @@ func TestFindUsersWithPost(t *testing.T) { | |
| 739 | 739 | func TestFindExpiredPosts(t *testing.T) { | |
| 740 | 740 | cleanupTestData(t) | |
| 741 | 741 | ||
| 742 | - | user, _ := testDB.RegisterUser("expiredpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI expiredpostowner", "comment") | |
| 742 | + | user, _ := testDB.RegisterUser("expiredpostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI expiredpostowner", "comment", "") | |
| 743 | 743 | ||
| 744 | 744 | expired := time.Now().Add(-24 * time.Hour) | |
| 745 | 745 | _ = mustInsertPost(t, &db.Post{ |
| ... | ... | @@ -763,7 +763,7 @@ func TestFindExpiredPosts(t *testing.T) { | |
| 763 | 763 | func TestFindPostsByFeed(t *testing.T) { | |
| 764 | 764 | cleanupTestData(t) | |
| 765 | 765 | ||
| 766 | - | user, _ := testDB.RegisterUser("feedowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedowner", "comment") | |
| 766 | + | user, _ := testDB.RegisterUser("feedowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedowner", "comment", "") | |
| 767 | 767 | ||
| 768 | 768 | now := time.Now() | |
| 769 | 769 | _ = 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) { | |
| 783 | 783 | func TestReplaceTagsByPost(t *testing.T) { | |
| 784 | 784 | cleanupTestData(t) | |
| 785 | 785 | ||
| 786 | - | user, _ := testDB.RegisterUser("tagspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tagspostowner", "comment") | |
| 786 | + | user, _ := testDB.RegisterUser("tagspostowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tagspostowner", "comment", "") | |
| 787 | 787 | post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "tagged.md", Slug: "tagged", Title: "Tagged", Space: "prose"}) | |
| 788 | 788 | ||
| 789 | 789 | err := testDB.ReplaceTagsByPost([]string{"tag1", "tag2"}, post.ID) |
| ... | ... | @@ -800,7 +800,7 @@ func TestReplaceTagsByPost(t *testing.T) { | |
| 800 | 800 | func TestFindUserPostsByTag(t *testing.T) { | |
| 801 | 801 | cleanupTestData(t) | |
| 802 | 802 | ||
| 803 | - | user, _ := testDB.RegisterUser("usertagowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI usertagowner", "comment") | |
| 803 | + | user, _ := testDB.RegisterUser("usertagowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI usertagowner", "comment", "") | |
| 804 | 804 | now := time.Now() | |
| 805 | 805 | post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "usertag.md", Slug: "usertag", Title: "User Tag", Space: "prose", PublishAt: &now}) | |
| 806 | 806 | _ = testDB.ReplaceTagsByPost([]string{"mytag"}, post.ID) |
| ... | ... | @@ -818,7 +818,7 @@ func TestFindUserPostsByTag(t *testing.T) { | |
| 818 | 818 | func TestFindPostsByTag(t *testing.T) { | |
| 819 | 819 | cleanupTestData(t) | |
| 820 | 820 | ||
| 821 | - | user, _ := testDB.RegisterUser("tagsearchowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tagsearchowner", "comment") | |
| 821 | + | user, _ := testDB.RegisterUser("tagsearchowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tagsearchowner", "comment", "") | |
| 822 | 822 | now := time.Now() | |
| 823 | 823 | post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "tagsearch.md", Slug: "tagsearch", Title: "Tag Search", Space: "prose", PublishAt: &now}) | |
| 824 | 824 | _ = testDB.ReplaceTagsByPost([]string{"searchtag"}, post.ID) |
| ... | ... | @@ -836,7 +836,7 @@ func TestFindPostsByTag(t *testing.T) { | |
| 836 | 836 | func TestFindPopularTags(t *testing.T) { | |
| 837 | 837 | cleanupTestData(t) | |
| 838 | 838 | ||
| 839 | - | user, _ := testDB.RegisterUser("populartagowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI populartagowner", "comment") | |
| 839 | + | user, _ := testDB.RegisterUser("populartagowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI populartagowner", "comment", "") | |
| 840 | 840 | post1 := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "pop1.md", Slug: "pop1", Title: "Pop 1", Space: "prose"}) | |
| 841 | 841 | post2 := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "pop2.md", Slug: "pop2", Title: "Pop 2", Space: "prose"}) | |
| 842 | 842 | _ = testDB.ReplaceTagsByPost([]string{"popular"}, post1.ID) |
| ... | ... | @@ -856,7 +856,7 @@ func TestFindPopularTags(t *testing.T) { | |
| 856 | 856 | func TestReplaceAliasesByPost(t *testing.T) { | |
| 857 | 857 | cleanupTestData(t) | |
| 858 | 858 | ||
| 859 | - | user, _ := testDB.RegisterUser("aliasowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aliasowner", "comment") | |
| 859 | + | user, _ := testDB.RegisterUser("aliasowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aliasowner", "comment", "") | |
| 860 | 860 | post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "aliased.md", Slug: "aliased", Title: "Aliased", Space: "prose"}) | |
| 861 | 861 | ||
| 862 | 862 | err := testDB.ReplaceAliasesByPost([]string{"alias1", "alias2"}, post.ID) |
| ... | ... | @@ -868,7 +868,7 @@ func TestReplaceAliasesByPost(t *testing.T) { | |
| 868 | 868 | func TestFindPostWithSlug_Alias(t *testing.T) { | |
| 869 | 869 | cleanupTestData(t) | |
| 870 | 870 | ||
| 871 | - | user, _ := testDB.RegisterUser("aliassearchowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aliassearchowner", "comment") | |
| 871 | + | user, _ := testDB.RegisterUser("aliassearchowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aliassearchowner", "comment", "") | |
| 872 | 872 | post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "original.md", Slug: "original", Title: "Original", Space: "prose"}) | |
| 873 | 873 | _ = testDB.ReplaceAliasesByPost([]string{"my-alias"}, post.ID) | |
| 874 | 874 |
| ... | ... | @@ -886,7 +886,7 @@ func TestFindPostWithSlug_Alias(t *testing.T) { | |
| 886 | 886 | func TestInsertVisit(t *testing.T) { | |
| 887 | 887 | cleanupTestData(t) | |
| 888 | 888 | ||
| 889 | - | user, _ := testDB.RegisterUser("visitowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI visitowner", "comment") | |
| 889 | + | user, _ := testDB.RegisterUser("visitowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI visitowner", "comment", "") | |
| 890 | 890 | ||
| 891 | 891 | visit := &db.AnalyticsVisits{ | |
| 892 | 892 | UserID: user.ID, |
| ... | ... | @@ -907,7 +907,7 @@ func TestInsertVisit(t *testing.T) { | |
| 907 | 907 | func TestVisitSummary(t *testing.T) { | |
| 908 | 908 | cleanupTestData(t) | |
| 909 | 909 | ||
| 910 | - | user, _ := testDB.RegisterUser("summaryowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI summaryowner", "comment") | |
| 910 | + | user, _ := testDB.RegisterUser("summaryowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI summaryowner", "comment", "") | |
| 911 | 911 | ||
| 912 | 912 | visit := &db.AnalyticsVisits{ | |
| 913 | 913 | UserID: user.ID, |
| ... | ... | @@ -937,7 +937,7 @@ func TestVisitSummary(t *testing.T) { | |
| 937 | 937 | func TestFindVisitSiteList(t *testing.T) { | |
| 938 | 938 | cleanupTestData(t) | |
| 939 | 939 | ||
| 940 | - | user, _ := testDB.RegisterUser("sitelistowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI sitelistowner", "comment") | |
| 940 | + | user, _ := testDB.RegisterUser("sitelistowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI sitelistowner", "comment", "") | |
| 941 | 941 | ||
| 942 | 942 | _ = testDB.InsertVisit(&db.AnalyticsVisits{ | |
| 943 | 943 | UserID: user.ID, |
| ... | ... | @@ -960,7 +960,7 @@ func TestFindVisitSiteList(t *testing.T) { | |
| 960 | 960 | func TestVisitUrlNotFound(t *testing.T) { | |
| 961 | 961 | cleanupTestData(t) | |
| 962 | 962 | ||
| 963 | - | user, _ := testDB.RegisterUser("notfoundowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI notfoundowner", "comment") | |
| 963 | + | user, _ := testDB.RegisterUser("notfoundowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI notfoundowner", "comment", "") | |
| 964 | 964 | ||
| 965 | 965 | _ = testDB.InsertVisit(&db.AnalyticsVisits{ | |
| 966 | 966 | UserID: user.ID, |
| ... | ... | @@ -989,7 +989,7 @@ func TestVisitUrlNotFound(t *testing.T) { | |
| 989 | 989 | func TestInsertFeature(t *testing.T) { | |
| 990 | 990 | cleanupTestData(t) | |
| 991 | 991 | ||
| 992 | - | user, _ := testDB.RegisterUser("featureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featureowner", "comment") | |
| 992 | + | user, _ := testDB.RegisterUser("featureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featureowner", "comment", "") | |
| 993 | 993 | ||
| 994 | 994 | expiresAt := time.Now().Add(365 * 24 * time.Hour) | |
| 995 | 995 | feature, err := testDB.InsertFeature(user.ID, "plus", expiresAt) |
| ... | ... | @@ -1004,7 +1004,7 @@ func TestInsertFeature(t *testing.T) { | |
| 1004 | 1004 | func TestFindFeature(t *testing.T) { | |
| 1005 | 1005 | cleanupTestData(t) | |
| 1006 | 1006 | ||
| 1007 | - | user, _ := testDB.RegisterUser("findfeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeatureowner", "comment") | |
| 1007 | + | user, _ := testDB.RegisterUser("findfeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeatureowner", "comment", "") | |
| 1008 | 1008 | expiresAt := time.Now().Add(365 * 24 * time.Hour) | |
| 1009 | 1009 | _, _ = testDB.InsertFeature(user.ID, "plus", expiresAt) | |
| 1010 | 1010 |
| ... | ... | @@ -1020,7 +1020,7 @@ func TestFindFeature(t *testing.T) { | |
| 1020 | 1020 | func TestFindFeaturesByUser(t *testing.T) { | |
| 1021 | 1021 | cleanupTestData(t) | |
| 1022 | 1022 | ||
| 1023 | - | user, _ := testDB.RegisterUser("featuresowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featuresowner", "comment") | |
| 1023 | + | user, _ := testDB.RegisterUser("featuresowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featuresowner", "comment", "") | |
| 1024 | 1024 | expiresAt := time.Now().Add(365 * 24 * time.Hour) | |
| 1025 | 1025 | _, _ = testDB.InsertFeature(user.ID, "plus", expiresAt) | |
| 1026 | 1026 | _, _ = testDB.InsertFeature(user.ID, "pro", expiresAt) |
| ... | ... | @@ -1037,7 +1037,7 @@ func TestFindFeaturesByUser(t *testing.T) { | |
| 1037 | 1037 | func TestHasFeatureByUser(t *testing.T) { | |
| 1038 | 1038 | cleanupTestData(t) | |
| 1039 | 1039 | ||
| 1040 | - | user, _ := testDB.RegisterUser("hasfeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI hasfeatureowner", "comment") | |
| 1040 | + | user, _ := testDB.RegisterUser("hasfeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI hasfeatureowner", "comment", "") | |
| 1041 | 1041 | expiresAt := time.Now().Add(365 * 24 * time.Hour) | |
| 1042 | 1042 | _, _ = testDB.InsertFeature(user.ID, "plus", expiresAt) | |
| 1043 | 1043 |
| ... | ... | @@ -1055,7 +1055,7 @@ func TestHasFeatureByUser(t *testing.T) { | |
| 1055 | 1055 | func TestRemoveFeature(t *testing.T) { | |
| 1056 | 1056 | cleanupTestData(t) | |
| 1057 | 1057 | ||
| 1058 | - | user, _ := testDB.RegisterUser("removefeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removefeatureowner", "comment") | |
| 1058 | + | user, _ := testDB.RegisterUser("removefeatureowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI removefeatureowner", "comment", "") | |
| 1059 | 1059 | expiresAt := time.Now().Add(365 * 24 * time.Hour) | |
| 1060 | 1060 | _, _ = testDB.InsertFeature(user.ID, "plus", expiresAt) | |
| 1061 | 1061 |
| ... | ... | @@ -1073,7 +1073,7 @@ func TestRemoveFeature(t *testing.T) { | |
| 1073 | 1073 | func TestAddPicoPlusUser(t *testing.T) { | |
| 1074 | 1074 | cleanupTestData(t) | |
| 1075 | 1075 | ||
| 1076 | - | _, _ = testDB.RegisterUser("picoplusowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI picoplusowner", "comment") | |
| 1076 | + | _, _ = testDB.RegisterUser("picoplusowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI picoplusowner", "comment", "") | |
| 1077 | 1077 | ||
| 1078 | 1078 | err := testDB.AddPicoPlusUser("picoplusowner", "test@example.com", "stripe", "tx123") | |
| 1079 | 1079 | if err != nil { |
| ... | ... | @@ -1086,7 +1086,7 @@ func TestAddPicoPlusUser(t *testing.T) { | |
| 1086 | 1086 | func TestInsertFeedItems(t *testing.T) { | |
| 1087 | 1087 | cleanupTestData(t) | |
| 1088 | 1088 | ||
| 1089 | - | user, _ := testDB.RegisterUser("feeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feeditemsowner", "comment") | |
| 1089 | + | user, _ := testDB.RegisterUser("feeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feeditemsowner", "comment", "") | |
| 1090 | 1090 | post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feed.txt", Slug: "feed", Title: "Feed", Space: "feeds"}) | |
| 1091 | 1091 | ||
| 1092 | 1092 | items := []*db.FeedItem{ |
| ... | ... | @@ -1103,7 +1103,7 @@ func TestInsertFeedItems(t *testing.T) { | |
| 1103 | 1103 | func TestFindFeedItemsByPostID(t *testing.T) { | |
| 1104 | 1104 | cleanupTestData(t) | |
| 1105 | 1105 | ||
| 1106 | - | user, _ := testDB.RegisterUser("findfeeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeeditemsowner", "comment") | |
| 1106 | + | user, _ := testDB.RegisterUser("findfeeditemsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findfeeditemsowner", "comment", "") | |
| 1107 | 1107 | post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "findfeed.txt", Slug: "findfeed", Title: "Find Feed", Space: "feeds"}) | |
| 1108 | 1108 | ||
| 1109 | 1109 | items := []*db.FeedItem{ |
| ... | ... | @@ -1125,7 +1125,7 @@ func TestFindFeedItemsByPostID(t *testing.T) { | |
| 1125 | 1125 | func TestUpsertProject(t *testing.T) { | |
| 1126 | 1126 | cleanupTestData(t) | |
| 1127 | 1127 | ||
| 1128 | - | user, _ := testDB.RegisterUser("projectowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI projectowner", "comment") | |
| 1128 | + | user, _ := testDB.RegisterUser("projectowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI projectowner", "comment", "") | |
| 1129 | 1129 | ||
| 1130 | 1130 | project, err := testDB.UpsertProject(user.ID, "my-project", "my-project") | |
| 1131 | 1131 | if err != nil { |
| ... | ... | @@ -1147,7 +1147,7 @@ func TestUpsertProject(t *testing.T) { | |
| 1147 | 1147 | func TestFindProjectByName(t *testing.T) { | |
| 1148 | 1148 | cleanupTestData(t) | |
| 1149 | 1149 | ||
| 1150 | - | user, _ := testDB.RegisterUser("findprojectowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findprojectowner", "comment") | |
| 1150 | + | user, _ := testDB.RegisterUser("findprojectowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findprojectowner", "comment", "") | |
| 1151 | 1151 | _, _ = testDB.UpsertProject(user.ID, "findme-project", "findme-project") | |
| 1152 | 1152 | ||
| 1153 | 1153 | project, err := testDB.FindProjectByName(user.ID, "findme-project") |
| ... | ... | @@ -1164,7 +1164,7 @@ func TestFindProjectByName(t *testing.T) { | |
| 1164 | 1164 | func TestFindUserStats(t *testing.T) { | |
| 1165 | 1165 | cleanupTestData(t) | |
| 1166 | 1166 | ||
| 1167 | - | user, _ := testDB.RegisterUser("statsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI statsowner", "comment") | |
| 1167 | + | user, _ := testDB.RegisterUser("statsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI statsowner", "comment", "") | |
| 1168 | 1168 | _ = mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "stat.md", Slug: "stat", Title: "Stat", Space: "prose"}) | |
| 1169 | 1169 | _, _ = testDB.UpsertProject(user.ID, "stat-project", "stat-project") | |
| 1170 | 1170 |
| ... | ... | @@ -1185,7 +1185,7 @@ func TestFindUserStats(t *testing.T) { | |
| 1185 | 1185 | func TestInsertTunsEventLog(t *testing.T) { | |
| 1186 | 1186 | cleanupTestData(t) | |
| 1187 | 1187 | ||
| 1188 | - | user, _ := testDB.RegisterUser("tunsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tunsowner", "comment") | |
| 1188 | + | user, _ := testDB.RegisterUser("tunsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tunsowner", "comment", "") | |
| 1189 | 1189 | ||
| 1190 | 1190 | log := &db.TunsEventLog{ | |
| 1191 | 1191 | UserId: user.ID, |
| ... | ... | @@ -1206,7 +1206,7 @@ func TestInsertTunsEventLog(t *testing.T) { | |
| 1206 | 1206 | func TestFindTunsEventLogs(t *testing.T) { | |
| 1207 | 1207 | cleanupTestData(t) | |
| 1208 | 1208 | ||
| 1209 | - | user, _ := testDB.RegisterUser("findtunsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findtunsowner", "comment") | |
| 1209 | + | user, _ := testDB.RegisterUser("findtunsowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findtunsowner", "comment", "") | |
| 1210 | 1210 | _ = testDB.InsertTunsEventLog(&db.TunsEventLog{ | |
| 1211 | 1211 | UserId: user.ID, | |
| 1212 | 1212 | ServerID: "server-1", |
| ... | ... | @@ -1229,7 +1229,7 @@ func TestFindTunsEventLogs(t *testing.T) { | |
| 1229 | 1229 | func TestFindTunsEventLogsByAddr(t *testing.T) { | |
| 1230 | 1230 | cleanupTestData(t) | |
| 1231 | 1231 | ||
| 1232 | - | user, _ := testDB.RegisterUser("tunsaddrowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tunsaddrowner", "comment") | |
| 1232 | + | user, _ := testDB.RegisterUser("tunsaddrowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI tunsaddrowner", "comment", "") | |
| 1233 | 1233 | _ = testDB.InsertTunsEventLog(&db.TunsEventLog{ | |
| 1234 | 1234 | UserId: user.ID, | |
| 1235 | 1235 | ServerID: "server-1", |
| ... | ... | @@ -1254,7 +1254,7 @@ func TestFindTunsEventLogsByAddr(t *testing.T) { | |
| 1254 | 1254 | func TestInsertAccessLog(t *testing.T) { | |
| 1255 | 1255 | cleanupTestData(t) | |
| 1256 | 1256 | ||
| 1257 | - | user, _ := testDB.RegisterUser("accesslogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accesslogowner", "comment") | |
| 1257 | + | user, _ := testDB.RegisterUser("accesslogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accesslogowner", "comment", "") | |
| 1258 | 1258 | ||
| 1259 | 1259 | log := &db.AccessLog{ | |
| 1260 | 1260 | UserID: user.ID, |
| ... | ... | @@ -1272,7 +1272,7 @@ func TestInsertAccessLog(t *testing.T) { | |
| 1272 | 1272 | func TestFindAccessLogs(t *testing.T) { | |
| 1273 | 1273 | cleanupTestData(t) | |
| 1274 | 1274 | ||
| 1275 | - | user, _ := testDB.RegisterUser("findaccesslogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findaccesslogowner", "comment") | |
| 1275 | + | user, _ := testDB.RegisterUser("findaccesslogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI findaccesslogowner", "comment", "") | |
| 1276 | 1276 | _ = testDB.InsertAccessLog(&db.AccessLog{ | |
| 1277 | 1277 | UserID: user.ID, | |
| 1278 | 1278 | Service: "pgs", |
| ... | ... | @@ -1293,7 +1293,7 @@ func TestFindAccessLogs(t *testing.T) { | |
| 1293 | 1293 | func TestFindPubkeysInAccessLogs(t *testing.T) { | |
| 1294 | 1294 | cleanupTestData(t) | |
| 1295 | 1295 | ||
| 1296 | - | user, _ := testDB.RegisterUser("pubkeylogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pubkeylogowner", "comment") | |
| 1296 | + | user, _ := testDB.RegisterUser("pubkeylogowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pubkeylogowner", "comment", "") | |
| 1297 | 1297 | _ = testDB.InsertAccessLog(&db.AccessLog{ | |
| 1298 | 1298 | UserID: user.ID, | |
| 1299 | 1299 | Service: "pgs", |
| ... | ... | @@ -1313,7 +1313,7 @@ func TestFindPubkeysInAccessLogs(t *testing.T) { | |
| 1313 | 1313 | func TestFindAccessLogsByPubkey(t *testing.T) { | |
| 1314 | 1314 | cleanupTestData(t) | |
| 1315 | 1315 | ||
| 1316 | - | user, _ := testDB.RegisterUser("accessbypubkeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accessbypubkeyowner", "comment") | |
| 1316 | + | user, _ := testDB.RegisterUser("accessbypubkeyowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accessbypubkeyowner", "comment", "") | |
| 1317 | 1317 | pubkey := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI accessbypubkeyowner" | |
| 1318 | 1318 | _ = testDB.InsertAccessLog(&db.AccessLog{ | |
| 1319 | 1319 | UserID: user.ID, |
| ... | ... | @@ -1337,7 +1337,7 @@ func TestFindAccessLogsByPubkey(t *testing.T) { | |
| 1337 | 1337 | func TestPostData_JSONBRoundtrip(t *testing.T) { | |
| 1338 | 1338 | cleanupTestData(t) | |
| 1339 | 1339 | ||
| 1340 | - | user, _ := testDB.RegisterUser("postdataowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postdataowner", "comment") | |
| 1340 | + | user, _ := testDB.RegisterUser("postdataowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI postdataowner", "comment", "") | |
| 1341 | 1341 | ||
| 1342 | 1342 | now := time.Now().Truncate(time.Second) | |
| 1343 | 1343 | postData := db.PostData{ |
| ... | ... | @@ -1370,7 +1370,7 @@ func TestPostData_JSONBRoundtrip(t *testing.T) { | |
| 1370 | 1370 | func TestProjectAcl_JSONBRoundtrip(t *testing.T) { | |
| 1371 | 1371 | cleanupTestData(t) | |
| 1372 | 1372 | ||
| 1373 | - | user, _ := testDB.RegisterUser("aclowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aclowner", "comment") | |
| 1373 | + | user, _ := testDB.RegisterUser("aclowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI aclowner", "comment", "") | |
| 1374 | 1374 | ||
| 1375 | 1375 | project, err := testDB.UpsertProject(user.ID, "acl-project", "acl-project") | |
| 1376 | 1376 | if err != nil { |
| ... | ... | @@ -1390,7 +1390,7 @@ func TestProjectAcl_JSONBRoundtrip(t *testing.T) { | |
| 1390 | 1390 | func TestFeedItemData_JSONBRoundtrip(t *testing.T) { | |
| 1391 | 1391 | cleanupTestData(t) | |
| 1392 | 1392 | ||
| 1393 | - | user, _ := testDB.RegisterUser("feedjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedjsonbowner", "comment") | |
| 1393 | + | user, _ := testDB.RegisterUser("feedjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI feedjsonbowner", "comment", "") | |
| 1394 | 1394 | post := mustInsertPost(t, &db.Post{UserID: user.ID, Filename: "feedjsonb.txt", Slug: "feedjsonb", Title: "Feed JSONB", Space: "feeds"}) | |
| 1395 | 1395 | ||
| 1396 | 1396 | now := time.Now().Truncate(time.Second) |
| ... | ... | @@ -1424,7 +1424,7 @@ func TestFeedItemData_JSONBRoundtrip(t *testing.T) { | |
| 1424 | 1424 | func TestFeatureFlagData_JSONBRoundtrip(t *testing.T) { | |
| 1425 | 1425 | cleanupTestData(t) | |
| 1426 | 1426 | ||
| 1427 | - | user, _ := testDB.RegisterUser("featurejsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featurejsonbowner", "comment") | |
| 1427 | + | user, _ := testDB.RegisterUser("featurejsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI featurejsonbowner", "comment", "") | |
| 1428 | 1428 | ||
| 1429 | 1429 | err := testDB.AddPicoPlusUser("featurejsonbowner", "test@example.com", "stripe", "tx456") | |
| 1430 | 1430 | if err != nil { |
| ... | ... | @@ -1446,7 +1446,7 @@ func TestFeatureFlagData_JSONBRoundtrip(t *testing.T) { | |
| 1446 | 1446 | func TestPaymentHistoryData_JSONBRoundtrip(t *testing.T) { | |
| 1447 | 1447 | cleanupTestData(t) | |
| 1448 | 1448 | ||
| 1449 | - | user, _ := testDB.RegisterUser("paymentjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI paymentjsonbowner", "comment") | |
| 1449 | + | user, _ := testDB.RegisterUser("paymentjsonbowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI paymentjsonbowner", "comment", "") | |
| 1450 | 1450 | ||
| 1451 | 1451 | err := testDB.AddPicoPlusUser("paymentjsonbowner", "payment@example.com", "stripe", "tx789") | |
| 1452 | 1452 | if err != nil { |
| ... | ... | @@ -1468,7 +1468,7 @@ func TestPaymentHistoryData_JSONBRoundtrip(t *testing.T) { | |
| 1468 | 1468 | func TestUpsertPipeMonitor(t *testing.T) { | |
| 1469 | 1469 | cleanupTestData(t) | |
| 1470 | 1470 | ||
| 1471 | - | user, _ := testDB.RegisterUser("pipemonitorowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipemonitorowner", "comment") | |
| 1471 | + | user, _ := testDB.RegisterUser("pipemonitorowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipemonitorowner", "comment", "") | |
| 1472 | 1472 | ||
| 1473 | 1473 | winEnd := time.Now().Add(time.Hour) | |
| 1474 | 1474 | err := testDB.UpsertPipeMonitor(user.ID, "test-topic", 5*time.Minute, &winEnd) |
| ... | ... | @@ -1491,7 +1491,7 @@ func TestUpsertPipeMonitor(t *testing.T) { | |
| 1491 | 1491 | func TestUpsertPipeMonitor_Update(t *testing.T) { | |
| 1492 | 1492 | cleanupTestData(t) | |
| 1493 | 1493 | ||
| 1494 | - | user, _ := testDB.RegisterUser("pipeupdateowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipeupdateowner", "comment") | |
| 1494 | + | user, _ := testDB.RegisterUser("pipeupdateowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipeupdateowner", "comment", "") | |
| 1495 | 1495 | ||
| 1496 | 1496 | winEnd1 := time.Now().Add(time.Hour) | |
| 1497 | 1497 | err := testDB.UpsertPipeMonitor(user.ID, "update-topic", 5*time.Minute, &winEnd1) |
| ... | ... | @@ -1517,7 +1517,7 @@ func TestUpsertPipeMonitor_Update(t *testing.T) { | |
| 1517 | 1517 | func TestUpdatePipeMonitorLastPing(t *testing.T) { | |
| 1518 | 1518 | cleanupTestData(t) | |
| 1519 | 1519 | ||
| 1520 | - | user, _ := testDB.RegisterUser("pipepingowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipepingowner", "comment") | |
| 1520 | + | user, _ := testDB.RegisterUser("pipepingowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipepingowner", "comment", "") | |
| 1521 | 1521 | ||
| 1522 | 1522 | winEnd := time.Now().Add(time.Hour) | |
| 1523 | 1523 | err := testDB.UpsertPipeMonitor(user.ID, "ping-topic", 5*time.Minute, &winEnd) |
| ... | ... | @@ -1543,7 +1543,7 @@ func TestUpdatePipeMonitorLastPing(t *testing.T) { | |
| 1543 | 1543 | func TestRemovePipeMonitor(t *testing.T) { | |
| 1544 | 1544 | cleanupTestData(t) | |
| 1545 | 1545 | ||
| 1546 | - | user, _ := testDB.RegisterUser("piperemoveowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI piperemoveowner", "comment") | |
| 1546 | + | user, _ := testDB.RegisterUser("piperemoveowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI piperemoveowner", "comment", "") | |
| 1547 | 1547 | ||
| 1548 | 1548 | winEnd := time.Now().Add(time.Hour) | |
| 1549 | 1549 | err := testDB.UpsertPipeMonitor(user.ID, "remove-topic", 5*time.Minute, &winEnd) |
| ... | ... | @@ -1565,7 +1565,7 @@ func TestRemovePipeMonitor(t *testing.T) { | |
| 1565 | 1565 | func TestFindPipeMonitorByTopic_NotFound(t *testing.T) { | |
| 1566 | 1566 | cleanupTestData(t) | |
| 1567 | 1567 | ||
| 1568 | - | user, _ := testDB.RegisterUser("pipenotfoundowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipenotfoundowner", "comment") | |
| 1568 | + | user, _ := testDB.RegisterUser("pipenotfoundowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipenotfoundowner", "comment", "") | |
| 1569 | 1569 | ||
| 1570 | 1570 | _, err := testDB.FindPipeMonitorByTopic(user.ID, "nonexistent-topic") | |
| 1571 | 1571 | if err == nil { |
| ... | ... | @@ -1576,7 +1576,7 @@ func TestFindPipeMonitorByTopic_NotFound(t *testing.T) { | |
| 1576 | 1576 | func TestFindPipeMonitorsByUser(t *testing.T) { | |
| 1577 | 1577 | cleanupTestData(t) | |
| 1578 | 1578 | ||
| 1579 | - | user, _ := testDB.RegisterUser("pipemonlistowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipemonlistowner", "comment") | |
| 1579 | + | user, _ := testDB.RegisterUser("pipemonlistowner", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipemonlistowner", "comment", "") | |
| 1580 | 1580 | ||
| 1581 | 1581 | winEnd := time.Now().Add(time.Hour) | |
| 1582 | 1582 | _ = testDB.UpsertPipeMonitor(user.ID, "service-a", 5*time.Minute, &winEnd) |
| ... | ... | @@ -1607,7 +1607,7 @@ func TestFindPipeMonitorsByUser(t *testing.T) { | |
| 1607 | 1607 | func TestFindPipeMonitorsByUser_Empty(t *testing.T) { | |
| 1608 | 1608 | cleanupTestData(t) | |
| 1609 | 1609 | ||
| 1610 | - | user, _ := testDB.RegisterUser("pipenomonitors", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipenomonitors", "comment") | |
| 1610 | + | user, _ := testDB.RegisterUser("pipenomonitors", "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI pipenomonitors", "comment", "") | |
| 1611 | 1611 | ||
| 1612 | 1612 | monitors, err := testDB.FindPipeMonitorsByUser(user.ID) | |
| 1613 | 1613 | if err != nil { |
+1,
-1
| ... | ... | @@ -24,7 +24,7 @@ func NewStubDB(logger *slog.Logger) *StubDB { | |
| 24 | 24 | ||
| 25 | 25 | var errNotImpl = fmt.Errorf("not implemented") | |
| 26 | 26 | ||
| 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) { | |
| 28 | 28 | return nil, errNotImpl | |
| 29 | 29 | } | |
| 30 | 30 |
+4,
-1
| ... | ... | @@ -2,6 +2,7 @@ package tui | |
| 2 | 2 | ||
| 3 | 3 | import ( | |
| 4 | 4 | "fmt" | |
| 5 | + | "net" | |
| 5 | 6 | ||
| 6 | 7 | "git.sr.ht/~rockorager/vaxis" | |
| 7 | 8 | "git.sr.ht/~rockorager/vaxis/vxfw" |
| ... | ... | @@ -45,7 +46,9 @@ func (m *SignupPage) createAccount(name string) (*db.User, error) { | |
| 45 | 46 | return nil, fmt.Errorf("name cannot be empty") | |
| 46 | 47 | } | |
| 47 | 48 | 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) | |
| 49 | 52 | } | |
| 50 | 53 | ||
| 51 | 54 | func (m *SignupPage) CaptureEvent(ev vaxis.Event) (vxfw.Command, error) { |