0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 70 68 70 2d 63 #!/usr/bin/php-c
0010: 67 69 20 2d 64 63 67 69 2e 66 6f 72 63 65 5f 72 gi -dcgi.force_r
0020: 65 64 69 72 65 63 74 3d 30 0a 3c 3f 70 68 70 0a edirect=0.<?php.
0030: 23 20 65 6e 63 6f 64 69 6e 67 3a 20 75 74 66 2d # encoding: utf-
0040: 38 0a 23 20 61 70 69 3a 20 63 67 69 0a 23 20 74 8.# api: cgi.# t
0050: 79 70 65 3a 20 6a 73 6f 6e 0a 23 20 63 61 74 65 ype: json.# cate
0060: 67 6f 72 79 3a 20 61 70 69 0a 23 20 74 69 74 6c gory: api.# titl
0070: 65 3a 20 4d 69 63 72 6f 50 75 62 20 41 50 49 0a e: MicroPub API.
0080: 23 20 64 65 73 63 72 69 70 74 69 6f 6e 3a 20 41 # description: A
0090: 63 63 65 70 74 73 20 62 6c 6f 67 2f 74 69 63 6b ccepts blog/tick
00a0: 65 74 2f 63 68 61 74 20 65 6e 74 72 69 65 73 20 et/chat entries
00b0: 66 72 6f 6d 20 6d 69 63 72 6f 70 75 62 20 63 6c from micropub cl
00c0: 69 65 6e 74 73 0a 23 20 76 65 72 73 69 6f 6e 3a ients.# version:
00d0: 20 30 2e 32 0a 23 20 73 74 61 74 65 3a 20 69 6e 0.2.# state: in
00e0: 63 6f 6d 70 6c 65 74 65 0a 23 20 64 65 70 65 6e complete.# depen
00f0: 64 73 3a 20 70 68 70 3a 73 71 6c 69 74 65 0a 23 ds: php:sqlite.#
0100: 20 64 6f 63 3a 20 68 74 74 70 73 3a 2f 2f 6d 69 doc: https://mi
0110: 63 72 6f 70 75 62 2e 73 70 65 63 2e 69 6e 64 69 cropub.spec.indi
0120: 65 77 65 62 2e 6f 72 67 2f 23 61 64 64 2c 0a 23 eweb.org/#add,.#
0130: 20 20 20 20 20 68 74 74 70 73 3a 2f 2f 67 69 74 https://git
0140: 68 75 62 2e 63 6f 6d 2f 69 6e 64 69 65 77 65 62 hub.com/indieweb
0150: 2f 6d 69 63 72 6f 70 75 62 2d 65 78 74 65 6e 73 /micropub-extens
0160: 69 6f 6e 73 2f 69 73 73 75 65 73 0a 23 20 63 6f ions/issues.# co
0170: 6e 66 69 67 3a 20 2d 0a 23 20 61 63 63 65 73 73 nfig: -.# access
0180: 3a 20 61 75 74 68 0a 23 0a 23 20 53 75 70 70 6f : auth.#.# Suppo
0190: 73 65 64 20 74 6f 20 66 65 65 64 20 6d 69 63 72 sed to feed micr
01a0: 6f 70 75 62 20 72 65 71 75 65 73 74 73 20 62 61 opub requests ba
01b0: 63 6b 20 69 6e 74 6f 20 60 66 6f 73 73 69 6c 60 ck into `fossil`
01c0: 2e 20 43 75 72 72 65 6e 74 6c 79 20 73 75 70 70 . Currently supp
01d0: 6f 72 74 69 6e 67 0a 23 20 74 65 63 68 6e 6f 74 orting.# technot
01e0: 65 73 20 28 77 68 69 63 68 20 6d 6f 73 74 20 63 es (which most c
01f0: 6c 6f 73 65 6c 79 20 72 65 73 65 6d 62 6c 65 73 losely resembles
0200: 20 61 20 68 2d 6e 6f 74 65 2f 62 6c 6f 67 20 70 a h-note/blog p
0210: 6f 73 74 29 2c 20 77 69 6b 69 20 70 61 67 65 73 ost), wiki pages
0220: 20 28 66 72 6f 6d 0a 23 20 68 2d 65 6e 74 72 79 (from.# h-entry
0230: 29 2c 20 74 69 63 6b 65 74 73 20 28 63 61 6c 6c ), tickets (call
0240: 65 64 20 68 2d 69 73 73 75 65 20 69 6e 20 6d 66 ed h-issue in mf
0250: 32 29 2c 20 61 6e 64 20 63 68 61 74 20 28 66 72 2), and chat (fr
0260: 6f 6d 20 68 2d 65 76 65 6e 74 20 73 75 62 6d 69 om h-event submi
0270: 73 73 69 6f 6e 73 29 2e 0a 23 0a 23 20 56 65 72 ssions)..#.# Ver
0280: 69 66 69 65 73 20 61 75 74 68 2f 74 6f 6b 65 6e ifies auth/token
0290: 2c 20 75 6e 70 61 63 6b 73 20 72 65 71 75 65 73 , unpacks reques
02a0: 74 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61 6e t parameters, an
02b0: 64 20 69 6e 76 6f 6b 65 73 20 66 6f 73 73 69 6c d invokes fossil
02c0: 20 62 69 6e 0a 23 20 6f 6e 20 74 68 65 20 63 75 bin.# on the cu
02d0: 72 72 65 6e 74 20 2d 52 20 72 65 70 6f 73 69 74 rrent -R reposit
02e0: 6f 72 79 2e 0a 23 20 20 20 c2 b7 20 63 61 74 20 ory..# ยท cat
02f0: 22 63 6f 6e 74 65 6e 74 2e 2e 2e 22 20 7c 20 66 "content..." | f
0300: 6f 73 73 69 6c 20 77 69 6b 69 20 63 72 65 61 74 ossil wiki creat
0310: 65 7c 63 6f 6d 6d 69 74 20 2d 4d 20 74 65 78 74 e|commit -M text
0320: 2f 78 2d 6d 61 72 6b 64 6f 77 6e 0a 23 20 20 20 /x-markdown.#
0330: c2 b7 20 74 69 63 6b 65 74 20 61 64 64 20 43 4f ยท ticket add CO
0340: 4e 54 45 4e 54 20 2e 2e 2e 20 53 54 41 54 55 53 NTENT ... STATUS
0350: 20 2e 2e 2e 20 45 54 43 20 2e 2e 2e 0a 23 0a 23 ... ETC ....#.#
0360: 0a 23 20 57 6f 72 6b 61 72 6f 75 6e 64 20 66 6f .# Workaround fo
0370: 72 20 45 58 54 43 47 49 20 65 6e 76 69 72 6f 6e r EXTCGI environ
0380: 6d 65 6e 74 20 74 6f 20 72 65 63 65 69 76 65 20 ment to receive
0390: 41 75 74 68 3a 20 68 65 61 64 65 72 3a 0a 23 20 Auth: header:.#
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
03c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
03d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 20 20 20 52 ---------.# R
03e0: 65 77 72 69 74 65 43 6f 6e 64 20 25 7b 52 45 51 ewriteCond %{REQ
03f0: 55 45 53 54 5f 55 52 49 7d 20 2e 2b 2f 65 78 74 UEST_URI} .+/ext
0400: 2f 28 61 75 74 68 7c 74 6f 6b 65 6e 7c 6d 69 63 /(auth|token|mic
0410: 72 6f 70 75 62 29 28 5c 3f 2e 2a 29 3f 24 0a 23 ropub)(\?.*)?$.#
0420: 20 20 20 20 52 65 77 72 69 74 65 52 75 6c 65 20 RewriteRule
0430: 2e 2a 20 2d 20 5b 45 3d 48 54 54 50 5f 41 55 54 .* - [E=HTTP_AUT
0440: 48 4f 52 49 5a 41 54 49 4f 4e 3a 25 7b 48 54 54 HORIZATION:%{HTT
0450: 50 3a 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 7d P:Authorization}
0460: 5d 0a 23 20 20 20 20 23 53 65 74 45 6e 76 49 66 ].# #SetEnvIf
0470: 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 22 Authorization "
0480: 28 2e 2a 29 22 20 48 54 54 50 5f 41 55 54 48 4f (.*)" HTTP_AUTHO
0490: 52 49 5a 41 54 49 4f 4e 3d 24 31 0a 23 0a 23 20 RIZATION=$1.#.#
04a0: 2b 20 50 61 74 63 68 20 69 6e 20 66 6f 73 73 69 + Patch in fossi
04b0: 6c 2f 73 72 63 2f 65 78 74 63 67 69 2e 63 3a 20 l/src/extcgi.c:
04c0: 61 64 64 20 48 54 54 50 5f 41 55 54 48 4f 52 49 add HTTP_AUTHORI
04d0: 5a 41 54 49 4f 4e 20 74 6f 20 61 7a 43 67 69 45 ZATION to azCgiE
04e0: 6e 76 5b 5d 0a 23 20 20 20 61 6e 64 20 61 7a 43 nv[].# and azC
04f0: 67 69 56 61 72 73 5b 5d 20 69 6e 20 73 72 63 2f giVars[] in src/
0500: 63 67 69 2e 63 0a 23 0a 23 20 41 6e 6f 74 68 65 cgi.c.#.# Anothe
0510: 72 20 6c 69 6d 69 74 61 74 69 6f 6e 20 6f 66 20 r limitation of
0520: 66 6f 73 73 69 6c 73 20 63 67 69 20 68 61 6e 64 fossils cgi hand
0530: 6c 69 6e 67 3a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d ling:.# --------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0560: 2d 2d 0a 23 20 20 c2 b7 20 61 6e 79 20 70 72 65 --.# ยท any pre
0570: 73 65 6e 63 65 20 6f 66 20 61 20 4c 6f 63 61 74 sence of a Locat
0580: 69 6f 6e 3a 20 68 65 61 64 65 72 20 77 69 6c 6c ion: header will
0590: 20 63 6f 72 72 75 70 74 20 74 68 65 20 72 65 73 corrupt the res
05a0: 70 6f 6e 73 65 20 73 74 61 74 75 73 0a 23 20 20 ponse status.#
05b0: 20 20 61 6e 64 20 62 6f 64 79 2e 0a 23 20 20 c2 and body..# ย
05c0: b7 20 68 65 6e 63 65 20 75 73 69 6e 67 20 43 6f ท hence using Co
05d0: 6e 74 65 6e 74 2d 4c 6f 63 61 74 69 6f 6e 3a 20 ntent-Location:
05e0: 69 6e 73 74 65 61 64 20 28 3d 20 6e 6f 74 20 6d instead (= not m
05f0: 69 63 72 6f 70 75 62 2d 63 6f 6d 70 6c 69 61 6e icropub-complian
0600: 74 29 0a 23 20 20 c2 b7 20 6e 6f 74 20 73 75 72 t).# ยท not sur
0610: 65 20 69 74 20 63 61 6e 20 62 65 20 63 68 61 6e e it can be chan
0620: 67 65 64 20 75 73 69 6e 67 20 6d 6f 64 5f 68 65 ged using mod_he
0630: 61 64 65 72 73 20 60 48 65 61 64 65 72 20 65 64 aders `Header ed
0640: 69 74 2a 60 20 65 74 63 2e 0a 23 0a 23 20 20 20 it*` etc..#.#
0650: 20 20 20 20 48 65 61 64 65 72 20 61 64 64 20 4c Header add L
0660: 6f 63 61 74 69 6f 6e 20 22 65 78 70 72 3d 25 7b ocation "expr=%{
0670: 72 65 73 70 3a 43 6f 6e 74 65 6e 74 2d 4c 6f 63 resp:Content-Loc
0680: 61 74 69 6f 6e 7d 22 20 0a 23 0a 23 20 4d 69 63 ation}" .#.# Mic
0690: 72 6f 50 75 62 20 70 72 6f 74 6f 63 6f 6c 0a 23 roPub protocol.#
06a0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
06b0: 2d 2d 0a 23 0a 23 20 42 65 63 6f 6d 65 73 20 61 --.#.# Becomes a
06c0: 20 74 65 63 68 6e 6f 74 65 3a 0a 23 0a 23 20 20 technote:.#.#
06d0: 20 20 20 50 4f 53 54 20 2e 2e 2e 2f 65 78 74 2f POST .../ext/
06e0: 6d 69 63 72 6f 70 75 62 20 48 54 54 50 2f 31 2e micropub HTTP/1.
06f0: 31 0a 23 20 20 20 20 20 41 75 74 68 6f 72 69 7a 1.# Authoriz
0700: 61 74 69 6f 6e 3a 20 42 65 61 72 65 72 20 24 32 ation: Bearer $2
0710: 79 2e 2e 2e 2e 0a 23 20 20 20 20 20 43 6f 6e 74 y.....# Cont
0720: 65 6e 74 2d 54 79 70 65 3a 20 61 70 70 6c 69 63 ent-Type: applic
0730: 61 74 69 6f 6e 2f 6a 73 6f 6e 0a 23 20 20 20 20 ation/json.#
0740: 20 0a 23 20 20 20 20 20 7b 0a 23 20 20 20 20 20 .# {.#
0750: 20 20 22 74 79 70 65 22 3a 20 5b 22 68 2d 6e 6f "type": ["h-no
0760: 74 65 22 5d 2c 0a 23 20 20 20 20 20 20 20 22 70 te"],.# "p
0770: 72 6f 70 65 72 74 69 65 73 22 3a 20 7b 0a 23 20 roperties": {.#
0780: 20 20 20 20 20 20 20 20 22 63 6f 6e 74 65 6e 74 "content
0790: 22 3a 20 5b 22 23 23 20 48 65 61 64 6c 69 6e 65 ": ["## Headline
07a0: 5c 6e 5c 6e 20 5b 6d 61 72 6b 64 6f 77 6e 5d 28 \n\n [markdown](
07b0: 2e 2e 2e 29 22 5d 2c 0a 23 20 20 20 20 20 20 20 ...)"],.#
07c0: 20 20 22 74 69 74 6c 65 22 3a 20 5b 22 63 6f 6d "title": ["com
07d0: 6d 69 74 20 6e 6f 74 65 22 5d 0a 23 20 20 20 20 mit note"].#
07e0: 20 20 20 7d 0a 23 20 20 20 20 20 7d 0a 23 0a 23 }.# }.#.#
07f0: 20 4d 61 70 70 65 64 20 74 6f 20 61 20 74 69 63 Mapped to a tic
0800: 6b 65 74 3a 0a 23 0a 23 20 20 20 20 20 50 4f 53 ket:.#.# POS
0810: 54 20 2e 2e 2e 2f 65 78 74 2f 6d 69 63 72 6f 70 T .../ext/microp
0820: 75 62 20 48 54 54 50 2f 31 2e 31 0a 23 20 20 20 ub HTTP/1.1.#
0830: 20 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 3a Authorization:
0840: 20 42 65 61 72 65 72 20 24 32 79 2e 2e 2e 2e 0a Bearer $2y.....
0850: 23 20 20 20 20 20 43 6f 6e 74 65 6e 74 2d 54 79 # Content-Ty
0860: 70 65 3a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f pe: application/
0870: 6a 73 6f 6e 0a 23 20 20 20 20 20 0a 23 20 20 20 json.# .#
0880: 20 20 7b 0a 23 20 20 20 20 20 20 20 22 74 79 70 {.# "typ
0890: 65 22 3a 20 5b 22 68 2d 69 73 73 75 65 22 5d 2c e": ["h-issue"],
08a0: 0a 23 20 20 20 20 20 20 20 22 70 72 6f 70 65 72 .# "proper
08b0: 74 69 65 73 22 3a 20 7b 0a 23 20 20 20 20 20 20 ties": {.#
08c0: 20 20 20 22 63 6f 6e 74 65 6e 74 22 3a 20 5b 22 "content": ["
08d0: 23 23 20 49 20 68 61 7a 20 74 68 65 20 70 72 6f ## I haz the pro
08e0: 62 6c 65 6d 2e 2e 2e 22 5d 2c 0a 23 20 20 20 20 blem..."],.#
08f0: 20 20 20 20 20 22 73 75 6d 6d 61 72 79 22 3a 20 "summary":
0900: 5b 22 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 ["RuntimeExcepti
0910: 6f 6e 20 69 6e 20 63 6f 72 65 2e 70 79 22 5d 2c on in core.py"],
0920: 0a 23 20 20 20 20 20 20 20 20 20 22 74 79 70 65 .# "type
0930: 22 3a 20 5b 22 46 65 61 74 75 72 65 20 52 65 71 ": ["Feature Req
0940: 75 65 73 74 22 5d 2c 0a 23 20 20 20 20 20 20 20 uest"],.#
0950: 20 20 22 70 72 69 6f 72 69 74 79 22 3a 20 5b 22 "priority": ["
0960: 49 6d 6d 65 64 69 61 74 65 22 5d 2c 0a 23 20 20 Immediate"],.#
0970: 20 20 20 20 20 20 20 22 73 65 76 65 72 69 74 79 "severity
0980: 22 3a 20 5b 22 4c 6f 77 22 5d 2c 0a 23 20 20 20 ": ["Low"],.#
0990: 20 20 20 20 20 20 22 63 61 74 65 67 6f 72 79 22 "category"
09a0: 3a 20 5b 22 69 6e 69 74 22 5d 2c 0a 23 20 20 20 : ["init"],.#
09b0: 20 20 20 20 20 20 22 76 65 72 73 69 6f 6e 22 3a "version":
09c0: 20 5b 22 76 30 2e 33 22 5d 2c 0a 23 20 20 20 20 ["v0.3"],.#
09d0: 20 20 20 20 20 22 63 6f 6e 74 61 63 74 22 3a 20 "contact":
09e0: 5b 22 75 73 65 72 40 6c 6f 63 61 6c 6e 65 74 22 ["user@localnet"
09f0: 5d 0a 23 20 20 20 20 20 20 20 7d 0a 23 20 20 20 ].# }.#
0a00: 20 20 7d 0a 23 0a 23 20 50 72 6f 62 61 62 6c 79 }.#.# Probably
0a10: 20 6d 61 6b 65 73 20 73 65 6e 73 65 20 74 6f 20 makes sense to
0a20: 64 65 66 69 6e 65 20 61 20 70 65 72 6d 61 74 6f define a permato
0a30: 6b 65 6e 20 69 66 20 79 6f 75 20 77 61 6e 74 20 ken if you want
0a40: 74 6f 20 75 73 65 20 74 68 69 73 20 61 73 0a 23 to use this as.#
0a50: 20 72 65 61 6c 20 74 69 63 6b 65 74 20 62 72 69 real ticket bri
0a60: 64 67 65 2e 20 28 4d 69 63 72 6f 70 75 62 20 69 dge. (Micropub i
0a70: 73 20 73 6f 72 74 20 6f 66 20 61 20 73 69 64 65 s sort of a side
0a80: 20 70 72 6f 6a 65 63 74 20 68 65 72 65 2c 20 74 project here, t
0a90: 68 65 20 67 6f 61 6c 0a 23 20 69 73 20 73 6f 6d he goal.# is som
0aa0: 65 20 66 6f 72 6d 20 6f 66 20 64 6f 77 6e 2f 75 e form of down/u
0ab0: 70 73 74 72 65 61 6d 20 74 69 63 6b 65 74 20 62 pstream ticket b
0ac0: 72 69 64 67 65 2e 29 0a 23 0a 0a 69 66 20 28 24 ridge.).#..if ($
0ad0: 5f 52 45 51 55 45 53 54 5b 22 64 62 67 22 5d 29 _REQUEST["dbg"])
0ae0: 20 7b 0a 20 20 20 20 65 72 72 6f 72 5f 72 65 70 {. error_rep
0af0: 6f 72 74 69 6e 67 28 45 5f 41 4c 4c 29 3b 20 69 orting(E_ALL); i
0b00: 6e 69 5f 73 65 74 28 22 64 69 73 70 6c 61 79 5f ni_set("display_
0b10: 65 72 72 6f 72 73 22 2c 20 31 29 3b 0a 7d 0a 0a errors", 1);.}..
0b20: 23 2d 2d 20 69 6e 69 74 0a 64 65 66 69 6e 65 28 #-- init.define(
0b30: 22 4d 50 5f 53 45 4c 46 22 2c 20 22 68 74 74 70 "MP_SELF", "http
0b40: 73 3a 2f 2f 24 5f 53 45 52 56 45 52 5b 53 45 52 s://$_SERVER[SER
0b50: 56 45 52 5f 4e 41 4d 45 5d 24 5f 53 45 52 56 45 VER_NAME]$_SERVE
0b60: 52 5b 50 48 50 5f 53 45 4c 46 5d 22 29 3b 0a 68 R[PHP_SELF]");.h
0b70: 65 61 64 65 72 28 22 4c 69 6e 6b 3a 20 3c 22 2e eader("Link: <".
0b80: 4d 50 5f 53 45 4c 46 2e 22 3e 3b 20 72 65 6c 3d MP_SELF.">; rel=
0b90: 6d 69 63 72 6f 70 75 62 22 29 3b 0a 68 65 61 64 micropub");.head
0ba0: 65 72 28 22 41 63 63 65 73 73 2d 43 6f 6e 74 72 er("Access-Contr
0bb0: 6f 6c 2d 41 6c 6c 6f 77 2d 4f 72 69 67 69 6e 3a ol-Allow-Origin:
0bc0: 20 2a 22 29 3b 0a 0a 23 2d 2d 20 63 6f 6e 66 69 *");..#-- confi
0bd0: 67 0a 23 20 20 63 6f 6d 62 69 6e 65 73 20 68 74 g.# combines ht
0be0: 74 70 73 3a 2f 2f 69 6e 64 69 65 77 65 62 2e 6f tps://indieweb.o
0bf0: 72 67 2f 4d 69 63 72 6f 70 75 62 2d 65 78 74 65 rg/Micropub-exte
0c00: 6e 73 69 6f 6e 73 23 51 75 65 72 79 5f 66 6f 72 nsions#Query_for
0c10: 5f 53 75 70 70 6f 72 74 65 64 5f 56 6f 63 61 62 _Supported_Vocab
0c20: 75 6c 61 72 79 0a 23 20 20 77 69 74 68 20 68 74 ulary.# with ht
0c30: 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d tps://github.com
0c40: 2f 69 6e 64 69 65 77 65 62 2f 6d 69 63 72 6f 70 /indieweb/microp
0c50: 75 62 2d 65 78 74 65 6e 73 69 6f 6e 73 2f 69 73 ub-extensions/is
0c60: 73 75 65 73 2f 38 0a 23 20 20 74 6f 20 73 6f 72 sues/8.# to sor
0c70: 74 20 6f 66 20 72 65 73 65 6d 62 6c 65 20 68 74 t of resemble ht
0c80: 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63 6f 6d tps://github.com
0c90: 2f 62 61 72 72 79 66 2f 6d 69 63 72 6f 70 75 62 /barryf/micropub
0ca0: 6c 69 73 68 2f 62 6c 6f 62 2f 6d 61 73 74 65 72 lish/blob/master
0cb0: 2f 63 6f 6e 66 69 67 2f 70 72 6f 70 65 72 74 69 /config/properti
0cc0: 65 73 2e 6a 73 6f 6e 0a 23 20 20 61 6c 73 6f 20 es.json.# also
0cd0: 75 73 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 used for interna
0ce0: 6c 20 6d 61 70 70 69 6e 67 20 6f 66 20 6d 66 32 l mapping of mf2
0cf0: 20 74 79 70 65 73 20 6f 6e 74 6f 20 66 6f 73 73 types onto foss
0d00: 69 6c 20 63 6f 6d 6d 61 6e 64 73 20 28 68 79 70 il commands (hyp
0d10: 68 65 6e 20 69 6e 20 60 2d 6d 61 70 60 20 69 6e hen in `-map` in
0d20: 64 69 63 61 74 65 73 20 69 6e 74 65 72 6e 61 6c dicates internal
0d30: 20 75 73 65 29 0a 24 6d 61 70 20 3d 20 5b 0a 20 use).$map = [.
0d40: 20 20 20 5b 0a 20 20 20 20 20 20 20 20 22 74 79 [. "ty
0d50: 70 65 22 20 3d 3e 20 22 6e 6f 74 65 22 2c 20 20 pe" => "note",
0d60: 20 23 20 73 68 6f 75 6c 64 20 61 6c 73 6f 20 62 # should also b
0d70: 65 20 27 68 2d 65 6e 74 72 79 27 20 72 65 61 6c e 'h-entry' real
0d80: 6c 79 2c 20 62 75 74 20 74 68 69 73 20 73 69 6d ly, but this sim
0d90: 70 6c 69 66 69 65 73 20 6d 61 70 70 69 6e 67 20 plifies mapping
0da0: 77 6f 2f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 wo/ checking for
0db0: 20 73 75 70 70 6c 69 65 64 20 70 72 6f 70 65 72 supplied proper
0dc0: 74 69 65 73 0a 20 20 20 20 20 20 20 20 22 6e 61 ties. "na
0dd0: 6d 65 22 20 3d 3e 20 22 42 6c 6f 67 2f 54 65 63 me" => "Blog/Tec
0de0: 68 6e 6f 74 65 22 2c 0a 20 20 20 20 20 20 20 20 hnote",.
0df0: 22 68 22 20 3d 3e 20 22 65 6e 74 72 79 22 2c 0a "h" => "entry",.
0e00: 20 20 20 20 20 20 20 20 22 2d 6d 61 70 22 20 3d "-map" =
0e10: 3e 20 22 74 65 63 68 6e 6f 74 65 22 2c 0a 20 20 > "technote",.
0e20: 20 20 20 20 20 20 22 2d 63 61 70 22 20 3d 3e 20 "-cap" =>
0e30: 22 5b 62 69 63 6b 5d 22 2c 0a 20 20 20 20 20 20 "[bick]",.
0e40: 20 20 22 61 63 63 65 70 74 73 2d 6d 65 64 69 61 "accepts-media
0e50: 22 20 3d 3e 20 54 52 55 45 2c 0a 20 20 20 20 20 " => TRUE,.
0e60: 20 20 20 22 70 72 6f 70 65 72 74 69 65 73 22 20 "properties"
0e70: 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 => [.
0e80: 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 [.
0e90: 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 63 6f "name" => "co
0ea0: 6e 74 65 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 ntent",.
0eb0: 20 20 20 20 20 20 20 20 22 6c 61 62 65 6c 22 20 "label"
0ec0: 3d 3e 20 22 43 6f 6e 74 65 6e 74 22 2c 0a 20 20 => "Content",.
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 "t
0ee0: 79 70 65 22 20 3d 3e 20 22 74 65 78 74 61 72 65 ype" => "textare
0ef0: 61 20 6d 61 72 6b 64 6f 77 6e 22 2c 0a 20 20 20 a markdown",.
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 76 61 "va
0f10: 6c 75 65 22 20 3d 3e 20 22 23 23 20 4e 6f 74 65 lue" => "## Note
0f20: 5c 6e 2e 2e 2e 22 2c 0a 20 20 20 20 20 20 20 20 \n...",.
0f30: 20 20 20 20 20 20 20 20 22 72 65 71 75 69 72 65 "require
0f40: 64 22 20 3d 3e 20 74 72 75 65 2c 0a 20 20 20 20 d" => true,.
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 6d 61 "-ma
0f60: 70 22 20 3d 3e 20 22 73 74 64 69 6e 22 2c 0a 20 p" => "stdin",.
0f70: 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 ],.
0f80: 20 20 20 20 20 20 20 20 20 20 5b 0a 20 20 20 20 [.
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 61 6d "nam
0fa0: 65 22 20 3d 3e 20 22 73 75 6d 6d 61 72 79 22 2c e" => "summary",
0fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0fc0: 20 22 6c 61 62 65 6c 22 20 3d 3e 20 22 54 69 6d "label" => "Tim
0fd0: 65 6c 69 6e 65 20 6e 6f 74 65 22 2c 0a 20 20 20 eline note",.
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 79 "ty
0ff0: 70 65 22 20 3d 3e 20 22 74 65 78 74 20 70 6c 61 pe" => "text pla
1000: 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 in",.
1010: 20 20 20 20 20 22 70 6c 61 63 65 68 6f 6c 64 65 "placeholde
1020: 72 22 20 3d 3e 20 22 63 6f 6d 6d 69 74 20 64 65 r" => "commit de
1030: 73 63 72 69 70 74 69 6f 6e 2e 2e 2e 22 2c 0a 20 scription...",.
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
1050: 2d 6d 61 70 22 20 3d 3e 20 22 74 69 74 6c 65 22 -map" => "title"
1060: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c ,. ],
1070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 0a 20 . [.
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
1090: 6e 61 6d 65 22 20 3d 3e 20 22 62 67 63 6f 6c 6f name" => "bgcolo
10a0: 72 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 r",.
10b0: 20 20 20 20 22 74 79 70 65 22 20 3d 3e 20 22 63 "type" => "c
10c0: 6f 6c 6f 72 22 2c 0a 20 20 20 20 20 20 20 20 20 olor",.
10d0: 20 20 20 20 20 20 20 22 72 65 71 75 69 72 65 64 "required
10e0: 22 20 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 " => false,.
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 6d 61 "-ma
1100: 70 22 20 3d 3e 20 22 62 67 63 6f 6c 6f 72 22 2c p" => "bgcolor",
1110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a . ],.
1120: 20 20 20 20 20 20 20 20 20 20 20 20 5b 0a 20 20 [.
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e "n
1140: 61 6d 65 22 20 3d 3e 20 22 76 69 73 69 62 69 6c ame" => "visibil
1150: 69 74 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 ity",.
1160: 20 20 20 20 20 20 22 74 79 70 65 22 20 3d 3e 20 "type" =>
1170: 22 63 68 65 63 6b 62 6f 78 22 2c 0a 20 20 20 20 "checkbox",.
1180: 20 20 20 20 20 20 20 20 20 20 20 20 22 76 61 6c "val
1190: 75 65 22 20 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 ue" => false,.
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 "r
11b0: 65 71 75 69 72 65 64 22 20 3d 3e 20 66 61 6c 73 equired" => fals
11c0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e,.
11d0: 20 20 20 22 2d 6d 61 70 22 20 3d 3e 20 22 68 69 "-map" => "hi
11e0: 64 64 65 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 dden",.
11f0: 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 ],.
1200: 20 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 [.
1210: 20 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 70 "name" => "p
1220: 68 6f 74 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 hoto",.
1230: 20 20 20 20 20 20 20 22 74 79 70 65 22 20 3d 3e "type" =>
1240: 20 22 66 69 6c 65 22 2c 0a 20 20 20 20 20 20 20 "file",.
1250: 20 20 20 20 20 20 20 20 20 22 61 63 63 65 70 74 "accept
1260: 73 22 20 3d 3e 20 22 69 6d 61 67 65 2f 2a 22 2c s" => "image/*",
1270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1280: 20 22 69 73 2d 6d 65 64 69 61 22 20 3d 3e 20 74 "is-media" => t
1290: 72 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 rue,.
12a0: 20 20 20 20 20 22 72 65 71 75 69 72 65 64 22 20 "required"
12b0: 3d 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 => false,.
12c0: 20 20 20 20 20 20 5d 0a 20 20 20 20 20 20 20 20 ].
12d0: 5d 2c 0a 20 20 20 20 5d 2c 0a 20 20 20 20 5b 0a ],. ],. [.
12e0: 20 20 20 20 20 20 20 20 22 74 79 70 65 22 20 3d "type" =
12f0: 3e 20 22 65 6e 74 72 79 22 2c 0a 20 20 20 20 20 > "entry",.
1300: 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 57 69 "name" => "Wi
1310: 6b 69 20 70 61 67 65 22 2c 0a 20 20 20 20 20 20 ki page",.
1320: 20 20 22 68 22 20 3d 3e 20 22 65 6e 74 72 79 22 "h" => "entry"
1330: 2c 0a 20 20 20 20 20 20 20 20 22 2d 6d 61 70 22 ,. "-map"
1340: 20 3d 3e 20 22 77 69 6b 69 22 2c 0a 20 20 20 20 => "wiki",.
1350: 20 20 20 20 22 2d 63 61 70 22 20 3d 3e 20 22 5b "-cap" => "[
1360: 6b 6d 66 5d 22 2c 0a 20 20 20 20 20 20 20 20 22 kmf]",. "
1370: 61 63 63 65 70 74 73 2d 6d 65 64 69 61 22 20 3d accepts-media" =
1380: 3e 20 54 52 55 45 2c 0a 20 20 20 20 20 20 20 20 > TRUE,.
1390: 22 70 72 6f 70 65 72 74 69 65 73 22 20 3d 3e 20 "properties" =>
13a0: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 0a [. [.
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13c0: 22 6e 61 6d 65 22 20 3d 3e 20 22 63 6f 6e 74 65 "name" => "conte
13d0: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 nt",.
13e0: 20 20 20 20 20 22 6c 61 62 65 6c 22 20 3d 3e 20 "label" =>
13f0: 22 43 6f 6e 74 65 6e 74 22 2c 0a 20 20 20 20 20 "Content",.
1400: 20 20 20 20 20 20 20 20 20 20 20 22 74 79 70 65 "type
1410: 22 20 3d 3e 20 22 74 65 78 74 61 72 65 61 20 6d " => "textarea m
1420: 61 72 6b 64 6f 77 6e 22 2c 0a 20 20 20 20 20 20 arkdown",.
1430: 20 20 20 20 20 20 20 20 20 20 22 76 61 6c 75 65 "value
1440: 22 20 3d 3e 20 22 23 23 20 4e 6f 74 65 5c 6e 2e " => "## Note\n.
1450: 2e 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ..",.
1460: 20 20 20 20 20 22 72 65 71 75 69 72 65 64 22 20 "required"
1470: 3d 3e 20 74 72 75 65 2c 0a 20 20 20 20 20 20 20 => true,.
1480: 20 20 20 20 20 20 20 20 20 22 2d 6d 61 70 22 20 "-map"
1490: 3d 3e 20 22 73 74 64 69 6e 22 2c 0a 20 20 20 20 => "stdin",.
14a0: 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 ],.
14b0: 20 20 20 20 20 20 20 5b 0a 20 20 20 20 20 20 20 [.
14c0: 20 20 20 20 20 20 20 20 20 22 6e 61 6d 65 22 20 "name"
14d0: 3d 3e 20 22 74 69 74 6c 65 22 2c 0a 20 20 20 20 => "title",.
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 6c 61 62 "lab
14f0: 65 6c 22 20 3d 3e 20 22 54 69 74 6c 65 22 2c 0a el" => "Title",.
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1510: 22 74 79 70 65 22 20 3d 3e 20 22 74 65 78 74 22 "type" => "text"
1520: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1530: 20 20 22 70 6c 61 64 65 68 6f 6c 64 65 72 22 20 "pladeholder"
1540: 3d 3e 20 22 50 61 67 65 54 69 74 6c 65 22 2c 0a => "PageTitle",.
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1560: 22 72 65 71 75 69 72 65 64 22 20 3d 3e 20 74 72 "required" => tr
1570: 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ue,.
1580: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b ],. [
1590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
15a0: 20 22 6e 61 6d 65 22 20 3d 3e 20 22 61 74 74 61 "name" => "atta
15b0: 63 68 6d 65 6e 74 22 2c 0a 20 20 20 20 20 20 20 chment",.
15c0: 20 20 20 20 20 20 20 20 20 22 6c 61 62 65 6c 22 "label"
15d0: 20 3d 3e 20 22 41 74 74 61 63 68 6d 65 6e 74 22 => "Attachment"
15e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
15f0: 20 20 22 74 79 70 65 22 20 3d 3e 20 22 66 69 6c "type" => "fil
1600: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 e",.
1610: 20 20 20 20 22 61 63 63 65 70 74 73 22 20 3d 3e "accepts" =>
1620: 20 22 2a 2f 2a 22 2c 0a 20 20 20 20 20 20 20 20 "*/*",.
1630: 20 20 20 20 20 20 20 20 22 69 73 2d 6d 65 64 69 "is-medi
1640: 61 22 20 3d 3e 20 74 72 75 65 2c 0a 20 20 20 20 a" => true,.
1650: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 65 71 "req
1660: 75 69 72 65 64 22 20 3d 3e 20 66 61 6c 73 65 2c uired" => false,
1670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a . ],.
1680: 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 5d ],. ]
1690: 2c 0a 20 20 20 20 5b 0a 20 20 20 20 20 20 20 20 ,. [.
16a0: 22 74 79 70 65 22 20 3d 3e 20 22 69 73 73 75 65 "type" => "issue
16b0: 22 2c 0a 20 20 20 20 20 20 20 20 22 6e 61 6d 65 ",. "name
16c0: 22 20 3d 3e 20 22 54 69 63 6b 65 74 22 2c 0a 20 " => "Ticket",.
16d0: 20 20 20 20 20 20 20 22 68 22 20 3d 3e 20 22 65 "h" => "e
16e0: 6e 74 72 79 22 2c 0a 20 20 20 20 20 20 20 20 22 ntry",. "
16f0: 2d 6d 61 70 22 20 3d 3e 20 22 74 69 63 6b 65 74 -map" => "ticket
1700: 22 2c 0a 20 20 20 20 20 20 20 20 22 2d 63 61 70 ",. "-cap
1710: 22 20 3d 3e 20 22 6e 22 2c 0a 20 20 20 20 20 20 " => "n",.
1720: 20 20 22 61 63 63 65 70 74 73 2d 6d 65 64 69 61 "accepts-media
1730: 22 20 3d 3e 20 46 41 4c 53 45 2c 0a 20 20 20 20 " => FALSE,.
1740: 20 20 20 20 22 70 72 6f 70 65 72 74 69 65 73 22 "properties"
1750: 20 3d 3e 20 5b 0a 20 20 20 20 20 20 20 20 20 20 => [.
1760: 20 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 [.
1770: 20 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 63 "name" => "c
1780: 6f 6e 74 65 6e 74 22 2c 0a 20 20 20 20 20 20 20 ontent",.
1790: 20 20 20 20 20 20 20 20 20 22 6c 61 62 65 6c 22 "label"
17a0: 20 3d 3e 20 22 43 6f 6e 74 65 6e 74 22 2c 0a 20 => "Content",.
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
17c0: 74 79 70 65 22 20 3d 3e 20 22 74 65 78 74 61 72 type" => "textar
17d0: 65 61 20 6d 61 72 6b 64 6f 77 6e 22 2c 0a 20 20 ea markdown",.
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 "p
17f0: 6c 61 63 65 68 6f 6c 64 65 72 22 20 3d 3e 20 22 laceholder" => "
1800: 23 23 20 4e 6f 74 65 5c 6e 2e 2e 2e 22 2c 0a 20 ## Note\n...",.
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
1820: 72 65 71 75 69 72 65 64 22 20 3d 3e 20 74 72 75 required" => tru
1830: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e,.
1840: 20 20 20 22 2d 6d 61 70 22 20 3d 3e 20 22 63 6f "-map" => "co
1850: 6d 6d 65 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 mment",.
1860: 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 ],.
1870: 20 20 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 [.
1880: 20 20 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 "name" => "
1890: 74 69 74 6c 65 22 2c 0a 20 20 20 20 20 20 20 20 title",.
18a0: 20 20 20 20 20 20 20 20 22 6c 61 62 65 6c 22 20 "label"
18b0: 3d 3e 20 22 54 69 74 6c 65 2f 53 75 6d 6d 61 72 => "Title/Summar
18c0: 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 y",.
18d0: 20 20 20 20 22 74 79 70 65 22 20 3d 3e 20 22 74 "type" => "t
18e0: 65 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 ext",.
18f0: 20 20 20 20 20 20 22 70 6c 61 63 65 68 6f 6c 64 "placehold
1900: 65 72 22 20 3d 3e 20 22 42 75 67 20 69 6e 2e 2e er" => "Bug in..
1910: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 .",.
1920: 20 20 20 20 22 72 65 71 75 69 72 65 64 22 20 3d "required" =
1930: 3e 20 74 72 75 65 2c 0a 20 20 20 20 20 20 20 20 > true,.
1940: 20 20 20 20 20 20 20 20 22 2d 6d 61 70 22 20 3d "-map" =
1950: 3e 20 22 74 69 74 6c 65 22 2c 0a 20 20 20 20 20 > "title",.
1960: 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 ],.
1970: 20 20 20 20 20 20 5b 0a 20 20 20 20 20 20 20 20 [.
1980: 20 20 20 20 20 20 20 20 22 6e 61 6d 65 22 20 3d "name" =
1990: 3e 20 22 74 79 70 65 22 2c 0a 20 20 20 20 20 20 > "type",.
19a0: 20 20 20 20 20 20 20 20 20 20 22 6c 61 62 65 6c "label
19b0: 22 20 3d 3e 20 22 54 69 63 6b 65 74 20 74 79 70 " => "Ticket typ
19c0: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 e",.
19d0: 20 20 20 20 22 74 79 70 65 22 20 3d 3e 20 22 73 "type" => "s
19e0: 65 6c 65 63 74 22 2c 0a 20 20 20 20 20 20 20 20 elect",.
19f0: 20 20 20 20 20 20 20 20 22 73 65 6c 65 63 74 22 "select"
1a00: 20 3d 3e 20 5b 22 43 6f 64 65 5f 44 65 66 65 63 => ["Code_Defec
1a10: 74 22 2c 20 22 42 75 69 6c 64 5f 50 72 6f 62 6c t", "Build_Probl
1a20: 65 6d 22 2c 20 22 44 6f 63 75 6d 65 6e 74 61 74 em", "Documentat
1a30: 69 6f 6e 22 2c 20 22 46 65 61 74 75 72 65 5f 52 ion", "Feature_R
1a40: 65 71 75 65 73 74 22 2c 20 22 49 6e 63 69 64 65 equest", "Incide
1a50: 6e 74 22 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 nt"],.
1a60: 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ],.
1a70: 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 [.
1a80: 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 70 72 "name" => "pr
1a90: 69 6f 72 69 74 79 22 2c 0a 20 20 20 20 20 20 20 iority",.
1aa0: 20 20 20 20 20 20 20 20 20 22 74 79 70 65 22 20 "type"
1ab0: 3d 3e 20 22 73 65 6c 65 63 74 22 2c 0a 20 20 20 => "select",.
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65 "se
1ad0: 6c 65 63 74 22 20 3d 3e 20 5b 22 49 6d 6d 65 64 lect" => ["Immed
1ae0: 69 61 74 65 22 2c 20 22 48 69 67 68 22 2c 20 22 iate", "High", "
1af0: 4d 65 64 69 75 6d 22 2c 20 22 4c 6f 77 22 2c 20 Medium", "Low",
1b00: 22 5a 65 72 6f 22 5d 2c 0a 20 20 20 20 20 20 20 "Zero"],.
1b10: 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 ],.
1b20: 20 20 20 20 5b 0a 20 20 20 20 20 20 20 20 20 20 [.
1b30: 20 20 20 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 "name" =>
1b40: 22 73 65 76 65 72 69 74 79 22 2c 0a 20 20 20 20 "severity",.
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 79 70 "typ
1b60: 65 22 20 3d 3e 20 22 73 65 6c 65 63 74 22 2c 0a e" => "select",.
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b80: 22 73 65 6c 65 63 74 22 20 3d 3e 20 5b 22 43 72 "select" => ["Cr
1b90: 69 74 69 63 61 6c 22 2c 20 22 53 65 76 65 72 65 itical", "Severe
1ba0: 22 2c 20 22 49 6d 70 6f 72 74 61 6e 74 22 2c 20 ", "Important",
1bb0: 22 4d 69 6e 6f 72 22 2c 20 22 43 6f 73 6d 65 74 "Minor", "Cosmet
1bc0: 69 63 22 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 ic"],.
1bd0: 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ],.
1be0: 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 [.
1bf0: 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 63 61 "name" => "ca
1c00: 74 65 67 6f 72 79 22 2c 0a 20 20 20 20 20 20 20 tegory",.
1c10: 20 20 20 20 20 20 20 20 20 22 2d 6d 61 70 22 20 "-map"
1c20: 3d 3e 20 22 73 75 62 73 79 73 74 65 6d 22 2c 0a => "subsystem",.
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20 ],.
1c40: 20 20 20 20 20 20 20 20 20 20 20 5b 0a 20 20 20 [.
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6e 61 "na
1c60: 6d 65 22 20 3d 3e 20 22 76 65 72 73 69 6f 6e 22 me" => "version"
1c70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1c80: 20 20 22 2d 6d 61 70 22 20 3d 3e 20 22 66 6f 75 "-map" => "fou
1c90: 6e 64 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 ndin",.
1ca0: 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 ],.
1cb0: 20 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 [.
1cc0: 20 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 63 "name" => "c
1cd0: 6f 6e 74 61 63 74 22 2c 0a 20 20 20 20 20 20 20 ontact",.
1ce0: 20 20 20 20 20 20 20 20 20 22 74 79 70 65 22 20 "type"
1cf0: 3d 3e 20 22 74 65 78 74 20 65 6d 61 69 6c 20 75 => "text email u
1d00: 72 6c 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 rl",.
1d10: 20 20 20 20 20 22 2d 6d 61 70 22 20 3d 3e 20 22 "-map" => "
1d20: 70 72 69 76 61 74 65 5f 63 6f 6e 74 61 63 74 22 private_contact"
1d30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c ,. ],
1d40: 0a 20 20 20 20 20 20 20 20 5d 2c 0a 20 20 20 20 . ],.
1d50: 5d 2c 0a 20 20 20 20 5b 0a 20 20 20 20 20 20 20 ],. [.
1d60: 20 22 74 79 70 65 22 20 3d 3e 20 22 65 76 65 6e "type" => "even
1d70: 74 22 2c 0a 20 20 20 20 20 20 20 20 22 6e 61 6d t",. "nam
1d80: 65 22 20 3d 3e 20 22 43 68 61 74 22 2c 0a 20 20 e" => "Chat",.
1d90: 20 20 20 20 20 20 22 68 22 20 3d 3e 20 22 65 6e "h" => "en
1da0: 74 72 79 22 2c 0a 20 20 20 20 20 20 20 20 22 2d try",. "-
1db0: 6d 61 70 22 20 3d 3e 20 22 63 68 61 74 22 2c 0a map" => "chat",.
1dc0: 20 20 20 20 20 20 20 20 22 2d 63 61 70 22 20 3d "-cap" =
1dd0: 3e 20 22 43 22 2c 0a 20 20 20 20 20 20 20 20 22 > "C",. "
1de0: 61 63 63 65 70 74 73 2d 6d 65 64 69 61 22 20 3d accepts-media" =
1df0: 3e 20 54 52 55 45 2c 0a 20 20 20 20 20 20 20 20 > TRUE,.
1e00: 22 70 72 6f 70 65 72 74 69 65 73 22 20 3d 3e 20 "properties" =>
1e10: 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 5b 0a [. [.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e30: 22 6e 61 6d 65 22 20 3d 3e 20 22 63 6f 6e 74 65 "name" => "conte
1e40: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 nt",.
1e50: 20 20 20 20 20 22 6c 61 62 65 6c 22 20 3d 3e 20 "label" =>
1e60: 22 4d 65 73 73 61 67 65 22 2c 0a 20 20 20 20 20 "Message",.
1e70: 20 20 20 20 20 20 20 20 20 20 20 22 74 79 70 65 "type
1e80: 22 20 3d 3e 20 22 74 65 78 74 22 2c 0a 20 20 20 " => "text",.
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 65 "re
1ea0: 71 75 69 72 65 64 22 20 3d 3e 20 74 72 75 65 2c quired" => true,
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1ec0: 20 22 2d 6d 61 70 22 20 3d 3e 20 22 63 6f 6e 74 "-map" => "cont
1ed0: 65 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 ent",.
1ee0: 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ],.
1ef0: 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 [.
1f00: 20 20 20 22 6e 61 6d 65 22 20 3d 3e 20 22 70 68 "name" => "ph
1f10: 6f 74 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 oto",.
1f20: 20 20 20 20 20 20 22 6c 61 62 65 6c 22 20 3d 3e "label" =>
1f30: 20 22 49 6d 61 67 65 20 61 74 74 61 63 68 6d 65 "Image attachme
1f40: 6e 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 nnt",.
1f50: 20 20 20 20 20 20 22 74 79 70 65 22 20 3d 3e 20 "type" =>
1f60: 22 66 69 6c 65 22 2c 0a 20 20 20 20 20 20 20 20 "file",.
1f70: 20 20 20 20 20 20 20 20 22 61 63 63 65 70 74 73 "accepts
1f80: 22 20 3d 3e 20 22 69 6d 61 67 65 2f 2a 22 2c 0a " => "image/*",.
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fa0: 22 69 73 2d 6d 65 64 69 61 22 20 3d 3e 20 74 72 "is-media" => tr
1fb0: 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ue,.
1fc0: 20 20 20 20 22 72 65 71 75 69 72 65 64 22 20 3d "required" =
1fd0: 3e 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 > false,.
1fe0: 20 20 20 20 20 5d 2c 0a 20 20 20 20 20 20 20 20 ],.
1ff0: 5d 2c 0a 20 20 20 20 5d 2c 0a 5d 3b 0a 0a 0a 23 ],. ],.];...#
2000: 2d 2d 20 64 61 74 61 62 61 73 65 20 28 3d 3d 20 -- database (==
2010: 66 6f 73 73 69 6c 20 72 65 70 6f 29 0a 66 75 6e fossil repo).fun
2020: 63 74 69 6f 6e 20 64 62 28 24 73 71 6c 3d 22 22 ction db($sql=""
2030: 2c 20 24 70 61 72 61 6d 73 3d 5b 5d 29 20 7b 0a , $params=[]) {.
2040: 20 20 20 20 73 74 61 74 69 63 20 24 64 62 3b 0a static $db;.
2050: 20 20 20 20 69 66 20 28 65 6d 70 74 79 28 24 64 if (empty($d
2060: 62 29 29 20 7b 0a 20 20 20 20 20 20 20 20 24 64 b)) {. $d
2070: 62 20 3d 20 6e 65 77 20 50 44 4f 28 22 73 71 6c b = new PDO("sql
2080: 69 74 65 3a 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a ite::memory:");.
2090: 20 20 20 20 20 20 20 20 24 64 62 2d 3e 73 65 74 $db->set
20a0: 41 74 74 72 69 62 75 74 65 28 50 44 4f 3a 3a 41 Attribute(PDO::A
20b0: 54 54 52 5f 45 52 52 4d 4f 44 45 2c 20 50 44 4f TTR_ERRMODE, PDO
20c0: 3a 3a 45 52 52 4d 4f 44 45 5f 57 41 52 4e 49 4e ::ERRMODE_WARNIN
20d0: 47 29 3b 0a 20 20 20 20 20 20 20 20 24 64 62 2d G);. $db-
20e0: 3e 71 75 65 72 79 28 22 41 54 54 41 43 48 20 44 >query("ATTACH D
20f0: 41 54 41 42 41 53 45 20 27 24 5f 53 45 52 56 45 ATABASE '$_SERVE
2100: 52 5b 46 4f 53 53 49 4c 5f 52 45 50 4f 53 49 54 R[FOSSIL_REPOSIT
2110: 4f 52 59 5d 27 20 41 53 20 27 72 65 70 6f 27 22 ORY]' AS 'repo'"
2120: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
2130: 28 24 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 ($params) {.
2140: 20 20 20 20 24 73 74 6d 74 20 3d 20 24 64 62 2d $stmt = $db-
2150: 3e 70 72 65 70 61 72 65 28 24 73 71 6c 29 3b 0a >prepare($sql);.
2160: 20 20 20 20 20 20 20 20 24 73 74 6d 74 2d 3e 65 $stmt->e
2170: 78 65 63 75 74 65 28 24 70 61 72 61 6d 73 29 3b xecute($params);
2180: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
2190: 24 73 74 6d 74 2d 3e 66 65 74 63 68 41 6c 6c 28 $stmt->fetchAll(
21a0: 50 44 4f 3a 3a 46 45 54 43 48 5f 41 53 53 4f 43 PDO::FETCH_ASSOC
21b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 );. }. els
21c0: 65 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 e {. retu
21d0: 72 6e 20 24 64 62 2d 3e 71 75 65 72 79 28 24 73 rn $db->query($s
21e0: 71 6c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 23 2d ql);. }.}..#-
21f0: 2d 20 4a 53 4f 4e 2f 66 6f 72 6d 2d 65 6e 63 6f - JSON/form-enco
2200: 64 65 64 20 6f 75 74 70 75 74 0a 66 75 6e 63 74 ded output.funct
2210: 69 6f 6e 20 6a 73 6f 6e 5f 72 65 73 70 6f 6e 73 ion json_respons
2220: 65 28 24 72 2c 20 24 73 74 61 74 75 73 3d 66 61 e($r, $status=fa
2230: 6c 73 65 2c 20 24 61 6c 77 61 79 73 5f 6a 73 6f lse, $always_jso
2240: 6e 3d 54 72 75 65 29 20 7b 0a 20 20 20 20 69 66 n=True) {. if
2250: 20 28 24 73 74 61 74 75 73 29 20 7b 0a 20 20 20 ($status) {.
2260: 20 20 20 20 20 68 65 61 64 65 72 28 22 53 74 61 header("Sta
2270: 74 75 73 3a 20 24 73 74 61 74 75 73 22 29 3b 0a tus: $status");.
2280: 20 20 20 20 20 20 20 20 69 66 20 28 69 73 5f 73 if (is_s
2290: 74 72 69 6e 67 28 24 72 29 29 20 7b 0a 20 20 20 tring($r)) {.
22a0: 20 20 20 20 20 20 20 20 20 24 72 20 3d 20 5b 22 $r = ["
22b0: 65 72 72 6f 72 22 3d 3e 22 69 6e 76 61 6c 69 64 error"=>"invalid
22c0: 5f 72 65 71 75 65 73 74 22 2c 20 22 65 72 72 6f _request", "erro
22d0: 72 5f 64 65 73 63 72 69 70 74 69 6f 6e 22 3d 3e r_description"=>
22e0: 24 72 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 $r];. }.
22f0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 72 65 }. if (pre
2300: 67 5f 6d 61 74 63 68 28 22 7e 5e 28 3f 21 2e 2b g_match("~^(?!.+
2310: 2f 6a 73 6f 6e 29 2e 2b 2f 78 2d 77 77 77 2d 66 /json).+/x-www-f
2320: 6f 72 6d 7e 69 22 2c 20 24 5f 53 45 52 56 45 52 orm~i", $_SERVER
2330: 5b 22 48 54 54 50 5f 41 43 43 45 50 54 22 5d 29 ["HTTP_ACCEPT"])
2340: 29 20 7b 0a 20 20 20 20 20 20 20 20 68 65 61 64 ) {. head
2350: 65 72 28 22 43 6f 6e 74 65 6e 74 2d 54 79 70 65 er("Content-Type
2360: 3a 20 61 70 70 6c 69 63 61 74 69 6f 6e 2f 78 2d : application/x-
2370: 77 77 77 2d 66 6f 72 6d 2d 75 72 6c 65 6e 63 6f www-form-urlenco
2380: 64 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 61 ded");. a
2390: 72 72 61 79 5f 77 61 6c 6b 28 24 72 2c 20 66 75 rray_walk($r, fu
23a0: 6e 63 74 69 6f 6e 28 26 24 76 2c 20 24 6b 29 20 nction(&$v, $k)
23b0: 7b 20 24 76 20 3d 20 22 24 6b 3d 22 20 2e 20 75 { $v = "$k=" . u
23c0: 72 6c 65 6e 63 6f 64 65 28 24 76 29 3b 20 7d 29 rlencode($v); })
23d0: 3b 0a 20 20 20 20 20 20 20 20 64 69 65 28 6a 6f ;. die(jo
23e0: 69 6e 28 22 26 22 2c 20 24 72 29 29 3b 0a 20 20 in("&", $r));.
23f0: 20 20 7d 0a 20 20 20 20 65 6c 73 65 69 66 20 28 }. elseif (
2400: 70 72 65 67 5f 6d 61 74 63 68 28 22 7e 6a 73 6f preg_match("~jso
2410: 6e 2f 7c 5b 2f 2b 5d 6a 73 6f 6e 7e 69 22 2c 20 n/|[/+]json~i",
2420: 24 5f 53 45 52 56 45 52 5b 22 48 54 54 50 5f 41 $_SERVER["HTTP_A
2430: 43 43 45 50 54 22 5d 29 20 7c 7c 20 24 61 6c 77 CCEPT"]) || $alw
2440: 61 79 73 5f 6a 73 6f 6e 29 20 7b 0a 20 20 20 20 ays_json) {.
2450: 20 20 20 20 68 65 61 64 65 72 28 22 43 6f 6e 74 header("Cont
2460: 65 6e 74 2d 54 79 70 65 3a 20 61 70 70 6c 69 63 ent-Type: applic
2470: 61 74 69 6f 6e 2f 6a 73 6f 6e 3b 20 63 68 61 72 ation/json; char
2480: 73 65 74 3d 75 74 66 2d 38 22 29 3b 0a 20 20 20 set=utf-8");.
2490: 20 20 20 20 20 64 69 65 28 6a 73 6f 6e 5f 65 6e die(json_en
24a0: 63 6f 64 65 28 24 72 2c 20 4a 53 4f 4e 5f 50 52 code($r, JSON_PR
24b0: 45 54 54 59 5f 50 52 49 4e 54 7c 4a 53 4f 4e 5f ETTY_PRINT|JSON_
24c0: 55 4e 45 53 43 41 50 45 44 5f 53 4c 41 53 48 45 UNESCAPED_SLASHE
24d0: 53 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 S));. }. e
24e0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 68 65 lse {. he
24f0: 61 64 65 72 28 22 43 6f 6e 74 65 6e 74 2d 54 79 ader("Content-Ty
2500: 70 65 3a 20 74 65 78 74 2f 70 68 70 2d 73 6f 75 pe: text/php-sou
2510: 72 63 65 22 29 3b 0a 20 20 20 20 20 20 20 20 64 rce");. d
2520: 69 65 28 76 61 72 5f 65 78 70 6f 72 74 28 24 72 ie(var_export($r
2530: 2c 20 54 72 75 65 29 29 3b 0a 20 20 20 20 7d 0a , True));. }.
2540: 7d 0a 0a 0a 23 2d 2d 20 6c 6f 61 64 20 61 75 74 }...#-- load aut
2550: 68 6f 72 69 7a 61 74 69 6f 6e 20 70 72 6f 70 65 horization prope
2560: 72 74 69 65 73 20 62 79 20 61 75 74 68 20 63 6f rties by auth co
2570: 64 65 0a 66 75 6e 63 74 69 6f 6e 20 67 65 74 5f de.function get_
2580: 74 6f 6b 65 6e 5f 62 79 5f 63 6f 64 65 28 24 63 token_by_code($c
2590: 6f 64 65 29 20 7b 0a 20 20 20 20 72 65 74 75 72 ode) {. retur
25a0: 6e 20 64 62 28 22 53 45 4c 45 43 54 20 2a 20 46 n db("SELECT * F
25b0: 52 4f 4d 20 66 78 5f 61 75 74 68 20 57 48 45 52 ROM fx_auth WHER
25c0: 45 20 63 6f 64 65 3d 3f 20 41 4e 44 20 60 74 79 E code=? AND `ty
25d0: 70 65 60 3d 3f 20 41 4e 44 20 65 78 70 69 72 65 pe`=? AND expire
25e0: 73 3e 3f 22 2c 20 5b 24 63 6f 64 65 2c 20 27 74 s>?", [$code, 't
25f0: 6f 6b 65 6e 27 2c 20 74 69 6d 65 28 29 5d 29 20 oken', time()])
2600: 3f 3a 20 5b 5b 5d 5d 3b 0a 7d 0a 23 2d 2d 20 67 ?: [[]];.}.#-- g
2610: 65 74 20 63 6f 64 65 20 66 72 6f 6d 20 41 75 74 et code from Aut
2620: 68 6f 72 69 7a 61 74 69 6f 6e 3a 20 68 65 61 64 horization: head
2630: 65 72 20 28 74 65 73 74 20 64 69 66 66 65 72 65 er (test differe
2640: 6e 74 20 76 61 72 69 61 74 69 6f 6e 73 20 74 6f nt variations to
2650: 20 63 69 72 63 75 6d 76 65 6e 74 20 66 6f 73 73 circumvent foss
2660: 69 6c 20 73 68 6f 72 74 65 6e 69 6e 67 20 74 68 il shortening th
2670: 65 20 43 47 49 20 65 6e 76 29 0a 66 75 6e 63 74 e CGI env).funct
2680: 69 6f 6e 20 62 65 61 72 65 72 28 29 20 7b 0a 20 ion bearer() {.
2690: 20 20 20 66 6f 72 65 61 63 68 20 28 5b 22 48 54 foreach (["HT
26a0: 54 50 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e TP_AUTHORIZATION
26b0: 22 2c 20 22 48 54 54 50 5f 41 75 74 68 6f 72 69 ", "HTTP_Authori
26c0: 7a 61 74 69 6f 6e 22 2c 20 22 48 54 54 50 5f 43 zation", "HTTP_C
26d0: 4f 4f 4b 49 45 22 2c 20 22 41 55 54 48 5f 43 4f OOKIE", "AUTH_CO
26e0: 4e 54 45 4e 54 22 2c 20 22 48 54 54 50 5f 41 55 NTENT", "HTTP_AU
26f0: 54 48 4f 52 49 5a 41 54 49 4f 4e 32 22 5d 20 61 THORIZATION2"] a
2700: 73 20 24 68 29 20 7b 0a 20 20 20 20 20 20 20 20 s $h) {.
2710: 69 66 20 28 70 72 65 67 5f 6d 61 74 63 68 28 22 if (preg_match("
2720: 2f 42 65 61 72 65 72 5c 73 2b 28 5c 53 2b 29 2f /Bearer\s+(\S+)/
2730: 69 22 2c 20 24 5f 53 45 52 56 45 52 5b 24 68 5d i", $_SERVER[$h]
2740: 2c 20 24 6d 29 29 20 7b 0a 20 20 20 20 20 20 20 , $m)) {.
2750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 6d 5b return $m[
2760: 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 1];. }.
2770: 20 20 7d 0a 7d 0a 23 2d 2d 20 66 65 74 63 68 20 }.}.#-- fetch
2780: 74 6f 6b 65 6e 20 66 6f 72 20 41 75 74 68 6f 72 token for Author
2790: 69 7a 61 74 69 6f 6e 3a 20 42 65 61 72 65 72 20 ization: Bearer
27a0: 69 64 0a 66 75 6e 63 74 69 6f 6e 20 67 65 74 5f id.function get_
27b0: 74 6f 6b 65 6e 28 24 61 63 63 65 73 73 5f 74 6f token($access_to
27c0: 6b 65 6e 3d 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 ken=NULL) {.
27d0: 23 20 66 69 6e 64 20 41 75 74 68 3a 20 74 6f 6b # find Auth: tok
27e0: 65 6e 0a 20 20 20 20 24 63 6f 64 65 20 3d 20 24 en. $code = $
27f0: 61 63 63 65 73 73 5f 74 6f 6b 65 6e 20 3f 3a 20 access_token ?:
2800: 62 65 61 72 65 72 28 29 3b 0a 20 20 20 20 72 65 bearer();. re
2810: 74 75 72 6e 20 67 65 74 5f 74 6f 6b 65 6e 5f 62 turn get_token_b
2820: 79 5f 63 6f 64 65 28 24 63 6f 64 65 29 5b 30 5d y_code($code)[0]
2830: 3b 0a 7d 0a 0a 23 2d 2d 20 61 6c 69 61 73 20 66 ;.}..#-- alias f
2840: 6f 72 20 67 65 6e 65 72 69 63 20 74 79 70 65 73 or generic types
2850: 20 74 6f 20 66 6f 73 73 69 6c 20 69 74 65 6d 73 to fossil items
2860: 0a 66 75 6e 63 74 69 6f 6e 20 73 63 6f 70 65 5f .function scope_
2870: 6d 61 70 28 24 74 79 70 65 29 20 7b 0a 20 20 20 map($type) {.
2880: 20 67 6c 6f 62 61 6c 20 24 6d 61 70 3b 0a 20 20 global $map;.
2890: 20 20 69 66 20 28 69 73 5f 61 72 72 61 79 28 24 if (is_array($
28a0: 74 79 70 65 29 20 26 26 20 63 6f 75 6e 74 28 24 type) && count($
28b0: 74 79 70 65 29 29 20 7b 20 24 74 79 70 65 20 3d type)) { $type =
28c0: 20 24 74 79 70 65 5b 30 5d 3b 20 7d 0a 20 20 20 $type[0]; }.
28d0: 20 24 74 79 70 65 20 3d 20 70 72 65 67 5f 72 65 $type = preg_re
28e0: 70 6c 61 63 65 28 22 2f 5e 5c 77 2d 2f 22 2c 20 place("/^\w-/",
28f0: 22 22 2c 20 24 74 79 70 65 29 3b 0a 20 20 20 20 "", $type);.
2900: 66 6f 72 65 61 63 68 20 28 24 6d 61 70 20 61 73 foreach ($map as
2910: 20 24 72 6f 77 29 20 7b 0a 20 20 20 20 20 20 20 $row) {.
2920: 20 69 66 20 28 24 72 6f 77 5b 22 74 79 70 65 22 if ($row["type"
2930: 5d 20 3d 3d 20 24 74 79 70 65 29 20 7b 0a 20 20 ] == $type) {.
2940: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
2950: 20 24 72 6f 77 5b 22 2d 6d 61 70 22 5d 3b 0a 20 $row["-map"];.
2960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 }. }.
2970: 20 20 20 72 65 74 75 72 6e 20 24 74 79 70 65 3b return $type;
2980: 0a 7d 0a 23 20 63 68 65 63 6b 20 69 66 20 72 65 .}.# check if re
2990: 71 75 65 73 74 20 61 63 74 69 6f 6e 2b 74 79 70 quest action+typ
29a0: 65 20 65 6e 74 72 79 20 61 6c 6c 20 6d 61 74 63 e entry all matc
29b0: 68 20 74 6f 6b 65 6e 20 73 63 6f 70 65 73 0a 66 h token scopes.f
29c0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 79 5f 73 unction verify_s
29d0: 63 6f 70 65 28 24 74 6f 6b 65 6e 3d 5b 5d 2c 20 cope($token=[],
29e0: 24 72 65 71 5f 73 63 6f 70 65 73 3d 5b 5d 29 20 $req_scopes=[])
29f0: 7b 0a 20 20 20 20 70 72 65 67 5f 6d 61 74 63 68 {. preg_match
2a00: 5f 61 6c 6c 28 22 2f 28 5c 77 2b 29 2f 22 2c 20 _all("/(\w+)/",
2a10: 24 74 6f 6b 65 6e 5b 22 73 63 6f 70 65 22 5d 2c $token["scope"],
2a20: 20 24 61 6c 6c 6f 77 65 64 29 3b 0a 20 20 20 20 $allowed);.
2a30: 24 61 6c 6c 6f 77 65 64 20 3d 20 61 72 72 61 79 $allowed = array
2a40: 5f 6d 61 70 28 22 73 63 6f 70 65 5f 6d 61 70 22 _map("scope_map"
2a50: 2c 20 24 61 6c 6c 6f 77 65 64 5b 31 5d 29 3b 0a , $allowed[1]);.
2a60: 20 20 20 20 24 72 65 71 5f 73 63 6f 70 65 73 20 $req_scopes
2a70: 3d 20 61 72 72 61 79 5f 6d 61 70 28 22 73 63 6f = array_map("sco
2a80: 70 65 5f 6d 61 70 22 2c 20 61 72 72 61 79 5f 66 pe_map", array_f
2a90: 69 6c 74 65 72 28 24 72 65 71 5f 73 63 6f 70 65 ilter($req_scope
2aa0: 73 29 29 3b 0a 23 76 61 72 5f 64 75 6d 70 28 22 s));.#var_dump("
2ab0: 54 4f 4b 45 4e 3d 22 2c 20 24 74 6f 6b 65 6e 2c TOKEN=", $token,
2ac0: 20 22 20 41 4c 4c 4f 57 45 44 3d 22 2c 20 24 61 " ALLOWED=", $a
2ad0: 6c 6c 6f 77 65 64 2c 20 22 20 52 45 51 3d 22 2c llowed, " REQ=",
2ae0: 20 24 72 65 71 5f 73 63 6f 70 65 73 29 3b 0a 20 $req_scopes);.
2af0: 20 20 20 23 20 63 6f 6d 61 70 61 72 65 20 61 67 # comapare ag
2b00: 61 69 6e 73 74 20 24 61 6c 6c 6f 77 65 64 20 74 ainst $allowed t
2b10: 6f 6b 65 6e 20 73 63 6f 70 65 20 6c 69 73 74 0a oken scope list.
2b20: 20 20 20 20 24 6f 6b 20 3d 20 4e 55 4c 4c 3b 0a $ok = NULL;.
2b30: 20 20 20 20 66 6f 72 65 61 63 68 20 28 24 72 65 foreach ($re
2b40: 71 5f 73 63 6f 70 65 73 20 61 73 20 24 74 29 20 q_scopes as $t)
2b50: 7b 0a 20 20 20 20 20 20 20 20 24 6f 6b 20 3d 20 {. $ok =
2b60: 28 24 61 20 21 3d 3d 20 46 61 6c 73 65 29 20 26 ($a !== False) &
2b70: 26 20 69 6e 5f 61 72 72 61 79 28 24 74 2c 20 24 & in_array($t, $
2b80: 61 6c 6c 6f 77 65 64 29 3b 0a 20 20 20 20 7d 0a allowed);. }.
2b90: 20 20 20 20 72 65 74 75 72 6e 20 24 6f 6b 3b 0a return $ok;.
2ba0: 7d 0a 0a 23 2d 2d 20 74 72 61 6e 73 66 6f 72 6d }..#-- transform
2bb0: 20 24 5f 50 4f 53 54 20 74 6f 20 4a 53 4f 4e 20 $_POST to JSON
2bc0: 62 6f 64 79 0a 66 75 6e 63 74 69 6f 6e 20 72 65 body.function re
2bd0: 71 75 65 73 74 28 29 20 7b 0a 20 20 20 20 69 66 quest() {. if
2be0: 20 28 70 72 65 67 5f 6d 61 74 63 68 28 22 7e 5e (preg_match("~^
2bf0: 5c 73 2a 28 5c 77 2b 2f 6a 73 6f 6e 7c 6a 73 6f \s*(\w+/json|jso
2c00: 6e 2f 5c 77 2b 29 28 5c 2b 6a 73 6f 6e 29 3f 5c n/\w+)(\+json)?\
2c10: 73 2a 28 3b 7c 24 29 7e 69 22 2c 20 24 5f 53 45 s*(;|$)~i", $_SE
2c20: 52 56 45 52 5b 22 43 4f 4e 54 45 4e 54 5f 54 59 RVER["CONTENT_TY
2c30: 50 45 22 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 PE"])) {.
2c40: 20 24 6a 73 6f 6e 20 3d 20 6a 73 6f 6e 5f 64 65 $json = json_de
2c50: 63 6f 64 65 28 66 69 6c 65 5f 67 65 74 5f 63 6f code(file_get_co
2c60: 6e 74 65 6e 74 73 28 22 70 68 70 3a 2f 2f 69 6e ntents("php://in
2c70: 70 75 74 22 29 2c 20 54 72 75 65 29 3b 0a 20 20 put"), True);.
2c80: 20 20 7d 0a 20 20 20 20 65 6c 73 65 69 66 20 28 }. elseif (
2c90: 63 6f 75 6e 74 28 24 5f 50 4f 53 54 29 29 20 7b count($_POST)) {
2ca0: 0a 20 20 20 20 20 20 20 20 24 6a 73 6f 6e 20 3d . $json =
2cb0: 20 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 [. "
2cc0: 71 22 20 3d 3e 20 22 24 5f 52 45 51 55 45 53 54 q" => "$_REQUEST
2cd0: 5b 71 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 [q]",.
2ce0: 20 20 22 61 63 74 69 6f 6e 22 20 3d 3e 20 22 24 "action" => "$
2cf0: 5f 50 4f 53 54 5b 61 63 74 69 6f 6e 5d 22 2c 0a _POST[action]",.
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 79 70 "typ
2d10: 65 22 20 3d 3e 20 5b 22 68 2d 24 5f 50 4f 53 54 e" => ["h-$_POST
2d20: 5b 68 5d 22 5d 2c 0a 20 20 20 20 20 20 20 20 20 [h]"],.
2d30: 20 20 20 22 70 72 6f 70 65 72 74 69 65 73 22 20 "properties"
2d40: 3d 3e 20 61 72 72 61 79 5f 6d 61 70 28 66 75 6e => array_map(fun
2d50: 63 74 69 6f 6e 20 28 24 76 29 20 7b 20 72 65 74 ction ($v) { ret
2d60: 75 72 6e 20 5b 24 76 5d 3b 20 7d 2c 20 24 5f 50 urn [$v]; }, $_P
2d70: 4f 53 54 29 2c 0a 20 20 20 20 20 20 20 20 5d 3b OST),. ];
2d80: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
2d90: 6e 20 24 5f 50 4f 53 54 20 3d 20 24 6a 73 6f 6e n $_POST = $json
2da0: 3b 0a 7d 0a 0a 0a 23 2d 2d 20 74 72 61 6e 73 66 ;.}...#-- transf
2db0: 6f 72 6d 20 70 6f 73 74 20 74 6f 20 66 6f 73 73 orm post to foss
2dc0: 69 6c 20 63 6f 6d 6d 61 6e 64 0a 63 6c 61 73 73 il command.class
2dd0: 20 63 72 65 61 74 65 20 7b 0a 0a 20 20 20 20 70 create {.. p
2de0: 75 62 6c 69 63 20 24 74 6f 6b 65 6e 20 3d 20 5b ublic $token = [
2df0: 5d 3b 0a 20 20 20 20 70 75 62 6c 69 63 20 24 75 ];. public $u
2e00: 72 6c 20 3d 20 22 22 3b 0a 20 20 20 20 70 75 62 rl = "";. pub
2e10: 6c 69 63 20 24 74 6d 70 66 6e 20 3d 20 22 22 3b lic $tmpfn = "";
2e20: 0a 0a 20 20 20 20 23 20 64 69 73 70 61 74 63 68 .. # dispatch
2e30: 20 60 74 79 70 65 60 20 6f 6e 74 6f 20 66 75 6e `type` onto fun
2e40: 63 74 69 6f 6e 73 0a 20 20 20 20 66 75 6e 63 74 ctions. funct
2e50: 69 6f 6e 20 5f 5f 63 6f 6e 73 74 72 75 63 74 28 ion __construct(
2e60: 24 70 6f 73 74 2c 20 24 74 6f 6b 65 6e 29 20 7b $post, $token) {
2e70: 0a 20 20 20 20 20 20 20 20 64 62 28 22 44 45 54 . db("DET
2e80: 41 43 48 20 44 41 54 41 42 41 53 45 20 27 72 65 ACH DATABASE 're
2e90: 70 6f 27 3b 22 29 3b 0a 20 20 20 20 20 20 20 20 po';");.
2ea0: 24 74 68 69 73 2d 3e 74 6f 6b 65 6e 20 3d 20 24 $this->token = $
2eb0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 24 token;. $
2ec0: 61 63 74 69 6f 6e 20 3d 20 24 70 6f 73 74 5b 22 action = $post["
2ed0: 61 63 74 69 6f 6e 22 5d 3b 0a 20 20 20 20 20 20 action"];.
2ee0: 20 20 24 74 79 70 65 20 3d 20 73 63 6f 70 65 5f $type = scope_
2ef0: 6d 61 70 28 24 70 6f 73 74 5b 22 74 79 70 65 22 map($post["type"
2f00: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 ]);. if (
2f10: 65 6d 70 74 79 28 24 70 6f 73 74 5b 22 70 72 6f empty($post["pro
2f20: 70 65 72 74 69 65 73 22 5d 5b 22 63 6f 6e 74 65 perties"]["conte
2f30: 6e 74 22 5d 29 29 20 7b 0a 20 20 20 20 20 20 20 nt"])) {.
2f40: 20 20 20 20 20 6a 73 6f 6e 5f 72 65 73 70 6f 6e json_respon
2f50: 73 65 28 5b 22 70 72 6f 70 65 72 74 69 65 73 2e se(["properties.
2f60: 63 6f 6e 74 65 6e 74 5b 5d 20 72 65 71 75 69 72 content[] requir
2f70: 65 64 22 2c 20 24 70 6f 73 74 5d 2c 20 22 34 30 ed", $post], "40
2f80: 30 20 42 61 73 69 63 73 22 29 3b 0a 20 20 20 20 0 Basics");.
2f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c }. el
2fa0: 73 65 69 66 20 28 6d 65 74 68 6f 64 5f 65 78 69 seif (method_exi
2fb0: 73 74 73 28 24 74 68 69 73 2c 20 24 74 79 70 65 sts($this, $type
2fc0: 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 )) {.
2fd0: 20 24 74 68 69 73 2d 3e 66 6f 6c 64 28 24 70 6f $this->fold($po
2fe0: 73 74 5b 22 70 72 6f 70 65 72 74 69 65 73 22 5d st["properties"]
2ff0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 );. $
3000: 73 74 64 6f 75 74 20 3d 20 63 61 6c 6c 5f 75 73 stdout = call_us
3010: 65 72 5f 66 75 6e 63 28 5b 24 74 68 69 73 2c 20 er_func([$this,
3020: 24 74 79 70 65 5d 2c 20 24 70 6f 73 74 5b 22 70 $type], $post["p
3030: 72 6f 70 65 72 74 69 65 73 22 5d 29 3b 0a 20 20 roperties"]);.
3040: 20 20 20 20 20 20 20 20 20 20 2f 2f 69 66 20 28 //if (
3050: 24 74 68 69 73 2d 3e 74 6d 70 66 6e 29 20 7b 20 $this->tmpfn) {
3060: 75 6e 6c 69 6e 6b 28 24 74 68 69 73 2d 3e 74 6d unlink($this->tm
3070: 70 66 6e 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 pfn); }.
3080: 20 20 20 20 69 66 20 28 21 24 74 68 69 73 2d 3e if (!$this->
3090: 75 72 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 url) {.
30a0: 20 20 20 20 20 20 20 24 74 68 69 73 2d 3e 6e 65 $this->ne
30b0: 77 5f 75 72 6c 28 22 22 2c 20 24 73 74 64 6f 75 w_url("", $stdou
30c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 t);.
30d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f }. //
30e0: 64 69 65 28 22 62 61 63 6b 20 69 6e 20 6d 61 69 die("back in mai
30f0: 6e 2c 20 24 74 68 69 73 2d 3e 75 72 6c 22 29 3b n, $this->url");
3100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 . if
3110: 28 24 74 68 69 73 2d 3e 75 72 6c 29 20 7b 0a 20 ($this->url) {.
3120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 $
3130: 74 68 69 73 2d 3e 72 65 64 69 72 65 63 74 32 30 this->redirect20
3140: 31 28 24 74 68 69 73 2d 3e 75 72 6c 29 3b 0a 20 1($this->url);.
3150: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
3160: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 0a else {.
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3180: 6a 73 6f 6e 5f 72 65 73 70 6f 6e 73 65 28 5b 22 json_response(["
3190: 72 65 73 75 6c 74 22 3d 3e 24 73 74 64 6f 75 74 result"=>$stdout
31a0: 5d 2c 20 22 35 30 30 20 4f 68 20 6e 6f 65 73 2c ], "500 Oh noes,
31b0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 something went
31c0: 77 72 6f 6e 67 22 29 3b 0a 20 20 20 20 20 20 20 wrong");.
31d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d }. }
31e0: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 6a 73 . else js
31f0: 6f 6e 5f 72 65 73 70 6f 6e 73 65 28 22 55 6e 6b on_response("Unk
3200: 6e 6f 77 6e 20 68 2d 74 79 70 65 3a 20 60 24 74 nown h-type: `$t
3210: 79 70 65 60 22 2c 20 22 34 30 30 20 4e 6f 22 29 ype`", "400 No")
3220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 75 6e 63 ;. }. func
3230: 74 69 6f 6e 20 66 6f 6c 64 28 26 24 61 72 72 29 tion fold(&$arr)
3240: 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 {. forea
3250: 63 68 20 28 24 61 72 72 20 61 73 20 24 6b 3d 3e ch ($arr as $k=>
3260: 26 24 76 29 20 7b 0a 20 20 20 20 20 20 20 20 20 &$v) {.
3270: 20 20 20 69 66 20 28 69 6e 5f 61 72 72 61 79 28 if (in_array(
3280: 24 6b 2c 20 5b 22 63 61 74 65 67 6f 72 79 22 2c $k, ["category",
3290: 20 22 74 61 67 22 5d 29 29 20 7b 0a 20 20 20 20 "tag"])) {.
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 cont
32b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 inue;.
32c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
32d0: 65 6c 73 65 69 66 20 28 24 6b 20 3d 3d 20 22 63 elseif ($k == "c
32e0: 6f 6e 74 65 6e 74 22 29 20 7b 0a 20 20 20 20 20 ontent") {.
32f0: 20 20 20 20 20 20 20 20 20 20 20 24 76 20 3d 20 $v =
3300: 69 6d 70 6c 6f 64 65 28 22 5c 6e 22 2c 20 24 76 implode("\n", $v
3310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d );. }
3320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 . els
3330: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 e {.
3340: 20 20 20 20 24 76 20 3d 20 69 6d 70 6c 6f 64 65 $v = implode
3350: 28 22 2c 20 22 2c 20 24 76 29 3b 0a 20 20 20 20 (", ", $v);.
3360: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
3370: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 75 }. }. fu
3380: 6e 63 74 69 6f 6e 20 72 65 64 69 72 65 63 74 32 nction redirect2
3390: 30 31 28 24 75 72 6c 29 20 7b 20 23 20 66 6f 73 01($url) { # fos
33a0: 73 69 6c 20 77 6f 72 6b 61 72 6f 75 6e 64 3a 20 sil workaround:
33b0: 75 73 65 20 43 2d 4c 3a 0a 20 20 20 20 20 20 20 use C-L:.
33c0: 20 68 65 61 64 65 72 28 22 53 74 61 74 75 73 3a header("Status:
33d0: 20 32 30 31 20 43 72 65 61 74 65 64 22 29 3b 0a 201 Created");.
33e0: 20 20 20 20 20 20 20 20 68 65 61 64 65 72 28 22 header("
33f0: 4c 6f 63 61 74 69 6f 6e 3a 20 7b 24 74 68 69 73 Location: {$this
3400: 2d 3e 75 72 6c 7d 22 2c 20 54 72 75 65 2c 20 32 ->url}", True, 2
3410: 30 31 29 3b 0a 20 20 20 20 20 20 20 20 68 65 61 01);. hea
3420: 64 65 72 28 22 43 6f 6e 74 65 6e 74 2d 4c 6f 63 der("Content-Loc
3430: 61 74 69 6f 6e 3a 20 7b 24 74 68 69 73 2d 3e 75 ation: {$this->u
3440: 72 6c 7d 22 29 3b 0a 20 20 20 20 20 20 20 20 68 rl}");. h
3450: 65 61 64 65 72 28 22 43 6f 6e 74 65 6e 74 2d 54 eader("Content-T
3460: 79 70 65 3a 20 74 65 78 74 2f 68 74 6d 6c 22 29 ype: text/html")
3470: 3b 0a 20 20 20 20 20 20 20 20 64 69 65 28 22 3c ;. die("<
3480: 68 74 6d 6c 3e 3c 68 65 61 64 3e 3c 6d 65 74 61 html><head><meta
3490: 20 68 74 74 70 2d 65 71 75 69 76 3d 4c 6f 63 61 http-equiv=Loca
34a0: 74 69 6f 6e 20 76 61 6c 75 65 3d 5c 22 24 74 68 tion value=\"$th
34b0: 69 73 2d 3e 75 72 6c 5c 22 3e 3c 2f 68 65 61 64 is->url\"></head
34c0: 3e 3c 2f 68 74 6d 6c 3e 22 29 3b 0a 20 20 20 20 ></html>");.
34d0: 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 74 }. function t
34e0: 6d 70 28 24 63 6f 6e 74 65 6e 74 29 20 7b 20 23 mp($content) { #
34f0: 20 74 65 6d 70 20 66 69 6c 65 73 20 69 6e 73 74 temp files inst
3500: 65 61 64 20 6f 66 20 65 78 65 63 20 65 63 68 6f ead of exec echo
3510: 7c 20 69 6e 70 75 74 20 70 69 70 65 2c 20 6e 6f | input pipe, no
3520: 74 20 75 73 65 64 20 28 73 79 73 74 65 6d 64 73 t used (systemds
3530: 20 50 72 69 76 61 74 65 54 6d 70 3d 20 6d 61 64 PrivateTmp= mad
3540: 65 20 66 69 6c 65 73 20 69 6e 61 63 63 65 73 73 e files inaccess
3550: 69 62 6c 65 20 74 6f 20 66 6f 73 73 69 6c 20 63 ible to fossil c
3560: 6c 69 29 0a 20 20 20 20 20 20 20 20 24 74 68 69 li). $thi
3570: 73 2d 3e 74 6d 70 66 6e 20 3d 20 74 65 6d 70 6e s->tmpfn = tempn
3580: 61 6d 28 22 2f 74 6d 70 2f 22 2c 20 22 6d 70 22 am("/tmp/", "mp"
3590: 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6c 65 5f );. file_
35a0: 70 75 74 5f 63 6f 6e 74 65 6e 74 73 28 24 74 68 put_contents($th
35b0: 69 73 2d 3e 74 6d 70 66 6e 2c 20 24 63 6f 6e 74 is->tmpfn, $cont
35c0: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 ent);. re
35d0: 74 75 72 6e 20 24 74 68 69 73 2d 3e 74 6d 70 66 turn $this->tmpf
35e0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 75 6e n;. }. fun
35f0: 63 74 69 6f 6e 20 65 78 63 65 72 70 74 28 24 73 ction excerpt($s
3600: 29 20 7b 0a 20 20 20 20 20 20 20 20 24 73 20 3d ) {. $s =
3610: 20 74 72 69 6d 28 70 72 65 67 5f 72 65 70 6c 61 trim(preg_repla
3620: 63 65 28 22 2f 5b 5c 57 5d 2b 7c 5c 5c 6e 2e 2b ce("/[\W]+|\\n.+
3630: 2f 73 22 2c 20 22 20 22 2c 20 24 73 29 29 3b 0a /s", " ", $s));.
3640: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 return s
3650: 75 62 73 74 72 28 24 73 2c 20 30 2c 20 39 32 29 ubstr($s, 0, 92)
3660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 75 6e 63 ;. }. func
3670: 74 69 6f 6e 20 6d 61 70 5f 66 6f 72 28 24 6e 61 tion map_for($na
3680: 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 67 6c me) {. gl
3690: 6f 62 61 6c 20 24 6d 61 70 3b 0a 20 20 20 20 20 obal $map;.
36a0: 20 20 20 66 6f 72 65 61 63 68 20 28 24 6d 61 70 foreach ($map
36b0: 20 61 73 20 24 74 79 70 65 29 20 7b 20 69 66 20 as $type) { if
36c0: 28 24 74 79 70 65 5b 22 6e 61 6d 65 22 5d 20 3d ($type["name"] =
36d0: 3d 20 24 6e 61 6d 65 29 20 7b 20 72 65 74 75 72 = $name) { retur
36e0: 6e 20 24 74 79 70 65 3b 20 7d 20 7d 0a 20 20 20 n $type; } }.
36f0: 20 7d 0a 0a 20 20 20 20 23 20 67 72 65 70 20 6e }.. # grep n
3700: 65 77 20 4c 6f 63 61 74 69 6f 6e 3a 20 75 72 6c ew Location: url
3710: 20 66 72 6f 6d 20 66 6f 73 73 69 6c 20 63 6f 6d from fossil com
3720: 6d 61 6e 64 20 6f 75 74 70 75 74 0a 20 20 20 20 mand output.
3730: 66 75 6e 63 74 69 6f 6e 20 6e 65 77 5f 75 72 6c function new_url
3740: 28 24 70 61 74 68 2c 20 24 73 74 64 6f 75 74 3d ($path, $stdout=
3750: 22 22 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 "") {. if
3760: 20 28 70 72 65 67 5f 6d 61 74 63 68 28 22 2f 43 (preg_match("/C
3770: 72 65 61 74 65 64 20 6e 65 77 20 77 69 6b 69 20 reated new wiki
3780: 70 61 67 65 20 28 2e 2b 29 5c 2e 2f 69 22 2c 20 page (.+)\./i",
3790: 24 73 74 64 6f 75 74 2c 20 24 6d 29 29 20 7b 0a $stdout, $m)) {.
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 24 70 61 74 $pat
37b0: 68 20 3d 20 22 2f 77 69 6b 69 2f 22 20 2e 20 75 h = "/wiki/" . u
37c0: 72 6c 65 6e 63 6f 64 65 28 24 6d 5b 31 5d 29 3b rlencode($m[1]);
37d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
37e0: 20 20 20 65 6c 73 65 69 66 20 28 70 72 65 67 5f elseif (preg_
37f0: 6d 61 74 63 68 28 22 2f 43 72 65 61 74 65 64 20 match("/Created
3800: 6e 65 77 20 74 65 63 68 20 6e 6f 74 65 20 28 5c new tech note (\
3810: 64 5b 5c 64 5c 2d 5d 2b 28 5c 73 5b 5c 64 3a 5d d[\d\-]+(\s[\d:]
3820: 2b 5c 64 29 3f 29 2f 69 6d 22 2c 20 24 73 74 64 +\d)?)/im", $std
3830: 6f 75 74 2c 20 24 6d 29 20 23 20 69 6d 6d 65 64 out, $m) # immed
3840: 69 61 74 65 6c 79 20 72 65 73 6f 6c 76 65 20 64 iately resolve d
3850: 61 74 65 20 74 6f 20 75 75 69 64 0a 20 20 20 20 ate to uuid.
3860: 20 20 20 20 20 20 20 61 6e 64 20 20 70 72 65 67 and preg
3870: 5f 6d 61 74 63 68 28 22 2f 28 5c 77 2b 29 20 24 _match("/(\w+) $
3880: 6d 5b 31 5d 2f 22 2c 20 24 74 68 69 73 2d 3e 66 m[1]/", $this->f
3890: 6f 73 73 69 6c 28 5b 22 77 69 6b 69 22 2c 22 6c ossil(["wiki","l
38a0: 69 73 74 22 2c 22 2d 74 22 2c 22 2d 73 22 5d 29 ist","-t","-s"])
38b0: 2c 20 24 6d 29 29 20 7b 0a 20 20 20 20 20 20 20 , $m)) {.
38c0: 20 20 20 20 20 24 70 61 74 68 20 3d 20 22 2f 74 $path = "/t
38d0: 65 63 68 6e 6f 74 65 2f 22 20 2e 20 75 72 6c 65 echnote/" . urle
38e0: 6e 63 6f 64 65 28 24 6d 5b 31 5d 29 3b 0a 20 20 ncode($m[1]);.
38f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
3900: 65 6c 73 65 69 66 20 28 70 72 65 67 5f 6d 61 74 elseif (preg_mat
3910: 63 68 28 22 2f 74 69 63 6b 65 74 20 61 64 64 20 ch("/ticket add
3920: 73 75 63 63 65 65 64 65 64 20 66 6f 72 20 28 5c succeeded for (\
3930: 77 2b 29 2f 69 22 2c 20 24 73 74 64 6f 75 74 2c w+)/i", $stdout,
3940: 20 24 6d 29 29 20 7b 0a 20 20 20 20 20 20 20 20 $m)) {.
3950: 20 20 20 20 24 70 61 74 68 20 3d 20 22 2f 74 69 $path = "/ti
3960: 63 6b 65 74 2f 22 20 2e 20 75 72 6c 65 6e 63 6f cket/" . urlenco
3970: 64 65 28 24 6d 5b 31 5d 29 3b 0a 20 20 20 20 20 de($m[1]);.
3980: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 24 74 68 }. $th
3990: 69 73 2d 3e 75 72 6c 20 3d 20 70 72 65 67 5f 72 is->url = preg_r
39a0: 65 70 6c 61 63 65 28 22 7e 2f 65 78 74 2f 5c 77 eplace("~/ext/\w
39b0: 2b 7e 22 2c 20 22 22 2c 20 22 68 74 74 70 73 3a +~", "", "https:
39c0: 2f 2f 24 5f 53 45 52 56 45 52 5b 53 45 52 56 45 //$_SERVER[SERVE
39d0: 52 5f 4e 41 4d 45 5d 24 5f 53 45 52 56 45 52 5b R_NAME]$_SERVER[
39e0: 50 48 50 5f 53 45 4c 46 5d 24 70 61 74 68 22 29 PHP_SELF]$path")
39f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 68 ;. }.. # h
3a00: 2d 6e 6f 74 65 20 3d 20 74 65 63 68 6e 6f 74 65 -note = technote
3a10: 20 20 20 20 0a 20 20 20 20 66 75 6e 63 74 69 6f . functio
3a20: 6e 20 74 65 63 68 6e 6f 74 65 28 24 70 2c 20 24 n technote($p, $
3a30: 61 63 74 3d 22 63 72 65 61 74 65 22 29 20 7b 0a act="create") {.
3a40: 20 20 20 20 20 20 20 20 23 20 26 74 69 74 6c 65 # &title
3a50: 3d 7c 26 73 75 6d 6d 61 72 79 3d 0a 20 20 20 20 =|&summary=.
3a60: 20 20 20 20 23 20 26 63 6f 6e 74 65 6e 74 3d 0a # &content=.
3a70: 20 20 20 20 20 20 20 20 23 20 26 63 61 74 65 67 # &categ
3a80: 6f 72 79 5b 5d 3d 0a 20 20 20 20 20 20 20 20 24 ory[]=. $
3a90: 61 72 67 73 20 3d 20 5b 0a 20 20 20 20 20 20 20 args = [.
3aa0: 20 20 20 20 20 22 77 69 6b 69 22 2c 20 22 24 61 "wiki", "$a
3ab0: 63 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ct",.
3ac0: 20 24 70 5b 22 74 69 74 6c 65 22 5d 20 3f 3a 20 $p["title"] ?:
3ad0: 24 70 5b 22 73 75 6d 6d 61 72 79 22 5d 20 3f 3a $p["summary"] ?:
3ae0: 20 24 74 68 69 73 2d 3e 65 78 63 65 72 70 74 28 $this->excerpt(
3af0: 24 70 5b 22 63 6f 6e 74 65 6e 74 22 5d 29 2c 0a $p["content"]),.
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 74 "--t
3b10: 65 63 68 6e 6f 74 65 22 2c 20 28 24 74 68 69 73 echnote", ($this
3b20: 2d 3e 69 64 20 3f 3a 20 22 6e 6f 77 22 29 2c 0a ->id ?: "now"),.
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 6d "--m
3b40: 69 6d 65 74 79 70 65 22 2c 20 22 74 65 78 74 2f imetype", "text/
3b50: 78 2d 6d 61 72 6b 64 6f 77 6e 22 0a 20 20 20 20 x-markdown".
3b60: 20 20 20 20 5d 3b 0a 20 20 20 20 20 20 20 20 69 ];. i
3b70: 66 20 28 24 70 5b 22 63 61 74 65 67 6f 72 79 22 f ($p["category"
3b80: 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 ]) {.
3b90: 20 24 61 72 67 73 5b 5d 20 3d 20 22 2d 2d 74 65 $args[] = "--te
3ba0: 63 68 6e 6f 74 65 2d 74 61 67 73 22 3b 0a 20 20 chnote-tags";.
3bb0: 20 20 20 20 20 20 20 20 20 20 24 61 72 67 73 5b $args[
3bc0: 5d 20 3d 20 69 6d 70 6c 6f 64 65 28 22 2c 22 2c ] = implode(",",
3bd0: 20 24 70 5b 22 63 61 74 65 67 6f 72 79 22 5d 29 $p["category"])
3be0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
3bf0: 20 20 20 20 6c 69 73 74 28 24 72 2c 20 24 6e 75 list($r, $nu
3c00: 6c 6c 29 20 3d 20 5b 20 24 74 68 69 73 2d 3e 66 ll) = [ $this->f
3c10: 6f 73 73 69 6c 28 24 61 72 67 73 2c 20 24 70 5b ossil($args, $p[
3c20: 22 63 6f 6e 74 65 6e 74 22 5d 29 2c 20 20 24 74 "content"]), $t
3c30: 68 69 73 2d 3e 61 64 64 5f 61 74 74 61 63 68 6d his->add_attachm
3c40: 65 6e 74 73 28 5b 22 61 74 74 61 63 68 6d 65 6e ents(["attachmen
3c50: 74 22 2c 20 22 61 64 64 22 2c 20 22 25 66 22 2c t", "add", "%f",
3c60: 20 22 2d 74 22 2c 20 22 6e 6f 77 22 5d 29 20 5d "-t", "now"]) ]
3c70: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ;. return
3c80: 20 24 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 $r;. }..
3c90: 23 20 68 2d 65 6e 74 72 79 20 3d 20 77 69 6b 69 # h-entry = wiki
3ca0: 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 77 69 . function wi
3cb0: 6b 69 28 24 70 2c 20 24 61 63 74 3d 22 63 72 65 ki($p, $act="cre
3cc0: 61 74 65 22 29 20 7b 0a 20 20 20 20 20 20 20 20 ate") {.
3cd0: 23 20 26 74 69 74 6c 65 3d 0a 20 20 20 20 20 20 # &title=.
3ce0: 20 20 23 20 26 63 6f 6e 74 65 6e 74 3d 0a 20 20 # &content=.
3cf0: 20 20 20 20 20 20 24 74 69 74 6c 65 20 3d 20 24 $title = $
3d00: 74 68 69 73 2d 3e 69 64 20 3f 3a 20 24 70 5b 22 this->id ?: $p["
3d10: 74 69 74 6c 65 22 5d 20 3f 3a 20 24 74 68 69 73 title"] ?: $this
3d20: 2d 3e 65 78 63 65 72 70 74 28 24 70 5b 22 63 6f ->excerpt($p["co
3d30: 6e 74 65 6e 74 22 5d 29 3b 0a 20 20 20 20 20 20 ntent"]);.
3d40: 20 20 24 61 72 67 73 20 3d 20 5b 22 77 69 6b 69 $args = ["wiki
3d50: 22 2c 20 22 24 61 63 74 22 2c 20 22 2d 2d 6d 69 ", "$act", "--mi
3d60: 6d 65 74 79 70 65 22 2c 20 22 74 65 78 74 2f 78 metype", "text/x
3d70: 2d 6d 61 72 6b 64 6f 77 6e 22 2c 20 24 74 69 74 -markdown", $tit
3d80: 6c 65 5d 3b 0a 20 20 20 20 20 20 20 20 6c 69 73 le];. lis
3d90: 74 28 24 72 2c 20 24 6e 75 6c 6c 29 20 3d 20 5b t($r, $null) = [
3da0: 20 24 74 68 69 73 2d 3e 66 6f 73 73 69 6c 28 24 $this->fossil($
3db0: 61 72 67 73 2c 20 24 70 5b 22 63 6f 6e 74 65 6e args, $p["conten
3dc0: 74 22 5d 29 2c 20 20 24 74 68 69 73 2d 3e 61 64 t"]), $this->ad
3dd0: 64 5f 61 74 74 61 63 68 6d 65 6e 74 73 28 5b 22 d_attachments(["
3de0: 61 74 74 61 63 68 6d 65 6e 74 22 2c 20 22 61 64 attachment", "ad
3df0: 64 22 2c 20 24 74 69 74 6c 65 2c 20 22 25 66 22 d", $title, "%f"
3e00: 5d 29 20 5d 3b 0a 20 20 20 20 20 20 20 20 72 65 ]) ];. re
3e10: 74 75 72 6e 20 24 72 3b 0a 20 20 20 20 7d 0a 0a turn $r;. }..
3e20: 20 20 20 20 23 20 68 2d 69 73 73 75 65 20 3d 20 # h-issue =
3e30: 74 69 63 6b 65 74 0a 20 20 20 20 66 75 6e 63 74 ticket. funct
3e40: 69 6f 6e 20 74 69 63 6b 65 74 28 24 70 2c 20 24 ion ticket($p, $
3e50: 61 72 67 73 3d 5b 22 74 69 63 6b 65 74 22 2c 20 args=["ticket",
3e60: 22 61 64 64 22 5d 29 20 7b 0a 20 20 20 20 20 20 "add"]) {.
3e70: 20 20 66 6f 72 65 61 63 68 20 28 24 74 68 69 73 foreach ($this
3e80: 2d 3e 6d 61 70 5f 66 6f 72 28 22 69 73 73 75 65 ->map_for("issue
3e90: 22 29 5b 22 70 72 6f 70 65 72 74 69 65 73 22 5d ")["properties"]
3ea0: 20 61 73 20 24 64 65 66 29 20 7b 0a 20 20 20 20 as $def) {.
3eb0: 20 20 20 20 20 20 20 20 69 66 20 28 24 70 5b 24 if ($p[$
3ec0: 64 65 66 5b 22 6e 61 6d 65 22 5d 5d 29 20 7b 0a def["name"]]) {.
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3ee0: 24 61 72 67 73 5b 5d 20 3d 20 24 64 65 66 5b 22 $args[] = $def["
3ef0: 2d 6d 61 70 22 5d 20 3f 3a 20 24 64 65 66 5b 22 -map"] ?: $def["
3f00: 6e 61 6d 65 22 5d 3b 0a 20 20 20 20 20 20 20 20 name"];.
3f10: 20 20 20 20 20 20 20 20 24 61 72 67 73 5b 5d 20 $args[]
3f20: 3d 20 69 6d 70 6c 6f 64 65 28 22 2c 20 22 2c 20 = implode(", ",
3f30: 24 70 5b 24 64 65 66 5b 22 6e 61 6d 65 22 5d 5d $p[$def["name"]]
3f40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d );. }
3f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
3f60: 20 20 20 72 65 74 75 72 6e 20 24 74 68 69 73 2d return $this-
3f70: 3e 66 6f 73 73 69 6c 28 24 61 72 67 73 29 3b 0a >fossil($args);.
3f80: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 68 2d 65 }.. # h-e
3f90: 76 65 6e 74 20 3d 20 63 68 61 74 0a 20 20 20 20 vent = chat.
3fa0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 74 28 24 70 function chat($p
3fb0: 2c 20 24 61 63 74 3d 22 73 65 6e 64 22 29 20 7b , $act="send") {
3fc0: 0a 20 20 20 20 20 20 20 20 24 61 72 67 73 20 3d . $args =
3fd0: 20 5b 22 63 68 61 74 22 2c 20 22 73 65 6e 64 22 ["chat", "send"
3fe0: 2c 20 22 2d 6d 22 2c 20 24 70 5b 22 63 6f 6e 74 , "-m", $p["cont
3ff0: 65 6e 74 22 5d 5d 3b 0a 20 20 20 20 20 20 20 20 ent"]];.
4000: 69 66 20 28 63 6f 75 6e 74 28 24 5f 46 49 4c 45 if (count($_FILE
4010: 53 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 S)) {.
4020: 20 20 24 61 72 67 73 20 3d 20 61 72 72 61 79 5f $args = array_
4030: 6d 65 72 67 65 28 24 61 72 67 73 2c 20 5b 22 2d merge($args, ["-
4040: 66 22 2c 20 63 75 72 72 65 6e 74 28 24 5f 46 49 f", current($_FI
4050: 4c 45 53 29 5b 22 74 6d 70 5f 6e 61 6d 65 22 5d LES)["tmp_name"]
4060: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ]);. }.
4070: 20 20 20 20 20 20 24 5f 46 49 4c 45 53 20 3d 20 $_FILES =
4080: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 24 74 68 69 [];. $thi
4090: 73 2d 3e 6e 65 77 5f 75 72 6c 28 22 2f 63 68 61 s->new_url("/cha
40a0: 74 2f 23 22 20 2e 20 6d 64 35 28 72 61 6e 64 28 t/#" . md5(rand(
40b0: 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 )));. ret
40c0: 75 72 6e 20 24 74 68 69 73 2d 3e 66 6f 73 73 69 urn $this->fossi
40d0: 6c 28 24 61 72 67 73 29 3b 0a 20 20 20 20 7d 0a l($args);. }.
40e0: 20 20 20 20 0a 20 20 20 20 23 20 61 6e 79 20 24 . # any $
40f0: 5f 46 49 4c 45 53 0a 20 20 20 20 66 75 6e 63 74 _FILES. funct
4100: 69 6f 6e 20 61 64 64 5f 61 74 74 61 63 68 6d 65 ion add_attachme
4110: 6e 74 73 28 24 61 72 67 73 29 20 7b 0a 20 20 20 nts($args) {.
4120: 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 24 5f foreach ($_
4130: 46 49 4c 45 53 20 61 73 20 24 66 29 20 7b 0a 20 FILES as $f) {.
4140: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 24 if ($
4150: 66 5b 22 73 69 7a 65 22 5d 20 61 6e 64 20 21 24 f["size"] and !$
4160: 66 5b 22 65 72 72 6f 72 22 5d 29 20 7b 0a 20 20 f["error"]) {.
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 24 61 $a
4180: 72 67 73 5b 20 61 72 72 61 79 5f 66 69 6e 64 28 rgs[ array_find(
4190: 22 25 66 22 2c 20 24 61 72 67 73 29 20 5d 20 3d "%f", $args) ] =
41a0: 20 24 66 5b 22 74 6d 70 5f 6e 61 6d 65 22 5d 3b $f["tmp_name"];
41b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
41c0: 20 24 74 68 69 73 2d 3e 66 6f 73 73 69 6c 28 24 $this->fossil($
41d0: 61 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 args);.
41e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 }. }.
41f0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 61 20 62 69 }.. # a bi
4200: 74 20 6d 6f 72 65 20 65 73 63 61 70 69 6e 67 0a t more escaping.
4210: 20 20 20 20 73 74 61 74 69 63 20 66 75 6e 63 74 static funct
4220: 69 6f 6e 20 65 73 63 28 24 73 29 20 7b 0a 20 20 ion esc($s) {.
4230: 20 20 20 20 20 20 69 66 20 28 69 73 5f 61 72 72 if (is_arr
4240: 61 79 28 24 73 29 29 20 7b 20 24 73 20 3d 20 69 ay($s)) { $s = i
4250: 6d 70 6c 6f 64 65 28 22 20 22 2c 20 24 73 29 3b mplode(" ", $s);
4260: 20 7d 20 20 2f 2f 20 6a 6f 69 6e 20 61 6e 79 20 } // join any
4270: 6c 69 73 74 0a 20 20 20 20 20 20 20 20 24 73 20 list. $s
4280: 3d 20 70 72 65 67 5f 72 65 70 6c 61 63 65 28 22 = preg_replace("
4290: 2f 5b 5e 5c 5c 72 5c 5c 6e 5c 5c 74 5c 5c 78 32 /[^\\r\\n\\t\\x2
42a0: 30 2d 5c 5c 78 46 46 5d 2f 22 2c 20 22 22 2c 20 0-\\xFF]/", "",
42b0: 24 73 29 3b 20 2f 2f 20 73 74 72 69 70 20 63 6f $s); // strip co
42c0: 6e 74 72 6f 6c 20 63 68 61 72 61 63 74 65 72 73 ntrol characters
42d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
42e0: 65 73 63 61 70 65 73 68 65 6c 6c 61 72 67 28 24 escapeshellarg($
42f0: 73 29 3b 20 20 2f 2f 20 71 75 6f 74 65 20 66 6f s); // quote fo
4300: 72 20 73 68 65 6c 6c 0a 20 20 20 20 7d 0a 20 20 r shell. }.
4310: 20 20 0a 20 20 20 20 23 20 69 6e 76 6f 6b 65 20 . # invoke
4320: 66 6f 73 73 69 6c 20 62 69 6e 61 72 79 20 77 69 fossil binary wi
4330: 74 68 20 65 73 63 61 70 65 64 20 61 72 67 75 6d th escaped argum
4340: 65 6e 74 73 2c 20 61 6e 64 20 70 6f 73 73 69 62 ents, and possib
4350: 6c 79 20 70 69 70 69 6e 67 20 63 6f 6e 74 65 6e ly piping conten
4360: 74 20 61 73 20 73 74 64 69 6e 0a 20 20 20 20 66 t as stdin. f
4370: 75 6e 63 74 69 6f 6e 20 66 6f 73 73 69 6c 28 24 unction fossil($
4380: 61 72 67 73 2c 20 24 69 6e 70 75 74 3d 22 22 29 args, $input="")
4390: 20 7b 0a 20 20 20 20 20 20 20 20 24 61 72 67 73 {. $args
43a0: 20 3d 20 61 72 72 61 79 5f 6d 65 72 67 65 28 0a = array_merge(.
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 22 66 ["f
43c0: 6f 73 73 69 6c 22 2c 20 22 2d 2d 6e 6f 63 67 69 ossil", "--nocgi
43d0: 22 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 "],.
43e0: 20 61 72 72 61 79 5f 6d 61 70 28 22 63 72 65 61 array_map("crea
43f0: 74 65 3a 3a 65 73 63 22 2c 20 24 61 72 67 73 29 te::esc", $args)
4400: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 5b ,. [
4410: 22 2d 52 22 2c 20 63 72 65 61 74 65 3a 3a 65 73 "-R", create::es
4420: 63 28 24 5f 53 45 52 56 45 52 5b 22 46 4f 53 53 c($_SERVER["FOSS
4430: 49 4c 5f 52 45 50 4f 53 49 54 4f 52 59 22 5d 29 IL_REPOSITORY"])
4440: 5d 2c 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 ],. );.
4450: 20 20 20 20 20 20 24 63 6d 64 20 3d 20 69 6d 70 $cmd = imp
4460: 6c 6f 64 65 28 22 20 22 2c 20 24 61 72 67 73 29 lode(" ", $args)
4470: 20 2e 20 22 20 32 3e 26 31 22 3b 0a 20 20 20 20 . " 2>&1";.
4480: 20 20 20 20 69 66 20 28 24 69 6e 70 75 74 29 20 if ($input)
4490: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 24 {. $
44a0: 63 6d 64 20 3d 20 22 65 63 68 6f 20 22 20 2e 20 cmd = "echo " .
44b0: 63 72 65 61 74 65 3a 3a 65 73 63 28 24 69 6e 70 create::esc($inp
44c0: 75 74 29 20 2e 20 22 20 7c 20 24 63 6d 64 22 3b ut) . " | $cmd";
44d0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 70 72 69 6e . }.#prin
44e0: 74 5f 72 28 24 63 6d 64 29 3b 0a 23 65 78 69 74 t_r($cmd);.#exit
44f0: 28 29 3b 0a 20 20 20 20 20 20 20 20 65 78 65 63 ();. exec
4500: 28 24 63 6d 64 2c 20 24 73 74 64 6f 75 74 2c 20 ($cmd, $stdout,
4510: 24 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 $errno);.
4520: 20 68 65 61 64 65 72 28 22 58 2d 44 65 62 75 67 header("X-Debug
4530: 3a 20 24 65 72 72 6e 6f 3a 20 22 20 2e 20 69 6d : $errno: " . im
4540: 70 6c 6f 64 65 28 22 2f 2f 22 2c 20 24 73 74 64 plode("//", $std
4550: 6f 75 74 29 29 3b 0a 20 20 20 20 20 20 20 20 69 out));. i
4560: 66 20 28 24 65 72 72 6e 6f 29 20 7b 0a 20 20 20 f ($errno) {.
4570: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 5f 72 65 json_re
4580: 73 70 6f 6e 73 65 28 5b 22 65 72 72 6e 6f 22 3d sponse(["errno"=
4590: 3e 24 65 72 72 6e 6f 2c 20 22 73 74 64 6f 75 74 >$errno, "stdout
45a0: 22 3d 3e 24 73 74 64 6f 75 74 5d 2c 20 22 35 30 "=>$stdout], "50
45b0: 30 20 65 72 72 22 29 3b 0a 20 20 20 20 20 20 20 0 err");.
45c0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 }. retur
45d0: 6e 20 69 6d 70 6c 6f 64 65 28 22 5c 6e 22 2c 20 n implode("\n",
45e0: 24 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7d 0a $stdout);. }.
45f0: 7d 0a 0a 23 20 73 61 6d 65 20 63 6f 6d 6d 61 6e }..# same comman
4600: 64 73 2c 20 62 75 74 20 75 73 75 61 6c 6c 79 20 ds, but usually
4610: 60 63 6f 6d 6d 69 74 60 20 69 6e 73 74 65 61 64 `commit` instead
4620: 20 6f 66 20 60 63 72 65 61 74 65 60 0a 63 6c 61 of `create`.cla
4630: 73 73 20 75 70 64 61 74 65 20 65 78 74 65 6e 64 ss update extend
4640: 73 20 63 72 65 61 74 65 20 7b 0a 20 20 20 20 66 s create {. f
4650: 75 6e 63 74 69 6f 6e 20 5f 5f 63 6f 6e 73 74 72 unction __constr
4660: 75 63 74 28 24 70 6f 73 74 2c 20 24 74 6f 6b 65 uct($post, $toke
4670: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 n) {. if
4680: 28 21 24 74 68 69 73 2d 3e 75 72 6c 20 3d 20 24 (!$this->url = $
4690: 70 6f 73 74 5b 22 75 72 6c 22 5d 29 20 7b 0a 20 post["url"]) {.
46a0: 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 5f json_
46b0: 72 65 73 70 6f 6e 73 65 28 22 4e 6f 20 6f 72 69 response("No ori
46c0: 67 69 6e 61 6c 20 75 72 6c 3a 20 67 69 76 65 6e ginal url: given
46d0: 22 2c 20 22 34 30 30 20 50 61 72 61 6d 73 22 29 ", "400 Params")
46e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
46f0: 20 20 20 20 24 74 68 69 73 2d 3e 69 64 20 3d 20 $this->id =
4700: 70 72 65 67 5f 72 65 70 6c 61 63 65 28 22 7e 5e preg_replace("~^
4710: 2e 2b 2f 28 3f 3d 5c 77 2b 29 7c 2f 24 7e 22 2c .+/(?=\w+)|/$~",
4720: 20 22 22 2c 20 24 74 68 69 73 2d 3e 75 72 6c 29 "", $this->url)
4730: 3b 0a 20 20 20 20 20 20 20 20 24 70 6f 73 74 5b ;. $post[
4740: 22 70 72 6f 70 65 72 74 69 65 73 22 5d 20 3d 20 "properties"] =
4750: 24 70 6f 73 74 5b 22 72 65 70 6c 61 63 65 22 5d $post["replace"]
4760: 20 3f 3a 20 24 70 6f 73 74 5b 22 61 64 64 22 5d ?: $post["add"]
4770: 3b 0a 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 ;. parent
4780: 3a 3a 5f 5f 63 6f 6e 73 74 72 75 63 74 28 24 70 ::__construct($p
4790: 6f 73 74 2c 20 24 74 6f 6b 65 6e 29 3b 0a 20 20 ost, $token);.
47a0: 20 20 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e }. function
47b0: 20 74 65 63 68 6e 6f 74 65 28 24 70 2c 20 24 61 technote($p, $a
47c0: 63 74 3d 22 63 6f 6d 6d 69 74 22 29 20 7b 0a 20 ct="commit") {.
47d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 return pa
47e0: 72 65 6e 74 3a 3a 74 65 63 68 6e 6f 74 65 28 24 rent::technote($
47f0: 70 2c 20 24 61 63 74 29 3b 0a 20 20 20 20 7d 0a p, $act);. }.
4800: 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 77 69 6b function wik
4810: 69 28 24 70 2c 20 24 61 63 74 3d 22 63 6f 6d 6d i($p, $act="comm
4820: 69 74 22 29 20 7b 0a 20 20 20 20 20 20 20 20 72 it") {. r
4830: 65 74 75 72 6e 20 70 61 72 65 6e 74 3a 3a 77 69 eturn parent::wi
4840: 6b 69 28 24 70 2c 20 24 61 63 74 29 3b 0a 20 20 ki($p, $act);.
4850: 20 20 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e }. function
4860: 20 74 69 63 6b 65 74 28 24 70 2c 20 24 61 72 67 ticket($p, $arg
4870: 73 3d 5b 22 74 69 63 6b 65 74 22 2c 20 22 73 65 s=["ticket", "se
4880: 74 22 2c 20 22 49 44 22 5d 29 20 7b 0a 20 20 20 t", "ID"]) {.
4890: 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 72 65 return pare
48a0: 6e 74 3a 3a 74 69 63 6b 65 74 28 24 70 2c 20 5b nt::ticket($p, [
48b0: 22 74 69 63 6b 65 74 22 2c 20 22 73 65 74 22 2c "ticket", "set",
48c0: 20 24 74 68 69 73 2d 3e 69 64 5d 29 3b 0a 20 20 $this->id]);.
48d0: 20 20 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e }. function
48e0: 20 63 68 61 74 28 24 70 2c 20 24 61 63 74 3d 22 chat($p, $act="
48f0: 73 65 6e 64 22 29 20 7b 7d 0a 7d 0a 0a 23 20 66 send") {}.}..# f
4900: 65 74 63 68 20 73 6f 75 72 63 65 20 63 6f 64 65 etch source code
4910: 0a 63 6c 61 73 73 20 73 6f 75 72 63 65 20 65 78 .class source ex
4920: 74 65 6e 64 73 20 75 70 64 61 74 65 20 7b 0a 20 tends update {.
4930: 20 20 20 66 75 6e 63 74 69 6f 6e 20 5f 5f 63 6f function __co
4940: 6e 73 74 72 75 63 74 28 24 67 65 74 2c 20 24 74 nstruct($get, $t
4950: 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 oken) {.
4960: 69 66 20 28 21 24 74 68 69 73 2d 3e 75 72 6c 20 if (!$this->url
4970: 3d 20 24 67 65 74 5b 22 75 72 6c 22 5d 29 20 7b = $get["url"]) {
4980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f . jso
4990: 6e 5f 72 65 73 70 6f 6e 73 65 28 22 4e 6f 20 6f n_response("No o
49a0: 72 69 67 69 6e 61 6c 20 75 72 6c 3a 20 67 69 76 riginal url: giv
49b0: 65 6e 22 2c 20 22 34 30 30 20 50 61 72 61 6d 73 en", "400 Params
49c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ");. }.
49d0: 20 20 20 20 20 20 24 74 68 69 73 2d 3e 69 64 20 $this->id
49e0: 3d 20 70 72 65 67 5f 72 65 70 6c 61 63 65 28 22 = preg_replace("
49f0: 7e 5e 2e 2b 2f 28 3f 3d 5c 77 2b 29 7c 2f 24 7e ~^.+/(?=\w+)|/$~
4a00: 22 2c 20 22 22 2c 20 24 74 68 69 73 2d 3e 75 72 ", "", $this->ur
4a10: 6c 29 3b 0a 20 20 20 20 20 20 20 20 24 74 68 69 l);. $thi
4a20: 73 2d 3e 74 6f 6b 65 6e 20 3d 20 24 74 6f 6b 65 s->token = $toke
4a30: 6e 3b 0a 20 20 20 20 20 20 20 20 24 74 79 70 65 n;. $type
4a40: 20 3d 20 73 63 6f 70 65 5f 6d 61 70 28 24 67 65 = scope_map($ge
4a50: 74 5b 22 74 79 70 65 22 5d 29 3b 0a 20 20 20 20 t["type"]);.
4a60: 20 20 20 20 69 66 20 28 6d 65 74 68 6f 64 5f 65 if (method_e
4a70: 78 69 73 74 73 28 24 74 68 69 73 2c 20 24 74 79 xists($this, $ty
4a80: 70 65 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 pe)) {.
4a90: 20 20 20 24 73 74 64 6f 75 74 20 3d 20 63 61 6c $stdout = cal
4aa0: 6c 5f 75 73 65 72 5f 66 75 6e 63 28 5b 24 74 68 l_user_func([$th
4ab0: 69 73 2c 20 24 74 79 70 65 5d 2c 20 5b 5d 29 3b is, $type], []);
4ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f . jso
4ad0: 6e 5f 72 65 73 70 6f 6e 73 65 28 5b 0a 20 20 20 n_response([.
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 79 "ty
4af0: 70 65 22 20 3d 3e 20 5b 24 67 65 74 5b 22 74 79 pe" => [$get["ty
4b00: 70 65 22 5d 5d 2c 0a 20 20 20 20 20 20 20 20 20 pe"]],.
4b10: 20 20 20 20 20 20 20 22 70 72 6f 70 65 72 74 69 "properti
4b20: 65 73 22 20 3d 3e 20 28 69 73 5f 61 72 72 61 79 es" => (is_array
4b30: 28 24 73 74 64 6f 75 74 29 20 3f 20 24 73 74 64 ($stdout) ? $std
4b40: 6f 75 74 20 3a 20 5b 0a 20 20 20 20 20 20 20 20 out : [.
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e "con
4b60: 74 65 6e 74 22 3d 3e 20 5b 24 73 74 64 6f 75 74 tent"=> [$stdout
4b70: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ],.
4b80: 20 20 20 5d 29 0a 20 20 20 20 20 20 20 20 20 20 ]).
4b90: 20 20 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a ]);. }.
4ba0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 5f 72 65 73 json_res
4bb0: 70 6f 6e 73 65 28 22 55 6e 6b 6e 6f 77 6e 20 68 ponse("Unknown h
4bc0: 2d 74 79 70 65 3a 20 60 24 74 79 70 65 60 22 2c -type: `$type`",
4bd0: 20 22 34 30 30 20 4e 6f 22 29 3b 0a 20 20 20 20 "400 No");.
4be0: 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 74 }. function t
4bf0: 65 63 68 6e 6f 74 65 28 24 70 2c 20 24 61 63 74 echnote($p, $act
4c00: 3d 22 65 78 70 6f 72 74 22 29 20 7b 0a 20 20 20 ="export") {.
4c10: 20 20 20 20 20 64 69 65 28 24 74 68 69 73 2d 3e die($this->
4c20: 66 6f 73 73 69 6c 28 5b 22 77 69 6b 69 22 2c 20 fossil(["wiki",
4c30: 22 65 78 70 6f 72 74 22 2c 20 22 2d 74 22 2c 20 "export", "-t",
4c40: 24 74 68 69 73 2d 3e 69 64 5d 29 29 3b 0a 20 20 $this->id]));.
4c50: 20 20 7d 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e }. function
4c60: 20 77 69 6b 69 28 24 70 2c 20 24 61 63 74 3d 22 wiki($p, $act="
4c70: 65 78 70 6f 72 74 22 29 20 7b 0a 20 20 20 20 20 export") {.
4c80: 20 20 20 64 69 65 28 24 74 68 69 73 2d 3e 66 6f die($this->fo
4c90: 73 73 69 6c 28 5b 22 77 69 6b 69 22 2c 20 22 65 ssil(["wiki", "e
4ca0: 78 70 6f 72 74 22 2c 20 24 74 68 69 73 2d 3e 69 xport", $this->i
4cb0: 64 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 d]));. }.
4cc0: 66 75 6e 63 74 69 6f 6e 20 74 69 63 6b 65 74 28 function ticket(
4cd0: 24 70 2c 20 24 61 63 74 3d 22 68 69 73 74 6f 72 $p, $act="histor
4ce0: 79 22 29 20 7b 0a 20 20 20 20 20 20 20 20 64 69 y") {. di
4cf0: 65 28 24 74 68 69 73 2d 3e 66 6f 73 73 69 6c 28 e($this->fossil(
4d00: 5b 22 74 69 63 6b 65 74 22 2c 20 22 68 69 73 74 ["ticket", "hist
4d10: 6f 72 79 22 2c 20 24 74 68 69 73 2d 3e 69 64 5d ory", $this->id]
4d20: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 75 ));. }. fu
4d30: 6e 63 74 69 6f 6e 20 63 68 61 74 28 24 70 2c 20 nction chat($p,
4d40: 24 61 63 74 3d 22 73 65 6e 64 22 29 20 7b 7d 0a $act="send") {}.
4d50: 7d 0a 0a 23 20 3f 71 3d 61 63 74 69 6f 6e 73 0a }..# ?q=actions.
4d60: 63 6c 61 73 73 20 71 75 65 72 79 20 7b 0a 20 20 class query {.
4d70: 20 20 73 74 61 74 69 63 20 24 70 75 62 6c 69 63 static $public
4d80: 20 3d 20 5b 22 63 6f 6e 66 69 67 22 2c 20 22 70 = ["config", "p
4d90: 72 6f 70 65 72 74 69 65 73 22 5d 3b 0a 20 20 20 roperties"];.
4da0: 20 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 5f . function _
4db0: 5f 63 6f 6e 73 74 72 75 63 74 28 24 74 6f 6b 65 _construct($toke
4dc0: 6e 3d 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 n=null) {.
4dd0: 20 20 6a 73 6f 6e 5f 72 65 73 70 6f 6e 73 65 28 json_response(
4de0: 63 61 6c 6c 5f 75 73 65 72 5f 66 75 6e 63 28 5b call_user_func([
4df0: 24 74 68 69 73 2c 20 22 24 5f 47 45 54 5b 71 5d $this, "$_GET[q]
4e00: 22 5d 2c 20 24 74 6f 6b 65 6e 29 29 3b 0a 20 20 "], $token));.
4e10: 20 20 7d 0a 0a 20 20 20 20 66 75 6e 63 74 69 6f }.. functio
4e20: 6e 20 63 6f 6e 66 69 67 28 29 20 7b 0a 20 20 20 n config() {.
4e30: 20 20 20 20 20 67 6c 6f 62 61 6c 20 24 6d 61 70 global $map
4e40: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 ;. foreac
4e50: 68 20 28 24 6d 61 70 20 61 73 20 26 24 74 79 70 h ($map as &$typ
4e60: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 e) {.
4e70: 20 24 74 79 70 65 5b 22 72 65 71 75 69 72 65 64 $type["required
4e80: 2d 70 72 6f 70 65 72 74 69 65 73 22 5d 20 3d 20 -properties"] =
4e90: 5b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 [];.
4ea0: 24 74 79 70 65 5b 22 61 63 63 65 70 74 73 2d 6d $type["accepts-m
4eb0: 65 64 69 61 22 5d 20 3d 20 46 61 6c 73 65 3b 0a edia"] = False;.
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 fore
4ed0: 61 63 68 20 28 24 74 79 70 65 5b 22 70 72 6f 70 ach ($type["prop
4ee0: 65 72 74 69 65 73 22 5d 20 61 73 20 24 70 72 6f erties"] as $pro
4ef0: 70 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 p) {.
4f00: 20 20 20 20 20 20 69 66 20 28 24 70 72 6f 70 5b if ($prop[
4f10: 22 72 65 71 75 69 72 65 64 22 5d 29 20 7b 20 24 "required"]) { $
4f20: 74 79 70 65 5b 22 72 65 71 75 69 72 65 64 2d 70 type["required-p
4f30: 72 6f 70 65 72 74 69 65 73 22 5d 5b 5d 20 3d 20 roperties"][] =
4f40: 24 70 72 6f 70 5b 22 6e 61 6d 65 22 5d 3b 20 7d $prop["name"]; }
4f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
4f60: 20 20 24 74 79 70 65 5b 22 61 63 63 65 70 74 73 $type["accepts
4f70: 2d 6d 65 64 69 61 22 5d 20 7c 3d 20 24 70 72 6f -media"] |= $pro
4f80: 70 5b 22 74 79 70 65 22 5d 20 3d 3d 20 22 66 69 p["type"] == "fi
4f90: 6c 65 22 3b 0a 20 20 20 20 20 20 20 20 20 20 20 le";.
4fa0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
4fb0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 0a 20 20 return [.
4fc0: 20 20 20 20 20 20 20 20 20 20 22 6d 65 64 69 61 "media
4fd0: 2d 65 6e 64 70 6f 69 6e 74 22 20 3d 3e 20 22 68 -endpoint" => "h
4fe0: 74 74 70 73 3a 2f 2f 24 5f 53 45 52 56 45 52 5b ttps://$_SERVER[
4ff0: 53 45 52 56 45 52 5f 4e 41 4d 45 5d 24 5f 53 45 SERVER_NAME]$_SE
5000: 52 56 45 52 5b 50 48 50 5f 53 45 4c 46 5d 22 2c RVER[PHP_SELF]",
5010: 20 20 23 20 73 61 6d 65 0a 20 20 20 20 20 20 20 # same.
5020: 20 20 20 20 20 22 73 79 6e 64 69 63 61 74 65 2d "syndicate-
5030: 74 6f 22 20 3d 3e 20 5b 5d 2c 0a 20 20 20 20 20 to" => [],.
5040: 20 20 20 20 20 20 20 22 71 22 20 3d 3e 20 70 72 "q" => pr
5050: 65 67 5f 67 72 65 70 28 22 2f 5e 5b 61 2d 7a 5d eg_grep("/^[a-z]
5060: 2f 22 2c 20 67 65 74 5f 63 6c 61 73 73 5f 6d 65 /", get_class_me
5070: 74 68 6f 64 73 28 22 71 75 65 72 79 22 29 29 2c thods("query")),
5080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 65 78 . "ex
5090: 74 65 6e 73 69 6f 6e 73 22 20 3d 3e 20 5b 0a 20 tensions" => [.
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
50b0: 75 6e 70 72 65 66 69 78 65 64 2d 74 79 70 65 22 unprefixed-type"
50c0: 2c 20 22 62 75 67 2d 6c 6f 63 61 6c 2d 61 75 74 , "bug-local-aut
50d0: 68 2d 74 6f 6b 65 6e 2d 6f 6e 6c 79 22 2c 0a 20 h-token-only",.
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 #
50f0: 22 62 75 67 2d 6d 65 2d 61 75 74 68 2d 66 69 65 "bug-me-auth-fie
5100: 6c 64 22 2c 20 22 62 75 67 2d 64 65 74 61 63 68 ld", "bug-detach
5110: 65 64 2d 61 75 74 68 2d 74 6f 6b 65 6e 2d 6d 69 ed-auth-token-mi
5120: 63 72 6f 70 75 62 22 2c 0a 20 20 20 20 20 20 20 cropub",.
5130: 20 20 20 20 20 20 20 20 20 22 68 74 74 70 2d 6c "http-l
5140: 69 6e 6b 2d 72 65 6c 2d 6d 69 63 72 6f 70 75 62 ink-rel-micropub
5150: 22 2c 20 22 68 74 74 70 2d 63 6f 6e 74 65 6e 74 ", "http-content
5160: 2d 6c 6f 63 61 74 69 6f 6e 22 2c 20 22 68 74 74 -location", "htt
5170: 70 2d 6d 69 6d 65 2d 6d 61 6a 6f 72 2d 6a 73 6f p-mime-major-jso
5180: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 n",.
5190: 20 20 20 20 22 70 6f 73 74 2d 74 79 70 65 73 22 "post-types"
51a0: 2c 20 22 70 6f 73 74 2d 74 79 70 65 73 2d 68 22 , "post-types-h"
51b0: 2c 20 22 70 6f 73 74 2d 74 79 70 65 73 2d 70 72 , "post-types-pr
51c0: 6f 70 65 72 74 69 65 73 2d 64 69 63 74 2d 69 6e operties-dict-in
51d0: 70 75 74 22 2c 20 23 22 70 6f 73 74 2d 74 79 70 put", #"post-typ
51e0: 65 73 2d 70 72 6f 70 65 72 74 69 65 73 2d 6c 69 es-properties-li
51f0: 73 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 st",.
5200: 20 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ],.
5210: 22 70 6f 73 74 2d 74 79 70 65 73 22 20 3d 3e 20 "post-types" =>
5220: 24 6d 61 70 2c 0a 20 20 20 20 20 20 20 20 5d 3b $map,. ];
5230: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 75 6e 63 . }.. func
5240: 74 69 6f 6e 20 70 72 6f 70 65 72 74 69 65 73 28 tion properties(
5250: 24 74 6f 6b 65 6e 29 20 7b 0a 20 20 20 20 20 20 $token) {.
5260: 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 5f 75 return array_u
5270: 6e 69 71 75 65 28 61 72 72 61 79 5f 6d 65 72 67 nique(array_merg
5280: 65 28 61 72 72 61 79 5f 6d 61 70 28 0a 20 20 20 e(array_map(.
5290: 20 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f functio
52a0: 6e 28 24 74 29 20 7b 20 72 65 74 75 72 6e 20 24 n($t) { return $
52b0: 74 5b 22 70 72 6f 70 65 72 74 69 65 73 22 5d 3b t["properties"];
52c0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 },.
52d0: 24 74 68 69 73 2d 3e 63 6f 6e 66 69 67 28 29 5b $this->config()[
52e0: 22 70 6f 73 74 2d 74 79 70 65 73 22 5d 0a 20 20 "post-types"].
52f0: 20 20 20 20 20 20 29 29 29 3b 0a 20 20 20 20 7d )));. }
5300: 0a 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 73 .. function s
5310: 6f 75 72 63 65 28 24 74 6f 6b 65 6e 29 20 7b 0a ource($token) {.
5320: 20 20 20 20 20 20 20 20 6e 65 77 20 73 6f 75 72 new sour
5330: 63 65 28 24 5f 47 45 54 2c 20 24 74 6f 6b 65 6e ce($_GET, $token
5340: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 23 2d 2d );. }.}...#--
5350: 20 72 75 6e 0a 69 66 20 28 21 72 65 71 75 65 73 run.if (!reques
5360: 74 28 29 20 61 6e 64 20 21 24 5f 52 45 51 55 45 t() and !$_REQUE
5370: 53 54 29 20 7b 0a 20 20 20 20 70 72 69 6e 74 3c ST) {. print<
5380: 3c 3c 48 54 4d 4c 0a 20 20 20 20 3c 64 69 76 20 <<HTML. <div
5390: 63 6c 61 73 73 3d 27 66 6f 73 73 69 6c 2d 64 6f class='fossil-do
53a0: 63 27 20 64 61 74 61 2d 74 69 74 6c 65 3d 27 4d c' data-title='M
53b0: 69 63 72 6f 50 75 62 20 41 50 49 27 3e 0a 20 20 icroPub API'>.
53c0: 20 20 20 20 20 3c 73 76 67 20 73 74 79 6c 65 3d <svg style=
53d0: 22 66 6c 6f 61 74 3a 6c 65 66 74 3b 20 6d 61 72 "float:left; mar
53e0: 67 69 6e 2d 72 69 67 68 74 3a 33 30 70 74 22 20 gin-right:30pt"
53f0: 77 69 64 74 68 3d 22 31 35 36 22 20 68 65 69 67 width="156" heig
5400: 68 74 3d 22 31 32 36 22 20 76 65 72 73 69 6f 6e ht="126" version
5410: 3d 22 31 2e 31 22 20 76 69 65 77 42 6f 78 3d 22 ="1.1" viewBox="
5420: 30 20 30 20 31 35 36 2e 35 31 20 31 32 36 2e 37 0 0 156.51 126.7
5430: 37 22 20 78 6d 6c 6e 73 3d 22 68 74 74 70 3a 2f 7" xmlns="http:/
5440: 2f 77 77 77 2e 77 33 2e 6f 72 67 2f 32 30 30 30 /www.w3.org/2000
5450: 2f 73 76 67 22 3e 0a 20 20 20 20 20 20 20 20 3c /svg">. <
5460: 67 20 74 72 61 6e 73 66 6f 72 6d 3d 22 74 72 61 g transform="tra
5470: 6e 73 6c 61 74 65 28 2d 32 39 2e 37 34 39 20 2d nslate(-29.749 -
5480: 37 32 2e 33 37 37 29 22 20 66 69 6c 6c 3d 22 23 72.377)" fill="#
5490: 35 63 33 35 36 36 22 3e 0a 20 20 20 20 20 20 20 5c3566">.
54a0: 20 20 3c 70 61 74 68 20 64 3d 22 6d 31 30 33 2e <path d="m103.
54b0: 32 39 20 37 33 2e 31 30 33 63 33 2e 39 30 35 36 29 73.103c3.9056
54c0: 2d 30 2e 30 31 38 30 37 20 37 2e 38 31 31 33 2d -0.01807 7.8113-
54d0: 30 2e 30 33 36 31 35 20 31 31 2e 37 31 37 2d 30 0.03615 11.717-0
54e0: 2e 30 35 34 32 32 20 32 2e 35 32 36 20 31 2e 35 .05422 2.526 1.5
54f0: 30 30 31 20 31 2e 35 34 38 36 20 34 2e 38 34 35 001 1.5486 4.845
5500: 34 20 32 2e 30 35 36 39 20 37 2e 33 31 34 36 20 4 2.0569 7.3146
5510: 33 2e 31 34 32 39 20 33 39 2e 30 33 32 20 36 2e 3.1429 39.032 6.
5520: 32 38 35 39 20 37 38 2e 30 36 34 20 39 2e 34 32 2859 78.064 9.42
5530: 38 38 20 31 31 37 2e 31 2d 30 2e 34 39 38 32 35 88 117.1-0.49825
5540: 20 32 2e 35 35 38 39 2d 33 2e 34 37 32 35 20 31 2.5589-3.4725 1
5550: 2e 33 37 37 35 2d 35 2e 33 30 30 31 20 31 2e 36 .3775-5.3001 1.6
5560: 34 30 33 2d 39 2e 33 38 37 32 2d 30 2e 30 31 31 403-9.3872-0.011
5570: 32 2d 31 38 2e 37 37 34 2d 30 2e 30 32 32 34 2d 2-18.774-0.0224-
5580: 32 38 2e 31 36 32 2d 30 2e 30 33 33 36 2d 32 2e 28.162-0.0336-2.
5590: 33 38 38 37 2d 30 2e 36 33 37 30 37 2d 30 2e 39 3887-0.63707-0.9
55a0: 31 33 35 31 2d 33 2e 34 38 30 37 2d 31 2e 30 37 1351-3.4807-1.07
55b0: 31 34 2d 35 2e 32 33 33 36 20 33 2e 32 37 35 37 14-5.2336 3.2757
55c0: 2d 33 39 2e 38 36 34 20 36 2e 35 35 31 34 2d 37 -39.864 6.5514-7
55d0: 39 2e 37 32 39 20 39 2e 38 32 37 31 2d 31 31 39 9.729 9.8271-119
55e0: 2e 35 39 20 30 2e 34 32 30 35 32 2d 30 2e 34 34 .59 0.42052-0.44
55f0: 39 35 31 20 30 2e 38 34 32 34 34 2d 31 2e 30 33 951 0.84244-1.03
5600: 33 37 20 31 2e 35 30 33 34 2d 31 2e 31 33 35 36 37 1.5034-1.1356
5610: 7a 22 2f 3e 0a 20 20 20 20 20 20 20 20 20 3c 70 z"/>. <p
5620: 61 74 68 20 64 3d 22 6d 31 32 30 2e 33 38 20 37 ath d="m120.38 7
5630: 33 2e 31 32 37 63 35 2e 31 39 33 36 20 31 2e 31 3.127c5.1936 1.1
5640: 30 35 32 20 31 32 2e 39 31 31 2d 32 2e 34 31 31 052 12.911-2.411
5650: 39 20 31 36 2e 30 33 35 20 32 2e 38 39 38 20 31 9 16.035 2.898 1
5660: 36 2e 35 33 39 20 34 30 2e 32 35 32 20 33 33 2e 6.539 40.252 33.
5670: 32 34 20 38 30 2e 34 35 33 20 34 39 2e 38 34 31 24 80.453 49.841
5680: 20 31 32 30 2e 36 39 2d 32 2e 35 38 37 36 20 33 120.69-2.5876 3
5690: 2e 37 33 33 37 2d 38 2e 39 32 39 33 20 30 2e 38 .7337-8.9293 0.8
56a0: 32 34 38 32 2d 31 33 2e 30 38 31 20 31 2e 36 38 2482-13.081 1.68
56b0: 37 31 2d 31 31 2e 39 38 39 2d 30 2e 30 34 38 34 71-11.989-0.0484
56c0: 2d 32 33 2e 39 38 32 20 30 2e 30 39 34 33 2d 33 -23.982 0.0943-3
56d0: 35 2e 39 36 37 2d 30 2e 33 30 36 33 39 2d 32 2e 5.967-0.30639-2.
56e0: 38 30 32 32 2d 34 2e 30 32 34 36 2d 31 2e 37 31 8022-4.0246-1.71
56f0: 31 2d 31 30 2e 34 34 2d 33 2e 30 34 37 37 2d 31 1-10.44-3.0477-1
5700: 35 2e 33 37 39 2d 34 2e 38 33 33 34 2d 33 36 2e 5.379-4.8334-36.
5710: 30 34 32 2d 39 2e 39 30 34 35 2d 37 32 2e 30 37 042-9.9045-72.07
5720: 31 2d 31 34 2e 35 38 39 2d 31 30 38 2e 31 32 20 1-14.589-108.12
5730: 30 2e 30 33 32 36 2d 30 2e 35 35 33 32 32 20 30 0.0326-0.55322 0
5740: 2e 31 37 30 30 37 2d 31 2e 32 38 35 37 20 30 2e .17007-1.2857 0.
5750: 38 30 38 33 31 2d 31 2e 34 36 34 37 7a 22 2f 3e 80831-1.4647z"/>
5760: 0a 20 20 20 20 20 20 20 20 20 3c 70 61 74 68 20 . <path
5770: 64 3d 22 6d 39 30 2e 34 38 34 20 37 32 2e 34 38 d="m90.484 72.48
5780: 32 63 32 2e 33 33 37 32 20 30 2e 31 33 36 37 32 2c2.3372 0.13672
5790: 20 34 2e 37 33 32 2d 30 2e 30 38 34 37 39 20 37 4.732-0.08479 7
57a0: 2e 30 33 31 37 20 30 2e 32 38 35 31 32 20 31 2e .0317 0.28512 1.
57b0: 37 30 39 20 31 2e 34 37 30 35 20 30 2e 31 38 35 709 1.4705 0.185
57c0: 30 33 20 33 2e 39 36 35 34 20 30 2e 32 36 36 37 03 3.9654 0.2667
57d0: 39 20 35 2e 39 31 32 32 2d 35 2e 31 37 30 39 20 9 5.9122-5.1709
57e0: 33 39 2e 35 38 31 2d 31 30 2e 33 34 32 20 37 39 39.581-10.342 79
57f0: 2e 31 36 33 2d 31 35 2e 35 31 33 20 31 31 38 2e .163-15.513 118.
5800: 37 34 2d 30 2e 35 32 34 35 36 20 32 2e 32 38 37 74-0.52456 2.287
5810: 39 2d 33 2e 36 38 35 31 20 30 2e 37 34 39 36 35 9-3.6851 0.74965
5820: 2d 35 2e 34 34 31 38 20 31 2e 31 35 35 31 2d 31 -5.4418 1.1551-1
5830: 35 2e 35 32 35 2d 30 2e 32 30 32 37 2d 33 31 2e 5.525-0.2027-31.
5840: 30 35 2d 30 2e 34 30 35 34 31 2d 34 36 2e 35 37 05-0.40541-46.57
5850: 35 2d 30 2e 36 30 38 31 32 2d 31 2e 35 32 31 34 5-0.60812-1.5214
5860: 2d 31 2e 31 31 37 32 20 30 2e 38 36 32 36 37 2d -1.1172 0.86267-
5870: 33 2e 34 37 33 36 20 31 2e 31 32 34 34 2d 35 2e 3.4736 1.1244-5.
5880: 30 37 34 35 20 31 36 2e 37 35 38 2d 33 39 2e 36 0745 16.758-39.6
5890: 38 31 20 33 33 2e 35 31 36 2d 37 39 2e 33 36 33 81 33.516-79.363
58a0: 20 35 30 2e 32 37 35 2d 31 31 39 2e 30 34 20 31 50.275-119.04 1
58b0: 2e 32 34 38 32 2d 32 2e 35 36 39 35 20 36 2e 33 .2482-2.5695 6.3
58c0: 37 39 35 2d 30 2e 38 39 37 38 36 20 38 2e 38 33 795-0.89786 8.83
58d0: 31 37 2d 31 2e 33 36 39 38 7a 22 2f 3e 0a 20 20 17-1.3698z"/>.
58e0: 20 20 20 20 20 20 3c 2f 67 3e 0a 20 20 20 20 20 </g>.
58f0: 20 20 3c 2f 73 76 67 3e 0a 20 20 20 20 20 20 20 </svg>.
5900: 3c 68 33 3e 4d 69 63 72 6f 50 75 62 20 65 6e 64 <h3>MicroPub end
5910: 70 6f 69 6e 74 3c 2f 68 33 3e 0a 20 20 20 20 20 point</h3>.
5920: 20 20 49 6e 74 65 72 66 61 63 65 20 66 6f 72 20 Interface for
5930: 6d 69 63 72 6f 70 75 62 20 63 6c 69 65 6e 74 73 micropub clients
5940: 20 74 6f 20 70 6f 73 74 20 62 6c 6f 67 2f 74 65 to post blog/te
5950: 63 68 6e 6f 74 65 73 20 28 6e 6f 74 65 29 2c 20 chnotes (note),
5960: 77 69 6b 69 20 70 61 67 65 73 20 28 65 6e 74 72 wiki pages (entr
5970: 79 29 2c 20 74 69 63 6b 65 74 73 20 28 69 73 73 y), tickets (iss
5980: 75 65 29 2c 20 6f 72 20 63 68 61 74 20 6d 65 73 ue), or chat mes
5990: 73 61 67 65 73 20 28 65 76 65 6e 74 29 2e 0a 20 sages (event)..
59a0: 20 20 20 20 20 20 3c 70 3e 0a 20 20 20 20 20 20 <p>.
59b0: 20 53 68 6f 75 6c 64 20 62 65 20 72 65 67 69 73 Should be regis
59c0: 74 65 72 65 64 20 69 6e 20 74 68 65 20 72 65 70 tered in the rep
59d0: 6f 20 74 65 6d 70 6c 61 74 65 20 6f 72 20 61 20 o template or a
59e0: 75 73 65 72 20 68 6f 6d 65 70 61 67 65 20 77 69 user homepage wi
59f0: 74 68 3a 3c 62 72 3e 0a 20 20 20 20 20 20 20 3c th:<br>. <
5a00: 63 6f 64 65 3e 26 6c 74 3b 6c 69 6e 6b 20 72 65 code><link re
5a10: 6c 3d 6d 69 63 72 6f 70 75 62 20 68 72 65 66 3d l=micropub href=
5a20: 27 68 74 74 70 73 3a 2f 2f 24 5f 53 45 52 56 45 'https://$_SERVE
5a30: 52 5b 53 45 52 56 45 52 5f 4e 41 4d 45 5d 24 5f R[SERVER_NAME]$_
5a40: 53 45 52 56 45 52 5b 50 48 50 5f 53 45 4c 46 5d SERVER[PHP_SELF]
5a50: 27 26 67 74 3b 3c 2f 63 6f 64 65 3e 0a 20 20 20 '></code>.
5a60: 20 3c 2f 64 69 76 3e 0a 48 54 4d 4c 3b 0a 20 20 </div>.HTML;.
5a70: 20 20 64 69 65 28 0a 20 20 20 20 20 20 23 20 72 die(. # r
5a80: 65 61 6c 70 61 74 68 28 74 65 6d 70 6e 61 6d 28 ealpath(tempnam(
5a90: 22 2f 74 6d 70 2f 22 2c 20 22 66 6f 73 73 69 6c "/tmp/", "fossil
5aa0: 2d 6d 69 63 72 6f 70 75 62 2d 70 68 70 2d 22 29 -micropub-php-")
5ab0: 29 20 23 20 73 79 73 74 65 6d 64 20 50 72 69 76 ) # systemd Priv
5ac0: 61 74 65 54 6d 70 0a 20 20 20 20 29 3b 0a 7d 0a ateTmp. );.}.
5ad0: 65 6c 73 65 69 66 20 28 21 65 6d 70 74 79 28 24 elseif (!empty($
5ae0: 5f 52 45 51 55 45 53 54 5b 22 71 22 5d 29 20 61 _REQUEST["q"]) a
5af0: 6e 64 20 69 6e 5f 61 72 72 61 79 28 24 5f 52 45 nd in_array($_RE
5b00: 51 55 45 53 54 5b 22 71 22 5d 2c 20 71 75 65 72 QUEST["q"], quer
5b10: 79 3a 3a 24 70 75 62 6c 69 63 29 29 20 7b 0a 20 y::$public)) {.
5b20: 20 20 20 6e 65 77 20 71 75 65 72 79 28 29 3b 0a new query();.
5b30: 7d 0a 65 6c 73 65 69 66 20 28 21 24 74 6f 6b 65 }.elseif (!$toke
5b40: 6e 20 3d 20 67 65 74 5f 74 6f 6b 65 6e 28 24 5f n = get_token($_
5b50: 52 45 51 55 45 53 54 5b 22 61 63 63 65 73 73 5f REQUEST["access_
5b60: 74 6f 6b 65 6e 22 5d 29 29 20 7b 0a 20 20 20 20 token"])) {.
5b70: 6a 73 6f 6e 5f 72 65 73 70 6f 6e 73 65 28 5b 20 json_response([
5b80: 22 65 72 72 6f 72 22 3d 3e 22 75 6e 61 75 74 68 "error"=>"unauth
5b90: 6f 72 69 7a 65 64 22 2c 20 22 65 72 72 6f 72 5f orized", "error_
5ba0: 64 65 73 63 72 69 70 74 69 6f 6e 22 3d 3e 22 74 description"=>"t
5bb0: 6f 6b 65 6e 20 65 78 70 69 72 65 64 2f 69 6e 76 oken expired/inv
5bc0: 61 6c 69 64 22 5d 2c 20 22 34 30 31 20 54 6f 6b alid"], "401 Tok
5bd0: 65 6e 20 65 78 70 69 72 65 64 22 29 3b 0a 7d 0a en expired");.}.
5be0: 65 6c 73 65 69 66 20 28 21 76 65 72 69 66 79 5f elseif (!verify_
5bf0: 73 63 6f 70 65 28 24 74 6f 6b 65 6e 2c 20 5b 24 scope($token, [$
5c00: 5f 50 4f 53 54 5b 22 61 63 74 69 6f 6e 22 5d 2c _POST["action"],
5c10: 20 24 5f 50 4f 53 54 5b 22 74 79 70 65 22 5d 5d $_POST["type"]]
5c20: 29 29 20 7b 0a 23 70 72 69 6e 74 5f 72 28 24 5f )) {.#print_r($_
5c30: 50 4f 53 54 29 3b 0a 20 20 20 20 6a 73 6f 6e 5f POST);. json_
5c40: 72 65 73 70 6f 6e 73 65 28 22 73 63 6f 70 65 20 response("scope
5c50: 69 6e 73 75 66 66 69 63 69 65 6e 74 22 2c 20 22 insufficient", "
5c60: 34 30 33 20 53 63 6f 70 65 20 69 6e 73 75 66 66 403 Scope insuff
5c70: 69 63 69 65 6e 74 22 29 3b 0a 7d 0a 65 6c 73 65 icient");.}.else
5c80: 69 66 20 28 21 65 6d 70 74 79 28 24 5f 47 45 54 if (!empty($_GET
5c90: 5b 22 71 22 5d 29 29 20 7b 0a 20 20 20 20 6e 65 ["q"])) {. ne
5ca0: 77 20 71 75 65 72 79 28 24 74 6f 6b 65 6e 29 3b w query($token);
5cb0: 0a 7d 0a 65 6c 73 65 69 66 20 28 24 5f 50 4f 53 .}.elseif ($_POS
5cc0: 54 5b 22 61 63 74 69 6f 6e 22 5d 20 3d 3d 20 22 T["action"] == "
5cd0: 75 70 64 61 74 65 22 29 20 7b 0a 20 20 20 20 6e update") {. n
5ce0: 65 77 20 75 70 64 61 74 65 28 24 5f 50 4f 53 54 ew update($_POST
5cf0: 2c 20 24 74 6f 6b 65 6e 29 3b 0a 7d 0a 65 6c 73 , $token);.}.els
5d00: 65 20 7b 0a 23 70 72 69 6e 74 5f 72 28 24 5f 53 e {.#print_r($_S
5d10: 45 52 56 45 52 29 3b 0a 20 20 20 20 6e 65 77 20 ERVER);. new
5d20: 63 72 65 61 74 65 28 24 5f 50 4f 53 54 2c 20 24 create($_POST, $
5d30: 74 6f 6b 65 6e 29 3b 0a 7d 0a 0a 0a 3f 3e token);.}...?>