Browse Source

first upload

bflamegame 1 year ago
commit
2abb002708
100 changed files with 2728 additions and 0 deletions
  1. 43 0
      .htaccess.dist
  2. 339 0
      COPYING
  3. 10 0
      README
  4. 16 0
      SECURITY.md
  5. 1 0
      VERSION
  6. 7 0
      bin/.htaccess
  7. 350 0
      bin/dwpage.php
  8. 340 0
      bin/gittool.php
  9. 107 0
      bin/indexer.php
  10. 103 0
      bin/plugin.php
  11. 64 0
      bin/render.php
  12. 114 0
      bin/striplangs.php
  13. 186 0
      bin/wantedpages.php
  14. 8 0
      conf/.htaccess
  15. 27 0
      conf/acl.auth.php
  16. 21 0
      conf/acl.auth.php.dist
  17. 62 0
      conf/acronyms.conf
  18. 179 0
      conf/dokuwiki.php
  19. 22 0
      conf/entities.conf
  20. 43 0
      conf/interwiki.conf
  21. 38 0
      conf/license.php
  22. 25 0
      conf/local.php
  23. 25 0
      conf/local.php.bak.php
  24. 16 0
      conf/local.php.dist
  25. 26 0
      conf/local.php~
  26. 3 0
      conf/manifest.json
  27. 91 0
      conf/mediameta.php
  28. 75 0
      conf/mime.conf
  29. 253 0
      conf/mysql.conf.php.example
  30. 12 0
      conf/plugins.local.php
  31. 6 0
      conf/plugins.php
  32. 12 0
      conf/plugins.required.php
  33. 11 0
      conf/scheme.conf
  34. 28 0
      conf/smileys.conf
  35. 17 0
      conf/users.auth.php
  36. 10 0
      conf/users.auth.php.dist
  37. 29 0
      conf/wordblock.conf
  38. 7 0
      data/.htaccess
  39. 1 0
      data/_dummy
  40. 1 0
      data/attic/_dummy
  41. BIN
      data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1662213976.txt.gz
  42. BIN
      data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1665345222.txt.gz
  43. BIN
      data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1665345234.txt.gz
  44. BIN
      data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1681879184.txt.gz
  45. BIN
      data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1686127165.txt.gz
  46. BIN
      data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1686418077.txt.gz
  47. BIN
      data/attic/driver/kurs_zaschitnogo_vozhdenija.1662212181.txt.gz
  48. BIN
      data/attic/driver/kurs_zaschitnogo_vozhdenija.1681879184.txt.gz
  49. BIN
      data/attic/driver/kurs_zaschitnogo_vozhdenija.1686418737.txt.gz
  50. BIN
      data/attic/driver/pamjatka_dlja_voditelja.1660051101.txt.gz
  51. BIN
      data/attic/driver/pamjatka_dlja_voditelja.1665344521.txt.gz
  52. BIN
      data/attic/driver/pamjatka_dlja_voditelja.1665344563.txt.gz
  53. BIN
      data/attic/driver/pamjatka_dlja_voditelja.1665344585.txt.gz
  54. BIN
      data/attic/driver/pamjatka_dlja_voditelja.1681879184.txt.gz
  55. BIN
      data/attic/driver/pamjatka_dlja_voditelja.1686127413.txt.gz
  56. BIN
      data/attic/driver/pamjatka_dlja_voditelja.1686418199.txt.gz
  57. BIN
      data/attic/driver/pravila_okazanija_uslug.1662210220.txt.gz
  58. BIN
      data/attic/driver/pravila_okazanija_uslug.1662211405.txt.gz
  59. BIN
      data/attic/driver/pravila_okazanija_uslug.1662211417.txt.gz
  60. BIN
      data/attic/driver/pravila_okazanija_uslug.1665344700.txt.gz
  61. BIN
      data/attic/driver/pravila_okazanija_uslug.1681879184.txt.gz
  62. BIN
      data/attic/driver/pravila_okazanija_uslug.1686127111.txt.gz
  63. BIN
      data/attic/driver/pravila_okazanija_uslug.1686127133.txt.gz
  64. BIN
      data/attic/driver/pravila_okazanija_uslug.1686418645.txt.gz
  65. BIN
      data/attic/driver/razdel_dlja_voditelej.1657454846.txt.gz
  66. BIN
      data/attic/driver/razdel_dlja_voditelej.1660050937.txt.gz
  67. BIN
      data/attic/driver/razdel_dlja_voditelej.1660051116.txt.gz
  68. BIN
      data/attic/driver/razdel_dlja_voditelej.1662208532.txt.gz
  69. BIN
      data/attic/driver/razdel_dlja_voditelej.1662209404.txt.gz
  70. BIN
      data/attic/driver/razdel_dlja_voditelej.1662209512.txt.gz
  71. BIN
      data/attic/driver/razdel_dlja_voditelej.1662209782.txt.gz
  72. BIN
      data/attic/driver/razdel_dlja_voditelej.1662211725.txt.gz
  73. BIN
      data/attic/driver/razdel_dlja_voditelej.1662213226.txt.gz
  74. BIN
      data/attic/driver/razdel_dlja_voditelej.1662213718.txt.gz
  75. BIN
      data/attic/driver/razdel_dlja_voditelej.1665344406.txt.gz
  76. BIN
      data/attic/driver/razdel_dlja_voditelej.1669642805.txt.gz
  77. BIN
      data/attic/driver/razdel_dlja_voditelej.1681879184.txt.gz
  78. BIN
      data/attic/driver/razdel_dlja_voditelej.1686126708.txt.gz
  79. BIN
      data/attic/driver/razdel_dlja_voditelej.1686418660.txt.gz
  80. BIN
      data/attic/driver/reglament_sobljudenija_specialnyx_trebovanij_klienta.1662209438.txt.gz
  81. BIN
      data/attic/driver/reglament_sobljudenija_specialnyx_trebovanij_klienta.1681879184.txt.gz
  82. BIN
      data/attic/driver/reglament_sobljudenija_specialnyx_trebovanij_klienta.1686418329.txt.gz
  83. BIN
      data/attic/driver/shkola_personalnyx_voditelej.1662213125.txt.gz
  84. BIN
      data/attic/driver/shkola_personalnyx_voditelej.1681879184.txt.gz
  85. BIN
      data/attic/driver/shkola_personalnyx_voditelej.1686418744.txt.gz
  86. BIN
      data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1662209093.txt.gz
  87. BIN
      data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1662209124.txt.gz
  88. BIN
      data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1662209239.txt.gz
  89. BIN
      data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1681879184.txt.gz
  90. BIN
      data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1686418552.txt.gz
  91. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1662213494.txt.gz
  92. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1662213608.txt.gz
  93. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1662213621.txt.gz
  94. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1662214299.txt.gz
  95. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1665344776.txt.gz
  96. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1665345276.txt.gz
  97. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1681879184.txt.gz
  98. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1686126811.txt.gz
  99. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1686126834.txt.gz
  100. BIN
      data/attic/driver/standarty_servisa_assist_dlja_voditelej.1686417957.txt.gz

+ 43 - 0
.htaccess.dist

@@ -0,0 +1,43 @@
+## You should disable Indexes and MultiViews either here or in the
+## global config. Symlinks maybe needed for URL rewriting.
+#Options -Indexes -MultiViews +FollowSymLinks
+
+## make sure nobody gets the htaccess, README, COPYING or VERSION files
+<Files ~ "^([\._]ht|README$|VERSION$|COPYING$)">
+    <IfModule mod_authz_core.c>
+        Require all denied
+    </IfModule>
+    <IfModule !mod_authz_core.c>
+        Order allow,deny
+        Deny from all
+    </IfModule>
+</Files>
+
+## Don't allow access to git directories
+<IfModule alias_module>
+    RedirectMatch 404 /\.git
+</IfModule>
+
+## Uncomment these rules if you want to have nice URLs using
+## $conf['userewrite'] = 1 - not needed for rewrite mode 2
+#RewriteEngine on
+#
+#RewriteRule ^_media/(.*)              lib/exe/fetch.php?media=$1  [QSA,L]
+#RewriteRule ^_detail/(.*)             lib/exe/detail.php?media=$1  [QSA,L]
+#RewriteRule ^_export/([^/]+)/(.*)     doku.php?do=export_$1&id=$2  [QSA,L]
+#RewriteRule ^$                        doku.php  [L]
+#RewriteCond %{REQUEST_FILENAME}       !-f
+#RewriteCond %{REQUEST_FILENAME}       !-d
+#RewriteRule (.*)                      doku.php?id=$1  [QSA,L]
+#RewriteRule ^index.php$               doku.php
+#
+## Not all installations will require the following line.  If you do,
+## change "/dokuwiki" to the path to your dokuwiki directory relative
+## to your document root.
+#RewriteBase /dokuwiki
+#
+## If you enable DokuWikis XML-RPC interface, you should consider to
+## restrict access to it over HTTPS only! Uncomment the following two
+## rules if your server setup allows HTTPS.
+#RewriteCond %{HTTPS} !=on
+#RewriteRule ^lib/exe/xmlrpc.php$      https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]

+ 339 - 0
COPYING

@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.

+ 10 - 0
README

@@ -0,0 +1,10 @@
+All documentation for DokuWiki is available online
+at https://www.dokuwiki.org/
+
+For Installation Instructions see
+https://www.dokuwiki.org/install
+
+DokuWiki - 2004-2023 (c) Andreas Gohr <andi@splitbrain.org>
+                         and the DokuWiki Community
+See COPYING and file headers for license info
+

+ 16 - 0
SECURITY.md

@@ -0,0 +1,16 @@
+# Security Policy
+
+Security vulnerabilities can be reported for the current stable release (branch `stable`) and the `master` branch.
+
+We try to fix vulnerabilites as fast as possible, but please keep in mind that this is a project run by volunteers. Depending on the severity we may release hotfixes for the current stable release or may simply incorporate the fix in the next proper release.
+
+**This policy only applies to DokuWiki and the bundled plugins. Do not report issues about 3rd party plugins here.**
+
+## Reporting a Vulnerability
+
+You have multiple options on reporting vulnerabilities
+
+* Use [huntr.dev](https://www.huntr.dev/repos/dokuwiki/dokuwiki)
+* Send an e-mail to [Andi](mailto:andi@splitbrain.org)
+* Open a [Github Issue](https://github.com/dokuwiki/dokuwiki/issues)
+* Send a mail to the [Mailing List](https://www.dokuwiki.org/mailinglist)

+ 1 - 0
VERSION

@@ -0,0 +1 @@
+2023-04-04a "Jack Jackrum"

+ 7 - 0
bin/.htaccess

@@ -0,0 +1,7 @@
+<IfModule mod_authz_core.c>
+    Require all denied
+</IfModule>
+<IfModule !mod_authz_core.c>
+    Order allow,deny
+    Deny from all
+</IfModule>

+ 350 - 0
bin/dwpage.php

@@ -0,0 +1,350 @@
+#!/usr/bin/env php
+<?php
+
+use splitbrain\phpcli\CLI;
+use splitbrain\phpcli\Options;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/');
+define('NOSESSION', 1);
+require_once(DOKU_INC . 'inc/init.php');
+
+/**
+ * Checkout and commit pages from the command line while maintaining the history
+ */
+class PageCLI extends CLI {
+
+    protected $force = false;
+    protected $username = '';
+
+    /**
+     * Register options and arguments on the given $options object
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function setup(Options $options) {
+        /* global */
+        $options->registerOption(
+            'force',
+            'force obtaining a lock for the page (generally bad idea)',
+            'f'
+        );
+        $options->registerOption(
+            'user',
+            'work as this user. defaults to current CLI user',
+            'u',
+            'username'
+        );
+        $options->setHelp(
+            'Utility to help command line Dokuwiki page editing, allow ' .
+            'pages to be checked out for editing then committed after changes'
+        );
+
+        /* checkout command */
+        $options->registerCommand(
+            'checkout',
+            'Checks out a file from the repository, using the wiki id and obtaining ' .
+            'a lock for the page. ' . "\n" .
+            'If a working_file is specified, this is where the page is copied to. ' .
+            'Otherwise defaults to the same as the wiki page in the current ' .
+            'working directory.'
+        );
+        $options->registerArgument(
+            'wikipage',
+            'The wiki page to checkout',
+            true,
+            'checkout'
+        );
+        $options->registerArgument(
+            'workingfile',
+            'How to name the local checkout',
+            false,
+            'checkout'
+        );
+
+        /* commit command */
+        $options->registerCommand(
+            'commit',
+            'Checks in the working_file into the repository using the specified ' .
+            'wiki id, archiving the previous version.'
+        );
+        $options->registerArgument(
+            'workingfile',
+            'The local file to commit',
+            true,
+            'commit'
+        );
+        $options->registerArgument(
+            'wikipage',
+            'The wiki page to create or update',
+            true,
+            'commit'
+        );
+        $options->registerOption(
+            'message',
+            'Summary describing the change (required)',
+            'm',
+            'summary',
+            'commit'
+        );
+        $options->registerOption(
+            'trivial',
+            'minor change',
+            't',
+            false,
+            'commit'
+        );
+
+        /* lock command */
+        $options->registerCommand(
+            'lock',
+            'Obtains or updates a lock for a wiki page'
+        );
+        $options->registerArgument(
+            'wikipage',
+            'The wiki page to lock',
+            true,
+            'lock'
+        );
+
+        /* unlock command */
+        $options->registerCommand(
+            'unlock',
+            'Removes a lock for a wiki page.'
+        );
+        $options->registerArgument(
+            'wikipage',
+            'The wiki page to unlock',
+            true,
+            'unlock'
+        );
+
+        /* gmeta command */
+        $options->registerCommand(
+            'getmeta',
+            'Prints metadata value for a page to stdout.'
+        );
+        $options->registerArgument(
+            'wikipage',
+            'The wiki page to get the metadata for',
+            true,
+            'getmeta'
+        );
+        $options->registerArgument(
+            'key',
+            'The name of the metadata item to be retrieved.' . "\n" .
+            'If empty, an array of all the metadata items is returned.' ."\n" .
+            'For retrieving items that are stored in sub-arrays, separate the ' .
+            'keys of the different levels by spaces, in quotes, eg "date modified".',
+            false,
+            'getmeta'
+        );
+    }
+
+    /**
+     * Your main program
+     *
+     * Arguments and options have been parsed when this is run
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function main(Options $options) {
+        $this->force = $options->getOpt('force', false);
+        $this->username = $options->getOpt('user', $this->getUser());
+
+        $command = $options->getCmd();
+        $args = $options->getArgs();
+        switch($command) {
+            case 'checkout':
+                $wiki_id = array_shift($args);
+                $localfile = array_shift($args);
+                $this->commandCheckout($wiki_id, $localfile);
+                break;
+            case 'commit':
+                $localfile = array_shift($args);
+                $wiki_id = array_shift($args);
+                $this->commandCommit(
+                    $localfile,
+                    $wiki_id,
+                    $options->getOpt('message', ''),
+                    $options->getOpt('trivial', false)
+                );
+                break;
+            case 'lock':
+                $wiki_id = array_shift($args);
+                $this->obtainLock($wiki_id);
+                $this->success("$wiki_id locked");
+                break;
+            case 'unlock':
+                $wiki_id = array_shift($args);
+                $this->clearLock($wiki_id);
+                $this->success("$wiki_id unlocked");
+                break;
+            case 'getmeta':
+                $wiki_id = array_shift($args);
+                $key = trim(array_shift($args));
+                $meta = p_get_metadata($wiki_id, $key, METADATA_RENDER_UNLIMITED);
+                echo trim(json_encode($meta, JSON_PRETTY_PRINT));
+                echo "\n";
+                break;
+            default:
+                echo $options->help();
+        }
+    }
+
+    /**
+     * Check out a file
+     *
+     * @param string $wiki_id
+     * @param string $localfile
+     */
+    protected function commandCheckout($wiki_id, $localfile) {
+        global $conf;
+
+        $wiki_id = cleanID($wiki_id);
+        $wiki_fn = wikiFN($wiki_id);
+
+        if(!file_exists($wiki_fn)) {
+            $this->fatal("$wiki_id does not yet exist");
+        }
+
+        if(empty($localfile)) {
+            $localfile = getcwd() . '/' . \dokuwiki\Utf8\PhpString::basename($wiki_fn);
+        }
+
+        if(!file_exists(dirname($localfile))) {
+            $this->fatal("Directory " . dirname($localfile) . " does not exist");
+        }
+
+        if(stristr(realpath(dirname($localfile)), realpath($conf['datadir'])) !== false) {
+            $this->fatal("Attempt to check out file into data directory - not allowed");
+        }
+
+        $this->obtainLock($wiki_id);
+
+        if(!copy($wiki_fn, $localfile)) {
+            $this->clearLock($wiki_id);
+            $this->fatal("Unable to copy $wiki_fn to $localfile");
+        }
+
+        $this->success("$wiki_id > $localfile");
+    }
+
+    /**
+     * Save a file as a new page revision
+     *
+     * @param string $localfile
+     * @param string $wiki_id
+     * @param string $message
+     * @param bool $minor
+     */
+    protected function commandCommit($localfile, $wiki_id, $message, $minor) {
+        $wiki_id = cleanID($wiki_id);
+        $message = trim($message);
+
+        if(!file_exists($localfile)) {
+            $this->fatal("$localfile does not exist");
+        }
+
+        if(!is_readable($localfile)) {
+            $this->fatal("Cannot read from $localfile");
+        }
+
+        if(!$message) {
+            $this->fatal("Summary message required");
+        }
+
+        $this->obtainLock($wiki_id);
+
+        saveWikiText($wiki_id, file_get_contents($localfile), $message, $minor);
+
+        $this->clearLock($wiki_id);
+
+        $this->success("$localfile > $wiki_id");
+    }
+
+    /**
+     * Lock the given page or exit
+     *
+     * @param string $wiki_id
+     */
+    protected function obtainLock($wiki_id) {
+        if($this->force) $this->deleteLock($wiki_id);
+
+        $_SERVER['REMOTE_USER'] = $this->username;
+
+        if(checklock($wiki_id)) {
+            $this->error("Page $wiki_id is already locked by another user");
+            exit(1);
+        }
+
+        lock($wiki_id);
+
+        if(checklock($wiki_id)) {
+            $this->error("Unable to obtain lock for $wiki_id ");
+            var_dump(checklock($wiki_id));
+            exit(1);
+        }
+    }
+
+    /**
+     * Clear the lock on the given page
+     *
+     * @param string $wiki_id
+     */
+    protected function clearLock($wiki_id) {
+        if($this->force) $this->deleteLock($wiki_id);
+
+        $_SERVER['REMOTE_USER'] = $this->username;
+        if(checklock($wiki_id)) {
+            $this->error("Page $wiki_id is locked by another user");
+            exit(1);
+        }
+
+        unlock($wiki_id);
+
+        if(file_exists(wikiLockFN($wiki_id))) {
+            $this->error("Unable to clear lock for $wiki_id");
+            exit(1);
+        }
+    }
+
+    /**
+     * Forcefully remove a lock on the page given
+     *
+     * @param string $wiki_id
+     */
+    protected function deleteLock($wiki_id) {
+        $wikiLockFN = wikiLockFN($wiki_id);
+
+        if(file_exists($wikiLockFN)) {
+            if(!unlink($wikiLockFN)) {
+                $this->error("Unable to delete $wikiLockFN");
+                exit(1);
+            }
+        }
+    }
+
+    /**
+     * Get the current user's username from the environment
+     *
+     * @return string
+     */
+    protected function getUser() {
+        $user = getenv('USER');
+        if(empty ($user)) {
+            $user = getenv('USERNAME');
+        } else {
+            return $user;
+        }
+        if(empty ($user)) {
+            $user = 'admin';
+        }
+        return $user;
+    }
+}
+
+// Main
+$cli = new PageCLI();
+$cli->run();

+ 340 - 0
bin/gittool.php

@@ -0,0 +1,340 @@
+#!/usr/bin/env php
+<?php
+
+use splitbrain\phpcli\CLI;
+use splitbrain\phpcli\Options;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/');
+define('NOSESSION', 1);
+require_once(DOKU_INC . 'inc/init.php');
+
+/**
+ * Easily manage DokuWiki git repositories
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class GitToolCLI extends CLI {
+
+    /**
+     * Register options and arguments on the given $options object
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function setup(Options $options) {
+        $options->setHelp(
+            "Manage git repositories for DokuWiki and its plugins and templates.\n\n" .
+            "$> ./bin/gittool.php clone gallery template:ach\n" .
+            "$> ./bin/gittool.php repos\n" .
+            "$> ./bin/gittool.php origin -v"
+        );
+
+        $options->registerArgument(
+            'command',
+            'Command to execute. See below',
+            true
+        );
+
+        $options->registerCommand(
+            'clone',
+            'Tries to install a known plugin or template (prefix with template:) via git. Uses the DokuWiki.org ' .
+            'plugin repository to find the proper git repository. Multiple extensions can be given as parameters'
+        );
+        $options->registerArgument(
+            'extension',
+            'name of the extension to install, prefix with \'template:\' for templates',
+            true,
+            'clone'
+        );
+
+        $options->registerCommand(
+            'install',
+            'The same as clone, but when no git source repository can be found, the extension is installed via ' .
+            'download'
+        );
+        $options->registerArgument(
+            'extension',
+            'name of the extension to install, prefix with \'template:\' for templates',
+            true,
+            'install'
+        );
+
+        $options->registerCommand(
+            'repos',
+            'Lists all git repositories found in this DokuWiki installation'
+        );
+
+        $options->registerCommand(
+            '*',
+            'Any unknown commands are assumed to be arguments to git and will be executed in all repositories ' .
+            'found within this DokuWiki installation'
+        );
+    }
+
+    /**
+     * Your main program
+     *
+     * Arguments and options have been parsed when this is run
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function main(Options $options) {
+        $command = $options->getCmd();
+        $args = $options->getArgs();
+        if(!$command) $command = array_shift($args);
+
+        switch($command) {
+            case '':
+                echo $options->help();
+                break;
+            case 'clone':
+                $this->cmdClone($args);
+                break;
+            case 'install':
+                $this->cmdInstall($args);
+                break;
+            case 'repo':
+            case 'repos':
+                $this->cmdRepos();
+                break;
+            default:
+                $this->cmdGit($command, $args);
+        }
+    }
+
+    /**
+     * Tries to install the given extensions using git clone
+     *
+     * @param array $extensions
+     */
+    public function cmdClone($extensions) {
+        $errors = array();
+        $succeeded = array();
+
+        foreach($extensions as $ext) {
+            $repo = $this->getSourceRepo($ext);
+
+            if(!$repo) {
+                $this->error("could not find a repository for $ext");
+                $errors[] = $ext;
+            } else {
+                if($this->cloneExtension($ext, $repo)) {
+                    $succeeded[] = $ext;
+                } else {
+                    $errors[] = $ext;
+                }
+            }
+        }
+
+        echo "\n";
+        if($succeeded) $this->success('successfully cloned the following extensions: ' . join(', ', $succeeded));
+        if($errors) $this->error('failed to clone the following extensions: ' . join(', ', $errors));
+    }
+
+    /**
+     * Tries to install the given extensions using git clone with fallback to install
+     *
+     * @param array $extensions
+     */
+    public function cmdInstall($extensions) {
+        $errors = array();
+        $succeeded = array();
+
+        foreach($extensions as $ext) {
+            $repo = $this->getSourceRepo($ext);
+
+            if(!$repo) {
+                $this->info("could not find a repository for $ext");
+                if($this->downloadExtension($ext)) {
+                    $succeeded[] = $ext;
+                } else {
+                    $errors[] = $ext;
+                }
+            } else {
+                if($this->cloneExtension($ext, $repo)) {
+                    $succeeded[] = $ext;
+                } else {
+                    $errors[] = $ext;
+                }
+            }
+        }
+
+        echo "\n";
+        if($succeeded) $this->success('successfully installed the following extensions: ' . join(', ', $succeeded));
+        if($errors) $this->error('failed to install the following extensions: ' . join(', ', $errors));
+    }
+
+    /**
+     * Executes the given git command in every repository
+     *
+     * @param $cmd
+     * @param $arg
+     */
+    public function cmdGit($cmd, $arg) {
+        $repos = $this->findRepos();
+
+        $shell = array_merge(array('git', $cmd), $arg);
+        $shell = array_map('escapeshellarg', $shell);
+        $shell = join(' ', $shell);
+
+        foreach($repos as $repo) {
+            if(!@chdir($repo)) {
+                $this->error("Could not change into $repo");
+                continue;
+            }
+
+            $this->info("executing $shell in $repo");
+            $ret = 0;
+            system($shell, $ret);
+
+            if($ret == 0) {
+                $this->success("git succeeded in $repo");
+            } else {
+                $this->error("git failed in $repo");
+            }
+        }
+    }
+
+    /**
+     * Simply lists the repositories
+     */
+    public function cmdRepos() {
+        $repos = $this->findRepos();
+        foreach($repos as $repo) {
+            echo "$repo\n";
+        }
+    }
+
+    /**
+     * Install extension from the given download URL
+     *
+     * @param string $ext
+     * @return bool|null
+     */
+    private function downloadExtension($ext) {
+        /** @var helper_plugin_extension_extension $plugin */
+        $plugin = plugin_load('helper', 'extension_extension');
+        if(!$ext) die("extension plugin not available, can't continue");
+
+        $plugin->setExtension($ext);
+
+        $url = $plugin->getDownloadURL();
+        if(!$url) {
+            $this->error("no download URL for $ext");
+            return false;
+        }
+
+        $ok = false;
+        try {
+            $this->info("installing $ext via download from $url");
+            $ok = $plugin->installFromURL($url);
+        } catch(Exception $e) {
+            $this->error($e->getMessage());
+        }
+
+        if($ok) {
+            $this->success("installed $ext via download");
+            return true;
+        } else {
+            $this->success("failed to install $ext via download");
+            return false;
+        }
+    }
+
+    /**
+     * Clones the extension from the given repository
+     *
+     * @param string $ext
+     * @param string $repo
+     * @return bool
+     */
+    private function cloneExtension($ext, $repo) {
+        if(substr($ext, 0, 9) == 'template:') {
+            $target = fullpath(tpl_incdir() . '../' . substr($ext, 9));
+        } else {
+            $target = DOKU_PLUGIN . $ext;
+        }
+
+        $this->info("cloning $ext from $repo to $target");
+        $ret = 0;
+        system("git clone $repo $target", $ret);
+        if($ret === 0) {
+            $this->success("cloning of $ext succeeded");
+            return true;
+        } else {
+            $this->error("cloning of $ext failed");
+            return false;
+        }
+    }
+
+    /**
+     * Returns all git repositories in this DokuWiki install
+     *
+     * Looks in root, template and plugin directories only.
+     *
+     * @return array
+     */
+    private function findRepos() {
+        $this->info('Looking for .git directories');
+        $data = array_merge(
+            glob(DOKU_INC . '.git', GLOB_ONLYDIR),
+            glob(DOKU_PLUGIN . '*/.git', GLOB_ONLYDIR),
+            glob(fullpath(tpl_incdir() . '../') . '/*/.git', GLOB_ONLYDIR)
+        );
+
+        if(!$data) {
+            $this->error('Found no .git directories');
+        } else {
+            $this->success('Found ' . count($data) . ' .git directories');
+        }
+        $data = array_map('fullpath', array_map('dirname', $data));
+        return $data;
+    }
+
+    /**
+     * Returns the repository for the given extension
+     *
+     * @param $extension
+     * @return false|string
+     */
+    private function getSourceRepo($extension) {
+        /** @var helper_plugin_extension_extension $ext */
+        $ext = plugin_load('helper', 'extension_extension');
+        if(!$ext) die("extension plugin not available, can't continue");
+
+        $ext->setExtension($extension);
+
+        $repourl = $ext->getSourcerepoURL();
+        if(!$repourl) return false;
+
+        // match github repos
+        if(preg_match('/github\.com\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) {
+            $user = $m[1];
+            $repo = $m[2];
+            return 'https://github.com/' . $user . '/' . $repo . '.git';
+        }
+
+        // match gitorious repos
+        if(preg_match('/gitorious.org\/([^\/]+)\/([^\/]+)?/i', $repourl, $m)) {
+            $user = $m[1];
+            $repo = $m[2];
+            if(!$repo) $repo = $user;
+
+            return 'https://git.gitorious.org/' . $user . '/' . $repo . '.git';
+        }
+
+        // match bitbucket repos - most people seem to use mercurial there though
+        if(preg_match('/bitbucket\.org\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) {
+            $user = $m[1];
+            $repo = $m[2];
+            return 'https://bitbucket.org/' . $user . '/' . $repo . '.git';
+        }
+
+        return false;
+    }
+}
+
+// Main
+$cli = new GitToolCLI();
+$cli->run();

+ 107 - 0
bin/indexer.php

@@ -0,0 +1,107 @@
+#!/usr/bin/env php
+<?php
+
+use splitbrain\phpcli\CLI;
+use splitbrain\phpcli\Options;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/');
+define('NOSESSION', 1);
+require_once(DOKU_INC . 'inc/init.php');
+
+/**
+ * Update the Search Index from command line
+ */
+class IndexerCLI extends CLI {
+
+    private $quiet = false;
+    private $clear = false;
+
+    /**
+     * Register options and arguments on the given $options object
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function setup(Options $options) {
+        $options->setHelp(
+            'Updates the searchindex by indexing all new or changed pages. When the -c option is ' .
+            'given the index is cleared first.'
+        );
+
+        $options->registerOption(
+            'clear',
+            'clear the index before updating',
+            'c'
+        );
+        $options->registerOption(
+            'quiet',
+            'don\'t produce any output',
+            'q'
+        );
+    }
+
+    /**
+     * Your main program
+     *
+     * Arguments and options have been parsed when this is run
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function main(Options $options) {
+        $this->clear = $options->getOpt('clear');
+        $this->quiet = $options->getOpt('quiet');
+
+        if($this->clear) $this->clearindex();
+
+        $this->update();
+    }
+
+    /**
+     * Update the index
+     */
+    protected function update() {
+        global $conf;
+        $data = array();
+        $this->quietecho("Searching pages... ");
+        search($data, $conf['datadir'], 'search_allpages', array('skipacl' => true));
+        $this->quietecho(count($data) . " pages found.\n");
+
+        foreach($data as $val) {
+            $this->index($val['id']);
+        }
+    }
+
+    /**
+     * Index the given page
+     *
+     * @param string $id
+     */
+    protected function index($id) {
+        $this->quietecho("$id... ");
+        idx_addPage($id, !$this->quiet, $this->clear);
+        $this->quietecho("done.\n");
+    }
+
+    /**
+     * Clear all index files
+     */
+    protected function clearindex() {
+        $this->quietecho("Clearing index... ");
+        idx_get_indexer()->clear();
+        $this->quietecho("done.\n");
+    }
+
+    /**
+     * Print message if not supressed
+     *
+     * @param string $msg
+     */
+    protected function quietecho($msg) {
+        if(!$this->quiet) echo $msg;
+    }
+}
+
+// Main
+$cli = new IndexerCLI();
+$cli->run();

+ 103 - 0
bin/plugin.php

@@ -0,0 +1,103 @@
+#!/usr/bin/env php
+<?php
+
+use dokuwiki\Extension\PluginController;
+use splitbrain\phpcli\CLI;
+use splitbrain\phpcli\Colors;
+use splitbrain\phpcli\Options;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/');
+define('NOSESSION', 1);
+require_once(DOKU_INC . 'inc/init.php');
+
+class PluginCLI extends CLI {
+
+    /**
+     * Register options and arguments on the given $options object
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function setup(Options $options) {
+        $options->setHelp('Excecutes Plugin command line tools');
+        $options->registerArgument('plugin', 'The plugin CLI you want to run. Leave off to see list', false);
+    }
+
+    /**
+     * Your main program
+     *
+     * Arguments and options have been parsed when this is run
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function main(Options $options) {
+        global $argv;
+        $argv = $options->getArgs();
+
+        if($argv) {
+            $plugin = $this->loadPlugin($argv[0]);
+            if($plugin !== null) {
+                $plugin->run();
+            } else {
+                $this->fatal('Command {cmd} not found.', ['cmd' => $argv[0]]);
+            }
+        } else {
+            echo $options->help();
+            $this->listPlugins();
+        }
+    }
+
+    /**
+     * List available plugins
+     */
+    protected function listPlugins() {
+        /** @var PluginController $plugin_controller */
+        global $plugin_controller;
+
+        echo "\n";
+        echo "\n";
+        echo $this->colors->wrap('AVAILABLE PLUGINS:', Colors::C_BROWN);
+        echo "\n";
+
+        $list = $plugin_controller->getList('cli');
+        sort($list);
+        if(!count($list)) {
+            echo $this->colors->wrap("  No plugins providing CLI components available\n", Colors::C_RED);
+        } else {
+            $tf = new \splitbrain\phpcli\TableFormatter($this->colors);
+
+            foreach($list as $name) {
+                $plugin = $this->loadPlugin($name);
+                if($plugin === null) continue;
+                $info = $plugin->getInfo();
+
+                echo $tf->format(
+                    [2, '30%', '*'],
+                    ['', $name, $info['desc']],
+                    ['', Colors::C_CYAN, '']
+
+                );
+            }
+        }
+    }
+
+    /**
+     * Instantiate a CLI plugin
+     *
+     * @param string $name
+     * @return \dokuwiki\Extension\CLIPlugin|null
+     */
+    protected function loadPlugin($name) {
+        // execute the plugin CLI
+        $class = "cli_plugin_$name";
+        if(class_exists($class)) {
+            return new $class();
+        }
+        return null;
+    }
+}
+
+// Main
+$cli = new PluginCLI();
+$cli->run();

+ 64 - 0
bin/render.php

@@ -0,0 +1,64 @@
+#!/usr/bin/env php
+<?php
+
+use splitbrain\phpcli\CLI;
+use splitbrain\phpcli\Options;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/');
+define('NOSESSION', 1);
+require_once(DOKU_INC . 'inc/init.php');
+
+/**
+ * A simple commandline tool to render some DokuWiki syntax with a given
+ * renderer.
+ *
+ * This may not work for plugins that expect a certain environment to be
+ * set up before rendering, but should work for most or even all standard
+ * DokuWiki markup
+ *
+ * @license GPL2
+ * @author  Andreas Gohr <andi@splitbrain.org>
+ */
+class RenderCLI extends CLI {
+
+    /**
+     * Register options and arguments on the given $options object
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function setup(Options $options) {
+        $options->setHelp(
+            'A simple commandline tool to render some DokuWiki syntax with a given renderer.' .
+            "\n\n" .
+            'This may not work for plugins that expect a certain environment to be ' .
+            'set up before rendering, but should work for most or even all standard ' .
+            'DokuWiki markup'
+        );
+        $options->registerOption('renderer', 'The renderer mode to use. Defaults to xhtml', 'r', 'mode');
+    }
+
+    /**
+     * Your main program
+     *
+     * Arguments and options have been parsed when this is run
+     *
+     * @param Options $options
+     * @throws DokuCLI_Exception
+     * @return void
+     */
+    protected function main(Options $options) {
+        $renderer = $options->getOpt('renderer', 'xhtml');
+
+        // do the action
+        $source = stream_get_contents(STDIN);
+        $info = array();
+        $result = p_render($renderer, p_get_instructions($source), $info);
+        if(is_null($result)) throw new DokuCLI_Exception("No such renderer $renderer");
+        echo $result;
+    }
+}
+
+// Main
+$cli = new RenderCLI();
+$cli->run();

+ 114 - 0
bin/striplangs.php

@@ -0,0 +1,114 @@
+#!/usr/bin/env php
+<?php
+
+use splitbrain\phpcli\CLI;
+use splitbrain\phpcli\Options;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/');
+define('NOSESSION', 1);
+require_once(DOKU_INC . 'inc/init.php');
+
+/**
+ * Remove unwanted languages from a DokuWiki install
+ */
+class StripLangsCLI extends CLI {
+
+    /**
+     * Register options and arguments on the given $options object
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function setup(Options $options) {
+
+        $options->setHelp(
+            'Remove all languages from the installation, besides the ones specified. English language ' .
+            'is never removed!'
+        );
+
+        $options->registerOption(
+            'keep',
+            'Comma separated list of languages to keep in addition to English.',
+            'k',
+            'langcodes'
+        );
+        $options->registerOption(
+            'english-only',
+            'Remove all languages except English',
+            'e'
+        );
+    }
+
+    /**
+     * Your main program
+     *
+     * Arguments and options have been parsed when this is run
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function main(Options $options) {
+        if($options->getOpt('keep')) {
+            $keep = explode(',', $options->getOpt('keep'));
+            if(!in_array('en', $keep)) $keep[] = 'en';
+        } elseif($options->getOpt('english-only')) {
+            $keep = array('en');
+        } else {
+            echo $options->help();
+            exit(0);
+        }
+
+        // Kill all language directories in /inc/lang and /lib/plugins besides those in $langs array
+        $this->stripDirLangs(realpath(dirname(__FILE__) . '/../inc/lang'), $keep);
+        $this->processExtensions(realpath(dirname(__FILE__) . '/../lib/plugins'), $keep);
+        $this->processExtensions(realpath(dirname(__FILE__) . '/../lib/tpl'), $keep);
+    }
+
+    /**
+     * Strip languages from extensions
+     *
+     * @param string $path path to plugin or template dir
+     * @param array $keep_langs languages to keep
+     */
+    protected function processExtensions($path, $keep_langs) {
+        if(is_dir($path)) {
+            $entries = scandir($path);
+
+            foreach($entries as $entry) {
+                if($entry != "." && $entry != "..") {
+                    if(is_dir($path . '/' . $entry)) {
+
+                        $plugin_langs = $path . '/' . $entry . '/lang';
+
+                        if(is_dir($plugin_langs)) {
+                            $this->stripDirLangs($plugin_langs, $keep_langs);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Strip languages from path
+     *
+     * @param string $path path to lang dir
+     * @param array $keep_langs languages to keep
+     */
+    protected function stripDirLangs($path, $keep_langs) {
+        $dir = dir($path);
+
+        while(($cur_dir = $dir->read()) !== false) {
+            if($cur_dir != '.' and $cur_dir != '..' and is_dir($path . '/' . $cur_dir)) {
+
+                if(!in_array($cur_dir, $keep_langs, true)) {
+                    io_rmdir($path . '/' . $cur_dir, true);
+                }
+            }
+        }
+        $dir->close();
+    }
+}
+
+$cli = new StripLangsCLI();
+$cli->run();

+ 186 - 0
bin/wantedpages.php

@@ -0,0 +1,186 @@
+#!/usr/bin/env php
+<?php
+
+use dokuwiki\Utf8\Sort;
+use dokuwiki\File\PageResolver;
+use splitbrain\phpcli\CLI;
+use splitbrain\phpcli\Options;
+
+if(!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../') . '/');
+define('NOSESSION', 1);
+require_once(DOKU_INC . 'inc/init.php');
+
+/**
+ * Find wanted pages
+ */
+class WantedPagesCLI extends CLI {
+
+    const DIR_CONTINUE = 1;
+    const DIR_NS = 2;
+    const DIR_PAGE = 3;
+
+    private $skip = false;
+    private $sort = 'wanted';
+
+    private $result = array();
+
+    /**
+     * Register options and arguments on the given $options object
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function setup(Options $options) {
+        $options->setHelp(
+            'Outputs a list of wanted pages (pages that do not exist yet) and their origin pages ' .
+            ' (the pages that are linkin to these missing pages).'
+        );
+        $options->registerArgument(
+            'namespace',
+            'The namespace to lookup. Defaults to root namespace',
+            false
+        );
+
+        $options->registerOption(
+            'sort',
+            'Sort by wanted or origin page',
+            's',
+            '(wanted|origin)'
+        );
+
+        $options->registerOption(
+            'skip',
+            'Do not show the second dimension',
+            'k'
+        );
+    }
+
+    /**
+     * Your main program
+     *
+     * Arguments and options have been parsed when this is run
+     *
+     * @param Options $options
+     * @return void
+     */
+    protected function main(Options $options) {
+        $args = $options->getArgs();
+        if($args) {
+            $startdir = dirname(wikiFN($args[0] . ':xxx'));
+        } else {
+            $startdir = dirname(wikiFN('xxx'));
+        }
+
+        $this->skip = $options->getOpt('skip');
+        $this->sort = $options->getOpt('sort');
+
+        $this->info("searching $startdir");
+
+        foreach($this->getPages($startdir) as $page) {
+            $this->internalLinks($page);
+        }
+        Sort::ksort($this->result);
+        foreach($this->result as $main => $subs) {
+            if($this->skip) {
+                print "$main\n";
+            } else {
+                $subs = array_unique($subs);
+                Sort::sort($subs);
+                foreach($subs as $sub) {
+                    printf("%-40s %s\n", $main, $sub);
+                }
+            }
+        }
+    }
+
+    /**
+     * Determine directions of the search loop
+     *
+     * @param string $entry
+     * @param string $basepath
+     * @return int
+     */
+    protected function dirFilter($entry, $basepath) {
+        if($entry == '.' || $entry == '..') {
+            return WantedPagesCLI::DIR_CONTINUE;
+        }
+        if(is_dir($basepath . '/' . $entry)) {
+            if(strpos($entry, '_') === 0) {
+                return WantedPagesCLI::DIR_CONTINUE;
+            }
+            return WantedPagesCLI::DIR_NS;
+        }
+        if(preg_match('/\.txt$/', $entry)) {
+            return WantedPagesCLI::DIR_PAGE;
+        }
+        return WantedPagesCLI::DIR_CONTINUE;
+    }
+
+    /**
+     * Collects recursively the pages in a namespace
+     *
+     * @param string $dir
+     * @return array
+     * @throws DokuCLI_Exception
+     */
+    protected function getPages($dir) {
+        static $trunclen = null;
+        if(!$trunclen) {
+            global $conf;
+            $trunclen = strlen($conf['datadir'] . ':');
+        }
+
+        if(!is_dir($dir)) {
+            throw new DokuCLI_Exception("Unable to read directory $dir");
+        }
+
+        $pages = array();
+        $dh = opendir($dir);
+        while(false !== ($entry = readdir($dh))) {
+            $status = $this->dirFilter($entry, $dir);
+            if($status == WantedPagesCLI::DIR_CONTINUE) {
+                continue;
+            } else if($status == WantedPagesCLI::DIR_NS) {
+                $pages = array_merge($pages, $this->getPages($dir . '/' . $entry));
+            } else {
+                $page = array(
+                    'id' => pathID(substr($dir . '/' . $entry, $trunclen)),
+                    'file' => $dir . '/' . $entry,
+                );
+                $pages[] = $page;
+            }
+        }
+        closedir($dh);
+        return $pages;
+    }
+
+    /**
+     * Parse instructions and add the non-existing links to the result array
+     *
+     * @param array $page array with page id and file path
+     */
+    protected function internalLinks($page) {
+        global $conf;
+        $instructions = p_get_instructions(file_get_contents($page['file']));
+        $resolver = new PageResolver($page['id']);
+        $pid = $page['id'];
+        foreach($instructions as $ins) {
+            if($ins[0] == 'internallink' || ($conf['camelcase'] && $ins[0] == 'camelcaselink')) {
+                $mid = $resolver->resolveId($ins[1][0]);
+                if(!page_exists($mid)) {
+                    list($mid) = explode('#', $mid); //record pages without hashes
+
+                    if($this->sort == 'origin') {
+                        $this->result[$pid][] = $mid;
+                    } else {
+                        $this->result[$mid][] = $pid;
+                    }
+                }
+            }
+        }
+    }
+}
+
+// Main
+$cli = new WantedPagesCLI();
+$cli->run();

+ 8 - 0
conf/.htaccess

@@ -0,0 +1,8 @@
+## no access to the conf directory
+<IfModule mod_authz_core.c>
+    Require all denied
+</IfModule>
+<IfModule !mod_authz_core.c>
+    Order allow,deny
+    Deny from all
+</IfModule>

+ 27 - 0
conf/acl.auth.php

@@ -0,0 +1,27 @@
+# acl.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Access Control Lists
+#
+# Auto-generated by install script
+# Date: Sun, 10 Jul 2022 06:35:12 +0000
+*	@ALL	0
+*	@user	8
+driver:*	@ALL	1
+partner:*	@ALL	1
+partner:*	practice	4
+playground:*	practice	2
+site:*	@ALL	1
+site:*	practice	2
+start	@ALL	1
+userdata:*	support	2
+userdata:client:p3	@driver	1
+userdata:client:p7	driver	1
+wiki:*	@ALL	1
+wiki:*	practice	2
+partner:*	@practice	2
+playground:*	@practice	2
+site:*	@practice	2
+wiki:*	@practice	2
+*	@allin	8

+ 21 - 0
conf/acl.auth.php.dist

@@ -0,0 +1,21 @@
+# acl.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Access Control Lists
+#
+# Editing this file by hand shouldn't be necessary. Use the ACL
+# Manager interface instead.
+#
+# If your auth backend allows special char like spaces in groups
+# or user names you need to urlencode them (only chars <128, leave
+# UTF-8 multibyte chars as is)
+#
+# none   0
+# read   1
+# edit   2
+# create 4
+# upload 8
+# delete 16
+
+*               @ALL        8

+ 62 - 0
conf/acronyms.conf

@@ -0,0 +1,62 @@
+# Acronyms.
+
+ACL          Access Control List
+AFAICS       As far as I can see
+AFAIK        As far as I know
+AFAIR        As far as I remember
+API          Application Programming Interface
+ASAP         As soon as possible
+ASCII        American Standard Code for Information Interchange
+BTW          By the way
+CMS          Content Management System
+CSS          Cascading Style Sheets
+DNS          Domain Name System
+EOF          End of file
+EOL          End of line
+EOM          End of message
+EOT          End of text
+FAQ          Frequently Asked Questions
+FTP          File Transfer Protocol
+FOSS         Free & Open-Source Software
+FLOSS        Free/Libre and Open Source Software
+FUD          Fear, Uncertainty, and Doubt
+FYI          For your information
+GB           Gigabyte
+GHz          Gigahertz
+GPL          GNU General Public License
+GUI          Graphical User Interface
+HTML         HyperText Markup Language
+IANAL        I am not a lawyer (but)
+IE           Internet Explorer
+IIRC         If I remember correctly
+IMHO         In my humble opinion
+IMO          In my opinion
+IOW          In other words
+IRC          Internet Relay Chat
+IRL          In real life
+KISS         Keep it simple stupid
+LAN          Local Area Network
+LGPL         GNU Lesser General Public License
+LOL          Laughing out loud
+MathML       Mathematical Markup Language
+MB           Megabyte
+MHz          Megahertz
+MSIE         Microsoft Internet Explorer
+OMG          Oh my God
+OS           Operating System
+OSS          Open Source Software
+OTOH         On the other hand
+PITA         Pain in the Ass
+RFC          Request for Comments
+ROTFL        Rolling on the floor laughing
+RTFM         Read The Fine Manual
+spec         specification
+TIA          Thanks in advance
+TL;DR        Too long; didn't read
+TOC          Table of Contents
+URI          Uniform Resource Identifier
+URL          Uniform Resource Locator
+W3C          World Wide Web Consortium
+WTF?         What the f***
+WYSIWYG      What You See Is What You Get
+YMMV         Your mileage may vary

+ 179 - 0
conf/dokuwiki.php

@@ -0,0 +1,179 @@
+<?php
+/**
+ * This is DokuWiki's Main Configuration file
+ *
+ * All the default values are kept here, you should not modify it but use
+ * a local.php file instead to override the settings from here.
+ *
+ * This is a piece of PHP code so PHP syntax applies!
+ *
+ * For help with the configuration and a more detailed explanation of the various options
+ * see https://www.dokuwiki.org/config
+ */
+
+
+/* Basic Settings */
+$conf['title']       = 'DokuWiki';        //what to show in the title
+$conf['start']       = 'start';           //name of start page
+$conf['lang']        = 'en';              //your language
+$conf['template']    = 'dokuwiki';         //see lib/tpl directory
+$conf['tagline']     = '';                //tagline in header (if template supports it)
+$conf['sidebar']     = 'sidebar';         //name of sidebar in root namespace (if template supports it)
+$conf['license']     = 'cc-by-nc-sa';     //see conf/license.php
+$conf['savedir']     = './data';          //where to store all the files
+$conf['basedir']     = '';                //absolute dir from serveroot - blank for autodetection
+$conf['baseurl']     = '';                //URL to server including protocol - blank for autodetect
+$conf['cookiedir']   = '';                //path to use in cookies - blank for basedir
+$conf['dmode']       = 0755;              //set directory creation mode
+$conf['fmode']       = 0644;              //set file creation mode
+$conf['allowdebug']  = 0;                 //allow debug output, enable if needed 0|1
+
+/* Display Settings */
+$conf['recent']      = 20;                //how many entries to show in recent
+$conf['recent_days'] = 7;                 //How many days of recent changes to keep. (days)
+$conf['breadcrumbs'] = 10;                //how many recent visited pages to show
+$conf['youarehere']  = 0;                 //show "You are here" navigation? 0|1
+$conf['fullpath']    = 0;                 //show full path of the document or relative to datadir only? 0|1
+$conf['typography']  = 1;                 //smartquote conversion 0=off, 1=doublequotes, 2=all quotes
+$conf['dformat']     = '%Y/%m/%d %H:%M';  //dateformat accepted by PHPs strftime() function
+$conf['signature']   = ' --- //[[@MAIL@|@NAME@]] @DATE@//'; //signature see wiki page for details
+$conf['showuseras']  = 'loginname';       // 'loginname' users login name
+                                          // 'username' users full name
+                                          // 'email' e-mail address (will be obfuscated as per mailguard)
+                                          // 'email_link' e-mail address as a mailto: link (obfuscated)
+$conf['toptoclevel'] = 1;                 //Level starting with and below to include in AutoTOC (max. 5)
+$conf['tocminheads'] = 3;                 //Minimum amount of headlines that determines if a TOC is built
+$conf['maxtoclevel'] = 3;                 //Up to which level include into AutoTOC (max. 5)
+$conf['maxseclevel'] = 3;                 //Up to which level create editable sections (max. 5)
+$conf['camelcase']   = 0;                 //Use CamelCase for linking? (I don't like it) 0|1
+$conf['deaccent']    = 1;                 //deaccented chars in pagenames (1) or romanize (2) or keep (0)?
+$conf['useheading']  = 0;                 //use the first heading in a page as its name
+$conf['sneaky_index']= 0;                 //check for namespace read permission in index view (0|1) (1 might cause unexpected behavior)
+$conf['hidepages']   = '';                //Regexp for pages to be skipped from RSS, Search and Recent Changes
+
+/* Authentication Settings */
+$conf['useacl']      = 0;                //Use Access Control Lists to restrict access?
+$conf['autopasswd']  = 1;                //autogenerate passwords and email them to user
+$conf['authtype']    = 'authplain';      //which authentication backend should be used
+$conf['passcrypt']   = 'bcrypt';           //Used crypt method (smd5,md5,sha1,ssha,crypt,mysql,my411,bcrypt)
+$conf['defaultgroup']= 'user';           //Default groups new Users are added to
+$conf['superuser']   = '!!not set!!';    //The admin can be user or @group or comma separated list user1,@group1,user2
+$conf['manager']     = '!!not set!!';    //The manager can be user or @group or comma separated list user1,@group1,user2
+$conf['profileconfirm'] = 1;             //Require current password to confirm changes to user profile
+$conf['rememberme'] = 1;                 //Enable/disable remember me on login
+$conf['disableactions'] = '';            //comma separated list of actions to disable
+$conf['auth_security_timeout'] = 900;    //time (seconds) auth data is considered valid, set to 0 to recheck on every page view
+$conf['securecookie'] = 1;               //never send HTTPS cookies via HTTP
+$conf['remote']      = 0;                //Enable/disable remote interfaces
+$conf['remoteuser']  = '!!not set!!';    //user/groups that have access to remote interface (comma separated). leave empty to allow all users
+$conf['remotecors']  = '';               //enable Cross-Origin Resource Sharing (CORS) for the remote interfaces. Asterisk (*) to allow all origins. leave empty to deny.
+
+/* Antispam Features */
+$conf['usewordblock']= 1;                //block spam based on words? 0|1
+$conf['relnofollow'] = 1;                //use rel="ugc nofollow" for external links?
+$conf['indexdelay']  = 60*60*24*5;       //allow indexing after this time (seconds) default is 5 days
+$conf['mailguard']   = 'hex';            //obfuscate email addresses against spam harvesters?
+                                         //valid entries are:
+                                         //  'visible' - replace @ with [at], . with [dot] and - with [dash]
+                                         //  'hex'     - use hex entities to encode the mail address
+                                         //  'none'    - do not obfuscate addresses
+$conf['iexssprotect']= 1;                // check for JavaScript and HTML in uploaded files 0|1
+
+/* Editing Settings */
+$conf['usedraft']    = 1;                //automatically save a draft while editing (0|1)
+$conf['locktime']    = 15*60;            //maximum age for lockfiles (defaults to 15 minutes)
+$conf['cachetime']   = 60*60*24;         //maximum age for cachefile in seconds (defaults to a day)
+
+/* Link Settings */
+// Set target to use when creating links - leave empty for same window
+$conf['target']['wiki']      = '';
+$conf['target']['interwiki'] = '';
+$conf['target']['extern']    = '';
+$conf['target']['media']     = '';
+$conf['target']['windows']   = '';
+
+/* Media Settings */
+$conf['mediarevisions'] = 1;             //enable/disable media revisions
+$conf['refcheck']    = 1;                //check for references before deleting media files
+$conf['gdlib']       = 2;                //the GDlib version (0, 1 or 2) 2 tries to autodetect
+$conf['im_convert']  = '';               //path to ImageMagicks convert (will be used instead of GD)
+$conf['jpg_quality'] = '70';             //quality of compression when scaling jpg images (0-100)
+$conf['fetchsize']   = 0;                //maximum size (bytes) fetch.php may download from extern, disabled by default
+
+/* Notification Settings */
+$conf['subscribers'] = 0;                //enable change notice subscription support
+$conf['subscribe_time'] = 24*60*60;      //Time after which digests / lists are sent (in sec, default 1 day)
+                                         //Should be smaller than the time specified in recent_days
+$conf['notify']      = '';               //send change info to this email (leave blank for nobody)
+$conf['registernotify'] = '';            //send info about newly registered users to this email (leave blank for nobody)
+$conf['mailfrom']    = '';               //use this email when sending mails
+$conf['mailreturnpath']    = '';         //use this email as returnpath for bounce mails
+$conf['mailprefix']  = '';               //use this as prefix of outgoing mails
+$conf['htmlmail']    = 1;                //send HTML multipart mails
+$conf['dontlog'] = 'debug';              //logging facilities that should be disabled
+
+/* Syndication Settings */
+$conf['sitemap']     = 0;                //Create a Google sitemap? How often? In days.
+$conf['rss_type']    = 'rss1';           //type of RSS feed to provide, by default:
+                                         //  'rss'  - RSS 0.91
+                                         //  'rss1' - RSS 1.0
+                                         //  'rss2' - RSS 2.0
+                                         //  'atom' - Atom 0.3
+                                         //  'atom1' - Atom 1.0
+$conf['rss_linkto'] = 'diff';            //what page RSS entries link to:
+                                         //  'diff'    - page showing revision differences
+                                         //  'page'    - the revised page itself
+                                         //  'rev'     - page showing all revisions
+                                         //  'current' - most recent revision of page
+$conf['rss_content'] = 'abstract';       //what to put in the items by default?
+                                         //  'abstract' - plain text, first paragraph or so
+                                         //  'diff'     - plain text unified diff wrapped in <pre> tags
+                                         //  'htmldiff' - diff as HTML table
+                                         //  'html'     - the full page rendered in XHTML
+$conf['rss_media']   = 'both';           //what should be listed?
+                                         //  'both'     - page and media changes
+                                         //  'pages'    - page changes only
+                                         //  'media'    - media changes only
+$conf['rss_update'] = 5*60;              //Update the RSS feed every n seconds (defaults to 5 minutes)
+$conf['rss_show_summary'] = 1;           //Add revision summary to title? 0|1
+$conf['rss_show_deleted'] = 1;           //Show deleted items 0|1
+
+/* Advanced Settings */
+$conf['updatecheck'] = 1;                //automatically check for new releases?
+$conf['userewrite']  = 0;                //this makes nice URLs: 0: off 1: .htaccess 2: internal
+$conf['useslash']    = 0;                //use slash instead of colon? only when rewrite is on
+$conf['sepchar']     = '_';              //word separator character in page names; may be a
+                                         //  letter, a digit, '_', '-', or '.'.
+$conf['canonical']   = 0;                //Should all URLs use full canonical http://... style?
+$conf['fnencode']    = 'url';            //encode filenames (url|safe|utf-8)
+$conf['autoplural']  = 0;                //try (non)plural form of nonexistent files?
+$conf['compression'] = 'gz';             //compress old revisions: (0: off) ('gz': gnuzip) ('bz2': bzip)
+                                         //  bz2 generates smaller files, but needs more cpu-power
+$conf['gzip_output'] = 0;                //use gzip content encoding for the output xhtml (if allowed by browser)
+$conf['compress']    = 1;                //Strip whitespaces and comments from Styles and JavaScript? 1|0
+$conf['cssdatauri']  = 512;              //Maximum byte size of small images to embed into CSS, won't work on IE<8
+$conf['send404']     = 0;                //Send an HTTP 404 status for nonexistent pages?
+$conf['broken_iua']  = 0;                //Platform with broken ignore_user_abort (IIS+CGI) 0|1
+$conf['xsendfile']   = 0;                //Use X-Sendfile (1 = lighttpd, 2 = standard)
+$conf['renderer_xhtml'] = 'xhtml';       //renderer to use for main page generation
+$conf['readdircache'] = 0;               //time cache in second for the readdir operation, 0 to deactivate.
+$conf['search_nslimit'] = 0;             //limit the search to the current X namespaces
+$conf['search_fragment'] = 'exact';      //specify the default fragment search behavior
+$conf['trustedproxy'] = '^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)';
+                                         //Regexp of trusted proxy address when reading IP using HTTP header
+                                         //  if blank, do not trust any proxy (including local IP)
+
+/* Feature Flags */
+$conf['defer_js'] = 1;                   // Defer javascript to be executed after the page's HTML has been parsed. Setting will be removed in the next release.
+$conf['hidewarnings'] = 0;               // Hide warnings
+
+/* Network Settings */
+$conf['dnslookups'] = 1;                 //disable to disallow IP to hostname lookups
+$conf['jquerycdn']  = 0;                 //use a CDN for delivering jQuery?
+// Proxy setup - if your Server needs a proxy to access the web set these
+$conf['proxy']['host']    = '';
+$conf['proxy']['port']    = '';
+$conf['proxy']['user']    = '';
+$conf['proxy']['pass']    = '';
+$conf['proxy']['ssl']     = 0;
+$conf['proxy']['except']  = '';

+ 22 - 0
conf/entities.conf

@@ -0,0 +1,22 @@
+# Typography replacements
+#
+# Order does matter!
+#
+# You can use HTML entities here, but it is not recommended because it may break
+# non-HTML renderers. Use UTF-8 chars directly instead.
+
+<->     ↔
+->      →
+<-      ←
+<=>     ⇔
+=>      ⇒
+<=      ⇐
+>>      »
+<<      «
+---     —
+--      –
+(c)     ©
+(tm)    ™
+(r)     ®
+...     …
+

+ 43 - 0
conf/interwiki.conf

@@ -0,0 +1,43 @@
+# Each URL may contain one of these placeholders
+# {URL}  is replaced by the URL encoded representation of the wikiname
+#        this is the right thing to do in most cases
+# {NAME} this is replaced by the wikiname as given in the document
+#        only mandatory encoded is done, urlencoding if the link
+#        is an external URL, or encoding as a wikiname if it is an
+#        internal link (begins with a colon)
+# {SCHEME}
+# {HOST}
+# {PORT}
+# {PATH}
+# {QUERY} these placeholders will be replaced with the appropriate part
+#         of the link when parsed as a URL
+# If no placeholder is defined the urlencoded name is appended to the URL
+
+# To prevent losing your added InterWiki shortcuts after an upgrade,
+# you should add new ones to interwiki.local.conf
+
+wp        https://en.wikipedia.org/wiki/{NAME}
+wpfr      https://fr.wikipedia.org/wiki/{NAME}
+wpde      https://de.wikipedia.org/wiki/{NAME}
+wpes      https://es.wikipedia.org/wiki/{NAME}
+wppl      https://pl.wikipedia.org/wiki/{NAME}
+wpjp      https://ja.wikipedia.org/wiki/{NAME}
+wpru      https://ru.wikipedia.org/wiki/{NAME}
+wpmeta    https://meta.wikipedia.org/wiki/{NAME}
+doku      https://www.dokuwiki.org/
+rfc       https://tools.ietf.org/html/rfc
+man       http://man.cx/
+amazon    https://www.amazon.com/dp/{URL}?tag=splitbrain-20
+amazon.de https://www.amazon.de/dp/{URL}?tag=splitbrain-21
+amazon.uk https://www.amazon.co.uk/dp/{URL}
+paypal    https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&amp;business=
+phpfn     https://secure.php.net/{NAME}
+skype     skype:{NAME}
+google    https://www.google.com/search?q=
+google.de https://www.google.de/search?q=
+go        https://www.google.com/search?q={URL}&amp;btnI=lucky
+user      :user:{NAME}
+
+# To support VoIP/SIP/TEL links
+callto    callto://{NAME}
+tel       tel:{NAME}

+ 38 - 0
conf/license.php

@@ -0,0 +1,38 @@
+<?php
+/**
+ * This file defines multiple available licenses you can license your
+ * wiki contents under. Do not change this file, but create a
+ * license.local.php instead.
+ */
+
+if(empty($LC)) $LC = empty($conf['lang']) ? 'en' : $conf['lang'];
+
+$license['cc-zero'] = array(
+    'name' => 'CC0 1.0 Universal',
+    'url'  => 'https://creativecommons.org/publicdomain/zero/1.0/deed.'.$LC,
+);
+$license['publicdomain'] = array(
+    'name' => 'Public Domain',
+    'url'  => 'https://creativecommons.org/licenses/publicdomain/deed.'.$LC,
+);
+$license['cc-by'] = array(
+    'name' => 'CC Attribution 4.0 International',
+    'url'  => 'https://creativecommons.org/licenses/by/4.0/deed.'.$LC,
+);
+$license['cc-by-sa'] = array(
+    'name' => 'CC Attribution-Share Alike 4.0 International',
+    'url'  => 'https://creativecommons.org/licenses/by-sa/4.0/deed.'.$LC,
+);
+$license['gnufdl'] = array(
+    'name' => 'GNU Free Documentation License 1.3',
+    'url'  => 'https://www.gnu.org/licenses/fdl-1.3.html',
+);
+$license['cc-by-nc'] = array(
+    'name' => 'CC Attribution-Noncommercial 4.0 International',
+    'url'  => 'https://creativecommons.org/licenses/by-nc/4.0/deed.'.$LC,
+);
+$license['cc-by-nc-sa'] = array(
+    'name' => 'CC Attribution-Noncommercial-Share Alike 4.0 International',
+    'url'  => 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.'.$LC,
+);
+

+ 25 - 0
conf/local.php

@@ -0,0 +1,25 @@
+<?php
+/*
+ * Dokuwiki's Main Configuration File - Local Settings
+ * Auto-generated by config plugin
+ * Run for user: denis.petrov
+ * Date: Wed, 07 Jun 2023 11:51:49 +0300
+ */
+
+$conf['title'] = 'Open';
+$conf['lang'] = 'ru';
+$conf['license'] = '0';
+$conf['breadcrumbs'] = 0;
+$conf['showuseras'] = 'username';
+$conf['deaccent'] = '2';
+$conf['useacl'] = 1;
+$conf['superuser'] = '@admin';
+$conf['manager'] = 'user,driver,support,@practice, @allin';
+$conf['disableactions'] = 'register,profile_delete';
+$conf['im_convert'] = '/usr/bin/convert';
+$conf['jpg_quality'] = 98;
+$conf['notify'] = 'info@sharix-app.org';
+$conf['mailfrom'] = 'doc@sharix-app.org';
+$conf['htmlmail'] = 0;
+$conf['userewrite'] = '2';
+$conf['useslash'] = 1;

+ 25 - 0
conf/local.php.bak.php

@@ -0,0 +1,25 @@
+<?php
+/*
+ * Dokuwiki's Main Configuration File - Local Settings
+ * Auto-generated by config plugin
+ * Run for user: denis.petrov
+ * Date: Wed, 07 Jun 2023 11:29:30 +0300
+ */
+
+$conf['title'] = 'Open';
+$conf['lang'] = 'ru';
+$conf['license'] = '0';
+$conf['breadcrumbs'] = 0;
+$conf['showuseras'] = 'username';
+$conf['deaccent'] = '2';
+$conf['useacl'] = 1;
+$conf['superuser'] = '@admin';
+$conf['manager'] = 'user,driver,support, @practice';
+$conf['disableactions'] = 'register,profile_delete';
+$conf['im_convert'] = '/usr/bin/convert';
+$conf['jpg_quality'] = 98;
+$conf['notify'] = 'info@sharix-app.org';
+$conf['mailfrom'] = 'doc@sharix-app.org';
+$conf['htmlmail'] = 0;
+$conf['userewrite'] = '2';
+$conf['useslash'] = 1;

+ 16 - 0
conf/local.php.dist

@@ -0,0 +1,16 @@
+<?php
+/**
+ * This is an example of how a local.php could look like.
+ * Simply copy the options you want to change from dokuwiki.php
+ * to this file and change them.
+ *
+ * When using the installer, a correct local.php file be generated for
+ * you automatically.
+ */
+
+
+//$conf['title']       = 'My Wiki';        //what to show in the title
+
+//$conf['useacl']      = 1;                //Use Access Control Lists to restrict access?
+//$conf['superuser']   = 'joe';
+

+ 26 - 0
conf/local.php~

@@ -0,0 +1,26 @@
+<?php
+/*
+ * Dokuwiki's Main Configuration File - Local Settings
+ * Auto-generated by config plugin
+ * Run for user: denis.petrov
+ * Date: Tue, 18 Apr 2023 11:22:21 +0300
+ */
+
+$conf['title'] = 'Doc';
+$conf['lang'] = 'ru';
+$conf['template'] = 'dokuwiki-templates';
+$conf['license'] = '0';
+$conf['breadcrumbs'] = 0;
+$conf['showuseras'] = 'username';
+$conf['deaccent'] = '2';
+$conf['useacl'] = 1;
+$conf['superuser'] = '@admin';
+$conf['manager'] = 'user,driver,support, @practice';
+$conf['disableactions'] = 'register,profile_delete';
+$conf['im_convert'] = '/usr/bin/convert';
+$conf['jpg_quality'] = 98;
+$conf['notify'] = 'info@sharix-app.org';
+$conf['mailfrom'] = 'doc@sharix-app.org';
+$conf['htmlmail'] = 0;
+$conf['userewrite'] = '2';
+$conf['useslash'] = 1;

+ 3 - 0
conf/manifest.json

@@ -0,0 +1,3 @@
+{
+    "display": "standalone"
+}

+ 91 - 0
conf/mediameta.php

@@ -0,0 +1,91 @@
+<?php
+/**
+ * This configures which metadata will be editable through
+ * the media manager. Each field of the array is an array with the
+ * following contents:
+ *   fieldname - Where data will be saved (EXIF or IPTC field)
+ *   label     - key to lookup in the $lang var, if not found printed as is
+ *   htmltype  - 'text', 'textarea' or 'date'
+ *   lookups   - array additional fields to look up the data (EXIF or IPTC fields)
+ *
+ * The fields are not ordered continuously to make inserting additional items
+ * in between simpler.
+ *
+ * This is a PHP snippet, so PHP syntax applies.
+ *
+ * Note: $fields is not a global variable and will not be available to any
+ *       other functions or templates later
+ *
+ * You may extend or overwrite this variable in an optional
+ * conf/mediameta.local.php file
+ *
+ * For a list of available EXIF/IPTC fields refer to
+ * http://www.dokuwiki.org/devel:templates:detail.php
+ */
+
+
+$fields = array(
+    10 => array('Iptc.Headline',
+                'img_title',
+                'text'),
+
+    20 => array('',
+                'img_date',
+                'date',
+                array('Date.EarliestTime')),
+
+    30 => array('',
+                'img_fname',
+                'text',
+                array('File.Name')),
+
+    40 => array('Iptc.Caption',
+                'img_caption',
+                'textarea',
+                array('Exif.UserComment',
+                      'Exif.TIFFImageDescription',
+                      'Exif.TIFFUserComment')),
+
+    50 => array('Iptc.Byline',
+                'img_artist',
+                'text',
+                array('Exif.TIFFArtist',
+                      'Exif.Artist',
+                      'Iptc.Credit')),
+
+    60 => array('Iptc.CopyrightNotice',
+                'img_copyr',
+                'text',
+                array('Exif.TIFFCopyright',
+                      'Exif.Copyright')),
+
+    70 => array('',
+                'img_format',
+                'text',
+                array('File.Format')),
+
+    80 => array('',
+                'img_fsize',
+                'text',
+                array('File.NiceSize')),
+
+    90 => array('',
+                'img_width',
+                'text',
+                array('File.Width')),
+
+    100 => array('',
+                'img_height',
+                'text',
+                array('File.Height')),
+
+    110 => array('',
+                'img_camera',
+                'text',
+                array('Simple.Camera')),
+
+    120 => array('Iptc.Keywords',
+                'img_keywords',
+                'text',
+                array('Exif.Category')),
+);

+ 75 - 0
conf/mime.conf

@@ -0,0 +1,75 @@
+# Allowed uploadable file extensions and mimetypes are defined here.
+# To extend this file it is recommended to create a mime.local.conf
+# file. Mimetypes that should be downloadable and not be opened in the
+# should be prefixed with a !
+
+jpg     image/jpeg
+jpeg    image/jpeg
+gif     image/gif
+png     image/png
+webp    image/webp
+ico     image/vnd.microsoft.icon
+
+mp3     audio/mpeg
+ogg     audio/ogg
+wav     audio/wav
+webm    video/webm
+ogv     video/ogg
+mp4     video/mp4
+vtt     text/vtt
+
+tgz     !application/octet-stream
+tar     !application/x-gtar
+gz      !application/octet-stream
+bz2     !application/octet-stream
+zip     !application/zip
+rar     !application/rar
+7z      !application/x-7z-compressed
+
+pdf     application/pdf
+ps      !application/postscript
+
+rpm     !application/octet-stream
+deb     !application/octet-stream
+
+doc     !application/msword
+xls     !application/msexcel
+ppt     !application/mspowerpoint
+rtf     !application/msword
+
+docx    !application/vnd.openxmlformats-officedocument.wordprocessingml.document
+xlsx    !application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
+pptx    !application/vnd.openxmlformats-officedocument.presentationml.presentation
+
+sxw     !application/soffice
+sxc     !application/soffice
+sxi     !application/soffice
+sxd     !application/soffice
+
+odc     !application/vnd.oasis.opendocument.chart
+odf     !application/vnd.oasis.opendocument.formula
+odg     !application/vnd.oasis.opendocument.graphics
+odi     !application/vnd.oasis.opendocument.image
+odp     !application/vnd.oasis.opendocument.presentation
+ods     !application/vnd.oasis.opendocument.spreadsheet
+odt     !application/vnd.oasis.opendocument.text
+
+svg     image/svg+xml
+
+# You should enable HTML and Text uploads only for restricted Wikis.
+# Spammers are known to upload spam pages through unprotected Wikis.
+# Note: Enabling HTML opens Cross Site Scripting vulnerabilities
+#       through JavaScript. Only enable this with trusted users. You
+#       need to disable the iexssprotect option additionally to
+#       adding the mime type here
+#html    text/html
+#htm     text/html
+#txt     text/plain
+#conf    text/plain
+#xml     text/xml
+#csv     text/csv
+
+# Also flash may be able to execute arbitrary scripts in the website's
+# context
+#swf     application/x-shockwave-flash
+

+ 253 - 0
conf/mysql.conf.php.example

@@ -0,0 +1,253 @@
+<?php
+/*
+ * This is an example configuration for the mysql auth plugin.
+ *
+ * This SQL statements are optimized for following table structure.
+ * If you use a different one you have to change them accordingly.
+ * See comments of every statement for details.
+ *
+ * TABLE users
+ *     uid   login   pass   firstname   lastname   email
+ *
+ * TABLE groups
+ *     gid   name
+ *
+ * TABLE usergroup
+ *     uid   gid
+ *
+ * To use this configuration you have to copy them to local.protected.php
+ * or at least include this file in local.protected.php.
+ */
+
+/* Options to configure database access. You need to set up this
+ * options carefully, otherwise you won't be able to access you
+ * database.
+ */
+$conf['plugin']['authmysql']['server']   = '';
+$conf['plugin']['authmysql']['user']     = '';
+$conf['plugin']['authmysql']['password'] = '';
+$conf['plugin']['authmysql']['database'] = '';
+
+/* This option enables debug messages in the mysql plugin. It is
+ * mostly useful for system admins.
+ */
+$conf['plugin']['authmysql']['debug'] = 0;
+
+/* Normally password encryption is done by DokuWiki (recommended) but for
+ * some reasons it might be useful to let the database do the encryption.
+ * Set 'forwardClearPass' to '1' and the cleartext password is forwarded to
+ * the database, otherwise the encrypted one.
+ */
+$conf['plugin']['authmysql']['forwardClearPass'] = 0;
+
+/* Multiple table operations will be protected by locks. This array tells
+ * the plugin which tables to lock. If you use any aliases for table names
+ * these array must also contain these aliases. Any unnamed alias will cause
+ * a warning during operation. See the example below.
+ */
+$conf['plugin']['authmysql']['TablesToLock']= array("users", "users AS u","groups", "groups AS g", "usergroup", "usergroup AS ug");
+
+/***********************************************************************/
+/*       Basic SQL statements for user authentication (required)       */
+/***********************************************************************/
+
+/* This statement is used to grant or deny access to the wiki. The result
+ * should be a table with exact one line containing at least the password
+ * of the user. If the result table is empty or contains more than one
+ * row, access will be denied.
+ *
+ * The plugin accesses the password as 'pass' so an alias might be necessary.
+ *
+ * Following patters will be replaced:
+ *   %{user}    user name
+ *   %{pass}    encrypted or clear text password (depends on 'encryptPass')
+ *   %{dgroup}  default group name
+ */
+$conf['plugin']['authmysql']['checkPass']   = "SELECT pass
+                                               FROM usergroup AS ug
+                                               JOIN users AS u ON u.uid=ug.uid
+                                               JOIN groups AS g ON g.gid=ug.gid
+                                               WHERE login='%{user}'
+                                               AND name='%{dgroup}'";
+
+/* This statement should return a table with exact one row containing
+ * information about one user. The field needed are:
+ * 'pass'  containing the encrypted or clear text password
+ * 'name'  the user's full name
+ * 'mail'  the user's email address
+ *
+ * Keep in mind that Dokuwiki will access this information through the
+ * names listed above so aliases might be necessary.
+ *
+ * Following patters will be replaced:
+ *   %{user}    user name
+ */
+$conf['plugin']['authmysql']['getUserInfo'] = "SELECT pass, CONCAT(firstname,' ',lastname) AS name, email AS mail
+                                               FROM users
+                                               WHERE login='%{user}'";
+
+/* This statement is used to get all groups a user is member of. The
+ * result should be a table containing all groups the given user is
+ * member of. The plugin accesses the group name as 'group' so an alias
+ * might be necessary.
+ *
+ * Following patters will be replaced:
+ *   %{user}    user name
+ */
+$conf['plugin']['authmysql']['getGroups']   = "SELECT name as `group`
+                                               FROM groups g, users u, usergroup ug
+                                               WHERE u.uid = ug.uid
+                                               AND g.gid = ug.gid
+                                               AND u.login='%{user}'";
+
+/***********************************************************************/
+/*      Additional minimum SQL statements to use the user manager      */
+/***********************************************************************/
+
+/* This statement should return a table containing all user login names
+ * that meet certain filter criteria. The filter expressions will be added
+ * case dependent by the plugin. At the end a sort expression will be added.
+ * Important is that this list contains no double entries for a user. Each
+ * user name is only allowed once in the table.
+ *
+ * The login name will be accessed as 'user' to an alias might be necessary.
+ * No patterns will be replaced in this statement but following patters
+ * will be replaced in the filter expressions:
+ *   %{user}    in FilterLogin  user's login name
+ *   %{name}    in FilterName   user's full name
+ *   %{email}   in FilterEmail  user's email address
+ *   %{group}   in FilterGroup  group name
+ */
+$conf['plugin']['authmysql']['getUsers']    = "SELECT DISTINCT login AS user
+                                               FROM users AS u
+                                               LEFT JOIN usergroup AS ug ON u.uid=ug.uid
+                                               LEFT JOIN groups AS g ON ug.gid=g.gid";
+$conf['plugin']['authmysql']['FilterLogin'] = "login LIKE '%{user}'";
+$conf['plugin']['authmysql']['FilterName']  = "CONCAT(firstname,' ',lastname) LIKE '%{name}'";
+$conf['plugin']['authmysql']['FilterEmail'] = "email LIKE '%{email}'";
+$conf['plugin']['authmysql']['FilterGroup'] = "name LIKE '%{group}'";
+$conf['plugin']['authmysql']['SortOrder']   = "ORDER BY login";
+
+/***********************************************************************/
+/*   Additional SQL statements to add new users with the user manager  */
+/***********************************************************************/
+
+/* This statement should add a user to the database. Minimum information
+ * to store are: login name, password, email address and full name.
+ *
+ * Following patterns will be replaced:
+ *   %{user}    user's login name
+ *   %{pass}    password (encrypted or clear text, depends on 'encryptPass')
+ *   %{email}   email address
+ *   %{name}    user's full name
+ */
+$conf['plugin']['authmysql']['addUser']     = "INSERT INTO users
+                                               (login, pass, email, firstname, lastname)
+                                               VALUES ('%{user}', '%{pass}', '%{email}',
+                                               SUBSTRING_INDEX('%{name}',' ', 1),
+                                               SUBSTRING_INDEX('%{name}',' ', -1))";
+
+/* This statement should add a group to the database.
+ * Following patterns will be replaced:
+ *   %{group}   group name
+ */
+$conf['plugin']['authmysql']['addGroup']    = "INSERT INTO groups (name)
+                                               VALUES ('%{group}')";
+
+/* This statement should connect a user to a group (a user become member
+ * of that group).
+ * Following patterns will be replaced:
+ *   %{user}    user's login name
+ *   %{uid}     id of a user dataset
+ *   %{group}   group name
+ *   %{gid}     id of a group dataset
+ */
+$conf['plugin']['authmysql']['addUserGroup']= "INSERT INTO usergroup (uid, gid)
+                                               VALUES ('%{uid}', '%{gid}')";
+
+/* This statement should remove a group fom the database.
+ * Following patterns will be replaced:
+ *   %{group}   group name
+ *   %{gid}     id of a group dataset
+ */
+$conf['plugin']['authmysql']['delGroup']    = "DELETE FROM groups
+                                               WHERE gid='%{gid}'";
+
+/* This statement should return the database index of a given user name.
+ * The plugin will access the index with the name 'id' so an alias might be
+ * necessary.
+ * following patters will be replaced:
+ *   %{user}    user name
+ */
+$conf['plugin']['authmysql']['getUserID']   = "SELECT uid AS id
+                                               FROM users
+                                               WHERE login='%{user}'";
+
+/***********************************************************************/
+/*   Additional SQL statements to delete users with the user manager   */
+/***********************************************************************/
+
+/* This statement should remove a user fom the database.
+ * Following patterns will be replaced:
+ *   %{user}    user's login name
+ *   %{uid}     id of a user dataset
+ */
+$conf['plugin']['authmysql']['delUser']     = "DELETE FROM users
+                                               WHERE uid='%{uid}'";
+
+/* This statement should remove all connections from a user to any group
+ * (a user quits membership of all groups).
+ * Following patterns will be replaced:
+ *   %{uid}     id of a user dataset
+ */
+$conf['plugin']['authmysql']['delUserRefs'] = "DELETE FROM usergroup
+                                               WHERE uid='%{uid}'";
+
+/***********************************************************************/
+/*   Additional SQL statements to modify users with the user manager   */
+/***********************************************************************/
+
+/* This statements should modify a user entry in the database. The
+ * statements UpdateLogin, UpdatePass, UpdateEmail and UpdateName will be
+ * added to updateUser on demand. Only changed parameters will be used.
+ *
+ * Following patterns will be replaced:
+ *   %{user}    user's login name
+ *   %{pass}    password (encrypted or clear text, depends on 'encryptPass')
+ *   %{email}   email address
+ *   %{name}    user's full name
+ *   %{uid}     user id that should be updated
+ */
+$conf['plugin']['authmysql']['updateUser']  = "UPDATE users SET";
+$conf['plugin']['authmysql']['UpdateLogin'] = "login='%{user}'";
+$conf['plugin']['authmysql']['UpdatePass']  = "pass='%{pass}'";
+$conf['plugin']['authmysql']['UpdateEmail'] = "email='%{email}'";
+$conf['plugin']['authmysql']['UpdateName']  = "firstname=SUBSTRING_INDEX('%{name}',' ', 1),
+                                               lastname=SUBSTRING_INDEX('%{name}',' ', -1)";
+$conf['plugin']['authmysql']['UpdateTarget']= "WHERE uid=%{uid}";
+
+/* This statement should remove a single connection from a user to a
+ * group (a user quits membership of that group).
+ *
+ * Following patterns will be replaced:
+ *   %{user}    user's login name
+ *   %{uid}     id of a user dataset
+ *   %{group}   group name
+ *   %{gid}     id of a group dataset
+ */
+$conf['plugin']['authmysql']['delUserGroup']= "DELETE FROM usergroup
+                                               WHERE uid='%{uid}'
+                                               AND gid='%{gid}'";
+
+/* This statement should return the database index of a given group name.
+ * The plugin will access the index with the name 'id' so an alias might
+ * be necessary.
+ *
+ * Following patters will be replaced:
+ *   %{group}   group name
+ */
+$conf['plugin']['authmysql']['getGroupID']  = "SELECT gid AS id
+                                               FROM groups
+                                               WHERE name='%{group}'";
+
+

+ 12 - 0
conf/plugins.local.php

@@ -0,0 +1,12 @@
+<?php
+/*
+ * Local plugin enable/disable settings
+ *
+ * Auto-generated by install script
+ * Date: Sun, 10 Jul 2022 06:35:12 +0000
+ */
+
+$plugins['authad']    = 0;
+$plugins['authldap']  = 0;
+$plugins['authmysql'] = 0;
+$plugins['authpgsql'] = 0;

+ 6 - 0
conf/plugins.php

@@ -0,0 +1,6 @@
+<?php
+/**
+ * This file configures the default states of available plugins. All settings in
+ * the plugins.*.php files will override those here.
+ */
+$plugins['testing'] = 0;

+ 12 - 0
conf/plugins.required.php

@@ -0,0 +1,12 @@
+<?php
+/**
+ * This file configures the enabled/disabled status of plugins, which are also protected
+ * from changes by the extension manager. These settings will override any local settings.
+ * It is not recommended to change this file, as it is overwritten on DokuWiki upgrades.
+ */
+$plugins['acl']               = 1;
+$plugins['authplain']         = 1;
+$plugins['extension']         = 1;
+$plugins['config']            = 1;
+$plugins['usermanager']       = 1;
+$plugins['template:dokuwiki'] = 1; // not a plugin, but this should not be uninstalled either

+ 11 - 0
conf/scheme.conf

@@ -0,0 +1,11 @@
+#Add URL schemes you want to be recognized as links here
+
+http
+https
+telnet
+gopher
+wais
+ftp
+ed2k
+irc
+ldap

+ 28 - 0
conf/smileys.conf

@@ -0,0 +1,28 @@
+# Smileys configured here will be replaced by the
+# configured images in the smiley directory
+
+8-)         cool.svg
+8-O         eek.svg
+8-o         eek.svg
+:-(         sad.svg
+:-)         smile.svg
+=)          smile2.svg
+:-/         doubt.svg
+:-\         doubt2.svg
+:-?         confused.svg
+:-D         biggrin.svg
+:-P         razz.svg
+:-o         surprised.svg
+:-O         surprised.svg
+:-x         silenced.svg
+:-X         silenced.svg
+:-|         neutral.svg
+;-)         wink.svg
+m(          facepalm.svg
+^_^         fun.svg
+:?:         question.svg
+:!:         exclaim.svg
+LOL         lol.svg
+FIXME       fixme.svg
+DELETEME    deleteme.svg
+

+ 17 - 0
conf/users.auth.php

@@ -0,0 +1,17 @@
+# users.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Userfile
+#
+# Auto-generated by install script
+# Date: Sun, 10 Jul 2022 06:35:12 +0000
+#
+# Format:
+# login:passwordhash:Real Name:email:groups,comma,separated
+
+admin:$2y$10$494WVfgsUWkQCmxPpZS1vu06cNhsInDDe0JUNtXIkW0gB7ZfUZPeC:Sharixadmin:info@sharix-app.org:admin,user
+dmitry.bogomolov:$2y$10$AeIfbRl3qlMoGWVXjLoJNOBL60oncqIky33qpRr.7PT7xIAalIQ1y:dmitry bogomolov:dmitry.bogomolov@sharix-app.org:allin
+nikita.makov:$2y$10$P8HPtUrWXq0I6BWgJOCnc.FG8H0ES/W.MDq3vv6.5mh6rV5IwsVDG:Nikita Makov:nikita.makov@sharix-app.org:user,staff,practice,admin
+alexandra.panyukova:$2y$10$lH1SiNHcdd04YOpmC06f0.CeJLtPtmgvGdxbPYydmDlRtiJeTCG3S:Alexandra Panyukova:panyukova@sharix-app.org:user,admin
+denis.petrov:$2y$10$TwWHfc0VhLCaAHIgiGUAm.fGqFhVBaAxcIG.VqqqgtY8tZbrsKPNO:Денис Петров:denis.petrov@sharix-app.org:admin,user

+ 10 - 0
conf/users.auth.php.dist

@@ -0,0 +1,10 @@
+# users.auth.php
+# <?php exit()?>
+# Don't modify the lines above
+#
+# Userfile
+#
+# Format:
+#
+# login:passwordhash:Real Name:email:groups,comma,separated
+

+ 29 - 0
conf/wordblock.conf

@@ -0,0 +1,29 @@
+# This blacklist is maintained by the DokuWiki community
+# patches welcome
+#
+https?:\/\/(\S*?)(-side-effects|top|pharm|pill|discount|discount-|deal|price|order|now|best|cheap|cheap-|online|buy|buy-|sale|sell)(\S*?)(cialis|viagra|prazolam|xanax|zanax|soma|vicodin|zenical|xenical|meridia|paxil|prozac|claritin|allegra|lexapro|wellbutrin|zoloft|retin|valium|levitra|phentermine)
+https?:\/\/(\S*?)(bi\s*sex|gay\s*sex|fetish|incest|penis|\brape\b)
+zoosex
+gang\s*bang
+facials
+ladyboy
+\btits\b
+bolea\.com
+52crystal
+baida\.org
+web-directory\.awardspace\.us
+korsan-team\.com
+BUDA TAMAMDIR
+wow-powerleveling-wow\.com
+wow gold
+wow-gold\.dinmo\.cn
+downgrade-vista\.com
+downgradetowindowsxp\.com
+elegantugg\.com
+classicedhardy\.com
+research-service\.com
+https?:\/\/(\S*?)(2-pay-secure|911essay|academia-research|anypapers|applicationessay|bestbuyessay|bestdissertation|bestessay|bestresume|besttermpaper|businessessay|college-paper|customessay|custom-made-paper|custom-writing|degree-?result|dissertationblog|dissertation-service|dissertations?expert|essaybank|essay-?blog|essaycapital|essaylogic|essaymill|essayontime|essaypaper|essays?land|essaytownsucks|essay-?writ|fastessays|freelancercareers|genuinecontent|genuineessay|genuinepaper|goessay|grandresume|killer-content|ma-dissertation|managementessay|masterpaper|mightystudent|needessay|researchedge|researchpaper-blog|resumecvservice|resumesexperts|resumesplanet|rushessay|samedayessay|superiorcontent|superiorpaper|superiorthesis|term-paper|termpaper-blog|term-paper-research|thesisblog|universalresearch|valwriting|vdwriters|wisetranslation|writersassembly|writers\.com\.ph|writers\.ph)
+flatsinmumbai\.co\.in
+https?:\/\/(\S*?)penny-?stock
+mattressreview\.biz
+(just|simply) (my|a) profile (site|webpage|page)

+ 7 - 0
data/.htaccess

@@ -0,0 +1,7 @@
+<IfModule mod_authz_core.c>
+    Require all denied
+</IfModule>
+<IfModule !mod_authz_core.c>
+    Order allow,deny
+    Deny from all
+</IfModule>

+ 1 - 0
data/_dummy

@@ -0,0 +1 @@
+You can safely delete this file.

+ 1 - 0
data/attic/_dummy

@@ -0,0 +1 @@
+You can safely delete this file.

BIN
data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1662213976.txt.gz


BIN
data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1665345222.txt.gz


BIN
data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1665345234.txt.gz


BIN
data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1681879184.txt.gz


BIN
data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1686127165.txt.gz


BIN
data/attic/driver/kriterii_proverki_sootvetstvija_avtomobilja_standartam_dlja_vypolnenija_zakazov.1686418077.txt.gz


BIN
data/attic/driver/kurs_zaschitnogo_vozhdenija.1662212181.txt.gz


BIN
data/attic/driver/kurs_zaschitnogo_vozhdenija.1681879184.txt.gz


BIN
data/attic/driver/kurs_zaschitnogo_vozhdenija.1686418737.txt.gz


BIN
data/attic/driver/pamjatka_dlja_voditelja.1660051101.txt.gz


BIN
data/attic/driver/pamjatka_dlja_voditelja.1665344521.txt.gz


BIN
data/attic/driver/pamjatka_dlja_voditelja.1665344563.txt.gz


BIN
data/attic/driver/pamjatka_dlja_voditelja.1665344585.txt.gz


BIN
data/attic/driver/pamjatka_dlja_voditelja.1681879184.txt.gz


BIN
data/attic/driver/pamjatka_dlja_voditelja.1686127413.txt.gz


BIN
data/attic/driver/pamjatka_dlja_voditelja.1686418199.txt.gz


BIN
data/attic/driver/pravila_okazanija_uslug.1662210220.txt.gz


BIN
data/attic/driver/pravila_okazanija_uslug.1662211405.txt.gz


BIN
data/attic/driver/pravila_okazanija_uslug.1662211417.txt.gz


BIN
data/attic/driver/pravila_okazanija_uslug.1665344700.txt.gz


BIN
data/attic/driver/pravila_okazanija_uslug.1681879184.txt.gz


BIN
data/attic/driver/pravila_okazanija_uslug.1686127111.txt.gz


BIN
data/attic/driver/pravila_okazanija_uslug.1686127133.txt.gz


BIN
data/attic/driver/pravila_okazanija_uslug.1686418645.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1657454846.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1660050937.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1660051116.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1662208532.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1662209404.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1662209512.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1662209782.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1662211725.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1662213226.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1662213718.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1665344406.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1669642805.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1681879184.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1686126708.txt.gz


BIN
data/attic/driver/razdel_dlja_voditelej.1686418660.txt.gz


BIN
data/attic/driver/reglament_sobljudenija_specialnyx_trebovanij_klienta.1662209438.txt.gz


BIN
data/attic/driver/reglament_sobljudenija_specialnyx_trebovanij_klienta.1681879184.txt.gz


BIN
data/attic/driver/reglament_sobljudenija_specialnyx_trebovanij_klienta.1686418329.txt.gz


BIN
data/attic/driver/shkola_personalnyx_voditelej.1662213125.txt.gz


BIN
data/attic/driver/shkola_personalnyx_voditelej.1681879184.txt.gz


BIN
data/attic/driver/shkola_personalnyx_voditelej.1686418744.txt.gz


BIN
data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1662209093.txt.gz


BIN
data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1662209124.txt.gz


BIN
data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1662209239.txt.gz


BIN
data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1681879184.txt.gz


BIN
data/attic/driver/spisok_vozmozhnyx_narushenij_i_otvetstvennost_za_nix.1686418552.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1662213494.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1662213608.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1662213621.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1662214299.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1665344776.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1665345276.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1681879184.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1686126811.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1686126834.txt.gz


BIN
data/attic/driver/standarty_servisa_assist_dlja_voditelej.1686417957.txt.gz


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