1
0
forked from iarv/nntpchan

2179 Commits
0.2 ... master

Author SHA1 Message Date
tomoko-dev
fafcff9f58 Merge pull request #190 from cargoedit/master
chore: remove unused min/max func
2025-10-10 13:51:07 -04:00
cargoedit
50cb850273 chore: remove unused min/max func
Signed-off-by: cargoedit <cargoedit@outlook.com>
2025-09-25 17:22:41 +08:00
tomoko-dev
54b605329a Update README.md 2025-08-14 18:05:10 -04:00
tomoko-dev
6942dad3aa Update README.md
small thing added
2025-08-14 18:02:36 -04:00
tomoko-dev
99aeef0156 Merge pull request #188 from growfrow/master
chore: remove redundant words in comment
2025-03-16 19:09:59 -04:00
growfrow
1d44337dfd chore: remove redundant words in comment
Signed-off-by: growfrow <growfrow@outlook.com>
2025-03-17 00:48:27 +08:00
konamicode
ed15a54980 Update README.md 2025-03-06 21:16:25 -05:00
konamicode
c3e3113615 Update README.md 2025-03-06 21:15:53 -05:00
konamicode
bfc138bd9a Update README.md 2025-03-06 21:14:26 -05:00
konamicode
906e8783f3 Update README.md 2025-03-06 21:06:05 -05:00
konamicode
21c932cbeb Update README.md 2025-03-06 21:05:14 -05:00
konamicode
52d74995f5 Update Makefile 2025-03-06 21:01:53 -05:00
konamicode
387e57f54e Update Makefile
updating one more time
2025-03-06 19:59:47 -05:00
konamicode
fd8c1124f9 Update README.md 2025-03-06 19:24:40 -05:00
konamicode
f0d2cc0b02 Update Makefile
updated make file so golang version can work on older versions
2025-03-06 19:02:03 -05:00
konamicode
67faa7794d Add files via upload 2025-01-28 22:02:27 -05:00
konamicode
28e18703e5 Update frontpage.mustache 2025-01-28 22:01:20 -05:00
konamicode
ab795ba1ee Create 404chan.css 2025-01-28 21:59:58 -05:00
konamicode
8903661383 Update 404.mustache 2025-01-28 21:59:05 -05:00
konamicode
fa3b68c708 Update krane.css 2025-01-26 23:16:22 -05:00
konamicode
b7e43d3725 Update README.md 2025-01-25 23:12:50 -05:00
konamicode
e0469e8c7f Update README.md 2025-01-25 23:10:28 -05:00
konamicode
cba6de85af Update README.md 2025-01-25 23:08:35 -05:00
konamicode
d4a41db15f Update README.md 2025-01-25 23:07:39 -05:00
konamicode
5bbcfc8bef Update README.md 2025-01-25 23:06:56 -05:00
nesshy
a2cf5a419b Update frontpage.mustache
frontpage updated :-D
2025-01-25 14:03:30 -05:00
nesshy
aeee8a7e92 Update README.md 2025-01-21 22:14:20 -05:00
nesshy
922ebd727b Update frontpage.mustache 2025-01-21 20:51:48 -05:00
nesshy
e7f01ca35c Update README.md 2025-01-21 15:07:49 -05:00
nesshy
53acf0adf6 Create nntpchan.js
added javascript
2025-01-21 12:33:29 -05:00
nesshy
da10557324 Update README.md 2025-01-21 12:29:50 -05:00
nesshy
c3dec20a57 Update README.md
updated readme
2025-01-21 12:28:25 -05:00
nesshy
a8cd2a2c47 Update Makefile
updated makefile
2025-01-21 12:24:57 -05:00
jeff
306bfbaf50 Merge pull request #187 from nesshy9/patch-1
Update Makefile
2024-10-25 19:03:39 -04:00
nesshy
38f12d18aa Update Makefile
updated makefile
2024-10-25 15:06:08 -07:00
Jeff Becker
f92f68c3cd close connection 2020-03-07 09:07:23 -05:00
Jeff Becker
77fe66c330 log tls error 2020-03-07 09:05:21 -05:00
Jeff Becker
ff8c3e915a get rootiest post 2020-03-07 08:27:45 -05:00
Jeff Becker
2f5f84da4b Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2020-02-10 17:30:17 -05:00
Jeff Becker
477acabd19 current year 2020-02-10 17:30:06 -05:00
jeff
e2cbffea30 meh 2019-09-16 07:00:50 -04:00
jeff
0261f26043 fix style 2019-09-16 06:57:41 -04:00
jeff
5381c7b2a4 hide stuff 2019-09-16 06:53:53 -04:00
jeff
015c64139d fix mod action js 2019-09-16 06:51:11 -04:00
Jeff
4b08919f75 don't give out banned newsgroups in list 2019-08-31 15:17:54 -04:00
Jeff
15ccb7ad50 only force overchan prefix if no . is present 2019-08-31 07:56:07 -04:00
Jeff
12709d364b catch case 2019-08-30 18:54:00 -04:00
Jeff
34ce6f805a Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-05-15 07:12:19 -04:00
Jeff
40a5e9be3f don't always use lowercase 2019-05-15 07:12:00 -04:00
Jeff
8f39dec91b Update building.md 2019-04-07 08:52:49 -04:00
Jeff
afb98efb2a Merge pull request #177 from cathugger/master
srnd: saner default max message size
2019-04-06 15:13:41 -04:00
cathugger
d8f888dffa srnd: saner default max message size 2019-04-06 20:36:54 +03:00
Jeff Becker
a207f1aaea Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-04-04 07:25:45 -04:00
Jeff Becker
558dacac79 off 2019-04-04 07:25:38 -04:00
Jeff
f5d68e17f1 Merge pull request #176 from cathugger/master
srnd: change unicode tripcode rune range
2019-03-29 17:33:16 -04:00
cathugger
c8e3faa4c6 srnd: change unicode tripcode rune range 2019-03-29 23:13:32 +02:00
Jeff Becker
43ce4490ed fix crash 2019-03-03 12:55:54 -05:00
Jeff Becker
3f8c583791 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-03-03 12:51:35 -05:00
Jeff Becker
b4d2de6ec8 add limit to search 2019-03-03 12:51:25 -05:00
Jeff
0972f86714 more 2019-03-02 15:17:47 -05:00
Jeff
ab6fe44e8d more 2019-03-02 15:15:00 -05:00
Jeff
bf43469a89 more 2019-03-02 15:13:24 -05:00
Jeff Becker
41682f1712 more 2019-03-02 11:29:45 -05:00
Jeff Becker
0176b7f038 more 2019-03-02 11:28:48 -05:00
Jeff Becker
3807561ca1 more 2019-03-02 11:27:25 -05:00
Jeff Becker
cbc8528f4c more 2019-03-02 11:26:24 -05:00
Jeff Becker
97fccd342f more 2019-03-02 11:24:22 -05:00
Jeff Becker
118f7f4ee0 mroe 2019-03-02 11:22:59 -05:00
Jeff Becker
686cfb7831 more 2019-03-02 11:20:48 -05:00
Jeff Becker
d051ac77f7 more 2019-03-02 11:19:14 -05:00
Jeff Becker
4ae08d2c11 fix 2019-03-02 11:17:15 -05:00
Jeff Becker
794e2350cd meh 2019-03-02 11:13:26 -05:00
Jeff Becker
1d0f501968 fix 2019-03-02 11:11:37 -05:00
Jeff Becker
0252dfa512 add option to fetch referenced uri 2019-03-02 11:10:05 -05:00
Jeff Becker
8ef4322fba css fix 2019-03-02 10:25:06 -05:00
Jeff Becker
1b03dce124 update placebo theem 2019-03-02 10:24:18 -05:00
Jeff Becker
6807aaee3d fix stuff and add uri in post form 2019-03-02 10:21:45 -05:00
Jeff Becker
a00630a6b3 wut 2019-02-19 08:52:51 -05:00
Jeff Becker
9d43d84926 try fixing captcha 2019-02-19 08:45:10 -05:00
Jeff Becker
c1afacda17 more css 2019-02-16 06:41:10 -05:00
Jeff Becker
df93bf3f4b tweak css 2019-02-16 06:38:04 -05:00
Jeff Becker
88b869c4c8 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-02-15 07:19:38 -05:00
Jeff Becker
fedc284478 update docs 2019-02-15 07:19:29 -05:00
Jeff
f664bc6a9b fix og title on thread 2019-02-13 16:16:11 -05:00
Jeff Becker
af13a99954 remove uneeded rule 2019-02-13 12:15:45 -05:00
Jeff Becker
8f7d57f64d fix 2019-02-13 08:37:04 -05:00
Jeff Becker
e13dcf9e20 don't use bad locale 2019-02-13 08:34:54 -05:00
Jeff Becker
74ca4caca5 muck about 2019-02-13 08:29:55 -05:00
Jeff Becker
7e1a6cc8f5 disable functionality 2019-02-11 08:02:27 -05:00
Jeff Becker
04fc996c2d update style 2019-02-10 14:35:14 -05:00
Jeff Becker
8cad631e73 update templates 2019-02-10 14:33:06 -05:00
Jeff Becker
679382c7f5 meh 2019-02-10 14:31:57 -05:00
Jeff Becker
acb0b350e0 meh 2019-02-10 14:31:17 -05:00
Jeff Becker
de14087362 more 2019-02-10 14:30:11 -05:00
Jeff Becker
02e8089668 fug 2019-02-10 14:29:32 -05:00
Jeff Becker
fe68932c7b fug 2019-02-10 14:28:25 -05:00
Jeff Becker
54b8df91d4 tpyo 2019-02-10 14:27:45 -05:00
Jeff Becker
80bf47eec4 add more crap for mods 2019-02-10 14:25:51 -05:00
Jeff Becker
67e0f259b6 add reveal secrets in mod stream 2019-02-10 14:11:04 -05:00
Jeff Becker
59068bb961 eh 2019-01-29 06:57:08 -05:00
Jeff Becker
bcddab9af6 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2019-01-29 06:50:38 -05:00
Jeff
31b6f814d4 more 2019-01-28 13:39:03 -05:00
Jeff
1a18d20a1a try fixing race 2019-01-28 12:03:52 -05:00
Jeff Becker
25cb6b7d3f bump version 2019-01-27 09:54:11 -05:00
Jeff
29e6d12967 Merge pull request #175 from cathugger/master
srnd: use some of headers from outer message
2019-01-27 09:20:53 -05:00
cathugger
8fd1f4a30f srnd: use some of headers from outer message 2019-01-27 14:43:17 +02:00
Jeff
e230c75c9b Merge pull request #174 from cathugger/master
srnd: message/rfc822 doesn't have charset parameter
2019-01-26 11:13:23 -05:00
cathugger
a8695c5caf srnd: message/rfc822 doesn't have charset parameter 2019-01-26 15:08:12 +02:00
Jeff
35122e6459 Merge pull request #173 from cathugger/master
srnd: use all bits of blake2b for signature
2019-01-25 13:54:30 -05:00
cathugger
b61741fdda srnd: use all bits of blake2b for signature 2019-01-25 20:43:12 +02:00
Jeff
7b64d2eeae Merge pull request #172 from cathugger/master
srnd: use text/plain as default type
2018-12-23 06:47:55 -05:00
cathugger
fb0c600e3a srnd: use text/plain as default type
otherwise it fails to parse valid messages
2018-12-23 08:35:22 +02:00
Jeff Becker
ef4d45a148 more 2018-12-21 08:43:07 -05:00
Jeff Becker
966c999d68 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-12-21 08:39:20 -05:00
Jeff Becker
ae9a96a35f fix problems in varnish invalidation maybe 2018-12-21 08:39:01 -05:00
Jeff
e2ac75fee6 Merge pull request #171 from cathugger/master
use correct header, reserve some msgids, tweaks
2018-12-14 19:11:45 -05:00
cathugger
b54e1d84da use correct header, reserve some msgids, tweaks 2018-12-15 02:05:00 +02:00
Jeff
34be78da8a Merge pull request #170 from cathugger/master
srnd: avoid quoting name in some cases
2018-12-12 14:02:01 -05:00
cathugger
af161968c8 srnd: avoid quoting in some cases 2018-12-12 20:56:48 +02:00
Jeff
a1d11c594c Merge pull request #169 from cathugger/master
srnd: custom email address formatter, some tweaks
2018-12-12 11:49:50 -05:00
cathugger
40e4ae1fc4 srnd: custom email address formatter, some tweaks
This adds custom email address formatter, which, unlike stdlib one, doesn't needlessly quote names.
Quoted names can be a bit of issue with older nodes which parse addresses in simpler way, and end up not removing quote characters.
This also ensures that newlines cannot be inserted in in From and Subject headers, which effectively allowed insertion of new headers in message being posted, and generating invalid messages.
2018-12-12 18:38:58 +02:00
Jeff
2ac773cc64 Merge pull request #168 from cathugger/master
fix From things, other unrelated tweaks
2018-12-11 19:08:35 -05:00
cathugger
7e6f143108 generate compliant From headers, more tolerance to non-compliant From headers, other fixups 2018-12-11 22:57:42 +00:00
Jeff
0994940ae3 Merge pull request #167 from cathugger/master
srnd: ensure clean XOVER output
2018-12-09 15:02:37 -05:00
cathugger
fa511c275e srnd: ensure clean XOVER output 2018-12-09 19:50:27 +00:00
Jeff
7e56a9b9f5 Merge pull request #166 from cathugger/master
srnd: fix multipart message parsing
2018-12-08 16:02:38 -05:00
cathugger
b5ff2dc4a2 srnd: fix multipart message parsing 2018-12-08 21:00:13 +00:00
Jeff
1517941b29 Merge pull request #165 from cathugger/master
srnd: error while reading message isn't valid thing
2018-12-08 15:05:08 -05:00
cathugger
2d62a3bc7f srnd: error while reading message isn't valid thing 2018-12-08 19:44:56 +00:00
Jeff Becker
3b492579b8 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-12-07 08:51:34 -05:00
Jeff Becker
89d4794871 make it work without frontend 2018-12-07 08:50:40 -05:00
Jeff
22eb29c8ee Merge pull request #163 from cathugger/master
srnd: properly parse email addresses
2018-12-03 09:10:48 -05:00
cathugger
740bf82a1e srnd: properly parse email addresses
this replaces faulty address parsing code with calls to stdlib' email parser and some reasonable fallbacks.
note that nntpArticle.Email() function was completely incorrect, but it's not used anywhere in code, apparently.
2018-12-03 14:54:08 +02:00
Jeff Becker
05ebac9aa5 update vendored lib 2018-11-28 17:55:31 -05:00
Jeff Becker
a9f8bf2f8c remove fully 2018-11-27 10:57:24 -05:00
Jeff Becker
28e8e95207 add mod command 2018-11-27 10:50:08 -05:00
Jeff Becker
0e6e2093e4 add remove command for mod 2018-11-27 10:45:21 -05:00
Jeff Becker
053708a9cb Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-11-27 10:25:16 -05:00
Jeff Becker
4d4aea61fe try fixing issues #161 and #162 2018-11-27 10:24:27 -05:00
Jeff
7dd2228956 Merge pull request #160 from cathugger/master
srnd: more lax Message-ID check
2018-11-27 06:49:20 -05:00
cathugger
2d3c304c81 srnd: more lax Message-ID check
This axes out literally insane overly restrictive regex-based
Message-ID check and replaces it with clean and simple conditions
specified in RFC 3977.
Old check wasn't compliant with any email or netnews internet
standard I know of, and was causing propagation issues.
Even old RFC 822 (email) and RFC 850 (usenet) specifications
don't have so restrictive specifications.
2018-11-27 06:27:05 +02:00
Jeff
be7eec855a Merge pull request #159 from cathugger/master
fix ARTICLE not returning any error
2018-11-25 13:08:22 -05:00
cathugger
91e758c834 fix ARTICLE not returning any error
Yes, I'm aware it sometimes may still return wrong code.
2018-11-25 20:01:33 +02:00
Jeff
3fb9140a07 fix style 2018-11-25 08:51:05 -05:00
Jeff
9f18416f08 update template 2018-11-25 08:49:54 -05:00
Jeff
6694c23859 better query 2018-11-25 08:47:40 -05:00
Jeff
fbc53d1e81 fix last commit 2018-11-25 07:12:26 -05:00
Jeff
76f9d84fa0 add new route for board list 2018-11-25 07:09:34 -05:00
Jeff
d1c392ce29 Revert "fix watermark stuff"
This reverts commit 23c357eaac.
2018-11-24 17:51:59 -05:00
Jeff
cbd7d30e8d include more for previous commit 2018-11-24 17:48:30 -05:00
Jeff
613ae771c1 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-11-24 17:24:21 -05:00
Jeff
23c357eaac fix watermark stuff 2018-11-24 17:23:00 -05:00
Jeff Becker
795fcbe37c disable spamtell for now 2018-11-06 16:47:56 -05:00
Jeff Becker
ad07b95d96 no 2018-11-06 16:34:55 -05:00
Jeff Becker
c89c06e15d fix 2018-11-06 16:25:01 -05:00
Jeff Becker
57f431ffd2 more 2018-11-06 16:09:46 -05:00
Jeff Becker
2265b4b2ae more 2018-11-06 16:03:44 -05:00
Jeff Becker
515f42c664 eh 2018-11-06 15:58:21 -05:00
Jeff Becker
5c4eb739d6 what 2018-11-06 15:50:08 -05:00
Jeff Becker
c010b3f2c5 more 2018-11-06 15:44:57 -05:00
Jeff Becker
57552f53e4 actually use spamd 2018-11-06 15:41:15 -05:00
Jeff Becker
955efe33a1 fug 2018-11-06 15:29:06 -05:00
Jeff Becker
0e72397956 more js crap 2018-11-06 15:28:02 -05:00
Jeff Becker
cc4cee1322 typofix 2018-11-06 15:22:11 -05:00
Jeff Becker
5b8326745c fix build 2018-11-06 15:15:51 -05:00
Jeff Becker
95448d82f0 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-11-06 15:06:14 -05:00
Jeff Becker
196acdb134 initial spam ui 2018-11-06 15:05:59 -05:00
Jeff
142c40889b make it compile 2018-10-27 07:00:58 -04:00
Jeff
9cecd94fc2 tell about banned articles when handling ARTICLE 2018-10-27 06:59:23 -04:00
Jeff Becker
0ae8107138 fix placement 2018-10-26 07:39:19 -04:00
Jeff Becker
97a1aba125 fix message 2018-10-26 07:36:59 -04:00
Jeff Becker
2a4b5d768a i hate js 2018-10-26 07:36:27 -04:00
Jeff Becker
8349cdb74b fix up logic 2018-10-26 07:34:32 -04:00
Jeff Becker
f1adf381ce fix typo 2018-10-26 07:32:17 -04:00
Jeff Becker
5c09be1a6d fix placement 2018-10-26 07:30:20 -04:00
Jeff Becker
a6b15674c6 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-10-26 07:28:33 -04:00
Jeff Becker
e72a37f928 add js delete function 2018-10-26 07:28:24 -04:00
Jeff
0c77218b70 404 instead of redirect 2018-10-20 11:37:13 -04:00
Jeff
b4de45569e don't fallback to english to prevent cache layer DoS 2018-10-20 11:24:30 -04:00
Jeff
644f8da3f4 update css 2018-10-20 10:27:24 -04:00
Jeff
7f42443cce update css 2018-10-20 10:26:12 -04:00
Jeff Becker
91ced83c3a Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-09-02 07:17:25 -04:00
Jeff Becker
56c7c5bf21 default to bind nntp on all interfaces 2018-09-02 07:16:59 -04:00
Jeff
468320706c fix typo 2018-08-25 15:49:41 -04:00
Jeff
4a02015f8e og attachments 2018-08-25 15:47:22 -04:00
Jeff
648889e3c5 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-08-25 15:45:01 -04:00
Jeff
df450e31ca add brief text to opengraph description 2018-08-25 15:44:37 -04:00
Jeff Becker
6e4514fed4 update templates 2018-08-15 17:32:47 -04:00
Jeff Becker
880096ea47 again 2018-08-15 13:51:24 -04:00
Jeff Becker
4cb037cbf4 update again 2018-08-15 13:50:42 -04:00
Jeff Becker
15af182415 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-08-15 13:46:03 -04:00
Jeff Becker
0ef0a1ee6a update admin image 2018-08-15 13:45:52 -04:00
Jeff
92b2550865 fix templates 2018-08-05 10:05:42 +10:00
Jeff
eeac199b1e more sfw fixes 2018-08-05 10:02:30 +10:00
Jeff
c34bed4d85 fix temlate 2018-08-05 09:52:23 +10:00
Jeff
9129dcd916 update templates 2018-08-05 09:49:05 +10:00
Jeff
c896ac31c5 make it compile 2018-08-05 09:47:21 +10:00
Jeff
dba84638c9 sfw url stuff 2018-08-05 09:45:28 +10:00
Jeff
695956f9bd Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-08-05 09:37:01 +10:00
Jeff
8b7b894eb3 add sfw mode, first try 2018-08-05 09:35:47 +10:00
Jeff Becker
ec714e03de try again 2018-06-24 08:19:39 -04:00
Jeff Becker
03e577d04d try supporting ubuntu trusty's postgres version 2018-06-24 08:18:16 -04:00
Jeff Becker
e78e52debb Revert "add check for short posts"
This reverts commit d5e0f7d698.
2018-06-16 18:08:14 -04:00
Jeff
c1fd82bab5 more 2018-06-05 13:58:45 -04:00
Jeff
d5e0f7d698 add check for short posts 2018-06-05 13:34:36 -04:00
Jeff
5ea16f369a fix hover 2018-05-16 19:50:02 -04:00
Jeff
9ebc76e4e8 cite hover 2018-05-16 19:39:14 -04:00
Jeff Becker
6a69c81e79 ensure skiplist entry 2018-05-06 12:35:03 -04:00
Jeff Becker
7a7432f2b5 fix error message 2018-05-06 11:20:43 -04:00
Jeff Becker
d58ab2f034 correct includes 2018-05-06 11:15:55 -04:00
Jeff Becker
7468a6ed35 freebsd support 2018-05-06 11:15:33 -04:00
Jeff Becker
1077f0935e freebsd support 2018-05-06 11:15:01 -04:00
Jeff Becker
852a847c58 more 2018-05-06 11:06:40 -04:00
Jeff Becker
fd1c4ccb12 write correct amount 2018-05-06 11:03:53 -04:00
Jeff Becker
e5c8ea84d0 debug 2018-05-06 11:01:31 -04:00
Jeff Becker
1212ae09f4 debug 2018-05-06 11:01:04 -04:00
Jeff Becker
28c4e9a22d debug 2018-05-06 11:00:17 -04:00
Jeff Becker
8c4edf27a0 fug 2018-05-06 10:46:22 -04:00
Jeff Becker
ce2ffc1927 fix!!!!! 2018-05-06 10:45:58 -04:00
Jeff Becker
fe409fe586 fix!!!!! 2018-05-06 10:45:40 -04:00
Jeff Becker
1530a0aae5 fix?! 2018-05-06 10:41:11 -04:00
Jeff Becker
a267c9ac35 fix? 2018-05-06 10:36:26 -04:00
Jeff Becker
6366f626f3 fix? 2018-05-06 10:30:06 -04:00
Jeff Becker
b1f88783a6 fix 2018-05-06 10:29:21 -04:00
Jeff Becker
ddb8be8386 fix? 2018-05-06 10:28:30 -04:00
Jeff Becker
a674394fa2 fix up makefile 2018-05-06 10:27:55 -04:00
Jeff Becker
e78bd50ef1 fix 2018-05-06 10:23:41 -04:00
Jeff Becker
3b8fd51e53 pass in environment 2018-05-06 10:21:58 -04:00
Jeff Becker
720aeee7ee more 2018-05-06 10:14:52 -04:00
Jeff Becker
a42c8abded more 2018-05-06 10:14:08 -04:00
Jeff Becker
ebe1f96cc5 remove libuv header 2018-05-06 10:12:31 -04:00
Jeff Becker
4244345eff more 2018-05-06 09:53:03 -04:00
Jeff Becker
657b285375 more 2018-05-06 09:49:29 -04:00
Jeff Becker
b75afcb4f4 more 2018-05-06 09:46:45 -04:00
Jeff Becker
ee770c8ca0 fix 2018-05-06 09:43:29 -04:00
Jeff Becker
ac91e309d9 remove mustache 2018-05-06 09:42:31 -04:00
Jeff Becker
8263a92432 fix 2018-05-06 09:01:17 -04:00
Jeff Becker
8604129164 fix 2018-05-06 09:00:14 -04:00
Jeff Becker
f33ee270d5 fix 2018-05-06 08:59:53 -04:00
Jeff Becker
e01fbacf7c fix 2018-05-06 08:59:03 -04:00
Jeff Becker
8f40d7842a fix 2018-05-06 08:57:54 -04:00
Jeff Becker
60de45415c more includes and typofixes 2018-05-06 08:56:20 -04:00
Jeff Becker
d370df06e8 correct function return value 2018-05-06 08:53:41 -04:00
Jeff Becker
28dbe8009d more typo fixes 2018-05-06 08:52:37 -04:00
Jeff Becker
3861e5176d typofix 2018-05-06 08:51:39 -04:00
Jeff Becker
9711298cae correct include 2018-05-06 08:50:23 -04:00
Jeff Becker
5f2aef5fd2 use std::size_t 2018-05-06 08:49:48 -04:00
Jeff Becker
035d4f5406 add include 2018-05-06 08:49:23 -04:00
Jeff Becker
3996250ee9 correct define 2018-05-06 08:48:44 -04:00
Jeff Becker
05d27962c4 remove buffer 2018-05-06 08:47:31 -04:00
Jeff Becker
9d33a89bc1 make read buffer size templated 2018-05-06 08:17:32 -04:00
Jeff Becker
242e996ded clang format 2018-05-06 08:10:20 -04:00
Jeff Becker
c503cddd85 add format target 2018-05-06 08:10:01 -04:00
Jeff Becker
5c10ecb2e9 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-05-06 08:06:07 -04:00
Jeff Becker
cb41b06cb7 * enable cross compile srndv2
* fix up kqueue code in nntpchan-daemon
2018-05-06 08:05:31 -04:00
Jeff
e08fc8881d update readme 2018-05-05 14:07:26 -04:00
Jeff Becker
8bd528aa50 more kqueue code 2018-05-04 10:08:09 -04:00
Jeff Becker
54573f3cd9 add initial kqueue stuff, not done 2018-05-04 09:52:54 -04:00
Jeff Becker
7545efc8d3 fix tools, use std::unique_ptr 2018-05-04 08:38:34 -04:00
Jeff Becker
7ccd554c2d abstract out epoll and make room for kqueue 2018-05-04 08:17:49 -04:00
Jeff Becker
b227bf6ff1 correct buffering 2018-05-03 14:05:35 -04:00
Jeff Becker
0c41298fe0 more 2018-05-03 13:38:35 -04:00
Jeff Becker
4df3bc0672 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-05-03 11:47:39 -04:00
Jeff Becker
34fdc0a154 use epoll 2018-05-03 11:47:20 -04:00
Jeff
bae6e1186c i fucking hate css god fucking damnit how does drybones do this shit? 2018-05-02 18:14:26 -04:00
Jeff
45dfa1c32c css fix 2018-05-02 18:01:55 -04:00
Jeff
eef7a0442b fix css 2018-05-02 17:58:14 -04:00
Jeff
4c9c34cb9f fix 2018-05-02 17:52:16 -04:00
Jeff
1d9f6b09f6 fix 2018-05-02 17:50:33 -04:00
Jeff Becker
6eba2d4653 update distclean target 2018-04-26 15:31:35 -04:00
Jeff Becker
a70d74e273 benis :+DDDDDD 2018-04-26 15:29:01 -04:00
Jeff Becker
caf9378073 more 2018-03-09 16:24:57 -05:00
Jeff Becker
58464582bd expose frontend pubkey to templates 2018-03-09 16:19:08 -05:00
Jeff Becker
69f868ecb9 add frontend key based blocking (initial) 2018-03-09 16:16:41 -05:00
Jeff Becker
a0ff118323 add newboard link to navbar 2018-03-09 15:35:05 -05:00
Jeff Becker
43df30c5bf fix css again 2018-03-09 15:31:08 -05:00
Jeff Becker
60a12169a0 css update 2018-03-09 15:28:43 -05:00
Jeff Becker
3899989f2e bump version 2018-03-09 10:57:31 -05:00
Jeff Becker
ce7f112be8 update default templates 2018-03-09 10:56:15 -05:00
Jeff Becker
e6417b3bd7 more 2018-03-09 10:28:15 -05:00
Jeff Becker
8a72b29d45 more 2018-03-09 10:26:47 -05:00
Jeff Becker
fcd5a97225 more 2018-03-09 10:23:09 -05:00
Jeff Becker
7c5546c0c0 morte 2018-03-09 10:18:47 -05:00
Jeff Becker
7abd41eecd more 2018-03-09 10:12:50 -05:00
Jeff Becker
c5479e2386 more 2018-03-09 10:05:03 -05:00
Jeff Becker
b61c22898e fixes 2018-03-09 09:58:56 -05:00
Jeff Becker
e2de5edd43 fix 2018-03-09 09:54:31 -05:00
Jeff Becker
2449cb1adc fixes 2018-03-09 09:52:16 -05:00
Jeff Becker
2adcc73d92 add inverted pagination for archive mode 2018-03-09 09:48:29 -05:00
Jeff Becker
55ba1e6c7c update configs 2018-03-09 08:50:01 -05:00
Jeff Becker
4bef3d8964 fix 2018-03-09 08:10:57 -05:00
Jeff Becker
aecd4ca291 fix 2018-03-09 08:08:14 -05:00
Jeff Becker
222a905c3a fix 2018-03-09 08:06:15 -05:00
Jeff Becker
777cb0941a smarter delete 2018-03-09 08:03:33 -05:00
Jeff Becker
f06cb1d9a2 csstweak 2018-03-09 07:18:43 -05:00
Jeff Becker
ef1fc85a8a css fix 2018-03-09 07:18:18 -05:00
Jeff Becker
f1d3c0a6b5 update css 2018-03-09 07:15:41 -05:00
Jeff Becker
e8e6812a25 css fix 2018-03-09 07:11:44 -05:00
Jeff Becker
6754947dc2 fix 2018-03-09 07:09:57 -05:00
Jeff Becker
5683e6eba0 fix 2018-03-09 07:07:44 -05:00
Jeff Becker
95e96db324 fix 2018-03-09 07:06:08 -05:00
Jeff Becker
024f773a7c add bumplock css 2018-03-09 07:01:33 -05:00
Jeff Becker
702ab469cd poll varnish connections 2018-03-04 07:03:10 -05:00
Jeff Becker
3eb2c0df0d fiux 2018-02-22 09:49:07 -05:00
Jeff Becker
6abc6f4021 Revert "re add pow captcha (initial)"
This reverts commit c3426871d2.
2018-02-22 09:48:03 -05:00
Jeff Becker
6fbf3e9bd7 Revert "Revert "more badges""
This reverts commit 4af10d59a9.
2018-02-22 09:45:56 -05:00
Jeff Becker
4af10d59a9 Revert "more badges"
This reverts commit 2bb4540118.
2018-02-22 09:45:48 -05:00
Jeff Becker
ed833024f3 update gitignore 2018-02-22 07:57:44 -05:00
Jeff Becker
ff4cb0a33a use separate gopath for gopherjs 2018-02-22 07:56:28 -05:00
Jeff Becker
c3426871d2 re add pow captcha (initial) 2018-02-22 07:53:34 -05:00
Jeff Becker
2bb4540118 more badges 2018-02-13 06:54:51 -05:00
Jeff Becker
0a77cf1a62 remove badge 2018-02-13 06:51:52 -05:00
Jeff Becker
e9507505af Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2018-02-13 06:51:10 -05:00
Jeff Becker
b14a9f709d badges 2018-02-13 06:50:59 -05:00
Jeff
ba74a79409 Merge pull request #157 from cathugger/master
small sync tweak
2018-01-26 13:06:22 -05:00
cathugger
81653a5415 small sync tweak 2018-01-26 14:46:59 +00:00
Jeff
9f17b7add1 Merge pull request #156 from cathugger/master
small insignificant fix
2018-01-24 11:26:10 -05:00
cathugger
6b039265d9 small insignificant fix 2018-01-24 16:21:51 +00:00
Jeff
78bb8577b4 Merge pull request #155 from cathugger/master
this should be final one
2018-01-24 11:01:36 -05:00
cathugger
9fba95b58d fix even more braindamage of mine 2018-01-24 15:57:13 +00:00
Jeff
17e72ce097 Merge pull request #154 from cathugger/master
quick feeex
2018-01-24 10:42:26 -05:00
cathugger
8894cf6814 im retarded 2018-01-24 15:39:37 +00:00
Jeff
410ef6e430 Merge pull request #153 from cathugger/master
specify correct range in XOVER when mirroring
2018-01-24 10:33:52 -05:00
cathugger
d752312868 specify correct range in XOVER when mirroring 2018-01-24 15:26:51 +00:00
Jeff
3dab2ceb95 Merge pull request #152 from cathugger/master
some NNTP improvements
2018-01-23 18:26:10 -05:00
cathugger
337a61dd7f some NNTP improvements 2018-01-23 22:32:14 +00:00
Jeff
685153f94e Merge pull request #151 from cathugger/master
some fixes
2018-01-22 12:35:32 -05:00
cathugger
8cb044a5e3 some fixes 2018-01-22 17:15:25 +00:00
Jeff Becker
91cfa9441e Revert "send posts the other side doesn't have on stream start"
This reverts commit f80acbecc2.
2018-01-15 10:37:57 -05:00
Jeff Becker
f80acbecc2 send posts the other side doesn't have on stream start 2018-01-12 09:49:55 -05:00
Jeff Becker
53522b98eb be concise 2018-01-07 09:33:39 -05:00
Jeff Becker
517338264d f-feeeeeeeex'd 2018-01-07 09:28:39 -05:00
Jeff Becker
2752676013 commit which fixes invalid line shit 2018-01-04 15:51:26 -05:00
Jeff Becker
aadb4ae230 commit which fixes invalid line shit 2018-01-04 15:46:49 -05:00
Jeff Becker
df021531cb commit which fixes invalid line shit 2018-01-04 15:45:26 -05:00
Jeff Becker
37e6129261 commit which fixes invalid line shit 2018-01-04 15:43:55 -05:00
Jeff Becker
0266deee2b fix 2018-01-04 15:23:10 -05:00
Jeff Becker
92320aff4c CURRENT YEAR 2018-01-01 16:47:03 -05:00
Jeff Becker
3e6a80f58c again 2017-12-29 13:15:48 -05:00
Jeff Becker
cdef33af7c fix last commit 2017-12-29 13:15:19 -05:00
Jeff Becker
e0350ecb98 more fixes 2017-12-29 13:08:42 -05:00
Jeff Becker
082430df55 remove nntpchan.info 2017-12-29 11:40:00 -05:00
Jeff Becker
63fe1ad1b5 update readme 2017-12-29 11:39:13 -05:00
Jeff Becker
8b35e7cf30 have readme tl;dr disable installer via env variable 2017-12-29 11:38:14 -05:00
Jeff Becker
cff6f50d63 also check for temp article when checking for local existence 2017-12-29 11:21:03 -05:00
Jeff Becker
a4c8de953a don't download articles if we already have it locally 2017-12-29 11:06:59 -05:00
Jeff Becker
9c89baf68e fix http proxy 2017-12-29 10:47:54 -05:00
Jeff Becker
29ab733808 add http proxy support to feeds 2017-12-29 10:24:03 -05:00
Jeff Becker
9e644eb004 add a sleep 2017-12-29 09:37:09 -05:00
Jeff Becker
a7e72e2aff implement temp article directory 2017-12-29 09:31:56 -05:00
Jeff Becker
f4640e82c4 try getting rid of race condition 2017-12-28 17:11:04 -05:00
Jeff Becker
95a9c1bda9 css 2017-11-30 08:04:16 -05:00
Jeff Becker
936782b616 fix thumbnailing and make it work 2017-11-12 08:18:42 -05:00
Jeff Becker
feb43b1ed8 forgot file 2017-11-12 07:59:38 -05:00
Jeff Becker
e093864ee7 * configurable thumbnails
* start working on spam folder
2017-11-12 07:58:30 -05:00
Jeff Becker
a7718e9a0a fix /b/ug 2017-11-11 09:49:05 -05:00
Jeff Becker
9230349b30 fix sa hook 2017-11-07 15:07:10 -05:00
Jeff Becker
26d4f5dffb fix sa hook 2017-11-07 14:59:53 -05:00
Jeff Becker
a88334e985 fix sa hook 2017-11-07 14:57:05 -05:00
Jeff Becker
d3ca9dfa33 fix sa hook 2017-11-07 14:33:41 -05:00
Jeff Becker
58cc8c2365 fix sa hook 2017-11-07 14:32:37 -05:00
Jeff Becker
8cd93abe4f fix sa hook 2017-11-07 14:30:34 -05:00
Jeff Becker
a07f4a30d6 fix sa hook 2017-11-07 14:27:52 -05:00
Jeff Becker
69359700b4 fix sa hook 2017-11-07 14:25:42 -05:00
Jeff Becker
d2552c5cd1 fix sa hook 2017-11-07 14:22:34 -05:00
Jeff Becker
210a2109a7 fix sa hook 2017-11-07 14:19:47 -05:00
Jeff Becker
2195c0a29c fix sa hook 2017-11-07 14:16:23 -05:00
Jeff Becker
96a931de3e fix sa hook 2017-11-07 14:13:17 -05:00
Jeff Becker
c4d5ab431a fix sa hook 2017-11-07 14:07:55 -05:00
Jeff Becker
3ce810775e fix sa hook 2017-11-07 14:05:36 -05:00
Jeff Becker
d89a811611 fix sa hook 2017-11-07 14:05:19 -05:00
Jeff Becker
c6dab2125e fix sa hook 2017-11-07 13:54:15 -05:00
Jeff Becker
b8fa8fff80 fix sa hook 2017-11-07 13:52:27 -05:00
Jeff Becker
78606e95de fix sa hook 2017-11-07 13:47:20 -05:00
Jeff Becker
b919c095a8 fix 2017-11-07 13:37:22 -05:00
Jeff Becker
666549e1e4 gay bullshit 2017-11-06 19:09:45 -05:00
Jeff Becker
99a3403ed8 mlurrrrr 2017-11-06 18:40:54 -05:00
Jeff Becker
e7c6100691 blurrrrr 2017-11-06 18:32:39 -05:00
Jeff Becker
bf357a3461 durr 2017-11-06 18:22:51 -05:00
Jeff Becker
c06b503efd hurr 2017-11-06 18:16:27 -05:00
Jeff Becker
cda181e820 spamassassin integration 2017-11-06 18:12:18 -05:00
Jeff Becker
ba16d5d717 fix internationalization on default templates 2017-11-05 10:05:59 -05:00
Jeff Becker
de253fb204 fix 2017-11-02 08:48:37 -04:00
Jeff Becker
835c912053 more 2017-11-02 08:47:51 -04:00
Jeff Becker
c53d4ba9ee fix 2017-11-02 08:45:58 -04:00
Jeff Becker
b25ce88232 more 2017-11-02 08:45:17 -04:00
Jeff Becker
9ef6d119c3 more mod panel stuff 2017-11-02 08:43:58 -04:00
Jeff Becker
75670aa1b7 hurr 2017-11-02 08:39:59 -04:00
Jeff Becker
6d0ff936ce add scoped mods to mod ui 2017-11-02 08:37:31 -04:00
Jeff Becker
5367b53570 finish template fixes for installer 2017-11-02 07:58:29 -04:00
Jeff Becker
f5fc7c0ff3 fix previous commit 2017-11-02 07:40:10 -04:00
Jeff Becker
38a162e416 add support for alternative template implementation 2017-11-02 07:32:24 -04:00
Jeff Becker
3c0122e8a2 Revert "fix"
This reverts commit 62bb1b7b32.
2017-10-31 12:46:06 -04:00
Jeff Becker
55dc52daf2 fix 2017-10-31 12:44:45 -04:00
Jeff Becker
62bb1b7b32 fix 2017-10-31 12:41:01 -04:00
Jeff Becker
882da39b87 try fix 2017-10-31 12:03:15 -04:00
Jeff Becker
f11f67190c try fix 2017-10-31 11:52:59 -04:00
Jeff
75bc4df7f6 Merge pull request #150 from l-n-s/patch-1
Update site.css
2017-10-25 14:07:12 -04:00
l-n-s
53330eef69 Update site.css
Correct cursor styling for style-switching labels
2017-10-25 17:45:33 +00:00
Jeff Becker
f771c8c0d9 more todo items 2017-10-25 09:39:59 -04:00
Jeff Becker
2aa1573bee todo items 2017-10-25 09:36:41 -04:00
Jeff Becker
09504ca363 xpat 2017-10-24 08:51:21 -04:00
Jeff Becker
3b83f184ea fix issue #148 2017-10-24 05:35:09 -04:00
Jeff Becker
841c5c6afe clang format 2017-10-17 10:29:56 -04:00
Jeff Becker
85248787fc try varnish invalidation with all languages 2017-10-17 08:50:47 -04:00
Jeff Becker
1f24f03cf5 more 2017-10-17 08:42:53 -04:00
Jeff Becker
53ba50541f more translation strings 2017-10-17 08:39:09 -04:00
Jeff Becker
7c94ff329a enable postform button translation 2017-10-17 08:34:52 -04:00
Jeff Becker
2740229d6b more template internationalization 2017-10-17 08:24:53 -04:00
Jeff Becker
5834df6cf2 fix typos 2017-10-17 08:15:58 -04:00
Jeff Becker
123057d608 more internationalization 2017-10-17 08:06:50 -04:00
Jeff Becker
24a25d5e20 more localization 2017-10-17 07:59:07 -04:00
Jeff Becker
311503884d spoilers in lua 2017-10-13 08:29:27 -04:00
Jeff Becker
8df0d9bbc2 spoiler text 2017-10-13 08:27:12 -04:00
Jeff Becker
f17f865f79 mor css 2017-10-13 08:09:57 -04:00
Jeff Becker
e9c88ffd28 nntpchan-daeom code 2017-10-13 07:58:41 -04:00
Jeff Becker
c583a03f81 allow lua stuff and fix it up 2017-10-13 07:58:10 -04:00
Jeff Becker
12bb8c4936 more nntpchan-daemon stuff 2017-10-11 09:48:27 -04:00
Jeff Becker
ec7a17a647 fix template 2017-10-10 13:30:54 -04:00
Jeff Becker
c6cc0b17c0 try fix navbar 2017-10-10 13:27:27 -04:00
Jeff Becker
529b1dd0f4 more i18n 2017-10-10 12:50:51 -04:00
Jeff Becker
36243cb2eb more i18n stuff 2017-10-10 12:47:01 -04:00
Jeff Becker
ce2e1eb7a8 more i18n 2017-10-10 12:40:25 -04:00
Jeff Becker
78797c680f more i18n stuff 2017-10-10 12:39:16 -04:00
Jeff Becker
0848412aa0 update i18n stuff 2017-10-10 12:34:39 -04:00
Jeff Becker
e25b84c686 dynamic translations 2017-10-10 12:17:38 -04:00
Jeff Becker
579bf619f4 fix segfaults 2017-10-09 12:51:49 -04:00
Jeff Becker
e67e7a20bd * more nntpchan-daemon code
* fix keepalive
2017-10-09 11:48:10 -04:00
Jeff Becker
dc2de0fbc9 update readme 2017-10-08 10:08:13 -04:00
Jeff Becker
8cdb070723 update readme 2017-10-08 10:07:29 -04:00
Jeff Becker
c54820a198 use correct names 2017-10-08 10:03:40 -04:00
Jeff Becker
24fea24b03 japanese translations 2017-10-08 09:54:19 -04:00
Jeff Becker
93cc2ff803 mor 2017-10-01 12:01:18 -04:00
Jeff Becker
8038663b0a fug 2017-10-01 11:59:41 -04:00
Jeff Becker
334ac0e4f2 js sux 2017-10-01 11:58:20 -04:00
Jeff Becker
b439795e04 meh 2017-10-01 11:57:12 -04:00
Jeff Becker
6f00406f99 i hate firefox 2017-10-01 11:55:23 -04:00
Jeff Becker
a0495130cc fix syntax error 2017-10-01 11:47:36 -04:00
Jeff Becker
54c0821339 construct formdata manually 2017-10-01 11:46:28 -04:00
Jeff Becker
b3d65dc5b9 tabify 2017-09-30 16:55:22 -04:00
Jeff Becker
54fde6ae2e fix js mor 2017-09-30 12:13:28 -04:00
Jeff Becker
2284fac632 fix js 2017-09-30 12:11:58 -04:00
Jeff Becker
6ec930a54a fix js 2017-09-30 12:10:07 -04:00
Jeff Becker
394a4a65e1 i hate js 2017-09-30 09:06:10 -04:00
Jeff Becker
b823223bd1 fix js 2017-09-30 09:02:59 -04:00
Jeff Becker
c951473310 focus on our post if posted 2017-09-30 09:00:10 -04:00
Jeff Becker
23b4f11e6d invalidate json endpoints 2017-09-30 08:55:38 -04:00
Jeff Becker
93b4558b27 reset values 2017-09-30 08:46:46 -04:00
Jeff Becker
493565257e mor js 2017-09-30 08:42:21 -04:00
Jeff Becker
d6bbe584de mor js 2017-09-30 08:40:18 -04:00
Jeff Becker
796d3480ba fix json rendering 2017-09-30 08:32:51 -04:00
Jeff Becker
ef024977df fix url 2017-09-30 08:18:02 -04:00
Jeff Becker
cbe6af7349 mor js 2017-09-30 08:15:55 -04:00
Jeff Becker
dcba36873e syntax error 2017-09-30 08:08:31 -04:00
Jeff Becker
065e79026e more 2017-09-30 08:07:46 -04:00
Jeff Becker
1fd5588457 param order 2017-09-30 08:06:32 -04:00
Jeff Becker
203e67a017 fix name 2017-09-30 08:05:27 -04:00
Jeff Becker
86896b6c52 fix param order 2017-09-30 08:04:25 -04:00
Jeff Becker
9cc9609ef6 use correct value 2017-09-30 08:03:33 -04:00
Jeff Becker
c8563f5fb4 fix typo 2017-09-30 08:02:10 -04:00
Jeff Becker
5a7eabc0d0 add js stuff for form resubmit 2017-09-30 08:01:21 -04:00
Jeff Becker
d245462373 revert captcha, add stuff to js 2017-09-30 07:35:01 -04:00
Jeff Becker
534e023526 try fixing captcha 2017-09-30 07:32:01 -04:00
Jeff Becker
6274fff05b fix captcha bug 2017-09-30 07:28:55 -04:00
Jeff Becker
0148aeb6af make it compile 2017-09-30 07:03:49 -04:00
Jeff Becker
7371db736d invalidate ukko 2017-09-30 07:02:10 -04:00
Jeff Becker
42cc7f26c4 remove more channels to prevent deadlocks 2017-09-30 06:57:17 -04:00
Jeff Becker
be7efb24cd implement more of XHDR 2017-09-26 10:15:52 -04:00
Jeff Becker
3ee449062e try fixing deadlock 2017-09-26 09:50:14 -04:00
Jeff Becker
73cf6da65d default to allow all if no rules specified 2017-09-26 09:38:05 -04:00
Jeff Becker
2f86abe62b fix makefile clean target 2017-09-26 09:37:44 -04:00
Jeff Becker
713cec5f45 make it work 2017-09-24 10:32:06 -04:00
Jeff Becker
da7ad5a7fe update query to go in order 2017-09-24 10:29:42 -04:00
Jeff Becker
5a2f3692cf fix sql query 2017-09-24 10:21:56 -04:00
Jeff Becker
b634fa2665 fix previous commit 2017-09-24 10:18:31 -04:00
Jeff Becker
ab37624a7a try fixing scrape from inn2 2017-09-24 10:16:08 -04:00
Jeff Becker
61c35b7652 * change feed defaults to be sane
* update docs

* add git revision to version

* bump to 2.5.1
2017-09-24 10:00:03 -04:00
Jeff Becker
24b9076c65 unlinkify bitcoin addr 2017-09-24 08:23:59 -04:00
Jeff Becker
69fac43124 add test target in main makefile 2017-09-24 08:18:56 -04:00
Jeff Becker
dee8c005fd add git version to srnd version string 2017-09-24 08:10:35 -04:00
Jeff Becker
a85622854b dont need install.sh 2017-09-23 10:06:22 -04:00
Jeff Becker
b61012fc43 make it work 2017-09-23 09:58:29 -04:00
Jeff Becker
d2887a99b4 use correct table 2017-09-23 09:33:42 -04:00
Jeff Becker
e224ee7aab set in-reply-to and fetch missing cites 2017-09-23 09:28:25 -04:00
Jeff Becker
b75d669f4e css 2017-09-22 09:56:24 -04:00
Jeff Becker
02edcaec3d css 2017-09-22 09:54:55 -04:00
Jeff Becker
5e40fe9c43 css 2017-09-22 09:54:32 -04:00
Jeff Becker
e5b3027324 css 2017-09-22 09:52:22 -04:00
Jeff Becker
295b2b0362 more css 2017-09-22 09:50:10 -04:00
Jeff Becker
a1f8b35599 more css for livechan 2017-09-22 09:48:41 -04:00
Jeff Becker
1aa6824fd7 more 2017-09-22 09:44:56 -04:00
Jeff Becker
1b55b4a213 sleep always 2017-09-20 12:49:30 -04:00
Jeff Becker
3097cea3a4 make it work 2017-09-20 12:45:24 -04:00
Jeff Becker
693b399f10 try removing channels for nntp 2017-09-20 12:38:17 -04:00
Jeff Becker
7b5ac6602f makefile sanity checks 2017-09-12 13:08:26 -04:00
Jeff Becker
683d7b7179 update docs 2017-09-12 12:47:41 -04:00
Jeff Becker
d97f1332d6 catch error 2017-09-12 10:16:55 -04:00
Jeff Becker
b8e862bbb6 add link to nntpchan-mapper 2017-09-12 09:55:21 -04:00
Jeff Becker
3b0a58d24c go fmt 2017-09-12 09:28:11 -04:00
Jeff Becker
2e1b934705 optimize queries more 2017-09-12 09:27:48 -04:00
Jeff Becker
22dc099105 fix 2017-09-11 16:50:57 -04:00
Jeff Becker
723fa5aff5 fix 2017-09-11 16:48:41 -04:00
Jeff Becker
57b6b5050e fix 2017-09-11 16:43:28 -04:00
Jeff Becker
52634b7edd optimizations 2017-09-11 16:37:04 -04:00
Jeff Becker
412c2ad4ca templates 2017-09-09 11:04:48 -04:00
Jeff Becker
7165f6eb4a fixes 2017-09-09 11:04:37 -04:00
Jeff Becker
eed8c07ef6 add postgres vendored 2017-09-09 10:20:33 -04:00
Jeff Becker
ea91db2f58 fix stuff up 2017-09-09 09:45:45 -04:00
Jeff Becker
0cd12cf944 update docs 2017-09-04 07:58:40 -04:00
Jeff Becker
eed0fc8001 fix docs 2017-09-04 07:55:57 -04:00
Jeff Becker
efda3efd56 update readme 2017-08-29 08:26:51 -04:00
Jeff Becker
81a08bb407 gut libsodium for rewrite 2017-08-27 11:24:37 -04:00
Jeff Becker
bb890e716b bump daemon version 2017-08-26 12:44:08 -04:00
Jeff Becker
1a2c5b9e4a remove use of libsodium in docs 2017-08-26 12:40:27 -04:00
Jeff Becker
358fe300ed use pure go target by default 2017-08-26 12:35:10 -04:00
Jeff Becker
f4a6988f11 works OMG YESH 2017-08-26 12:33:13 -04:00
Jeff Becker
f2d854d88f omg public key derivation works, signing still suck 2017-08-26 11:47:40 -04:00
Jeff Becker
4ede62a667 fix? 2017-08-26 10:48:47 -04:00
Jeff Becker
59ea3da355 add tests and try making no libsodium version work properly 2017-08-26 10:41:28 -04:00
Jeff Becker
2983eb6fbd start preparing for gutting of libsodium dependancy 2017-08-26 09:40:24 -04:00
Jeff Becker
0870b270cc fix date format in us locale 2017-08-25 12:47:35 -04:00
Jeff Becker
f3e76a1e0f use big ass query for calculating post history 2017-08-25 12:42:25 -04:00
Jeff Becker
7d56d68d14 add logging 2017-08-25 11:11:49 -04:00
Jeff Becker
7524db96fe move history.html cache invalidation to expire with frontpage 2017-08-25 11:07:22 -04:00
Jeff Becker
bd67be0280 add logging 2017-08-25 11:03:58 -04:00
Jeff Becker
5be6c9f7e8 document expire tool 2017-08-25 10:58:56 -04:00
Jeff Becker
e78286cc06 change genSignKeypair to genNaclSignKeypair or stuff 2017-08-25 10:56:17 -04:00
Jeff Becker
fea75f7200 try fixing signing omg this suxass 2017-08-25 10:52:57 -04:00
Jeff Becker
d61228215e tabify 2017-08-25 10:43:29 -04:00
Jeff Becker
cc5d94ee5f try reverting to old key derivation function 2017-08-25 10:37:46 -04:00
Jeff Becker
2152cd3246 idk 2017-08-25 10:33:27 -04:00
Jeff Becker
c6a79b8893 more stuff see if it works idklol 2017-08-25 10:28:47 -04:00
Jeff Becker
838f2b8ca7 fix order 2017-08-25 10:14:16 -04:00
Jeff Becker
88d723219a add debugging for testing 2017-08-25 10:11:23 -04:00
Jeff Becker
dbb5897305 fix nil, initialize public and private key buffers 2017-08-25 09:55:26 -04:00
Jeff Becker
892a7ea58b unbreak make it compile 2017-08-25 09:47:32 -04:00
Jeff Becker
64c52e327a unbreak maybe? 2017-08-25 09:37:05 -04:00
Jeff Becker
86b3d3ce62 probably broken 2017-08-25 09:30:34 -04:00
Jeff Becker
aa3cf130b3 don't use libsodium for new sigs 2017-08-25 08:52:41 -04:00
Jeff Becker
ed2f88c0fc add ed25519-blake2b signature support 2017-08-25 08:20:06 -04:00
Jeff Becker
2d090269c5 whitespace 2017-08-23 08:24:34 -04:00
Jeff Becker
aa637b7cb6 update css 2017-08-23 08:05:19 -04:00
Jeff Becker
38b24825fd update css 2017-08-23 08:03:57 -04:00
Jeff Becker
bb1b9f427d update css 2017-08-23 08:01:42 -04:00
Jeff Becker
c18152a7ba css fixes 2017-08-23 08:00:12 -04:00
Jeff Becker
17e89387b5 fix typo 2017-08-23 07:58:10 -04:00
Jeff Becker
89c5773625 add new mod's css rules 2017-08-23 07:56:13 -04:00
Jeff Becker
1dc800b89c add xmr address 2017-08-23 07:42:04 -04:00
Jeff Becker
c1f9191045 update readme
Signed-off-by: Jeff Becker <jeff@i2p.rocks>
2017-08-23 06:18:53 -04:00
Jeff Becker
bbefe94e8a update gitgud url 2017-08-23 06:15:25 -04:00
Jeff Becker
d28f272b94 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-08-13 20:17:12 -04:00
Jeff Becker
4770129ad6 update asset 2017-08-13 20:16:58 -04:00
Jeff
e87005a178 make captcha readable 2017-08-12 18:22:44 -04:00
Jeff
1e69493eef Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-08-12 18:20:13 -04:00
Jeff
1a70ff9d92 add captcha to placebo template 2017-08-12 18:19:49 -04:00
Jeff Becker
41a8541660 add expire tool 2017-08-08 18:48:07 -04:00
Jeff Becker
f61470468b add expire tool 2017-08-08 18:45:51 -04:00
Jeff Becker
23ae28bc71 fix bump bug 2017-08-08 18:38:48 -04:00
Jeff Becker
fa5e250595 fix history.html 2017-08-08 18:30:59 -04:00
Jeff Becker
f079a1fee4 fix history.html 2017-08-08 18:26:59 -04:00
Jeff Becker
5e66346662 eh whatever this should work 2017-08-08 09:32:42 -04:00
Jeff Becker
d48b585fcf eh whatever this should work 2017-08-08 09:32:18 -04:00
Jeff Becker
32e9e4b3eb add log 2017-08-08 09:24:44 -04:00
Jeff Becker
a60ecff7e3 add log 2017-08-08 09:22:21 -04:00
Jeff Becker
54b8b60edd add initial local spam filter 2017-08-08 09:18:31 -04:00
Jeff
2e4c42ff8a update placebo template 2017-08-07 16:09:00 -04:00
Jeff
e9cb9e4f46 fix 2017-08-07 16:06:51 -04:00
Jeff
1753e2e54b fix 2017-08-07 16:05:40 -04:00
Jeff
c2c2146ad3 try fixing frontend function of model 2017-08-07 16:03:36 -04:00
Jeff
1f1dc6a63b Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-08-05 10:13:32 -04:00
Jeff
f07a6faec6 initial base neochan app 2017-08-05 10:13:15 -04:00
Jeff Becker
51e0763faf Revert "more c++ stuff probably broken"
This reverts commit 5ea8b1b245.
2017-08-04 10:43:49 -04:00
Jeff Becker
5ea8b1b245 more c++ stuff probably broken 2017-08-04 10:39:29 -04:00
Jeff
aecbe2a5a9 do not use banned newsgroups 2017-08-03 21:57:59 -04:00
Jeff
cff13becaf 404 for banned newsgroups 2017-08-03 21:38:18 -04:00
Jeff
a06a671415 fix ip bans lol 2017-08-03 16:23:34 -04:00
Jeff
70feeed809 fix previous commit, make it compile 2017-08-03 12:10:19 -04:00
Jeff
6af4470473 fix last 2017-08-03 12:09:11 -04:00
Jeff
bdabd25867 fix error message spam 2017-08-03 12:07:12 -04:00
Jeff
d301021122 admin css 2017-07-30 18:37:39 -04:00
Jeff
741ded6694 fix pubkey tripcode 2017-07-30 18:20:14 -04:00
Jeff
2074e49d75 tripcodes 2017-07-30 18:17:10 -04:00
Jeff
809863c472 tripcodes 2017-07-30 18:16:02 -04:00
Jeff Becker
be54d399f3 css fix 2017-07-29 16:36:27 -04:00
Jeff Becker
76a3288d8c more 2017-07-27 10:10:40 -04:00
Jeff Becker
3d4d106554 change alpha 2017-07-27 09:51:23 -04:00
Jeff Becker
c7da354244 fix board page 2017-07-27 09:46:58 -04:00
Jeff Becker
acebb66227 fix placement 2017-07-27 09:46:01 -04:00
Jeff Becker
3a273ccf08 add navbar to bottom 2017-07-27 09:44:58 -04:00
Jeff Becker
dbc47f8c65 fix pagination on ukko 2017-07-27 09:44:01 -04:00
Jeff Becker
c03c8c370e Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-07-27 09:42:15 -04:00
Jeff Becker
a6e5fd13e0 add viewport 2017-07-27 09:42:04 -04:00
Jeff
37ebcc2693 fix bug in feeds 2017-07-20 21:35:48 -04:00
Jeff
31a1109372 add fagarrows 2017-07-10 08:20:22 -04:00
Jeff
d241137ded cssfix 2017-07-03 18:33:27 -04:00
Jeff
b78f044b0b mor 2017-07-03 18:18:38 -04:00
Jeff
4262f4dc59 mor 2017-07-03 18:16:02 -04:00
Jeff
3629eb41d9 mor 2017-07-03 18:14:47 -04:00
Jeff
d21efc7fd2 racism 2017-07-03 18:04:02 -04:00
Jeff Becker
90652f8e7b make sage greyscale not red 2017-06-28 18:15:21 -04:00
Jeff Becker
4469462cb7 fixes 2017-05-03 18:31:19 -04:00
Jeff Becker
37598e187d more 2017-05-03 13:44:35 -04:00
Jeff Becker
e4a9db3f11 storage works 2017-05-03 13:33:04 -04:00
Jeff Becker
0965d34fbb more 2017-05-03 11:38:48 -04:00
Jeff Becker
89c2398a96 more 2017-05-03 11:37:09 -04:00
Jeff Becker
279faa56b7 more fixes 2017-05-03 11:01:32 -04:00
Jeff Becker
19d75eb917 make it work 2017-05-03 09:44:42 -04:00
Jeff Becker
dba185c6aa compiles 2017-05-03 09:15:06 -04:00
Jeff Becker
07e62d2057 more 2017-05-03 08:17:53 -04:00
Jeff Becker
2f122529b0 more 2017-05-03 08:09:23 -04:00
Jeff Becker
942294317a make backend die when streaming is done 2017-04-23 08:30:28 -04:00
Jeff Becker
cfaa96b82c add feed policy for inbound feeds in default section of feeds.ini 2017-04-23 08:24:12 -04:00
Jeff Becker
cc467ac312 make it compile 2017-04-23 08:07:17 -04:00
Jeff Becker
0966a247e5 fix ? 2017-04-23 08:05:21 -04:00
Jeff Becker
4f3ac9f256 typo in error message 2017-04-23 08:00:29 -04:00
Jeff Becker
e9620558ac immediate return 2017-04-23 08:00:01 -04:00
Jeff Becker
cac9979280 revert 2017-04-23 07:58:45 -04:00
Jeff Becker
fdb6831064 nil check 2017-04-23 07:58:17 -04:00
Jeff Becker
fbafc56b4c make inbound nntp check feed policy 2017-04-23 07:57:50 -04:00
Jeff Becker
9e291b1c5a fix feed policy logic 2017-04-23 07:53:56 -04:00
Jeff Becker
8d4778c2d7 add board list to front page 2017-04-22 10:14:51 -04:00
Jeff Becker
0abb5882ec more fixes 2017-04-22 09:42:04 -04:00
Jeff Becker
96f51c9862 fix typo 2017-04-22 09:39:06 -04:00
Jeff Becker
872c5d3757 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-04-22 09:36:30 -04:00
Jeff Becker
66c1adfece update board list template 2017-04-22 09:36:16 -04:00
Jeff
66655b18d5 Merge pull request #147 from majestrate/HEAD
make nntp connection send keepalive periodically
2017-04-22 07:07:47 -04:00
Jeff Becker
0e2c1badcd make nntp connection send keepalive periodically 2017-04-22 07:05:56 -04:00
Jeff
f370a4ccbd fug 2017-04-20 18:08:32 -04:00
Jeff
cff94dc8d8 fug 2017-04-20 18:07:07 -04:00
Jeff
db03367945 fix 2017-04-20 18:00:59 -04:00
Jeff
aca6a0dfa4 fix 2017-04-20 17:47:33 -04:00
Jeff Becker
238ce08337 eh 2017-04-19 16:57:27 -04:00
Jeff Becker
ba113fa90f add frontend data thingy 2017-04-19 16:55:24 -04:00
Jeff Becker
f9e314d949 undo 2017-04-19 16:51:19 -04:00
Jeff Becker
359317457b invert color 2017-04-19 16:44:58 -04:00
Jeff Becker
648878235e css 2017-04-19 16:43:30 -04:00
Jeff Becker
d4ab0ff5d0 css 2017-04-19 16:19:39 -04:00
Jeff Becker
fff6b502fd css 2017-04-19 16:17:08 -04:00
Jeff Becker
0cea9f1255 more og stuff 2017-04-19 12:27:05 -04:00
Jeff Becker
bcc2c3fae7 inject prefix into thread template 2017-04-19 12:25:59 -04:00
Jeff Becker
04a3bb2c39 more og stuff 2017-04-19 12:24:35 -04:00
Jeff Becker
6beed4053a more og stuff 2017-04-19 12:22:29 -04:00
Jeff Becker
0ef8b3eb2b more og stuff 2017-04-19 12:21:23 -04:00
Jeff Becker
70a63ca296 put prefix in frontpage 2017-04-19 12:10:45 -04:00
Jeff Becker
18c9512f5d add more og 2017-04-19 12:08:48 -04:00
Jeff Becker
386ccfdcf0 more og stuff 2017-04-19 12:05:27 -04:00
Jeff Becker
72d4fdfdbb fix url 2017-04-19 11:59:01 -04:00
Jeff Becker
607ef72af0 fix caching 2017-04-19 11:55:51 -04:00
Jeff Becker
6554645428 more og stuff 2017-04-19 11:50:11 -04:00
Jeff Becker
23bfe82ca3 fix url 2017-04-19 11:46:16 -04:00
Jeff Becker
b1be5f67d3 more 2017-04-19 11:45:14 -04:00
Jeff Becker
308978914f add og meta tags 2017-04-19 11:43:09 -04:00
Jeff Becker
6a37c6ec87 change css link 2017-04-19 11:33:05 -04:00
Jeff Becker
9ab0f519a3 fix 404 2017-04-19 11:30:45 -04:00
Jeff Becker
d10fe80739 fix up faq style 2017-04-19 11:19:55 -04:00
Jeff Becker
248dcba2e6 hide topic too 2017-04-19 11:15:34 -04:00
Jeff Becker
e6e2ed4705 css 2017-04-19 11:13:48 -04:00
Jeff Becker
abdd39bbdf css 2017-04-19 11:11:49 -04:00
Jeff Becker
22fe5cf4e5 add id for thread 2017-04-19 11:09:26 -04:00
Jeff Becker
baa8d8d5ac fix js 2017-04-19 11:07:15 -04:00
Jeff Becker
120357dacd thread / post hider 2017-04-19 11:05:32 -04:00
Jeff Becker
0e68b9bc1f fix frontpage 2017-04-19 10:26:43 -04:00
Jeff Becker
9703acb04b fix frontpage 2017-04-19 10:24:02 -04:00
Jeff Becker
e4b0990375 morwe 2017-04-19 10:19:59 -04:00
Jeff Becker
d548c1014e css 2017-04-19 10:14:22 -04:00
Jeff Becker
c4ccbad74b css 2017-04-19 10:13:30 -04:00
Jeff Becker
490f8f973a css 2017-04-19 10:12:53 -04:00
Jeff Becker
a143636d6c css 2017-04-19 10:02:58 -04:00
Jeff Becker
1da1811d13 css 2017-04-19 10:01:27 -04:00
Jeff Becker
d084bf6d48 css 2017-04-19 09:55:56 -04:00
Jeff Becker
e3e086739c css 2017-04-19 09:54:02 -04:00
Jeff Becker
4a870a8335 css 2017-04-19 09:53:03 -04:00
Jeff Becker
caf7b14e80 add user css override stubs 2017-04-19 09:49:13 -04:00
Jeff Becker
ead00a7148 more css 2017-04-19 09:42:55 -04:00
Jeff Becker
b0524645c2 fix sage in model 2017-04-19 09:39:30 -04:00
Jeff Becker
304cd79d20 add subject 2017-04-19 09:33:06 -04:00
Jeff Becker
3b101236f7 css 2017-04-19 09:26:23 -04:00
Jeff Becker
b0fd79e415 css 2017-04-19 09:24:17 -04:00
Jeff Becker
24db116e4e css 2017-04-19 09:21:16 -04:00
Jeff Becker
787da56d16 Revert "more css"
This reverts commit 84e568b753.
2017-04-19 09:08:41 -04:00
Jeff Becker
84e568b753 more css 2017-04-19 09:05:31 -04:00
Jeff Becker
8c9720f6c5 more css 2017-04-19 09:04:22 -04:00
Jeff Becker
40d588f5a4 more css 2017-04-19 08:58:41 -04:00
Jeff Becker
f18ece1f00 add logo 2017-04-19 08:55:52 -04:00
Jeff Becker
bf35e678da css tweaks 2017-04-19 08:22:00 -04:00
Jeff Becker
893f1ff9db css tweaks 2017-04-19 08:20:55 -04:00
Jeff Becker
de0f12ebc8 fix 2017-04-19 08:17:05 -04:00
Jeff Becker
484114872c fix 2017-04-19 08:15:57 -04:00
Jeff Becker
157a318175 fix 2017-04-19 08:13:54 -04:00
Jeff Becker
7af1587f33 add overchan.js to overboard 2017-04-19 07:32:32 -04:00
Jeff Becker
b83b75338c add quick reply (initial) 2017-04-19 07:27:40 -04:00
Jeff Becker
eeb57e3ae6 add posts excluded count 2017-04-19 07:03:36 -04:00
Jeff Becker
4da6a3cdbb more 2017-04-18 20:15:19 -04:00
Jeff Becker
0a7aae55e6 more 2017-04-18 20:13:51 -04:00
Jeff Becker
8c5f6e9cde more 2017-04-18 20:12:14 -04:00
Jeff Becker
d37274ac36 more 2017-04-18 20:11:47 -04:00
Jeff Becker
87e790570e more 2017-04-18 20:10:36 -04:00
Jeff Becker
5aad791819 more 2017-04-18 20:08:44 -04:00
Jeff Becker
00c34b458b more 2017-04-18 20:07:46 -04:00
Jeff Becker
69c947774d more 2017-04-18 20:06:00 -04:00
Jeff Becker
ff4336595b more 2017-04-18 20:04:37 -04:00
Jeff Becker
71121a8421 more 2017-04-18 20:02:48 -04:00
Jeff Becker
546cf9677d more 2017-04-18 20:00:38 -04:00
Jeff Becker
e5346917be more 2017-04-18 19:58:24 -04:00
Jeff Becker
ad3b721134 more 2017-04-18 19:57:18 -04:00
Jeff Becker
f2e723de4f more 2017-04-18 19:56:12 -04:00
Jeff Becker
739f2c2291 more 2017-04-18 19:55:37 -04:00
Jeff Becker
066c514bf0 more 2017-04-18 19:54:08 -04:00
Jeff Becker
0f05488466 more 2017-04-18 19:52:10 -04:00
Jeff Becker
f35d7b29e0 more 2017-04-18 19:50:00 -04:00
Jeff Becker
efcd18bc8a more 2017-04-18 19:47:08 -04:00
Jeff Becker
881ca6cdf0 more 2017-04-18 19:45:36 -04:00
Jeff Becker
7c6bb5c40d placebo 2017-04-18 19:42:46 -04:00
Jeff Becker
e9e46e1f59 add refactored rewrite 2017-04-16 14:11:11 -04:00
Jeff Becker
c965f0f7af more 2017-04-14 06:24:53 -04:00
Jeff Becker
e02f0fc3fd Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-04-05 09:15:47 -04:00
Jeff Becker
48cc9a6b6b fix css bug 2017-04-05 09:15:34 -04:00
Jeff
fc64ea0acf clear existing file 2017-04-04 12:54:17 -04:00
Jeff
7e728a4a0a typo 2017-04-04 12:53:10 -04:00
Jeff Becker
77d87c0856 proper cleanup 2017-04-04 11:08:45 -04:00
Jeff Becker
c871e6ccd3 cleanup 2017-04-04 11:07:50 -04:00
Jeff Becker
28a30bdd3d don't do a short write 2017-04-04 11:04:14 -04:00
Jeff Becker
a66d31f447 enforce limits better 2017-04-04 11:01:02 -04:00
Jeff Becker
f482c8972e tweaks 2017-04-04 10:40:43 -04:00
Jeff Becker
8b5952f66b add configurable max message sizes 2017-04-04 10:31:41 -04:00
Jeff Becker
fa66537f9e update docs 2017-04-04 09:01:43 -04:00
Jeff Becker
08aaac492e switch to make for build 2017-04-04 09:01:32 -04:00
Jeff Becker
665849e016 remove gx stuff 2017-04-04 08:27:03 -04:00
Jeff Becker
e87d739392 refactor mod stuff 2017-04-04 07:48:45 -04:00
Jeff Becker
e8fa40c0ca fix boards.html 2017-04-03 21:35:09 -04:00
Jeff Becker
279ca91043 typo 2017-04-03 16:54:56 -04:00
Jeff Becker
af7205e8fe fix 2017-04-03 16:53:00 -04:00
Jeff Becker
ce7170c438 faster 2017-04-03 16:49:40 -04:00
Jeff Becker
9c60901332 update readme 2017-04-03 10:10:46 -04:00
Jeff Becker
f0b3de1c6e update build.sh to use in repo source for daemon 2017-04-03 10:05:28 -04:00
Jeff Becker
3a6cbf9de6 move srndv2 to nntpchan repo with vendored deps so that nothing breaks every again
this deprecates the github.com/majestrate/srndv2 repo
2017-04-03 10:00:38 -04:00
Jeff Becker
eb0ef957a4 more readme changes 2017-04-03 09:46:22 -04:00
Jeff Becker
665c52fbf6 fix headers in readme 2017-04-03 09:44:26 -04:00
Jeff Becker
5f8aa9f993 clarify what the network graph is 2017-04-02 18:28:42 -04:00
Jeff Becker
5a13dc4816 fix typo 2017-04-02 18:20:20 -04:00
Jeff Becker
ddb07b482b more 2017-04-02 18:17:36 -04:00
Jeff Becker
9841bd74e3 css fix 2017-04-02 14:26:06 -04:00
Jeff Becker
f35def74c3 css fixes 2017-04-02 14:15:19 -04:00
Jeff Becker
297848c8c3 ammend css from anon
thnx
2017-04-02 10:31:13 -04:00
Jeff Becker
e0c35620b0 css fix for censor ui 2017-03-30 09:42:34 -04:00
Jeff Becker
5575bd2ddc close tag 2017-03-30 09:38:28 -04:00
Jeff Becker
35bc32d3b1 span -> div 2017-03-30 09:36:46 -04:00
Jeff Becker
1dbcd224ad typofix 2017-03-30 09:32:06 -04:00
Jeff Becker
6247d0cfff * try fixing report form
* make captcha widget optional
2017-03-30 08:51:59 -04:00
Jeff Becker
bff7dadaa1 dont cache 2017-03-20 19:59:32 -04:00
Jeff Becker
ccaa23c9d8 dont cache 2017-03-20 19:57:18 -04:00
Jeff
6ebb563fbb fix css 2017-02-06 04:40:24 -05:00
Jeff Becker
d70639dcb6 fix 2017-02-05 13:14:12 -05:00
Jeff Becker
05ef278693 "disable" catalog link 2017-02-05 12:12:44 -05:00
Jeff Becker
20f442f8f2 more 2017-02-05 11:41:35 -05:00
Jeff Becker
026c5039a9 more 2017-02-05 11:40:27 -05:00
Jeff Becker
f83b4340c6 more 2017-02-05 11:35:47 -05:00
Jeff Becker
674d7fecb2 make subject hidden when none 2017-02-05 11:32:15 -05:00
Jeff Becker
e6f6d4ef37 more 2017-02-05 11:30:26 -05:00
Jeff Becker
eb369ca538 more 2017-02-05 11:21:56 -05:00
Jeff Becker
ccefab982f more 2017-02-05 11:18:06 -05:00
Jeff Becker
e800f9cfd0 more 2017-02-05 11:17:18 -05:00
Jeff Becker
ac88b2e083 more 2017-02-05 11:16:28 -05:00
Jeff Becker
7749fb9ced more 2017-02-05 11:13:15 -05:00
Jeff Becker
2a6ee9bc23 more 2017-02-05 11:11:34 -05:00
Jeff Becker
cbea6e011e make post.mustache cleaner 2017-02-05 11:09:59 -05:00
Jeff Becker
94632b37c9 initial chacha20 code; 2017-01-29 18:15:02 -05:00
Jeff Becker
21008c857a Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-01-29 17:21:52 -05:00
Jeff Becker
8521d0d490 Revert "Revert "add chacha20""
This reverts commit 2012e6d3a8.
2017-01-29 17:21:37 -05:00
Jeff
9e47a4f2c8 disable post reply 2017-01-29 16:15:01 -05:00
Jeff
7d556b0615 more fixes 2017-01-29 14:52:34 -05:00
Jeff Becker
c5fa3ad4a2 try fixing escaping 2017-01-29 14:42:40 -05:00
Jeff
7c8129c42e Merge pull request #144 from wzeth/patch-20
remove pre-cambrian redis, add helpers
2017-01-29 11:44:38 -05:00
Jeff
4411538252 Merge pull request #145 from wzeth/patch-21
clarify TLS config
2017-01-29 11:44:09 -05:00
Jeff Becker
5ab54ae654 ammend flashy format 2017-01-29 10:32:16 -05:00
Jeff Becker
f0790204c0 decrease flasy speed more 2017-01-29 10:27:33 -05:00
Jeff Becker
c331570e37 decrease flasy speed 2017-01-29 10:26:48 -05:00
Jeff Becker
7ba642df36 increase flasy speed 2017-01-29 10:26:20 -05:00
Jeff Becker
b29446bd9d add flashy text 2017-01-29 10:25:41 -05:00
Jeff Becker
836d1212cc make psytext use span 2017-01-29 10:21:05 -05:00
Jeff Becker
461721d729 make redtext use span 2017-01-29 10:20:44 -05:00
Jeff Becker
810c4f52fe add red text function 2017-01-29 10:12:43 -05:00
Jeff Becker
b0c4dd5f66 move red text to lua formatting 2017-01-29 10:08:00 -05:00
Jeff Becker
4c6cfefdb5 exlode text align center 2017-01-29 10:02:17 -05:00
Jeff Becker
3d195510ba more escapes 2017-01-29 10:00:51 -05:00
Jeff Becker
6e5c34ebdd escape more in code tags 2017-01-29 09:52:05 -05:00
Jeff Becker
749e1fc069 try escaping pipe 2017-01-29 09:46:12 -05:00
Jeff Becker
3f6c6ed615 more 2017-01-29 09:34:18 -05:00
Jeff Becker
af6c0ba6b8 fix 2017-01-29 09:31:52 -05:00
Jeff Becker
f8acfaaae4 make smaller 2017-01-29 09:30:31 -05:00
Jeff Becker
da43536e6c more formatting 2017-01-29 09:27:57 -05:00
wzeth
f4ee1d3e0b clarify TLS config 2017-01-29 09:03:48 -05:00
wzeth
c7be368be9 remove pre-cambrian redis, add helpers
Add some things someone might find useful, but that shouldn't be default:
* after network target
* require postgresql to start nntpchan
* setting `SRND_INI_PATH` if user would like to put their config elsewhere
2017-01-29 08:42:13 -05:00
Jeff Becker
3cb06d572e :-DDDD 2017-01-29 08:27:51 -05:00
Jeff Becker
f94ecbdaa9 add psytext alias in lua 2017-01-28 15:12:00 -05:00
Jeff Becker
f1f9ae33d9 add explode text 2017-01-28 14:39:31 -05:00
Jeff Becker
008cfb6db5 fix 2017-01-28 12:06:23 -05:00
Jeff Becker
46e8f48f66 try fixing wobble text 2017-01-28 11:46:32 -05:00
Jeff Becker
855c78a8f8 try fixing wobble text 2017-01-28 11:44:33 -05:00
Jeff Becker
9ec1c5c304 try fixing wobble text 2017-01-28 11:42:34 -05:00
Jeff Becker
0ab6dca181 center text in wobble 2017-01-28 11:36:00 -05:00
Jeff Becker
1d20cb3142 more 2017-01-28 11:29:57 -05:00
Jeff Becker
baf6e29473 try fix 2017-01-28 10:49:45 -05:00
Jeff Becker
1346eb56ab fix parameters 2017-01-28 10:47:24 -05:00
Jeff Becker
a8ac1dd67c Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-01-28 10:40:13 -05:00
Jeff Becker
0e51b675c2 add example lua stuff 2017-01-28 10:39:58 -05:00
Jeff
2fd58bebbb Merge pull request #143 from nilesr/master
Complete thunderbird-newsreader-configuration.md
2017-01-27 12:14:00 -05:00
Niles Rogoff
f44430e3ca Bundled images 2017-01-27 11:24:03 -05:00
Niles Rogoff
e705bbccba Complete thunderbird-newsreader-configuration.md 2017-01-27 00:12:35 -05:00
Jeff Becker
a3ed5a9d91 add working varnish config 2017-01-26 20:56:58 -05:00
Jeff Becker
2012e6d3a8 Revert "add chacha20"
This reverts commit 90bf96a025.
2017-01-20 14:23:49 -05:00
Jeff Becker
90bf96a025 add chacha20 2017-01-20 13:29:52 -05:00
Jeff Becker
da9e0d5808 css fix 2017-01-20 10:50:59 -05:00
Jeff Becker
99ebddc7c4 CURRENT YEAR 2017-01-18 19:17:29 -05:00
Jeff Becker
baeabad1a4 fix 2017-01-18 14:07:49 -05:00
Jeff Becker
13724b751a bump 2017-01-18 14:03:59 -05:00
Jeff Becker
cba3c29328 fix ignore 2017-01-18 14:02:06 -05:00
Jeff Becker
0e1e614696 bump gx version published 2017-01-18 14:00:13 -05:00
Jeff Becker
178b7e56f6 fix build and update gx 2017-01-18 13:59:22 -05:00
Jeff Becker
0feb319236 bump gx 2017-01-18 13:36:04 -05:00
Jeff Becker
4c927ff74a bump gx 2017-01-18 13:34:42 -05:00
Jeff Becker
a5f3188cce track gx lastpubver 2017-01-18 13:21:56 -05:00
Jeff Becker
7cf55931b7 bump gx version 2017-01-18 13:16:32 -05:00
Jeff Becker
1174df8344 fix banner 2017-01-18 08:55:29 -05:00
Jeff Becker
b41f1bebc8 add new banner 2017-01-18 08:45:58 -05:00
Jeff Becker
ccb750679a more 2017-01-16 14:58:59 -05:00
Jeff Becker
5b4bcd7cd9 more 2017-01-16 14:57:58 -05:00
Jeff Becker
a729848963 more 2017-01-16 14:55:37 -05:00
Jeff Becker
5727543e28 more 2017-01-16 14:54:38 -05:00
Jeff Becker
e2f509641a more 2017-01-16 14:53:04 -05:00
Jeff Becker
d000fcc993 more 2017-01-16 14:51:28 -05:00
Jeff Becker
52d401270f more 2017-01-16 14:49:32 -05:00
Jeff Becker
4d2d62681b more 2017-01-16 14:48:02 -05:00
Jeff Becker
3c61aad46c more 2017-01-16 14:47:37 -05:00
Jeff Becker
718863a2fc more 2017-01-16 14:47:00 -05:00
Jeff Becker
4d954861aa more 2017-01-16 14:46:10 -05:00
Jeff Becker
aafe3ad2a8 more 2017-01-16 14:45:17 -05:00
Jeff Becker
0c15c22ca2 more 2017-01-16 14:43:25 -05:00
Jeff Becker
ebf3f578b0 more 2017-01-16 14:42:07 -05:00
Jeff Becker
c8146eb783 more 2017-01-16 14:41:24 -05:00
Jeff Becker
1b18fc89a2 more 2017-01-16 14:40:01 -05:00
Jeff Becker
cfa83a7db8 more 2017-01-16 14:39:08 -05:00
Jeff Becker
8d6bd12346 more css 2017-01-16 14:33:44 -05:00
Jeff Becker
898bc668d9 try positioning 2017-01-16 14:32:11 -05:00
Jeff Becker
171d3e75f4 try positioning 2017-01-16 14:30:30 -05:00
Jeff Becker
f04627ff4f try positioning 2017-01-16 14:30:05 -05:00
Jeff Becker
c1c2ed2dda add to document 2017-01-16 14:24:33 -05:00
Jeff Becker
0fb9f392d7 fix types 2017-01-16 14:23:04 -05:00
Jeff Becker
7ac7399dcf prevent default 2017-01-16 14:21:59 -05:00
Jeff Becker
2885ebee81 add more logging 2017-01-16 14:20:46 -05:00
Jeff Becker
ba5801f920 add more logging 2017-01-16 14:19:27 -05:00
Jeff Becker
b65e0cdfba add logging 2017-01-16 14:17:43 -05:00
Jeff Becker
172b1e7c8c add reply box thing 2017-01-16 14:15:50 -05:00
Jeff Becker
0e8d277482 more 2017-01-16 13:23:46 -05:00
Jeff Becker
4be8c78aa7 more 2017-01-16 13:23:01 -05:00
Jeff Becker
3e178c63eb more 2017-01-16 12:08:52 -05:00
Jeff Becker
5cc2b1b937 more 2017-01-16 12:01:49 -05:00
Jeff Becker
997fad55e4 more 2017-01-16 12:01:22 -05:00
Jeff Becker
95b4dd7c91 more 2017-01-16 12:01:04 -05:00
Jeff Becker
4305692727 more 2017-01-16 12:00:46 -05:00
Jeff Becker
4665c0eb4e more 2017-01-16 11:59:12 -05:00
Jeff Becker
2aac424dc2 more 2017-01-16 11:58:44 -05:00
Jeff Becker
e2d7846d45 more 2017-01-16 11:58:20 -05:00
Jeff Becker
b42a2ae138 more 2017-01-16 11:57:57 -05:00
Jeff Becker
91476b700c more 2017-01-16 11:56:54 -05:00
Jeff Becker
13f8a0ab13 more 2017-01-16 11:55:16 -05:00
Jeff Becker
1467979dab more 2017-01-16 11:52:59 -05:00
Jeff Becker
dfdf4043f1 more 2017-01-16 11:49:55 -05:00
Jeff Becker
ba42a523ff more 2017-01-16 11:49:10 -05:00
Jeff Becker
49ef756672 more 2017-01-16 11:48:33 -05:00
Jeff Becker
a97c3d7d48 more 2017-01-16 11:47:53 -05:00
Jeff Becker
ad3089728a more 2017-01-16 11:42:37 -05:00
Jeff Becker
bfd16332f1 more 2017-01-16 11:38:50 -05:00
Jeff Becker
9cf7e617cb idklol 2017-01-16 11:34:36 -05:00
Jeff Becker
12f8ee9131 don't inject post hover 2017-01-16 11:32:56 -05:00
Jeff Becker
eabe6474de dyn reply fixes 2017-01-16 11:27:58 -05:00
Jeff Becker
75dc4c2529 fix syntax error 2017-01-16 11:23:04 -05:00
Jeff Becker
11b5ca6a1b re-enable dynamic reply 2017-01-16 11:21:45 -05:00
Jeff Becker
8c2ddda51a try fixing video expand 2017-01-16 11:11:56 -05:00
Jeff Becker
963637e750 try fixing expand video 2017-01-16 11:06:50 -05:00
Jeff Becker
ff8bdcf08c more semicolons 2017-01-16 10:53:58 -05:00
Jeff Becker
6af49f6800 add semicolin 2017-01-16 10:52:46 -05:00
Jeff Becker
f0a9a67c29 fix case 2017-01-16 10:35:44 -05:00
Jeff Becker
612c9c8989 fix case 2017-01-16 10:32:11 -05:00
Jeff Becker
026eaa2f84 fix report 2017-01-16 10:31:18 -05:00
Jeff Becker
f229ea555c try fixing censortools 2017-01-16 10:21:37 -05:00
Jeff Becker
aa29679a92 fix typo 2017-01-15 07:47:26 -05:00
Jeff Becker
97eec6053d update overview 2017-01-13 14:08:33 -05:00
Jeff Becker
64a78a4131 update ukko links to /o/ 2017-01-13 13:03:55 -05:00
Jeff Becker
c8ca9dd855 increment banner count 2017-01-12 13:42:38 -05:00
Jeff Becker
caddb84dfb add new banner 2017-01-12 13:41:49 -05:00
Jeff Becker
f9d4d30941 more 2017-01-12 10:25:15 -05:00
Jeff Becker
a09f1cd454 more 2017-01-12 09:59:29 -05:00
Jeff Becker
36c0bc127f :\ 2017-01-12 09:58:08 -05:00
Jeff Becker
a36e523ddf more attempted fixes 2017-01-12 09:56:24 -05:00
Jeff Becker
992dfad0dc try fix for json 2017-01-12 09:54:21 -05:00
Jeff Becker
19452704fc fix id 2017-01-12 09:49:30 -05:00
Jeff Becker
953042578b fix css 2017-01-12 09:48:13 -05:00
Jeff Becker
01813b2877 update css 2017-01-12 09:47:14 -05:00
Jeff Becker
7096ea4e52 more 2017-01-12 09:44:59 -05:00
Jeff Becker
9e14d6ce30 :-DDDD 2017-01-12 09:40:33 -05:00
Jeff Becker
60d226c66b fug 2017-01-12 09:40:07 -05:00
Jeff Becker
fc2c582627 fix js in censor tools 2017-01-12 09:38:48 -05:00
Jeff Becker
0eac006d52 more censortools changes 2017-01-12 09:37:23 -05:00
Jeff Becker
228af0c5f4 fix placement 2017-01-12 09:30:38 -05:00
Jeff Becker
0f60daf299 more censor tools stuff 2017-01-12 09:26:49 -05:00
Jeff Becker
1ec4663499 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2017-01-12 09:25:05 -05:00
Jeff Becker
0e394ae25e add censortools to postform 2017-01-12 09:24:51 -05:00
jeff
e818547661 fix urls 2017-01-10 14:07:51 -05:00
jeff
7e2d9f2d0f rename ukko to /overboard/ 2017-01-10 13:50:13 -05:00
Jeff Becker
25ae491ddc add more banners 2017-01-10 12:28:30 -05:00
Jeff Becker
5ef0085b57 more banners 2017-01-10 12:27:19 -05:00
Jeff Becker
536b1161c9 more 2016-12-31 08:36:28 -05:00
Jeff Becker
e35adda727 semicolin 2016-12-27 11:08:59 -05:00
Jeff Becker
ccbb348155 update search 2016-12-26 15:38:52 -05:00
Jeff Becker
1e81129090 add search by hash 2016-12-26 15:35:02 -05:00
Jeff Becker
cbad613621 moar css 2016-12-26 12:08:10 -05:00
Jeff Becker
0d5fded584 moar css 2016-12-26 12:07:35 -05:00
Jeff Becker
595a258331 moar css 2016-12-26 12:06:35 -05:00
Jeff Becker
d4305eb2f0 moar css 2016-12-26 12:05:14 -05:00
Jeff Becker
34559db9aa id -> class 2016-12-26 12:03:47 -05:00
Jeff Becker
f275ceaec1 add css 2016-12-26 12:02:40 -05:00
Jeff Becker
0854260d43 fix 2016-12-26 11:48:45 -05:00
Jeff Becker
6f8862b631 fix 2016-12-26 11:48:00 -05:00
Jeff Becker
69c20952ad more 2016-12-26 11:46:27 -05:00
Jeff Becker
ada1a614ea update link to use new tab 2016-12-26 11:43:46 -05:00
Jeff Becker
b0ede42c61 fix query 2016-12-26 11:34:57 -05:00
Jeff Becker
c9f5cf183c update search 2016-12-26 11:33:51 -05:00
Jeff Becker
e9e94b17d5 bug fix 2016-12-26 11:26:24 -05:00
Jeff Becker
23390b5998 fix 2016-12-26 11:24:30 -05:00
Jeff Becker
8f9622dca8 update search 2016-12-26 11:21:34 -05:00
Jeff Becker
579970c079 more 2016-12-26 10:11:29 -05:00
Jeff Becker
000fb43159 ebin 2016-12-20 11:07:52 -05:00
Jeff Becker
78e7895c70 Revert "Revert "update templates and shit""
This reverts commit f5520a7127.
2016-12-14 17:45:48 -05:00
Jeff Becker
82a0746d3e Revert "Revert "Revert "update templates and shit"""
This reverts commit 2b811a6b34.
2016-12-14 17:45:48 -05:00
Jeff Becker
b5580bebdd Revert "Revert "Revert "Revert "update templates and shit""""
This reverts commit fc1e20bd6f.
2016-12-14 17:45:47 -05:00
Jeff Becker
e672f412dc Revert "Revert "Revert "update templates and shit"""
This reverts commit a86345aa8b.
2016-12-14 17:45:47 -05:00
Jeff Becker
bdf11b535c Revert "Revert "fix build.sh""
This reverts commit f319d8e809.
2016-12-14 17:45:47 -05:00
Jeff Becker
2468083ba2 Revert "Revert "update build.sh""
This reverts commit 38354318b8.
2016-12-14 17:45:46 -05:00
Jeff Becker
a00a902022 Revert "Revert "move nntpchand source to nntpchan repo""
This reverts commit 1465b99df6.
2016-12-14 17:45:44 -05:00
Jeff Becker
1465b99df6 Revert "move nntpchand source to nntpchan repo"
This reverts commit 91406d3400.
2016-12-14 17:40:58 -05:00
Jeff Becker
38354318b8 Revert "update build.sh"
This reverts commit c0ae3d0756.
2016-12-14 17:40:58 -05:00
Jeff Becker
f319d8e809 Revert "fix build.sh"
This reverts commit a93f3201f9.
2016-12-14 17:40:58 -05:00
Jeff Becker
a86345aa8b Revert "Revert "update templates and shit""
This reverts commit f5520a7127.
2016-12-14 17:40:56 -05:00
Jeff Becker
fc1e20bd6f Revert "Revert "Revert "update templates and shit"""
This reverts commit 2b811a6b34.
2016-12-14 17:40:50 -05:00
Jeff Becker
2b811a6b34 Revert "Revert "update templates and shit""
This reverts commit f5520a7127.
2016-12-14 17:40:39 -05:00
Jeff Becker
f5520a7127 Revert "update templates and shit"
This reverts commit 8dd77dcdf0.
2016-12-14 17:40:13 -05:00
Jeff Becker
a93f3201f9 fix build.sh 2016-11-18 09:58:15 -05:00
Jeff Becker
c0ae3d0756 update build.sh 2016-11-18 09:57:24 -05:00
Jeff Becker
91406d3400 move nntpchand source to nntpchan repo 2016-11-18 09:54:13 -05:00
Jeff Becker
8dd77dcdf0 update templates and shit 2016-11-17 16:42:15 -05:00
Jeff Becker
3ab022f45d add unstaged changes 2016-11-16 11:38:03 -05:00
Jeff Becker
c677cebde5 more, add initial mod ui 2016-11-16 10:19:00 -05:00
Jeff Becker
6f01bac76c fix hook more 2016-11-15 09:00:51 -05:00
Jeff Becker
c0e216a390 fix hook again 2016-11-15 08:58:59 -05:00
Jeff Becker
2527e695dd update hooks 2016-11-15 08:52:55 -05:00
Jeff Becker
fdedd6a6c0 fix hook 2016-11-15 08:51:57 -05:00
Jeff Becker
59c52f775f add purge varnish hook (initial) 2016-11-15 08:49:54 -05:00
Jeff Becker
c8cb42edfd off by one 2016-11-12 13:08:43 -05:00
Jeff Becker
4ad781e541 fix index out of bounds 2016-11-12 13:06:40 -05:00
Jeff Becker
4f0c2e2f18 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-11-12 09:06:35 -05:00
Jeff Becker
6065eca82f update style for torbb 2016-11-12 09:06:18 -05:00
Jeff
3983506fe3 Update moderation.md 2016-11-10 15:19:14 -05:00
Jeff Becker
4ea96b155f don't use imgur 2016-11-10 15:14:17 -05:00
Jeff Becker
3429ac63f8 add docs on moderation from anon 2016-11-10 15:11:09 -05:00
Jeff Becker
2ae4f2268b make posting work 2016-11-10 08:46:01 -05:00
Jeff Becker
801272ae7d provide url for ctl 2016-11-09 15:12:46 -05:00
Jeff Becker
d1a81f319d make mod backend work 2016-11-09 14:32:26 -05:00
Jeff Becker
9f7de85a1f remove unneeded template 2016-11-09 12:24:59 -05:00
Jeff Becker
518a32016b add initial censor ui 2016-11-09 12:22:22 -05:00
Jeff Becker
e036db805e more 2016-11-08 07:22:43 -05:00
Jeff Becker
56b90bf5f7 * add captcha reloader
* update posted template
2016-11-08 06:49:52 -05:00
Jeff Becker
6cdcc4c3b9 fixes 2016-11-07 13:31:57 -05:00
Jeff Becker
487495f9ac update op when we get it 2016-11-07 13:24:33 -05:00
Jeff Becker
15bc796952 case insensative file extensions 2016-11-07 12:52:28 -05:00
Jeff Becker
774b2a5e50 update bump logic 2016-11-07 12:42:26 -05:00
Jeff Becker
78dccbfd61 make secret_key "changeme" by default to encourage people to change it 2016-11-07 09:56:58 -05:00
Jeff Becker
6eefd675e6 add forgotten files 2016-11-07 09:52:21 -05:00
Jeff Becker
3fed1d8d41 more 2016-11-07 09:52:00 -05:00
Jeff Becker
7a4c875fd5 update url for front page 2016-11-07 09:12:31 -05:00
Jeff Becker
f315823dcd update url rules 2016-11-07 09:10:24 -05:00
Jeff Becker
64a9e471ef fix regression 2016-11-07 09:04:55 -05:00
Jeff Becker
670f613596 update page logic, don't use queries for page numbers 2016-11-07 09:03:11 -05:00
Jeff Becker
84092c979f add example config for nginx+varnish 2016-11-07 08:39:35 -05:00
Jeff Becker
3fad9794da add default varnish config 2016-11-07 08:20:04 -05:00
Jeff Becker
ecf8237c97 update settings and add readme 2016-11-07 07:50:10 -05:00
Jeff Becker
c3224379ca more 2016-11-07 07:02:03 -05:00
Jeff Becker
2a744c45a2 fix making new threads 2016-11-06 17:55:02 -05:00
Jeff Becker
64b345a7f0 fix message 2016-11-06 17:50:13 -05:00
Jeff Becker
f25f2cd956 it now works 2016-11-06 17:47:23 -05:00
Jeff Becker
14c68abf9d more 2016-11-06 16:01:05 -05:00
Jeff Becker
3c2da5f25b don't hardcode media url in attachments 2016-11-06 11:21:37 -05:00
Jeff Becker
dafa5ca517 make pagination work 2016-11-06 11:17:46 -05:00
Jeff Becker
d81e709827 correct bump order for board page 2016-11-06 11:01:04 -05:00
Jeff Becker
4c7dd44815 make images open in new tab 2016-11-06 10:58:19 -05:00
Jeff Becker
514064ce5a update supported thumbnail types 2016-11-06 10:50:12 -05:00
Jeff Becker
dac258a978 remove recursive fun for markup filter 2016-11-06 10:49:57 -05:00
Jeff Becker
a9860d82ba various fixes 2016-11-06 10:20:03 -05:00
Jeff Becker
cc957f3de5 * fix thumbnailing
* make thumbnailing programs configurable
2016-11-06 08:08:34 -05:00
Jeff Becker
8665b98452 fix thumbnails 2016-11-06 08:00:18 -05:00
Jeff Becker
31a12185f6 more fixes 2016-11-05 16:15:41 -04:00
Jeff Becker
e686f0d57e more 2016-11-05 14:58:28 -04:00
Jeff Becker
8ffc8c006c more 2016-11-05 14:54:22 -04:00
Jeff Becker
a19d36f883 more 2016-11-04 16:51:25 -04:00
Jeff Becker
3aa87e07f2 update 2016-11-04 09:01:17 -04:00
Jeff Becker
be4fbda2a6 more 2016-11-04 09:00:03 -04:00
Jeff Becker
7f25dcf95c broken 2016-11-04 08:45:06 -04:00
Jeff Becker
a7e33a9f10 add gitignore 2016-11-04 07:31:03 -04:00
Jeff Becker
2c49987c6d add base django stuff 2016-11-04 07:28:25 -04:00
Jeff
00fa6eb561 Merge pull request #141 from wzeth/patch-19
set explicit height and width for captcha
2016-11-02 17:34:43 -04:00
Jeff
9d18d59f45 Merge pull request #142 from wzeth/patch-18
explicitly set height and width attrs to avoid jumping beans
2016-11-02 17:33:52 -04:00
Jeff Becker
f47b181290 fix captcha reload for ukko page 2016-11-02 16:18:12 -04:00
Jeff Becker
6d7f2bd587 add pagination at bottom of ukko 2016-11-02 16:13:11 -04:00
Jeff Becker
3bc2befb88 finish burst of commits 2016-11-02 16:11:43 -04:00
Jeff Becker
239ba55f1f more 2016-11-02 16:09:43 -04:00
Jeff Becker
349c588bdd more 2016-11-02 16:07:28 -04:00
Jeff Becker
4bd8f0a688 more 2016-11-02 16:05:50 -04:00
Jeff Becker
6b3fc260a6 more 2016-11-02 16:04:19 -04:00
Jeff Becker
975693d241 more 2016-11-02 16:03:49 -04:00
Jeff Becker
6b934ebd52 more 2016-11-02 16:02:58 -04:00
Jeff Becker
95ab7448be idunno 2016-11-02 15:58:43 -04:00
Jeff Becker
1acad1b11f fix 2016-11-02 15:58:12 -04:00
Jeff Becker
4d91cbd084 fix 2016-11-02 15:56:59 -04:00
Jeff Becker
89d20a1617 fix typo 2016-11-02 15:56:07 -04:00
Jeff Becker
20120a8690 more 2016-11-02 15:54:27 -04:00
Jeff Becker
864a751130 more 2016-11-02 15:50:53 -04:00
Jeff Becker
e668cdc16e more 2016-11-02 15:45:30 -04:00
Jeff Becker
f76ba6422c fix 2016-11-02 15:44:01 -04:00
Jeff Becker
9a6400e15b more 2016-11-02 15:42:53 -04:00
Jeff Becker
a068fe634d fix css a bit 2016-11-02 15:41:39 -04:00
Jeff Becker
a5da6d2e78 fix 2016-11-02 15:33:53 -04:00
Jeff Becker
e32f60e658 more 2016-11-02 15:33:06 -04:00
Jeff Becker
21b5a21008 tweaks 2016-11-02 15:28:48 -04:00
Jeff Becker
4ada177ae9 more fixes 2016-11-02 15:24:51 -04:00
Jeff Becker
176c162781 fix ukko formatting 2016-11-02 15:23:23 -04:00
Jeff Becker
d77b2dbff9 fix missing div 2016-11-02 15:17:14 -04:00
Jeff Becker
6bb2b154ef add truncation info to ukko 2016-11-02 14:33:58 -04:00
Jeff Becker
83cc63fc06 give more info about truncation in board template 2016-11-02 14:29:12 -04:00
Jeff Becker
89a004e8ec fix 2016-11-02 11:23:17 -04:00
Jeff Becker
b393c066b0 fix 2016-11-02 11:22:18 -04:00
Jeff Becker
2eecfeafaa fix typo 2016-11-02 11:21:14 -04:00
Jeff Becker
25a15100a9 fix 2016-11-02 11:19:45 -04:00
Jeff Becker
aeab87cb51 fix search 2016-11-02 11:18:11 -04:00
Jeff Becker
458a1c04d9 add search page 2016-11-02 11:16:31 -04:00
wzeth
af4baa42a4 set explicit height for captcha
Now less bean jumping and more meme having.
2016-11-02 09:06:28 -04:00
wzeth
d64be9150d fix the jumping beans effect
Pages will jump if image size isn't explicitly declared.
2016-11-02 09:01:38 -04:00
Jeff Becker
4be03b0b96 add nntpchan nginx config for no prefix 2016-11-02 08:44:05 -04:00
Jeff Becker
b34b58a0cf fix 2016-10-31 11:05:47 -04:00
Jeff Becker
d52c65828f Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-10-31 10:55:18 -04:00
Jeff Becker
26a21fe6bf add paginated ukko links 2016-10-31 10:55:03 -04:00
Jeff
030460e2c4 Merge pull request #140 from wzeth/patch-17
Add building instructions for Ubuntu 16.10
2016-10-27 09:25:02 -04:00
wzeth
84cdf459ae fix typo
depencies :DDDDD
2016-10-27 03:06:57 -04:00
wzeth
190321b4c4 Rename building-ubuntu16.10 to building-ubuntu16.10.md 2016-10-27 03:00:42 -04:00
wzeth
37119a249e Create building-ubuntu16.10 2016-10-27 02:59:36 -04:00
Jeff Becker
2caf487c72 add logo to readme 2016-10-25 10:01:07 -04:00
Jeff Becker
aecb4b6ac0 add logo 2016-10-25 10:00:10 -04:00
Jeff Becker
554d2d753e update readme again 2016-10-25 09:55:54 -04:00
Jeff Becker
13739363f4 update readme to point users to nntpchan.info 2016-10-25 09:54:45 -04:00
Jeff Becker
00fdbb9449 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-10-22 15:43:48 -04:00
Jeff Becker
4369765253 backlog for mod feed 2016-10-22 15:28:35 -04:00
Jeff
9883ed4396 Merge pull request #139 from wzeth/patch-16
deprecate redis
2016-10-20 16:23:49 -04:00
wzeth
ba7140053a remove --createdb and upgrade go version
--createdb doesn't always work for some reason, so prefer the `createdb srnd` command instead. Upgrade to go 1.7.3 because, as far as I know, SRNDv2 compiles on this version.
2016-10-20 12:51:06 -04:00
wzeth
2727fe9dff deprecate redis
redis is trash kill you'reself
2016-10-20 12:44:13 -04:00
Jeff Becker
e080e939dd Revert "switch to typescript"
This reverts commit de5883d0a0.
2016-10-18 10:30:32 -04:00
Jeff Becker
4b1da71030 Revert "add more stuff"
This reverts commit 2aa79bd014.
2016-10-18 10:30:32 -04:00
Jeff Becker
2aa79bd014 add more stuff 2016-10-18 09:32:00 -04:00
Jeff Becker
de5883d0a0 switch to typescript 2016-10-18 09:03:46 -04:00
Jeff Becker
ce3919fc1f update nntpchan python frontend 2016-10-18 08:46:22 -04:00
Jeff Becker
561a0156be add --enable-redis flag 2016-10-18 08:44:15 -04:00
Jeff Becker
fde7ed3d3b more 2016-10-18 08:17:40 -04:00
Jeff Becker
3c4ad2fe50 disable neochan by default 2016-10-18 07:08:49 -04:00
Jeff Becker
cd803852e7 add vendor 2016-10-18 07:05:34 -04:00
Jeff Becker
2e2968e188 Merge branch 'neochan' 2016-10-18 07:04:21 -04:00
Jeff Becker
4f3bc5cf6e more recent changes 2016-10-18 07:03:51 -04:00
Jeff Becker
378a257377 move 2016-10-16 07:05:57 -04:00
Jeff Becker
04df5de9a1 fix 2016-10-15 13:55:25 -04:00
Jeff Becker
9ae0b0ef5b updates 2016-10-15 13:53:35 -04:00
Jeff Becker
d31ca5b6a7 update dis shit mang 2016-10-15 12:37:59 -04:00
Jeff Becker
cc089b3401 track primordial goo frontends 2016-10-15 09:12:01 -04:00
Jeff Becker
7b8d33826b initial neochan commit 2016-10-15 09:05:38 -04:00
Jan Verbeek
9e9a1efe06 Merge https://gitgud.io/uguu/nntpchan
Conflicts:
	build-js.sh
	build.sh
2016-10-08 14:29:46 +02:00
Jeff Becker
a5d7cb9074 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-10-08 08:12:37 -04:00
Jeff
053b5870cf Merge pull request #138 from wzeth/patch-15
Explicit notice of redis cache deprecation
2016-10-08 08:09:59 -04:00
wzeth
4ab90f3152 Explicit notice of redis cache deprecation
Users should know that redis cache is no longer valid as of SRNDv2 commit 96de42
2016-10-08 05:08:46 -04:00
Jeff Becker
dc75a3513e add js branding 2016-10-07 10:17:29 -04:00
Jeff Becker
40ceb747ae refactor structure 2016-10-07 10:06:25 -04:00
Jeff Becker
6996e3abc4 remove cuckhold pow in postform 2016-10-07 08:26:50 -04:00
Jeff Becker
5118ffb3f8 fix tomorrow.css 2016-10-07 07:36:33 -04:00
Jeff Becker
287a49f196 fix tomorrow.css 2016-10-07 07:35:06 -04:00
Jeff Becker
698ed1d42e previous commit 2016-10-07 07:34:08 -04:00
Jeff Becker
a0deb532e3 fix bloodgod.css moar 2016-10-07 07:33:03 -04:00
Jeff Becker
0e1e6201ca fix bloodgod.css 2016-10-07 07:30:29 -04:00
Jeff Becker
6ea75236fa fix post.mustache 2016-10-07 07:25:30 -04:00
Jeff Becker
61281190bb disable feature 2016-10-07 07:24:00 -04:00
Jeff Becker
2355528b46 fug 2016-10-02 20:42:45 -04:00
Jeff Becker
db5b8ec309 try fixing liveui for chrome 2016-10-02 20:36:59 -04:00
Jeff Becker
a0a0a6feca update readme 2016-10-02 09:01:58 -04:00
Jeff
787bef7625 Merge pull request #134 from wzeth/patch-13
Use more succinct postgres role creation command
2016-09-10 10:21:08 -04:00
wzeth
e57d4ea921 Use more succinct postgres role creation command
It is far less error prone to use the tools that Postgres provides to create the role and the database. This amendment also ensures the created role password is encrypted.
2016-09-10 09:34:00 -04:00
Jeff
c6c9c3f53b apply mona's css patch 2016-09-06 19:05:52 -04:00
Jeff Becker
f7eb634aa1 fix :p 2016-08-14 11:27:46 -04:00
Jeff Becker
74f07c3a6c add test file 2016-08-14 11:26:07 -04:00
Jeff Becker
95864559fb wrap post in pre tag 2016-08-02 20:03:45 -04:00
Jeff Becker
5155205e8c indent 2016-08-01 07:34:35 -04:00
Jeff Becker
d91b0d3e99 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-08-01 07:24:43 -04:00
Jeff Becker
3df355abdb update banners 2016-08-01 07:24:25 -04:00
Jeff Becker
850e5bccae fix css 2016-07-30 08:03:32 -04:00
Jeff Becker
713fe21190 comiit changes 2016-07-30 08:02:05 -04:00
Jeff
3d683ab87e Merge pull request #131 from deavmi/patch-1
Update building.md
2016-07-22 06:24:50 -04:00
Tristan B. Kildaire
a4053f0f1a Update building.md 2016-07-21 20:57:04 +02:00
Jeff
87e29cc117 Merge pull request #129 from deavmi/patch-1
Various fixes
2016-07-19 19:16:11 -04:00
Tristan B. Kildaire
c17d0fb0bb Various fixes
* Added missing period.
* Fixed typo.
2016-07-19 22:46:22 +02:00
Jeff Becker
985863deb2 add fade to post hide/unhide 2016-07-18 11:12:47 -04:00
Jeff Becker
a9d2c0425d have post hiding persist in localstorage 2016-07-18 10:44:18 -04:00
Jeff Becker
76cb2341ce add hr to post for reply hider 2016-07-18 09:59:53 -04:00
Jeff Becker
ceb6f09a3f update 2016-07-18 09:50:40 -04:00
Jeff Becker
adf3540556 * add hide-post.js
* disable cuckoo_miner.js
2016-07-18 09:49:44 -04:00
Jeff Becker
2ce8a38b0b update css 2016-07-18 08:26:41 -04:00
Jeff Becker
e62d959b0b remove title from post no 2016-07-18 08:17:48 -04:00
Jeff Becker
4216a777a3 fix name field in post.mustache 2016-07-18 08:13:27 -04:00
Jeff Becker
5873b41e00 add hr to separate post header from post body 2016-07-18 08:11:10 -04:00
Jeff Becker
14635e9472 have postreply class float right 2016-07-18 08:08:03 -04:00
Jeff Becker
422f3de11d add postreply class to div for future css 2016-07-18 08:04:58 -04:00
Jeff Becker
64b5531fed change post.mustache format to be "better" 2016-07-18 08:02:42 -04:00
Jeff Becker
17f3b25e51 fixes 2016-07-18 07:57:25 -04:00
Jeff Becker
60f0c19a9f update all 2016-07-18 07:51:15 -04:00
Jeff Becker
f4f2479b8a fix 2016-07-17 11:34:39 -04:00
Jeff Becker
3506d7f975 try fixing liveui 2016-07-17 11:28:49 -04:00
Jeff Becker
9acca366d0 livechan post via ajax not websocket 2016-07-17 11:23:15 -04:00
Jeff Becker
70fd791545 fix 2016-07-13 09:17:20 -04:00
Jeff Becker
9f3c41fb0b more theme tweaks 2016-07-13 09:16:34 -04:00
Jeff Becker
2ff6088605 fix typo 2016-07-13 09:15:39 -04:00
Jeff Becker
54644e0da2 more theme updates / unborking 2016-07-13 09:14:39 -04:00
Jeff Becker
dbd05c30c3 update dayman theme 2016-07-13 09:02:26 -04:00
Jeff Becker
587cdf4e75 fix tomorrow theme 2016-07-13 09:00:24 -04:00
Jeff Becker
76d75b260f update css for livechan 2016-07-11 14:48:33 -04:00
Jeff Becker
35ff3759f4 revert 2016-07-10 07:07:36 -04:00
Jeff Becker
671db6e483 update livechan.js 2016-07-10 07:05:19 -04:00
Jeff Becker
32566bfd84 fixes for liveui 2016-07-09 15:39:35 -04:00
Jeff Becker
4b02ad6d89 don't default to random, default to ukko 2016-07-09 14:51:31 -04:00
Jeff Becker
a5c2f8d86f update livechan for ukko view 2016-07-09 14:48:06 -04:00
Jeff Becker
6e1e7440dc update livechan css 2016-07-08 08:55:09 -04:00
Jeff Becker
0b460eeb5d fix css 2016-07-08 08:52:10 -04:00
Jeff Becker
2a32bb75d5 fix captcha css 2016-07-08 08:50:31 -04:00
Jeff Becker
cf91d8ffa5 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-07-08 08:48:10 -04:00
Jeff Becker
375713390e switch livechan.css to use dark theme 2016-07-08 08:47:46 -04:00
Jeff
f823b0e612 Merge pull request #127 from deavmi/patch-1
Update srnd.md
2016-07-07 19:29:25 -04:00
Tristan B. Kildaire
cb1821189a Update srnd.md 2016-07-07 19:04:19 +02:00
Jeff Becker
1a5862213c Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-07-06 13:37:13 -04:00
Jeff Becker
96c019324d update ukko template to point livechan link to livechan 2016-07-06 13:36:50 -04:00
Jeff
1e905b6bbf Merge pull request #126 from wzeth/patch-12
update definitions for allow_anon*
2016-07-06 12:40:45 -04:00
wzeth
7c6726b5fc update definitions for allow_anon*
I have 40% confidence this is correct :v)
2016-07-06 12:35:34 -04:00
Jeff Becker
24d18ff599 hide captcha by default 2016-07-06 08:12:56 -04:00
Jeff Becker
16d0489cd7 don't show captcha on first start 2016-07-06 08:05:31 -04:00
Jeff Becker
5875347966 focus on new threads in liveui 2016-07-06 07:59:13 -04:00
Jeff Becker
b2c1d9eb26 unscrewup reconnect 2016-07-05 20:43:36 -04:00
Jeff Becker
a0bc39aaa5 expire old convos 2016-07-05 19:22:08 -04:00
Jeff Becker
b887d07172 default to overchan.random for livechan 2016-07-05 17:46:34 -04:00
Jeff Becker
1f48c58f6b fix css for livechan file input 2016-07-05 17:39:40 -04:00
Jeff Becker
e8eec5862f lower padding for chat input widget 2016-07-05 13:09:56 -04:00
Jeff Becker
bf7213bf09 position fixed 2016-07-05 12:59:36 -04:00
Jeff Becker
b2201c4ef7 add subjects 2016-07-05 12:58:13 -04:00
Jeff Becker
a4747b9965 various fixes 2016-07-05 12:45:28 -04:00
Jeff Becker
5ec4c823fe fix css for firefox 2016-07-05 12:28:37 -04:00
Jeff Becker
00d0be952f position fixed 2016-07-05 12:19:40 -04:00
Jeff Becker
c448777fe9 update livechan template 2016-07-05 12:16:32 -04:00
Jeff Becker
30b54c17fa document -> document.body 2016-07-05 12:14:52 -04:00
Jeff Becker
e954c57da6 fix up livechan template 2016-07-05 12:13:48 -04:00
Jeff Becker
d5d30893e5 livechan fixes 2016-07-05 10:11:58 -04:00
Jeff Becker
72947dbbcc update livechan to be aware of convos 2016-07-05 09:53:23 -04:00
Jeff Becker
1c632666ab update livechan 2016-07-05 08:17:19 -04:00
Jeff Becker
5cf12f37a5 meh this should work for livechan ui 2016-07-04 15:48:40 -04:00
Jeff Becker
9c038021b5 update rollover in livechan 2016-07-04 12:50:00 -04:00
Jeff Becker
4a8861761d update livechan to allow attachments 2016-07-04 11:52:43 -04:00
Jeff Becker
13e0010419 update rollover in livechan ui 2016-07-04 11:28:10 -04:00
Jeff Becker
e461462bd6 actually fix thumbnails 2016-07-04 10:43:08 -04:00
Jeff Becker
8101e67b10 fix thumbnailing 2016-07-04 10:40:09 -04:00
Jeff Becker
63edd14243 fix date error 2016-07-04 10:36:10 -04:00
Jeff Becker
d2142f7c83 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-07-04 10:13:52 -04:00
Jeff Becker
28b1864841 add new livechan ui 2016-07-04 10:12:03 -04:00
Jeff
5fa1e76971 Merge pull request #125 from wzeth/patch-11
document archive in [nntp]
2016-07-04 07:16:14 -04:00
wzeth
40eeb116de document archive in [nntp] 2016-07-04 02:27:56 -04:00
ring
a502259ba9 Quote variables, remove trailing whitespace
If you don't quote your variables the scripts get very buggy if you run
them with arguments with spaces in them, or even run them from a
directory with spaces in its path.
2016-07-02 23:30:03 +02:00
Jeff
cac18a5e44 Merge pull request #124 from deavmi/master
Update README.md
2016-07-02 08:32:25 -04:00
Tristan B. Kildaire
c86f573440 Update README.md 2016-07-02 14:15:59 +02:00
Jeff Becker
6f5130d8fd Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-06-30 09:01:31 -04:00
Jeff Becker
17b8101349 update livechan.js and stylesheets 2016-06-30 09:01:11 -04:00
Jeff
5e53ae6f04 Merge pull request #122 from deavmi/patch-1
Can I put this here?
2016-06-30 06:50:12 -04:00
Tristan B. Kildaire
50c395aad4 Update TODO.md 2016-06-30 12:48:05 +02:00
Jeff
18bf12e556 Merge pull request #118 from deavmi/patch-2
Create thunderbird-newsreader-configuration.md
2016-06-30 06:46:19 -04:00
Jeff
bc1c038468 Merge pull request #117 from deavmi/patch-1
Create pan-newsreader-configuration.md
2016-06-30 06:46:08 -04:00
Jeff
7117a25f9a Merge pull request #116 from deavmi/patch-3
Update configure-newsreader.md
2016-06-30 06:45:50 -04:00
Jeff
ef69bda0d7 Merge pull request #120 from deavmi/patch-5
Update README.md
2016-06-30 06:45:36 -04:00
Jeff
ab6ac43851 Merge pull request #121 from deavmi/patch-6
Update README.md
2016-06-30 06:45:28 -04:00
Jeff
28feb5a84e Merge pull request #119 from deavmi/patch-4
Update fr-FR.ini
2016-06-30 06:44:26 -04:00
Tristan B. Kildaire
9e3e0cc443 Update README.md 2016-06-30 11:40:19 +02:00
Tristan B. Kildaire
c573fb646b Update README.md 2016-06-30 11:37:47 +02:00
Tristan B. Kildaire
93b3e0f83f Update fr-FR.ini 2016-06-30 11:35:23 +02:00
Tristan B. Kildaire
7dda235ab1 Update configure-newsreader.md 2016-06-30 11:32:39 +02:00
Tristan B. Kildaire
09e7969479 Create thunderbird-newsreader-configuration.md 2016-06-30 11:32:37 +02:00
Tristan B. Kildaire
cb37a45b67 Create pan-newsreader-configuration.md 2016-06-30 11:32:36 +02:00
Jeff Becker
e25d6ab370 remove unneeded css rule 2016-06-20 15:11:05 -04:00
Jeff Becker
e2194d3fbd fix css so that inline expand of images works 2016-06-20 13:05:36 -04:00
Jeff
fdc4234d08 Merge pull request #113 from wzeth/patch-9
document feeds.d
2016-06-20 12:58:06 -04:00
wzeth
0c0160da6d Update srnd.md 2016-06-20 11:21:46 -04:00
wzeth
fd82218e5f doucment feeds.d 2016-06-20 11:18:19 -04:00
Jeff Becker
091d74af52 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-06-20 09:38:10 -04:00
Jeff Becker
e690b7dd9c add feeds.d directory 2016-06-20 09:37:57 -04:00
Jeff
a856af693f Merge pull request #112 from wzeth/patch-8
document SRND_FEEDS_INI_PATH environment variable
2016-06-20 07:47:24 -04:00
Jeff
3668eb7822 Merge pull request #111 from wzeth/patch-7
document SRND_INI_PATH environment variable
2016-06-20 07:47:09 -04:00
wzeth
3cc04a6cad document SRND_FEEDS_INI_PATH environment variable 2016-06-20 10:09:24 +00:00
wzeth
e6967a75e7 document custom config locations 2016-06-20 09:59:03 +00:00
Jeff
679ee50342 Merge pull request #109 from wzeth/patch-6
clarified anon_nntp and pprof
2016-06-19 07:00:18 -04:00
wzeth
b73c219e6b clarified anon_nntp and pprof 2016-06-19 01:12:33 -04:00
Jeff
1b474af875 Merge pull request #108 from wzeth/patch-5
document frontend minimize_html feature
2016-06-17 11:09:28 -04:00
wzeth
77a72c5770 document frontend minimize_html feature 2016-06-17 12:51:00 +00:00
Jeff Becker
a52fe21743 add id='current_theme' to fix board list css themes not applying 2016-06-16 16:18:59 -04:00
Jeff Becker
42c70990a0 update bloodgod.css, thanks ano^ 2016-06-16 16:12:54 -04:00
Jeff
0980903b6e Merge pull request #106 from wzeth/patch-4
Debian 8.5 install guide
2016-06-15 08:44:17 -04:00
wzeth
47737dd205 Update building-debian8.5.md
set a title and backtick some directories and commands
2016-06-15 10:33:10 +00:00
wzeth
a22330f920 added links to the setup guide 2016-06-15 10:30:51 +00:00
wzeth
05b4695398 Update and rename debian8.5-step-by-step.md to building-debian8.5.md
Made things a little more concise. I removed ffmpeg in favor of libav-tools because it is available in the default repositories.
2016-06-15 10:19:43 +00:00
Jeff Becker
415fb3c4a8 merge 2016-06-14 22:37:41 -04:00
Jeff Becker
5138c31e58 update node list 2016-06-14 22:37:22 -04:00
Jeff
052259c9d1 Merge pull request #105 from wzeth/patch-3
add missing command
2016-06-13 11:47:11 -04:00
wzeth
7276e28bb7 add missing command 2016-06-13 02:21:57 -04:00
Jeff Becker
2adf2d5127 update 2016-06-12 14:19:07 -04:00
Jeff Becker
242094193f fix typo 2016-06-12 13:55:07 -04:00
Jeff Becker
2ffc7a80e6 update css 2016-06-12 13:54:31 -04:00
Jeff Becker
3da1ab157d update css 2016-06-12 13:52:24 -04:00
Jeff Becker
17d2654f26 update css 2016-06-12 13:50:38 -04:00
Jeff Becker
f155b0e9a1 update style 2016-06-12 13:46:28 -04:00
Jeff Becker
c97296700f include gchan.xyz in node list 2016-06-12 12:38:08 -04:00
Jeff
3951432bad Merge pull request #104 from wzeth/patch-2
Step-by-step for Debian 8.5
2016-06-12 08:25:08 -04:00
Jeff
da5c44d4fd Merge pull request #103 from wzeth/patch-1
SystemD Service
2016-06-12 08:24:59 -04:00
wzeth
a35889ca18 Step-by-step for Debian 8.5
This will help users with a step-by-step guide to installing. I will try to make this into a script or something one day.
2016-06-12 06:27:53 -04:00
wzeth
c171e62d52 oops made a typo 2016-06-12 05:37:19 -04:00
wzeth
75a3cf5ede systemd service file for nntpchan
Assumptions made:
1. The user has a redis_6379.service
2. The user is using /opt/nntpchan as the working directory for the srndv2
2016-06-12 05:36:05 -04:00
wzeth
2d25b349f7 Oops wrong dir 2016-06-12 05:34:59 -04:00
wzeth
29149eb452 Systemd service file
Here is an example systemd config.

It makes some assumptions:
1. The user has a systemd service called redis_6379.service (the redis install utils have this as default).
2. srndv2 is contained in /opt/nntpchan
2016-06-12 05:29:43 -04:00
Jeff
57232aeaf0 Merge pull request #102 from deavmi/patch-1
Previous link was broken but I have a new link.
2016-06-10 17:53:05 -04:00
Tristan B. Kildaire
2ced2b73c7 Previous link was broken but I have a new link. 2016-06-10 20:45:36 +02:00
Jeff
0dce01cd6d Merge pull request #101 from deavmi/patch-1
Bug fix.
2016-06-09 11:12:10 -04:00
Tristan B. Kildaire
5d05f62db5 Bug fix. 2016-06-09 07:17:53 +02:00
Jeff Becker
fe9de25dcd remove .trash directory 2016-06-05 15:48:11 -04:00
Jeff
2c2bfce762 Merge pull request #100 from deavmi/master
Minor imporvements
2016-06-05 14:47:05 -04:00
Tristan B. Kildaire (Mobile)
68bc36c0db 2016-06-05 17:53:47 +02:00
Jeff
5c353e94f0 Merge pull request #97 from deavmi/patch-2
Update README.md
2016-06-05 08:01:31 -04:00
Tristan B. Kildaire
d1d2ade366 Update README.md 2016-06-05 14:00:41 +02:00
Jeff
a007f314e8 Merge pull request #95 from deavmi/master
Getting things ready for #primetime - Documentation Bulk Fixes 1
2016-06-05 08:00:10 -04:00
Tristan B. Kildaire
9728cf697b Update .gitignore 2016-06-05 13:59:18 +02:00
Tristan B. Kildaire
67cd4ab112 Update configure-postgres.md 2016-06-05 13:37:22 +02:00
Tristan B. Kildaire
435bfa17d5 Rename install-and-configure-postgres.md to configure-postgres.md 2016-06-05 13:32:04 +02:00
Tristan B. Kildaire
b9373e44a1 Update setting-up.md 2016-06-05 13:31:46 +02:00
Tristan B. Kildaire
00153e3957 Rename install-and-configure-redis.md to configure-redis.md 2016-06-05 13:30:58 +02:00
Tristan B. Kildaire
588e19e93c Update install-and-configure-redis.md 2016-06-05 13:30:26 +02:00
Tristan B. Kildaire
e9592b6021 Create Configuring Redis database 2016-06-05 13:30:24 +02:00
Tristan B. Kildaire
42ef4c4df1 Update install-and-configure-postgres.md 2016-06-05 13:29:43 +02:00
Tristan B. Kildaire
dbb119bd8b Create Configuring Postgres database 2016-06-05 13:29:23 +02:00
Tristan B. Kildaire
9e3e597088 Update building.md 2016-06-05 13:28:44 +02:00
Tristan B. Kildaire
e50099b7c0 Update building.md 2016-06-05 13:28:08 +02:00
Tristan B. Kildaire
55baec7af7 Update building.md 2016-06-05 13:27:16 +02:00
Tristan B. Kildaire
4ab24625fa Update building.md 2016-06-05 13:25:33 +02:00
Tristan B. Kildaire
1eed2cdd1a Update setting-up.md 2016-06-05 13:24:23 +02:00
Tristan B. Kildaire
43a81a6a4d Delete database.md 2016-06-05 13:22:23 +02:00
Tristan B. Kildaire
43dcbad33c Update README.md 2016-06-05 13:21:48 +02:00
Tristan B. Kildaire
89b51773eb Update building.md 2016-06-05 13:20:20 +02:00
Tristan B. Kildaire
47b722a825 Update building.md 2016-06-05 13:19:27 +02:00
Tristan B. Kildaire
76b6bad8a5 Update building.md 2016-06-05 13:18:58 +02:00
Tristan B. Kildaire
648b66cbbe Update building.md 2016-06-05 13:17:28 +02:00
Tristan B. Kildaire
1f2c644bf6 Update building.md 2016-06-05 13:16:22 +02:00
Tristan B. Kildaire
8aed629be6 Update building.md 2016-06-05 13:15:37 +02:00
Tristan B. Kildaire
9042f0f3b0 Update building.md 2016-06-05 13:13:14 +02:00
Tristan B. Kildaire
a425ffea8f Update building.md 2016-06-05 13:11:16 +02:00
Tristan B. Kildaire
a4a4eb7c2a Update srnd.go 2016-06-05 12:59:26 +02:00
Tristan B. Kildaire
a01d5b0cee Update README.md 2016-06-05 12:13:10 +02:00
Tristan B. Kildaire
9f8ce5ab95 Update cli.md 2016-06-05 12:12:05 +02:00
Tristan B. Kildaire
880d1e10e3 Update running.md 2016-06-05 12:11:40 +02:00
Tristan B. Kildaire
ff745ada70 Update running.md 2016-06-05 12:11:04 +02:00
Tristan B. Kildaire
68d7ec783d Update running.md 2016-06-05 12:08:52 +02:00
Tristan B. Kildaire
a17f91fea1 Update README.md 2016-06-05 12:08:36 +02:00
Tristan B. Kildaire
c5cf5ba4f9 Rename doc/configure-newsreader.md to doc/extras/configure-newsreader.md 2016-06-05 12:08:21 +02:00
Tristan B. Kildaire
9f9bebf99c Update setting-up.md 2016-06-05 12:07:22 +02:00
Tristan B. Kildaire
6ea1b2d3b4 Update setting-up.md 2016-06-05 12:06:25 +02:00
Tristan B. Kildaire
acc727b901 Update setting-up.md 2016-06-05 12:05:21 +02:00
Tristan B. Kildaire
594cc4929a Update setting-up.md 2016-06-05 12:04:55 +02:00
Tristan B. Kildaire
e0f15b73fb Rename doc/configuration-files.md to doc/.trash/configuration-files.md 2016-06-05 12:04:22 +02:00
Tristan B. Kildaire
0ac0d7d1ff Update building.md 2016-06-05 12:02:31 +02:00
Tristan B. Kildaire
9a6a4247ce Update README.md 2016-06-05 12:00:46 +02:00
Tristan B. Kildaire
22e384f2d1 Update install-and-configure-redis.md 2016-06-05 11:58:50 +02:00
Tristan B. Kildaire
7c668c5184 Update install-and-configure-postgres.md 2016-06-05 11:58:38 +02:00
Tristan B. Kildaire
91b6dbe9b2 Update setting-up.md 2016-06-05 11:58:12 +02:00
Tristan B. Kildaire
21566eb0d9 Update setting-up.md 2016-06-05 11:57:49 +02:00
Tristan B. Kildaire
cc382572c6 Update setting-up.md 2016-06-05 11:57:37 +02:00
Tristan B. Kildaire
6e029cea0d Update README.md 2016-06-05 11:39:43 +02:00
Tristan B. Kildaire
c92b78c754 Rename configuration.md to configuration-files.md 2016-06-05 11:38:25 +02:00
Tristan B. Kildaire
32eae178fb Update README.md 2016-06-05 11:37:55 +02:00
Tristan B. Kildaire
8a1936fade Update README.md 2016-06-05 11:37:33 +02:00
Tristan B. Kildaire
edd44c73bf Update README.md 2016-06-05 11:36:30 +02:00
Tristan B. Kildaire
b3d346c61f Update README.md 2016-06-05 11:36:12 +02:00
Tristan B. Kildaire
ef124fe7f2 Update README.md 2016-06-05 11:36:04 +02:00
Tristan B. Kildaire
38f9db2f57 Update README.md 2016-06-05 11:35:42 +02:00
Tristan B. Kildaire
e45c172e62 Update README.md 2016-06-05 11:35:34 +02:00
Tristan B. Kildaire
705f3b9df0 Update README.md 2016-06-05 11:35:14 +02:00
Tristan B. Kildaire
1f4e6c8ecb Update README.md 2016-06-05 11:34:54 +02:00
Tristan B. Kildaire
0831c250c4 Rename doc/trash/database.md to doc/.trash/database.md 2016-06-05 11:34:06 +02:00
Tristan B. Kildaire
ecb462c0c3 Update README.md 2016-06-05 11:33:29 +02:00
Tristan B. Kildaire
6092f4e78e Update and rename doc/protocol.md to doc/developer/protocol.md 2016-06-05 11:33:08 +02:00
Tristan B. Kildaire
316729774a Update and rename doc/api.md to doc/developer/api.md 2016-06-05 11:33:06 +02:00
Tristan B. Kildaire
c4f8fd118d Update install-and-configure-redis.md 2016-06-05 11:31:08 +02:00
Tristan B. Kildaire
543108e0d6 Update setting-up.md 2016-06-05 11:30:20 +02:00
Tristan B. Kildaire
6631b881b0 Rename doc/securing-redis.md to doc/database/redis/securing-redis.md 2016-06-05 11:30:00 +02:00
Tristan B. Kildaire
2d39c33f05 Rename doc/install-and-configure-postgres.md to doc/database/postgres/install-and-configure-postgres.md 2016-06-05 11:30:00 +02:00
Tristan B. Kildaire
b32ff7b6ac Rename doc/install-and-configure-redis.md to doc/database/redis/install-and-configure-redis.md 2016-06-05 11:29:59 +02:00
Tristan B. Kildaire
9583b80ac5 Rename postgres.md to install-and-configure-postgres.md 2016-06-05 11:29:14 +02:00
Tristan B. Kildaire
71b46ef1f2 Update setting-up.md 2016-06-05 11:29:01 +02:00
Tristan B. Kildaire
5f0a353482 Rename redis.md to install-and-configure-redis.md 2016-06-05 11:28:37 +02:00
Tristan B. Kildaire
6eb84bf55e Update and rename doc/database.md to doc/trash/database.md 2016-06-05 11:28:08 +02:00
Tristan B. Kildaire
e057ee1812 Update setting-up.md 2016-06-05 11:27:37 +02:00
Tristan B. Kildaire
279e9c18c9 Update setting-up.md 2016-06-05 11:26:57 +02:00
Tristan B. Kildaire
191dbc860c Update setting-up.md 2016-06-05 11:26:03 +02:00
Tristan B. Kildaire
a9403410c8 Update feeds.md 2016-06-05 11:24:13 +02:00
Tristan B. Kildaire
6e2f245f24 Update configuration.md 2016-06-05 11:23:09 +02:00
Tristan B. Kildaire
6d20a991f8 Update redis.md 2016-06-05 11:20:25 +02:00
Tristan B. Kildaire
d20de6b9b5 Update postgres.md 2016-06-05 11:20:06 +02:00
Tristan B. Kildaire
fbb14cc719 Update redis.md 2016-06-05 11:19:53 +02:00
Tristan B. Kildaire
6bb1f4978e Update postgres.md 2016-06-05 11:19:52 +02:00
Tristan B. Kildaire
40d372efe3 Update postgres.md 2016-06-05 11:18:46 +02:00
Tristan B. Kildaire
51672e81c3 Update redis.md 2016-06-05 11:18:34 +02:00
Tristan B. Kildaire
5b06abe63d Update postgres.md 2016-06-05 11:17:58 +02:00
Tristan B. Kildaire
8ebe2d2d26 Update redis.md 2016-06-05 11:15:56 +02:00
Tristan B. Kildaire
b020d13304 Update postgres.md 2016-06-05 11:15:51 +02:00
Tristan B. Kildaire
aa9ae3d32f Update redis.md 2016-06-05 11:15:25 +02:00
Tristan B. Kildaire
53046ad1d2 Update postgres.md 2016-06-05 11:14:19 +02:00
Tristan B. Kildaire
a851eddccf Update redis.md 2016-06-05 10:27:14 +02:00
Tristan B. Kildaire
a2c33bc649 Update README.md 2016-06-05 10:24:31 +02:00
Tristan B. Kildaire
e868b2c73b Update README.md 2016-06-05 10:13:04 +02:00
Tristan B. Kildaire
4de2b15959 Update srnd.md 2016-06-05 10:12:50 +02:00
Tristan B. Kildaire
a57a3b283c Create configure-newsreader.md 2016-06-05 10:12:42 +02:00
Tristan B. Kildaire
b9efd55a57 Update running.md 2016-06-05 10:12:22 +02:00
Tristan B. Kildaire
87097b7a06 Update README.md 2016-06-05 10:12:09 +02:00
Jeff
c50aecc34d Merge pull request #88 from deavmi/patch-1
Update srnd.md
2016-06-04 15:27:06 -04:00
Tristan B. Kildaire
74e0d479a6 Update srnd.md 2016-06-04 21:26:19 +02:00
Tristan B. Kildaire
4420a65dfd Update srnd.md 2016-06-04 21:26:04 +02:00
Jeff
b73ad00865 Merge pull request #87 from deavmi/patch-1
Update README.md
2016-06-04 15:25:41 -04:00
Tristan B. Kildaire
945e609dff Update README.md 2016-06-04 21:25:14 +02:00
Jeff
2c63c3d0ad Merge pull request #82 from deavmi/patch-4
Better name.
2016-06-04 15:12:48 -04:00
Jeff
c86d58a44b Merge pull request #83 from deavmi/patch-5
Rename config.md to setting-up.md
2016-06-04 15:12:37 -04:00
Jeff
12ae47b9b6 Merge pull request #85 from deavmi/master
Some changes
2016-06-04 15:11:24 -04:00
Tristan B. Kildaire
27e19f3591 Update README.md 2016-06-04 21:10:17 +02:00
Tristan B. Kildaire
50a8ddd458 Update README.md 2016-06-04 21:09:13 +02:00
Tristan B. Kildaire
5690e80758 Update running.md 2016-06-04 21:08:58 +02:00
Tristan B. Kildaire
489b21fd04 Update README.md 2016-06-04 21:04:48 +02:00
Tristan B. Kildaire
f9b08aa467 Rename build.md to building.md 2016-06-04 21:04:46 +02:00
Tristan B. Kildaire
85938d1f6b Merge pull request #1 from majestrate/master
f
2016-06-04 21:02:54 +02:00
Jeff
a1d02708fa Merge pull request #80 from deavmi/patch-2
My eyes are bleeding from using GitHub's white-white editor
2016-06-04 15:01:59 -04:00
Tristan B. Kildaire
f3f051fbf1 Rename config.md to setting-up.md 2016-06-04 21:00:59 +02:00
Jeff
d078e58774 Merge pull request #81 from deavmi/patch-3
Looks better
2016-06-04 15:00:42 -04:00
Tristan B. Kildaire
d8ecf670d5 Rename build.md to building.md 2016-06-04 20:59:39 +02:00
Tristan B. Kildaire
1bd84c839e Update srnd.md 2016-06-04 20:59:04 +02:00
Tristan B. Kildaire
5bfa14ba1a Update protocol.md 2016-06-04 20:57:52 +02:00
Jeff
7d258d9f3b Merge pull request #78 from deavmi/patch-2
Create README.md
2016-06-04 14:37:38 -04:00
Jeff
57d8fd4841 Merge pull request #77 from deavmi/patch-1
Update config.md
2016-06-04 14:37:33 -04:00
Tristan B. Kildaire
a8653a472e Create README.md 2016-06-04 20:34:07 +02:00
Tristan B. Kildaire
45c0cf142d Update config.md 2016-06-04 20:32:26 +02:00
Jeff
f53d9b8a5b Merge pull request #74 from deavmi/patch-2
Update README.md
2016-06-04 14:28:42 -04:00
Tristan B. Kildaire
42ea131dff Update README.md 2016-06-04 20:27:32 +02:00
Jeff
57ca993189 Merge pull request #71 from deavmi/patch-1
Work in progress afrikaans translations
2016-06-04 14:25:32 -04:00
Jeff
9d4b43c7e9 Merge pull request #73 from deavmi/patch-2
Create fr-FR.ini
2016-06-04 14:24:35 -04:00
Jeff
8802d5feef Merge pull request #70 from deavmi/master
add more documentation
2016-06-04 14:23:13 -04:00
Tristan B. Kildaire
b8d58ab3e3 Update fr-FR.ini 2016-06-04 19:59:32 +02:00
Tristan B. Kildaire
00e2e4d03d Create fr-FR.ini 2016-06-04 19:57:13 +02:00
Tristan B. Kildaire
9ed02e4df0 Work in progress afrikaans translations 2016-06-04 19:54:03 +02:00
d
59a8e244a0 Nicer ending message. 2016-06-04 19:41:26 +02:00
d
3bd9e85682 : 2016-06-04 19:37:04 +02:00
Tristan B. Kildaire
3749445531 Update cli.md 2016-06-04 19:25:22 +02:00
Tristan B. Kildaire
5337fea89f Update cli.md 2016-06-04 19:25:06 +02:00
Tristan B. Kildaire
77e1f16624 Update cli.md 2016-06-04 19:24:12 +02:00
Tristan B. Kildaire
28b8c5059c Update securing-redis.md 2016-06-04 18:57:21 +02:00
Tristan B. Kildaire
285f5c271a Update config.md 2016-06-04 18:07:40 +02:00
Tristan B. Kildaire
e143a78e20 Update config.md 2016-06-04 18:04:17 +02:00
Tristan B. Kildaire
b9905ebae4 Update config.md 2016-06-04 18:01:40 +02:00
Tristan B. Kildaire
89dee3b72d Update config.md 2016-06-04 18:00:27 +02:00
Tristan B. Kildaire
18ea50ab18 Update config.md 2016-06-04 17:59:54 +02:00
Tristan B. Kildaire
1fb23dd34a Update config.md 2016-06-04 17:56:17 +02:00
Tristan B. Kildaire
6ce938b86a Update config.md 2016-06-04 17:55:50 +02:00
Tristan B. Kildaire
a853409230 Update config.md 2016-06-04 17:55:01 +02:00
Tristan B. Kildaire
cfeb11b545 Update config.md 2016-06-04 17:51:21 +02:00
Tristan B. Kildaire
963b893e39 Update config.md 2016-06-04 17:51:07 +02:00
Tristan B. Kildaire
a75c22aecb Update config.md 2016-06-04 17:50:46 +02:00
Tristan B. Kildaire
ca2d87e303 Update config.md 2016-06-04 17:50:02 +02:00
Tristan B. Kildaire
bf143f07f7 Update config.md 2016-06-04 17:45:22 +02:00
Tristan B. Kildaire
850e61d923 Update config.md 2016-06-04 17:44:32 +02:00
Tristan B. Kildaire
c5937bc3f7 Update config.md 2016-06-04 17:44:10 +02:00
Tristan B. Kildaire
4436c62fe2 Update config.md 2016-06-04 17:43:05 +02:00
Tristan B. Kildaire
71bb46cb5b Update README.md 2016-06-04 17:40:16 +02:00
Tristan B. Kildaire
f06daf111a Update README.md 2016-06-04 17:40:09 +02:00
Tristan B. Kildaire
93434f3bf6 Update README.md 2016-06-04 17:39:34 +02:00
Tristan B. Kildaire
90aaad39bf Create config.md 2016-06-04 17:36:26 +02:00
Tristan B. Kildaire
8492cc35fa Update build.md 2016-06-04 17:35:00 +02:00
Tristan B. Kildaire
5087a0de7a Update build.md 2016-06-04 17:34:43 +02:00
Tristan B. Kildaire
dfe6eae59f Update build.md 2016-06-04 17:32:57 +02:00
Tristan B. Kildaire
030a9e58e8 Update build.md 2016-06-04 17:31:24 +02:00
Tristan B. Kildaire
7a73cf3d55 Update build.md 2016-06-04 17:28:24 +02:00
Tristan B. Kildaire
8e1eb8620c Update build.md 2016-06-04 17:27:39 +02:00
Tristan B. Kildaire
546f4d413f Create securing-redis.md 2016-06-04 17:26:36 +02:00
Tristan B. Kildaire
aa04d1d3ba Update build.md 2016-06-04 17:18:14 +02:00
Tristan B. Kildaire
27eae6750c Update build.md 2016-06-04 17:18:03 +02:00
Tristan B. Kildaire
3174aaad22 Update build.md 2016-06-04 17:17:54 +02:00
Tristan B. Kildaire
89c4fe4a96 Update build.md 2016-06-04 17:16:55 +02:00
Tristan B. Kildaire
4f204fd873 Update build.md 2016-06-04 17:16:08 +02:00
Tristan B. Kildaire
7612b629ad Update README.md 2016-06-04 17:11:06 +02:00
Tristan B. Kildaire
0d5b0ddb0b Update README.md 2016-06-04 17:09:35 +02:00
Tristan B. Kildaire
b41d2fa532 Update README.md 2016-06-04 17:08:46 +02:00
Tristan B. Kildaire
52239bebc3 Update README.md 2016-06-04 17:08:25 +02:00
Jeff
a7a97709fe Merge pull request #68 from ZiRo-/master
add filenames to images
2016-05-22 17:54:26 -04:00
ZiRo
e0789c8f90 add filenames to images 2016-05-22 22:51:26 +02:00
Jeff
c5e90ec550 Merge pull request #67 from ZiRo-/master
add download link for files with original filename
2016-05-22 15:17:19 -04:00
ZiRo
6840c28cb8 Merge remote-tracking branch 'upstream/master' 2016-05-22 20:22:31 +02:00
ZiRo
41caf046a0 add download link for files 2016-05-22 20:22:12 +02:00
Jeff
deb5a36c0d Merge pull request #66 from ZiRo-/master
add captcha reload script
2016-05-22 06:03:09 -04:00
ZiRo
920ddb64b3 add captcha reload script 2016-05-22 07:51:12 +02:00
Jeff Becker
af59a38a40 Revert "fix prefixing for overview template"
This reverts commit 8401c5a25d.
2016-05-20 06:25:30 -04:00
Jeff
8bca301e55 Merge pull request #63 from ZiRo-/master
fix prefixing for overview template
2016-05-20 06:12:59 -04:00
ZiRo
8401c5a25d fix prefixing for overview template 2016-05-20 07:03:54 +02:00
Jeff
ab44cb2457 * add generated javascript files to .gitignore
* untrack generated javascript files

* regen generated javascript via build.sh by default
2016-05-18 13:22:56 -04:00
Jeff
e831a56809 move cuckoo-miner building to build-js.sh 2016-05-18 13:16:06 -04:00
Jeff
84cac4ceec Merge pull request #62 from ZiRo-/master
make miner multi threaded
2016-05-18 12:59:07 -04:00
ZiRo
e372893373 make miner multi threaded 2016-05-18 18:54:05 +02:00
Jeff
4f0ae8fec3 Merge pull request #61 from ZiRo-/master
make final adjustments to the siphash function
2016-05-18 10:22:24 -04:00
ZiRo
7f445f81fc make final adjustments to the siphash function 2016-05-18 16:17:41 +02:00
Jeff
28c18afaf9 Merge pull request #60 from ZiRo-/master
use native js function for siphash
2016-05-18 07:59:46 -04:00
ZiRo
6008c94949 use native js function for siphash 2016-05-18 13:41:20 +02:00
Jeff
8dc1218934 Merge pull request #59 from ZiRo-/master
make postform more compact
2016-05-17 17:57:19 -04:00
ZiRo
11204cba16 make postform more compact 2016-05-17 16:33:14 +02:00
Jeff
e3928bc6c2 Merge pull request #58 from ZiRo-/master
add cuckoo miner to postform
2016-05-17 07:52:44 -04:00
ZiRo
c2bd325be6 add miner.js to build.sh 2016-05-17 13:27:29 +02:00
ZiRo
941c4a3a9f indicate mining process 2016-05-17 08:55:21 +02:00
ZiRo
261493af0b add cuckoo miner to postform 2016-05-17 08:24:46 +02:00
Jeff Becker
1791fc475b bump ipfs version 2016-05-15 08:19:03 -04:00
Jeff Becker
de7cec2c43 try another way using build.sh 2016-05-13 10:50:18 -04:00
Jeff Becker
e7c90c647d ammend build.sh to use mv not cp with finished binary 2016-05-13 10:47:56 -04:00
Jeff Becker
9596c1e27e try simpler build.sh 2016-05-13 10:41:51 -04:00
Jeff Becker
c86732ba5c try fixing build.sh 2016-05-13 10:36:56 -04:00
Jeff Becker
2a7c15241f add meaningful message before long pause of gx 2016-05-13 10:29:46 -04:00
Jeff Becker
d2d81ccbd0 try to make build.sh work 2016-05-13 10:16:09 -04:00
Jeff Becker
78a5138409 try using -d flag 2016-05-13 10:14:27 -04:00
Jeff Becker
bdd9ae9ae4 try again 2016-05-13 10:12:58 -04:00
Jeff Becker
a8a98b03fb ugh 2016-05-13 10:12:11 -04:00
Jeff Becker
4a5fd4aba0 try fixing borked build.sh 2016-05-13 10:11:28 -04:00
Jeff Becker
2de7c633d4 tweak build.sh 2016-05-13 10:10:12 -04:00
Jeff Becker
56c72d1d74 use go get instead of go build 2016-05-13 10:06:39 -04:00
Jeff Becker
f3793852a2 try fixing build.sh again 2016-05-13 10:05:49 -04:00
Jeff Becker
382875509b try correcting location of vendor packages 2016-05-13 10:04:04 -04:00
Jeff Becker
5da696d1c8 fix checks for gx and gx-go 2016-05-13 09:56:51 -04:00
Jeff Becker
7f1800a0c6 only obtain gx if we do not have it 2016-05-13 09:52:35 -04:00
Jeff Becker
504c9ae84e fix missing command 2016-05-13 09:51:35 -04:00
Jeff Becker
63a3511c84 remove redundant command 2016-05-13 09:49:48 -04:00
Jeff Becker
309d8e6c45 tweak build.sh 2016-05-13 09:47:01 -04:00
Jeff Becker
403c404ced tweak build.sh 2016-05-13 09:44:14 -04:00
Jeff Becker
133b032f1d tweak build.sh again 2016-05-13 09:38:57 -04:00
Jeff Becker
ac0b171f19 tweak build.sh 2016-05-13 09:37:32 -04:00
Jeff Becker
0e57fe057f update build.sh to use vendor 2016-05-13 09:33:59 -04:00
Jeff Becker
6e4398f0c2 update gx stuffs 2016-05-13 09:30:24 -04:00
Jeff Becker
136a0878af remove mp3 from repo so gx publish doesn't take forever 2016-05-13 09:01:08 -04:00
Jeff Becker
813c00e3ea bump package version 2016-05-13 08:57:29 -04:00
Jeff Becker
d8625a1cb5 update ipfs hashes 2016-05-13 08:49:43 -04:00
Jeff
c7d322c09d fix :^) 2016-05-08 08:36:42 -04:00
Jeff
f7e8359f7b fix typo 2016-05-04 14:03:48 -04:00
Jeff
3283e53c5c show reply box on ukko page 2016-05-04 14:02:04 -04:00
Jeff
fb2b80335e don't show reply box if not created 2016-05-04 13:14:57 -04:00
Jeff
96f6044489 try to make sure e is not null 2016-05-04 13:12:46 -04:00
Jeff
8f1a497f13 update minified 2016-05-04 13:10:55 -04:00
Jeff
272fe26b26 style changes 2016-05-04 13:10:46 -04:00
Jeff
dec1a3e78d add debugging 2016-05-04 13:06:15 -04:00
Jeff
85ce14091a disable replybox on thread and board pages, default to overchan.random for livechand ukko pages 2016-05-04 13:03:32 -04:00
Jeff
faf5071740 add comment 2016-05-03 15:20:08 -04:00
Jeff
aadf8a9bfa remove conflicting css 2016-05-03 15:14:00 -04:00
Jeff
6ccb829fb9 remove unneeded functions 2016-05-03 15:12:11 -04:00
Jeff
3be1c3e081 try fixing style 2016-05-03 15:10:26 -04:00
Jeff
3e20e100f5 fug 2016-05-03 15:08:16 -04:00
Jeff
f227786e33 try fixing drag to move behavior 2016-05-03 15:07:20 -04:00
Jeff
82d71588e9 try fixing undefined behavior 2016-05-03 15:06:00 -04:00
Jeff
521c135498 use stack overflow example 2016-05-03 15:04:38 -04:00
Jeff
ae45d3e516 try fixing drag and drop 2016-05-03 15:02:01 -04:00
Jeff
363bf49799 try fixing undefined behavior on drag 2016-05-03 15:00:58 -04:00
Jeff
8782dffeae fix typo 2016-05-03 15:00:11 -04:00
Jeff
da4e56fe25 add jquery :< 2016-05-03 14:58:57 -04:00
Jeff
eb9a8e5174 try fix 2016-05-03 14:43:42 -04:00
Jeff
bd45322509 try fix 2016-05-03 14:43:23 -04:00
Jeff
2705a111c6 try fix 2016-05-03 14:42:53 -04:00
Jeff
bb748f9a74 try fix 2016-05-03 14:41:51 -04:00
Jeff
1ef0430392 try fix 2016-05-03 14:39:17 -04:00
Jeff
2415c10029 try fix 2016-05-03 14:37:23 -04:00
Jeff
f6f84f25c8 try fix 2016-05-03 14:36:18 -04:00
Jeff
23c4f455d5 try fix 2016-05-03 14:34:40 -04:00
Jeff
b1ebd3826a try fix 2016-05-03 14:33:41 -04:00
Jeff
914c69215e try fix 2016-05-03 14:30:21 -04:00
Jeff
fdb34a7816 try fix 2016-05-03 14:30:06 -04:00
Jeff
21b80ecc8d try fix 2016-05-03 14:29:23 -04:00
Jeff
d0d1bed10a try fix 2016-05-03 14:27:07 -04:00
Jeff
2613c57bf8 try fix 2016-05-03 14:25:32 -04:00
Jeff
43bb6e4c5c try fix 2016-05-03 14:23:45 -04:00
Jeff
7136b176ee try fix 2016-05-03 14:22:10 -04:00
Jeff
7767b6d436 try fix 2016-05-03 14:20:35 -04:00
Jeff
98b2834bd1 try fix 2016-05-03 14:19:16 -04:00
Jeff
d1f540f99a try fix 2016-05-03 14:17:41 -04:00
Jeff
7bdb104fcf try fix 2016-05-03 14:16:15 -04:00
Jeff
9e68e626c9 try fix 2016-05-03 14:13:48 -04:00
Jeff
7df2e6c83b try fix 2016-05-03 14:09:47 -04:00
Jeff
9aca55ec71 try fix 2016-05-03 14:08:58 -04:00
Jeff
9f55486107 try fix 2016-05-03 14:07:48 -04:00
Jeff
4e161a5d70 try fix 2016-05-03 14:06:22 -04:00
Jeff
ee3b067555 try fix 2016-05-03 14:05:27 -04:00
Jeff
64c5b1589b try fix 2016-05-03 14:03:19 -04:00
Jeff
7b3a6329a6 try fix 2016-05-03 14:02:13 -04:00
Jeff
fab83592b7 try fix 2016-05-03 13:59:10 -04:00
Jeff
7b8d229b64 try fix 2016-05-03 13:57:48 -04:00
Jeff
b2d0bfea8c try fix 2016-05-03 13:57:01 -04:00
Jeff
9ce09c34c3 try fix 2016-05-03 13:55:22 -04:00
Jeff
fdd9bab210 try fix 2016-05-03 13:47:28 -04:00
Jeff
ee73b907de try fix 2016-05-03 13:46:32 -04:00
Jeff
27192b0248 try fix 2016-05-03 13:24:49 -04:00
Jeff
45267caa0a try fix 2016-05-03 13:16:36 -04:00
Jeff
f6576aa899 try fix 2016-05-03 13:16:18 -04:00
Jeff
ce8180c804 try fix 2016-05-03 13:15:20 -04:00
Jeff
5375252783 try fix 2016-05-03 13:14:39 -04:00
Jeff
cc5806a035 try fix 2016-05-03 13:13:54 -04:00
Jeff
1fa694282b try fix 2016-05-03 13:09:05 -04:00
Jeff
f94491e38d try fix 2016-05-03 13:08:07 -04:00
Jeff
df4b263f39 try fix 2016-05-03 13:05:45 -04:00
Jeff
3fb94baaca revert to clientX/Y 2016-05-03 13:01:55 -04:00
Jeff
be7831cd10 use shift key for drag 2016-05-03 13:00:41 -04:00
Jeff
7daa0f8520 use screenX/y instead of clientX/y 2016-05-03 12:38:46 -04:00
Jeff
7afd47805a remove stray assignment 2016-05-03 12:35:46 -04:00
Jeff
def0a4a5c5 adgo back to drag events 2016-05-03 12:33:24 -04:00
Jeff
3fdda45425 add debugging and try new method for drag 2016-05-03 12:30:59 -04:00
Jeff
56a345949d try using different drag method for reply box 2016-05-03 12:28:19 -04:00
Jeff
2a08f73db4 use alternative layout in postform for postform_msg 2016-05-03 12:17:08 -04:00
Jeff
52bafb364d update build scripts to work with non-gnu readlink 2016-05-03 12:16:36 -04:00
Jeff
a4c70fe77b rename backlink.js to reply.js 2016-05-03 11:44:08 -04:00
Jeff Becker
58d32b5d1d don't double post 2016-05-01 18:04:43 -04:00
Jeff Becker
a389c8b82d make image expansion case insensitive 2016-05-01 17:56:47 -04:00
Jeff Becker
c8e8ab95cd "" -> null aka, js is shit 2016-05-01 17:48:17 -04:00
Jeff Becker
331fed1731 try blanking out attachments after posting 2016-05-01 17:38:37 -04:00
Jeff Becker
5bcbe255b1 change post success message 2016-05-01 17:27:08 -04:00
Jeff Becker
ba045b6903 show "posting..." message right before posting 2016-05-01 17:25:08 -04:00
Jeff Becker
187eef590d try clearing reply box on success 2016-05-01 10:42:06 -04:00
Jeff Becker
06ff6554d4 return false for onsubmit 2016-05-01 10:34:05 -04:00
Jeff Becker
d217776201 try using onsubmit for reply box form 2016-05-01 10:31:14 -04:00
Jeff Becker
76949151de fix typo 2016-04-30 16:36:21 -04:00
Jeff Becker
a6f418d3a9 try using ctl drag 2016-04-30 16:32:10 -04:00
Jeff Becker
fa27cc64ef fug 2016-04-30 16:29:41 -04:00
Jeff Becker
e042d0fef7 use shift+drag for moving reply box 2016-04-30 16:28:26 -04:00
Jeff Becker
2eefe2e301 use alt+click drag for moving reply box 2016-04-30 16:25:27 -04:00
Jeff Becker
b1c1e4fab3 use prevent default in drag 2016-04-30 16:23:13 -04:00
Jeff Becker
68a83205ab add captcha updating 2016-04-30 16:20:27 -04:00
Jeff Becker
950441ef45 fix variable name 2016-04-30 16:19:08 -04:00
Jeff Becker
e01002ed25 fix posting style 2016-04-30 16:18:08 -04:00
Jeff Becker
9d7eceb927 use appendChild 2016-04-30 16:14:47 -04:00
Jeff Becker
2b28431568 add posting message 2016-04-30 16:12:01 -04:00
Jeff Becker
0df3fe43e0 fix undefined error 2016-04-30 16:11:20 -04:00
Jeff Becker
1a3fe3af66 try fixing bug where reply box exists but doesn't submit 2016-04-30 16:09:59 -04:00
Jeff Becker
6d6ba47b2c try fixing async posting 2016-04-30 16:08:11 -04:00
Jeff Becker
d47d390536 try implementing async post via reply box 2016-04-30 16:03:39 -04:00
Jeff Becker
157d1f8cb9 be aware of screen size 2016-04-30 15:13:52 -04:00
Jeff Becker
5df2ecac0c debug fixes 2016-04-30 15:11:32 -04:00
Jeff Becker
1452be84bf fug 2016-04-30 15:10:15 -04:00
Jeff Becker
d5d005e74b try fix again 2016-04-30 15:09:01 -04:00
Jeff Becker
846fe26ec5 try aligning right 2016-04-30 15:07:56 -04:00
Jeff Becker
940ac4dec0 fuggg 2016-04-30 15:07:07 -04:00
Jeff Becker
3a26c3e38e try to fix movement of reply box 2016-04-30 15:06:12 -04:00
Jeff Becker
0a4a3b4f8a screenX -> screenLeft 2016-04-30 15:05:31 -04:00
Jeff Becker
11f096e195 try fixing movement of reply box 2016-04-30 15:04:53 -04:00
Jeff Becker
02330805e9 try fixing movement of reply window 2016-04-30 15:03:54 -04:00
Jeff Becker
ed5be31c22 try fixing movement 2016-04-30 15:02:09 -04:00
Jeff Becker
d99a222434 add semicolon 2016-04-30 15:01:11 -04:00
Jeff Becker
01bd911084 try fixing oob 2016-04-30 15:00:34 -04:00
Jeff Becker
79ae266424 different initial position 2016-04-30 14:57:57 -04:00
Jeff Becker
e9db85c5b6 add semi-colins, this aint go 2016-04-30 14:57:07 -04:00
Jeff Becker
d82f2e3732 use different method for moveto 2016-04-30 14:56:22 -04:00
Jeff Becker
2d9aac039c enable dragable 2016-04-30 14:54:24 -04:00
Jeff Becker
917b15156c ugh 2016-04-30 14:53:32 -04:00
Jeff Becker
b03b18b05f fix? 2016-04-30 14:52:56 -04:00
Jeff Becker
7527e4c978 try fixing drag to move again 2016-04-30 14:52:19 -04:00
Jeff Becker
702dcf7997 try making not dragable 2016-04-30 14:49:09 -04:00
Jeff Becker
5cd2c3d43a more fixes in drag to move 2016-04-30 14:48:30 -04:00
Jeff Becker
3e4d128b9c fix 2016-04-30 14:46:05 -04:00
Jeff Becker
ecb223ebc4 try fixing drag to move for reply box 2016-04-30 14:44:06 -04:00
Jeff Becker
61e390daf0 add logging 2016-04-30 13:32:38 -04:00
Jeff Becker
4264004eaf fix x,y 2016-04-30 13:31:57 -04:00
Jeff Becker
ac4eb96a69 add px to style 2016-04-30 13:31:03 -04:00
Jeff Becker
d59cb4f9a8 again 2016-04-30 13:28:59 -04:00
Jeff Becker
ad1ff687f6 try fixing drag to move 2016-04-30 13:27:54 -04:00
Jeff Becker
480c40ce4f try fixing drag to move 2016-04-30 13:26:42 -04:00
Jeff Becker
a1142aa670 again 2016-04-30 13:25:29 -04:00
Jeff Becker
6fddac0245 try fixing drag to move 2016-04-30 13:24:13 -04:00
Jeff Becker
531da63e7b try fixing drag to move 2016-04-30 13:22:17 -04:00
Jeff Becker
d52a63586f update drag to move for post form 2016-04-30 13:19:34 -04:00
Jeff Becker
3710ed884e start adding move by drag to reply box 2016-04-30 13:18:17 -04:00
Jeff Becker
9019bf2e9a update reply box css 2016-04-30 13:10:04 -04:00
Jeff Becker
de6d2964f9 update reply box 2016-04-30 13:09:40 -04:00
Jeff Becker
12f5e67bb4 css update 2016-04-30 13:08:38 -04:00
Jeff Becker
b71d62ca35 fix quickreply 2016-04-30 13:06:29 -04:00
Jeff Becker
fffe030fa2 update dynamic reply 2016-04-30 13:03:18 -04:00
Jeff Becker
74099cb5f2 css fix 2016-04-30 13:01:36 -04:00
Jeff Becker
d55716dc9b update css and position for reply box 2016-04-30 13:00:27 -04:00
Jeff Becker
dabbf4d143 update position of post reply box 2016-04-30 12:58:24 -04:00
Jeff Becker
048300d6e4 fix js id for postform_container 2016-04-30 12:56:24 -04:00
Jeff Becker
3a1a24f6da fix css 2016-04-30 12:55:43 -04:00
Jeff Becker
5fccdeba45 fix css typo 2016-04-30 12:53:01 -04:00
Jeff Becker
72e10a8734 update css 2016-04-30 12:52:16 -04:00
Jeff Becker
b78054a751 update css 2016-04-30 12:51:20 -04:00
Jeff Becker
c394114c4e update class for dynamic postform 2016-04-30 12:42:30 -04:00
Jeff Becker
7aa6eb28b2 append table row 2016-04-30 12:41:23 -04:00
Jeff Becker
a96b4d0585 document.appendChild -> document.body.appendChild 2016-04-30 12:39:46 -04:00
Jeff Becker
c8217dad84 try fixing dynamic reply 2016-04-30 12:37:36 -04:00
Jeff Becker
926aa0b69f try fixing dynamic reply 2016-04-30 12:35:21 -04:00
Jeff Becker
a51f9a77e6 more debugging 2016-04-30 12:34:29 -04:00
Jeff Becker
f0fd23e6a9 more logging 2016-04-30 12:33:29 -04:00
Jeff Becker
85dc5da83a add logging 2016-04-30 12:29:51 -04:00
Jeff Becker
1b7526ff2f initial dynamic reply code 2016-04-30 12:25:15 -04:00
Jeff Becker
982cbf2eb1 update minified 2016-04-30 10:08:44 -04:00
Jeff Becker
c455edcd59 don't include mathjax in minified js 2016-04-30 10:05:06 -04:00
Jeff Becker
ed489f9d89 use correct git command 2016-04-30 09:59:59 -04:00
Jeff Becker
07d6bc2cd7 update build-js.sh to check for submodule correctly 2016-04-30 09:59:17 -04:00
Jeff Becker
cdcd0ce68d add mathjax submodule 2016-04-30 09:58:21 -04:00
Jeff Becker
861acbbe0a revert css to not use flex 2016-04-30 09:11:33 -04:00
Jeff Becker
7e47470cea fix bug with inline image expand where br element leaves spaces after expand 2016-04-30 09:06:08 -04:00
Jeff Becker
d1bf4cc7f3 update css 2016-04-30 09:02:50 -04:00
Jeff Becker
e2968dbd97 fix js 2016-04-30 08:51:49 -04:00
Jeff Becker
ed62c4e879 update image-inline 2016-04-30 08:51:01 -04:00
Jeff Becker
a02c6f040e update css 2016-04-30 08:48:28 -04:00
Jeff Becker
7022dbf8c1 try fixing inline expand again 2016-04-30 08:42:54 -04:00
Jeff Becker
14cf2cbe5b again 2016-04-30 08:40:21 -04:00
Jeff Becker
6a73f5d727 try again 2016-04-30 08:38:50 -04:00
Jeff Becker
5a069dbb9a try fixing inline image more 2016-04-30 08:38:11 -04:00
Jeff Becker
77be791ce7 try fixing inline image expand again 2016-04-30 08:36:46 -04:00
Jeff Becker
d69ee3a8d0 try fixing image-inline 2016-04-30 08:34:33 -04:00
Jeff Becker
115e2884c1 fix url for image inline 2016-04-30 08:32:28 -04:00
Jeff Becker
f9ab15e271 add debugging 2016-04-30 08:31:37 -04:00
Jeff Becker
6c5aed6a3c bugfix 2016-04-30 08:30:14 -04:00
Jeff Becker
cc0a0bc269 add initial expand images js 2016-04-30 08:26:14 -04:00
Jeff Becker
fe2fb50775 add doctype 2016-04-29 14:08:02 -04:00
Jeff
a423b6bfe6 Merge pull request #56 from ZiRo-/master
Add inline webm playback & make js files modular
2016-04-27 13:47:36 +00:00
ZiRo
7441463de3 copy&past is bad 2016-04-27 15:40:41 +02:00
ZiRo
2dea0917d1 Add inline webm playback 2016-04-27 15:36:57 +02:00
ZiRo
d059971dcc make js more modular 2016-04-27 14:21:12 +02:00
Jeff Becker
fd60d92728 css tweak, use :target 2016-04-26 09:43:11 -04:00
Jeff Becker
4737932a3e css tweak 2016-04-26 09:40:06 -04:00
Jeff Becker
32c5df4ffd css fix for hover 2016-04-26 09:36:02 -04:00
Jeff Becker
dede4299dc fix hover a bit 2016-04-26 09:23:38 -04:00
Jeff Becker
57afa2ce4b backlinks sorta work 2016-04-26 09:13:04 -04:00
Jeff Becker
4a79b1c998 tweak scrollback limit and add "readonly" note 2016-04-25 17:17:59 -04:00
Jeff Becker
5443e06b38 reconnect liveui on close 2016-04-25 17:08:31 -04:00
Jeff Becker
69f08dbb58 fixups 2016-04-25 16:47:14 -04:00
Jeff Becker
9f5409a66a fix live.mustache 2016-04-25 16:33:51 -04:00
Jeff Becker
6ff21ebaeb insert placeholder so livechan widget calls onload 2016-04-25 16:32:10 -04:00
Jeff Becker
14fe9fe916 add liveui page 2016-04-25 16:29:11 -04:00
Jeff Becker
5c66f4684a liveui 2016-04-25 15:57:49 -04:00
Jeff Becker
6797e68ddd up error screen waiting time 2016-04-22 17:59:44 -04:00
Jeff Becker
86088b52e8 up wait time on post success page 2016-04-21 21:27:00 -04:00
Jeff Becker
b44c711483 try fixing catalog theme changer 2016-04-21 15:44:34 -04:00
Jeff Becker
d38ff65c22 use old style build D: 2016-04-18 19:42:24 -04:00
Jeff Becker
02cafc2cc5 update to next hash 2016-04-18 17:11:40 -04:00
Jeff Becker
d956f5334c ignore nntpchan bin in gitignore 2016-04-18 09:58:28 -04:00
Jeff Becker
3799c8caa1 try fixing build.sh more again again 2016-04-18 09:33:40 -04:00
Jeff Becker
bcb12ecb0f try fixing build.sh AGAIN 2016-04-18 09:27:53 -04:00
Jeff Becker
b89ca0dc72 try fixing build.sh again 2016-04-18 09:26:09 -04:00
Jeff Becker
893491ce25 try fixing build.sh 2016-04-18 09:22:33 -04:00
Jeff Becker
51d031566a fix build.sh more 2016-04-18 08:47:48 -04:00
Jeff Becker
a54b928a67 fix build.sh 2016-04-18 08:46:46 -04:00
Jeff Becker
8ac1c210f2 use gx for package management 2016-04-18 08:40:01 -04:00
Jeff Becker
8d83e4dbaf update readme 2016-04-18 08:09:42 -04:00
Jeff Becker
d4a200e921 update readme to include both githug and gitgud links for bugs 2016-04-18 08:08:06 -04:00
Jeff Becker
e1f9efffbc update readme to include frontend list 2016-04-17 17:52:12 -04:00
Jeff Becker
61de708062 add tomorrow css theme from TJBK 2016-04-15 20:17:32 -04:00
Jeff Becker
411230f48a fix 2016-04-12 19:41:38 -04:00
Jeff Becker
5530ae113e fix 2016-04-12 19:40:55 -04:00
Jeff Becker
29b2db8198 update csrf 2016-04-12 19:39:56 -04:00
Jeff Becker
bc239360ea update docs to include info about web ui installer 2016-04-03 08:57:02 -04:00
Jeff Becker
558553a587 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2016-04-03 08:17:55 -04:00
Jeff Becker
23752f0996 update docs 2016-04-03 08:17:36 -04:00
Jeff
317bbbf457 Merge pull request #54 from ZiRo-/master
Add installer
2016-03-29 17:47:10 +00:00
ZiRo
177082fded Even more installer dialogs 2016-03-29 18:48:37 +02:00
ZiRo
323f2f150c Some more installer dialogs 2016-03-29 15:58:28 +02:00
ZiRo
44ff1d2fb6 Add database installer 2016-03-29 13:38:38 +02:00
ZiRo
390574ed45 initial installer 2016-03-28 15:34:38 +02:00
Jeff Becker
60dec3db4a fix typo 2016-03-25 10:06:56 -04:00
Jeff Becker
00a69ad685 add sync all feeds part to feeds page 2016-03-25 10:03:31 -04:00
Jeff Becker
2959be4564 another check for no element 2016-03-25 10:01:33 -04:00
Jeff Becker
5d14475373 add link to nntp feed page on mod panel 2016-03-25 10:00:21 -04:00
Jeff Becker
62e59d4201 add check for mod feed page, feeds page does not have nntpchan_mod_target element 2016-03-25 09:57:38 -04:00
Jeff Becker
af02424d20 move call of initial update function to script block 2016-03-25 09:53:47 -04:00
Jeff Becker
33c6c33af2 update mod panel, begin migration to gx 2016-03-25 09:48:19 -04:00
Jeff Becker
7a67e38bf1 add .gxignore 2016-03-23 09:45:06 -04:00
Jeff Becker
9a75911ab7 update mod ui 2016-03-12 11:24:04 -05:00
Jeff Becker
8181d174a5 add hr in connection state 2016-03-12 10:18:43 -05:00
Jeff Becker
c618440878 span -> div 2016-03-12 10:16:45 -05:00
Jeff Becker
0bc6298cc0 update mod ui to have more details 2016-03-12 10:15:56 -05:00
Jeff Becker
93b452c497 update mod ui feed connection elements 2016-03-12 10:13:17 -05:00
Jeff Becker
b2d46c9021 fix typo 2016-03-12 09:45:31 -05:00
Jeff Becker
f972d91137 update mod panel connections view 2016-03-12 09:44:51 -05:00
Jeff Becker
f8a6b32b5f add expiration of orphaned articles command to mod page 2016-03-12 08:29:57 -05:00
Jeff Becker
439ab7583a add synchronize feeds command in mod panel 2016-03-12 07:56:29 -05:00
Jeff Becker
5800b1bf1d add note about redis version 2016-03-11 20:16:10 -05:00
Jeff Becker
1ba53b7688 update archiver to support multiple attachments 2016-03-10 10:07:19 -05:00
Jeff Becker
dd2eb90230 update post fail page 2016-03-09 13:27:34 -05:00
Jeff Becker
2319327917 update older templates to be aware of themes 2016-03-09 13:23:58 -05:00
Jeff Becker
89dfe68b32 update bloodgod theme for 404 page 2016-03-09 13:21:19 -05:00
Jeff Becker
c4dadd21fc update 404 page 2016-03-09 13:16:46 -05:00
Jeff Becker
812d7cfd9d 404 page 2016-03-09 12:54:21 -05:00
Jeff Becker
415f0d6e39 update install.sh to have build options passed into build.sh 2016-03-09 10:59:22 -05:00
Jeff Becker
08d97147b8 add simple install script 2016-03-09 10:41:24 -05:00
Jeff Becker
23614275eb spacing 2016-03-09 10:05:52 -05:00
Jeff Becker
1eca5c59e3 update readme irc links 2016-03-09 10:05:23 -05:00
Jeff Becker
91953148e8 update readme to point to build instructions 2016-03-09 08:41:37 -05:00
Jeff Becker
c5a5fb57d9 update build documentation 2016-03-09 08:40:18 -05:00
Jeff Becker
5b8d338840 add --disable-redis option to build.sh 2016-03-09 08:36:44 -05:00
Jeff Becker
5bc7c92e71 only apply theme if parameters are correct 2016-03-08 20:35:03 -05:00
Jeff Becker
f32bd8c946 update dayman theme 2016-03-08 18:18:28 -05:00
Jeff Becker
ca333e06ac update dayman theme 2016-03-08 18:16:27 -05:00
Jeff Becker
9aab7addb1 update dayman theme 2016-03-08 18:11:48 -05:00
Jeff Becker
0b984d0dcd color -> background-color 2016-03-08 18:10:03 -05:00
Jeff Becker
73b254367f update dayman theme 2016-03-08 18:09:27 -05:00
Jeff Becker
a9c09e57e9 dayman css initial 2016-03-08 18:02:33 -05:00
Jeff Becker
d8b57e2189 add default theme (yostuba) option 2016-03-08 17:02:23 -05:00
Jeff Becker
7ce22cefb7 try again inverting image colors via css 2016-03-08 16:58:47 -05:00
Jeff Becker
2de555f176 invert origin image color in bloodgod theme 2016-03-08 16:53:29 -05:00
Jeff Becker
68c071e318 don't use main/onload for theme application 2016-03-08 10:45:39 -05:00
Jeff Becker
077b61270c navbar on front page 2016-03-08 08:42:52 -05:00
Jeff Becker
5975383349 have navbar theme changer text underlined 2016-03-08 08:35:34 -05:00
Jeff Becker
46ca31066f add hover for navbar theme changers 2016-03-08 08:34:07 -05:00
Jeff Becker
9db627d07f update themes to be more consistant 2016-03-08 08:31:12 -05:00
Jeff Becker
014dbdfa95 add navbar to ukko 2016-03-08 08:25:31 -05:00
Jeff Becker
ea06f5498f add nntpchan.js stuff to mod panel 2016-03-08 08:13:57 -05:00
Jeff Becker
c2d60063ee add onload to modpage 2016-03-08 08:13:00 -05:00
Jeff Becker
0ebd2241e5 fix mod.js error 2016-03-08 07:25:54 -05:00
Jeff Becker
0aca177c86 fix color in bloodgod theme 2016-03-08 07:24:29 -05:00
Jeff Becker
9bb45cd896 update bloodgod theme 2016-03-08 07:23:18 -05:00
Jeff Becker
7458a884d5 add onload to frontpage too 2016-03-08 07:17:48 -05:00
Jeff Becker
6392a606c4 add onload to body 2016-03-07 21:00:54 -05:00
Jeff Becker
693bcdeffd try fixing localstorage again 2016-03-07 20:57:14 -05:00
Jeff Becker
81a398ab26 don't check for non existant key in localstorage 2016-03-07 20:55:46 -05:00
Jeff Becker
7296bc6944 fix localstorage 2016-03-07 20:55:05 -05:00
Jeff Becker
e97c4bab53 fix onload 2016-03-07 20:51:41 -05:00
Jeff Becker
2c03b8fd6b persist theme changes 2016-03-07 20:50:58 -05:00
Jeff Becker
2f3742fa7c update bloodgod theme 2016-03-07 20:41:10 -05:00
Jeff Becker
ff816fd556 update bloodgod theme 2016-03-07 20:37:38 -05:00
Jeff Becker
585d4cbff1 fix up bloodgod theme 2016-03-07 20:35:28 -05:00
Jeff Becker
0d388b19ee have bloodgod theme include buttons 2016-03-07 20:34:19 -05:00
Jeff Becker
a8e870a099 update bloodgod theme to include inputs and textares 2016-03-07 20:32:08 -05:00
Jeff Becker
32c4dcbe69 update bloodgood theme to apply to navbar 2016-03-07 20:29:00 -05:00
Jeff Becker
a3571f541b fix bloodgod theme background 2016-03-07 20:27:14 -05:00
Jeff Becker
39dbe314d6 ammend theme changing 2016-03-07 20:25:29 -05:00
Jeff Becker
63e2614983 try fixing theme switcher 2016-03-07 20:21:20 -05:00
Jeff Becker
0623077a40 add more themes and support for switching themes 2016-03-07 20:18:28 -05:00
Jeff Becker
f05d43af89 fix 2016-03-07 12:05:52 -05:00
Jeff Becker
68b73ff1dd fix 2016-03-07 12:03:27 -05:00
Jeff Becker
0613350420 fix 2016-03-07 12:00:32 -05:00
Jeff Becker
37af910c89 more nntp feed stuffs 2016-03-07 11:59:33 -05:00
Jeff Becker
6286a6529c disable checking for mod handler 2016-03-07 11:50:16 -05:00
Jeff Becker
51bdf9609f setinterval was backwards 2016-03-07 11:44:42 -05:00
Jeff Becker
b5d60f1431 syntax error 2016-03-07 11:43:11 -05:00
Jeff Becker
56f8fc8b91 add nntpchan feed ticker to mod panel 2016-03-07 11:42:21 -05:00
Jeff Becker
e0de5dfbf5 russian translations, thanks siger 2016-03-01 18:30:20 -05:00
Jeff Becker
d122da98b5 float: left for attachments 2016-02-29 09:07:42 -05:00
Jeff Becker
e6a38af5ee sorround attachments in div 2016-02-29 09:06:13 -05:00
Jeff Becker
abf3da5900 multiple files 2016-02-29 08:35:26 -05:00
Jeff Becker
a40aad33d1 * add 2 file support
* TODO: add nicer widget for multifile
2016-02-29 08:14:19 -05:00
Jeff Becker
9a6f3ef4ed add portugeese translations, thanks pyr 2016-02-28 10:16:47 -05:00
Jeff Becker
372a8767ee add es tranlsations, thanks trolly 2016-02-28 09:47:19 -05:00
Jeff
f7a31012e8 Merge pull request #48 from ZiRo-/master
Add internationalization
2016-02-28 08:13:55 -05:00
ZiRo
5cf11d50d4 Fix date format 2016-02-28 14:00:22 +01:00
ZiRo
a4f3e4ffa4 Fix date format 2016-02-28 13:59:38 +01:00
ZiRo
60de698f2c Add German translation 2016-02-28 13:57:51 +01:00
ZiRo
1c4f4630c2 localize templates 2016-02-28 13:40:16 +01:00
ZiRo
9974628f62 Make it possible to add more parameters to post template 2016-02-28 10:19:55 +01:00
ZiRo
2ea928417d Localize time formats 2016-02-28 09:48:07 +01:00
ZiRo
eede0c55dc Merge branch 'master' of github.com:ZiRo-/nntpchan 2016-02-28 08:55:33 +01:00
ZiRo
c6780cfd27 Merge remote-tracking branch 'upstream/master' 2016-02-28 08:54:23 +01:00
ZiRo
34b2e18587 Add dummy translation files 2016-02-28 08:54:05 +01:00
Jeff
38d3bc4481 Merge pull request #47 from ZiRo-/patch-1
Add RPC
2016-02-26 07:53:49 -05:00
ZiRo-
e556d6d2be Add RPC 2016-02-25 20:25:10 +01:00
ZiRo-
22a3564f22 Merge pull request #1 from majestrate/master
rebase
2016-02-25 20:02:06 +01:00
Jeff Becker
b695d97e82 even out front page 2016-02-22 07:39:06 -05:00
Jeff Becker
64e4c3320d fix front page 2016-02-22 07:32:49 -05:00
Jeff Becker
7c7d07434d undo changes with post form 2016-02-21 17:08:38 -05:00
Jeff Becker
d2b9e76389 update templates 2016-02-21 16:51:56 -05:00
Jeff Becker
f91bd642a5 fix moderate.js 2016-02-20 09:42:22 -05:00
Jeff Becker
9459e1758d fix moderate.js tool 2016-02-20 09:41:03 -05:00
Jeff Becker
24b2bd8e15 add moderate example script 2016-02-20 09:35:20 -05:00
Jeff
8ad13c8e45 Merge pull request #46 from ZiRo-/master
add images to catalog; style catalog properly
2016-02-20 13:54:16 +00:00
ZiRo
c6e6c2e5d6 Catalog improvements 2016-02-20 11:16:54 +01:00
Jeff
9690156fbf Merge pull request #45 from ZiRo-/master
Add catalog
2016-02-19 15:57:01 +00:00
ZiRo
dea611c1ba initial for catalog 2016-02-19 16:48:41 +01:00
Jeff Becker
0e0f35e6dc fix legal footer 2016-02-17 14:13:58 -05:00
Jeff Becker
5370898da9 * add legal notice
* fix front page graph
2016-02-17 14:10:50 -05:00
ZiRo
1020fae1dd Add Board titles 2016-02-17 15:31:28 +01:00
ZiRo
6bcfff0269 post form fixes 2016-02-17 15:06:00 +01:00
ZiRo
5fbf75a77d Add update link 2016-02-17 14:59:39 +01:00
ZiRo
86744c9349 fix posting form 2016-02-17 14:51:25 +01:00
ZiRo
24b6d87381 add page list to the bottom of board pages 2016-02-17 11:30:19 +01:00
ZiRo
649cc96269 add footer links to threads 2016-02-17 10:53:20 +01:00
ZiRo
a9e377563d Fix board list a bit 2016-02-17 10:27:16 +01:00
ZiRo
9229aa62bd Merge remote-tracking branch 'upstream/master' 2016-02-16 18:35:34 +01:00
ZiRo
f9c9028a0b The posts and threads are now pretty much done 2016-02-16 16:52:20 +01:00
ZiRo
5fa12dcda8 some more CSS fuckery 2016-02-16 16:37:02 +01:00
ZiRo
8c0a4ac6b0 crop i2p icon 2016-02-16 14:56:59 +01:00
ZiRo
bd279547d2 some css fuckery 2016-02-16 14:48:56 +01:00
Jeff Becker
1ad6432576 make reply button/link obvious 2016-02-16 08:32:51 -05:00
ZiRo
4b007fa759 Use 8chin post borders 2016-02-16 13:59:10 +01:00
ZiRo
abe985b6c5 Make origin icon smaller 2016-02-16 13:47:56 +01:00
ZiRo
6091934884 Make origin icon smaller 2016-02-16 13:47:30 +01:00
ZiRo
7db701b23a Don't use a maring for threads 2016-02-16 13:42:28 +01:00
Jeff Becker
00816c1a95 rename mod action 2016-02-15 17:04:59 -05:00
Jeff Becker
713f8a7d19 fix up ukko 2016-02-15 17:02:38 -05:00
Jeff Becker
da42b8fc7d fix ukko more 2016-02-15 17:00:35 -05:00
Jeff Becker
27bf7de803 style tweaks 2016-02-15 16:55:36 -05:00
Jeff Becker
4fd443dce4 tweaks 2016-02-15 16:53:17 -05:00
Jeff Becker
f8d3f85a4d fix typos 2016-02-15 16:52:38 -05:00
Jeff Becker
007851056f fix ukko 2016-02-15 16:50:52 -05:00
Jeff Becker
f97b5a56e5 uncomment out ukko threads header 2016-02-15 16:48:18 -05:00
Jeff Becker
7495c3e843 fix bad end tag 2016-02-15 16:44:35 -05:00
Jeff Becker
713ff950e7 fix origin icon more 2016-02-15 16:42:42 -05:00
Jeff Becker
64a7a6e6aa fix origin icons 2016-02-15 16:36:56 -05:00
Jeff Becker
6aa9475c91 * move origin image to be inside postheader
* style tweaks
2016-02-15 16:29:54 -05:00
Jeff Becker
a9ac1207c0 * add thumnail class to post thumbnails
* fix typo in css
2016-02-15 15:51:17 -05:00
ZiRo
539033ec6d looking pretty good by now 2016-02-15 21:20:37 +01:00
ZiRo
80041baf1e fix some colors 2016-02-15 20:00:56 +01:00
ZiRo
b83b21df59 some more styling 2016-02-15 19:04:03 +01:00
ZiRo
69c30e0685 no more br 2016-02-15 18:42:46 +01:00
ZiRo
0ed2bad9f1 no more rounded rectangles, stupid boarders or shadows 2016-02-15 18:38:32 +01:00
ZiRo
41d3cb467b seperator line for threads 2016-02-15 18:26:30 +01:00
ZiRo
476ae002c2 beginn style change 2016-02-15 18:14:22 +01:00
ZiRo
6f0b518391 ... and No. for everyone 2016-02-15 17:20:41 +01:00
ZiRo
f673a10768 Reply only for OP 2016-02-15 17:17:00 +01:00
ZiRo
8668d1aa08 fix backlinks & CSS classes 2016-02-15 17:06:59 +01:00
ZiRo
d2babe367b use proper timestamps + fix double prefix
This has the benefit that modern browsers see timestamps in their local time zone
2016-02-15 16:13:28 +01:00
ZiRo
3b5937f2d9 Add my rebuild script to gitignore 2016-02-15 15:54:43 +01:00
Jeff Becker
1896060218 fix post template to include prefix 2016-02-13 17:26:00 -05:00
Jeff Becker
9d2461c716 make build.sh verbose when doing go get 2016-02-09 09:02:33 -05:00
Jeff Becker
85d60a1928 fix up more 2016-02-08 15:05:57 -05:00
Jeff Becker
6eb42d4cf7 fix up lynxchan migrate script such that it exits 2016-02-08 14:09:30 -05:00
Jeff Becker
37df9ef131 fixes to migration script 2016-02-08 13:47:06 -05:00
Jeff Becker
450d07d6e5 fix typo 2016-02-08 13:10:26 -05:00
Jeff Becker
047a63ec20 add initial lynxhub importer 2016-02-08 12:42:25 -05:00
Jeff Becker
3821562cf6 add redis database documentation 2016-02-07 09:36:46 -05:00
Jeff Becker
85a968ad40 add cli docs 2016-02-01 21:27:14 -05:00
Jeff Becker
c169616471 add no attachments detection 2016-02-01 11:06:01 -05:00
Jeff Becker
c0d5800bd4 fix up readme 2016-01-23 11:08:00 -05:00
Jeff Becker
6bd5518249 clairity 2016-01-23 11:06:59 -05:00
Jeff Becker
b3da008694 add api docs 2016-01-23 11:06:10 -05:00
Jeff Becker
3a2529561f add comment 2016-01-23 10:58:14 -05:00
Jeff Becker
110e607839 add json api example 2016-01-23 10:57:27 -05:00
Jeff Becker
54fa915aeb add banners 2016-01-20 12:20:04 -05:00
Jeff Becker
273d28d237 same as last commit 2016-01-20 12:18:22 -05:00
Jeff Becker
ec56bbe8f9 center all banners 2016-01-20 12:18:04 -05:00
Jeff Becker
9340b9088e i hate js 2016-01-20 12:16:30 -05:00
Jeff Becker
329eca6af3 fix banner placements 2016-01-20 12:13:14 -05:00
Jeff Becker
06d4535eaa try fixing banners more 2016-01-20 12:11:38 -05:00
Jeff Becker
9f78414098 try usimg correct prefixes 2016-01-20 12:09:55 -05:00
Jeff Becker
97faee8d1d try fixing banners 2016-01-20 12:08:01 -05:00
Jeff Becker
33d95c2ef3 trying this 2016-01-20 12:04:22 -05:00
Jeff Becker
97ee132989 fix more again 2016-01-20 12:02:13 -05:00
Jeff Becker
ab3da1edee try fixing banners more 2016-01-20 12:00:28 -05:00
Jeff Becker
ba0f5471a3 try fixing banners more D: 2016-01-20 11:58:19 -05:00
Jeff Becker
9f84ab4ca9 try fixing banners 2016-01-20 11:52:04 -05:00
Jeff Becker
3274536134 revert banner injection 2016-01-20 11:49:38 -05:00
Jeff Becker
bc5b22f7a1 move banners arround 2016-01-20 11:49:23 -05:00
Jeff Becker
0199230489 fix banner inject function 2016-01-20 11:48:08 -05:00
Jeff Becker
98bb655a3c add banners 2016-01-20 11:42:18 -05:00
Jeff Becker
c4090303ec ammend todo 2016-01-19 09:05:03 -05:00
Jeff
0be5982d39 Merge pull request #44 from chen-chan/patch-2
typo: lable -> label
2016-01-17 18:43:14 -05:00
chen-chan
c7975c67ef typo: lable -> label 2016-01-15 21:12:56 +01:00
jeff
59173f055e add sync = 1 documentation 2016-01-13 00:22:08 -05:00
jeff
0b8c977aad add password auth docs 2016-01-12 18:02:01 -05:00
jeff
2c0426d1a4 change password field to use type="password" 2016-01-12 15:14:24 -05:00
jeff
e6de8a1d20 fix mod panel 2016-01-12 10:29:23 -05:00
jeff
9ebe7d7c5d add nntp login actions in mod panel 2016-01-12 10:23:36 -05:00
no
84626f6f96 add info for peering over internet with tls 2016-01-07 13:27:43 -05:00
no
3a35dc5575 add tls related stuff to .gitignore 2016-01-07 11:56:08 -05:00
no
13b8a18e21 detect webm/mp4 and set mime type correctly 2016-01-07 09:32:50 -05:00
no
4557503256 for plaintext posts add content-type header 2016-01-07 09:31:11 -05:00
no
689ced2ae4 Merge branch 'master' of https://github.com/majestrate/nntpchan 2016-01-06 16:18:34 -05:00
no
ccc5972e67 add attachment ability to archiver 2016-01-06 16:17:34 -05:00
Jeff
e07260d068 Merge pull request #43 from chen-chan/master
my shitty template btw. enjoy~ :3
2016-01-04 09:49:22 -05:00
chen-chan
7854b0b81d faq update 2016-01-04 14:53:56 +01:00
chen-chan
177e0156cc faq update 2016-01-04 14:50:41 +01:00
chen-chan
10d47779d3 faq update 2016-01-04 14:47:43 +01:00
chen-chan
d26d6ecacb faq update 2016-01-04 14:43:58 +01:00
chen-chan
85200d9284 faq tweak 2016-01-04 14:29:25 +01:00
chen-chan
8bcd0b790c gitignore /go and /srndv2 2016-01-04 13:20:59 +01:00
chen-chan
68e4e9162f rm xmas, change faq, frontpage 2016-01-04 13:19:47 +01:00
chen-chan
05d1290344 minor fix 2 2015-12-23 17:03:40 +01:00
chen-chan
d1bb6b59b0 minor fix 2015-12-23 16:59:18 +01:00
chen-chan
64111298f6 minor fixes 2015-12-23 16:53:36 +01:00
chen-chan
6df6fd807a xmas 2015-12-23 14:25:25 +01:00
chen-chan
d140c9ee99 little tweak: date and buttons 2015-12-23 13:05:58 +01:00
chen-chan
50fafb4531 wrong thread js path 2015-12-23 06:29:01 +01:00
chen-chan
5591b56df0 css and frontpage fixes 2015-12-23 06:08:00 +01:00
chen-chan
6041a7d608 wrong js dir 2015-12-23 05:43:58 +01:00
chen-chan
111522d08e workaroung static not being hosted recursively 2015-12-23 05:04:50 +01:00
chen-chan
7d89ab06c7 chen-chan got its own dir in static 2015-12-23 03:25:52 +01:00
chen-chan
cab35af8c4 merge 2015-12-23 03:03:13 +01:00
chen-chan
5abbe123c3 merge 2015-12-23 02:53:35 +01:00
chen-chan
404d9952f2 merge from upstream 2015-12-23 02:38:08 +01:00
chen-chan
a6b7235b12 add back default empty user.css 2015-12-23 01:40:11 +01:00
chen-chan
55f4461475 rename css file 2015-12-23 01:36:22 +01:00
chen-chan
bb1c6890ac change css filename 2015-12-23 01:33:03 +01:00
chen-chan
e545bab034 new template dir 2015-12-23 01:07:29 +01:00
chen-chan
21ec8e5f3a table css 2015-12-23 01:02:11 +01:00
Jeff
35c6875b00 Merge pull request #38 from chen-chan/patch-2
target="_blank" needs to be after href or it no werk
2015-12-20 21:42:31 -05:00
chen-chan
45f217fa78 target="_blank" needs to be after href or it no werk
tbh smh onii-fam

also figcaption is completely unnecessary here tbh.
2015-12-21 01:58:25 +01:00
Jeff
e6ca1b07ed Merge pull request #35 from 4cdn/patch-3
legibility
2015-11-23 16:54:47 -05:00
4cdn
3e3680c9be legibility 2015-11-23 16:49:05 -05:00
Jeff
7501dae72e Merge pull request #34 from 4cdn/patch-1
table color to one lolz had
2015-11-22 18:42:15 -05:00
4cdn
93328cb480 table color to one lolz had 2015-11-22 16:16:47 -05:00
Jeff
ab69a2e9a4 Merge pull request #33 from 4cdn/patch-1
graph bleed-through, add spacing
2015-11-22 16:10:27 -05:00
4cdn
a6da70e7d3 fixes 2015-11-22 16:02:45 -05:00
4cdn
6e87271483 define table classes
defines classes to fix background colors bleeding through on some of the graphs and adds some spacing between graphs (3cecde002ed9c42197)
2015-11-22 15:59:21 -05:00
4cdn
fed34ed622 adds classes
adds classes to fix background colors bleeding through on some of the graphs (3cecde002ed9c42197)
2015-11-22 15:47:23 -05:00
Jeff
eb5ca66330 Merge pull request #32 from 4cdn/patch-1
hawt
2015-11-19 20:47:29 -05:00
4cdn
81f11be7c5 frontpage consistency </link> 2015-11-19 20:33:24 -05:00
4cdn
2c9f332fb0 issuecomment-158252057 2015-11-19 20:31:34 -05:00
4cdn
d6f3bdd9e8 consistency 2015-11-19 20:23:12 -05:00
4cdn
e75cf64769 consistency, see change in postform.mustache 2015-11-19 20:21:04 -05:00
4cdn
d030303ed3 consistency, see change in site.css 2015-11-19 20:20:57 -05:00
4cdn
9ad004e85f Update modpage.mustache 2015-11-19 20:09:38 -05:00
4cdn
83a4102e38 consistency 2015-11-19 20:07:23 -05:00
4cdn
57e2ebda6e bloat 2015-11-19 20:05:56 -05:00
4cdn
24b6ad9276 similar to PR22
"no such attribute for textfield"
2015-11-19 20:03:08 -05:00
Jeff
0e28120697 Merge pull request #31 from viniciusbo/master
Fix input file size in new post page
2015-11-19 11:50:04 -05:00
Vinícius Borriello
775dc470e5 Fix input file size in new post page 2015-11-19 14:36:41 -02:00
jeff
a929709924 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2015-11-12 22:13:18 -05:00
jeff
c23696aae5 fix psy 2015-11-12 22:13:09 -05:00
Jeff
ed97ca881d Merge pull request #28 from chen-chan/master
unused templates
2015-11-11 16:36:25 -05:00
chen-chan
ed041c1689 unused templates 2015-11-10 22:24:07 +01:00
jeff
67bcbc6289 remove link to create new board from front page 2015-11-10 13:00:28 -05:00
jeff
8eec2ce827 only mods can create new boards 2015-11-10 12:53:54 -05:00
jeff
749bd5a72b Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2015-11-09 14:46:22 -05:00
jeff
d0ad0ae71d checkem 2015-11-09 13:59:54 -05:00
Jeff
4bff278a8f Merge pull request #26 from 4cdn/patch-6
truthier wording
2015-11-09 06:58:04 -05:00
4cdn
6453d405a6 truthier wording 2015-11-08 21:18:49 -05:00
jeff
1614cef91f remove duplicate css rule 2015-11-08 14:22:01 -05:00
jeff
0004483395 add border radius for fieldset 2015-11-08 11:37:23 -05:00
jeff
d1d846e2fe change captcha background color 2015-11-08 11:32:41 -05:00
Jeff
2a267f93be Merge pull request #23 from 4cdn/patch-5
using real attributes makes css 10x easier
2015-11-07 19:12:43 -05:00
4cdn
3c8fa13ffe block-inline --> inline-block & cater to firefox
19:03:41.183 Error in parsing value for 'display'.  Declaration dropped.1 site.css:44:13
19:03:41.183 Unknown property 'overflow-wrap'.  Declaration dropped.1 site.css:45:14
"You might as well use word-wrap as well because as the spec says, they are literally just alternate names for each other. Some browsers support one and not the other. Firefox (tested v43) only supports word-wrap"
—https://css-tricks.com/snippets/css/prevent-long-urls-from-breaking-out-of-container/
2015-11-07 19:09:34 -05:00
jeff
e50d145bbe Merge branch 'master' into dank 2015-11-07 18:48:19 -05:00
Jeff
f85eaf35ac Merge pull request #22 from chen-chan/patch-1
no such attribute for textfield
2015-11-07 18:43:24 -05:00
chen-chan
d16921d727 no such attribute for textfield 2015-11-07 23:20:32 +01:00
jeff
8bb13354a2 interchange image, post body placement 2015-11-07 12:58:44 -05:00
jeff
4c9ec43d30 redo icons 2015-11-07 12:54:16 -05:00
jeff
69ef6f2b71 css tweak 2015-11-07 12:50:49 -05:00
jeff
39c6c6b963 tweak post.mustache 2015-11-07 12:49:34 -05:00
jeff
5219bcefab fix tor/clearnet/i2p icon placement 2015-11-07 12:39:24 -05:00
jeff
322edd37cb fix icons 2015-11-07 12:33:32 -05:00
jeff
edfca55b8f fix post.mustace 2015-11-07 12:27:17 -05:00
jeff
1c405795b9 fix ukko 2015-11-07 12:25:27 -05:00
jeff
8ebba42030 fix templates 2015-11-07 12:23:56 -05:00
jeff
41643bc52a fix templates 2015-11-07 12:22:26 -05:00
jeff
ad5dfca2ef change color 2015-11-07 12:21:30 -05:00
jeff
a95ec269df make css more sane 2015-11-07 12:20:52 -05:00
jeff
dc3ec1c63d fix css a bit 2015-11-07 11:27:31 -05:00
jeff
371256e147 fix css a bit 2015-11-07 11:23:33 -05:00
jeff
edd4b13af4 fix css a bit 2015-11-07 11:21:44 -05:00
jeff
b12f6421fd fix css a bit 2015-11-07 11:18:56 -05:00
jeff
eb08ccb5d6 fix css a bit 2015-11-07 11:17:54 -05:00
jeff
e18f91c7e5 fix css a bit 2015-11-07 11:16:54 -05:00
jeff
0176f32bd4 try fixing board.mustache 2015-11-07 11:13:21 -05:00
jeff
ab83843ef6 fix css a bit 2015-11-07 11:10:43 -05:00
jeff
a0823c13db fix css a bit 2015-11-07 11:03:06 -05:00
jeff
26042749aa fix css a bit 2015-11-07 11:02:26 -05:00
jeff
cde9c1c641 fix css a bit 2015-11-07 11:00:36 -05:00
jeff
fdcd9181ad fix css a bit 2015-11-07 10:59:19 -05:00
jeff
9b3c073692 fix css a bit 2015-11-07 10:58:53 -05:00
jeff
ce74caabf9 fix css a bit 2015-11-07 10:57:37 -05:00
jeff
70ff3f487f fix css a bit 2015-11-07 10:55:50 -05:00
jeff
78025891df fix css a bit 2015-11-07 10:54:57 -05:00
jeff
1044989070 try fixing post.mustache; 2015-11-07 10:53:35 -05:00
jeff
34dcede98f fix css a bit 2015-11-07 10:50:28 -05:00
jeff
363743ac0c try fixing ukko 2015-11-07 10:48:25 -05:00
jeff
92c7102c50 try fixing ukko 2015-11-07 10:47:21 -05:00
jeff
38085620dc try fixing ukko 2015-11-07 10:46:03 -05:00
jeff
320966cca3 fix css a bit 2015-11-07 10:43:57 -05:00
jeff
4165a5c34b fix css a bit 2015-11-07 10:43:16 -05:00
jeff
f7504c7425 fix css a bit 2015-11-07 10:42:16 -05:00
jeff
8196274c0e for science :-DDD 2015-11-07 10:37:18 -05:00
jeff
32d4fe6307 add style tweaks 2015-11-01 12:15:15 -05:00
jeff
b57778cdcf close title tag :p 2015-11-01 11:48:37 -05:00
jeff
15b14980f8 history graph template added 2015-11-01 11:41:05 -05:00
jeff
82708039c2 truncate subject 2015-10-31 12:42:16 -04:00
jeff
f58f4258e8 ammend overview 2015-10-31 11:34:19 -04:00
jeff
68d011b42b try fixing placement 2015-10-31 11:30:17 -04:00
jeff
fdaf1dd9da try fixing placement 2015-10-31 11:28:54 -04:00
jeff
bf82420f99 try fixing placement 2015-10-31 11:27:36 -04:00
jeff
6cbe15988e try fixing placement on front page 2015-10-31 11:25:29 -04:00
jeff
3094108e59 css tweak 2015-10-31 11:22:50 -04:00
jeff
c084518622 try fixing placement 2015-10-31 11:21:36 -04:00
jeff
4e3d66ad52 try fixng css 2015-10-31 11:20:11 -04:00
jeff
b9e2202d04 try fixing css 2015-10-31 11:19:22 -04:00
jeff
44b63a11a0 try fixing placement of overview 2015-10-31 11:17:25 -04:00
jeff
1ad84780a8 make subjects clickable 2015-10-31 11:15:56 -04:00
jeff
4c822ba2cd add overview 2015-10-31 11:10:58 -04:00
jeff
2212f61ff0 try fixing css for front page 2015-10-31 08:04:14 -04:00
jeff
19198738c3 try fixing css for front page 2015-10-31 08:02:55 -04:00
jeff
7aa769d52d try fixing posts graph 2015-10-31 07:57:19 -04:00
jeff
e4a9d8ef8c scale graph 2015-10-31 07:49:59 -04:00
jeff
2d45920bc7 fix posts graph 2015-10-31 07:30:57 -04:00
jeff
ee7004fc42 add posts graph 2015-10-31 07:27:26 -04:00
jeff
e82058d961 ref -> rel 2015-10-29 08:16:17 -04:00
jeff
086eec72d8 add "root trust" keys 2015-10-27 10:02:34 -04:00
jeff
d3a423a72f ammend docs to reflect updated feed format and add note about database creds 2015-10-24 09:32:40 -04:00
jeff
0427135322 add overchan protocol spec to repo 2015-10-24 09:14:39 -04:00
jeff
f0ceac8d28 ammend mod page 2015-10-24 08:49:07 -04:00
jeff
e263ebde0b add dusty's docs 2015-10-21 12:12:04 -04:00
jeff
651bd33205 docs -> doc 2015-10-21 10:56:54 -04:00
jeff
7051da0e91 add clarifications 2015-10-21 10:51:17 -04:00
jeff
8dc4667666 have build.sh copy binary to root of repo 2015-10-21 10:49:08 -04:00
jeff
3eba7adc1c fix build.sh 2015-10-21 10:48:14 -04:00
jeff
8a7efa9929 use go 1.3 or higher 2015-10-21 10:45:49 -04:00
jeff
83f5855bba reorder instructions for clairity 2015-10-21 10:17:40 -04:00
jeff
c497a01e2d Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2015-10-21 10:17:04 -04:00
Jeff
56b716d584 Merge pull request #17 from 4cdn/patch-4
add git to dependancies
2015-10-21 10:07:05 -04:00
jeff
688c9a746c add irc2p link 2015-10-20 19:48:50 -04:00
4cdn
7027b9e297 add git to dependancies 2015-10-20 18:56:37 -04:00
jeff
5d191c88bc add urc link 2015-10-20 10:45:55 -04:00
jeff
91367983ec try fixing attachment retry 2015-10-20 09:54:37 -04:00
jeff
bbba16380f try fixing repost of images 2015-10-20 09:23:16 -04:00
jeff
80e4d7beb4 try fixing attachment repost 2015-10-20 09:18:25 -04:00
jeff
a451a6b46e try fixing attachments 2015-10-20 09:16:42 -04:00
jeff
75c72e177c try fixing attachments when retrying 2015-10-20 09:11:45 -04:00
jeff
939472f5a4 try fixing post retry 2015-10-20 08:56:38 -04:00
jeff
cf033b03b6 try fixing post captcha retry 2015-10-20 08:55:09 -04:00
jeff
b16b0c72b0 add post retry template (initial) 2015-10-20 08:41:46 -04:00
jeff
566c88dc28 put link to board list on front page 2015-10-19 09:26:38 -04:00
jeff
4698f7a118 try fixing backlinks 2015-10-19 09:20:30 -04:00
jeff
5e60d20222 fuggg 2015-10-19 09:16:07 -04:00
jeff
6cbc367630 try fixing nnptchan.js 2015-10-19 09:13:28 -04:00
jeff
af85eae429 ammend nnptchan.js to use old style shorthashes 2015-10-19 09:12:32 -04:00
jeff
5420346b36 add board list template 2015-10-19 08:42:27 -04:00
jeff
e11978a0d9 add link to peering 2015-10-16 14:19:44 -04:00
jeff
d94813ee36 add_key 2015-10-16 14:17:16 -04:00
jeff
1aa4f81ae7 wrong link 2015-10-16 14:14:42 -04:00
jeff
270e72c8eb forgot link 2015-10-16 14:13:59 -04:00
jeff
0d1c42b086 fix up docs 2015-10-16 14:11:08 -04:00
jeff
105b314ee7 add link to next step in build.md 2015-10-16 13:56:59 -04:00
jeff
7dfc1e3418 fix docs 2015-10-16 13:47:33 -04:00
jeff
d5b45cb58e fix docs 2015-10-16 13:42:55 -04:00
jeff
a9ea094144 apply fix for json parse error 2015-10-14 13:48:03 -04:00
jeff
f1037d888d change to use overchan.archive.* 2015-10-14 13:46:17 -04:00
jeff
2a9b1f3eac fix 404 errors 2015-10-14 13:19:47 -04:00
jeff
bf351294b1 add archive script 2015-10-14 12:57:02 -04:00
jeff
f93256e0d8 fix markup to not suck as bad 2015-10-14 09:05:32 -04:00
jeff
c1ecf14258 change frontend to message id in post template 2015-10-14 09:01:47 -04:00
jeff
80e12fe0f3 add todo list 2015-10-10 10:22:00 -04:00
jeff
f6400b3cb5 i suck at css 2015-10-08 11:55:58 -04:00
jeff
04126b743c fak 2015-10-08 11:49:30 -04:00
jeff
f7211600f8 Merge branch 'master' of ssh://github.com/majestrate/nntpchan 2015-10-08 11:42:16 -04:00
jeff
25901e3d44 add references to user.css in all templates 2015-10-08 11:42:10 -04:00
Jeff
97ec36feaa Merge pull request #15 from 4cdn/patch-2
typos + non-base32 onion fix
2015-10-08 06:46:25 -04:00
4cdn
c5f17cf048 typos + non-base32 onion fix 2015-10-07 21:35:42 -04:00
Jeff
0b7b248ea1 Merge pull request #14 from MrBrass/master
This one's been bugging me for way too long
2015-10-07 20:54:26 -04:00
MrBrass
2f381e7052 This one's been bugging me for way too long 2015-10-07 19:21:54 -04:00
Jeff
f006b61c4e Merge pull request #13 from MrBrass/master
typo, no clocks here
2015-10-07 19:10:27 -04:00
MrBrass
3a13943d49 typo, no clocks here 2015-10-07 19:08:06 -04:00
Jeff
ab15a2ff33 Merge pull request #12 from MrBrass/master
Added feeds.ini and peering documentation
2015-10-07 19:04:01 -04:00
MrBrass
af582eb30b Added feeds.ini and peering documentation 2015-10-07 18:55:54 -04:00
jeff
471377ff2e remove instructions to use tags as the existing tags are outdated 2015-10-07 14:07:32 -04:00
jeff
3c4e319f06 add base files for documentation 2015-10-07 14:04:50 -04:00
Jeff
7845131544 Merge pull request #11 from 4cdn/patch-1
you didnt even do it right
2015-10-05 18:05:50 -04:00
4cdn
91971f2f3e you didnt even do it right 2015-10-05 16:25:22 -04:00
Jeff
072e36915a Merge pull request #8 from majestrate/dank
Dank
2015-10-04 06:55:35 -04:00
jeff
758a2c6bbb newboard.js prepends 'overchan.' if it's not present in the name 2015-10-04 06:38:17 -04:00
jeff
fc23bea021 Merge branch 'master' into dank 2015-10-04 06:34:12 -04:00
jeff
b3f104a80a update faq 2015-10-04 06:34:01 -04:00
jeff
e88c8f78ba newboard.js prepends 'overchan.' if it's not present in the name 2015-10-04 06:32:10 -04:00
jeff
d249d373c1 Merge branch 'master' into dank 2015-10-03 22:07:37 -04:00
jeff
8608d222c3 add link to /new/ 2015-10-03 22:07:19 -04:00
jeff
fcca345ba1 fix nginx config 2015-10-03 10:31:32 -04:00
jeff
bc81c8e251 add example nginx config, probably works 2015-10-03 10:14:25 -04:00
jeff
ccbdd33b93 Merge branch 'master' into dank
Conflicts:
	contrib/static/site.css
2015-10-02 15:53:45 -04:00
jeff
7727fc76f8 add message field 2015-10-02 15:46:52 -04:00
jeff
bb676336db fix 2015-10-02 15:45:22 -04:00
jeff
6194db1941 Merge branch 'master' into devel
Conflicts:
	contrib/static/site.css
2015-10-02 15:41:44 -04:00
jeff
229ef83e35 add initial newboard stuff 2015-10-02 15:38:59 -04:00
jeff
12e887316a remove dank maymz 2015-10-02 12:04:49 -04:00
jeff
823af74633 Merge branch 'master' into dank 2015-10-02 11:02:37 -04:00
jeff
441be15845 add pubkey.* admin functions 2015-10-02 11:00:26 -04:00
jeff
95f425c31d Merge branch 'master' into dank 2015-10-01 14:29:12 -04:00
jeff
2366781282 Merge branch 'devel'
Conflicts:
	contrib/templates/default/post.mustache
2015-10-01 14:28:36 -04:00
jeff
69adbaca5a fix irc link 2015-10-01 14:27:46 -04:00
jeff
dd2f916aed wrong placement again 2015-10-01 14:02:45 -04:00
jeff
ef71260653 wrong placement of icons 2015-10-01 14:02:30 -04:00
jeff
0e0a9c3da9 wrong placement again 2015-10-01 14:01:54 -04:00
jeff
cdc405f29e wrong placement of icons 2015-10-01 14:00:07 -04:00
jeff
1a51354621 Merge branch 'devel' into dank
Conflicts:
	contrib/templates/default/post.mustache
2015-10-01 13:56:09 -04:00
jeff
ac3f0eab94 add css and images for origins 2015-10-01 13:55:17 -04:00
jeff
c5605a4412 add post origin awareness 2015-10-01 13:51:01 -04:00
jeff
4e31910ed6 add background image again 2015-10-01 09:42:49 -04:00
jeff
3b1d09072c change id so that backlinks work 2015-09-30 17:39:56 -04:00
jeff
7f56d35762 remove memes 2015-09-23 20:08:42 -04:00
jeff
3360eaf924 add css rule 2015-09-23 18:54:26 -04:00
jeff
51041e2dc9 case matters for real 2015-09-23 09:07:53 -04:00
jeff
6e20cb270e case matters 2015-09-23 09:07:25 -04:00
jeff
6019d70382 ammend mod panel js more 2015-09-23 09:06:44 -04:00
jeff
cec6f7cef5 ammend mod panel js 2015-09-23 09:04:37 -04:00
jeff
40b7e0a88b fix js 2015-09-23 08:59:56 -04:00
jeff
b595024585 ammend mod panel 2015-09-23 08:59:02 -04:00
jeff
00fbc305be add more actions to mod panel 2015-09-23 08:54:49 -04:00
jeff
5e3f2eea03 try using 1 thread for regenerating thumbnails 2015-09-22 12:41:10 -04:00
jeff
7f721eefea fix mod panel a bit 2015-09-22 10:34:38 -04:00
jeff
866196e810 add more info in mod panel, add admin action to rethumb 2015-09-22 10:33:01 -04:00
jeff
8c18b4405d make captcha image background not dark 2015-09-22 07:28:26 -04:00
jeff
578d9f44b3 add regen all threads button 2015-09-20 19:33:31 -04:00
Jeff
ab38445555 Merge pull request #4 from 4cdn/master
user interface changes
2015-09-19 19:39:09 -04:00
4cdn
98cf765690 Update README.md 2015-09-19 19:32:15 -04:00
4cdn
d742af18b5 removing reliance on external file hosting 2015-09-19 19:31:03 -04:00
4cdn
74a1c044f0 removing reliance on external file hosting 2015-09-19 19:30:05 -04:00
4cdn
adb3e54212 new file: contrib/static/fieri.png 2015-09-19 23:28:02 +00:00
4cdn
1cc4d4e858 new file: contrib/static/about.mp3 2015-09-19 23:21:45 +00:00
4cdn
ec8db8121f Update README.md 2015-09-19 16:24:09 -04:00
4cdn
9cb8998302 faq page more entertaining
encourages users to read completely
2015-09-19 16:22:37 -04:00
4cdn
2f8fd2f2b5 improved visual aesthetics 2015-09-19 16:21:22 -04:00
jeff
790c61cfdb ammend templates to use stylesheets 2015-09-19 13:54:10 -04:00
jeff
7b3ec70a80 css tweak 2015-09-19 13:50:19 -04:00
jeff
fcbae8cea1 captcha background consistance 2015-09-19 13:45:49 -04:00
jeff
569727cc96 css tweak 2015-09-19 13:41:00 -04:00
jeff
f7fc61d493 css tweak 2015-09-19 13:39:41 -04:00
jeff
8cbf1f217d css tweak 2015-09-19 13:37:57 -04:00
jeff
458232d402 css tweak 2015-09-19 13:36:33 -04:00
jeff
fcfd010e5c css tweak 2015-09-19 13:34:46 -04:00
jeff
dca5ee7561 css tweak 2015-09-19 13:33:26 -04:00
jeff
108f05da32 css tweak 2015-09-19 13:33:00 -04:00
jeff
a515ba9d1f css tweak 2015-09-19 13:29:25 -04:00
jeff
8611e2e768 css tweak 2015-09-19 13:28:48 -04:00
jeff
20dd0c215e css tweaks 2015-09-19 13:28:20 -04:00
jeff
c91c8c08b1 change bg.jpg 2015-09-19 13:27:44 -04:00
jeff
9321a65f1c css tweak 2015-09-19 13:25:32 -04:00
jeff
b2a71e1877 change background 2015-09-19 13:22:10 -04:00
jeff
045e3140ad css tweak 2015-09-19 13:18:34 -04:00
jeff
d6f073943e css tweaks 2015-09-19 13:17:30 -04:00
jeff
47f884ce98 css tweaks 2015-09-19 13:16:51 -04:00
jeff
9d815479b2 add background image 2015-09-19 13:15:54 -04:00
jeff
2aa2405ba7 css tweaks 2015-09-19 13:03:41 -04:00
jeff
40d6cf77ad use correct parameter in admin command 2015-09-19 09:02:08 -04:00
jeff
e70c4ed84e syntax error 2015-09-19 08:58:33 -04:00
jeff
1c61de8880 add admin stuff to mod panel 2015-09-19 08:54:54 -04:00
jeff
8d146ed6cd change background gradient 2015-09-19 07:39:36 -04:00
jeff
9a807bbebf do not use red 2015-09-17 16:52:28 -04:00
jeff
61fc6d076f make dark 2015-09-17 16:50:32 -04:00
jeff
5a2500dffc make dark 2015-09-17 16:46:21 -04:00
jeff
021721d21e ammend build docs 2015-09-08 22:32:28 -04:00
jeff
2304d3d8fa css tweaks 2015-09-08 22:30:41 -04:00
jeff
c340d215e0 css tweaks 2015-09-08 22:29:26 -04:00
jeff
9e0029772c css tweaks 2015-09-08 22:27:29 -04:00
jeff
1663abcbec css tweaks 2015-09-08 22:26:07 -04:00
jeff
b58e582f0a css tweaks 2015-09-08 22:20:20 -04:00
jeff
1cfa104e4c ammend css 2015-09-08 22:04:39 -04:00
jeff
dc06baba37 fix templates 2015-09-05 15:36:36 -04:00
jeff
838bbc20cd add reply link to posts 2015-09-05 15:29:14 -04:00
jeff
487e392d76 fix thumbnailer 2015-09-05 11:05:32 -04:00
jeff
90276293e1 change thumbs.sh tool to use new thumbnailing 2015-09-05 11:03:04 -04:00
jeff
8411568530 make it so that we don't error when we have no postform, i.e. ukko 2015-09-04 17:20:02 -04:00
jeff
de51b912ff have ukko load nntpchan.js 2015-09-04 17:18:36 -04:00
jeff
8b206740f8 forgot a brace 2015-09-04 17:16:43 -04:00
jeff
be7e510519 try fixing backlinks 2015-09-04 17:14:05 -04:00
jeff
abefe50eb6 make post numbers insert backlink on click 2015-09-04 17:09:43 -04:00
jeff
fb06097557 resolve conflict 2015-09-04 16:51:19 -04:00
jeff
7ba0e728af truncate posts and threads 2015-09-04 16:47:52 -04:00
jeff
f9ea948071 psy tag 2015-08-31 16:58:30 -04:00
jeff
a2fd94a83e add spoiler css 2015-08-31 16:41:25 -04:00
jeff
fd1193f73a add redtext css rules 2015-08-31 16:14:32 -04:00
Jeff
64cd178b2a Merge pull request #1 from Erkan-Yilmaz/patch-1
change 1 word
2015-08-31 15:46:31 -04:00
jeff
fffd5beea5 update readme 2015-08-31 13:33:08 -04:00
Erkan Yilmaz
4b56272fdd change 1 word
to: cryptographically
2015-08-31 18:25:45 +02:00
jeff
1f346b9da7 ammend readme to have users check out stable tags 2015-08-31 11:09:26 -04:00
jeff
cb5f7f2453 add thumb.sh tool 2015-08-31 10:58:28 -04:00
1620 changed files with 590274 additions and 494 deletions

5
.github/CONTRIBUTING.md vendored Normal file
View File

@@ -0,0 +1,5 @@
* be awesome to each other
* fun is required, don't be a killjoy
* **vendor everything**

21
.github/issue_template.md vendored Normal file
View File

@@ -0,0 +1,21 @@
## info
git revision / version: [git revision or version here]
OS: [os here]
Architecture: [architecture here]
## problem
[insert description of problem here]
## backtrace / error messages
Error messages: [yes/no]
[insert any error messages here]
Backtrace: [yes/no]
[insert any backtraces here]

29
.gitignore vendored
View File

@@ -8,10 +8,35 @@
.\#*
# srnd config files
*.ini
srnd.ini
feeds.ini
# default article store directory
articles
# generated files
webroot
webroot
# built binaries
go
gopherjs_go
./srndv2
# private key
*.key
# certificates
certs
rebuild.sh
.gx
# generated js
contrib/static/nntpchan.js
contrib/static/js/nntpchan.js
contrib/static/miner-js.js
#docs trash
doc/.trash

30
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,30 @@
**You have been visited by the CoC(K)**
_.+._
(^\/^\/^)
\@☆@☆@/
CoC(k) {_____}
Code Of Conduct Killer _oOPPYbo.
_,ooO8O' `Ob
_,ooOPP"' Ob dO
_oooOP"'' `Oo. ,O[
Ob _,ooOPP'' `YYboOP
`O[ _ooOP"'' _,oOPP"'
YOooooOP' _ooOP"'
'' ,ooOP''
,odPP''
_,oOP'
ooOP"'
_oOP'o
,OP YOL
,O. ,OP Yb contribute code or you're a racist
dO' " Yb get offended as a responsible adult
]O. dO spread this like happy herpes
Ob _,o. dOP
`Ooo___ooOP'`YbooodPP just imagine what would happen
'`"""'' `''' if we all decided to understand
Sweet blessing be upon you but **ONLY** if comment `ebin` to this commit.

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2015 Jeff Becker
Copyright (c) 2015-2020 Jeff Becker
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

108
Makefile Normal file
View File

@@ -0,0 +1,108 @@
REPO=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
REPO_GOPATH=$(REPO)/go
MINIFY=$(REPO_GOPATH)/bin/minify
STATIC_DIR=$(REPO)/contrib/static
JS=$(STATIC_DIR)/nntpchan.js
MINER_JS=$(STATIC_DIR)/miner-js.js
CONTRIB_JS=$(REPO)/contrib/js/contrib
LOCAL_JS=$(REPO)/contrib/js/nntpchan
VENDOR_JS=$(REPO)/contrib/js/vendor
SRND_DIR=$(REPO)/contrib/backends/srndv2
NNTPCHAND_DIR=$(REPO)/contrib/backends/nntpchand
NNTPCHAN_DAEMON_DIR=$(REPO)/contrib/backends/nntpchan-daemon
SRND=$(REPO)/srndv2
NNTPCHAND=$(REPO)/nntpchand
NNTPD=$(REPO)/nntpd
GOROOT=$(shell go env GOROOT)
GO=$(GOROOT)/bin/go
GOPHERJS_GOROOT ?= $(GOROOT)
GOPHERJS_GO = $(GOPHERJS_GOROOT)/bin/go
GOPHERJS_GOPATH=$(REPO)/gopherjs_go
GOPHERJS=$(GOPHERJS_GOPATH)/bin/gopherjs
all: clean build
build: js srnd
full: clean full-build
full-build: srnd beta native
js: $(JS)
srnd: $(SRND)
$(MINIFY):
GO111MODULE=on GOPATH=$(REPO_GOPATH) go get -u github.com/tdewolff/minify
$(GOPHERJS):
GOROOT=$(GOPHERJS_GOROOT) GOPATH=$(GOPHERJS_GOPATH) $(GOPHERJS_GO) get -v github.com/gopherjs/gopherjs
js-deps: $(MINIFY)
$(MINER_JS): $(GOPHERJS) $(MINIFY)
rm -rf $(GOPHERJS_GOPATH)/pkg/
cp -rf $(SRND_DIR)/src/github.com $(GOPHERJS_GOPATH)/src/
GOROOT=$(GOPHERJS_GOROOT) GOPATH=$(GOPHERJS_GOPATH) $(GOPHERJS) -m -v build github.com/ZiRo-/cuckgo/miner_js -o miner.js
$(MINIFY) --mime=text/javascript > $(STATIC_DIR)/miner-js.js < miner.js
rm -f miner.js.map miner.js
$(JS): js-deps
$(SRND):
GOROOT=$(GOROOT) $(MAKE) -C $(SRND_DIR)
cp $(SRND_DIR)/srndv2 $(SRND)
beta: $(NNTPCHAND)
$(NNTPCHAND):
GOROOT=$(GOROOT) $(MAKE) -C $(NNTPCHAND_DIR)
cp $(NNTPCHAND_DIR)/nntpchand $(NNTPCHAND)
native: $(NNTPD)
$(NNTPD):
$(MAKE) -C $(NNTPCHAN_DAEMON_DIR)
cp $(NNTPCHAN_DAEMON_DIR)/nntpd $(NNTPD)
test: test-srnd
test-full: test-srnd test-beta test-native
test-srnd:
GOROOT=$(GOROOT) $(MAKE) -C $(SRND_DIR) test
test-beta:
GOROOT=$(GOROOT) $(MAKE) -C $(NNTPCHAND_DIR) test
test-native:
GOROOT=$(GOROOT) $(MAKE) -C $(NNTPCHAN_DAEMON_DIR) test
clean: clean-srnd clean-js
clean-full: clean clean-beta clean-native clean-js
clean-srnd:
rm -f $(SRND)
GOROOT=$(GOROOT) $(MAKE) -C $(SRND_DIR) clean
clean-js:
rm -f $(JS) $(MINER_JS)
clean-beta:
rm -f $(NNTPCHAND)
GOROOT=$(GOROOT) $(MAKE) -C $(NNTPCHAND_DIR) clean
clean-native:
rm -f $(NNTPD)
$(MAKE) -C $(NNTPCHAN_DAEMON_DIR) clean
distclean: clean
rm -rf $(REPO_GOPATH)
rm -rf $(GOPHERJS_GOPATH)

119
README.md
View File

@@ -1,32 +1,107 @@
# NNTPChan #
NNTPChan (previously known as overchan) is a decentralized imageboard that uses nntp to synchronize content between many different servers. It utilizes cryptograpghicly signed posts to perform optional/opt-in decentralized moderation.
![le ebin logo](nntpchan.png "ebin logo")
This repository contains resources used by the core daemon which is located [here](https://github.com/majestrate/srndv2) along with general documentation, [here](doc/)
## getting started ##
After you [built and installed the daemon](doc/build.md) and [set up your database](doc/database.md), clone this repository and start up the daemon
# clone it
git clone https://github.com/majestrate/nntpchan ~/nntpchan
cd ~/nntpchan
# set up the workspace
srndv2 setup
# run the daemon
srndv2 run
![MIT License](https://img.shields.io/github/license/majestrate/nntpchan.svg)
![Logo is ebin](https://img.shields.io/badge/logo-ebin-brightgreen.svg)
Then open http://127.0.0.1:18000/ukko.html in your browser.
**NNTPChan** (previously known as overchan) is a decentralized imageboard that uses the [NNTP protocol](https://en.wikipedia.org/wiki/Network_News_Transfer_Protocol) (network-news transfer protocol) to synchronize content between many different servers. It utilizes cryptographically signed posts to perform optional/opt-in decentralized moderation.
*PLEASE* report any bugs you find while setting up or building [(here)](https://github.com/majestrate/nntpchan/issues) so that the problems get fixed (^:
## Getting started Ubuntu 24.04 installation guide
For peering requests, questions or support find me on [rizon](https://qchat.rizon.net/?channels=#nntpchan) as \__uguu\__
[This](doc) is a step-by-step guide for getting up-and-running with NNTPChan as well as documentation for developers who want to either work on NNTPChan directly or use NNTPChan in their aplications with the API. It works fine on ubuntu 24.04
### Step 1: Download Go 1.15 Tarball
```
wget https://dl.google.com/go/go1.15.linux-amd64.tar.gz
```
### Step 2: Extract the Tarball
```
sudo tar -C /usr/local -xvzf go1.15.linux-amd64.tar.gz
```
### Set Up Go Environment Variables
```
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
```
### Install the dependancies
sudo apt-get update
sudo apt-get --no-install-recommends install imagemagick ffmpeg sox build-essential git ca-certificates postgresql postgresql-client golang
### Get the NNTPChan source
git clone https://github.com/konamicode9/nntpchan
cd nntpchan
### Now compile!
Run `make`:
make
## now its time to create the database in postgres
```
CREATE DATABASE root;
CREATE USER root WITH PASSWORD 'root';
GRANT ALL PRIVILEGES ON DATABASE root TO root;
```
note this only allows db root and username root
not sure why but i will investigate oh and the default port is 5432
your gonna need it in the installation
Running NNTPChan
================
Once you have [built NNTPChan](building.md) and done [the initial setup you](setting-up.md) you can start NNTPChan.
Before running make sure you run the setup command, you only need to do this one time:
./srndv2 setup
You can now start the NNTPChan node (srndv2) by running:
./srndv2 run
Now you can check out the web-interface by navigating to 127.0.0.1:18000 (default address - unless you have changed it in your `srnd.ini`) or you can [configure your newsreader](extras/configure-newsreader.md).
Like this project? Fund it:
## Support chat
bitcoin: 15yuMzuueV8y5vPQQ39ZqQVz5Ey98DNrjE
https://discord.gg/Ydss9wTk7G
## Bugs and issues
*PLEASE* report any bugs you find while building, setting-up or using NNTPChan on the [GitHub issue tracker](https://github.com/majestrate/nntpchan/issues), the [issue tracker on tor](http://git.psii2pdloxelodts.onion/psi/nntpchan/), the [issue tracker on i2p](http://git.psi.i2p/psi/nntpchan/) or on the [GitGud issue tracker](https://gitgud.io/jeff/nntpchan/issues) so that the probelms can be resolved or discussed.
## Clients
NNTP (confirmed working):
* Thunderbird
Web:
* [Yukko](https://github.com/faissaloo/Yukko): ncurses based nntpchan web ui reader
## History
* started in mid 2013 on anonet
This is a graph of the post flow of the `overchan.test` newsgroup over 4 years, quite a big network.
(thnx anon who made this btw)
![network topology of 4 years](topology.png "changolia")
[source code for map generation](https://github.com/nilesr/nntpchan-mapper)
## Acknowledgements
* [Deavmi](https://deavmi.carteronline.net/) - Making the documentation beautiful.

10
TODO.md Normal file
View File

@@ -0,0 +1,10 @@
## TODO ##
* imrpove frontend templates
* extra stylesheets
* better mod panel
* easier peering
* improve command line mod tools
* refactor srnd package
* configurable thumbnail size [issue #40](https://github.com/majestrate/nntpchan/issues/40)
* postgres password bug [issue #137](https://github.com/majestrate/nntpchan/issues/137)

View File

@@ -0,0 +1,14 @@
TabWidth: 2
UseTab: Never
ColumnLimit: 120
IndentWidth: 2
Language: Cpp
BreakBeforeBraces: Custom
BraceWrapping:
AfterClass: true
AfterControlStatement: true
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterStruct: true
BeforeElse: true

View File

@@ -0,0 +1,6 @@
*.o
*.a
nntpd
tools/authtool
tools/testtool
.gdb_history

View File

@@ -0,0 +1,80 @@
REPO=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
NNTPCHAN_PATH = $(REPO)/libnntpchan
NNTPCHAN_SRC := $(wildcard $(NNTPCHAN_PATH)/*.cpp)
NNTPCHAN_HDR := $(wildcard $(NNTPCHAN_PATH)/*.hpp)
NNTPCHAN_OBJ := $(NNTPCHAN_SRC:.cpp=.o)
HEADERS_PATH=$(REPO)/include
TOOL_PATH := $(REPO)/tools
TOOL_SRC := $(wildcard $(TOOL_PATH)/*.cpp)
TOOLS := $(TOOL_SRC:.cpp=)
SRCS = $(NNTPCHAN_SRC) $(TOOL_SRC)
OBJ := $(NNTPCHAN_OBJ)
TEST = $(REPO)/test
DAEMON_SRC = $(REPO)/daemon
LD_FLAGS ?=
INC_FLAGS = -I$(HEADERS_PATH)
ifeq ($(shell uname -s),FreeBSD)
LD_FLAGS += $(shell dirname $(CXX))/../lib/libc++experimental.a
INC_FLAGS += -I/usr/local/include
LD_FLAGS += /usr/local/lib/libsodium.a
else
LD_FLAGS += -lstdc++fs
INC_FLAGS += $(shell pkg-config --cflags libsodium)
LD_FLAGS += $(shell pkg-config --libs --static libsodium)
endif
REQUIRED_CXXFLAGS = -std=c++17 -Wall -Wextra -Werror -pedantic $(INC_FLAGS)
DEBUG = 1
ifeq ($(DEBUG),1)
REQUIRED_CXXFLAGS += -g
endif
CXXFLAGS += $(REQUIRED_CXXFLAGS)
NNTPCHAN_LIB = $(REPO)/libnntpchan.a
LIBS = $(NNTPCHAN_LIB)
EXE = $(REPO)/nntpd
all: build
format:
clang-format -i $(SRCS)
build: $(EXE) tools
$(NNTPCHAN_LIB): $(NNTPCHAN_OBJ)
$(AR) -r $(NNTPCHAN_LIB) $(NNTPCHAN_OBJ)
$(EXE): $(LIBS)
$(CXX) $(CXXFLAGS) $(DAEMON_SRC)/main.cpp $(LIBS) $(LD_FLAGS) -o $(EXE)
tools: $(TOOLS)
$(TOOLS): $(LIBS)
$(CXX) $(CXXFLAGS) $@.cpp $(LIBS) $(LD_FLAGS) -o $@
build-test: $(LIBS)
$(CXX) -o $(TEST) $(CXXFLAGS) test.cpp $(LIBS) $(LD_FLAGS)
test: build-test
$(TEST)
clean:
$(RM) $(OBJ) $(LIBS) $(EXE) $(TOOLS) $(TEST)

View File

@@ -0,0 +1,19 @@
# nntpchan-daemon
C++ rewrite
requirements:
* C++17 compiler
* libsodium 1.x
* GNU Make
building on freebsd:
$ gmake
building on Linux:
$ make

View File

@@ -0,0 +1,2 @@
#!/bin/sh
exit 0

View File

@@ -0,0 +1,197 @@
/**
* The MIT License (MIT)
* Copyright (c) <2015> <carriez.md@gmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
#ifndef INI_HPP
#define INI_HPP
#include <cassert>
#include <cstring>
#include <fstream>
#include <iostream>
#include <list>
#include <map>
#include <stdexcept>
#include <string>
namespace INI
{
struct Level
{
Level() : parent(NULL), depth(0) {}
Level(Level *p) : parent(p), depth(0) {}
typedef std::map<std::string, std::string> value_map_t;
typedef std::map<std::string, Level> section_map_t;
typedef std::list<value_map_t::const_iterator> values_t;
typedef std::list<section_map_t::const_iterator> sections_t;
value_map_t values;
section_map_t sections;
values_t ordered_values; // original order in the ini file
sections_t ordered_sections;
Level *parent;
size_t depth;
const std::string &operator[](const std::string &name) { return values[name]; }
Level &operator()(const std::string &name) { return sections[name]; }
};
class Parser
{
public:
Parser(const char *fn);
Parser(std::istream &f) : f_(&f), ln_(0) { parse(top_); }
Level &top() { return top_; }
void dump(std::ostream &s) { dump(s, top(), ""); }
private:
void dump(std::ostream &s, const Level &l, const std::string &sname);
void parse(Level &l);
void parseSLine(std::string &sname, size_t &depth);
void err(const char *s);
private:
Level top_;
std::ifstream f0_;
std::istream *f_;
std::string line_;
size_t ln_;
};
inline void Parser::err(const char *s)
{
char buf[256];
sprintf(buf, "%s on line #%ld", s, ln_);
throw std::runtime_error(buf);
}
inline std::string trim(const std::string &s)
{
char p[] = " \t\r\n";
long sp = 0;
long ep = s.length() - 1;
for (; sp <= ep; ++sp)
if (!strchr(p, s[sp]))
break;
for (; ep >= 0; --ep)
if (!strchr(p, s[ep]))
break;
return s.substr(sp, ep - sp + 1);
}
inline Parser::Parser(const char *fn) : f0_(fn), f_(&f0_), ln_(0)
{
if (!f0_)
throw std::runtime_error(std::string("failed to open file: ") + fn);
parse(top_);
}
inline void Parser::parseSLine(std::string &sname, size_t &depth)
{
depth = 0;
for (; depth < line_.length(); ++depth)
if (line_[depth] != '[')
break;
sname = line_.substr(depth, line_.length() - 2 * depth);
}
inline void Parser::parse(Level &l)
{
while (std::getline(*f_, line_))
{
++ln_;
if (line_[0] == '#' || line_[0] == ';')
continue;
line_ = trim(line_);
if (line_.empty())
continue;
if (line_[0] == '[')
{
size_t depth;
std::string sname;
parseSLine(sname, depth);
Level *lp = NULL;
Level *parent = &l;
if (depth > l.depth + 1)
err("section with wrong depth");
if (l.depth == depth - 1)
lp = &l.sections[sname];
else
{
lp = l.parent;
size_t n = l.depth - depth;
for (size_t i = 0; i < n; ++i)
lp = lp->parent;
parent = lp;
lp = &lp->sections[sname];
}
if (lp->depth != 0)
err("duplicate section name on the same level");
if (!lp->parent)
{
lp->depth = depth;
lp->parent = parent;
}
parent->ordered_sections.push_back(parent->sections.find(sname));
parse(*lp);
}
else
{
size_t n = line_.find('=');
if (n == std::string::npos)
err("no '=' found");
std::pair<Level::value_map_t::const_iterator, bool> res =
l.values.insert(std::make_pair(trim(line_.substr(0, n)), trim(line_.substr(n + 1, line_.length() - n - 1))));
if (!res.second)
err("duplicated key found");
l.ordered_values.push_back(res.first);
}
}
}
inline void Parser::dump(std::ostream &s, const Level &l, const std::string &sname)
{
if (!sname.empty())
s << '\n';
for (size_t i = 0; i < l.depth; ++i)
s << '[';
if (!sname.empty())
s << sname;
for (size_t i = 0; i < l.depth; ++i)
s << ']';
if (!sname.empty())
s << std::endl;
for (Level::values_t::const_iterator it = l.ordered_values.begin(); it != l.ordered_values.end(); ++it)
s << (*it)->first << '=' << (*it)->second << std::endl;
for (Level::sections_t::const_iterator it = l.ordered_sections.begin(); it != l.ordered_sections.end(); ++it)
{
assert((*it)->second.depth == l.depth + 1);
dump(s, (*it)->second, (*it)->first);
}
}
}
#endif // INI_HPP

View File

@@ -0,0 +1,164 @@
#include "ini.hpp"
#include <nntpchan/crypto.hpp>
#include <nntpchan/event.hpp>
#include <nntpchan/exec_frontend.hpp>
#include <nntpchan/nntp_server.hpp>
#include <nntpchan/staticfile_frontend.hpp>
#include <nntpchan/storage.hpp>
#include <string>
#include <vector>
int main(int argc, char *argv[], char * argenv[])
{
if (argc != 2)
{
std::cerr << "usage: " << argv[0] << " config.ini" << std::endl;
return 1;
}
nntpchan::Crypto crypto;
std::unique_ptr<nntpchan::ev::Loop> loop(nntpchan::NewMainLoop());
std::unique_ptr<nntpchan::NNTPServer> nntp = std::make_unique<nntpchan::NNTPServer>(loop.get());
std::string fname(argv[1]);
std::ifstream i(fname);
if (i.is_open())
{
INI::Parser conf(i);
std::vector<std::string> requiredSections = {"nntp", "articles"};
auto &level = conf.top();
for (const auto &section : requiredSections)
{
if (level.sections.find(section) == level.sections.end())
{
std::cerr << "config file " << fname << " does not have required section: ";
std::cerr << section << std::endl;
return 1;
}
}
auto &storeconf = level.sections["articles"].values;
if (storeconf.find("store_path") == storeconf.end())
{
std::cerr << "storage section does not have 'store_path' value" << std::endl;
return 1;
}
nntp->SetStoragePath(storeconf["store_path"]);
auto &nntpconf = level.sections["nntp"].values;
if (nntpconf.find("bind") == nntpconf.end())
{
std::cerr << "nntp section does not have 'bind' value" << std::endl;
return 1;
}
if (nntpconf.find("instance_name") == nntpconf.end())
{
std::cerr << "nntp section lacks 'instance_name' value" << std::endl;
return 1;
}
nntp->SetInstanceName(nntpconf["instance_name"]);
if (nntpconf.find("authdb") != nntpconf.end())
{
nntp->SetLoginDB(nntpconf["authdb"]);
}
if (level.sections.find("frontend") != level.sections.end())
{
// frontend enabled
auto &frontconf = level.sections["frontend"].values;
if (frontconf.find("type") == frontconf.end())
{
std::cerr << "frontend section provided but 'type' value not provided" << std::endl;
return 1;
}
auto &ftype = frontconf["type"];
if (ftype == "exec")
{
if (frontconf.find("exec") == frontconf.end())
{
std::cerr << "exec frontend specified but no 'exec' value provided" << std::endl;
return 1;
}
nntp->SetFrontend(new nntpchan::ExecFrontend(frontconf["exec"], argenv));
}
else if (ftype == "staticfile")
{
auto required = {"template_dir", "out_dir", "template_dialect", "max_pages"};
for (const auto &opt : required)
{
if (frontconf.find(opt) == frontconf.end())
{
std::cerr << "staticfile frontend specified but no '" << opt << "' value provided" << std::endl;
return 1;
}
}
auto maxPages = std::stoi(frontconf["max_pages"]);
if (maxPages <= 0)
{
std::cerr << "max_pages invalid value '" << frontconf["max_pages"] << "'" << std::endl;
return 1;
}
auto & dialect = frontconf["template_dialect"];
auto templateEngine = nntpchan::CreateTemplateEngine(dialect);
if(templateEngine == nullptr)
{
std::cerr << "invalid template dialect '" << dialect << "'" << std::endl;
return 1;
}
nntp->SetFrontend(new nntpchan::StaticFileFrontend(templateEngine, frontconf["template_dir"], frontconf["out_dir"], maxPages));
}
else
{
std::cerr << "unknown frontend type '" << ftype << "'" << std::endl;
return 1;
}
}
else
{
std::cerr << "no frontend configured, running without generating markup" << std::endl;
}
auto &a = nntpconf["bind"];
try
{
if(nntp->Bind(a))
{
std::cerr << "nntpd for " << nntp->InstanceName() << " bound to " << a << std::endl;
}
else
{
std::cerr << "nntpd for " << nntp->InstanceName() << " failed to bind to " << a << ": "<< strerror(errno) << std::endl;
return 1;
}
} catch (std::exception &ex)
{
std::cerr << "failed to bind: " << ex.what() << std::endl;
return 1;
}
loop->Run();
std::cerr << "Exiting" << std::endl;
}
else
{
std::cerr << "failed to open " << fname << std::endl;
return 1;
}
}

View File

@@ -0,0 +1,22 @@
#ifndef NNTPCHAN_BASE64_HPP
#define NNTPCHAN_BASE64_HPP
#include <string>
#include <vector>
namespace nntpchan
{
/** returns base64 encoded string */
std::string B64Encode(const uint8_t *data, const std::size_t l);
/** @brief returns true if decode was successful */
bool B64Decode(const std::string &data, std::vector<uint8_t> &out);
/** returns base32 encoded string */
std::string B32Encode(const uint8_t *data, const std::size_t l);
/** @brief returns true if decode was successful */
bool B32Decode(const std::string &data, std::vector<uint8_t> &out);
}
#endif

View File

@@ -0,0 +1,28 @@
#ifndef NNTPCHAN_CRYPTO_HPP
#define NNTPCHAN_CRYPTO_HPP
#include <array>
#include <sodium/crypto_hash.h>
#include <sodium/crypto_generichash.h>
namespace nntpchan
{
typedef std::array<uint8_t, crypto_hash_BYTES> SHA512Digest;
void SHA512(const uint8_t *d, std::size_t l, SHA512Digest &h);
typedef std::array<uint8_t, crypto_generichash_BYTES> Blake2BDigest;
void Blake2B(const uint8_t *d, std::size_t l, Blake2BDigest & h);
std::string Blake2B_base32(const std::string & str);
/** global crypto initializer */
struct Crypto
{
Crypto();
~Crypto();
};
}
#endif

View File

@@ -0,0 +1,52 @@
#ifndef NNTPCHAN_EVENT_HPP
#define NNTPCHAN_EVENT_HPP
#include <unistd.h>
#include <cstdint>
#include <string>
#include <sys/socket.h>
namespace nntpchan
{
namespace ev
{
struct io
{
int fd;
io(int f) : fd(f) {};
virtual ~io() {};
virtual bool readable() const { return true; };
virtual int read(char * buf, size_t sz) = 0;
virtual bool writeable() const { return true; };
virtual int write(size_t avail) = 0;
virtual bool keepalive() = 0;
virtual void close()
{
if(fd!=-1)
{
::close(fd);
}
};
virtual bool acceptable() const { return false; };
virtual int accept() { return -1; };
};
struct Loop
{
public:
virtual ~Loop() {};
bool BindTCP(const sockaddr * addr, ev::io * handler);
virtual bool TrackConn(ev::io * handler) = 0;
virtual void UntrackConn(ev::io * handler) = 0;
virtual void Run() = 0;
bool SetNonBlocking(ev::io *handler);
};
}
ev::Loop * NewMainLoop();
}
#endif

View File

@@ -0,0 +1,28 @@
#ifndef NNTPCHAN_EXEC_FRONTEND_HPP
#define NNTPCHAN_EXEC_FRONTEND_HPP
#include "frontend.hpp"
#include <deque>
namespace nntpchan
{
class ExecFrontend : public Frontend
{
public:
ExecFrontend(const std::string &exe, char * const* env);
~ExecFrontend();
void ProcessNewMessage(const fs::path &fpath);
bool AcceptsNewsgroup(const std::string &newsgroup);
bool AcceptsMessage(const std::string &msgid);
private:
int Exec(std::deque<std::string> args);
private:
char * const* m_Environ;
std::string m_exec;
};
}
#endif

View File

@@ -0,0 +1,23 @@
#ifndef NNTPCHAN_FILE_HANDLE_HPP
#define NNTPCHAN_FILE_HANDLE_HPP
#include <experimental/filesystem>
#include <fstream>
#include <memory>
namespace nntpchan
{
typedef std::unique_ptr<std::fstream> FileHandle_ptr;
enum FileMode
{
eRead,
eWrite
};
namespace fs = std::experimental::filesystem;
FileHandle_ptr OpenFile(const fs::path &fname, FileMode mode);
}
#endif

View File

@@ -0,0 +1,28 @@
#ifndef NNTPCHAN_FRONTEND_HPP
#define NNTPCHAN_FRONTEND_HPP
#include <experimental/filesystem>
#include <memory>
#include <string>
namespace nntpchan
{
namespace fs = std::experimental::filesystem;
/** @brief nntpchan frontend ui interface */
class Frontend
{
public:
virtual ~Frontend() {};
/** @brief process an inbound message stored at fpath that we have accepted. */
virtual void ProcessNewMessage(const fs::path &fpath) = 0;
/** @brief return true if we take posts in a newsgroup */
virtual bool AcceptsNewsgroup(const std::string &newsgroup) = 0;
/** @brief return true if we will accept a message given its message-id */
virtual bool AcceptsMessage(const std::string &msgid) = 0;
};
typedef std::unique_ptr<Frontend> Frontend_ptr;
}
#endif

View File

@@ -0,0 +1,4 @@
#ifndef NNTPCHAN_HTTP_HPP
#define NNTPCHAN_HTTP_HPP
#endif

View File

@@ -0,0 +1,4 @@
#ifndef NNTPCHAN_HTTP_CLIENT_HPP
#define NNTPCHAN_HTTP_CLIENT_HPP
#endif

View File

@@ -0,0 +1,4 @@
#ifndef NNTPCHAN_HTTP_SERVER_HPP
#define NNTPCHAN_HTTP_SERVER_HPP
#endif

View File

@@ -0,0 +1,11 @@
#ifndef NNTPCHAN_IO_HANDLE_HPP
#define NNTPCHAN_IO_HANDLE_HPP
#include <iostream>
#include <memory>
namespace nntpchan
{
typedef std::unique_ptr<std::iostream> IOHandle_ptr;
}
#endif

View File

@@ -0,0 +1,29 @@
#ifndef NNTPCHAN_LINE_HPP
#define NNTPCHAN_LINE_HPP
#include "server.hpp"
#include <stdint.h>
#include <sstream>
namespace nntpchan
{
/** @brief a buffered line reader */
class LineReader
{
public:
/** @brief queue inbound data from connection */
void Data(const char *data, ssize_t s);
protected:
/** @brief handle a line from the client */
virtual void HandleLine(const std::string line) = 0;
private:
std::stringstream m_line;
std::string m_leftover;
};
}
#endif

View File

@@ -0,0 +1,22 @@
#ifndef NNTPCHAN_MESSAGE_HPP
#define NNTPCHAN_MESSAGE_HPP
#include <memory>
#include <nntpchan/model.hpp>
namespace nntpchan
{
struct MessageDB
{
using BoardPage = nntpchan::model::BoardPage;
using Thread = nntpchan::model::Thread;
virtual ~MessageDB() {};
virtual bool LoadBoardPage(BoardPage &board, const std::string &newsgroup, uint32_t perpage, uint32_t page) const = 0;
virtual bool FindThreadByHash(const std::string &hashhex, std::string &msgid) const = 0;
virtual bool LoadThread(Thread &thread, const std::string &rootmsgid) const = 0;
};
typedef std::unique_ptr<MessageDB> MessageDB_ptr;
}
#endif

View File

@@ -0,0 +1,29 @@
#ifndef NNTPCHAN_MIME_HPP
#define NNTPCHAN_MIME_HPP
#include "file_handle.hpp"
#include "io_handle.hpp"
#include <functional>
#include <map>
#include <string>
namespace nntpchan
{
typedef std::map<std::string, std::string> RawHeader;
bool ReadHeader(const FileHandle_ptr &f, RawHeader &h);
struct MimePart
{
virtual RawHeader &Header() = 0;
virtual IOHandle_ptr OpenPart() = 0;
};
typedef std::unique_ptr<MimePart> MimePart_ptr;
typedef std::function<bool(MimePart_ptr)> PartReader;
bool ReadParts(const FileHandle_ptr &f, PartReader r);
}
#endif

View File

@@ -0,0 +1,65 @@
#ifndef NNTPCHAN_MODEL_HPP
#define NNTPCHAN_MODEL_HPP
#include <algorithm>
#include <map>
#include <nntpchan/sanitize.hpp>
#include <set>
#include <string>
#include <tuple>
#include <variant>
#include <vector>
namespace nntpchan
{
namespace model
{
// MIME Header
typedef std::map<std::string, std::vector<std::string>> PostHeader;
// text post contents
typedef std::string PostBody;
// single file attachment, (orig_filename, hexdigest, thumb_filename)
typedef std::tuple<std::string, std::string, std::string> PostAttachment;
// all attachments on a post
typedef std::vector<PostAttachment> Attachments;
// a post (header, Post Text, Attachments)
typedef std::tuple<PostHeader, PostBody, Attachments> Post;
// a thread (many posts in post order)
typedef std::vector<Post> Thread;
// a board page is many threads in bump order
struct BoardPage
{
std::vector<Thread> threads = {};
std::string name = "";
uint32_t pageno = 0;
};
static inline const std::string &GetFilename(const PostAttachment &att) { return std::get<0>(att); }
static inline const std::string &GetHexDigest(const PostAttachment &att) { return std::get<1>(att); }
static inline const std::string &GetThumbnail(const PostAttachment &att) { return std::get<2>(att); }
static inline const PostHeader &GetHeader(const Post &post) { return std::get<0>(post); }
static inline const PostBody &GetBody(const Post &post) { return std::get<1>(post); }
static inline const Attachments &GetAttachments(const Post &post) { return std::get<2>(post); }
static inline const std::string &HeaderIFind(const PostHeader &header, const std::string &val,
const std::string &fallback)
{
std::string ival = ToLower(val);
auto itr = std::find_if(header.begin(), header.end(),
[ival](const auto &item) -> bool { return ToLower(item.first) == ival; });
if (itr == std::end(header))
return fallback;
else
return itr->second[0];
}
using Model = std::variant<Thread, BoardPage>;
}
}
#endif

View File

@@ -0,0 +1,24 @@
#ifndef NNTPCHAN_NET_HPP
#define NNTPCHAN_NET_HPP
#include <netinet/in.h>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
namespace nntpchan
{
struct NetAddr
{
NetAddr();
sockaddr_in6 addr;
operator sockaddr *() { return (sockaddr *)&addr; }
operator const sockaddr *() const { return (sockaddr *)&addr; }
std::string to_string();
};
NetAddr ParseAddr(const std::string &addr);
}
#endif

View File

@@ -0,0 +1,64 @@
#ifndef NNTPCHAN_NNTP_AUTH_HPP
#define NNTPCHAN_NNTP_AUTH_HPP
#include "line.hpp"
#include <fstream>
#include <iostream>
#include <memory>
#include <mutex>
#include <string>
namespace nntpchan
{
/** @brief nntp credential db interface */
class NNTPCredentialDB
{
public:
/** @brief open connection to database, return false on error otherwise return true */
virtual bool Open() = 0;
/** @brief close connection to database */
virtual void Close() = 0;
/** @brief return true if username password combo is correct */
virtual bool CheckLogin(const std::string &user, const std::string &passwd) = 0;
virtual ~NNTPCredentialDB() {}
};
typedef std::shared_ptr<NNTPCredentialDB> CredDB_ptr;
/** @brief nntp credential db using hashed+salted passwords */
class HashedCredDB : public NNTPCredentialDB, public LineReader
{
public:
HashedCredDB();
bool CheckLogin(const std::string &user, const std::string &passwd);
protected:
void SetStream(std::istream *i);
std::string Hash(const std::string &data, const std::string &salt);
void HandleLine(const std::string line);
private:
bool ProcessLine(const std::string &line);
std::mutex m_access;
std::string m_user, m_passwd;
bool m_found;
/** return true if we have a line that matches this username / password combo */
std::istream *m_instream;
};
class HashedFileDB : public HashedCredDB
{
public:
HashedFileDB(const std::string &fname);
~HashedFileDB();
bool Open();
void Close();
private:
std::string m_fname;
std::ifstream f;
};
}
#endif

View File

@@ -0,0 +1,61 @@
#ifndef NNTPCHAN_NNTP_HANDLER_HPP
#define NNTPCHAN_NNTP_HANDLER_HPP
#include "line.hpp"
#include "nntp_auth.hpp"
#include "storage.hpp"
#include <deque>
#include <string>
namespace nntpchan
{
class NNTPServerHandler : public LineReader, public IConnHandler
{
public:
NNTPServerHandler(fs::path storage);
~NNTPServerHandler();
virtual bool ShouldClose();
void SetAuth(CredDB_ptr creds);
virtual void OnData(const char *, ssize_t);
void Greet();
protected:
void HandleLine(const std::string line);
void HandleCommand(const std::deque<std::string> &command);
private:
enum State
{
eStateReadCommand,
eStateStoreArticle,
eStateQuit
};
private:
void EnterState(State st);
void ArticleObtained();
// handle quit command, this queues a reply
void Quit();
// switch nntp modes, this queues a reply
void SwitchMode(const std::string &mode);
bool PostingAllowed();
private:
std::string m_articleName;
FileHandle_ptr m_article;
CredDB_ptr m_auth;
ArticleStorage m_store;
std::string m_mode;
bool m_authed;
State m_state;
};
}
#endif

View File

@@ -0,0 +1,51 @@
#ifndef NNTPCHAN_NNTP_SERVER_HPP
#define NNTPCHAN_NNTP_SERVER_HPP
#include "frontend.hpp"
#include "server.hpp"
#include <deque>
#include <string>
namespace nntpchan
{
class NNTPServer : public Server
{
public:
NNTPServer(ev::Loop * loop);
virtual ~NNTPServer();
void SetStoragePath(const std::string &path);
void SetLoginDB(const std::string path);
void SetInstanceName(const std::string &name);
std::string InstanceName() const;
virtual IServerConn *CreateConn(int fd);
virtual void OnAcceptError(int status);
void SetFrontend(Frontend *f);
private:
std::string m_logindbpath;
std::string m_storagePath;
std::string m_servername;
Frontend_ptr m_frontend;
};
class NNTPServerConn : public IServerConn
{
public:
NNTPServerConn(int fd, Server *parent, IConnHandler *h) : IServerConn(fd, parent, h) {}
virtual bool IsTimedOut() { return false; };
virtual void Greet();
};
}
#endif

View File

@@ -0,0 +1,14 @@
#ifndef NNTPCHAN_SANITIZE_HPP
#define NNTPCHAN_SANITIZE_HPP
#include <string>
namespace nntpchan
{
std::string NNTPSanitizeLine(const std::string &str);
std::string ToLower(const std::string &str);
std::string StripWhitespaces(const std::string &str);
bool IsValidMessageID(const std::string &msgid);
bool IsValidNewsgroup(const std::string &group);
}
#endif

View File

@@ -0,0 +1,96 @@
#ifndef NNTPCHAN_SERVER_HPP
#define NNTPCHAN_SERVER_HPP
#include <deque>
#include <functional>
#include <string>
#include <nntpchan/event.hpp>
namespace nntpchan
{
class Server;
struct IConnHandler
{
virtual ~IConnHandler(){};
/** got inbound data */
virtual void OnData(const char *data, ssize_t s) = 0;
/** get next line of data to send */
std::string GetNextLine();
/** return true if we have a line to send */
bool HasNextLine();
/** return true if we should close this connection otherwise return false */
virtual bool ShouldClose() = 0;
/** queue a data send */
void QueueLine(const std::string &line);
virtual void Greet() = 0;
private:
std::deque<std::string> m_sendlines;
};
/** server connection handler interface */
struct IServerConn : public ev::io
{
IServerConn(int fd, Server *parent, IConnHandler *h);
virtual ~IServerConn();
virtual int read(char * buf, size_t sz);
virtual int write(size_t avail);
virtual void close();
virtual void Greet() = 0;
virtual bool IsTimedOut() = 0;
virtual bool keepalive() ;
Server *Parent() { return m_parent; };
IConnHandler *GetHandler() { return m_handler; };
private:
Server *m_parent;
IConnHandler *m_handler;
std::string m_writeLeftover;
};
class Server : public ev::io
{
public:
Server(ev::Loop * loop);
virtual ~Server() {};
virtual bool acceptable() const { return true; };
virtual void close();
virtual bool readable() const { return false; };
virtual int read(char *,size_t) { return -1; };
virtual bool writeable() const { return false; };
virtual int write(size_t) {return -1; };
virtual int accept();
virtual bool keepalive() { return true; };
/** create connection handler from open stream */
virtual IServerConn *CreateConn(int fd) = 0;
/** bind to address */
bool Bind(const std::string &addr);
typedef std::function<void(IServerConn *)> ConnVisitor;
/** visit all open connections */
void VisitConns(ConnVisitor v);
/** remove connection from server, called after proper close */
void RemoveConn(IServerConn *conn);
private:
void OnAccept(int fd);
ev::Loop * m_Loop;
std::deque<IServerConn *> m_conns;
};
}
#endif

View File

@@ -0,0 +1,11 @@
#ifndef NNTPCHAN_SHA1_HPP
#define NNTPCHAN_SHA1_HPP
#include <string>
namespace nntpchan
{
std::string sha1_hex(const std::string &data);
}
#endif

View File

@@ -0,0 +1,34 @@
#ifndef NNTPCHAN_STATICFILE_FRONTEND_HPP
#define NNTPCHAN_STATICFILE_FRONTEND_HPP
#include "frontend.hpp"
#include "message.hpp"
#include "model.hpp"
#include "template_engine.hpp"
#include <experimental/filesystem>
namespace nntpchan
{
namespace fs = std::experimental::filesystem;
class StaticFileFrontend : public Frontend
{
public:
StaticFileFrontend(TemplateEngine *tmpl, const std::string &templateDir, const std::string &outDir, uint32_t pages);
virtual ~StaticFileFrontend();
virtual void ProcessNewMessage(const fs::path &fpath);
virtual bool AcceptsNewsgroup(const std::string &newsgroup);
virtual bool AcceptsMessage(const std::string &msgid);
private:
MessageDB_ptr m_MessageDB;
TemplateEngine_ptr m_TemplateEngine;
fs::path m_TemplateDir;
fs::path m_OutDir;
uint32_t m_Pages;
};
}
#endif

View File

@@ -0,0 +1,51 @@
#ifndef NNTPCHAN_STORAGE_HPP
#define NNTPCHAN_STORAGE_HPP
#include "file_handle.hpp"
#include "message.hpp"
#include <experimental/filesystem>
#include <string>
namespace nntpchan
{
namespace fs = std::experimental::filesystem;
class ArticleStorage : public MessageDB
{
public:
ArticleStorage(const fs::path &fpath);
~ArticleStorage();
FileHandle_ptr OpenWrite(const std::string &msgid) const;
FileHandle_ptr OpenRead(const std::string &msgid) const;
/**
return true if we should accept a new message give its message id
*/
bool Accept(const std::string &msgid) const;
bool LoadBoardPage(BoardPage &board, const std::string &newsgroup, uint32_t perpage, uint32_t page) const;
bool FindThreadByHash(const std::string &hashhex, std::string &msgid) const;
bool LoadThread(Thread &thread, const std::string &rootmsgid) const;
/** ensure symlinks are formed for this article by message id */
void EnsureSymlinks(const std::string &msgid) const;
private:
void SetPath(const fs::path &fpath);
fs::path MessagePath(const std::string &msgid) const;
bool init_skiplist(const std::string &subdir) const;
fs::path skiplist_root(const std::string &name) const;
fs::path skiplist_dir(const fs::path & root, const std::string & name) const;
fs::path basedir;
};
typedef std::unique_ptr<ArticleStorage> ArticleStorage_ptr;
}
#endif

View File

@@ -0,0 +1,27 @@
#ifndef NNTPCHAN_TEMPLATE_ENGINE_HPP
#define NNTPCHAN_TEMPLATE_ENGINE_HPP
#include "file_handle.hpp"
#include "model.hpp"
#include <any>
#include <map>
#include <memory>
#include <string>
namespace nntpchan
{
struct TemplateEngine
{
virtual ~TemplateEngine() {};
virtual bool WriteBoardPage(const nntpchan::model::BoardPage & page, const FileHandle_ptr &out) = 0;
virtual bool WriteThreadPage(const nntpchan::model::Thread & thread, const FileHandle_ptr &out) = 0;
};
typedef std::unique_ptr<TemplateEngine> TemplateEngine_ptr;
TemplateEngine * CreateTemplateEngine(const std::string &dialect);
}
#endif

View File

@@ -0,0 +1,334 @@
#include <nntpchan/base64.hpp>
// taken from i2pd
namespace i2p
{
namespace data
{
static const char T32[32] = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '2', '3', '4', '5', '6', '7',
};
const char *GetBase32SubstitutionTable() { return T32; }
static void iT64Build(void);
/*
*
* BASE64 Substitution Table
* -------------------------
*
* Direct Substitution Table
*/
static const char T64[64] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '~'};
const char *GetBase64SubstitutionTable() { return T64; }
/*
* Reverse Substitution Table (built in run time)
*/
static char iT64[256];
static int isFirstTime = 1;
/*
* Padding
*/
static char P64 = '=';
/*
*
* ByteStreamToBase64
* ------------------
*
* Converts binary encoded data to BASE64 format.
*
*/
size_t /* Number of bytes in the encoded buffer */
ByteStreamToBase64(const uint8_t *InBuffer, /* Input buffer, binary data */
size_t InCount, /* Number of bytes in the input buffer */
char *OutBuffer, /* output buffer */
size_t len /* length of output buffer */
)
{
unsigned char *ps;
unsigned char *pd;
unsigned char acc_1;
unsigned char acc_2;
int i;
int n;
int m;
size_t outCount;
ps = (unsigned char *)InBuffer;
n = InCount / 3;
m = InCount % 3;
if (!m)
outCount = 4 * n;
else
outCount = 4 * (n + 1);
if (outCount > len)
return 0;
pd = (unsigned char *)OutBuffer;
for (i = 0; i < n; i++)
{
acc_1 = *ps++;
acc_2 = (acc_1 << 4) & 0x30;
acc_1 >>= 2; /* base64 digit #1 */
*pd++ = T64[acc_1];
acc_1 = *ps++;
acc_2 |= acc_1 >> 4; /* base64 digit #2 */
*pd++ = T64[acc_2];
acc_1 &= 0x0f;
acc_1 <<= 2;
acc_2 = *ps++;
acc_1 |= acc_2 >> 6; /* base64 digit #3 */
*pd++ = T64[acc_1];
acc_2 &= 0x3f; /* base64 digit #4 */
*pd++ = T64[acc_2];
}
if (m == 1)
{
acc_1 = *ps++;
acc_2 = (acc_1 << 4) & 0x3f; /* base64 digit #2 */
acc_1 >>= 2; /* base64 digit #1 */
*pd++ = T64[acc_1];
*pd++ = T64[acc_2];
*pd++ = P64;
*pd++ = P64;
}
else if (m == 2)
{
acc_1 = *ps++;
acc_2 = (acc_1 << 4) & 0x3f;
acc_1 >>= 2; /* base64 digit #1 */
*pd++ = T64[acc_1];
acc_1 = *ps++;
acc_2 |= acc_1 >> 4; /* base64 digit #2 */
*pd++ = T64[acc_2];
acc_1 &= 0x0f;
acc_1 <<= 2; /* base64 digit #3 */
*pd++ = T64[acc_1];
*pd++ = P64;
}
return outCount;
}
/*
*
* Base64ToByteStream
* ------------------
*
* Converts BASE64 encoded data to binary format. If input buffer is
* not properly padded, buffer of negative length is returned
*
*/
size_t /* Number of output bytes */
Base64ToByteStream(const char *InBuffer, /* BASE64 encoded buffer */
size_t InCount, /* Number of input bytes */
uint8_t *OutBuffer, /* output buffer length */
size_t len /* length of output buffer */
)
{
unsigned char *ps;
unsigned char *pd;
unsigned char acc_1;
unsigned char acc_2;
int i;
int n;
int m;
size_t outCount;
if (isFirstTime)
iT64Build();
n = InCount / 4;
m = InCount % 4;
if (InCount && !m)
outCount = 3 * n;
else
{
outCount = 0;
return 0;
}
ps = (unsigned char *)(InBuffer + InCount - 1);
while (*ps-- == P64)
outCount--;
ps = (unsigned char *)InBuffer;
if (outCount > len)
return -1;
pd = OutBuffer;
auto endOfOutBuffer = OutBuffer + outCount;
for (i = 0; i < n; i++)
{
acc_1 = iT64[*ps++];
acc_2 = iT64[*ps++];
acc_1 <<= 2;
acc_1 |= acc_2 >> 4;
*pd++ = acc_1;
if (pd >= endOfOutBuffer)
break;
acc_2 <<= 4;
acc_1 = iT64[*ps++];
acc_2 |= acc_1 >> 2;
*pd++ = acc_2;
if (pd >= endOfOutBuffer)
break;
acc_2 = iT64[*ps++];
acc_2 |= acc_1 << 6;
*pd++ = acc_2;
}
return outCount;
}
size_t Base64EncodingBufferSize(const size_t input_size)
{
auto d = div(input_size, 3);
if (d.rem)
d.quot++;
return 4 * d.quot;
}
size_t Base32EncodingBufferSize(const size_t input_size)
{
auto d = div(input_size, 5);
if (d.rem)
d.quot++;
return 8 * d.quot;
}
/*
*
* iT64
* ----
* Reverse table builder. P64 character is replaced with 0
*
*
*/
static void iT64Build()
{
int i;
isFirstTime = 0;
for (i = 0; i < 256; i++)
iT64[i] = -1;
for (i = 0; i < 64; i++)
iT64[(int)T64[i]] = i;
iT64[(int)P64] = 0;
}
size_t Base32ToByteStream(const char *inBuf, size_t len, uint8_t *outBuf, size_t outLen)
{
int tmp = 0, bits = 0;
size_t ret = 0;
for (size_t i = 0; i < len; i++)
{
char ch = inBuf[i];
if (ch >= '2' && ch <= '7') // digit
ch = (ch - '2') + 26; // 26 means a-z
else if (ch >= 'a' && ch <= 'z')
ch = ch - 'a'; // a = 0
else
return 0; // unexpected character
tmp |= ch;
bits += 5;
if (bits >= 8)
{
if (ret >= outLen)
return ret;
outBuf[ret] = tmp >> (bits - 8);
bits -= 8;
ret++;
}
tmp <<= 5;
}
return ret;
}
size_t ByteStreamToBase32(const uint8_t *inBuf, size_t len, char *outBuf, size_t outLen)
{
size_t ret = 0, pos = 1;
int bits = 8, tmp = inBuf[0];
while (ret < outLen && (bits > 0 || pos < len))
{
if (bits < 5)
{
if (pos < len)
{
tmp <<= 8;
tmp |= inBuf[pos] & 0xFF;
pos++;
bits += 8;
}
else // last byte
{
tmp <<= (5 - bits);
bits = 5;
}
}
bits -= 5;
int ind = (tmp >> bits) & 0x1F;
outBuf[ret] = (ind < 26) ? (ind + 'a') : ((ind - 26) + '2');
ret++;
}
return ret;
}
}
}
namespace nntpchan
{
std::string B64Encode(const uint8_t *data, const std::size_t l)
{
std::string out;
out.resize(i2p::data::Base64EncodingBufferSize(l));
i2p::data::ByteStreamToBase64(data, l, &out[0], out.size());
return out;
}
bool B64Decode(const std::string &data, std::vector<uint8_t> &out)
{
out.resize(data.size());
if (i2p::data::Base64ToByteStream(data.c_str(), data.size(), &out[0], out.size()))
{
out.shrink_to_fit();
return true;
}
return false;
}
std::string B32Encode(const uint8_t *data, const std::size_t l)
{
std::string out;
out.resize(i2p::data::Base32EncodingBufferSize(l));
i2p::data::ByteStreamToBase32(data, l, &out[0], out.size());
return out;
}
bool B32Decode(const std::string &data, std::vector<uint8_t> &out)
{
out.resize(data.size());
if (i2p::data::Base32ToByteStream(data.c_str(), data.size(), &out[0], out.size()))
{
out.shrink_to_fit();
return true;
}
return false;
}
}

View File

@@ -0,0 +1,25 @@
#include <cassert>
#include <nntpchan/base64.hpp>
#include <nntpchan/crypto.hpp>
#include <sodium.h>
namespace nntpchan
{
void SHA512(const uint8_t *d, const std::size_t l, SHA512Digest &h) { crypto_hash(h.data(), d, l); }
void Blake2B(const uint8_t *d, std::size_t l, Blake2BDigest &h)
{
crypto_generichash(h.data(), h.size(), d, l, nullptr, 0);
}
std::string Blake2B_base32(const std::string &str)
{
Blake2BDigest d;
Blake2B(reinterpret_cast<const uint8_t *>(str.c_str()), str.size(), d);
return B32Encode(d.data(), d.size());
}
Crypto::Crypto() { assert(sodium_init() == 0); }
Crypto::~Crypto() {}
}

View File

@@ -0,0 +1,28 @@
#ifndef NNTPCHAN_CRYPTO_OLD_HPP
#define NNTPCHAN_CRYPTO_OLD_HPP
#include <cstdint>
#include <cstdlib>
extern "C" {
typedef struct
{
uint32_t state[5];
uint32_t count[2];
unsigned char buffer[64];
} SHA1_CTX;
void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]);
void SHA1Init(SHA1_CTX *context);
void SHA1Update(SHA1_CTX *context, const unsigned char *data, uint32_t len);
void SHA1Final(unsigned char digest[20], SHA1_CTX *context);
void sha1(uint8_t *hash_out, const uint8_t *str, size_t len);
}
#endif

View File

@@ -0,0 +1,183 @@
#include <cassert>
#include <nntpchan/event.hpp>
#include <sys/epoll.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/signalfd.h>
#include <iostream>
namespace nntpchan
{
namespace ev
{
template<size_t bufsz>
struct EpollLoop : public Loop
{
size_t conns;
int epollfd;
char readbuf[bufsz];
EpollLoop() : conns(0), epollfd(epoll_create1(EPOLL_CLOEXEC))
{
}
virtual ~EpollLoop()
{
::close(epollfd);
}
virtual bool TrackConn(ev::io * handler)
{
epoll_event ev;
ev.data.ptr = handler;
ev.events = EPOLLET;
if(handler->readable() || handler->acceptable())
{
ev.events |= EPOLLIN;
}
if(handler->writeable())
{
ev.events |= EPOLLOUT;
}
if ( epoll_ctl(epollfd, EPOLL_CTL_ADD, handler->fd, &ev) == -1)
{
return false;
}
++conns;
return true;
}
virtual void UntrackConn(ev::io * handler)
{
if(epoll_ctl(epollfd, EPOLL_CTL_DEL, handler->fd, nullptr) != -1)
--conns;
}
virtual void Run()
{
epoll_event evs[512];
epoll_event * ev;
ev::io * handler;
int res = -1;
int idx ;
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGWINCH);
int sfd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
epoll_event sig_ev;
sig_ev.data.fd = sfd;
sig_ev.events = EPOLLIN;
epoll_ctl(epollfd, EPOLL_CTL_ADD, sfd, &sig_ev);
do
{
res = epoll_wait(epollfd, evs, 512, -1);
idx = 0;
while(idx < res)
{
errno = 0;
ev = &evs[idx++];
if(ev->data.fd == sfd)
{
read(sfd, readbuf, sizeof(readbuf));
continue;
}
handler = static_cast<ev::io *>(ev->data.ptr);
if(ev->events & EPOLLERR || ev->events & EPOLLHUP)
{
handler->close();
delete handler;
continue;
}
if (handler->acceptable())
{
int acceptfd;
bool errored = false;
while(true)
{
acceptfd = handler->accept();
if(acceptfd == -1)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)
{
break;
}
perror("accept()");
errored = true;
break;
}
}
if(errored)
{
handler->close();
delete handler;
continue;
}
}
if(ev->events & EPOLLIN && handler->readable())
{
bool errored = false;
while(true)
{
int readed = handler->read(readbuf, sizeof(readbuf));
if(readed == -1)
{
if(errno != EAGAIN)
{
perror("read()");
handler->close();
delete handler;
errored = true;
}
break;
}
else if (readed == 0)
{
handler->close();
delete handler;
errored = true;
break;
}
}
if(errored) continue;
}
if(ev->events & EPOLLOUT && handler->writeable())
{
int written = handler->write(1024);
if(written < 0)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)
{
// blocking
}
else
{
perror("write()");
handler->close();
delete handler;
}
}
}
if (!handler->keepalive())
{
handler->close();
delete handler;
}
}
}
while(res != -1 && conns);
}
};
}
}

View File

@@ -0,0 +1,78 @@
#include <fcntl.h>
#include <cstdlib>
#include <cassert>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netinet/in.h>
constexpr std::size_t ev_buffsz = 512;
#ifdef __linux__
#include "epoll.hpp"
typedef nntpchan::ev::EpollLoop<ev_buffsz> LoopImpl;
#else
#ifdef __FreeBSD__
#include "kqueue.hpp"
typedef nntpchan::ev::KqueueLoop<ev_buffsz> LoopImpl;
#else
#ifdef __netbsd__
typedef nntpchan::ev::KqueueLoop<ev_buffsz> LoopImpl;
#else
#error "unsupported platform"
#endif
#endif
#endif
namespace nntpchan
{
namespace ev
{
bool ev::Loop::BindTCP(const sockaddr *addr, ev::io *handler)
{
assert(handler->acceptable());
socklen_t slen;
switch (addr->sa_family)
{
case AF_INET:
slen = sizeof(sockaddr_in);
break;
case AF_INET6:
slen = sizeof(sockaddr_in6);
break;
case AF_UNIX:
slen = sizeof(sockaddr_un);
break;
default:
return false;
}
int fd = socket(addr->sa_family, SOCK_STREAM | SOCK_NONBLOCK, 0);
if (fd == -1)
{
return false;
}
if (bind(fd, addr, slen) == -1)
{
::close(fd);
return false;
}
if (listen(fd, 5) == -1)
{
::close(fd);
return false;
}
handler->fd = fd;
return TrackConn(handler);
}
bool Loop::SetNonBlocking(ev::io *handler)
{
return fcntl(handler->fd, F_SETFL, fcntl(handler->fd, F_GETFL, 0) | O_NONBLOCK) != -1;
}
}
ev::Loop *NewMainLoop() { return new LoopImpl; }
}

View File

@@ -0,0 +1,51 @@
#include <cstring>
#include <errno.h>
#include <iostream>
#include <nntpchan/exec_frontend.hpp>
#include <sys/wait.h>
#include <unistd.h>
namespace nntpchan
{
ExecFrontend::ExecFrontend(const std::string &fname, char * const* env) : m_Environ(env), m_exec(fname) {}
ExecFrontend::~ExecFrontend() {}
void ExecFrontend::ProcessNewMessage(const fs::path &fpath) { Exec({"post", fpath}); }
bool ExecFrontend::AcceptsNewsgroup(const std::string &newsgroup) { return Exec({"newsgroup", newsgroup}) == 0; }
bool ExecFrontend::AcceptsMessage(const std::string &msgid) { return Exec({"msgid", msgid}) == 0; }
int ExecFrontend::Exec(std::deque<std::string> args)
{
// set up arguments
const char **cargs = new char const *[args.size() + 2];
std::size_t l = 0;
cargs[l++] = m_exec.c_str();
while (args.size())
{
cargs[l++] = args.front().c_str();
args.pop_front();
}
cargs[l] = 0;
int retcode = 0;
pid_t child = fork();
if (child)
{
waitpid(child, &retcode, 0);
}
else
{
int r = execve(m_exec.c_str(), (char *const *)cargs, m_Environ);
if (r == -1)
{
std::cout << strerror(errno) << std::endl;
exit(errno);
}
else
exit(r);
}
return retcode;
}
}

View File

@@ -0,0 +1,21 @@
#include <nntpchan/file_handle.hpp>
namespace nntpchan
{
FileHandle_ptr OpenFile(const fs::path &fname, FileMode mode)
{
std::fstream *f = new std::fstream;
if (mode == eRead)
{
f->open(fname, std::ios::in);
}
else if (mode == eWrite)
{
f->open(fname, std::ios::out);
}
if (f->is_open())
return FileHandle_ptr(f);
delete f;
return nullptr;
}
}

View File

@@ -0,0 +1,162 @@
#include <nntpchan/event.hpp>
#include <sys/types.h>
#include <sys/event.h>
#include <iostream>
#include <cstring>
#include <errno.h>
namespace nntpchan
{
namespace ev
{
template<size_t bufsz>
struct KqueueLoop : public Loop
{
int kfd;
size_t conns;
char readbuf[bufsz];
KqueueLoop() : kfd(kqueue()), conns(0)
{
};
virtual ~KqueueLoop()
{
::close(kfd);
}
virtual bool TrackConn(ev::io * handler)
{
struct kevent event;
short filter = 0;
if(handler->readable() || handler->acceptable())
{
filter |= EVFILT_READ;
}
if(handler->writeable())
{
filter |= EVFILT_WRITE;
}
EV_SET(&event, handler->fd, filter, EV_ADD | EV_CLEAR, 0, 0, handler);
int ret = kevent(kfd, &event, 1, nullptr, 0, nullptr);
if(ret == -1) return false;
if(event.flags & EV_ERROR)
{
std::cerr << "KqueueLoop::TrackConn() kevent failed: " << strerror(event.data) << std::endl;
return false;
}
++conns;
return true;
}
virtual void UntrackConn(ev::io * handler)
{
struct kevent event;
short filter = 0;
if(handler->readable() || handler->acceptable())
{
filter |= EVFILT_READ;
}
if(handler->writeable())
{
filter |= EVFILT_WRITE;
}
EV_SET(&event, handler->fd, filter, EV_DELETE, 0, 0, handler);
int ret = kevent(kfd, &event, 1, nullptr, 0, nullptr);
if(ret == -1 || event.flags & EV_ERROR)
std::cerr << "KqueueLoop::UntrackConn() kevent failed: " << strerror(event.data) << std::endl;
else
--conns;
}
virtual void Run()
{
struct kevent events[512];
struct kevent * event;
io * handler;
int ret, idx;
do
{
idx = 0;
ret = kevent(kfd, nullptr, 0, events, 512, nullptr);
if(ret > 0)
{
while(idx < ret)
{
event = &events[idx++];
handler = static_cast<io *>(event->udata);
if(event->flags & EV_EOF)
{
handler->close();
delete handler;
continue;
}
if(event->filter & EVFILT_READ && handler->acceptable())
{
int backlog = event->data;
while(backlog)
{
handler->accept();
--backlog;
}
}
if(event->filter & EVFILT_READ && handler->readable())
{
int readed = 0;
size_t readnum = event->data;
while(readnum > sizeof(readbuf))
{
int r = handler->read(readbuf, sizeof(readbuf));
if(r > 0)
{
readnum -= r;
readed += r;
}
else
readnum = 0;
}
if(readnum && readed != -1)
{
int r = handler->read(readbuf, readnum);
if(r > 0)
readed += r;
else
readed = r;
}
}
if(event->filter & EVFILT_WRITE && handler->writeable())
{
int writespace = 1024;
int written = handler->write(writespace);
if(written == -1)
{
if (errno == EAGAIN || errno == EWOULDBLOCK)
{
// blocking
}
else
{
perror("write()");
handler->close();
delete handler;
continue;
}
}
}
if(!handler->keepalive())
{
handler->close();
delete handler;
}
}
}
}
while(ret != -1);
}
};
}
}

View File

@@ -0,0 +1,24 @@
#include <nntpchan/line.hpp>
namespace nntpchan
{
void LineReader::Data(const char *data, ssize_t l)
{
if (l <= 0)
return;
m_line << m_leftover;
m_leftover = "";
m_line << std::string(data, l);
for (std::string line; std::getline(m_line, line);)
{
line.erase(std::remove(line.begin(), line.end(), '\r'), line.end());
HandleLine(line);
}
if (m_line)
m_leftover = m_line.str();
m_line.clear();
}
}

View File

@@ -0,0 +1,26 @@
#include <nntpchan/mime.hpp>
namespace nntpchan
{
bool ReadHeader(const FileHandle_ptr &file, RawHeader &header)
{
std::string line;
while (std::getline(*file, line) && !(line == "\r" || line == ""))
{
std::string k, v;
auto idx = line.find(": ");
auto endidx = line.size() - 1;
while (line[endidx] == '\r')
--endidx;
if (idx != std::string::npos && idx + 2 < endidx)
{
k = line.substr(0, idx);
v = line.substr(idx + 2, endidx);
header[k] = v;
}
}
return file->good();
}
}

View File

@@ -0,0 +1,47 @@
#include <cstring>
#include <nntpchan/net.hpp>
#include <sstream>
#include <stdexcept>
#include <arpa/inet.h>
namespace nntpchan
{
std::string NetAddr::to_string()
{
std::string str("invalid");
const size_t s = 128;
char *buff = new char[s];
if (inet_ntop(AF_INET6, &addr, buff, sizeof(sockaddr_in6)))
{
str = std::string(buff);
delete[] buff;
}
std::stringstream ss;
ss << "[" << str << "]:" << ntohs(addr.sin6_port);
return ss.str();
}
NetAddr::NetAddr() { std::memset(&addr, 0, sizeof(addr)); }
NetAddr ParseAddr(const std::string &addr)
{
NetAddr saddr;
auto n = addr.rfind("]:");
if (n == std::string::npos)
{
throw std::runtime_error("invalid address: " + addr);
}
if (addr[0] != '[')
{
throw std::runtime_error("invalid address: " + addr);
}
auto p = addr.substr(n + 2);
int port = std::atoi(p.c_str());
auto a = addr.substr(0, n);
saddr.addr.sin6_port = htons(port);
saddr.addr.sin6_family = AF_INET6;
inet_pton(AF_INET6, a.c_str(), &saddr.addr);
return saddr;
}
}

View File

@@ -0,0 +1,97 @@
#include <array>
#include <fstream>
#include <iostream>
#include <nntpchan/base64.hpp>
#include <nntpchan/crypto.hpp>
#include <nntpchan/nntp_auth.hpp>
namespace nntpchan
{
HashedCredDB::HashedCredDB() : LineReader() {}
bool HashedCredDB::CheckLogin(const std::string &user, const std::string &passwd)
{
std::unique_lock<std::mutex> lock(m_access);
m_found = false;
m_user = user;
m_passwd = passwd;
m_instream->seekg(0, std::ios::end);
const auto l = m_instream->tellg();
m_instream->seekg(0, std::ios::beg);
char *buff = new char[l];
// read file
m_instream->read(buff, l);
Data(buff, l);
delete[] buff;
return m_found;
}
bool HashedCredDB::ProcessLine(const std::string &line)
{
// strip comments
auto comment = line.find("#");
std::string part = line;
for (; comment != std::string::npos; comment = part.find("#"))
{
if (comment)
part = part.substr(0, comment);
else
break;
}
if (!part.size())
return false; // empty line after comments
auto idx = part.find(":");
if (idx == std::string::npos)
return false; // bad format
if (m_user != part.substr(0, idx))
return false; // username mismatch
part = part.substr(idx + 1);
idx = part.find(":");
if (idx == std::string::npos)
return false; // bad format
std::string cred = part.substr(0, idx);
std::string salt = part.substr(idx + 1);
return Hash(m_passwd, salt) == cred;
}
void HashedCredDB::HandleLine(const std::string line)
{
if (m_found)
return;
if (ProcessLine(line))
m_found = true;
}
void HashedCredDB::SetStream(std::istream *s) { m_instream = s; }
std::string HashedCredDB::Hash(const std::string &data, const std::string &salt)
{
SHA512Digest h;
std::string d = data + salt;
SHA512((const uint8_t *)d.c_str(), d.size(), h);
return B64Encode(h.data(), h.size());
}
HashedFileDB::HashedFileDB(const std::string &fname) : m_fname(fname), f(nullptr) {}
HashedFileDB::~HashedFileDB() {}
void HashedFileDB::Close()
{
if (f.is_open())
f.close();
}
bool HashedFileDB::Open()
{
if (!f.is_open())
f.open(m_fname);
if (f.is_open())
{
SetStream(&f);
return true;
}
return false;
}
}

View File

@@ -0,0 +1,242 @@
#include <algorithm>
#include <cctype>
#include <cstring>
#include <iostream>
#include <nntpchan/nntp_handler.hpp>
#include <nntpchan/sanitize.hpp>
#include <sstream>
#include <string>
namespace nntpchan
{
NNTPServerHandler::NNTPServerHandler(fs::path storage)
: LineReader(), m_article(nullptr), m_auth(nullptr), m_store(storage), m_authed(false),
m_state(eStateReadCommand)
{
}
NNTPServerHandler::~NNTPServerHandler() {}
void NNTPServerHandler::HandleLine(const std::string line)
{
if (m_state == eStateReadCommand)
{
std::deque<std::string> command;
std::istringstream s;
s.str(line);
for (std::string part; std::getline(s, part, ' ');)
{
if (part.size())
command.push_back(part);
}
if (command.size())
HandleCommand(command);
else
QueueLine("501 Syntax error");
}
else if (m_state == eStateStoreArticle)
{
std::string l = line + "\r\n";
OnData(l.c_str(), l.size());
}
else
{
std::cerr << "invalid state" << std::endl;
}
}
void NNTPServerHandler::OnData(const char *data, ssize_t l)
{
if (l <= 0)
return;
if (m_state == eStateStoreArticle)
{
std::cerr << "storing " << l << " bytes" << std::endl;
if (strncmp(data, ".\r\n", l) == 0)
{
ArticleObtained();
return;
}
const char *end = strstr(data, "\r\n.\r\n");
if (end)
{
std::size_t diff = end - data;
if (m_article)
{
m_article->write(data, diff + 2);
m_article->flush();
}
ArticleObtained();
diff += 5;
if (l - diff)
Data(end + 5, l - diff);
return;
}
if (m_article)
{
m_article->write(data, l);
m_article->flush();
}
}
else
Data(data, l);
}
void NNTPServerHandler::HandleCommand(const std::deque<std::string> &command)
{
auto cmd = command[0];
std::transform(cmd.begin(), cmd.end(), cmd.begin(), ::toupper);
std::size_t cmdlen = command.size();
for (const auto &part : command)
std::cerr << " " << part;
std::cerr << std::endl;
if (cmd == "QUIT")
{
Quit();
return;
}
else if (cmd[0] == '5')
{
return;
}
else if (cmd == "MODE")
{
if (cmdlen == 2)
{
// set mode
SwitchMode(command[1]);
}
else if (cmdlen)
{
// too many arguments
QueueLine("500 too many arguments");
}
else
{
// get mode
QueueLine("500 wrong arguments");
}
}
else if (cmd == "CAPABILITIES")
{
QueueLine("101 I support the following:");
QueueLine("READER");
QueueLine("IMPLEMENTATION nntpchan-daemon");
QueueLine("VERSION 2");
QueueLine("STREAMING");
QueueLine(".");
}
else if (cmd == "CHECK")
{
if (cmdlen >= 2)
{
const std::string &msgid = command[1];
if (IsValidMessageID(msgid) && m_store.Accept(msgid))
{
QueueLine("238 " + msgid);
}
else
QueueLine("438 " + msgid);
}
else
QueueLine("501 syntax error");
}
else if (cmd == "TAKETHIS")
{
if (cmdlen >= 2)
{
const std::string &msgid = command[1];
if (m_store.Accept(msgid))
{
m_article = m_store.OpenWrite(msgid);
}
m_articleName = msgid;
EnterState(eStateStoreArticle);
return;
}
QueueLine("501 invalid syntax");
}
else
{
// unknown command
QueueLine("500 Unknown Command");
}
}
void NNTPServerHandler::ArticleObtained()
{
if (m_article)
{
m_article->close();
m_article = nullptr;
m_store.EnsureSymlinks(m_articleName);
QueueLine("239 " + m_articleName);
std::cerr << "stored " << m_articleName << std::endl;
}
else
QueueLine("439 " + m_articleName);
m_articleName = "";
EnterState(eStateReadCommand);
}
void NNTPServerHandler::SwitchMode(const std::string &mode)
{
std::string m = mode;
std::transform(m.begin(), m.end(), m.begin(), ::toupper);
if (m == "READER")
{
m_mode = m;
if (PostingAllowed())
{
QueueLine("200 Posting is permitted yo");
}
else
{
QueueLine("201 Posting is not permitted yo");
}
}
else if (m == "STREAM")
{
m_mode = m;
if (PostingAllowed())
{
QueueLine("203 Streaming enabled");
}
else
{
QueueLine("483 Streaming Denied");
}
}
else
{
// unknown mode
QueueLine("500 Unknown mode");
}
}
void NNTPServerHandler::EnterState(State st)
{
std::cerr << "enter state " << st << std::endl;
m_state = st;
}
void NNTPServerHandler::Quit()
{
EnterState(eStateQuit);
QueueLine("205 quitting");
}
bool NNTPServerHandler::ShouldClose() { return m_state == eStateQuit; }
bool NNTPServerHandler::PostingAllowed() { return m_authed || m_auth == nullptr; }
void NNTPServerHandler::Greet()
{
if (PostingAllowed())
QueueLine("200 Posting allowed");
else
QueueLine("201 Posting not allowed");
}
void NNTPServerHandler::SetAuth(CredDB_ptr creds) { m_auth = creds; }
}

View File

@@ -0,0 +1,51 @@
#include <cassert>
#include <cstring>
#include <iostream>
#include <nntpchan/net.hpp>
#include <nntpchan/nntp_auth.hpp>
#include <nntpchan/nntp_handler.hpp>
#include <nntpchan/nntp_server.hpp>
#include <sstream>
namespace nntpchan
{
NNTPServer::NNTPServer(ev::Loop *loop) : Server(loop), m_frontend(nullptr) {}
NNTPServer::~NNTPServer() {}
IServerConn *NNTPServer::CreateConn(int f)
{
CredDB_ptr creds;
std::ifstream i;
i.open(m_logindbpath);
if (i.is_open())
creds = std::make_shared<HashedFileDB>(m_logindbpath);
NNTPServerHandler *handler = new NNTPServerHandler(m_storagePath);
if (creds)
handler->SetAuth(creds);
return new NNTPServerConn(f, this, handler);
}
void NNTPServer::SetLoginDB(const std::string path) { m_logindbpath = path; }
void NNTPServer::SetStoragePath(const std::string &path) { m_storagePath = path; }
void NNTPServer::SetInstanceName(const std::string &name) { m_servername = name; }
void NNTPServer::SetFrontend(Frontend *f) { m_frontend.reset(f); }
std::string NNTPServer::InstanceName() const { return m_servername; }
void NNTPServer::OnAcceptError(int status) { std::cerr << "nntpserver::accept() " << strerror(status) << std::endl; }
void NNTPServerConn::Greet()
{
IConnHandler *handler = GetHandler();
handler->Greet();
}
}

View File

@@ -0,0 +1,45 @@
#include <algorithm>
#include <cctype>
#include <nntpchan/sanitize.hpp>
#include <regex>
namespace nntpchan
{
std::string NNTPSanitizeLine(const std::string &str)
{
if (str == ".")
return " .";
std::string sane;
sane += str;
const char ch = ' ';
std::replace_if(sane.begin(), sane.end(), [](unsigned char ch) -> bool { return iscntrl(ch); }, ch);
return sane;
}
std::string ToLower(const std::string &str)
{
std::string lower = str;
std::transform(lower.begin(), lower.end(), lower.begin(),
[](unsigned char ch) -> unsigned char { return std::tolower(ch); });
return lower;
}
static const std::regex re_ValidMessageID("^<[a-zA-Z0-9$\\._]{2,128}@[a-zA-Z0-9\\-\\.]{2,63}>$");
bool IsValidMessageID(const std::string &msgid) { return std::regex_search(msgid, re_ValidMessageID) == 1; }
static const std::regex re_ValidNewsgroup("^[a-zA-Z][a-zA-Z0-9.]{1,128}$");
bool IsValidNewsgroup(const std::string &msgid) { return std::regex_search(msgid, re_ValidNewsgroup) == 1; }
std::string StripWhitespaces(const std::string &str)
{
std::string stripped;
for (const auto &ch : str)
if (!(std::isspace(ch) || std::iscntrl(ch)))
stripped += ch;
return stripped;
}
}

View File

@@ -0,0 +1,156 @@
#include <cassert>
#include <iostream>
#include <nntpchan/net.hpp>
#include <nntpchan/server.hpp>
namespace nntpchan
{
Server::Server(ev::Loop *loop) : ev::io(-1), m_Loop(loop) {}
void Server::close()
{
auto itr = m_conns.begin();
while (itr != m_conns.end())
{
itr = m_conns.erase(itr);
}
m_Loop->UntrackConn(this);
ev::io::close();
}
bool Server::Bind(const std::string &addr)
{
auto saddr = ParseAddr(addr);
return m_Loop->BindTCP(saddr, this);
}
void Server::OnAccept(int f)
{
IServerConn *conn = CreateConn(f);
if (!m_Loop->SetNonBlocking(conn))
{
conn->close();
delete conn;
}
else if (m_Loop->TrackConn(conn))
{
m_conns.push_back(conn);
conn->Greet();
conn->write(1024);
}
else
{
conn->close();
delete conn;
}
}
int Server::accept()
{
int res = ::accept(fd, nullptr, nullptr);
if (res == -1)
return res;
OnAccept(res);
return res;
}
void Server::RemoveConn(IServerConn *conn)
{
auto itr = m_conns.begin();
while (itr != m_conns.end())
{
if (*itr == conn)
itr = m_conns.erase(itr);
else
++itr;
}
m_Loop->UntrackConn(conn);
}
void IConnHandler::QueueLine(const std::string &line) { m_sendlines.push_back(line + "\r\n"); }
bool IConnHandler::HasNextLine() { return m_sendlines.size() > 0; }
std::string IConnHandler::GetNextLine()
{
std::string line = m_sendlines[0];
m_sendlines.pop_front();
return line;
}
IServerConn::IServerConn(int fd, Server *parent, IConnHandler *h) : ev::io(fd), m_parent(parent), m_handler(h) {}
IServerConn::~IServerConn() { delete m_handler; }
int IServerConn::read(char *buf, size_t sz)
{
ssize_t readsz = ::read(fd, buf, sz);
if (readsz > 0)
{
m_handler->OnData(buf, readsz);
}
return readsz;
}
bool IServerConn::keepalive() { return !m_handler->ShouldClose(); }
int IServerConn::write(size_t avail)
{
auto leftovers = m_writeLeftover.size();
int written = 0;
if (leftovers)
{
if (leftovers > avail)
{
leftovers = avail;
}
written = ::write(fd, m_writeLeftover.c_str(), leftovers);
if (written > 0)
{
avail -= written;
m_writeLeftover = m_writeLeftover.substr(written);
}
else
{
// too much leftovers
return -1;
}
}
do
{
if (!m_handler->HasNextLine())
{
return written;
}
auto line = m_handler->GetNextLine();
int wrote;
if (line.size() <= avail)
{
wrote = ::write(fd, line.c_str(), line.size());
}
else
{
auto subline = line.substr(0, avail);
wrote = ::write(fd, subline.c_str(), subline.size());
}
if (wrote > 0)
{
written += wrote;
avail -= wrote;
m_writeLeftover = line.substr(wrote);
}
else
{
m_writeLeftover = line;
return -1;
}
} while (avail > 0);
return written;
}
void IServerConn::close()
{
m_parent->RemoveConn(this);
ev::io::close();
}
}

View File

@@ -0,0 +1,314 @@
/*
SHA-1 in C
By Steve Reid <steve@edmweb.com>
100% Public Domain
Test Vectors (from FIPS PUB 180-1)
"abc"
A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
A million repetitions of "a"
34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
*/
/* #define LITTLE_ENDIAN * This should be #define'd already, if true. */
/* #define SHA1HANDSOFF * Copies data before messing with it. */
#include "crypto_old.hpp"
#include <string>
extern "C" {
#define SHA1HANDSOFF
#include <stdio.h>
#include <string.h>
/* for uint32_t */
#include <stdint.h>
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
/* blk0() and blk() perform the initial expand. */
/* I got the idea of expanding during the round function from SSLeay */
#if BYTE_ORDER == LITTLE_ENDIAN
#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | (rol(block->l[i], 8) & 0x00FF00FF))
#elif BYTE_ORDER == BIG_ENDIAN
#define blk0(i) block->l[i]
#else
#error "Endianness not defined!"
#endif
#define blk(i) \
(block->l[i & 15] = \
rol(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */
#define R0(v, w, x, y, z, i) \
z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
w = rol(w, 30);
#define R1(v, w, x, y, z, i) \
z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
w = rol(w, 30);
#define R2(v, w, x, y, z, i) \
z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \
w = rol(w, 30);
#define R3(v, w, x, y, z, i) \
z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
w = rol(w, 30);
#define R4(v, w, x, y, z, i) \
z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
w = rol(w, 30);
/* Hash a single 512-bit block. This is the core of the algorithm. */
void SHA1Transform(uint32_t state[5], const unsigned char buffer[64])
{
uint32_t a, b, c, d, e;
typedef union {
unsigned char c[64];
uint32_t l[16];
} CHAR64LONG16;
#ifdef SHA1HANDSOFF
CHAR64LONG16 block[1]; /* use array to appear as a pointer */
memcpy(block, buffer, 64);
#else
/* The following had better never be used because it causes the
* pointer-to-const buffer to be cast into a pointer to non-const.
* And the result is written through. I threw a "const" in, hoping
* this will cause a diagnostic.
*/
CHAR64LONG16 *block = (const CHAR64LONG16 *)buffer;
#endif
/* Copy context->state[] to working vars */
a = state[0];
b = state[1];
c = state[2];
d = state[3];
e = state[4];
/* 4 rounds of 20 operations each. Loop unrolled. */
R0(a, b, c, d, e, 0);
R0(e, a, b, c, d, 1);
R0(d, e, a, b, c, 2);
R0(c, d, e, a, b, 3);
R0(b, c, d, e, a, 4);
R0(a, b, c, d, e, 5);
R0(e, a, b, c, d, 6);
R0(d, e, a, b, c, 7);
R0(c, d, e, a, b, 8);
R0(b, c, d, e, a, 9);
R0(a, b, c, d, e, 10);
R0(e, a, b, c, d, 11);
R0(d, e, a, b, c, 12);
R0(c, d, e, a, b, 13);
R0(b, c, d, e, a, 14);
R0(a, b, c, d, e, 15);
R1(e, a, b, c, d, 16);
R1(d, e, a, b, c, 17);
R1(c, d, e, a, b, 18);
R1(b, c, d, e, a, 19);
R2(a, b, c, d, e, 20);
R2(e, a, b, c, d, 21);
R2(d, e, a, b, c, 22);
R2(c, d, e, a, b, 23);
R2(b, c, d, e, a, 24);
R2(a, b, c, d, e, 25);
R2(e, a, b, c, d, 26);
R2(d, e, a, b, c, 27);
R2(c, d, e, a, b, 28);
R2(b, c, d, e, a, 29);
R2(a, b, c, d, e, 30);
R2(e, a, b, c, d, 31);
R2(d, e, a, b, c, 32);
R2(c, d, e, a, b, 33);
R2(b, c, d, e, a, 34);
R2(a, b, c, d, e, 35);
R2(e, a, b, c, d, 36);
R2(d, e, a, b, c, 37);
R2(c, d, e, a, b, 38);
R2(b, c, d, e, a, 39);
R3(a, b, c, d, e, 40);
R3(e, a, b, c, d, 41);
R3(d, e, a, b, c, 42);
R3(c, d, e, a, b, 43);
R3(b, c, d, e, a, 44);
R3(a, b, c, d, e, 45);
R3(e, a, b, c, d, 46);
R3(d, e, a, b, c, 47);
R3(c, d, e, a, b, 48);
R3(b, c, d, e, a, 49);
R3(a, b, c, d, e, 50);
R3(e, a, b, c, d, 51);
R3(d, e, a, b, c, 52);
R3(c, d, e, a, b, 53);
R3(b, c, d, e, a, 54);
R3(a, b, c, d, e, 55);
R3(e, a, b, c, d, 56);
R3(d, e, a, b, c, 57);
R3(c, d, e, a, b, 58);
R3(b, c, d, e, a, 59);
R4(a, b, c, d, e, 60);
R4(e, a, b, c, d, 61);
R4(d, e, a, b, c, 62);
R4(c, d, e, a, b, 63);
R4(b, c, d, e, a, 64);
R4(a, b, c, d, e, 65);
R4(e, a, b, c, d, 66);
R4(d, e, a, b, c, 67);
R4(c, d, e, a, b, 68);
R4(b, c, d, e, a, 69);
R4(a, b, c, d, e, 70);
R4(e, a, b, c, d, 71);
R4(d, e, a, b, c, 72);
R4(c, d, e, a, b, 73);
R4(b, c, d, e, a, 74);
R4(a, b, c, d, e, 75);
R4(e, a, b, c, d, 76);
R4(d, e, a, b, c, 77);
R4(c, d, e, a, b, 78);
R4(b, c, d, e, a, 79);
/* Add the working vars back into context.state[] */
state[0] += a;
state[1] += b;
state[2] += c;
state[3] += d;
state[4] += e;
/* Wipe variables */
a = b = c = d = e = 0;
#ifdef SHA1HANDSOFF
memset(block, '\0', sizeof(block));
#endif
}
/* SHA1Init - Initialize new context */
void SHA1Init(SHA1_CTX *context)
{
/* SHA1 initialization constants */
context->state[0] = 0x67452301;
context->state[1] = 0xEFCDAB89;
context->state[2] = 0x98BADCFE;
context->state[3] = 0x10325476;
context->state[4] = 0xC3D2E1F0;
context->count[0] = context->count[1] = 0;
}
/* Run your data through this. */
void SHA1Update(SHA1_CTX *context, const unsigned char *data, uint32_t len)
{
uint32_t i;
uint32_t j;
j = context->count[0];
if ((context->count[0] += len << 3) < j)
context->count[1]++;
context->count[1] += (len >> 29);
j = (j >> 3) & 63;
if ((j + len) > 63)
{
memcpy(&context->buffer[j], data, (i = 64 - j));
SHA1Transform(context->state, context->buffer);
for (; i + 63 < len; i += 64)
{
SHA1Transform(context->state, &data[i]);
}
j = 0;
}
else
i = 0;
memcpy(&context->buffer[j], &data[i], len - i);
}
/* Add padding and return the message digest. */
void SHA1Final(unsigned char digest[20], SHA1_CTX *context)
{
unsigned i;
unsigned char finalcount[8];
unsigned char c;
#if 0 /* untested "improvement" by DHR */
/* Convert context->count to a sequence of bytes
* in finalcount. Second element first, but
* big-endian order within element.
* But we do it all backwards.
*/
unsigned char *fcp = &finalcount[8];
for (i = 0; i < 2; i++)
{
uint32_t t = context->count[i];
int j;
for (j = 0; j < 4; t >>= 8, j++)
*--fcp = (unsigned char) t}
#else
for (i = 0; i < 8; i++)
{
finalcount[i] =
(unsigned char)((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */
}
#endif
c = 0200;
SHA1Update(context, &c, 1);
while ((context->count[0] & 504) != 448)
{
c = 0000;
SHA1Update(context, &c, 1);
}
SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */
for (i = 0; i < 20; i++)
{
digest[i] = (unsigned char)((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
}
/* Wipe variables */
memset(context, '\0', sizeof(*context));
memset(&finalcount, '\0', sizeof(finalcount));
}
void sha1(uint8_t *hash_out, const uint8_t *str, size_t len)
{
SHA1_CTX ctx;
size_t ii;
SHA1Init(&ctx);
for (ii = 0; ii < len; ii += 1)
SHA1Update(&ctx, str + ii, 1);
SHA1Final(hash_out, &ctx);
}
}
namespace nntpchan
{
static inline char nibble_to_char(uint8_t n)
{
if (n >= 10)
return n + 87;
else
return n + 48;
}
std::string sha1_hex(const std::string &data)
{
uint8_t digest[20];
const uint8_t *ptr = (uint8_t *)data.c_str();
sha1(digest, ptr, data.size());
std::string out;
std::size_t idx = 0;
while (idx < 20)
{
out += nibble_to_char((digest[idx] & 0xf0) >> 8) + nibble_to_char(digest[idx] & 0x0f);
++idx;
}
return out;
}
}

View File

@@ -0,0 +1,164 @@
#include <any>
#include <iostream>
#include <nntpchan/file_handle.hpp>
#include <nntpchan/mime.hpp>
#include <nntpchan/sanitize.hpp>
#include <nntpchan/sha1.hpp>
#include <nntpchan/staticfile_frontend.hpp>
#include <set>
#include <sstream>
namespace nntpchan
{
StaticFileFrontend::StaticFileFrontend(TemplateEngine *tmpl, const std::string &templateDir, const std::string &outDir,
uint32_t pages)
: m_TemplateEngine(tmpl), m_TemplateDir(templateDir), m_OutDir(outDir), m_Pages(pages)
{
}
StaticFileFrontend::~StaticFileFrontend() {}
void StaticFileFrontend::ProcessNewMessage(const fs::path &fpath)
{
std::clog << "process message " << fpath << std::endl;
auto file = OpenFile(fpath, eRead);
if (file)
{
// read header
RawHeader header;
if (!ReadHeader(file, header))
{
std::clog << "failed to read mime header" << std::endl;
return;
}
// read body
auto findMsgidFunc = [](const std::pair<std::string, std::string> &item) -> bool {
auto lower = ToLower(item.first);
return (lower == "message-id") || (lower == "messageid");
};
auto msgid_itr = std::find_if(header.begin(), header.end(), findMsgidFunc);
if (msgid_itr == std::end(header))
{
std::clog << "no message id for file " << fpath << std::endl;
return;
}
std::string msgid = StripWhitespaces(msgid_itr->second);
if (!IsValidMessageID(msgid))
{
std::clog << "invalid message-id: " << msgid << std::endl;
return;
}
std::string rootmsgid;
auto findReferences = [](const std::pair<std::string, std::string> &item) -> bool {
auto lower = ToLower(item.first);
return lower == "references";
};
auto references_itr = std::find_if(header.begin(), header.end(), findReferences);
if (references_itr == std::end(header) || StripWhitespaces(references_itr->second).size() == 0)
{
rootmsgid = msgid;
}
else
{
const auto &s = references_itr->second;
auto checkfunc = [](unsigned char ch) -> bool { return std::isspace(ch) || std::iscntrl(ch); };
if (std::count_if(s.begin(), s.end(), checkfunc))
{
/** split off first element */
auto idx = std::find_if(s.begin(), s.end(), checkfunc);
rootmsgid = s.substr(0, s.find(*idx));
}
else
{
rootmsgid = references_itr->second;
}
}
std::string rootmsgid_hash = sha1_hex(rootmsgid);
std::set<std::string> newsgroups_list;
auto findNewsgroupsFunc = [](const std::pair<std::string, std::string> &item) -> bool {
return ToLower(item.first) == "newsgroups";
};
auto group = std::find_if(header.begin(), header.end(), findNewsgroupsFunc);
if (group == std::end(header))
{
std::clog << "no newsgroups header" << std::endl;
return;
}
std::istringstream input(group->second);
std::string newsgroup;
while (std::getline(input, newsgroup, ' '))
{
if (IsValidNewsgroup(newsgroup))
newsgroups_list.insert(newsgroup);
}
fs::path threadFilePath = m_OutDir / fs::path("thread-" + rootmsgid_hash + ".html");
nntpchan::model::Thread thread;
if (!m_MessageDB)
{
std::clog << "no message database" << std::endl;
return;
}
if (!m_MessageDB->LoadThread(thread, rootmsgid))
{
std::clog << "cannot find thread with root " << rootmsgid << std::endl;
return;
}
if (m_TemplateEngine)
{
FileHandle_ptr out = OpenFile(threadFilePath, eWrite);
if (!out || !m_TemplateEngine->WriteThreadPage(thread, out))
{
std::clog << "failed to write " << threadFilePath << std::endl;
return;
}
}
nntpchan::model::BoardPage page;
for (const auto &name : newsgroups_list)
{
uint32_t pageno = 0;
while (pageno < m_Pages)
{
page.threads.clear();
if (!m_MessageDB->LoadBoardPage(page, name, 10, m_Pages))
{
std::clog << "cannot load board page " << pageno << " for " << name << std::endl;
break;
}
fs::path boardPageFilename(name + "-" + std::to_string(pageno) + ".html");
if (m_TemplateEngine)
{
fs::path outfile = m_OutDir / boardPageFilename;
FileHandle_ptr out = OpenFile(outfile, eWrite);
if (out)
m_TemplateEngine->WriteBoardPage(page, out);
else
std::clog << "failed to open board page " << outfile << std::endl;
}
++pageno;
}
}
}
}
bool StaticFileFrontend::AcceptsNewsgroup(const std::string &newsgroup) { return IsValidNewsgroup(newsgroup); }
bool StaticFileFrontend::AcceptsMessage(const std::string &msgid) { return IsValidMessageID(msgid); }
}

View File

@@ -0,0 +1,94 @@
#include <cassert>
#include <nntpchan/crypto.hpp>
#include <nntpchan/sanitize.hpp>
#include <nntpchan/storage.hpp>
#include <sstream>
namespace nntpchan
{
const fs::path posts_skiplist_dir = "posts";
const fs::path threads_skiplist_dir = "threads";
ArticleStorage::ArticleStorage(const fs::path &fpath) { SetPath(fpath); }
ArticleStorage::~ArticleStorage() {}
void ArticleStorage::SetPath(const fs::path &fpath)
{
basedir = fpath;
fs::create_directories(basedir);
assert(init_skiplist(posts_skiplist_dir));
assert(init_skiplist(threads_skiplist_dir));
errno = 0;
}
bool ArticleStorage::init_skiplist(const std::string &subdir) const
{
fs::path skiplist = skiplist_root(subdir);
const auto subdirs = {
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '2', '3', '4', '5', '6', '7',
};
for (const auto &s : subdirs)
fs::create_directories(skiplist / std::string(&s, 1));
return true;
}
bool ArticleStorage::Accept(const std::string &msgid) const
{
if (!IsValidMessageID(msgid))
return false;
auto p = MessagePath(msgid);
bool ret = !fs::exists(p);
errno = 0;
return ret;
}
fs::path ArticleStorage::MessagePath(const std::string &msgid) const { return basedir / msgid; }
FileHandle_ptr ArticleStorage::OpenRead(const std::string &msgid) const { return OpenFile(MessagePath(msgid), eRead); }
FileHandle_ptr ArticleStorage::OpenWrite(const std::string &msgid) const
{
return OpenFile(MessagePath(msgid), eWrite);
}
bool ArticleStorage::LoadBoardPage(BoardPage &board, const std::string &newsgroup, uint32_t perpage,
uint32_t page) const
{
(void)board;
(void)newsgroup;
(void)perpage;
(void)page;
return false;
}
bool ArticleStorage::FindThreadByHash(const std::string &hashhex, std::string &msgid) const
{
(void)hashhex;
(void)msgid;
return false;
}
bool ArticleStorage::LoadThread(Thread &thread, const std::string &rootmsgid) const
{
(void)thread;
(void)rootmsgid;
return false;
}
/** ensure symlinks are formed for this article by message id */
void ArticleStorage::EnsureSymlinks(const std::string &msgid) const
{
std::string msgidhash = Blake2B_base32(msgid);
auto skip = skiplist_dir(skiplist_root(posts_skiplist_dir), msgidhash) / msgidhash;
auto path = fs::path("..") / fs::path("..") / fs::path("..") / MessagePath(msgid);
fs::create_symlink(path, skip);
errno = 0;
}
fs::path ArticleStorage::skiplist_root(const std::string &name) const { return basedir / name; }
fs::path ArticleStorage::skiplist_dir(const fs::path &root, const std::string &name) const
{
return root / name.substr(0, 1);
}
}

View File

@@ -0,0 +1,93 @@
#include <iostream>
#include <nntpchan/sanitize.hpp>
#include <nntpchan/template_engine.hpp>
#include <sstream>
namespace nntpchan
{
struct StdTemplateEngine : public TemplateEngine
{
struct RenderContext
{
bool Load(const fs::path & path)
{
// clear out previous data
m_Data.clear();
// open file
std::ifstream f;
f.open(path);
if(f.is_open())
{
for(std::string line; std::getline(f, line, '\n');)
{
m_Data += line + "\n";
}
return true;
}
else
return false;
}
virtual bool Render(const FileHandle_ptr & out) const = 0;
std::string m_Data;
};
struct BoardRenderContext : public RenderContext
{
const nntpchan::model::BoardPage & m_Page;
BoardRenderContext(const nntpchan::model::BoardPage & page) : m_Page(page) {};
virtual bool Render(const FileHandle_ptr & out) const
{
*out << m_Data;
return false;
}
};
struct ThreadRenderContext : public RenderContext
{
const nntpchan::model::Thread & m_Thread;
ThreadRenderContext(const nntpchan::model::Thread & thread) : m_Thread(thread) {};
virtual bool Render(const FileHandle_ptr & out) const
{
*out << m_Data;
return false;
}
};
bool WriteBoardPage(const nntpchan::model::BoardPage & page, const FileHandle_ptr & out)
{
BoardRenderContext ctx(page);
if(ctx.Load("board.html"))
{
return ctx.Render(out);
}
return false;
}
bool WriteThreadPage(const nntpchan::model::Thread & thread, const FileHandle_ptr & out)
{
ThreadRenderContext ctx(thread);
if(ctx.Load("thread.html"))
{
return ctx.Render(out);
}
return false;
}
};
TemplateEngine *CreateTemplateEngine(const std::string &dialect)
{
auto d = ToLower(dialect);
if (d == "std")
return new StdTemplateEngine;
else
return nullptr;
}
}

View File

@@ -0,0 +1,7 @@
[nntp]
instance_name=nntp.server.tld
bind=[::]:1199
authdb=auth.txt
[articles]
store_path=./storage/

View File

@@ -0,0 +1,14 @@
#include <cassert>
#include <iostream>
#include <nntpchan/exec_frontend.hpp>
#include <nntpchan/sanitize.hpp>
int main(int, char *[], char * argenv[])
{
nntpchan::Frontend_ptr f(new nntpchan::ExecFrontend("./contrib/nntpchan.sh", argenv));
assert(f->AcceptsMessage("<test@server>"));
assert(f->AcceptsNewsgroup("overchan.test"));
assert(nntpchan::IsValidMessageID("<test@test>"));
assert(!nntpchan::IsValidMessageID("asd"));
std::cout << "all good" << std::endl;
}

View File

@@ -0,0 +1,100 @@
#include <nntpchan/base64.hpp>
#include <nntpchan/crypto.hpp>
#include <cassert>
#include <cstring>
#include <iostream>
#include <sodium.h>
#include <string>
static void print_help(const std::string &exename)
{
std::cout << "usage: " << exename << " [help|gen|check]" << std::endl;
}
static void gen_passwd(const std::string &username, const std::string &passwd)
{
std::array<uint8_t, 8> random;
randombytes_buf(random.data(), random.size());
std::string salt = nntpchan::B64Encode(random.data(), random.size());
std::string cred = passwd + salt;
nntpchan::SHA512Digest d;
nntpchan::SHA512((const uint8_t *)cred.c_str(), cred.size(), d);
std::string hash = nntpchan::B64Encode(d.data(), d.size());
std::cout << username << ":" << hash << ":" << salt << std::endl;
}
static bool check_cred(const std::string &cred, const std::string &passwd)
{
auto idx = cred.find(":");
if (idx == std::string::npos || idx == 0)
return false;
std::string part = cred.substr(idx + 1);
idx = part.find(":");
if (idx == std::string::npos || idx == 0)
return false;
std::string salt = part.substr(idx + 1);
std::string hash = part.substr(0, idx);
std::vector<uint8_t> h;
if (!nntpchan::B64Decode(hash, h))
return false;
nntpchan::SHA512Digest d;
std::string l = passwd + salt;
nntpchan::SHA512((const uint8_t *)l.data(), l.size(), d);
return std::memcmp(h.data(), d.data(), d.size()) == 0;
}
int main(int argc, char *argv[])
{
assert(sodium_init() == 0);
if (argc == 1)
{
print_help(argv[0]);
return 0;
}
std::string cmd(argv[1]);
if (cmd == "help")
{
print_help(argv[0]);
return 0;
}
if (cmd == "gen")
{
if (argc == 4)
{
gen_passwd(argv[2], argv[3]);
return 0;
}
else
{
std::cout << "usage: " << argv[0] << " gen username password" << std::endl;
return 0;
}
}
if (cmd == "check")
{
std::string cred;
std::cout << "credential: ";
if (!std::getline(std::cin, cred))
{
std::cout << "read error" << std::endl;
return 1;
}
std::string passwd;
std::cout << "password: ";
if (!std::getline(std::cin, passwd))
{
std::cout << "read error" << std::endl;
return 1;
}
if (check_cred(cred, passwd))
{
std::cout << "okay" << std::endl;
return 0;
}
std::cout << "bad login" << std::endl;
return 1;
}
print_help(argv[0]);
return 1;
}

View File

@@ -0,0 +1,12 @@
#include <cassert>
#include <iostream>
#include <nntpchan/exec_frontend.hpp>
#include <nntpchan/sanitize.hpp>
int main(int, char *[], char * argenv[])
{
nntpchan::Frontend_ptr f(new nntpchan::ExecFrontend("./contrib/nntpchan.sh", argenv));
assert(nntpchan::IsValidMessageID("<a28a71493831188@web.oniichan.onion>"));
assert(f->AcceptsNewsgroup("overchan.test"));
std::cout << "all good" << std::endl;
}

View File

@@ -0,0 +1,8 @@
;; thanks stack overflow
;; https://stackoverflow.com/questions/4012321/how-can-i-access-the-path-to-the-current-directory-in-an-emacs-directory-variabl
((nil . ((eval . (set (make-local-variable 'my-project-path)
(file-name-directory
(let ((d (dir-locals-find-file ".")))
(if (stringp d) d (car d))))))
(eval . (setenv "GOPATH" my-project-path))
(eval . (message "Project directory set to `%s'." my-project-path)))))

1
contrib/backends/nntpchand/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
nntpchand

View File

@@ -0,0 +1,14 @@
REPO=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
all: clean build
build: nntpchand
nntpchand:
GOROOT=$(GOROOT) GOPATH=$(REPO) go build -v
test:
GOROOT=$(GOROOT) GOPATH=$(REPO) go test ./...
clean:
GOPATH=$(REPO) go clean -v

View File

@@ -0,0 +1,9 @@
package main
import (
"nntpchan/cmd/nntpchan"
)
func main() {
nntpchan.Main()
}

View File

@@ -0,0 +1,175 @@
package nntpchan
import (
log "github.com/Sirupsen/logrus"
"net"
_ "net/http/pprof"
"nntpchan/lib/config"
"nntpchan/lib/database"
"nntpchan/lib/frontend"
"nntpchan/lib/nntp"
"nntpchan/lib/store"
"nntpchan/lib/webhooks"
"os"
"os/signal"
"syscall"
"time"
)
type runStatus struct {
nntpListener net.Listener
run bool
done chan error
}
func (st *runStatus) Stop() {
st.run = false
if st.nntpListener != nil {
st.nntpListener.Close()
}
st.nntpListener = nil
log.Info("stopping daemon process")
}
func Main() {
st := &runStatus{
run: true,
done: make(chan error),
}
log.Info("starting up nntpchan...")
cfgFname := "nntpchan.json"
conf, err := config.Ensure(cfgFname)
if err != nil {
log.Fatal(err)
}
if conf.Log == "debug" {
log.SetLevel(log.DebugLevel)
}
sconfig := conf.Store
if sconfig == nil {
log.Fatal("no article storage configured")
}
nconfig := conf.NNTP
if nconfig == nil {
log.Fatal("no nntp server configured")
}
dconfig := conf.Database
if dconfig == nil {
log.Fatal("no database configured")
}
// create nntp server
nserv := nntp.NewServer()
nserv.Config = nconfig
nserv.Feeds = conf.Feeds
if nconfig.LoginsFile != "" {
nserv.Auth = nntp.FlatfileAuth(nconfig.LoginsFile)
}
// create article storage
nserv.Storage, err = store.NewFilesytemStorage(sconfig.Path, true)
if err != nil {
log.Fatal(err)
}
if conf.WebHooks != nil && len(conf.WebHooks) > 0 {
// put webhooks into nntp server event hooks
nserv.Hooks = webhooks.NewWebhooks(conf.WebHooks, nserv.Storage)
}
if conf.NNTPHooks != nil && len(conf.NNTPHooks) > 0 {
var hooks nntp.MulitHook
if nserv.Hooks != nil {
hooks = append(hooks, nserv.Hooks)
}
for _, h := range conf.NNTPHooks {
hooks = append(hooks, nntp.NewHook(h))
}
nserv.Hooks = hooks
}
var frontends []frontend.Frontend
var db database.Database
for _, fconf := range conf.Frontends {
var f frontend.Frontend
f, err = frontend.NewHTTPFrontend(&fconf, db, nserv.Storage)
if err == nil {
log.Infof("serving frontend %s", f.Name())
go f.Serve()
frontends = append(frontends, f)
} else {
log.Fatalf("failed to set up frontend %s: %s", fconf.Name(), err.Error())
}
}
// start persisting feeds
go nserv.PersistFeeds()
// handle signals
sigchnl := make(chan os.Signal, 1)
signal.Notify(sigchnl, syscall.SIGHUP, os.Interrupt)
go func() {
for {
s := <-sigchnl
if s == syscall.SIGHUP {
// handle SIGHUP
conf, err := config.Ensure(cfgFname)
if err == nil {
log.Infof("reloading config: %s", cfgFname)
nserv.ReloadServer(conf.NNTP)
nserv.ReloadFeeds(conf.Feeds)
nserv.ReloadStorage(conf.Store)
for idx := range frontends {
f := frontends[idx]
for i := range conf.Frontends {
c := conf.Frontends[i]
if c.Name() == f.Name() {
// TODO: inject storage config?
f.Reload(&c)
}
}
}
} else {
log.Errorf("failed to reload config: %s", err)
}
} else if s == os.Interrupt {
// handle interrupted, clean close
st.Stop()
return
}
}
}()
go func() {
var err error
for st.run {
var nl net.Listener
naddr := conf.NNTP.Bind
log.Infof("Bind nntp server to %s", naddr)
nl, err = net.Listen("tcp", naddr)
if err == nil {
st.nntpListener = nl
err = nserv.Serve(nl)
if err != nil {
nl.Close()
log.Errorf("nntpserver.serve() %s", err.Error())
}
} else {
log.Errorf("nntp server net.Listen failed: %s", err.Error())
}
time.Sleep(time.Second)
}
st.done <- err
}()
e := <-st.done
if e != nil {
log.Fatal(e)
}
log.Info("ended")
}

View File

@@ -0,0 +1,42 @@
package main
// simple nntp server
import (
log "github.com/Sirupsen/logrus"
"net"
"nntpchan/lib/config"
"nntpchan/lib/nntp"
"nntpchan/lib/store"
)
func main() {
log.Info("starting NNTP server...")
conf, err := config.Ensure("settings.json")
if err != nil {
log.Fatal(err)
}
if conf.Log == "debug" {
log.SetLevel(log.DebugLevel)
}
serv := &nntp.Server{
Config: conf.NNTP,
Feeds: conf.Feeds,
}
serv.Storage, err = store.NewFilesytemStorage(conf.Store.Path, false)
if err != nil {
log.Fatal(err)
}
l, err := net.Listen("tcp", conf.NNTP.Bind)
if err != nil {
log.Fatal(err)
}
log.Info("listening on ", l.Addr())
err = serv.Serve(l)
if err != nil {
log.Fatal(err)
}
}

View File

@@ -0,0 +1,4 @@
//
// server admin panel
//
package admin

View File

@@ -0,0 +1,16 @@
package admin
import (
"net/http"
)
type Server struct {
}
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
func NewServer() *Server {
return &Server{}
}

View File

@@ -0,0 +1,10 @@
package api
import (
"nntpchan/lib/model"
)
// json api
type API interface {
MakePost(p model.Post)
}

View File

@@ -0,0 +1,2 @@
// json api
package api

View File

@@ -0,0 +1,20 @@
package api
import (
"github.com/gorilla/mux"
"net/http"
)
// api server
type Server struct {
}
func (s *Server) HandlePing(w http.ResponseWriter, r *http.Request) {
}
// inject api routes
func (s *Server) SetupRoutes(r *mux.Router) {
// setup api pinger
r.Path("/ping").HandlerFunc(s.HandlePing)
}

View File

@@ -0,0 +1,73 @@
package config
import "regexp"
// configration for local article policies
type ArticleConfig struct {
// explicitly allow these newsgroups (regexp)
AllowGroups []string `json:"whitelist"`
// explicitly disallow these newsgroups (regexp)
DisallowGroups []string `json:"blacklist"`
// only allow explicitly allowed groups
ForceWhitelist bool `json:"force-whitelist"`
// allow anonymous posts?
AllowAnon bool `json:"anon"`
// allow attachments?
AllowAttachments bool `json:"attachments"`
// allow anonymous attachments?
AllowAnonAttachments bool `json:"anon-attachments"`
}
func (c *ArticleConfig) AllowGroup(group string) bool {
for _, g := range c.DisallowGroups {
r := regexp.MustCompile(g)
if r.MatchString(group) && c.ForceWhitelist {
// disallowed
return false
}
}
// check allowed groups first
for _, g := range c.AllowGroups {
r := regexp.MustCompile(g)
if r.MatchString(g) {
return true
}
}
return !c.ForceWhitelist
}
// allow an article?
func (c *ArticleConfig) Allow(msgid, group string, anon, attachment bool) bool {
// check attachment policy
if c.AllowGroup(group) {
allow := true
// no anon ?
if anon && !c.AllowAnon {
allow = false
}
// no attachments ?
if allow && attachment && !c.AllowAttachments {
allow = false
}
// no anon attachments ?
if allow && attachment && anon && !c.AllowAnonAttachments {
allow = false
}
return allow
} else {
return false
}
}
var DefaultArticlePolicy = ArticleConfig{
AllowGroups: []string{"ctl", "overchan.test"},
DisallowGroups: []string{"overchan.cp"},
ForceWhitelist: false,
AllowAnon: true,
AllowAttachments: true,
AllowAnonAttachments: false,
}

View File

@@ -0,0 +1,13 @@
package config
// caching interface configuration
type CacheConfig struct {
// backend cache driver name
Backend string `json:"backend"`
// address for cache
Addr string `json:"addr"`
// username for login
User string `json:"user"`
// password for login
Password string `json:"password"`
}

View File

@@ -0,0 +1,87 @@
package config
import (
"bytes"
"encoding/json"
"io/ioutil"
"os"
)
// main configuration
type Config struct {
// nntp server configuration
NNTP *NNTPServerConfig `json:"nntp"`
// log level
Log string `json:"log"`
// article storage config
Store *StoreConfig `json:"storage"`
// web hooks to call
WebHooks []*WebhookConfig `json:"webhooks"`
// external scripts to call
NNTPHooks []*NNTPHookConfig `json:"nntphooks"`
// database backend configuration
Database *DatabaseConfig `json:"db"`
// list of feeds to add on runtime
Feeds []*FeedConfig `json:"feeds"`
// frontend config
Frontends []FrontendConfig `json:"frontends"`
// unexported fields ...
// absolute filepath to configuration
fpath string
}
// default configuration
var DefaultConfig = Config{
Store: &DefaultStoreConfig,
NNTP: &DefaultNNTPConfig,
Database: &DefaultDatabaseConfig,
WebHooks: []*WebhookConfig{DefaultWebHookConfig},
NNTPHooks: []*NNTPHookConfig{DefaultNNTPHookConfig},
Feeds: DefaultFeeds,
Frontends: []FrontendConfig{DefaultFrontendConfig},
Log: "debug",
}
// reload configuration
func (c *Config) Reload() (err error) {
var b []byte
b, err = ioutil.ReadFile(c.fpath)
if err == nil {
err = json.Unmarshal(b, c)
}
return
}
// ensure that a config file exists
// creates one if it does not exist
func Ensure(fname string) (cfg *Config, err error) {
_, err = os.Stat(fname)
if os.IsNotExist(err) {
err = nil
var d []byte
d, err = json.Marshal(&DefaultConfig)
if err == nil {
b := new(bytes.Buffer)
err = json.Indent(b, d, "", " ")
if err == nil {
err = ioutil.WriteFile(fname, b.Bytes(), 0600)
}
}
}
if err == nil {
cfg, err = Load(fname)
}
return
}
// load configuration file
func Load(fname string) (cfg *Config, err error) {
cfg = new(Config)
cfg.fpath = fname
err = cfg.Reload()
if err != nil {
cfg = nil
}
return
}

View File

@@ -0,0 +1,18 @@
package config
type DatabaseConfig struct {
// url or address for database connector
Addr string `json:"addr"`
// password to use
Password string `json:"password"`
// username to use
Username string `json:"username"`
// type of database to use
Type string `json:"type"`
}
var DefaultDatabaseConfig = DatabaseConfig{
Type: "postgres",
Addr: "/var/run/postgresql",
Password: "",
}

View File

@@ -0,0 +1,4 @@
//
// package for parsing config files
//
package config

View File

@@ -0,0 +1,33 @@
package config
// configuration for 1 nntp feed
type FeedConfig struct {
// feed's policy, filters articles
Policy *ArticleConfig `json:"policy"`
// remote server's address
Addr string `json:"addr"`
// proxy server config
Proxy *ProxyConfig `json:"proxy"`
// nntp username to log in with
Username string `json:"username"`
// nntp password to use when logging in
Password string `json:"password"`
// do we want to use tls?
TLS bool `json:"tls"`
// the name of this feed
Name string `json:"name"`
// how often to pull articles from the server in minutes
// 0 for never
PullInterval int `json:"pull"`
}
var DuummyFeed = FeedConfig{
Policy: &DefaultArticlePolicy,
Addr: "nntp.dummy.tld:1119",
Proxy: &DefaultTorProxy,
Name: "dummy",
}
var DefaultFeeds = []*FeedConfig{
&DuummyFeed,
}

View File

@@ -0,0 +1,31 @@
package config
import (
"fmt"
)
type FrontendConfig struct {
// bind to address
BindAddr string `json:"bind"`
// frontend cache
Cache *CacheConfig `json:"cache"`
// frontend ssl settings
SSL *SSLSettings `json:"ssl"`
// static files directory
Static string `json:"static_dir"`
// http middleware configuration
Middleware *MiddlewareConfig `json:"middleware"`
// storage config
Storage *StoreConfig `json:"-"`
}
func (cfg *FrontendConfig) Name() string {
return fmt.Sprintf("frontend-%s", cfg.BindAddr)
}
// default Frontend Configuration
var DefaultFrontendConfig = FrontendConfig{
BindAddr: "127.0.0.1:18888",
Static: "./files/static/",
Middleware: &DefaultMiddlewareConfig,
}

View File

@@ -0,0 +1,15 @@
package config
// config for external callback for nntp articles
type NNTPHookConfig struct {
// name of hook
Name string `json:"name"`
// executable script path to be called with arguments: /path/to/article
Exec string `json:"exec"`
}
// default dummy hook
var DefaultNNTPHookConfig = &NNTPHookConfig{
Name: "dummy",
Exec: "/bin/true",
}

View File

@@ -0,0 +1,17 @@
package config
// configuration for http middleware
type MiddlewareConfig struct {
// middleware type, currently just 1 is available: overchan
Type string `json:"type"`
// directory for our html templates
Templates string `json:"templates_dir"`
// directory for static files
StaticDir string `json:"static_dir"`
}
var DefaultMiddlewareConfig = MiddlewareConfig{
Type: "overchan",
Templates: "./files/templates/overchan/",
StaticDir: "./files/",
}

View File

@@ -0,0 +1,24 @@
package config
type NNTPServerConfig struct {
// address to bind to
Bind string `json:"bind"`
// name of the nntp server
Name string `json:"name"`
// default inbound article policy
Article *ArticleConfig `json:"policy"`
// do we allow anonymous NNTP sync?
AnonNNTP bool `json:"anon-nntp"`
// ssl settings for nntp
SSL *SSLSettings
// file with login credentials
LoginsFile string `json:"authfile"`
}
var DefaultNNTPConfig = NNTPServerConfig{
AnonNNTP: false,
Bind: "0.0.0.0:1119",
Name: "nntp.server.tld",
Article: &DefaultArticlePolicy,
LoginsFile: "",
}

View File

@@ -0,0 +1,13 @@
package config
// proxy configuration
type ProxyConfig struct {
Type string `json:"type"`
Addr string `json:"addr"`
}
// default tor proxy
var DefaultTorProxy = ProxyConfig{
Type: "socks",
Addr: "127.0.0.1:9050",
}

View File

@@ -0,0 +1,11 @@
package config
// settings for setting up ssl
type SSLSettings struct {
// path to ssl private key
SSLKeyFile string `json:"key"`
// path to ssl certificate signed by CA
SSLCertFile string `json:"cert"`
// domain name to use for ssl
DomainName string `json:"fqdn"`
}

View File

@@ -0,0 +1,10 @@
package config
type StoreConfig struct {
// path to article directory
Path string `json:"path"`
}
var DefaultStoreConfig = StoreConfig{
Path: "storage",
}

View File

@@ -0,0 +1,17 @@
package config
// configuration for a single web hook
type WebhookConfig struct {
// user provided name for this hook
Name string `json:"name"`
// callback URL for webhook
URL string `json:"url"`
// dialect to use when calling webhook
Dialect string `json:"dialect"`
}
var DefaultWebHookConfig = &WebhookConfig{
Name: "vichan",
Dialect: "vichan",
URL: "http://localhost/webhook.php",
}

View File

@@ -0,0 +1,5 @@
//
// nntpchan crypto package
// wraps all external crypro libs
//
package crypto

View File

@@ -0,0 +1,8 @@
package crypto
import (
"github.com/dchest/blake256"
)
// common hash function is blake2
var Hash = blake256.New

View File

@@ -0,0 +1,77 @@
package crypto
import (
"crypto/sha512"
"hash"
"nntpchan/lib/crypto/nacl"
)
type fuckyNacl struct {
k []byte
hash hash.Hash
}
func (fucky *fuckyNacl) Write(d []byte) (int, error) {
return fucky.hash.Write(d)
}
func (fucky *fuckyNacl) Sign() (s Signature) {
h := fucky.hash.Sum(nil)
if h == nil {
panic("fuck.hash.Sum == nil")
}
_, sec := nacl.SeedToKeyPair(fucky.k)
sig := nacl.CryptoSignFucky(h, sec)
if sig == nil {
panic("fucky signer's call to nacl.CryptoSignFucky returned nil")
}
s = Signature(sig)
fucky.resetState()
return
}
// reset inner state so we can reuse this fuckyNacl for another operation
func (fucky *fuckyNacl) resetState() {
fucky.hash = sha512.New()
}
func (fucky *fuckyNacl) Verify(sig Signature) (valid bool) {
h := fucky.hash.Sum(nil)
if h == nil {
panic("fucky.hash.Sum == nil")
}
valid = nacl.CryptoVerifyFucky(h, sig, fucky.k)
fucky.resetState()
return
}
func createFucky(k []byte) *fuckyNacl {
return &fuckyNacl{
k: k,
hash: sha512.New(),
}
}
// create a standard signer given a secret key
func CreateSigner(sk []byte) Signer {
return createFucky(sk)
}
// create a standard verifier given a public key
func CreateVerifier(pk []byte) Verifer {
return createFucky(pk)
}
// get the public component given the secret key
func ToPublic(sk []byte) (pk []byte) {
pk, _ = nacl.SeedToKeyPair(sk)
return
}
// create a standard keypair
func GenKeypair() (pk, sk []byte) {
sk = RandBytes(32)
pk, _ = nacl.SeedToKeyPair(sk)
return
}

View File

@@ -0,0 +1,44 @@
package nacl
import (
"crypto/sha512"
"edwards25519"
"golang.org/x/crypto/ed25519"
)
func CryptoVerifyFucky(h, sig, pk []byte) bool {
pub := make(ed25519.PublicKey, ed25519.PublicKeySize)
copy(pub, pk)
return ed25519.Verify(pub, h, sig)
}
func CryptoSignFucky(hash, sk []byte) []byte {
sec := make(ed25519.PrivateKey, ed25519.PrivateKeySize)
copy(sec, sk)
return ed25519.Sign(sec, hash)
}
func SeedToKeyPair(seed []byte) (pk, sk []byte) {
h := sha512.Sum512(seed[0:32])
sk = h[:]
sk[0] &= 248
sk[31] &= 63
sk[31] |= 64
// scalarmult magick shit
pk = scalarBaseMult(sk[0:32])
copy(sk[0:32], seed[0:32])
copy(sk[32:64], pk[0:32])
return
}
func scalarBaseMult(sk []byte) (pk []byte) {
var skey [32]byte
var pkey [32]byte
copy(skey[:], sk[0:32])
var h edwards25519.ExtendedGroupElement
edwards25519.GeScalarMultBase(&h, &skey)
h.ToBytes(&pkey)
pk = pkey[:]
return
}

View File

@@ -0,0 +1,34 @@
package crypto
import (
"bytes"
"crypto/rand"
"io"
"testing"
)
func TestNaclToPublic(t *testing.T) {
pk, sk := GenKeypair()
t_pk := ToPublic(sk)
if !bytes.Equal(pk, t_pk) {
t.Logf("%q != %q", pk, t_pk)
t.Fail()
}
}
func TestNaclSignVerify(t *testing.T) {
var msg [1024]byte
pk, sk := GenKeypair()
io.ReadFull(rand.Reader, msg[:])
signer := CreateSigner(sk)
signer.Write(msg[:])
sig := signer.Sign()
verifier := CreateVerifier(pk)
verifier.Write(msg[:])
if !verifier.Verify(sig) {
t.Logf("%q is invalid signature and is %dB long", sig, len(sig))
t.Fail()
}
}

View File

@@ -0,0 +1,13 @@
package crypto
import (
"crypto/rand"
"io"
)
// generate random bytes
func RandBytes(n int) []byte {
b := make([]byte, n)
io.ReadFull(rand.Reader, b)
return b
}

View File

@@ -0,0 +1,25 @@
package crypto
import "io"
// a detached signature
type Signature []byte
type SigEncoder interface {
// encode a signature to an io.Writer
// return error if one occurrened while writing out signature
Encode(sig Signature, w io.Writer) error
// encode a signature to a string
EncodeString(sig Signature) string
}
// a decoder of signatures
type SigDecoder interface {
// decode signature from io.Reader
// reads all data until io.EOF
// returns singaure or error if an error occured while reading
Decode(r io.Reader) (Signature, error)
// decode a signature from string
// returns signature or error if an error ocurred while decoding
DecodeString(str string) (Signature, error)
}

View File

@@ -0,0 +1,14 @@
package crypto
import "io"
//
// provides generic signing interface for producing detached signatures
// call Write() to feed data to be signed, call Sign() to generate
// a detached signature
//
type Signer interface {
io.Writer
// generate detached Signature from previously fed body via Write()
Sign() Signature
}

View File

@@ -0,0 +1,14 @@
package crypto
import "io"
// provides generic signature
// call Write() to feed in message body
// once the entire body has been fed in via Write() call Verify() with detached
// signature to verify the detached signature against the previously fed body
type Verifer interface {
io.Writer
// verify detached signature from body previously fed via Write()
// return true if the detached signature is valid given the body
Verify(sig Signature) bool
}

View File

@@ -0,0 +1,29 @@
package database
import (
"errors"
"nntpchan/lib/config"
"nntpchan/lib/model"
"strings"
)
//
type Database interface {
ThreadByMessageID(msgid string) (*model.Thread, error)
ThreadByHash(hash string) (*model.Thread, error)
MessageIDByHash(hash string) (string, error)
BoardPage(newsgroup string, pageno, perpage int) (*model.BoardPage, error)
StorePost(post model.Post) error
Init() error
}
// get new database connector from configuration
func NewDBFromConfig(c *config.DatabaseConfig) (db Database, err error) {
dbtype := strings.ToLower(c.Type)
if dbtype == "postgres" {
db, err = createPostgresDatabase(c.Addr, c.Username, c.Password)
} else {
err = errors.New("no such database driver: " + c.Type)
}
return
}

View File

@@ -0,0 +1,4 @@
//
// database driver
//
package database

View File

@@ -0,0 +1,58 @@
package database
import (
"database/sql"
_ "github.com/lib/pq"
"nntpchan/lib/model"
)
type PostgresDB struct {
conn *sql.DB
}
func (db *PostgresDB) ThreadByMessageID(msgid string) (thread *model.Thread, err error) {
return
}
func (db *PostgresDB) ThreadByHash(hash string) (thread *model.Thread, err error) {
return
}
func (db *PostgresDB) MessageIDByHash(hash string) (msgid string, err error) {
return
}
func (db *PostgresDB) BoardPage(newsgroup string, pageno, perpage int) (page *model.BoardPage, err error) {
return
}
func (db *PostgresDB) StorePost(post model.Post) (err error) {
return
}
func (db *PostgresDB) Init() (err error) {
return
}
func createPostgresDatabase(addr, user, passwd string) (p *PostgresDB, err error) {
p = new(PostgresDB)
var authstring string
if len(addr) > 0 {
authstring += " host=" + addr
}
if len(user) > 0 {
authstring += " username=" + user
}
if len(passwd) > 0 {
authstring += " password=" + passwd
}
p.conn, err = sql.Open("postgres", authstring)
if err != nil {
p = nil
}
return
}

Some files were not shown because too many files have changed in this diff Show More