clwiki 2.4.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []