clwiki 2.4.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +19 -9
  3. data/app/controllers/cl_wiki/application_controller.rb +29 -1
  4. data/app/controllers/cl_wiki/page_controller.rb +52 -38
  5. data/app/controllers/cl_wiki/sessions_controller.rb +30 -0
  6. data/app/helpers/cl_wiki/application_helper.rb +3 -1
  7. data/app/models/cl_wiki/user.rb +89 -0
  8. data/app/views/cl_wiki/page/edit.html.erb +5 -1
  9. data/app/views/cl_wiki/page/recent.html.erb +1 -1
  10. data/app/views/cl_wiki/page/recent.rss.builder +10 -8
  11. data/app/views/cl_wiki/sessions/new.html.erb +10 -0
  12. data/config/clwiki.yml +16 -30
  13. data/config/initializers/clwiki.rb +4 -3
  14. data/config/routes.rb +9 -0
  15. data/lib/cl_wiki.rb +5 -1
  16. data/lib/cl_wiki/configuration.rb +28 -137
  17. data/lib/cl_wiki/engine.rb +3 -1
  18. data/lib/cl_wiki/file.rb +140 -117
  19. data/lib/cl_wiki/format/format.blockquote.rb +8 -6
  20. data/lib/cl_wiki/format/format.graphviz.digraph.rb +8 -7
  21. data/lib/cl_wiki/format/format.opml.rb +11 -9
  22. data/lib/cl_wiki/format/format.pre.blockquote.rb +8 -6
  23. data/lib/cl_wiki/format/format.simpletable.rb +10 -8
  24. data/lib/cl_wiki/memory_index.rb +102 -0
  25. data/lib/cl_wiki/page.rb +129 -257
  26. data/lib/cl_wiki/public_user.rb +9 -0
  27. data/lib/cl_wiki/user_base.rb +25 -0
  28. data/lib/cl_wiki/version.rb +3 -1
  29. data/lib/cl_wiki_lib.rb +9 -0
  30. data/lib/tasks/index.rake +4 -4
  31. data/test/dummy/app/assets/config/manifest.js +3 -0
  32. data/test/dummy/config/application.rb +1 -0
  33. data/test/dummy/config/environments/development.rb +2 -0
  34. data/test/dummy/config/initializers/clwiki.rb +3 -0
  35. data/test/dummy/config/routes.rb +3 -0
  36. data/test/dummy/log/development.log +5909 -0
  37. data/test/dummy/log/test.log +33349 -0
  38. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/-8/-8X-3n5w3EAS5uiBS2GQxjMlqD43Qout1GsSJUU6e4k.cache +1 -0
  39. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/-P/-Pa1BPD1Ps1OvnKPyrGE4MiUEnlzMEccXN8CzzxSRjM.cache +1 -0
  40. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/0k/0ktSefuSiZXp-1v5uXwST57lRoAF2HvHzclO4Gtftgo.cache +0 -0
  41. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/1V/1VmPI9-8O9Y8OP-JxSXl7-yNRMZHqapeh2drmkXiRGE.cache +1 -0
  42. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/2W/2WKPDryRtGzZO6Uedw4RNjnI5M9YVH-IbFg5GvLvTTQ.cache +0 -0
  43. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/3G/3GuA3P7RM10Vv7NgdH65pwfAH7gMHlJ_xBUO74i-ZjM.cache +0 -0
  44. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/3S/3SzCkB81tc9XbtFdEYxCeR3If141gvhEnHchU_C6hHs.cache +1 -0
  45. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/41/41dY2GtQJAt3CmkQn8IDa9B3clQaUT6XymanCfFZR2o.cache +0 -0
  46. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/46/46WEPovJzlkEgsdG0aV08HiNsRkf0L8Txt1SWLi4atg.cache +1 -0
  47. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/4I/4Ir0PJhTRUd9iGlSu6n2AREP-_amedFe4-1fKwB2wvg.cache +1 -0
  48. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/5L/5LXSsjTcB5Un8FHlrhi6AOjxwgzWoXeWBhU_hi1gdcg.cache +1 -0
  49. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/67/67V_0cxwrU68Onen7N2Lb9bTd1jLulH06F9zh1VgZ0U.cache +1 -0
  50. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/6A/6AXD3XLczHK8MPb5e10-7sLcS45ZrP7Iwgyo9xle0nU.cache +0 -0
  51. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/6D/6D8TdXG6KyMkGDvPbv87qUCDz9_6gRZbNAohojB484w.cache +1 -0
  52. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/7L/7LVfTxjfHpOSp2FeG-uhloqIUqIZ7uE3nT40dqhoqY8.cache +2 -0
  53. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/7b/7bceaEE3qsyoVjeou6RR-V9w2Wgzraq0OI2erU4s9ew.cache +1 -0
  54. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/7h/7hRfgp9EsoD33qh0aNXeyg9qdGapPlUT6FmcL8xztY4.cache +0 -0
  55. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/8c/8cq-JtJ9Zwg4F0bFdkqaGHjdB7a9JBmfDO_sczTWycI.cache +1 -0
  56. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/8h/8hO7EIQ5iOa2rL6ZlP318Lrk0unB2CfhHCI0TrUr-Oo.cache +0 -0
  57. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/8x/8x0PXM3vatUzVGk-vKi80S7LXrGb6bE-3EzEj54VNak.cache +1 -0
  58. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/9v/9vfh8eoLcnq3s_rolIXPs15SPTQWGxJrrjpJ3PoABek.cache +1 -0
  59. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/9w/9w-0hdVYmxONDHQlpGn7DFzlRA3oXqpW4x3t9LBUU6M.cache +1 -0
  60. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/B3/B385Es3x0hpGSQNWzSjiDcExPuEV9m1dUZWlEp5zGbw.cache +0 -0
  61. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/BR/BRBOvy22uVEx9Z5Aal_0BfPilVYEQl6AYXG2u8yBqBg.cache +0 -0
  62. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/BX/BXdNycvZI2UN7cgqvk6P4MQCc1PH2bTwa9i9vP-s-jk.cache +0 -0
  63. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/CO/CO-z80mMyQGRy-BwknxOV5bI2IFbcMMNc05j7v8Nqso.cache +0 -0
  64. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Cg/CgPqTXtSkCxEox0z95JfY89MndA2GhTTQK39fjKk6QU.cache +1 -0
  65. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ct/CtQeoxqXfctXd_NvChnCVaJ_cCjNuXJMv3LBXhswU6A.cache +0 -0
  66. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Dc/DcZ_YfpX7rLYFw-u7jSJCRp_z0iIyB7XKOcwm1cQexk.cache +0 -0
  67. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ex/Exqg59Ton1SZt_QH4hMa7wUFOAuIQnCan8B9578NzIg.cache +0 -0
  68. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/F5/F5c-QANC5X3kApAecuyiMZEme0NT_UUB6SjxKvb0ALg.cache +1 -0
  69. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Fd/FdwPBPhLtL4s8RSPhJ53YoYoFdRkNxANV_zQYw-KsVc.cache +1 -0
  70. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/GK/GKrbCoxDofzkQCmA17lE84OT6RW_6NKm7jwyZ4n2T6s.cache +0 -0
  71. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Gh/GhVuWwPtbWpQY_Ny4MyilnH9iUqCPxTDzOonAXM4od8.cache +1 -0
  72. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Gv/GvQrSgGYXiR-rgsPHFZq1oJ5zCkDK54muqIw6KW2GyA.cache +0 -0
  73. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Gw/Gwhhfk9vS7QWmHsW90WtAt0_Rp_7AIM-ZcHmEqLf_Rg.cache +1 -0
  74. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/H5/H5Yxi2VJxpyMb-cbgwBNua8O2zZ03Jk4ByV6yhIzAsQ.cache +0 -0
  75. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/I0/I0OpFIfCc595P02GZa3LUD1uD-Payl41dWaW3oZSK7g.cache +1 -0
  76. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/IQ/IQoDS19BmJjvixXd16O_7P6DB-GRUEZgdNJexJ88fIc.cache +1 -0
  77. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/I_/I_zDBUxxL4b2Wk9_qqVs56Abw1jGccc4FgvKwuscswQ.cache +1 -0
  78. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ig/IgcuJMmmdeYrq2F3D721tC7ficyRm92HIrLkim5DCxQ.cache +1 -0
  79. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/JI/JITjXC3hXUPgOQhDYsVjhPNjtTISt0j5uz2bjfoiSHI.cache +1 -0
  80. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/KL/KL75rsyvMJSIkYkXRijxh8cs7V1wtfLPjuodISQK5vc.cache +0 -0
  81. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Kw/KwqVMeMNxvnaSP-a-H5nkYyxloW_xoqR5JhEnqJ9puQ.cache +1 -0
  82. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/L1/L1KghIbeezpqVDyhAbCDc4pG11ElC5JpUl319-ZlZn8.cache +0 -0
  83. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Lh/LhI7QMLwiVavmyvwYzdc_t_V9OATXaBO8aCB2swJFCk.cache +1 -0
  84. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Lh/LhqYyoCtzXpfZq6UOhmZuZLSaAwZRX44sHfwPvPqezc.cache +2 -0
  85. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Lo/Lovn2yBpV04WnAQwZeM3hLL015H5syYBH2ufgIc6qCM.cache +1 -0
  86. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Lz/LznMZWa43whMHpqnPRsbUfREY3y_fiXQKaiKVEYW4fw.cache +0 -0
  87. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/MC/MC7GYdrSShtV64GB3hoINaYL3vCRZKq9KvwcwrJAdQo.cache +1 -0
  88. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/MU/MU6iF1YPAQqpVK_kVAtiJPtbHaYpYdOcO0g5bJ9exj8.cache +0 -0
  89. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Md/MdIg3XLcnbFsMXC-6xslVtmBvWH7Q21BSt9l5pm305o.cache +0 -0
  90. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Mw/Mwfi5Xeky61jhIuc6ooo4439CHOyz1hS48_taMRSlKM.cache +1 -0
  91. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ni/Ni5yuK9FFnhLe5HciROve12UIYstBdESWm0LfdcuVVs.cache +1 -0
  92. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Nz/Nz3hkLq4WlqgoHg_ChdHSXbP7fVmCWCTw0lH0jkMmDg.cache +0 -0
  93. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/O3/O38OvSNrhXKbxauuC8GOBBnKrt2-rPaDmfyrXScgHcA.cache +1 -0
  94. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/OS/OSm-zAlxXS63lBjvzJeSWfqq5d3D9fu-_nBVFWyQ4j0.cache +0 -0
  95. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Oa/Oazc9AJ4e_67dU0aArJeCNEeWJKMIFPtAJtxTJoUKcs.cache +1 -0
  96. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/PV/PVDpEMY_ha4kHETTb3QvjOBoBUP4PMjNDNcIAgmDy2I.cache +1 -0
  97. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Pl/PldDxSvU1o_UFPYTE0GJmUS9mHQXH88zEw5HN6GtlRE.cache +1 -0
  98. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Pu/PuU5S_LPnhAX43U1VVN3qP_sv0ph4stXSGo7I0e_jOw.cache +1 -0
  99. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/QJ/QJ6RPZNUkui_k3wTkb62zo8wczYY7q0B174GfSJjjWE.cache +2 -0
  100. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/QX/QXCyCL-Eeb3uHm9iOvs4anspZqeFbQnNyzDfIsXgzC8.cache +0 -0
  101. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/R1/R1F4Qf-kXTMH0fTLahalFTHtNBvgDfkOkrPyW8zeN_E.cache +0 -0
  102. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/R1/R1__Y-gz4zkDYrXWyCf6YTkvXO0RZlrpK6ynGGVuvnM.cache +0 -0
  103. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/R2/R2Xqb6eAeUW2xTaTaTjlkyUCirkb1qfYgW2CyY80VjM.cache +1 -0
  104. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/RM/RMXouh7GkRuhy8S6jnpxFD27HRVT0LEHj9iR53ps4o4.cache +1 -0
  105. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/RV/RVmt1mCn0tykR8xyBylvh-Hvi-Am87neA2IEkYHjg-g.cache +1 -0
  106. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Tg/TgTXCuKAEg1DI5zjHO8tGMGuQGC9BRt9vgDZj2FdSa8.cache +1 -0
  107. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/UI/UIyRfqj_T27DnyWJiZK9BdUGTIDTQ9M953ArtrYz5fM.cache +1 -0
  108. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/U_/U_F-o3fo7oUYyn0O5KBlt3jOF53X_-4UuZb-_alPZPk.cache +1 -0
  109. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/U_/U_KCsVrX_QoGJ_FpUpCNU3XMT36CThwu8_0HYj_2k4w.cache +1 -0
  110. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/U_/U_ie5WwVJPItNZrqfbIrnZpaRokYT5klrYU92QSugd8.cache +0 -0
  111. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ub/Ub-oUCoAiliSW8ohVsmtsflc4nPeiBvcjzgNbPLYQRc.cache +0 -0
  112. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ud/UdvIJcVNQ_08Vaoyx4KuRGNjazpB9-qjOtDMTud8R0Y.cache +1 -0
  113. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Uz/UzEG5I_EszWbaSVnk497D0KfuIzsgHoPLVQd7e3mlQg.cache +1 -0
  114. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/V-/V-F9X0mrPgfTELxk9xdYnb27trOmB6nBDL973YWeOfU.cache +0 -0
  115. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/VA/VAOOXmbiiPy1jqpQQCDVrhkByG3pdeJoZCOvVkp-XVY.cache +1 -0
  116. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/VV/VVIuIm_HUOaEdZfXt-CmFQZb3ycoiXeeI-FV7nwkr0Y.cache +1 -0
  117. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/VX/VXHQHhwOUBuWlKPY6smpXG1xjASw927lyjUKBXBh3e0.cache +0 -0
  118. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Vn/VnMqvZo9nqGF_5tt3gNbMyoG8jJVm0K0r1fANEBjfkw.cache +0 -0
  119. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/W1/W1YuEAoPMZTXfbxg_xWV9o2RP60SAKs5bhk7teKdL2g.cache +1 -0
  120. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/W2/W2ZyYMlYmyA7_1WcpiWhYUJa6wfPCZ5kZj_-Nuw31yM.cache +0 -0
  121. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Wg/WgwI9C5-mh_smtsTGVmH4y76T5ifM4M_hKL1fn-K8iw.cache +2 -0
  122. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/X5/X5GHIj6tnz-w7d-60OaYcbzJczzkTBtm24BOxzoSDdo.cache +1 -0
  123. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/X6/X6jU4SPOD_b1ks9tCApsvWRa7q8cBYCjw3gI6Dwvr34.cache +2 -0
  124. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/X8/X88lT-cwuuj8gqiNY83uVqXFgeLcaHMc9Xh2X4Iux6k.cache +0 -0
  125. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/XQ/XQ0aFc1cceisG4P8qUPhW8z1H3I71pMguVRRMgJ66cs.cache +5 -0
  126. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Xh/XhXLVYOEEwpzOBAWDdiCEpTMz7vC8wnlBHYHJkySh-0.cache +1 -0
  127. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/YB/YBJNyX7HNPq78obeHYRGnJKSVl9EtRPbcGD253-ia34.cache +0 -0
  128. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Yu/YupDX89OAJ6u3BHBW-UJgO3nDfi7hwlpf_JHlnM8b6k.cache +1 -0
  129. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ZH/ZHN5sHdNMxUCl3Ese5T5_AzQbD9WHqpgBL4PBOrgXJY.cache +1 -0
  130. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ZP/ZPRvYWthjzuQ0tqk5AdgQbeTUqhDboF8bvTtdrmg4Jo.cache +1 -0
  131. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ZV/ZVu2Ed9wpdsPLKStP971oLEJBwgJQHLInXIiQkIWC04.cache +0 -0
  132. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Zb/ZbnyIl6znMAVquD2ZD5OYA9SPXmQJYWU7V8F2Hgp3Uc.cache +0 -0
  133. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Zj/ZjALwFkjfG3uebsyy_CeJp5VQMJLE03zxPxkNp-sZDA.cache +0 -0
  134. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/_F/_Fu404i1O4mKpjPluBsq-3FZQnyQvla_6jDnH03Lpw8.cache +2 -0
  135. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/a-/a-t90hz_PZnc6ImKhk-cIh_WBB9vi_rChKzLv4hMBqw.cache +1 -0
  136. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/a5/a5cnzGcRAu4dPakq4_DHH9GanK42Ov5O1F62oeJR4Zo.cache +1 -0
  137. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aJ/aJK2kxoM9CsnZpxiFvP6RoP0sxHBiix9X1P6Mhy9Dcg.cache +2 -0
  138. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aO/aOU10S2QEOBHcdKwGRfXqqHdYshmYD20LYiJIGMzIa0.cache +1 -0
  139. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aZ/aZEdK7dgijyjIs26V_QbKsDgO5JxeYXiT0Sl28M0e-U.cache +0 -0
  140. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aq/aqBnFJWuQ-xmdUL8_asWtElNRrMr0W60LVdDqpt43L8.cache +1 -0
  141. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/b5/b5KTv2Hrf5faN7X4XahT1s8L5t-EANtcFKrMEsGm3lw.cache +1 -0
  142. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/bF/bFemYCjG73k2_Ys77S7qNyW7CYcyw4bngyc0OGneI-s.cache +1 -0
  143. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/bG/bGdy8gJL8acOmxK8AbkYbxNuakf4LlMZ-zPBkyL0E-0.cache +1 -0
  144. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/bK/bKm8sxC3i0ycUMXr6pnD61MdwytUWfpNOJlBY6qJaWg.cache +1 -0
  145. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/dA/dA1M22RMQvVwb74tbFg-_237SferZuCI10s4R0zx8NI.cache +0 -0
  146. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/dF/dFOzXjFeRtB5bukRI9wGrh2O_GkOeBPnrJRMiv8_ZbM.cache +0 -0
  147. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/dw/dwbXKkD4yllXOeD4T7BKoGvLS26j9lxMkjMiIxfyt6E.cache +0 -0
  148. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/eT/eTgN8O1TgsFV61pclFzCmmJ9qT7MgyGvtQrmRtJoNeg.cache +0 -0
  149. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/eu/eu6Xg0psMCuHIWG0WjCo9wwNOlWs-Z5OH4SyGEmdTNQ.cache +1 -0
  150. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/fC/fC-TBNdh4rVupPn2ObyZeIx6OSlpBSBQZfIzywI6xx0.cache +0 -0
  151. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/fR/fRIbNtGTaNqdwIDyusrUmllglSGMNnqnw7VOLvf5D_k.cache +1 -0
  152. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/fq/fq7SFxQSEFZCuS7jQj0n-BQfbJ5mpLpmJQsd9mJVq68.cache +1 -0
  153. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gG/gGBN3yxvq8azMjDv3hsSw_zLUj9KLuqHPDXZK8x8pFc.cache +0 -0
  154. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gd/gd3J0EmNeiTh2GzxcAKItmtUnUay9NG4Sm2vkiLKvmA.cache +1 -0
  155. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gj/gjXteWe57D8FaBOQUw29N_mwHCeTQW8oLjyv8fu3wNw.cache +3 -0
  156. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gt/gtFeEhjHn0G9WhgiMKaNtXVgNYW9s_wBLE0VGegeAN8.cache +1 -0
  157. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/hA/hA4-M5cp310ZkSe59_BWszdgXy7mmYagSRCfelGBA9o.cache +1 -0
  158. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/iC/iC3FCadetljjEIeMWfeqqDoMxhJi6rI20BpiVxtvgS4.cache +1 -0
  159. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/iV/iV16_jyEayI_vLgHw3HFhtJAiVOCIlzFho0Yt7a4v_Y.cache +0 -0
  160. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/j6/j62KRIr4T81zq1Ujpg7AJRQdI0ry9HGKPt4nK6fRt1g.cache +1 -0
  161. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/jR/jRg0Zbr59-UMtrWO5t2VWNI3GqU7XWOUsE44dX5cPyk.cache +0 -0
  162. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/jj/jj9HUpCSrLEyONEZNLLkgJ8hJmxOCLpcVJeiBa0KDsE.cache +1 -0
  163. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/jq/jqnMk9arxuef2cdSQuxj3WOQuAfGKup3H2pjO7x1DOg.cache +0 -0
  164. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/k1/k14rvggyKI9dk-yVjn-Lk0p8qU360H_JuVG9aZ4q0OM.cache +1 -0
  165. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/kb/Kb8Z49kajAX1vyy5d4-gA8StHhQp5yOUs0wtdZ7m8Hc.cache +1 -0
  166. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/kb/kbEMkrgp2k0pezn_gFfMqA142QwoJYBKMj7cEkE-Hag.cache +1 -0
  167. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/lD/lDpZHp5gBhRdNHdj1TwWq1_LZ_a56lxeksxqaEs2efA.cache +1 -0
  168. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mE/mEfGHxLvdPQrcbpjLw4q_wOPirMzrR4z58KgozQ1zNY.cache +1 -0
  169. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mM/mMZ3DR5b7kx70JtEg-ImWOa_V1jnHcWgHqNqapxIMXk.cache +0 -0
  170. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mX/mXCT6vriuTtwLaKGnTa5hwXSrwGtAmP6pV5lmjbHaYM.cache +0 -0
  171. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mZ/mZjIy4zRS4hbS4vWHpdKd7jeZgLatEx_nlFqv_KSCrs.cache +0 -0
  172. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mg/mge36-9r2gGuKcPoghbLDM72AV4gIVTl6gQDbk7hrkg.cache +1 -0
  173. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/nK/nKZaLuUqTl9pf5Nb1oVuabxd74q4oN8YTBeo6bNd-Vk.cache +0 -0
  174. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/nP/nPbHGaYfJSLZ2K3YTROe7T1RPqKoBQJwawQtZ_FN1-I.cache +0 -0
  175. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/o9/o9KyTznHG0ZIHDI7kTg1Jp78qaga7gJqouXSKdocEjA.cache +1 -0
  176. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/oB/oBupyQ9cW436mBji6Rp7TtHE6CX_r8iq2sCBo0LNbc8.cache +1 -0
  177. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/oN/oN3TypgxDDLqcxy0Funa4RVCYXS-7qn6D56wgBiUT2Q.cache +1 -0
  178. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/om/omGcA_eTFAFIH3RJaPOpEW3yz0074cob3hozQFLOAxk.cache +1 -0
  179. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/p0/p0WHrZZBaXbPaNj5XmQGTli4mi08Rv8DidQfwj28a6w.cache +0 -0
  180. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/pA/pAvUFBt71eJx7E7oQbIxrEZ8YcMo9kboyGxjk73ZWrI.cache +1 -0
  181. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/pB/pBwzUQUu-GcmLiQwn6KnbbDP0ipnVHzVaeArqdpqi98.cache +0 -0
  182. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/pC/pCePfKbmTQ6s2Tl7ki3oBput2ruhpCzpa6Vvejbb5xg.cache +1 -0
  183. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/q6/q6BYa32YJF11eGVapO4ouNl6gayPIsARgMavlzZmoi0.cache +0 -0
  184. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/qY/qY78GTTnufmP1eP2CE16x833zGfQ0F5EVCFtUTMQ7Mw.cache +1 -0
  185. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/qm/qmZZzCnL9PLIyZ0iBu6Alr69AUfHHI1fKdNRRgG04yg.cache +1 -0
  186. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/s5/s5yv3jYvjyKZJ8SMzpj94eMKEuX46lAWV1ApHF-6bsM.cache +1 -0
  187. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/sO/sOBPF_p4Te56V9vdLV0Ywn6djNbmdPSIzvgYNPnAXYc.cache +0 -0
  188. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/sv/sv0a_JAC4GSc_cK-2OUAzhFwm_K3qzSfDefwpcqOCk4.cache +1 -0
  189. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/sw/sw2EAksRkslJNoJJCTS2FPOfHWCYvsS86AxmRMPjens.cache +1 -0
  190. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/t1/t1cv6bP9cTAIs82lyIsnXGeAwB1KNVY5_5rgUvelr04.cache +0 -0
  191. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/tO/To1SPyNegqysLIqhSzrNQPh1VKKj19MespjJediCde4.cache +1 -0
  192. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/tO/tOPkZNrO9FRDhSlCf7VWOexxRq2CE2X4_6KjyxJkq2A.cache +0 -0
  193. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/tR/tRoxwnX8bACHK5pW9tIi4ILY4XuYTIpueH0fGr2t0rc.cache +1 -0
  194. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/t_/t_bP70PmOB70862dwKmCTkmZuzTqCreOzNYW4Yn2n6A.cache +1 -0
  195. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/uj/ujdE_ewC5UIxr6uw5F7YRfKKWiu8-15wzBlOjYHsnkQ.cache +1 -0
  196. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ut/ut8uBMdgxX8_wfU0l6kGew6H8TLXAj74kFnaI252F3k.cache +1 -0
  197. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ut/utQEOZtBKQK_bUUDeZX4Mgk00L4AOMVyq6zrKAoo1Xw.cache +0 -0
  198. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/vm/vmjBl9ZCF5hj4sG4e2nid94GcRQYmsOsu-_Q3Zlud5c.cache +0 -0
  199. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/vz/vzBoVc4GQWi4UFp-4dBJnzrhyUuokPV8SCOxsdpOht8.cache +0 -0
  200. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/wM/wMWxmf8BN_NAJRCyardukpfDMwts44Bz2a8doi-49Rg.cache +1 -0
  201. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/x7/x7KkTV3ibfIEysLB_ug5bfmnn2VLV_BldukPR3EoPBk.cache +0 -0
  202. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/x7/x7iSOdqAIVmVpn9ujTwJ_C7EqUgmMSri5vjjHdRIX10.cache +1 -0
  203. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/xY/xYdD9O1JRIfpVj9Kw_b3JTUBQZLI_dcy-bf9uXEp-jg.cache +0 -0
  204. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/xx/xxkulLgT-tkVeDC50gUXRGGMou47BUdlYOwgs0j5muY.cache +1 -0
  205. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/yn/yn_3aZZwyjcI0O6fwisZ7zvcu4Gq5bV31g3tHFxfQNg.cache +1 -0
  206. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/yq/yqwjyepbYY4ctoMOySWiOIWUYwzl_BczAmXqJ5DPvb0.cache +0 -0
  207. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/z9/z9HQmzff5j_6CFyk6eQ52nYt9cPLXsxDQY0Yep1Hz-0.cache +1 -0
  208. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/zM/zMvcc87IG1SRbqwUNtWQfHgeWr5XN36OU8vg-v3rUus.cache +0 -0
  209. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/zn/znjQpjNzh1iUAe9DljeFghnStRvqNIr1GuOTibVcEJQ.cache +0 -0
  210. data/test/dummy/tmp/testrep/BazQuux.txt +5 -0
  211. data/test/dummy/tmp/testrep/FooBar.txt +5 -0
  212. data/test/dummy/tmp/testrep/NewPage.txt +5 -0
  213. data/test/dummy/tmp/testrep/users/testy.json +1 -0
  214. data/test/dummy/tmp/wikirep/FrontPage.txt +5 -0
  215. data/test/dummy/tmp/wikirep/users/chrismo.json +1 -0
  216. data/test/dummy/wikirep/EncryptedPage.txt +0 -0
  217. data/test/dummy/wikirep/FrontPage.txt +11 -4
  218. data/test/dummy/wikirep/users/chrismo.json +1 -0
  219. data/test/helpers/wiki_helper_test.rb +2 -0
  220. data/test/lib/clwiki/clwiki_test_helper.rb +19 -2
  221. data/test/lib/clwiki/file_owner_test.rb +58 -0
  222. data/test/lib/clwiki/file_test.rb +85 -56
  223. data/test/lib/clwiki/memory_index_test.rb +61 -0
  224. data/test/lib/clwiki/page_test.rb +71 -148
  225. data/test/lib/clwiki/test_base.rb +19 -19
  226. data/test/test_helper.rb +7 -5
  227. metadata +398 -23
  228. data/lib/cl_wiki/find_in_file.rb +0 -33
  229. data/lib/cl_wiki/index.rb +0 -458
  230. data/lib/cl_wiki/tools/cron.reminders.rb +0 -241
  231. data/lib/cl_wiki/tools/movepages.rb +0 -27
  232. data/lib/cl_wiki/tools/pagestomove.txt +0 -56
  233. data/lib/cl_wiki/tools/rublog/clWiki.rb +0 -62
  234. data/lib/cl_wiki/tools/rublog/readme.txt +0 -2
  235. data/lib/cl_wiki/tools/singlepage.rb +0 -58
  236. data/lib/cl_wiki/tools/test/singlepagetest.rb +0 -9
  237. data/lib/cl_wiki/tools/thunderbird.rb +0 -23
  238. data/test/lib/clwiki/find_in_file_test.rb +0 -111
  239. data/test/lib/clwiki/index_test.rb +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71fc0798c710ba213d639a8f4cff5ffc734679a002f862401ac9cec75c195019
4
- data.tar.gz: d7ed5d896d504b742f681653b4717edf04901f7d295e3ac573dd79f64a8ff598
3
+ metadata.gz: ba4bfd93b170a0f9b7069a528ae41c3e1af419a1291ef16c562ee355183db5d1
4
+ data.tar.gz: d0e2357acf439f466f82515da3f5f6d145020ba6c96f14016428e2837ff8cbcb
5
5
  SHA512:
6
- metadata.gz: 33e5916f65f7f1c0708b8e99bd5aaeda2882dbcc153588e6f2775f5f89827c00c322e42e567df8e7029fa1e13b7650ea2f429a1e4677ad4fd06e689ce71db8fc
7
- data.tar.gz: 76783cc36ba99086af87927c675a3260193e20e48b853d8ec6de082c5031bc746f9d6f0780d39157338e2f2af66c308b7b5d9cff78a4de30aee18b77657291a8
6
+ metadata.gz: 98fa236e8b3a848923e3d1f4a50d6eeb930f83c87362c45edc196d6befaf73387516fc705f32f8d23415777771249ada16e3214052a577ecd0775a6f56b846ed
7
+ data.tar.gz: 9d488ec965530da723cd8b8eab332365be9e445b59f91a09e30f61be4327738569367af6f16b880a479e8c249a7b8829c69c0af17a9f520d86ada75e6cc99fe0
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'bundler/setup'
3
5
  rescue LoadError
@@ -14,7 +16,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
16
  rdoc.rdoc_files.include('lib/**/*.rb')
15
17
  end
16
18
 
17
- APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
19
+ APP_RAKEFILE = File.expand_path('test/dummy/Rakefile', __dir__)
18
20
  load 'rails/tasks/engine.rake'
19
21
 
20
22
  Bundler::GemHelper.install_tasks
@@ -35,13 +37,11 @@ end
35
37
  RSpec::Core::RakeTask.new(:spec)
36
38
 
37
39
  task :tests do
38
- errors = %w(test spec).collect do |task|
39
- begin
40
- Rake::Task[task].invoke
41
- nil
42
- rescue => e
43
- { task: task, exception: e }
44
- end
40
+ errors = %w[test spec].collect do |task|
41
+ Rake::Task[task].invoke
42
+ nil
43
+ rescue StandardError => e
44
+ {task: task, exception: e}
45
45
  end.compact
46
46
 
47
47
  if errors.any?
@@ -50,4 +50,14 @@ task :tests do
50
50
  end
51
51
  end
52
52
 
53
- task default: :tests
53
+ task :rubocop do
54
+ sh 'bundle exec rubocop'
55
+ end
56
+
57
+ task :rubocop_metrics do
58
+ sh 'bundle exec rubocop -c .rubocop-metrics.yml'
59
+ end
60
+
61
+ task default: :tests
62
+ task default: :rubocop
63
+ task default: :rubocop_metrics
@@ -1,4 +1,32 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ClWiki
2
4
  class ApplicationController < ActionController::Base
5
+ before_action :authorized, if: -> { $wiki_conf.use_authentication }
6
+ before_action :initialize_index, if: -> { $wiki_conf.use_authentication }
7
+ helper_method :current_user
8
+ helper_method :logged_in?
9
+
10
+ def current_user
11
+ User.find(session[:username])&.tap do |user|
12
+ user.cached_encryption_key = Base64.decode64(session[:encryption_key])
13
+ end
14
+ end
15
+
16
+ def current_owner
17
+ current_user || ClWiki::PublicUser.new
18
+ end
19
+
20
+ def logged_in?
21
+ !current_user.nil?
22
+ end
23
+
24
+ def authorized
25
+ redirect_to login_url unless logged_in?
26
+ end
27
+
28
+ def initialize_index
29
+ ClWiki::MemoryIndexer.instance(page_owner: current_owner)
30
+ end
3
31
  end
4
- end
32
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cl_wiki/page'
2
4
 
3
5
  module ClWiki
@@ -5,24 +7,34 @@ module ClWiki
5
7
  before_action :redirect_legacy_cgi_urls
6
8
  before_action :initialize_formatter
7
9
  before_action :assign_page_name
8
- before_action :redirect_to_front_page_if_bad_name, :only => :show
10
+ before_action :redirect_to_front_page_if_bad_name, only: :show
9
11
 
10
12
  def show
11
- @page = ClWiki::Page.new(@page_name)
13
+ @page = instantiate_page
12
14
  @page.read_content
13
15
  @page
14
16
  end
15
17
 
16
18
  def edit
17
- @page = ClWiki::Page.new(@page_name)
19
+ @render_encryption_ui = $wiki_conf.use_authentication
20
+
21
+ @page = instantiate_page
22
+ @encrypt_default = determine_encryption_default
23
+
18
24
  @page.read_raw_content
19
25
  @page
20
26
  end
21
27
 
22
28
  def update
23
- @page = ClWiki::Page.new(@page_name)
24
- @page.update_content(params[:page_content], Time.at(params[:client_mod_time].to_s.to_i))
25
- redirect_to params[:save_and_edit] ? page_edit_url(:page_name => @page.full_name.strip_slash_prefix) : page_show_url(:page_name => @page.full_name.strip_slash_prefix)
29
+ @page = instantiate_page
30
+
31
+ mtime = Time.at(params[:client_mod_time].to_s.to_i)
32
+ encrypt = params[:encrypt].present?
33
+ @page.update_content(params[:page_content], mtime, encrypt)
34
+
35
+ redirect_to params[:save_and_edit] ?
36
+ page_edit_url(page_name: @page.page_name) :
37
+ page_show_url(page_name: @page.page_name)
26
38
  end
27
39
 
28
40
  def find
@@ -33,40 +45,30 @@ module ClWiki
33
45
  hits = search(@search_text)
34
46
 
35
47
  hits.each do |full_name|
36
- @formatter.fullName = full_name
37
- @results << "#{@formatter.convertToLink(full_name)}"
48
+ @formatter.full_name = full_name
49
+ @results << @formatter.convert_to_link(full_name).to_s
38
50
  end
39
51
  end
40
52
  end
41
53
 
42
54
  def search(text)
43
- case $wiki_conf.useIndex
44
- when ClWiki::Configuration::USE_INDEX_NO
45
- finder = FindInFile.new($wiki_path)
46
- finder.find(text)
47
- finder.files.collect do |filename|
48
- filename.sub($wikiPageExt, '')
49
- end
50
- else
51
- ClWiki::IndexClient.new.search(text)
52
- end
55
+ ClWiki::MemoryIndexer.instance.search(text)
53
56
  end
54
57
 
58
+ # recent _published_ pages.
55
59
  def recent
56
- finder = FindInFile.new($wiki_path)
57
- finder.find($wiki_conf.publishTag || '.')
58
- @pages = finder.files.collect do |filename|
59
- p = ClWiki::Page.new(filename.sub($wikiPageExt, ''))
60
- p.read_page_attributes
61
- p
62
- end
63
- @pages = @pages.sort { |a, b| b.mtime <=> a.mtime }[0..9]
60
+ page_names = ClWiki::MemoryIndexer.instance.recent(10, text: $wiki_conf.publishTag)
61
+
64
62
  without_header_and_footer = false
65
- @pages.each { |p| p.read_content(without_header_and_footer) }
63
+ @pages = page_names.map do |page_name|
64
+ ClWiki::Page.new(page_name, owner: current_owner).tap do |page|
65
+ page.read_content(without_header_and_footer)
66
+ end
67
+ end
66
68
 
67
69
  respond_to do |format|
68
70
  format.html
69
- format.rss { render :layout => false }
71
+ format.rss { render layout: false }
70
72
  end
71
73
  end
72
74
 
@@ -77,30 +79,42 @@ module ClWiki
77
79
  def redirect_legacy_cgi_urls
78
80
  if request.fullpath.start_with?(legacy_path)
79
81
  page_name = (params[:page] || front_page_name).split('/')[-1]
80
- case
81
- when request.query_parameters.include?('edit')
82
- redirect_to page_edit_url(:page_name => page_name), status: '301'
83
- else
84
- redirect_to page_show_url(:page_name => page_name), status: '301'
82
+ if request.query_parameters.include?('edit')
83
+ redirect_to page_edit_url(page_name: page_name), status: '301'
84
+ else
85
+ redirect_to page_show_url(page_name: page_name), status: '301'
85
86
  end
86
87
  end
87
88
  end
88
89
 
89
90
  def assign_page_name
90
91
  @page_name = params[:page_name]
91
- @page_name = @page_name.ensure_slash_prefix if @page_name
92
92
  end
93
93
 
94
94
  def redirect_to_front_page_if_bad_name
95
- if ((@page_name.blank?) || (!@formatter.is_wiki_name?(@page_name))) ||
96
- (!$wiki_conf.editable && !ClWiki::Page.page_exists?(@page_name.ensure_slash_prefix))
97
- redirect_to page_show_url(:page_name => front_page_name)
98
- return
95
+ if (@page_name.blank? || !@formatter.is_wiki_name?(@page_name)) ||
96
+ (!$wiki_conf.editable && !ClWiki::Page.page_exists?(@page_name))
97
+ redirect_to page_show_url(page_name: front_page_name)
98
+ nil
99
99
  end
100
100
  end
101
101
 
102
102
  def initialize_formatter
103
103
  @formatter = ClWiki::PageFormatter.new
104
104
  end
105
+
106
+ private
107
+
108
+ def instantiate_page
109
+ ClWiki::Page.new(@page_name, owner: current_owner)
110
+ end
111
+
112
+ def determine_encryption_default
113
+ if $wiki_conf.use_authentication
114
+ @page.is_new? ? $wiki_conf.encryption_default : @page.content_encrypted?
115
+ else
116
+ false
117
+ end
118
+ end
105
119
  end
106
120
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ClWiki
4
+ class SessionsController < ApplicationController
5
+ before_action :skip_all_if_not_using_authentication
6
+ skip_before_action :authorized, only: %i[new create]
7
+ skip_before_action :initialize_index, only: %i[new create]
8
+
9
+ def new
10
+ end
11
+
12
+ def create
13
+ @user = User.find(params[:username])
14
+ password = params[:password]
15
+ if @user&.username == $wiki_conf.owner && @user&.authenticate(password)
16
+ session[:username] = @user.username
17
+ session[:encryption_key] = Base64.encode64(@user.derive_encryption_key(password))
18
+ redirect_to root_url
19
+ else
20
+ redirect_to login_url
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def skip_all_if_not_using_authentication
27
+ redirect_to root_url unless $wiki_conf.use_authentication
28
+ end
29
+ end
30
+ end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ClWiki
2
4
  module ApplicationHelper
3
5
  end
4
- end
6
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ClWiki
4
+ class User < ClWiki::UserBase
5
+ include ActiveModel::SecurePassword
6
+ include ActiveModel::Serializers::JSON
7
+
8
+ has_secure_password
9
+
10
+ attr_reader :encryption_key
11
+ attr_accessor :username, :password_digest
12
+
13
+ validates :username, presence: true
14
+
15
+ def attributes
16
+ {username: self.username,
17
+ password_digest: self.password_digest}
18
+ end
19
+
20
+ def attributes=(hash)
21
+ hash.each do |key, value|
22
+ send("#{key}=", value)
23
+ end
24
+ end
25
+
26
+ def self.create(username, password)
27
+ self.new.tap do |u|
28
+ u.username = username
29
+ u.password = password
30
+ u.save
31
+ end
32
+ end
33
+
34
+ def self.find(username)
35
+ user_file = users_root("#{username}.json")
36
+ if ::File.exist?(user_file)
37
+ user = self.new
38
+ json = ::File.read(user_file)
39
+ user.from_json(json)
40
+ end
41
+ end
42
+
43
+ def save
44
+ ::File.open(User.users_root("#{username}.json"), 'w') do |f|
45
+ # as_json yields a Hash for some reason, which then can't be parsed
46
+ # when read from disk.
47
+ f.write(self.attributes.to_json)
48
+ end
49
+ end
50
+
51
+ def self.users_root(filename)
52
+ root = FileUtils.makedirs(::File.join($wiki_conf.wiki_path, 'users'))
53
+ ::File.join(root, filename)
54
+ end
55
+
56
+ # Generate a consistent key that can be used with Lockbox for encrypting
57
+ # content, and that is not persisted anywhere.
58
+ def derive_encryption_key(password)
59
+ if authenticate(password)
60
+ pass = 'secret'
61
+ salt = 'static salt' # so the same key is derived each time
62
+ iter = 10_000
63
+ hash = OpenSSL::Digest::SHA256.new
64
+ len = hash.digest_length
65
+ OpenSSL::KDF.pbkdf2_hmac(pass,
66
+ salt: salt,
67
+ iterations: iter,
68
+ length: len,
69
+ hash: hash)
70
+ else
71
+ raise 'Could not authenticate password'
72
+ end
73
+ end
74
+
75
+ # Never, never, persist this! It needs to be pushed in from the session
76
+ # store, for usage down deeper in the ClWiki `lib` code.
77
+ def cached_encryption_key=(value)
78
+ @encryption_key = value
79
+ end
80
+
81
+ def name
82
+ self.username
83
+ end
84
+
85
+ def can_encrypt?
86
+ true
87
+ end
88
+ end
89
+ end
@@ -1,8 +1,12 @@
1
- <%= form_tag(page_show_path(:page_name => @page.full_name)) do %>
1
+ <%= form_tag(page_show_path(:page_name => @page.page_name)) do %>
2
2
  <%= hidden_field_tag 'client_mod_time', @page.mtime.to_i.to_s %>
3
3
 
4
4
  <%= text_area_tag 'page_content', @page.raw_content, rows: $wiki_conf.edit_rows, cols: $wiki_conf.edit_cols %>
5
5
  <br/>
6
6
  <%= submit_tag 'Save', name: 'save' %>
7
7
  <%= submit_tag 'Save and Continue Editing', name: 'save_and_edit' %>
8
+ <% if @render_encryption_ui %>
9
+ <%= label_tag 'encrypt', 'Encrypt contents:', class: 'findDetails' %>
10
+ <%= check_box_tag 'encrypt', 'yes', @encrypt_default %>
11
+ <% end %>
8
12
  <% end %>
@@ -1,6 +1,6 @@
1
1
  <% @pages.each do |page| %>
2
2
  <div class='wikiHeader'>
3
- <span class='pageName'><%= @formatter.convertToLink(page.name).html_safe %></span>
3
+ <span class='pageName'><%= @formatter.convert_to_link(page.name).html_safe %></span>
4
4
  </div>
5
5
  <%= page.content.html_safe %>
6
6
  <% end %>
@@ -1,18 +1,20 @@
1
- xml.instruct! :xml, :version => "1.0"
2
- xml.rss :version => "2.0" do
1
+ # frozen_string_literal: true
2
+
3
+ xml.instruct! :xml, version: '1.0'
4
+ xml.rss version: '2.0' do
3
5
  xml.channel do
4
- xml.title "clWiki"
5
- xml.description "clWiki"
6
+ xml.title 'clWiki'
7
+ xml.description 'clWiki'
6
8
  xml.link root_url
7
9
 
8
- for page in @pages
10
+ @pages.each do |page|
9
11
  xml.item do
10
12
  xml.title page.name
11
13
  xml.description page.content
12
14
  xml.pubDate page.mtime.to_s(:rfc822)
13
- xml.link page_show_url(:page_name => page.name)
14
- xml.guid page_show_url(:page_name => page.name)
15
+ xml.link page_show_url(page_name: page.name)
16
+ xml.guid page_show_url(page_name: page.name)
15
17
  end
16
18
  end
17
19
  end
18
- end
20
+ end
@@ -0,0 +1,10 @@
1
+ <h1>Login</h1>
2
+
3
+ <%= form_tag login_path do%>
4
+ <%= label_tag :username%><br>
5
+ <%= text_field_tag :username%><br>
6
+ <%= label_tag :password%><br>
7
+ <%= password_field_tag :password%><br>
8
+
9
+ <%= submit_tag "Login" %>
10
+ <%end%>
@@ -2,25 +2,6 @@ production:
2
2
  # path to the root directory that stores the page files
3
3
  wiki_path: wikirep
4
4
 
5
- # useIndex can be one of the three numbers:
6
- # 0 No Index
7
- # 1 DRb Index Server
8
- # 2 Local Index Server
9
-
10
- useIndex: 0
11
-
12
- # useIndexForPageExists determines if the index is referenced for
13
- # determining if a page exists rather than querying the file system. In
14
- # some cases, the file system (due to OS caching and whatnot) outperforms
15
- # the index. This option is ignored if useIndex is set to No Index.
16
-
17
- useIndexForPageExists: false
18
-
19
- # the port the DRb Index Server uses. This setting is irrelevant if
20
- # useIndex is anything other than 1
21
-
22
- # indexPort: 9111
23
-
24
5
  # set this to false for a read-only wiki. Useful with Blogki
25
6
 
26
7
  editable: false
@@ -34,18 +15,13 @@ production:
34
15
  # BETA option -- probably not even a sample.template.htm included in the
35
16
  # distribution)
36
17
 
37
- # template mytemplate.htm
18
+ # template: mytemplate.htm
38
19
 
39
20
  # If you want to restrict the Recent view to only published pages, you
40
21
  # can configure a custom tag here. If this isn't defined, then every
41
22
  # page will appear on the Recent view.
42
23
  #
43
- # publishTag <publish>
44
-
45
- # showSourceLink can be turned on to add a page link in the footer that
46
- # is a file:// url direct to the raw page. Default is false.
47
- #
48
- # showSourceLink true
24
+ # publishTag: <publish>
49
25
 
50
26
  # time format for display of last page update
51
27
  #
@@ -55,10 +31,22 @@ production:
55
31
  #
56
32
  custom_formatter_load_path: []
57
33
 
34
+ # Require a user account to access the wiki. Defaults to false.
35
+ #
36
+ # use_authentication: false
37
+
38
+ # Default setting for encryption option on edit page. Only used if
39
+ # use_authentication is true.
40
+ #
41
+ # encryption_default: false
42
+
43
+ # The owning user account for the wiki. Must be set if
44
+ # use_authentication is true.
45
+ #
46
+ # owner: username
47
+
58
48
  test:
59
49
  wiki_path: tmp/testrep
60
- useIndex: 0
61
- useIndexForPageExists: false
62
50
  editable: true
63
51
  page_update_format: '%B %d, %Y'
64
52
  custom_formatter_load_path: []
@@ -66,8 +54,6 @@ test:
66
54
  development:
67
55
  # path to the root directory that stores the page files
68
56
  wiki_path: wikirep
69
- useIndex: 0
70
- useIndexForPageExists: false
71
57
  editable: true
72
58
  page_update_format: '%B %d, %Y'
73
59
  custom_formatter_load_path: []