commit a5159f1f3f75d7c41a0be788cf293e638ec88c81 Author: Rafael Caricio Date: Sat Jan 28 13:03:36 2023 +0100 Version c3fb03c1cb1f diff --git a/.hg/00changelog.i b/.hg/00changelog.i new file mode 100644 index 0000000..22e0643 Binary files /dev/null and b/.hg/00changelog.i differ diff --git a/.hg/branch b/.hg/branch new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/.hg/branch @@ -0,0 +1 @@ +default diff --git a/.hg/cache/branch2-base b/.hg/cache/branch2-base new file mode 100644 index 0000000..83b9649 --- /dev/null +++ b/.hg/cache/branch2-base @@ -0,0 +1,2 @@ +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b 1476 +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b o default diff --git a/.hg/cache/branch2-immutable b/.hg/cache/branch2-immutable new file mode 100644 index 0000000..83b9649 --- /dev/null +++ b/.hg/cache/branch2-immutable @@ -0,0 +1,2 @@ +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b 1476 +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b o default diff --git a/.hg/cache/branch2-served b/.hg/cache/branch2-served new file mode 100644 index 0000000..83b9649 --- /dev/null +++ b/.hg/cache/branch2-served @@ -0,0 +1,2 @@ +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b 1476 +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b o default diff --git a/.hg/cache/branch2-served.hidden b/.hg/cache/branch2-served.hidden new file mode 100644 index 0000000..83b9649 --- /dev/null +++ b/.hg/cache/branch2-served.hidden @@ -0,0 +1,2 @@ +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b 1476 +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b o default diff --git a/.hg/cache/branch2-visible b/.hg/cache/branch2-visible new file mode 100644 index 0000000..83b9649 --- /dev/null +++ b/.hg/cache/branch2-visible @@ -0,0 +1,2 @@ +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b 1476 +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b o default diff --git a/.hg/cache/branch2-visible-hidden b/.hg/cache/branch2-visible-hidden new file mode 100644 index 0000000..83b9649 --- /dev/null +++ b/.hg/cache/branch2-visible-hidden @@ -0,0 +1,2 @@ +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b 1476 +c3fb03c1cb1f8ed2e59dac82c5188274e67b151b o default diff --git a/.hg/cache/hgtagsfnodes1 b/.hg/cache/hgtagsfnodes1 new file mode 100644 index 0000000..2fc98f6 --- /dev/null +++ b/.hg/cache/hgtagsfnodes1 @@ -0,0 +1 @@ +JuRpfMHxCb \ No newline at end of file diff --git a/.hg/cache/rbc-names-v1 b/.hg/cache/rbc-names-v1 new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/.hg/cache/rbc-names-v1 @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/.hg/cache/rbc-revs-v1 b/.hg/cache/rbc-revs-v1 new file mode 100644 index 0000000..3495cde Binary files /dev/null and b/.hg/cache/rbc-revs-v1 differ diff --git a/.hg/cache/tags2 b/.hg/cache/tags2 new file mode 100644 index 0000000..ac4a0a3 --- /dev/null +++ b/.hg/cache/tags2 @@ -0,0 +1,39 @@ +1476 c3fb03c1cb1f8ed2e59dac82c5188274e67b151b +473c3dd6df6f1294362d9042ae5583a6e30d48c9 v0.1.0 +14d4623234ca623e9ae35a64d3f87c7d50e2b42f v0.1.1 +96d2e1dc6664d71ba67d896c32d8b50094305e0f v0.1.2 +a50adf10726dac300afeba9cfacb6db185157311 v0.2.0 +2c62e21731b375f81c57f00c709244ae8fc65d76 v0.2.1 +eba8ccf45b80e6f9523c55e55d937f10f9262cb1 v0.2.2 +4a5816b79e8787dea21c0addcd8ba62a4eaec318 v0.2.3 +7b38c7500ce067001c14b844eaf99f85887324da v0.2.4 +9e95200c9763966f3c8d13fd93771e3a68ac77aa v0.3.0 +12e113bb60481f2429ce053286e2e512520bd4ef v0.4.0 +e57c6026b9033af5649b31cce06b566206809367 v0.5.0 +57603c1049f68945c40e3c8e5c4486e367daade4 v0.6.0 +907c626de523fa2b055306a9385dfd569cf03f56 v0.7.0 +0baeee9aed87624499931ac5cf44f2ebdfd2ceb0 v0.7.1 +b1ec4c9c189d13d8c6dba0ab7e75e4533abebff2 v0.7.2 +efaae027527fad86cb584995305ee8dd2456a5d8 v0.7.3 +4f0ac04432d5cc18eaab139e8d3408219ca16ead v0.7.4 +65ea769c65bb0a5a9ae204537b5c1bff6261dec4 v0.7.5 +0f150eed70d5f92e69249f427b5bb921d8f0703e v0.7.6 +b2278292cce136cd9f5b7cd2ba7be04f887ab700 v0.7.7 +cc2ec3c8bf656f337919efddffd43634f1d9144c v0.8.0 +8e85621f4e62da9d6caf946ce65be90e6f49434e v0.8.1 +b140f7a3216b820aa13f982e45ff42781d7a8f4a v0.8.2 +b140f7a3216b820aa13f982e45ff42781d7a8f4a v0.8.2 +8a2a90379bf60d425fec114ff88f5fd9806a4965 v0.8.2 +808ef90260d5d81db1ec98fb8894588a3ac7b369 v0.8.3 +3ada67b721e7e4a478d0effacde14f36dc16e1de v0.8.4 +2e9969df06ddab8fa07999e91437dda28ec058ae v0.8.5 +3e41549dbc90f1d2ad246e4af72db9343021bc98 v0.8.6 +8e5c85fbcf02e61c9a2d12415f83d16f8afadba4 v0.9.0 +5218aee560879398288e009d8a426749bd172f40 v0.9.1 +a2f6f7bdfb6ea8cac68acdb952b2eed8a585749d v0.9.2 +dac64bc6a93cedeb6ae618cba8f8647af96d2ece v0.9.3 +28b92eaba37140a8a84a871d3f007b46fe66acb7 v0.9.4 +3ece33fb77800c027ecfd3b5100881732d68c9bb v0.9.5 +6a522536238fe25b6d048543f52ed406ccf720b2 v0.9.6 +bc1bcfb9c0cc86b3c63325b07e13a36b9d4500f0 v0.9.7 +916cefdc24363b6e7e193dbde82632c17f58adfd v0.9.8 diff --git a/.hg/cache/tags2-served b/.hg/cache/tags2-served new file mode 100644 index 0000000..ac4a0a3 --- /dev/null +++ b/.hg/cache/tags2-served @@ -0,0 +1,39 @@ +1476 c3fb03c1cb1f8ed2e59dac82c5188274e67b151b +473c3dd6df6f1294362d9042ae5583a6e30d48c9 v0.1.0 +14d4623234ca623e9ae35a64d3f87c7d50e2b42f v0.1.1 +96d2e1dc6664d71ba67d896c32d8b50094305e0f v0.1.2 +a50adf10726dac300afeba9cfacb6db185157311 v0.2.0 +2c62e21731b375f81c57f00c709244ae8fc65d76 v0.2.1 +eba8ccf45b80e6f9523c55e55d937f10f9262cb1 v0.2.2 +4a5816b79e8787dea21c0addcd8ba62a4eaec318 v0.2.3 +7b38c7500ce067001c14b844eaf99f85887324da v0.2.4 +9e95200c9763966f3c8d13fd93771e3a68ac77aa v0.3.0 +12e113bb60481f2429ce053286e2e512520bd4ef v0.4.0 +e57c6026b9033af5649b31cce06b566206809367 v0.5.0 +57603c1049f68945c40e3c8e5c4486e367daade4 v0.6.0 +907c626de523fa2b055306a9385dfd569cf03f56 v0.7.0 +0baeee9aed87624499931ac5cf44f2ebdfd2ceb0 v0.7.1 +b1ec4c9c189d13d8c6dba0ab7e75e4533abebff2 v0.7.2 +efaae027527fad86cb584995305ee8dd2456a5d8 v0.7.3 +4f0ac04432d5cc18eaab139e8d3408219ca16ead v0.7.4 +65ea769c65bb0a5a9ae204537b5c1bff6261dec4 v0.7.5 +0f150eed70d5f92e69249f427b5bb921d8f0703e v0.7.6 +b2278292cce136cd9f5b7cd2ba7be04f887ab700 v0.7.7 +cc2ec3c8bf656f337919efddffd43634f1d9144c v0.8.0 +8e85621f4e62da9d6caf946ce65be90e6f49434e v0.8.1 +b140f7a3216b820aa13f982e45ff42781d7a8f4a v0.8.2 +b140f7a3216b820aa13f982e45ff42781d7a8f4a v0.8.2 +8a2a90379bf60d425fec114ff88f5fd9806a4965 v0.8.2 +808ef90260d5d81db1ec98fb8894588a3ac7b369 v0.8.3 +3ada67b721e7e4a478d0effacde14f36dc16e1de v0.8.4 +2e9969df06ddab8fa07999e91437dda28ec058ae v0.8.5 +3e41549dbc90f1d2ad246e4af72db9343021bc98 v0.8.6 +8e5c85fbcf02e61c9a2d12415f83d16f8afadba4 v0.9.0 +5218aee560879398288e009d8a426749bd172f40 v0.9.1 +a2f6f7bdfb6ea8cac68acdb952b2eed8a585749d v0.9.2 +dac64bc6a93cedeb6ae618cba8f8647af96d2ece v0.9.3 +28b92eaba37140a8a84a871d3f007b46fe66acb7 v0.9.4 +3ece33fb77800c027ecfd3b5100881732d68c9bb v0.9.5 +6a522536238fe25b6d048543f52ed406ccf720b2 v0.9.6 +bc1bcfb9c0cc86b3c63325b07e13a36b9d4500f0 v0.9.7 +916cefdc24363b6e7e193dbde82632c17f58adfd v0.9.8 diff --git a/.hg/dirstate b/.hg/dirstate new file mode 100644 index 0000000..8ed5b2a Binary files /dev/null and b/.hg/dirstate differ diff --git a/.hg/hgrc b/.hg/hgrc new file mode 100644 index 0000000..dfcba3d --- /dev/null +++ b/.hg/hgrc @@ -0,0 +1,14 @@ +# example repository config (see 'hg help config' for more info) +[paths] +default = https://humungus.tedunangst.com/r/honk + +# path aliases to other clones of this repo in URLs or filesystem paths +# (see 'hg help config.paths' for more info) +# +# default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork +# my-fork = ssh://jdoe@example.net/hg/jdoes-fork +# my-clone = /home/jdoe/jdoes-clone + +[ui] +# name and email (local to this repository, optional), e.g. +# username = Jane Doe diff --git a/.hg/requires b/.hg/requires new file mode 100644 index 0000000..653b649 --- /dev/null +++ b/.hg/requires @@ -0,0 +1 @@ +share-safe diff --git a/.hg/store/00changelog.d b/.hg/store/00changelog.d new file mode 100644 index 0000000..93b452a Binary files /dev/null and b/.hg/store/00changelog.d differ diff --git a/.hg/store/00changelog.i b/.hg/store/00changelog.i new file mode 100644 index 0000000..3e749b6 Binary files /dev/null and b/.hg/store/00changelog.i differ diff --git a/.hg/store/00manifest.d b/.hg/store/00manifest.d new file mode 100644 index 0000000..bf6f8f3 Binary files /dev/null and b/.hg/store/00manifest.d differ diff --git a/.hg/store/00manifest.i b/.hg/store/00manifest.i new file mode 100644 index 0000000..ed2e758 Binary files /dev/null and b/.hg/store/00manifest.i differ diff --git a/.hg/store/data/_l_i_c_e_n_s_e.i b/.hg/store/data/_l_i_c_e_n_s_e.i new file mode 100644 index 0000000..b5a69f5 Binary files /dev/null and b/.hg/store/data/_l_i_c_e_n_s_e.i differ diff --git a/.hg/store/data/_makefile.i b/.hg/store/data/_makefile.i new file mode 100644 index 0000000..bf6b2e7 Binary files /dev/null and b/.hg/store/data/_makefile.i differ diff --git a/.hg/store/data/_r_e_a_d_m_e.i b/.hg/store/data/_r_e_a_d_m_e.i new file mode 100644 index 0000000..907ddf4 Binary files /dev/null and b/.hg/store/data/_r_e_a_d_m_e.i differ diff --git a/.hg/store/data/activity.go.i b/.hg/store/data/activity.go.i new file mode 100644 index 0000000..a7bab32 Binary files /dev/null and b/.hg/store/data/activity.go.i differ diff --git a/.hg/store/data/admin.go.i b/.hg/store/data/admin.go.i new file mode 100644 index 0000000..179c356 Binary files /dev/null and b/.hg/store/data/admin.go.i differ diff --git a/.hg/store/data/avatar.go.i b/.hg/store/data/avatar.go.i new file mode 100644 index 0000000..6348a3b Binary files /dev/null and b/.hg/store/data/avatar.go.i differ diff --git a/.hg/store/data/backend.go.i b/.hg/store/data/backend.go.i new file mode 100644 index 0000000..66bf6ff Binary files /dev/null and b/.hg/store/data/backend.go.i differ diff --git a/.hg/store/data/backupdb.go.i b/.hg/store/data/backupdb.go.i new file mode 100644 index 0000000..dfc2a15 Binary files /dev/null and b/.hg/store/data/backupdb.go.i differ diff --git a/.hg/store/data/bloat.go.i b/.hg/store/data/bloat.go.i new file mode 100644 index 0000000..84eb192 Binary files /dev/null and b/.hg/store/data/bloat.go.i differ diff --git a/.hg/store/data/cache.go.i b/.hg/store/data/cache.go.i new file mode 100644 index 0000000..54da1fb Binary files /dev/null and b/.hg/store/data/cache.go.i differ diff --git a/.hg/store/data/database.go.i b/.hg/store/data/database.go.i new file mode 100644 index 0000000..49e67cb Binary files /dev/null and b/.hg/store/data/database.go.i differ diff --git a/.hg/store/data/deliverator.go.i b/.hg/store/data/deliverator.go.i new file mode 100644 index 0000000..e435da1 Binary files /dev/null and b/.hg/store/data/deliverator.go.i differ diff --git a/.hg/store/data/docs/activitypub.7.i b/.hg/store/data/docs/activitypub.7.i new file mode 100644 index 0000000..60b603e Binary files /dev/null and b/.hg/store/data/docs/activitypub.7.i differ diff --git a/.hg/store/data/docs/admin.txt.i b/.hg/store/data/docs/admin.txt.i new file mode 100644 index 0000000..ec508f6 Binary files /dev/null and b/.hg/store/data/docs/admin.txt.i differ diff --git a/.hg/store/data/docs/changelog.txt.i b/.hg/store/data/docs/changelog.txt.i new file mode 100644 index 0000000..2fa271d Binary files /dev/null and b/.hg/store/data/docs/changelog.txt.i differ diff --git a/.hg/store/data/docs/hfcs.1.i b/.hg/store/data/docs/hfcs.1.i new file mode 100644 index 0000000..4ff817c Binary files /dev/null and b/.hg/store/data/docs/hfcs.1.i differ diff --git a/.hg/store/data/docs/honk.1.i b/.hg/store/data/docs/honk.1.i new file mode 100644 index 0000000..25dbdd7 Binary files /dev/null and b/.hg/store/data/docs/honk.1.i differ diff --git a/.hg/store/data/docs/honk.3.i b/.hg/store/data/docs/honk.3.i new file mode 100644 index 0000000..1f3d8fb Binary files /dev/null and b/.hg/store/data/docs/honk.3.i differ diff --git a/.hg/store/data/docs/honk.5.i b/.hg/store/data/docs/honk.5.i new file mode 100644 index 0000000..9475970 Binary files /dev/null and b/.hg/store/data/docs/honk.5.i differ diff --git a/.hg/store/data/docs/honk.8.i b/.hg/store/data/docs/honk.8.i new file mode 100644 index 0000000..31c109d Binary files /dev/null and b/.hg/store/data/docs/honk.8.i differ diff --git a/.hg/store/data/docs/intro.1.i b/.hg/store/data/docs/intro.1.i new file mode 100644 index 0000000..bca63ca Binary files /dev/null and b/.hg/store/data/docs/intro.1.i differ diff --git a/.hg/store/data/docs/mandoc.css.i b/.hg/store/data/docs/mandoc.css.i new file mode 100644 index 0000000..067d0ae Binary files /dev/null and b/.hg/store/data/docs/mandoc.css.i differ diff --git a/.hg/store/data/docs/manual.txt.i b/.hg/store/data/docs/manual.txt.i new file mode 100644 index 0000000..ff99085 Binary files /dev/null and b/.hg/store/data/docs/manual.txt.i differ diff --git a/.hg/store/data/docs/ping.txt.i b/.hg/store/data/docs/ping.txt.i new file mode 100644 index 0000000..830d61f Binary files /dev/null and b/.hg/store/data/docs/ping.txt.i differ diff --git a/.hg/store/data/docs/screenshot-afterpost.jpg.i b/.hg/store/data/docs/screenshot-afterpost.jpg.i new file mode 100644 index 0000000..e935ece Binary files /dev/null and b/.hg/store/data/docs/screenshot-afterpost.jpg.i differ diff --git a/.hg/store/data/docs/screenshot-compose.png.i b/.hg/store/data/docs/screenshot-compose.png.i new file mode 100644 index 0000000..6ba91a2 Binary files /dev/null and b/.hg/store/data/docs/screenshot-compose.png.i differ diff --git a/.hg/store/data/docs/screenshot-honk.png.i b/.hg/store/data/docs/screenshot-honk.png.i new file mode 100644 index 0000000..477b86e Binary files /dev/null and b/.hg/store/data/docs/screenshot-honk.png.i differ diff --git a/.hg/store/data/docs/security.txt.i b/.hg/store/data/docs/security.txt.i new file mode 100644 index 0000000..35af97e Binary files /dev/null and b/.hg/store/data/docs/security.txt.i differ diff --git a/.hg/store/data/docs/spec.txt.i b/.hg/store/data/docs/spec.txt.i new file mode 100644 index 0000000..719fba1 Binary files /dev/null and b/.hg/store/data/docs/spec.txt.i differ diff --git a/.hg/store/data/docs/vim.3.i b/.hg/store/data/docs/vim.3.i new file mode 100644 index 0000000..305dfc5 Binary files /dev/null and b/.hg/store/data/docs/vim.3.i differ diff --git a/.hg/store/data/fun.go.i b/.hg/store/data/fun.go.i new file mode 100644 index 0000000..eedf1d7 Binary files /dev/null and b/.hg/store/data/fun.go.i differ diff --git a/.hg/store/data/fun__test.go.i b/.hg/store/data/fun__test.go.i new file mode 100644 index 0000000..6b139ee Binary files /dev/null and b/.hg/store/data/fun__test.go.i differ diff --git a/.hg/store/data/genschemago.sh.i b/.hg/store/data/genschemago.sh.i new file mode 100644 index 0000000..ffa4715 Binary files /dev/null and b/.hg/store/data/genschemago.sh.i differ diff --git a/.hg/store/data/go.mod.i b/.hg/store/data/go.mod.i new file mode 100644 index 0000000..d1a0376 Binary files /dev/null and b/.hg/store/data/go.mod.i differ diff --git a/.hg/store/data/go.sum.i b/.hg/store/data/go.sum.i new file mode 100644 index 0000000..94f6a5a Binary files /dev/null and b/.hg/store/data/go.sum.i differ diff --git a/.hg/store/data/hfcs.go.i b/.hg/store/data/hfcs.go.i new file mode 100644 index 0000000..b44ff27 Binary files /dev/null and b/.hg/store/data/hfcs.go.i differ diff --git a/.hg/store/data/honk.go.i b/.hg/store/data/honk.go.i new file mode 100644 index 0000000..20bd36e Binary files /dev/null and b/.hg/store/data/honk.go.i differ diff --git a/.hg/store/data/hoot.go.i b/.hg/store/data/hoot.go.i new file mode 100644 index 0000000..b107a6b Binary files /dev/null and b/.hg/store/data/hoot.go.i differ diff --git a/.hg/store/data/hoot__test.go.i b/.hg/store/data/hoot__test.go.i new file mode 100644 index 0000000..d5b05e1 Binary files /dev/null and b/.hg/store/data/hoot__test.go.i differ diff --git a/.hg/store/data/html.go.i b/.hg/store/data/html.go.i new file mode 100644 index 0000000..9d53390 Binary files /dev/null and b/.hg/store/data/html.go.i differ diff --git a/.hg/store/data/image.go.i b/.hg/store/data/image.go.i new file mode 100644 index 0000000..695bc49 Binary files /dev/null and b/.hg/store/data/image.go.i differ diff --git a/.hg/store/data/import.go.i b/.hg/store/data/import.go.i new file mode 100644 index 0000000..5498da0 Binary files /dev/null and b/.hg/store/data/import.go.i differ diff --git a/.hg/store/data/log.go.i b/.hg/store/data/log.go.i new file mode 100644 index 0000000..bc4663c Binary files /dev/null and b/.hg/store/data/log.go.i differ diff --git a/.hg/store/data/login.go.i b/.hg/store/data/login.go.i new file mode 100644 index 0000000..81873eb Binary files /dev/null and b/.hg/store/data/login.go.i differ diff --git a/.hg/store/data/markitzero.go.i b/.hg/store/data/markitzero.go.i new file mode 100644 index 0000000..c101b6f Binary files /dev/null and b/.hg/store/data/markitzero.go.i differ diff --git a/.hg/store/data/markitzero__test.go.i b/.hg/store/data/markitzero__test.go.i new file mode 100644 index 0000000..5cbeb9d Binary files /dev/null and b/.hg/store/data/markitzero__test.go.i differ diff --git a/.hg/store/data/ping.txt.i b/.hg/store/data/ping.txt.i new file mode 100644 index 0000000..d2a70d8 Binary files /dev/null and b/.hg/store/data/ping.txt.i differ diff --git a/.hg/store/data/preflight.sh.i b/.hg/store/data/preflight.sh.i new file mode 100644 index 0000000..807b525 Binary files /dev/null and b/.hg/store/data/preflight.sh.i differ diff --git a/.hg/store/data/rss.go.i b/.hg/store/data/rss.go.i new file mode 100644 index 0000000..912b442 Binary files /dev/null and b/.hg/store/data/rss.go.i differ diff --git a/.hg/store/data/schema.go.i b/.hg/store/data/schema.go.i new file mode 100644 index 0000000..e95884f Binary files /dev/null and b/.hg/store/data/schema.go.i differ diff --git a/.hg/store/data/schema.sql.i b/.hg/store/data/schema.sql.i new file mode 100644 index 0000000..1ac96d9 Binary files /dev/null and b/.hg/store/data/schema.sql.i differ diff --git a/.hg/store/data/security.txt.i b/.hg/store/data/security.txt.i new file mode 100644 index 0000000..cd3b501 Binary files /dev/null and b/.hg/store/data/security.txt.i differ diff --git a/.hg/store/data/sensors.go.i b/.hg/store/data/sensors.go.i new file mode 100644 index 0000000..bbc44b0 Binary files /dev/null and b/.hg/store/data/sensors.go.i differ diff --git a/.hg/store/data/skulduggery.go.i b/.hg/store/data/skulduggery.go.i new file mode 100644 index 0000000..f63be9a Binary files /dev/null and b/.hg/store/data/skulduggery.go.i differ diff --git a/.hg/store/data/spec.txt.i b/.hg/store/data/spec.txt.i new file mode 100644 index 0000000..a2bfe83 Binary files /dev/null and b/.hg/store/data/spec.txt.i differ diff --git a/.hg/store/data/template.go.i b/.hg/store/data/template.go.i new file mode 100644 index 0000000..7c6b4ca Binary files /dev/null and b/.hg/store/data/template.go.i differ diff --git a/.hg/store/data/toys/_makefile.i b/.hg/store/data/toys/_makefile.i new file mode 100644 index 0000000..329032c Binary files /dev/null and b/.hg/store/data/toys/_makefile.i differ diff --git a/.hg/store/data/toys/_r_e_a_d_m_e.i b/.hg/store/data/toys/_r_e_a_d_m_e.i new file mode 100644 index 0000000..82dd2ab Binary files /dev/null and b/.hg/store/data/toys/_r_e_a_d_m_e.i differ diff --git a/.hg/store/data/toys/autobonker.go.i b/.hg/store/data/toys/autobonker.go.i new file mode 100644 index 0000000..690d3c2 Binary files /dev/null and b/.hg/store/data/toys/autobonker.go.i differ diff --git a/.hg/store/data/toys/fetch.go.i b/.hg/store/data/toys/fetch.go.i new file mode 100644 index 0000000..a9eb189 Binary files /dev/null and b/.hg/store/data/toys/fetch.go.i differ diff --git a/.hg/store/data/toys/gettoken.go.i b/.hg/store/data/toys/gettoken.go.i new file mode 100644 index 0000000..44fbd8c Binary files /dev/null and b/.hg/store/data/toys/gettoken.go.i differ diff --git a/.hg/store/data/toys/saytheday.go.i b/.hg/store/data/toys/saytheday.go.i new file mode 100644 index 0000000..596ec0d Binary files /dev/null and b/.hg/store/data/toys/saytheday.go.i differ diff --git a/.hg/store/data/toys/sprayandpray.go.i b/.hg/store/data/toys/sprayandpray.go.i new file mode 100644 index 0000000..921058f Binary files /dev/null and b/.hg/store/data/toys/sprayandpray.go.i differ diff --git a/.hg/store/data/toys/wonkawonk.go.i b/.hg/store/data/toys/wonkawonk.go.i new file mode 100644 index 0000000..fc7b5f4 Binary files /dev/null and b/.hg/store/data/toys/wonkawonk.go.i differ diff --git a/.hg/store/data/toys/youvegothonks.go.i b/.hg/store/data/toys/youvegothonks.go.i new file mode 100644 index 0000000..8fb270d Binary files /dev/null and b/.hg/store/data/toys/youvegothonks.go.i differ diff --git a/.hg/store/data/unveil.go.i b/.hg/store/data/unveil.go.i new file mode 100644 index 0000000..1cf3dc4 Binary files /dev/null and b/.hg/store/data/unveil.go.i differ diff --git a/.hg/store/data/upgradedb.go.i b/.hg/store/data/upgradedb.go.i new file mode 100644 index 0000000..79f4a0c Binary files /dev/null and b/.hg/store/data/upgradedb.go.i differ diff --git a/.hg/store/data/util.go.i b/.hg/store/data/util.go.i new file mode 100644 index 0000000..a7f1f54 Binary files /dev/null and b/.hg/store/data/util.go.i differ diff --git a/.hg/store/data/views/about.html.i b/.hg/store/data/views/about.html.i new file mode 100644 index 0000000..4ae0d4a Binary files /dev/null and b/.hg/store/data/views/about.html.i differ diff --git a/.hg/store/data/views/account.html.i b/.hg/store/data/views/account.html.i new file mode 100644 index 0000000..595e2fd Binary files /dev/null and b/.hg/store/data/views/account.html.i differ diff --git a/.hg/store/data/views/chatter.html.i b/.hg/store/data/views/chatter.html.i new file mode 100644 index 0000000..09ee6a4 Binary files /dev/null and b/.hg/store/data/views/chatter.html.i differ diff --git a/.hg/store/data/views/combos.html.i b/.hg/store/data/views/combos.html.i new file mode 100644 index 0000000..ed99173 Binary files /dev/null and b/.hg/store/data/views/combos.html.i differ diff --git a/.hg/store/data/views/emus.html.i b/.hg/store/data/views/emus.html.i new file mode 100644 index 0000000..b3c721a Binary files /dev/null and b/.hg/store/data/views/emus.html.i differ diff --git a/.hg/store/data/views/funzone.html.i b/.hg/store/data/views/funzone.html.i new file mode 100644 index 0000000..6508aee Binary files /dev/null and b/.hg/store/data/views/funzone.html.i differ diff --git a/.hg/store/data/views/header.html.i b/.hg/store/data/views/header.html.i new file mode 100644 index 0000000..f36c076 Binary files /dev/null and b/.hg/store/data/views/header.html.i differ diff --git a/.hg/store/data/views/hfcs.html.i b/.hg/store/data/views/hfcs.html.i new file mode 100644 index 0000000..72ca76f Binary files /dev/null and b/.hg/store/data/views/hfcs.html.i differ diff --git a/.hg/store/data/views/homepage.html.i b/.hg/store/data/views/homepage.html.i new file mode 100644 index 0000000..59008f3 Binary files /dev/null and b/.hg/store/data/views/homepage.html.i differ diff --git a/.hg/store/data/views/honk.html.i b/.hg/store/data/views/honk.html.i new file mode 100644 index 0000000..b023782 Binary files /dev/null and b/.hg/store/data/views/honk.html.i differ diff --git a/.hg/store/data/views/honkers.html.i b/.hg/store/data/views/honkers.html.i new file mode 100644 index 0000000..3d13e09 Binary files /dev/null and b/.hg/store/data/views/honkers.html.i differ diff --git a/.hg/store/data/views/honkform.html.i b/.hg/store/data/views/honkform.html.i new file mode 100644 index 0000000..db4ceb3 Binary files /dev/null and b/.hg/store/data/views/honkform.html.i differ diff --git a/.hg/store/data/views/honkfrags.html.i b/.hg/store/data/views/honkfrags.html.i new file mode 100644 index 0000000..de477a9 Binary files /dev/null and b/.hg/store/data/views/honkfrags.html.i differ diff --git a/.hg/store/data/views/honkpage.html.i b/.hg/store/data/views/honkpage.html.i new file mode 100644 index 0000000..7334880 Binary files /dev/null and b/.hg/store/data/views/honkpage.html.i differ diff --git a/.hg/store/data/views/honkpage.js.i b/.hg/store/data/views/honkpage.js.i new file mode 100644 index 0000000..6a40118 Binary files /dev/null and b/.hg/store/data/views/honkpage.js.i differ diff --git a/.hg/store/data/views/icon.png.i b/.hg/store/data/views/icon.png.i new file mode 100644 index 0000000..e60bf2a Binary files /dev/null and b/.hg/store/data/views/icon.png.i differ diff --git a/.hg/store/data/views/login.html.i b/.hg/store/data/views/login.html.i new file mode 100644 index 0000000..4a390f5 Binary files /dev/null and b/.hg/store/data/views/login.html.i differ diff --git a/.hg/store/data/views/misc.js.i b/.hg/store/data/views/misc.js.i new file mode 100644 index 0000000..4e021fa Binary files /dev/null and b/.hg/store/data/views/misc.js.i differ diff --git a/.hg/store/data/views/msg.html.i b/.hg/store/data/views/msg.html.i new file mode 100644 index 0000000..e9dd385 Binary files /dev/null and b/.hg/store/data/views/msg.html.i differ diff --git a/.hg/store/data/views/onts.html.i b/.hg/store/data/views/onts.html.i new file mode 100644 index 0000000..d30e29f Binary files /dev/null and b/.hg/store/data/views/onts.html.i differ diff --git a/.hg/store/data/views/pleroma.css.i b/.hg/store/data/views/pleroma.css.i new file mode 100644 index 0000000..7c40be4 Binary files /dev/null and b/.hg/store/data/views/pleroma.css.i differ diff --git a/.hg/store/data/views/style.css.i b/.hg/store/data/views/style.css.i new file mode 100644 index 0000000..2d9369b Binary files /dev/null and b/.hg/store/data/views/style.css.i differ diff --git a/.hg/store/data/views/wonk.js.i b/.hg/store/data/views/wonk.js.i new file mode 100644 index 0000000..3555598 Binary files /dev/null and b/.hg/store/data/views/wonk.js.i differ diff --git a/.hg/store/data/views/xzone.html.i b/.hg/store/data/views/xzone.html.i new file mode 100644 index 0000000..fc0cd34 Binary files /dev/null and b/.hg/store/data/views/xzone.html.i differ diff --git a/.hg/store/data/views/zonkers.html.i b/.hg/store/data/views/zonkers.html.i new file mode 100644 index 0000000..6800e42 Binary files /dev/null and b/.hg/store/data/views/zonkers.html.i differ diff --git a/.hg/store/data/web.go.i b/.hg/store/data/web.go.i new file mode 100644 index 0000000..f8987d6 Binary files /dev/null and b/.hg/store/data/web.go.i differ diff --git a/.hg/store/data/zig.go.i b/.hg/store/data/zig.go.i new file mode 100644 index 0000000..796145d Binary files /dev/null and b/.hg/store/data/zig.go.i differ diff --git a/.hg/store/data/~2ehgignore.i b/.hg/store/data/~2ehgignore.i new file mode 100644 index 0000000..f92e69c Binary files /dev/null and b/.hg/store/data/~2ehgignore.i differ diff --git a/.hg/store/data/~2ehgtags.i b/.hg/store/data/~2ehgtags.i new file mode 100644 index 0000000..b694e99 Binary files /dev/null and b/.hg/store/data/~2ehgtags.i differ diff --git a/.hg/store/fncache b/.hg/store/fncache new file mode 100644 index 0000000..1f97101 --- /dev/null +++ b/.hg/store/fncache @@ -0,0 +1,97 @@ +data/backupdb.go.i +data/views/login.html.i +data/docs/spec.txt.i +data/docs/screenshot-compose.png.i +data/.hgtags.i +data/schema.sql.i +data/backend.go.i +data/docs/intro.1.i +data/import.go.i +data/web.go.i +data/cache.go.i +data/toys/saytheday.go.i +data/docs/changelog.txt.i +data/login.go.i +data/schema.go.i +data/hoot_test.go.i +data/toys/wonkawonk.go.i +data/activity.go.i +data/docs/mandoc.css.i +data/docs/manual.txt.i +data/views/honkform.html.i +data/docs/ping.txt.i +data/sensors.go.i +data/zig.go.i +data/docs/honk.3.i +data/docs/screenshot-afterpost.jpg.i +data/views/style.css.i +data/toys/Makefile.i +data/views/honkfrags.html.i +data/toys/fetch.go.i +data/views/header.html.i +data/markitzero_test.go.i +data/toys/youvegothonks.go.i +data/docs/security.txt.i +data/html.go.i +data/spec.txt.i +data/markitzero.go.i +data/unveil.go.i +data/deliverator.go.i +data/rss.go.i +data/views/about.html.i +data/docs/activitypub.7.i +data/views/misc.js.i +data/views/homepage.html.i +data/image.go.i +data/views/funzone.html.i +data/upgradedb.go.i +data/skulduggery.go.i +data/views/pleroma.css.i +data/views/honkpage.html.i +data/security.txt.i +data/docs/hfcs.1.i +data/hoot.go.i +data/fun_test.go.i +data/docs/screenshot-honk.png.i +data/docs/admin.txt.i +data/genschemago.sh.i +data/views/honk.html.i +data/docs/honk.1.i +data/go.sum.i +data/views/honkers.html.i +data/views/icon.png.i +data/log.go.i +data/toys/gettoken.go.i +data/bloat.go.i +data/views/msg.html.i +data/views/emus.html.i +data/views/xzone.html.i +data/hfcs.go.i +data/docs/vim.3.i +data/fun.go.i +data/views/hfcs.html.i +data/Makefile.i +data/toys/sprayandpray.go.i +data/views/zonkers.html.i +data/LICENSE.i +data/README.i +data/ping.txt.i +data/util.go.i +data/views/chatter.html.i +data/docs/honk.5.i +data/views/honkpage.js.i +data/go.mod.i +data/honk.go.i +data/docs/honk.8.i +data/avatar.go.i +data/views/onts.html.i +data/.hgignore.i +data/views/wonk.js.i +data/admin.go.i +data/toys/README.i +data/preflight.sh.i +data/views/account.html.i +data/views/combos.html.i +data/toys/autobonker.go.i +data/database.go.i +data/template.go.i diff --git a/.hg/store/phaseroots b/.hg/store/phaseroots new file mode 100644 index 0000000..e69de29 diff --git a/.hg/store/requires b/.hg/store/requires new file mode 100644 index 0000000..52fc616 --- /dev/null +++ b/.hg/store/requires @@ -0,0 +1,7 @@ +dotencode +fncache +generaldelta +revlog-compression-zstd +revlogv1 +sparserevlog +store diff --git a/.hg/store/undo b/.hg/store/undo new file mode 100644 index 0000000..879d670 Binary files /dev/null and b/.hg/store/undo differ diff --git a/.hg/store/undo.backupfiles b/.hg/store/undo.backupfiles new file mode 100644 index 0000000..ce173ce Binary files /dev/null and b/.hg/store/undo.backupfiles differ diff --git a/.hg/store/undo.phaseroots b/.hg/store/undo.phaseroots new file mode 100644 index 0000000..e69de29 diff --git a/.hg/undo.bookmarks b/.hg/undo.bookmarks new file mode 100644 index 0000000..e69de29 diff --git a/.hg/undo.branch b/.hg/undo.branch new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/.hg/undo.branch @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/.hg/undo.desc b/.hg/undo.desc new file mode 100644 index 0000000..74cf449 --- /dev/null +++ b/.hg/undo.desc @@ -0,0 +1,3 @@ +0 +pull +https://humungus.tedunangst.com/r/honk diff --git a/.hg/undo.dirstate b/.hg/undo.dirstate new file mode 100644 index 0000000..6459c29 Binary files /dev/null and b/.hg/undo.dirstate differ diff --git a/.hg/wcache/checkisexec b/.hg/wcache/checkisexec new file mode 100755 index 0000000..e69de29 diff --git a/.hg/wcache/checklink b/.hg/wcache/checklink new file mode 120000 index 0000000..326d735 --- /dev/null +++ b/.hg/wcache/checklink @@ -0,0 +1 @@ +checklink-target \ No newline at end of file diff --git a/.hg/wcache/checklink-target b/.hg/wcache/checklink-target new file mode 100644 index 0000000..e69de29 diff --git a/.hgignore b/.hgignore new file mode 100644 index 0000000..b5de9ba --- /dev/null +++ b/.hgignore @@ -0,0 +1,4 @@ +.*\.db +memes +emus +honk diff --git a/.hgtags b/.hgtags new file mode 100644 index 0000000..8b94a7b --- /dev/null +++ b/.hgtags @@ -0,0 +1,38 @@ +473c3dd6df6f1294362d9042ae5583a6e30d48c9 v0.1.0 +14d4623234ca623e9ae35a64d3f87c7d50e2b42f v0.1.1 +96d2e1dc6664d71ba67d896c32d8b50094305e0f v0.1.2 +a50adf10726dac300afeba9cfacb6db185157311 v0.2.0 +2c62e21731b375f81c57f00c709244ae8fc65d76 v0.2.1 +eba8ccf45b80e6f9523c55e55d937f10f9262cb1 v0.2.2 +4a5816b79e8787dea21c0addcd8ba62a4eaec318 v0.2.3 +7b38c7500ce067001c14b844eaf99f85887324da v0.2.4 +9e95200c9763966f3c8d13fd93771e3a68ac77aa v0.3.0 +12e113bb60481f2429ce053286e2e512520bd4ef v0.4.0 +e57c6026b9033af5649b31cce06b566206809367 v0.5.0 +57603c1049f68945c40e3c8e5c4486e367daade4 v0.6.0 +907c626de523fa2b055306a9385dfd569cf03f56 v0.7.0 +0baeee9aed87624499931ac5cf44f2ebdfd2ceb0 v0.7.1 +b1ec4c9c189d13d8c6dba0ab7e75e4533abebff2 v0.7.2 +efaae027527fad86cb584995305ee8dd2456a5d8 v0.7.3 +4f0ac04432d5cc18eaab139e8d3408219ca16ead v0.7.4 +65ea769c65bb0a5a9ae204537b5c1bff6261dec4 v0.7.5 +0f150eed70d5f92e69249f427b5bb921d8f0703e v0.7.6 +b2278292cce136cd9f5b7cd2ba7be04f887ab700 v0.7.7 +cc2ec3c8bf656f337919efddffd43634f1d9144c v0.8.0 +8e85621f4e62da9d6caf946ce65be90e6f49434e v0.8.1 +b140f7a3216b820aa13f982e45ff42781d7a8f4a v0.8.2 +b140f7a3216b820aa13f982e45ff42781d7a8f4a v0.8.2 +8a2a90379bf60d425fec114ff88f5fd9806a4965 v0.8.2 +808ef90260d5d81db1ec98fb8894588a3ac7b369 v0.8.3 +3ada67b721e7e4a478d0effacde14f36dc16e1de v0.8.4 +2e9969df06ddab8fa07999e91437dda28ec058ae v0.8.5 +3e41549dbc90f1d2ad246e4af72db9343021bc98 v0.8.6 +8e5c85fbcf02e61c9a2d12415f83d16f8afadba4 v0.9.0 +5218aee560879398288e009d8a426749bd172f40 v0.9.1 +a2f6f7bdfb6ea8cac68acdb952b2eed8a585749d v0.9.2 +dac64bc6a93cedeb6ae618cba8f8647af96d2ece v0.9.3 +28b92eaba37140a8a84a871d3f007b46fe66acb7 v0.9.4 +3ece33fb77800c027ecfd3b5100881732d68c9bb v0.9.5 +6a522536238fe25b6d048543f52ed406ccf720b2 v0.9.6 +bc1bcfb9c0cc86b3c63325b07e13a36b9d4500f0 v0.9.7 +916cefdc24363b6e7e193dbde82632c17f58adfd v0.9.8 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1fe2575 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +The license for honk and components is generally ISC or compatible. + +Individual source files are licensed per license at the top. + +Distributed components and dependenices in the vendor directory should have +compatible licenses. + +Files without explicit licenses and the conglomeration as a whole is subject +to the license below. + +// Copyright (c) 2019 Ted Unangst +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f1b5cfa --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ + +all: honk + +honk: .preflightcheck schema.sql *.go go.mod + go build -mod=`ls -d vendor 2> /dev/null` -o honk + +.preflightcheck: preflight.sh + @sh ./preflight.sh + +clean: + rm -f honk + +test: + go test diff --git a/README b/README new file mode 100644 index 0000000..8e32b20 --- /dev/null +++ b/README @@ -0,0 +1,72 @@ +honk + +-- features + +Take control of your honks and join the federation. +An ActivityPub server with minimal setup and support costs. +Spend more time using the software and less time operating it. + +No attention mining. +No likes, no faves, no polls, no stars, no claps, no counts. + +Purple color scheme. Custom emus. Memes too. +Avatars automatically assigned by the NSA. + +The button to submit a new honk says "it's gonna be honked". + +The honk mission is to work well if it's what you want. +This does not imply the goal is to be what you want. + +-- build + +It should be sufficient to type make after unpacking a release. +You'll need a go compiler version 1.16 or later. And libsqlite3. + +Even on a fast machine, building from source can take several seconds. + +Development sources: hg clone https://humungus.tedunangst.com/r/honk + +-- setup + +honk expects to be fronted by a TLS terminating reverse proxy. + +First, create the database. This will ask four questions. +./honk init +username: (the username you want) +password: (the password you want) +listenaddr: (tcp or unix: 127.0.0.1:31337, /var/www/honk.sock, etc.) +servername: (public DNS name: honk.example.com) + +Then run honk. +./honk + +-- upgrade + +old-honk backup `date +backup-%F` +./honk upgrade +./honk + +-- documentation + +There is a more complete incomplete manual. This is just the README. + +-- guidelines + +One honk per day, or call it an "eighth-tenth" honk. +If your honk frequency changes, so will the number of honks. + +The honk should be short, but not so short that you cannot identify it. + +The honk is an animal sign of respect and should be accompanied by a +friendly greeting or a nod. + +The honk should be done from a seat and in a safe area. + +It is considered rude to make noise in a place of business. + +The honk may be made on public property only when the person doing +the honk has the permission of the owner of that property. + +-- disclaimer + +Do not use honk to contact emergency services. diff --git a/activity.go b/activity.go new file mode 100644 index 0000000..9ecee37 --- /dev/null +++ b/activity.go @@ -0,0 +1,1980 @@ +// +// Copyright (c) 2019 Ted Unangst +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +package main + +import ( + "bytes" + "context" + "crypto/tls" + "database/sql" + "fmt" + "html" + "io" + notrand "math/rand" + "net/http" + "net/url" + "os" + "regexp" + "strings" + "time" + + "humungus.tedunangst.com/r/webs/cache" + "humungus.tedunangst.com/r/webs/gate" + "humungus.tedunangst.com/r/webs/httpsig" + "humungus.tedunangst.com/r/webs/junk" + "humungus.tedunangst.com/r/webs/templates" +) + +var theonetruename = `application/ld+json; profile="https://www.w3.org/ns/activitystreams"` +var thefakename = `application/activity+json` +var falsenames = []string{ + `application/ld+json`, + `application/activity+json`, +} +var itiswhatitis = "https://www.w3.org/ns/activitystreams" +var thewholeworld = "https://www.w3.org/ns/activitystreams#Public" + +var fastTimeout time.Duration = 5 +var slowTimeout time.Duration = 30 + +func friendorfoe(ct string) bool { + ct = strings.ToLower(ct) + for _, at := range falsenames { + if strings.HasPrefix(ct, at) { + return true + } + } + return false +} + +var develClient = &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + }, +} + +func PostJunk(keyname string, key httpsig.PrivateKey, url string, j junk.Junk) error { + return PostMsg(keyname, key, url, j.ToBytes()) +} + +func PostMsg(keyname string, key httpsig.PrivateKey, url string, msg []byte) error { + client := http.DefaultClient + if develMode { + client = develClient + } + req, err := http.NewRequest("POST", url, bytes.NewReader(msg)) + if err != nil { + return err + } + req.Header.Set("User-Agent", "honksnonk/5.0; "+serverName) + req.Header.Set("Content-Type", theonetruename) + httpsig.SignRequest(keyname, key, req, msg) + ctx, cancel := context.WithTimeout(context.Background(), 2*slowTimeout*time.Second) + defer cancel() + req = req.WithContext(ctx) + resp, err := client.Do(req) + if err != nil { + return err + } + resp.Body.Close() + switch resp.StatusCode { + case 200: + case 201: + case 202: + default: + return fmt.Errorf("http post status: %d", resp.StatusCode) + } + ilog.Printf("successful post: %s %d", url, resp.StatusCode) + return nil +} + +func GetJunk(userid int64, url string) (junk.Junk, error) { + return GetJunkTimeout(userid, url, slowTimeout*time.Second) +} + +func GetJunkFast(userid int64, url string) (junk.Junk, error) { + return GetJunkTimeout(userid, url, fastTimeout*time.Second) +} + +func GetJunkHardMode(userid int64, url string) (junk.Junk, error) { + j, err := GetJunk(userid, url) + if err != nil { + emsg := err.Error() + if emsg == "http get status: 502" || strings.Contains(emsg, "timeout") { + ilog.Printf("trying again after error: %s", emsg) + time.Sleep(time.Duration(60+notrand.Int63n(60)) * time.Second) + j, err = GetJunk(userid, url) + if err != nil { + ilog.Printf("still couldn't get it") + } else { + ilog.Printf("retry success!") + } + } + } + return j, err +} + +var flightdeck = gate.NewSerializer() + +var signGets = true + +func junkGet(userid int64, url string, args junk.GetArgs) (junk.Junk, error) { + client := http.DefaultClient + if args.Client != nil { + client = args.Client + } + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return nil, err + } + if args.Accept != "" { + req.Header.Set("Accept", args.Accept) + } + if args.Agent != "" { + req.Header.Set("User-Agent", args.Agent) + } + if signGets { + var ki *KeyInfo + ok := ziggies.Get(userid, &ki) + if ok { + httpsig.SignRequest(ki.keyname, ki.seckey, req, nil) + } + } + if args.Timeout != 0 { + ctx, cancel := context.WithTimeout(context.Background(), args.Timeout) + defer cancel() + req = req.WithContext(ctx) + } + resp, err := client.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != 200 { + return nil, fmt.Errorf("http get status: %d", resp.StatusCode) + } + return junk.Read(resp.Body) +} + +func GetJunkTimeout(userid int64, url string, timeout time.Duration) (junk.Junk, error) { + client := http.DefaultClient + if develMode { + client = develClient + } + fn := func() (interface{}, error) { + at := thefakename + if strings.Contains(url, ".well-known/webfinger?resource") { + at = "application/jrd+json" + } + j, err := junkGet(userid, url, junk.GetArgs{ + Accept: at, + Agent: "honksnonk/5.0; " + serverName, + Timeout: timeout, + Client: client, + }) + return j, err + } + + ji, err := flightdeck.Call(url, fn) + if err != nil { + return nil, err + } + j := ji.(junk.Junk) + return j, nil +} + +func fetchsome(url string) ([]byte, error) { + client := http.DefaultClient + if develMode { + client = develClient + } + req, err := http.NewRequest("GET", url, nil) + if err != nil { + ilog.Printf("error fetching %s: %s", url, err) + return nil, err + } + req.Header.Set("User-Agent", "honksnonk/5.0; "+serverName) + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute) + defer cancel() + req = req.WithContext(ctx) + resp, err := client.Do(req) + if err != nil { + ilog.Printf("error fetching %s: %s", url, err) + return nil, err + } + defer resp.Body.Close() + switch resp.StatusCode { + case 200: + case 201: + case 202: + default: + return nil, fmt.Errorf("http get not 200: %d %s", resp.StatusCode, url) + } + var buf bytes.Buffer + limiter := io.LimitReader(resp.Body, 10*1024*1024) + io.Copy(&buf, limiter) + return buf.Bytes(), nil +} + +func savedonk(url string, name, desc, media string, localize bool) *Donk { + if url == "" { + return nil + } + if donk := finddonk(url); donk != nil { + return donk + } + ilog.Printf("saving donk: %s", url) + data := []byte{} + if localize { + fn := func() (interface{}, error) { + return fetchsome(url) + } + ii, err := flightdeck.Call(url, fn) + if err != nil { + ilog.Printf("error fetching donk: %s", err) + localize = false + goto saveit + } + data = ii.([]byte) + + if len(data) == 10*1024*1024 { + ilog.Printf("truncation likely") + } + if strings.HasPrefix(media, "image") { + img, err := shrinkit(data) + if err != nil { + ilog.Printf("unable to decode image: %s", err) + localize = false + data = []byte{} + goto saveit + } + data = img.Data + media = "image/" + img.Format + } else if media == "application/pdf" { + if len(data) > 1000000 { + ilog.Printf("not saving large pdf") + localize = false + data = []byte{} + } + } else if len(data) > 100000 { + ilog.Printf("not saving large attachment") + localize = false + data = []byte{} + } + } +saveit: + fileid, err := savefile(name, desc, url, media, localize, data) + if err != nil { + elog.Printf("error saving file %s: %s", url, err) + return nil + } + donk := new(Donk) + donk.FileID = fileid + return donk +} + +func iszonked(userid int64, xid string) bool { + var id int64 + row := stmtFindZonk.QueryRow(userid, xid) + err := row.Scan(&id) + if err == nil { + return true + } + if err != sql.ErrNoRows { + ilog.Printf("error querying zonk: %s", err) + } + return false +} + +func needxonk(user *WhatAbout, x *Honk) bool { + if rejectxonk(x) { + return false + } + return needxonkid(user, x.XID) +} +func needbonkid(user *WhatAbout, xid string) bool { + return needxonkidX(user, xid, true) +} +func needxonkid(user *WhatAbout, xid string) bool { + return needxonkidX(user, xid, false) +} +func needxonkidX(user *WhatAbout, xid string, isannounce bool) bool { + if !strings.HasPrefix(xid, "https://") { + return false + } + if strings.HasPrefix(xid, user.URL+"/") { + return false + } + if rejectorigin(user.ID, xid, isannounce) { + ilog.Printf("rejecting origin: %s", xid) + return false + } + if iszonked(user.ID, xid) { + ilog.Printf("already zonked: %s", xid) + return false + } + var id int64 + row := stmtFindXonk.QueryRow(user.ID, xid) + err := row.Scan(&id) + if err == nil { + return false + } + if err != sql.ErrNoRows { + ilog.Printf("error querying xonk: %s", err) + } + return true +} + +func eradicatexonk(userid int64, xid string) { + xonk := getxonk(userid, xid) + if xonk != nil { + deletehonk(xonk.ID) + } + _, err := stmtSaveZonker.Exec(userid, xid, "zonk") + if err != nil { + elog.Printf("error eradicating: %s", err) + } +} + +func savexonk(x *Honk) { + ilog.Printf("saving xonk: %s", x.XID) + go handles(x.Honker) + go handles(x.Oonker) + savehonk(x) +} + +type Box struct { + In string + Out string + Shared string +} + +var boxofboxes = cache.New(cache.Options{Filler: func(ident string) (*Box, bool) { + var info string + row := stmtGetXonker.QueryRow(ident, "boxes") + err := row.Scan(&info) + if err != nil { + dlog.Printf("need to get boxes for %s", ident) + var j junk.Junk + j, err = GetJunk(readyLuserOne, ident) + if err != nil { + dlog.Printf("error getting boxes: %s", err) + return nil, false + } + allinjest(originate(ident), j) + row = stmtGetXonker.QueryRow(ident, "boxes") + err = row.Scan(&info) + } + if err == nil { + m := strings.Split(info, " ") + b := &Box{In: m[0], Out: m[1], Shared: m[2]} + return b, true + } + return nil, false +}}) + +func gimmexonks(user *WhatAbout, outbox string) { + dlog.Printf("getting outbox: %s", outbox) + j, err := GetJunk(user.ID, outbox) + if err != nil { + ilog.Printf("error getting outbox: %s", err) + return + } + t, _ := j.GetString("type") + origin := originate(outbox) + if t == "OrderedCollection" { + items, _ := j.GetArray("orderedItems") + if items == nil { + items, _ = j.GetArray("items") + } + if items == nil { + obj, ok := j.GetMap("first") + if ok { + items, _ = obj.GetArray("orderedItems") + } else { + page1, ok := j.GetString("first") + if ok { + j, err = GetJunk(user.ID, page1) + if err != nil { + ilog.Printf("error getting page1: %s", err) + return + } + items, _ = j.GetArray("orderedItems") + } + } + } + if len(items) > 20 { + items = items[0:20] + } + for i, j := 0, len(items)-1; i < j; i, j = i+1, j-1 { + items[i], items[j] = items[j], items[i] + } + for _, item := range items { + obj, ok := item.(junk.Junk) + if ok { + xonksaver(user, obj, origin) + continue + } + xid, ok := item.(string) + if ok { + if !needxonkid(user, xid) { + continue + } + obj, err = GetJunk(user.ID, xid) + if err != nil { + ilog.Printf("error getting item: %s", err) + continue + } + xonksaver(user, obj, originate(xid)) + } + } + } +} + +func newphone(a []string, obj junk.Junk) []string { + for _, addr := range []string{"to", "cc", "attributedTo"} { + who, _ := obj.GetString(addr) + if who != "" { + a = append(a, who) + } + whos, _ := obj.GetArray(addr) + for _, w := range whos { + who, _ := w.(string) + if who != "" { + a = append(a, who) + } + } + } + return a +} + +func extractattrto(obj junk.Junk) string { + who, _ := obj.GetString("attributedTo") + if who != "" { + return who + } + o, ok := obj.GetMap("attributedTo") + if ok { + id, ok := o.GetString("id") + if ok { + return id + } + } + arr, _ := obj.GetArray("attributedTo") + for _, a := range arr { + o, ok := a.(junk.Junk) + if ok { + t, _ := o.GetString("type") + id, _ := o.GetString("id") + if t == "Person" || t == "" { + return id + } + } + s, ok := a.(string) + if ok { + return s + } + } + return "" +} + +func firstofmany(obj junk.Junk, key string) string { + if val, _ := obj.GetString(key); val != "" { + return val + } + if arr, _ := obj.GetArray(key); len(arr) > 0 { + val, ok := arr[0].(string) + if ok { + return val + } + } + return "" +} + +var re_mast0link = regexp.MustCompile(`https://[[:alnum:].]+/users/[[:alnum:]]+/statuses/[[:digit:]]+`) +var re_masto1ink = regexp.MustCompile(`https://[[:alnum:].]+/@[[:alnum:]]+/[[:digit:]]+`) +var re_misslink = regexp.MustCompile(`https://[[:alnum:].]+/notes/[[:alnum:]]+`) +var re_honklink = regexp.MustCompile(`https://[[:alnum:].]+/u/[[:alnum:]]+/h/[[:alnum:]]+`) +var re_romalink = regexp.MustCompile(`https://[[:alnum:].]+/objects/[[:alnum:]-]+`) +var re_qtlinks = regexp.MustCompile(`>https://[^\s<]+<`) + +func qutify(user *WhatAbout, content string) string { + // well this is gross + malcontent := strings.ReplaceAll(content, ``, "") + malcontent = strings.ReplaceAll(malcontent, `