Collection of themes/skins for the Fossil SCM

โŒˆโŒ‹ โއ branch:  Fossil Skins Extra


Hex Artifact Content

Artifact 0c5d343488bfc470eedca76e9810d43108acfed6:

  • Executable file extroot/micropub — part of check-in [0e67fdb36b] at 2021-10-20 05:59:00 on branch trunk — support for #access: flag (user: mario size: 23870)

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>&lt;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  '&gt;</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);.}...?>