From cdc0ffaeb742ffe4edb207f4f2b817ace6f1271d Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Sat, 8 Jul 2023 12:32:48 -0400 Subject: [PATCH 01/10] clean out some years old upgrade code --- upgradedb.go | 156 +-------------------------------------------------- 1 file changed, 1 insertion(+), 155 deletions(-) diff --git a/upgradedb.go b/upgradedb.go index c7d4004..8f129c3 100644 --- a/upgradedb.go +++ b/upgradedb.go @@ -41,164 +41,10 @@ func upgradedb() { getconfig("dbversion", &dbversion) getconfig("servername", &serverName) - if dbversion < 13 { + if dbversion < 40 { elog.Fatal("database is too old to upgrade") } switch dbversion { - case 25: - doordie(db, "delete from auth") - doordie(db, "alter table auth add column expiry text") - doordie(db, "update config set value = 26 where key = 'dbversion'") - fallthrough - case 26: - s := "" - getconfig("servermsg", &s) - if s == "" { - setconfig("servermsg", "

Things happen.

") - } - s = "" - getconfig("aboutmsg", &s) - if s == "" { - setconfig("aboutmsg", "

What is honk?

Honk is amazing!") - } - s = "" - getconfig("loginmsg", &s) - if s == "" { - setconfig("loginmsg", "

login

") - } - d := -1 - getconfig("devel", &d) - if d == -1 { - setconfig("devel", 0) - } - doordie(db, "update config set value = 27 where key = 'dbversion'") - fallthrough - case 27: - createserveruser(db) - doordie(db, "update config set value = 28 where key = 'dbversion'") - fallthrough - case 28: - doordie(db, "drop table doovers") - doordie(db, "create table doovers(dooverid integer primary key, dt text, tries integer, userid integer, rcpt text, msg blob)") - doordie(db, "update config set value = 29 where key = 'dbversion'") - fallthrough - case 29: - doordie(db, "alter table honkers add column owner text") - doordie(db, "update honkers set owner = xid") - doordie(db, "update config set value = 30 where key = 'dbversion'") - fallthrough - case 30: - tx, err := db.Begin() - if err != nil { - elog.Fatal(err) - } - rows, err := tx.Query("select userid, options from users") - if err != nil { - elog.Fatal(err) - } - m := make(map[int64]string) - for rows.Next() { - var userid int64 - var options string - err = rows.Scan(&userid, &options) - if err != nil { - elog.Fatal(err) - } - var uo UserOptions - uo.SkinnyCSS = strings.Contains(options, " skinny ") - m[userid], err = jsonify(uo) - if err != nil { - elog.Fatal(err) - } - } - rows.Close() - for u, o := range m { - _, err = tx.Exec("update users set options = ? where userid = ?", o, u) - if err != nil { - elog.Fatal(err) - } - } - err = tx.Commit() - if err != nil { - elog.Fatal(err) - } - doordie(db, "update config set value = 31 where key = 'dbversion'") - fallthrough - case 31: - doordie(db, "create table tracks (xid text, fetches text)") - doordie(db, "create index idx_trackhonkid on tracks(xid)") - doordie(db, "update config set value = 32 where key = 'dbversion'") - fallthrough - case 32: - doordie(db, "alter table xonkers add column dt text") - doordie(db, "update xonkers set dt = ?", time.Now().UTC().Format(dbtimeformat)) - doordie(db, "update config set value = 33 where key = 'dbversion'") - fallthrough - case 33: - doordie(db, "alter table honkers add column meta text") - doordie(db, "update honkers set meta = '{}'") - doordie(db, "update config set value = 34 where key = 'dbversion'") - fallthrough - case 34: - doordie(db, "create table chonks (chonkid integer primary key, userid integer, xid text, who txt, target text, dt text, noise text, format text)") - doordie(db, "update config set value = 35 where key = 'dbversion'") - fallthrough - case 35: - doordie(db, "alter table donks add column chonkid integer") - doordie(db, "update donks set chonkid = -1") - doordie(db, "create index idx_donkshonk on donks(honkid)") - doordie(db, "create index idx_donkschonk on donks(chonkid)") - doordie(db, "update config set value = 36 where key = 'dbversion'") - fallthrough - case 36: - doordie(db, "alter table honkers add column folxid text") - doordie(db, "update honkers set folxid = 'lostdata'") - doordie(db, "update config set value = 37 where key = 'dbversion'") - fallthrough - case 37: - doordie(db, "update honkers set combos = '' where combos is null") - doordie(db, "update honkers set owner = '' where owner is null") - doordie(db, "update honkers set meta = '' where meta is null") - doordie(db, "update honkers set folxid = '' where folxid is null") - doordie(db, "update config set value = 38 where key = 'dbversion'") - fallthrough - case 38: - doordie(db, "update honkers set folxid = abs(random())") - doordie(db, "update config set value = 39 where key = 'dbversion'") - fallthrough - case 39: - blobdb := openblobdb() - doordie(blobdb, "alter table filedata add column hash text") - doordie(blobdb, "create index idx_filehash on filedata(hash)") - rows, err := blobdb.Query("select xid, content from filedata") - if err != nil { - elog.Fatal(err) - } - m := make(map[string]string) - for rows.Next() { - var xid string - var data sql.RawBytes - err := rows.Scan(&xid, &data) - if err != nil { - elog.Fatal(err) - } - hash := hashfiledata(data) - m[xid] = hash - } - rows.Close() - tx, err := blobdb.Begin() - if err != nil { - elog.Fatal(err) - } - for xid, hash := range m { - doordie(tx, "update filedata set hash = ? where xid = ?", hash, xid) - } - err = tx.Commit() - if err != nil { - elog.Fatal(err) - } - doordie(db, "update config set value = 40 where key = 'dbversion'") - fallthrough case 40: doordie(db, "PRAGMA journal_mode=WAL") blobdb := openblobdb() From bf09636bc1eae2822c91a8913411f339499275e0 Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Mon, 10 Jul 2023 00:15:02 -0400 Subject: [PATCH 02/10] remove old imports --- upgradedb.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/upgradedb.go b/upgradedb.go index 8f129c3..ac72090 100644 --- a/upgradedb.go +++ b/upgradedb.go @@ -18,8 +18,6 @@ package main import ( "database/sql" "os" - "strings" - "time" ) var myVersion = 42 From dea831d23f8dfc396ed36a357230c879858c1c06 Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Mon, 10 Jul 2023 00:15:35 -0400 Subject: [PATCH 03/10] error check unveil --- unveil.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/unveil.go b/unveil.go index 0cb8986..ca8ba18 100644 --- a/unveil.go +++ b/unveil.go @@ -29,7 +29,7 @@ import ( "unsafe" ) -func Unveil(path string, perms string) error { +func Unveil(path string, perms string) { cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) cperms := C.CString(perms) @@ -37,20 +37,18 @@ func Unveil(path string, perms string) error { rv, err := C.unveil(cpath, cperms) if rv != 0 { - return fmt.Errorf("unveil(%s, %s) failure (%d)", path, perms, err) + return elog.Fatalf("unveil(%s, %s) failure (%d)", path, perms, err) } - return nil } -func Pledge(promises string) error { +func Pledge(promises string) { cpromises := C.CString(promises) defer C.free(unsafe.Pointer(cpromises)) rv, err := C.pledge(cpromises, nil) if rv != 0 { - return fmt.Errorf("pledge(%s) failure (%d)", promises, err) + elog.Fatalf("pledge(%s) failure (%d)", promises, err) } - return nil } func init() { From 43705654d1a1e1d7d0425775153113c189f13994 Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Mon, 10 Jul 2023 00:16:17 -0400 Subject: [PATCH 04/10] fix --- unveil.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unveil.go b/unveil.go index ca8ba18..4fe8aef 100644 --- a/unveil.go +++ b/unveil.go @@ -37,7 +37,7 @@ func Unveil(path string, perms string) { rv, err := C.unveil(cpath, cperms) if rv != 0 { - return elog.Fatalf("unveil(%s, %s) failure (%d)", path, perms, err) + elog.Fatalf("unveil(%s, %s) failure (%d)", path, perms, err) } } From 51fe6d99b24ff98182dbc992fb4aacbef59794eb Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Mon, 10 Jul 2023 00:16:42 -0400 Subject: [PATCH 05/10] don't need fmt --- unveil.go | 1 - 1 file changed, 1 deletion(-) diff --git a/unveil.go b/unveil.go index 4fe8aef..cbce333 100644 --- a/unveil.go +++ b/unveil.go @@ -25,7 +25,6 @@ package main import "C" import ( - "fmt" "unsafe" ) From 14bc7f5cec442a0e8bd747af9f486a1197ffa826 Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Thu, 13 Jul 2023 02:27:53 -0400 Subject: [PATCH 06/10] CGO is required, and the compiler error without is confusing --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f1b5cfa..8b87efd 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all: honk honk: .preflightcheck schema.sql *.go go.mod - go build -mod=`ls -d vendor 2> /dev/null` -o honk + env CGO_ENABLED=1 go build -mod=`ls -d vendor 2> /dev/null` -o honk .preflightcheck: preflight.sh @sh ./preflight.sh From 211ab9a97aeacc4230c70c42346299a29d8ca8c0 Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Sat, 15 Jul 2023 17:59:44 -0400 Subject: [PATCH 07/10] cleanup some old mistakes and cruft from the database --- activity.go | 5 ----- database.go | 4 +--- fun.go | 2 +- honk.go | 1 - import.go | 5 ----- upgradedb.go | 7 ++++++- web.go | 3 --- 7 files changed, 8 insertions(+), 19 deletions(-) diff --git a/activity.go b/activity.go index e3e4598..0b49557 100644 --- a/activity.go +++ b/activity.go @@ -850,9 +850,6 @@ func xonksaver(user *WhatAbout, item junk.Junk, origin string) *Honk { targ, _ := obj.GetString("target") content += string(templates.Sprintf(`

Moved to %s`, targ, targ)) } - if what == "honk" && rid != "" { - what = "tonk" - } if len(content) > 90001 { ilog.Printf("content too long. truncating") content = content[:90001] @@ -1239,8 +1236,6 @@ func jonkjonk(user *WhatAbout, h *Honk) (junk.Junk, junk.Junk) { switch h.What { case "update": fallthrough - case "tonk": - fallthrough case "event": fallthrough case "honk": diff --git a/database.go b/database.go index fc04cfe..44a420b 100644 --- a/database.go +++ b/database.go @@ -504,8 +504,6 @@ func donksforhonks(honks []*Honk) { elog.Printf("error parsing badonks: %s", err) continue } - case "wonkles": - case "guesses": case "oldrev": default: elog.Printf("unknown meta genus: %s", genus) @@ -1158,7 +1156,7 @@ func prepareStatements(db *sql.DB) { stmtUserHonks = preparetodie(db, selecthonks+"where honks.honkid > ? and (whofore = 2 or whofore = ?) and username = ? and dt > ?"+smalllimit) myhonkers := " and honker in (select xid from honkers where userid = ? and (flavor = 'sub' or flavor = 'peep' or flavor = 'presub') and combos not like '% - %')" stmtHonksForUser = preparetodie(db, selecthonks+"where honks.honkid > ? and honks.userid = ? and dt > ?"+myhonkers+butnotthose+limit) - stmtHonksForUserFirstClass = preparetodie(db, selecthonks+"where honks.honkid > ? and honks.userid = ? and dt > ? and (what <> 'tonk')"+myhonkers+butnotthose+limit) + stmtHonksForUserFirstClass = preparetodie(db, selecthonks+"where honks.honkid > ? and honks.userid = ? and dt > ? and (rid = '' or what = 'bonk')"+myhonkers+butnotthose+limit) stmtHonksForMe = preparetodie(db, selecthonks+"where honks.honkid > ? and honks.userid = ? and dt > ? and whofore = 1"+butnotthose+limit) stmtHonksFromLongAgo = preparetodie(db, selecthonks+"where honks.honkid > ? and honks.userid = ? and dt > ? and dt < ? and whofore = 2"+butnotthose+limit) stmtHonksISaved = preparetodie(db, selecthonks+"where honks.honkid > ? and honks.userid = ? and flags & 4 order by honks.honkid desc") diff --git a/fun.go b/fun.go index 0af56b0..4fa9a1c 100644 --- a/fun.go +++ b/fun.go @@ -66,7 +66,7 @@ func reverbolate(userid int64, honks []*Honk) { somenumberedusers.Get(userid, &user) for _, h := range honks { h.What += "ed" - if h.What == "tonked" { + if h.What == "honked" && h.RID != "" { h.What = "honked back" h.Style += " subtle" } diff --git a/honk.go b/honk.go index d0461a3..1f6d09e 100644 --- a/honk.go +++ b/honk.go @@ -155,7 +155,6 @@ const ( flagIsSaved = 4 flagIsUntagged = 8 flagIsReacted = 16 - flagIsWonked = 32 ) func (honk *Honk) IsAcked() bool { diff --git a/import.go b/import.go index 17f131d..8ac5c34 100644 --- a/import.go +++ b/import.go @@ -148,9 +148,6 @@ func importMastotoots(user *WhatAbout, source string) { Format: "html", Precis: toot.Object.Summary, } - if honk.RID != "" { - honk.What = "tonk" - } if !loudandproud(honk.Audience) { honk.Whofore = 3 } @@ -387,13 +384,11 @@ func importTwitter(username, source string) { noise := "" if parent := tweetmap[t.Tweet.InReplyToStatusID]; parent != nil { t.convoy = parent.convoy - what = "tonk" } else { t.convoy = "data:,acoustichonkytonk-" + t.Tweet.IdStr if t.Tweet.InReplyToScreenName != "" { noise = fmt.Sprintf("re: https://twitter.com/%s/status/%s\n\n", t.Tweet.InReplyToScreenName, t.Tweet.InReplyToStatusID) - what = "tonk" } } audience := []string{thewholeworld} diff --git a/upgradedb.go b/upgradedb.go index ac72090..b4bf806 100644 --- a/upgradedb.go +++ b/upgradedb.go @@ -20,7 +20,7 @@ import ( "os" ) -var myVersion = 42 +var myVersion = 43 type dbexecer interface { Exec(query string, args ...interface{}) (sql.Result, error) @@ -82,6 +82,11 @@ func upgradedb() { doordie(db, "update config set value = 42 where key = 'dbversion'") fallthrough case 42: + doordie(db, "update honks set what = 'honk', flags = flags & ~ 32 where what = 'tonk' or what = 'wonk'") + doordie(db, "delete from honkmeta where genus = 'wonkles' or genus = 'guesses'") + doordie(db, "update config set value = 43 where key = 'dbversion'") + fallthrough + case 43: default: elog.Fatalf("can't upgrade unknown version %d", dbversion) diff --git a/web.go b/web.go index de67154..640433a 100644 --- a/web.go +++ b/web.go @@ -1708,9 +1708,6 @@ func submithonk(w http.ResponseWriter, r *http.Request) *Honk { } else { xid := fmt.Sprintf("%s/%s/%s", user.URL, honkSep, xfiltrate()) what := "honk" - if rid != "" { - what = "tonk" - } honk = &Honk{ UserID: userinfo.UserID, Username: userinfo.Username, From 54fd4845589fa8289a90edc7b0056484a73edf8b Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Sat, 15 Jul 2023 18:03:47 -0400 Subject: [PATCH 08/10] this query should not find bonks, which later causes crashes. thanks benjojo --- database.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database.go b/database.go index 44a420b..28e42f2 100644 --- a/database.go +++ b/database.go @@ -1149,7 +1149,7 @@ func prepareStatements(db *sql.DB) { smalllimit := " order by honks.honkid desc limit ?" butnotthose := " and convoy not in (select name from zonkers where userid = ? and wherefore = 'zonvoy' order by zonkerid desc limit 100)" stmtOneXonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ?") - stmtAnyXonk = preparetodie(db, selecthonks+"where xid = ? order by honks.honkid asc") + stmtAnyXonk = preparetodie(db, selecthonks+"where xid = ? and what <> 'bonk' order by honks.honkid asc") stmtOneBonk = preparetodie(db, selecthonks+"where honks.userid = ? and xid = ? and what = 'bonk' and whofore = 2") stmtPublicHonks = preparetodie(db, selecthonks+"where whofore = 2 and dt > ?"+smalllimit) stmtEventHonks = preparetodie(db, selecthonks+"where (whofore = 2 or honks.userid = ?) and what = 'event'"+smalllimit) From 97b9634a9e115e18f5e895e7d5ba52b70c2acb99 Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Sat, 15 Jul 2023 18:07:07 -0400 Subject: [PATCH 09/10] practically, sufficient for keys to be owned by same domain as actor. the url scheme doesn't matter, and need not match. problem identified by eta. --- fun.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/fun.go b/fun.go index 4fa9a1c..3caa320 100644 --- a/fun.go +++ b/fun.go @@ -694,13 +694,9 @@ func savingthrow(keyname string) { } func keymatch(keyname string, actor string) string { - hash := strings.IndexByte(keyname, '#') - if hash == -1 { - hash = len(keyname) - } - owner := keyname[0:hash] - if owner == actor { - return originate(actor) + origin := originate(actor) + if origin == originate(keyname) { + return origin } return "" } From 2dd6b273562e524c7f3bc784bdd8ce7dc83a9d5c Mon Sep 17 00:00:00 2001 From: Ted Unangst Date: Sat, 15 Jul 2023 18:19:12 -0400 Subject: [PATCH 10/10] when looking at another user on the same server, don't display controls. you can't interact with other users via their pages because technically it's like they are on a different server. --- web.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/web.go b/web.go index 640433a..234cc53 100644 --- a/web.go +++ b/web.go @@ -723,14 +723,19 @@ func showuser(w http.ResponseWriter, r *http.Request) { return } u := login.GetUserInfo(r) - honks := gethonksbyuser(name, u != nil && u.Username == name, 0) + if u != nil && u.Username != name { + u = nil + } + honks := gethonksbyuser(name, u != nil, 0) templinfo := getInfo(r) templinfo["PageName"] = "user" templinfo["PageArg"] = name templinfo["Name"] = user.Name templinfo["WhatAbout"] = user.HTAbout templinfo["ServerMessage"] = "" - templinfo["HonkCSRF"] = login.GetCSRF("honkhonk", r) + if u != nil { + templinfo["HonkCSRF"] = login.GetCSRF("honkhonk", r) + } honkpage(w, u, honks, templinfo) } @@ -1184,7 +1189,9 @@ func showonehonk(w http.ResponseWriter, r *http.Request) { } templinfo["ServerMessage"] = "one honk maybe more" - templinfo["HonkCSRF"] = login.GetCSRF("honkhonk", r) + if u != nil { + templinfo["HonkCSRF"] = login.GetCSRF("honkhonk", r) + } templinfo["APAltLink"] = templates.Sprintf("", xid) honkpage(w, u, honks, templinfo) }