home
readme
diff
tree
note
docs
0commit 6c8e99aa9aba4daac97fa1560092962655452928
1Author: Mason Wright <mason@lakefox.net>
2Date: Sun Nov 9 11:42:38 2025 -0700
3
4 working
5
6diff --git a/.index.html.swp b/cgi-bin/.mailto.awk.swp
7similarity index 53%
8rename from .index.html.swp
9rename to cgi-bin/.mailto.awk.swp
10index be1d333..1de3b0a 100644
11Binary files a/.index.html.swp and b/cgi-bin/.mailto.awk.swp differ
12diff --git a/cgi-bin/git.awk b/cgi-bin/git.awk
13new file mode 100755
14index 0000000..1d1353d
15--- /dev/null
16+++ b/cgi-bin/git.awk
17@@ -0,0 +1,121 @@
18+#!/usr/bin/awk -f
19+
20+# /var/git
21+
22+BEGIN {
23+
24+ print "Content-Type: text/html\r\n"
25+ print "<!DOCTYPE html>"
26+ print "<html>"
27+ print "<head>"
28+
29+ split(ENVIRON["QUERY_STRING"], pairs, "&")
30+ for (i in pairs) {
31+ split(pairs[i], kv, "=")
32+
33+ if (kv[1] == "action") {
34+ action = kv[2]
35+ } else if (kv[1] == "name") {
36+ name = kv[2]
37+ } else if (kv[1] == "hash") {
38+ hash = kv[2]
39+ } else if (kv[1] == "path") {
40+ path = kv[2]
41+ }
42+ }
43+
44+ if (name == "") name = "all"
45+ if (hash == "") hash = "HEAD"
46+
47+ print "<title>Git: " name "</title>"
48+ print "<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>"
49+ print "<meta name='viewport' content='width=device-width, initial-scale=1'>"
50+ print "</head>"
51+ print "<body>"
52+
53+ if (name != "all") {
54+ print "<a href='?name=" name "'>home</a>"
55+ print "<a href='?name=" name "&hash=" hash "&action=readme'>readme</a>"
56+ print "<a href='?name=" name "&hash=" hash "&action=diff'>diff</a>"
57+ print "<a href='?name=" name "&hash=" hash "&action=tree'>tree</a>"
58+ }
59+
60+
61+ if (action == "") {
62+ if (name == "all") {
63+ cmd = "ls /var/git/"
64+ print "<h1>Git</h1>"
65+ print "<p>Select a repo to view.</p>"
66+
67+ print "<ul>"
68+ while (cmd | getline file) {
69+ split(file, k, ".")
70+ print "<li><a href='/cgi-bin/git.awk?name=" k[1] "'>/" k[1] "</a></li>"
71+ }
72+ close(cmd)
73+ print "</ul>"
74+ } else {
75+ cmd = "git --git-dir=/var/git/" name ".git/ log"
76+ print "<pre><code>"
77+ while (cmd | getline line) {
78+
79+ if (line ~ /^commit/) {
80+ split(line, commit, " ")
81+ print "<a href='/cgi-bin/git.awk?name=" name "&hash=" commit[2] "&action=diff'>commit " commit[2] "</a>"
82+ } else {
83+ print line
84+ }
85+ }
86+ close(cmd)
87+ print "</code></pre>"
88+ }
89+ } else if (action == "tree") {
90+ cmd = "git --git-dir=/var/git/" name ".git/ show " hash ":" path
91+ print "<br/>"
92+ print "<b>" hash ":" path "</b>"
93+ print "<pre><code>"
94+ if (substr(path, length(path), 1) == "/" || path == "") {
95+ while (cmd | getline line) {
96+ if (line !~ /^tree/) {
97+ print "<a href='/cgi-bin/git.awk?name=" name "&hash=" hash "&action=tree&path=" path line "'>" line "</a>"
98+ }
99+ }
100+ } else {
101+ while (cmd | getline line) {
102+ print line
103+ }
104+ }
105+ close(cmd)
106+ print "</code></pre>"
107+ } if (action == "diff") {
108+ cmd = "git --git-dir=/var/git/" name ".git/ show " hash
109+ print "<pre><code>"
110+ while (cmd | getline line) {
111+ print line
112+ }
113+ close(cmd)
114+ print "</code></pre>"
115+
116+ } if (action == "readme") {
117+ # 1. discover the README file name (single match assumed)
118+ cmd = "git --git-dir=/var/git/" name ".git ls-tree -r " hash " --name-only | grep '^README\\.'"
119+ fn = ""
120+ while ((cmd | getline fn) > 0) break # take first match
121+ close(cmd)
122+ if (fn == "") { print "<br/>README not found for: " hash; exit 1 }
123+
124+ cmd = "git --git-dir=/var/git/" name ".git show " hash ":" fn
125+ print "<pre><code>"
126+ while ((cmd | getline line) > 0) {
127+ gsub(/&/,"\\&", line)
128+ gsub(/</,"\\<", line)
129+ gsub(/>/,"\\>", line)
130+ print line
131+ }
132+ close(cmd)
133+ print "</code></pre>"
134+ }
135+
136+ print "</body>"
137+ print "</html>"
138+}
139diff --git a/cgi-bin/mailto.awk b/cgi-bin/mailto.awk
140index 28aa890..65198d9 100755
141--- a/cgi-bin/mailto.awk
142+++ b/cgi-bin/mailto.awk
143@@ -3,9 +3,9 @@
144 # A list should be split by a /: grim/patches.txt
145
146 BEGIN {
147- if (ARGC == 4) {
148+ if (ARGC > 1 && ARGV[1] == "sync") {
149 # getThreads( user, pass, imap-url, query )
150- getThreads(ARGV[1], ARGV[2], ARGV[3], ARGV[4])
151+ getThreads(ARGV[2], ARGV[3], ARGV[4], ARGV[5])
152 exit
153 }
154
155@@ -77,6 +77,8 @@ function showLists(name) {
156 print "<html>"
157 print "<head>"
158 print "<title>MailTo: " name "</title>"
159+ print "<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>"
160+ print "<meta name='viewport' content='width=device-width, initial-scale=1'>"
161 print "</head>"
162 print "<body>"
163
164@@ -130,7 +132,7 @@ function showLists(name) {
165 for (i = 1; i < n; i++) {
166 formatted = formatted title[i]
167 }
168- sub("<>","/", formatted)
169+ gsub("<>","/", formatted)
170 print "<li><a href='/cgi-bin/mailto.awk?list=" name "&view=" title[n] "'>" formatted "</a></li>"
171 }
172 print "</ul>"
173@@ -146,6 +148,8 @@ function openMail(folder, uid) {
174 print "<html>"
175 print "<head>"
176 print "<title>MailTo: " name "</title>"
177+ print "<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>"
178+ print "<meta name='viewport' content='width=device-width, initial-scale=1'>"
179 print "</head>"
180 print "<body>"
181
182@@ -161,12 +165,11 @@ function openMail(folder, uid) {
183
184 # This function will keep all email's up to date
185 function getThreads(username, password, inbox, query) {
186- cmd = "curl -s -u '" username ":" password "' '" inbox "' -X 'UID SEARCH SUBJECT " query "'"
187- while ((cmd | getline res) > 0) { # collect last line
188- split(res, a); # a[1]="*"; a[2]="SEARCH"; rest are UIDs
189- n = 0
190- for (i = 3; i <= length(a); i++) { # skip "* SEARCH"
191- uids[++n] = a[i]
192+ cmd = "(echo 'USER " username "'; echo PASS '" password "'; echo LIST; echo QUIT;) | nc -i 1 " inbox " 110"
193+# . == end of message
194+ while (cmd | getline res) {
195+ if (res ~ !/^\+/) {
196+ print res
197 }
198 }
199 close(cmd)
200@@ -210,7 +213,7 @@ function getThreads(username, password, inbox, query) {
201 close(cmd)
202
203 cleanSubj = subj
204- sub("/", "<>", cleanSubj)
205+ gsub("/", "<>", cleanSubj)
206 sub("\r", "", cleanSubj)
207
208 if (system("test -e \"/var/mailto/.cache/" query "/" cleanSubj "." uid "\"") != 0) {
209diff --git a/index.html b/index.html
210index 4e047e7..d5f477a 100644
211--- a/index.html
212+++ b/index.html
213@@ -1,7 +1,9 @@
214 <!DOCTYPE html>
215 <html>
216 <head>
217+ <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
218 <title>DECODE</title>
219+ <meta name="viewport" content="width=device-width, initial-scale=1">
220 <style>
221 table,
222 thead,
223@@ -13,35 +15,40 @@
224 }
225 </style>
226 </head>
227- <body>
228+ <body style="max-width: 900px;">
229 <h1>DECODE</h1>
230- <a href="irc.decode.sh">#IRC</a> <a href="/cgi-bin/mailto.awk">Mailing Lists</a>
231+ <a href="irc.decode.sh">#IRC</a> <a href="/cgi-bin/mailto.awk">Mailing Lists</a> <a href="/cgi-bin/git.awk">Git</a>
232 <p>
233 Decode is a project sharing website.
234 </p>
235
236 <h2>Projects</h2>
237- <table style="width: 90%; ">
238+ <table style="width: 90%; margin-bottom: 100px;">
239 <thead>
240+ <tr>
241 <th>Source</th>
242 <th>About</th>
243 <th>IRC</th>
244 <th>Clone</th>
245+ </tr>
246 </thead>
247 <tbody>
248 <tr>
249- <td><a href="http://lakefox.net/grim">grim/</a></td>
250- <td></td>
251+ <td><a href="/cgi-bin/git.awk?name=grim&action=readme">grim/</a></td>
252+ <td>HTML/CSS renderer with a C++ DOM API</td>
253 <td><a href="irc.decode.sh/#grim">#grim</a></td>
254- <td>http://lakefox.net/grim.git</td>
255+ <td>http://git.decode.sh/grim.git</td>
256 </tr>
257- <tr>
258- <td><a href="http://lakefox.net/asftp">asftp/</a></td>
259+ <tr>
260+ <td><a href="http://lakefox.net/decode/cgi-bin">mailto/</a></td>
261+ <td>CGI script to create a simple mailing list with archiving</td>
262+ <td><a href="irc.decode.sh/#mailto">#mailto</a></td>
263 <td></td>
264- <td><a href="irc.decode.sh/#asftp">#asftp</a></td>
265- <td>http://lakefox.net/asftp.git</td>
266 </tr>
267 </tbody>
268- </div>
269+ </table>
270+ <hr>
271+ <p>This site is HTML 2.0 compliant.</p>
272+ <a href="http://validator.w3.org/check?uri=decode.sh"><img src="valid-html20.png" alt="Valid HTML 2.0"></a>
273 </body>
274 </html>
275diff --git a/valid-html20.png b/valid-html20.png
276new file mode 100644
277index 0000000..19675ee
278Binary files /dev/null and b/valid-html20.png differ