clwiki 2.4.0 → 3.0.4

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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +19 -9
  3. data/app/controllers/cl_wiki/application_controller.rb +34 -1
  4. data/app/controllers/cl_wiki/page_controller.rb +53 -38
  5. data/app/controllers/cl_wiki/sessions_controller.rb +41 -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 +136 -118
  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 +40450 -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/0D/0DBWc4mmZE_dxtKcI5zwuwFah928eWto3S4tV-h1qUY.cache +1 -0
  41. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/0k/0ktSefuSiZXp-1v5uXwST57lRoAF2HvHzclO4Gtftgo.cache +2 -0
  42. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/1V/1VmPI9-8O9Y8OP-JxSXl7-yNRMZHqapeh2drmkXiRGE.cache +1 -0
  43. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/28/28R8437OhGS51UlWKpnAZIJ3qJWxLaA1BJtFIEjW9aw.cache +0 -0
  44. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/2W/2WKPDryRtGzZO6Uedw4RNjnI5M9YVH-IbFg5GvLvTTQ.cache +0 -0
  45. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/2v/2vD9gOomeGZ1sPMc23Aqsbr95WAu7fDeShhuZuf62cY.cache +1 -0
  46. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/3G/3GuA3P7RM10Vv7NgdH65pwfAH7gMHlJ_xBUO74i-ZjM.cache +0 -0
  47. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/3S/3SzCkB81tc9XbtFdEYxCeR3If141gvhEnHchU_C6hHs.cache +1 -0
  48. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/41/41dY2GtQJAt3CmkQn8IDa9B3clQaUT6XymanCfFZR2o.cache +0 -0
  49. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/46/46WEPovJzlkEgsdG0aV08HiNsRkf0L8Txt1SWLi4atg.cache +1 -0
  50. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/4I/4Ir0PJhTRUd9iGlSu6n2AREP-_amedFe4-1fKwB2wvg.cache +1 -0
  51. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/5L/5LXSsjTcB5Un8FHlrhi6AOjxwgzWoXeWBhU_hi1gdcg.cache +1 -0
  52. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/67/67V_0cxwrU68Onen7N2Lb9bTd1jLulH06F9zh1VgZ0U.cache +1 -0
  53. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/6A/6AXD3XLczHK8MPb5e10-7sLcS45ZrP7Iwgyo9xle0nU.cache +0 -0
  54. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/6D/6D8TdXG6KyMkGDvPbv87qUCDz9_6gRZbNAohojB484w.cache +1 -0
  55. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/7L/7LVfTxjfHpOSp2FeG-uhloqIUqIZ7uE3nT40dqhoqY8.cache +2 -0
  56. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/7b/7bceaEE3qsyoVjeou6RR-V9w2Wgzraq0OI2erU4s9ew.cache +1 -0
  57. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/7h/7hRfgp9EsoD33qh0aNXeyg9qdGapPlUT6FmcL8xztY4.cache +0 -0
  58. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/8c/8cq-JtJ9Zwg4F0bFdkqaGHjdB7a9JBmfDO_sczTWycI.cache +1 -0
  59. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/8d/8d2c1LpTZA9uuWml5O7SZIziW2o693h9gykizTBPBqw.cache +0 -0
  60. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/8h/8hO7EIQ5iOa2rL6ZlP318Lrk0unB2CfhHCI0TrUr-Oo.cache +0 -0
  61. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/8x/8x0PXM3vatUzVGk-vKi80S7LXrGb6bE-3EzEj54VNak.cache +1 -0
  62. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/92/92txvq5_0oqyi4tKR-CTpu_hucsOQk4gSa_Soq_XIlc.cache +0 -0
  63. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/95/9501Slgi11UyN1aBXNCu4pxOpaRKyBcmSmiqPPJanmw.cache +0 -0
  64. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/9v/9vfh8eoLcnq3s_rolIXPs15SPTQWGxJrrjpJ3PoABek.cache +1 -0
  65. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/9w/9w-0hdVYmxONDHQlpGn7DFzlRA3oXqpW4x3t9LBUU6M.cache +1 -0
  66. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/B3/B385Es3x0hpGSQNWzSjiDcExPuEV9m1dUZWlEp5zGbw.cache +0 -0
  67. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/BR/BRBOvy22uVEx9Z5Aal_0BfPilVYEQl6AYXG2u8yBqBg.cache +0 -0
  68. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/BX/BXdNycvZI2UN7cgqvk6P4MQCc1PH2bTwa9i9vP-s-jk.cache +0 -0
  69. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/CA/CA9tJ74jTtOpYcNWZPrQLc26SkJdAu1BLuwFsWqiFX0.cache +0 -0
  70. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/CO/CO-z80mMyQGRy-BwknxOV5bI2IFbcMMNc05j7v8Nqso.cache +0 -0
  71. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/CY/CYGZRzrr6e2EOdwxmPLy_tYjneXGrr_uhTMALX2jyGY.cache +1 -0
  72. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Cg/CgPqTXtSkCxEox0z95JfY89MndA2GhTTQK39fjKk6QU.cache +1 -0
  73. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ct/CtQeoxqXfctXd_NvChnCVaJ_cCjNuXJMv3LBXhswU6A.cache +0 -0
  74. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Dc/DcZ_YfpX7rLYFw-u7jSJCRp_z0iIyB7XKOcwm1cQexk.cache +0 -0
  75. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ex/Exqg59Ton1SZt_QH4hMa7wUFOAuIQnCan8B9578NzIg.cache +0 -0
  76. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/F5/F5c-QANC5X3kApAecuyiMZEme0NT_UUB6SjxKvb0ALg.cache +1 -0
  77. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Fd/FdwPBPhLtL4s8RSPhJ53YoYoFdRkNxANV_zQYw-KsVc.cache +1 -0
  78. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Fz/FzgTyTGCIlSZyXn77nSzsYhiD2AFBrNiMOwNeBtmV8Y.cache +0 -0
  79. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/GK/GKrbCoxDofzkQCmA17lE84OT6RW_6NKm7jwyZ4n2T6s.cache +0 -0
  80. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Gh/GhVuWwPtbWpQY_Ny4MyilnH9iUqCPxTDzOonAXM4od8.cache +1 -0
  81. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Gv/GvQrSgGYXiR-rgsPHFZq1oJ5zCkDK54muqIw6KW2GyA.cache +0 -0
  82. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Gw/Gwhhfk9vS7QWmHsW90WtAt0_Rp_7AIM-ZcHmEqLf_Rg.cache +1 -0
  83. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/H5/H5Yxi2VJxpyMb-cbgwBNua8O2zZ03Jk4ByV6yhIzAsQ.cache +0 -0
  84. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/I0/I0OpFIfCc595P02GZa3LUD1uD-Payl41dWaW3oZSK7g.cache +1 -0
  85. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ID/IDb8KoiLtmLZLuTayZZRFbZN0JILZeJejeUyYRRGeAA.cache +0 -0
  86. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/IQ/IQoDS19BmJjvixXd16O_7P6DB-GRUEZgdNJexJ88fIc.cache +1 -0
  87. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/I_/I_zDBUxxL4b2Wk9_qqVs56Abw1jGccc4FgvKwuscswQ.cache +1 -0
  88. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ig/IgcuJMmmdeYrq2F3D721tC7ficyRm92HIrLkim5DCxQ.cache +1 -0
  89. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/J2/J2LffQpwOiS012wB_C4iABoBukTOT8hmHKFwpxPfYLQ.cache +1 -0
  90. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/JI/JITjXC3hXUPgOQhDYsVjhPNjtTISt0j5uz2bjfoiSHI.cache +1 -0
  91. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/KL/KL75rsyvMJSIkYkXRijxh8cs7V1wtfLPjuodISQK5vc.cache +0 -0
  92. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/KY/KYIakAXVeKvIhu5WQ8kwH9RU6xpV8HJfKrBqHy00VvE.cache +1 -0
  93. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Kw/KwqVMeMNxvnaSP-a-H5nkYyxloW_xoqR5JhEnqJ9puQ.cache +1 -0
  94. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/L1/L1KghIbeezpqVDyhAbCDc4pG11ElC5JpUl319-ZlZn8.cache +0 -0
  95. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Lh/LhI7QMLwiVavmyvwYzdc_t_V9OATXaBO8aCB2swJFCk.cache +1 -0
  96. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Lh/LhqYyoCtzXpfZq6UOhmZuZLSaAwZRX44sHfwPvPqezc.cache +2 -0
  97. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Lo/Lovn2yBpV04WnAQwZeM3hLL015H5syYBH2ufgIc6qCM.cache +1 -0
  98. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Lz/LznMZWa43whMHpqnPRsbUfREY3y_fiXQKaiKVEYW4fw.cache +0 -0
  99. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/MC/MC7GYdrSShtV64GB3hoINaYL3vCRZKq9KvwcwrJAdQo.cache +1 -0
  100. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/MU/MU6iF1YPAQqpVK_kVAtiJPtbHaYpYdOcO0g5bJ9exj8.cache +0 -0
  101. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Md/MdIg3XLcnbFsMXC-6xslVtmBvWH7Q21BSt9l5pm305o.cache +0 -0
  102. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Mw/Mwfi5Xeky61jhIuc6ooo4439CHOyz1hS48_taMRSlKM.cache +1 -0
  103. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ni/Ni5yuK9FFnhLe5HciROve12UIYstBdESWm0LfdcuVVs.cache +1 -0
  104. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Nz/Nz3hkLq4WlqgoHg_ChdHSXbP7fVmCWCTw0lH0jkMmDg.cache +0 -0
  105. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/O3/O38OvSNrhXKbxauuC8GOBBnKrt2-rPaDmfyrXScgHcA.cache +1 -0
  106. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/OS/OSm-zAlxXS63lBjvzJeSWfqq5d3D9fu-_nBVFWyQ4j0.cache +0 -0
  107. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Oa/Oazc9AJ4e_67dU0aArJeCNEeWJKMIFPtAJtxTJoUKcs.cache +1 -0
  108. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/P1/P1WYRlLMdpqE0KcFDUng5g9am4POfcOwowV2amR4tZ0.cache +1 -0
  109. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/PV/PVDpEMY_ha4kHETTb3QvjOBoBUP4PMjNDNcIAgmDy2I.cache +1 -0
  110. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Pl/PldDxSvU1o_UFPYTE0GJmUS9mHQXH88zEw5HN6GtlRE.cache +1 -0
  111. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Pu/PuU5S_LPnhAX43U1VVN3qP_sv0ph4stXSGo7I0e_jOw.cache +1 -0
  112. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/QJ/QJ6RPZNUkui_k3wTkb62zo8wczYY7q0B174GfSJjjWE.cache +2 -0
  113. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/QX/QXCyCL-Eeb3uHm9iOvs4anspZqeFbQnNyzDfIsXgzC8.cache +0 -0
  114. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/R1/R1F4Qf-kXTMH0fTLahalFTHtNBvgDfkOkrPyW8zeN_E.cache +0 -0
  115. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/R1/R1__Y-gz4zkDYrXWyCf6YTkvXO0RZlrpK6ynGGVuvnM.cache +0 -0
  116. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/R2/R2Xqb6eAeUW2xTaTaTjlkyUCirkb1qfYgW2CyY80VjM.cache +1 -0
  117. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/RM/RMXouh7GkRuhy8S6jnpxFD27HRVT0LEHj9iR53ps4o4.cache +1 -0
  118. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/RV/RVmt1mCn0tykR8xyBylvh-Hvi-Am87neA2IEkYHjg-g.cache +1 -0
  119. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Sb/Sb57Q81kn_46c151CSeuOFI2UarVIlevJHmB_glTpfI.cache +0 -0
  120. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Si/SiS4qKkPGbaIXzg2rpGa3SepickBkHi53MjRZreIVyw.cache +0 -0
  121. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/TF/TFylLOF6Be_hud-nZYcvvbD3NeyRKE8NUvv_JsuJ4cY.cache +0 -0
  122. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Tg/TgTXCuKAEg1DI5zjHO8tGMGuQGC9BRt9vgDZj2FdSa8.cache +1 -0
  123. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/UI/UIyRfqj_T27DnyWJiZK9BdUGTIDTQ9M953ArtrYz5fM.cache +1 -0
  124. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/U_/U_F-o3fo7oUYyn0O5KBlt3jOF53X_-4UuZb-_alPZPk.cache +1 -0
  125. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/U_/U_KCsVrX_QoGJ_FpUpCNU3XMT36CThwu8_0HYj_2k4w.cache +1 -0
  126. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/U_/U_ie5WwVJPItNZrqfbIrnZpaRokYT5klrYU92QSugd8.cache +0 -0
  127. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ub/Ub-oUCoAiliSW8ohVsmtsflc4nPeiBvcjzgNbPLYQRc.cache +0 -0
  128. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ud/UdvIJcVNQ_08Vaoyx4KuRGNjazpB9-qjOtDMTud8R0Y.cache +1 -0
  129. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Uz/UzEG5I_EszWbaSVnk497D0KfuIzsgHoPLVQd7e3mlQg.cache +1 -0
  130. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/V-/V-F9X0mrPgfTELxk9xdYnb27trOmB6nBDL973YWeOfU.cache +0 -0
  131. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/VA/VAOOXmbiiPy1jqpQQCDVrhkByG3pdeJoZCOvVkp-XVY.cache +1 -0
  132. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/VV/VVIuIm_HUOaEdZfXt-CmFQZb3ycoiXeeI-FV7nwkr0Y.cache +1 -0
  133. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/VW/VWjUCUH0gfcamZHDpILUcC_1PnGFykHGk0wh8NpIRbQ.cache +0 -0
  134. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/VX/VXHQHhwOUBuWlKPY6smpXG1xjASw927lyjUKBXBh3e0.cache +0 -0
  135. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Vn/VnE9ctuz42Ux3gd7YEwAa86NxA52PDCfU82OvtlrlX8.cache +1 -0
  136. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Vn/VnMqvZo9nqGF_5tt3gNbMyoG8jJVm0K0r1fANEBjfkw.cache +0 -0
  137. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/W1/W1YuEAoPMZTXfbxg_xWV9o2RP60SAKs5bhk7teKdL2g.cache +1 -0
  138. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/W2/W2ZyYMlYmyA7_1WcpiWhYUJa6wfPCZ5kZj_-Nuw31yM.cache +0 -0
  139. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Wg/WgwI9C5-mh_smtsTGVmH4y76T5ifM4M_hKL1fn-K8iw.cache +2 -0
  140. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Ww/WwRKzl7ldAfUY6mvA4pcF6CJPsqgy9_yparRsi8cmpY.cache +0 -0
  141. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Wy/WyWAl1y93bbTZWLS767hNEj7IMJ8fUXatNCS-25hJXE.cache +1 -0
  142. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/X5/X5GHIj6tnz-w7d-60OaYcbzJczzkTBtm24BOxzoSDdo.cache +1 -0
  143. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/X6/X6jU4SPOD_b1ks9tCApsvWRa7q8cBYCjw3gI6Dwvr34.cache +2 -0
  144. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/X8/X88lT-cwuuj8gqiNY83uVqXFgeLcaHMc9Xh2X4Iux6k.cache +0 -0
  145. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/XQ/XQ0aFc1cceisG4P8qUPhW8z1H3I71pMguVRRMgJ66cs.cache +5 -0
  146. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Xh/XhXLVYOEEwpzOBAWDdiCEpTMz7vC8wnlBHYHJkySh-0.cache +1 -0
  147. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/YB/YBJNyX7HNPq78obeHYRGnJKSVl9EtRPbcGD253-ia34.cache +0 -0
  148. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Yu/YupDX89OAJ6u3BHBW-UJgO3nDfi7hwlpf_JHlnM8b6k.cache +1 -0
  149. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ZH/ZHN5sHdNMxUCl3Ese5T5_AzQbD9WHqpgBL4PBOrgXJY.cache +1 -0
  150. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ZP/ZPRvYWthjzuQ0tqk5AdgQbeTUqhDboF8bvTtdrmg4Jo.cache +1 -0
  151. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ZV/ZVu2Ed9wpdsPLKStP971oLEJBwgJQHLInXIiQkIWC04.cache +0 -0
  152. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Zb/ZbnyIl6znMAVquD2ZD5OYA9SPXmQJYWU7V8F2Hgp3Uc.cache +0 -0
  153. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/Zj/ZjALwFkjfG3uebsyy_CeJp5VQMJLE03zxPxkNp-sZDA.cache +0 -0
  154. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/_E/_E-Bix511H4RJnJUAkPWvnNw4IThIvS9CEAku1gsVcg.cache +0 -0
  155. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/_F/_Fu404i1O4mKpjPluBsq-3FZQnyQvla_6jDnH03Lpw8.cache +2 -0
  156. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/a-/a-t90hz_PZnc6ImKhk-cIh_WBB9vi_rChKzLv4hMBqw.cache +1 -0
  157. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/a5/a5cnzGcRAu4dPakq4_DHH9GanK42Ov5O1F62oeJR4Zo.cache +1 -0
  158. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/a5/a5uFYzSt5Xm8ZjP5N42LcV7y94YTaEkIep8jBUeErBc.cache +1 -0
  159. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aJ/aJK2kxoM9CsnZpxiFvP6RoP0sxHBiix9X1P6Mhy9Dcg.cache +2 -0
  160. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aO/aOU10S2QEOBHcdKwGRfXqqHdYshmYD20LYiJIGMzIa0.cache +1 -0
  161. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aZ/aZEdK7dgijyjIs26V_QbKsDgO5JxeYXiT0Sl28M0e-U.cache +0 -0
  162. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aq/aqBnFJWuQ-xmdUL8_asWtElNRrMr0W60LVdDqpt43L8.cache +1 -0
  163. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/aq/aqNor7ePvH9sS4jPTBqDuXgPIzCEYDmzv6OL8nFaBfc.cache +2 -0
  164. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/b5/B5yawfIgrEUdQrBwKkk65ra3p7vzQakH5rHh61IUCGQ.cache +0 -0
  165. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/b5/b5KTv2Hrf5faN7X4XahT1s8L5t-EANtcFKrMEsGm3lw.cache +1 -0
  166. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/bF/bFemYCjG73k2_Ys77S7qNyW7CYcyw4bngyc0OGneI-s.cache +1 -0
  167. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/bG/bGdy8gJL8acOmxK8AbkYbxNuakf4LlMZ-zPBkyL0E-0.cache +1 -0
  168. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/bK/bKm8sxC3i0ycUMXr6pnD61MdwytUWfpNOJlBY6qJaWg.cache +1 -0
  169. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/dA/dA1M22RMQvVwb74tbFg-_237SferZuCI10s4R0zx8NI.cache +0 -0
  170. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/dF/dFOzXjFeRtB5bukRI9wGrh2O_GkOeBPnrJRMiv8_ZbM.cache +0 -0
  171. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/dw/dwbXKkD4yllXOeD4T7BKoGvLS26j9lxMkjMiIxfyt6E.cache +0 -0
  172. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/eO/eOhX0bq10_h3P-ISuztuJ9tqU9WI-YU21LY8uIKWjCI.cache +0 -0
  173. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/eT/eTgN8O1TgsFV61pclFzCmmJ9qT7MgyGvtQrmRtJoNeg.cache +0 -0
  174. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ec/ec5x3WtYVdBZAlGgRklnM5CWLyA6JeDBJT_1HOhXF4g.cache +1 -0
  175. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/eu/eu6Xg0psMCuHIWG0WjCo9wwNOlWs-Z5OH4SyGEmdTNQ.cache +1 -0
  176. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/fC/fC-TBNdh4rVupPn2ObyZeIx6OSlpBSBQZfIzywI6xx0.cache +0 -0
  177. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/fC/fCGqdV7zjLjwzE_j81Q26V2av1OhelK9ekz-obYezyM.cache +1 -0
  178. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/fR/fRIbNtGTaNqdwIDyusrUmllglSGMNnqnw7VOLvf5D_k.cache +1 -0
  179. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/fq/fq7SFxQSEFZCuS7jQj0n-BQfbJ5mpLpmJQsd9mJVq68.cache +1 -0
  180. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gG/gGBN3yxvq8azMjDv3hsSw_zLUj9KLuqHPDXZK8x8pFc.cache +0 -0
  181. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gQ/gQzw0n2XxT1vPdv-JNlsvC4baxnQXS_my3g0GHgk2DM.cache +0 -0
  182. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gc/gcwevUTNs8bX7r0PgMxjPfBObyrl1oUiYzRUtDwso20.cache +1 -0
  183. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gd/gd3J0EmNeiTh2GzxcAKItmtUnUay9NG4Sm2vkiLKvmA.cache +1 -0
  184. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gj/gjXteWe57D8FaBOQUw29N_mwHCeTQW8oLjyv8fu3wNw.cache +3 -0
  185. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/gt/gtFeEhjHn0G9WhgiMKaNtXVgNYW9s_wBLE0VGegeAN8.cache +1 -0
  186. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/hA/hA4-M5cp310ZkSe59_BWszdgXy7mmYagSRCfelGBA9o.cache +1 -0
  187. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/hc/hcXm7DBIrn3OjXXbh6UkevkxWDcflOZ9csWRVYgjSac.cache +0 -0
  188. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/hj/hje-P0mJOOD6UQ7CsJ7BNZBSdKcCkvwHijuCCtQDWMw.cache +1 -0
  189. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/iC/iC3FCadetljjEIeMWfeqqDoMxhJi6rI20BpiVxtvgS4.cache +1 -0
  190. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/iV/iV16_jyEayI_vLgHw3HFhtJAiVOCIlzFho0Yt7a4v_Y.cache +0 -0
  191. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/j6/j62KRIr4T81zq1Ujpg7AJRQdI0ry9HGKPt4nK6fRt1g.cache +1 -0
  192. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/jR/jRg0Zbr59-UMtrWO5t2VWNI3GqU7XWOUsE44dX5cPyk.cache +0 -0
  193. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/jj/jj9HUpCSrLEyONEZNLLkgJ8hJmxOCLpcVJeiBa0KDsE.cache +1 -0
  194. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/jq/jqnMk9arxuef2cdSQuxj3WOQuAfGKup3H2pjO7x1DOg.cache +0 -0
  195. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/k1/k14rvggyKI9dk-yVjn-Lk0p8qU360H_JuVG9aZ4q0OM.cache +1 -0
  196. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/kb/Kb8Z49kajAX1vyy5d4-gA8StHhQp5yOUs0wtdZ7m8Hc.cache +1 -0
  197. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/kb/kbEMkrgp2k0pezn_gFfMqA142QwoJYBKMj7cEkE-Hag.cache +1 -0
  198. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/lD/lDpZHp5gBhRdNHdj1TwWq1_LZ_a56lxeksxqaEs2efA.cache +1 -0
  199. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/lL/lLUIzpNuP0NYh0_joJRWkVJ0OF9W3CyzdFBfs3818Lc.cache +1 -0
  200. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mE/mEfGHxLvdPQrcbpjLw4q_wOPirMzrR4z58KgozQ1zNY.cache +1 -0
  201. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mM/mMZ3DR5b7kx70JtEg-ImWOa_V1jnHcWgHqNqapxIMXk.cache +0 -0
  202. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mX/mXCT6vriuTtwLaKGnTa5hwXSrwGtAmP6pV5lmjbHaYM.cache +0 -0
  203. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mZ/mZjIy4zRS4hbS4vWHpdKd7jeZgLatEx_nlFqv_KSCrs.cache +0 -0
  204. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/mg/mge36-9r2gGuKcPoghbLDM72AV4gIVTl6gQDbk7hrkg.cache +1 -0
  205. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/nK/nKZaLuUqTl9pf5Nb1oVuabxd74q4oN8YTBeo6bNd-Vk.cache +0 -0
  206. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/nP/nPbHGaYfJSLZ2K3YTROe7T1RPqKoBQJwawQtZ_FN1-I.cache +0 -0
  207. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/o9/o9KyTznHG0ZIHDI7kTg1Jp78qaga7gJqouXSKdocEjA.cache +1 -0
  208. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/oB/oBupyQ9cW436mBji6Rp7TtHE6CX_r8iq2sCBo0LNbc8.cache +1 -0
  209. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/oN/oN3TypgxDDLqcxy0Funa4RVCYXS-7qn6D56wgBiUT2Q.cache +1 -0
  210. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/oW/oWo9dphQsanmdoiEL4YOq-nygJy3mBHxuB-V0YKtqKg.cache +0 -0
  211. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/om/omGcA_eTFAFIH3RJaPOpEW3yz0074cob3hozQFLOAxk.cache +1 -0
  212. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ot/otpWM-gZogHCGUHAd2Xu_B_U36zeJ9dAR2xKLiDheVE.cache +1 -0
  213. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/p0/p0WHrZZBaXbPaNj5XmQGTli4mi08Rv8DidQfwj28a6w.cache +0 -0
  214. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/p5/p5Qqrs_bvLEarcHNwiFMoZXaTWvShlq8KdaiIXvi7g4.cache +1 -0
  215. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/pA/pAvUFBt71eJx7E7oQbIxrEZ8YcMo9kboyGxjk73ZWrI.cache +1 -0
  216. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/pB/pBwzUQUu-GcmLiQwn6KnbbDP0ipnVHzVaeArqdpqi98.cache +0 -0
  217. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/pC/pCePfKbmTQ6s2Tl7ki3oBput2ruhpCzpa6Vvejbb5xg.cache +1 -0
  218. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/pS/pSLY6X9P48cnC-drvpZwa1ubJu-hjpiaTx_7Bj45riY.cache +1 -0
  219. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/q6/q6BYa32YJF11eGVapO4ouNl6gayPIsARgMavlzZmoi0.cache +0 -0
  220. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/qW/Qwu_HFjM_p33h0ukEd8eZtvuDh1Zw5x1w77CDlTopH8.cache +1 -0
  221. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/qW/qWlVTm6ozTv1T_Rvda-EsADQdVTcmfAesyZAq5Y4Ht4.cache +1 -0
  222. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/qY/QYP6D7Cl8GTs3LFfMQg5vYyDceeOpPLwxvPpYiKHzIU.cache +0 -0
  223. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/qY/qY78GTTnufmP1eP2CE16x833zGfQ0F5EVCFtUTMQ7Mw.cache +1 -0
  224. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/qY/qy4PIHHAIEUKVx3kHjiN5YyIrun3jtvdSX5yXMkB2PQ.cache +0 -0
  225. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/qm/qmZZzCnL9PLIyZ0iBu6Alr69AUfHHI1fKdNRRgG04yg.cache +1 -0
  226. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/rP/rPrNeVrYtj3sM9uesyX26XheSoRwAHJAmshFxNu9Bjg.cache +1 -0
  227. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/rP/rp52ANh-KNLY9IZY1lxAbAsbbtpE0S41_F9fq3W6bq4.cache +0 -0
  228. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/s4/s4tbhiIn_CLebHU0ldR1hjB8M4TebDv0UHjWrn41K1c.cache +0 -0
  229. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/s5/s5yv3jYvjyKZJ8SMzpj94eMKEuX46lAWV1ApHF-6bsM.cache +1 -0
  230. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/sO/sOBPF_p4Te56V9vdLV0Ywn6djNbmdPSIzvgYNPnAXYc.cache +0 -0
  231. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/sv/sv0a_JAC4GSc_cK-2OUAzhFwm_K3qzSfDefwpcqOCk4.cache +1 -0
  232. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/sv/svHBVuxn5XQE6HEBJ4AWbdxsIDZHr5qjwrGP-UVLxk4.cache +1 -0
  233. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/sw/sw2EAksRkslJNoJJCTS2FPOfHWCYvsS86AxmRMPjens.cache +1 -0
  234. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/t1/t1cv6bP9cTAIs82lyIsnXGeAwB1KNVY5_5rgUvelr04.cache +0 -0
  235. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/tO/To1SPyNegqysLIqhSzrNQPh1VKKj19MespjJediCde4.cache +1 -0
  236. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/tO/tOPkZNrO9FRDhSlCf7VWOexxRq2CE2X4_6KjyxJkq2A.cache +0 -0
  237. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/tR/tRoxwnX8bACHK5pW9tIi4ILY4XuYTIpueH0fGr2t0rc.cache +1 -0
  238. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/t_/t_bP70PmOB70862dwKmCTkmZuzTqCreOzNYW4Yn2n6A.cache +1 -0
  239. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/t_/t_ltg5_gjc0TqJfse-jdOUGwQu5AiK0znzxmaWt05x8.cache +0 -0
  240. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/uj/ujdE_ewC5UIxr6uw5F7YRfKKWiu8-15wzBlOjYHsnkQ.cache +1 -0
  241. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ut/ut8uBMdgxX8_wfU0l6kGew6H8TLXAj74kFnaI252F3k.cache +1 -0
  242. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/ut/utQEOZtBKQK_bUUDeZX4Mgk00L4AOMVyq6zrKAoo1Xw.cache +0 -0
  243. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/v4/V4ZL0hYAfHe81zfd7otsIeeWkSiHQ26MT8zObK74mSA.cache +1 -0
  244. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/v4/v4pe2JlWkzR-IW0F4Bhw4WEAwHNgeT9Df5rOmKYSwAI.cache +1 -0
  245. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/vm/vmjBl9ZCF5hj4sG4e2nid94GcRQYmsOsu-_Q3Zlud5c.cache +0 -0
  246. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/vz/vzBoVc4GQWi4UFp-4dBJnzrhyUuokPV8SCOxsdpOht8.cache +2 -0
  247. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/wM/wMWxmf8BN_NAJRCyardukpfDMwts44Bz2a8doi-49Rg.cache +1 -0
  248. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/x7/x7KkTV3ibfIEysLB_ug5bfmnn2VLV_BldukPR3EoPBk.cache +0 -0
  249. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/x7/x7iSOdqAIVmVpn9ujTwJ_C7EqUgmMSri5vjjHdRIX10.cache +1 -0
  250. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/xY/xYdD9O1JRIfpVj9Kw_b3JTUBQZLI_dcy-bf9uXEp-jg.cache +0 -0
  251. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/xx/xxkulLgT-tkVeDC50gUXRGGMou47BUdlYOwgs0j5muY.cache +1 -0
  252. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/yn/yn_3aZZwyjcI0O6fwisZ7zvcu4Gq5bV31g3tHFxfQNg.cache +1 -0
  253. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/yq/yqwjyepbYY4ctoMOySWiOIWUYwzl_BczAmXqJ5DPvb0.cache +0 -0
  254. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/z9/z9HQmzff5j_6CFyk6eQ52nYt9cPLXsxDQY0Yep1Hz-0.cache +1 -0
  255. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/zM/zMvcc87IG1SRbqwUNtWQfHgeWr5XN36OU8vg-v3rUus.cache +0 -0
  256. data/test/dummy/tmp/cache/assets/sprockets/v4.0.0/zn/znjQpjNzh1iUAe9DljeFghnStRvqNIr1GuOTibVcEJQ.cache +0 -0
  257. data/test/dummy/tmp/testrep/BaaRamEwe.txt +5 -0
  258. data/test/dummy/tmp/testrep/BarFoo.txt +5 -0
  259. data/test/dummy/tmp/testrep/BazQuux.txt +5 -0
  260. data/test/dummy/tmp/testrep/FooBar.txt +5 -0
  261. data/test/dummy/tmp/testrep/NewEncryptedPage.txt +5 -0
  262. data/test/dummy/tmp/testrep/NewPage.txt +5 -0
  263. data/test/dummy/tmp/testrep/users/testy.json +1 -0
  264. data/test/dummy/tmp/wikirep/FrontPage.txt +5 -0
  265. data/test/dummy/tmp/wikirep/users/chrismo.json +1 -0
  266. data/test/dummy/wikirep/EncryptedPage.txt +0 -0
  267. data/test/dummy/wikirep/FrontPage.txt +11 -4
  268. data/test/dummy/wikirep/users/chrismo.json +1 -0
  269. data/test/helpers/wiki_helper_test.rb +2 -0
  270. data/test/lib/clwiki/clwiki_test_helper.rb +19 -2
  271. data/test/lib/clwiki/file_owner_test.rb +58 -0
  272. data/test/lib/clwiki/file_test.rb +91 -56
  273. data/test/lib/clwiki/memory_index_test.rb +61 -0
  274. data/test/lib/clwiki/page_test.rb +72 -148
  275. data/test/lib/clwiki/test_base.rb +19 -19
  276. data/test/test_helper.rb +7 -5
  277. metadata +498 -23
  278. data/lib/cl_wiki/find_in_file.rb +0 -33
  279. data/lib/cl_wiki/index.rb +0 -458
  280. data/lib/cl_wiki/tools/cron.reminders.rb +0 -241
  281. data/lib/cl_wiki/tools/movepages.rb +0 -27
  282. data/lib/cl_wiki/tools/pagestomove.txt +0 -56
  283. data/lib/cl_wiki/tools/rublog/clWiki.rb +0 -62
  284. data/lib/cl_wiki/tools/rublog/readme.txt +0 -2
  285. data/lib/cl_wiki/tools/singlepage.rb +0 -58
  286. data/lib/cl_wiki/tools/test/singlepagetest.rb +0 -9
  287. data/lib/cl_wiki/tools/thunderbird.rb +0 -23
  288. data/test/lib/clwiki/find_in_file_test.rb +0 -111
  289. 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: b05c529c89a4963cc09ea1aa19fa4cc65009a6139d82fa6db3086206077d752b
4
+ data.tar.gz: 0df1b84af4db6bd0504c69c013755c54f94232c0b5ea32f4b82a5d940a218684
5
5
  SHA512:
6
- metadata.gz: 33e5916f65f7f1c0708b8e99bd5aaeda2882dbcc153588e6f2775f5f89827c00c322e42e567df8e7029fa1e13b7650ea2f429a1e4677ad4fd06e689ce71db8fc
7
- data.tar.gz: 76783cc36ba99086af87927c675a3260193e20e48b853d8ec6de082c5031bc746f9d6f0780d39157338e2f2af66c308b7b5d9cff78a4de30aee18b77657291a8
6
+ metadata.gz: d270c91ed7d9afafd8c6c83e220d9de90ec4a8104221d3f3ae483de431e114ce01be2940ec92d027464b98cf1c8099c1a7f49048b7f651aa53f98037f5194b76
7
+ data.tar.gz: 77fe601ea440d0b306f66a83e5fd64215e84e6d4983e6d0b3ba65f3afc87f5f3b6d1172c880aa9ccb56673e1890906e4cf1d838a4d53defaee58def378664aff
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,37 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ClWiki
2
4
  class ApplicationController < ActionController::Base
5
+ before_action :expire_old_session, if: -> { $wiki_conf.use_authentication }
6
+ before_action :authorized, if: -> { $wiki_conf.use_authentication }
7
+ before_action :initialize_index, if: -> { $wiki_conf.use_authentication }
8
+ helper_method :current_user
9
+ helper_method :logged_in?
10
+
11
+ def expire_old_session
12
+ reset_session if session[:expire_at]&.< Time.now
13
+ end
14
+
15
+ def current_user
16
+ User.find(session[:username])&.tap do |user|
17
+ user.cached_encryption_key = Base64.decode64(session[:encryption_key])
18
+ end
19
+ end
20
+
21
+ def current_owner
22
+ current_user || ClWiki::PublicUser.new
23
+ end
24
+
25
+ def logged_in?
26
+ !current_user.nil?
27
+ end
28
+
29
+ def authorized
30
+ redirect_to login_url unless logged_in?
31
+ end
32
+
33
+ def initialize_index
34
+ ClWiki::MemoryIndexer.instance(page_owner: current_owner)
35
+ end
3
36
  end
4
- end
37
+ 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,35 @@ 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
11
+ skip_before_action :expire_old_session, only: [:edit, :update]
9
12
 
10
13
  def show
11
- @page = ClWiki::Page.new(@page_name)
14
+ @page = instantiate_page
12
15
  @page.read_content
13
16
  @page
14
17
  end
15
18
 
16
19
  def edit
17
- @page = ClWiki::Page.new(@page_name)
20
+ @render_encryption_ui = $wiki_conf.use_authentication
21
+
22
+ @page = instantiate_page
23
+ @encrypt_default = determine_encryption_default
24
+
18
25
  @page.read_raw_content
19
26
  @page
20
27
  end
21
28
 
22
29
  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)
30
+ @page = instantiate_page
31
+
32
+ mtime = Time.at(params[:client_mod_time].to_s.to_i)
33
+ encrypt = params[:encrypt].present?
34
+ @page.update_content(params[:page_content], mtime, encrypt)
35
+
36
+ redirect_to params[:save_and_edit] ?
37
+ page_edit_url(page_name: @page.page_name) :
38
+ page_show_url(page_name: @page.page_name)
26
39
  end
27
40
 
28
41
  def find
@@ -33,40 +46,30 @@ module ClWiki
33
46
  hits = search(@search_text)
34
47
 
35
48
  hits.each do |full_name|
36
- @formatter.fullName = full_name
37
- @results << "#{@formatter.convertToLink(full_name)}"
49
+ @formatter.full_name = full_name
50
+ @results << @formatter.convert_to_link(full_name).to_s
38
51
  end
39
52
  end
40
53
  end
41
54
 
42
55
  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
56
+ ClWiki::MemoryIndexer.instance.search(text)
53
57
  end
54
58
 
59
+ # recent _published_ pages.
55
60
  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]
61
+ page_names = ClWiki::MemoryIndexer.instance.recent(10, text: $wiki_conf.publishTag)
62
+
64
63
  without_header_and_footer = false
65
- @pages.each { |p| p.read_content(without_header_and_footer) }
64
+ @pages = page_names.map do |page_name|
65
+ ClWiki::Page.new(page_name, owner: current_owner).tap do |page|
66
+ page.read_content(without_header_and_footer)
67
+ end
68
+ end
66
69
 
67
70
  respond_to do |format|
68
71
  format.html
69
- format.rss { render :layout => false }
72
+ format.rss { render layout: false }
70
73
  end
71
74
  end
72
75
 
@@ -77,30 +80,42 @@ module ClWiki
77
80
  def redirect_legacy_cgi_urls
78
81
  if request.fullpath.start_with?(legacy_path)
79
82
  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'
83
+ if request.query_parameters.include?('edit')
84
+ redirect_to page_edit_url(page_name: page_name), status: '301'
85
+ else
86
+ redirect_to page_show_url(page_name: page_name), status: '301'
85
87
  end
86
88
  end
87
89
  end
88
90
 
89
91
  def assign_page_name
90
92
  @page_name = params[:page_name]
91
- @page_name = @page_name.ensure_slash_prefix if @page_name
92
93
  end
93
94
 
94
95
  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
96
+ if (@page_name.blank? || !@formatter.is_wiki_name?(@page_name)) ||
97
+ (!$wiki_conf.editable && !ClWiki::Page.page_exists?(@page_name))
98
+ redirect_to page_show_url(page_name: front_page_name)
99
+ nil
99
100
  end
100
101
  end
101
102
 
102
103
  def initialize_formatter
103
104
  @formatter = ClWiki::PageFormatter.new
104
105
  end
106
+
107
+ private
108
+
109
+ def instantiate_page
110
+ ClWiki::Page.new(@page_name, owner: current_owner)
111
+ end
112
+
113
+ def determine_encryption_default
114
+ if $wiki_conf.use_authentication
115
+ @page.is_new? ? $wiki_conf.encryption_default : @page.content_encrypted?
116
+ else
117
+ false
118
+ end
119
+ end
105
120
  end
106
121
  end
@@ -0,0 +1,41 @@
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
+ auth_user_and_setup_session ?
14
+ redirect_to(root_url) :
15
+ redirect_to(login_url)
16
+ end
17
+
18
+ def destroy
19
+ reset_session
20
+ redirect_to login_url
21
+ end
22
+
23
+ private
24
+
25
+ def auth_user_and_setup_session
26
+ @user = User.find(params[:username])
27
+ password = params[:password]
28
+ authenticated = @user&.username == $wiki_conf.owner && @user&.authenticate(password)
29
+ if authenticated
30
+ session[:username] = @user.username
31
+ session[:expire_at] = 48.hours.from_now
32
+ session[:encryption_key] = Base64.encode64(@user.derive_encryption_key(password))
33
+ end
34
+ authenticated
35
+ end
36
+
37
+ def skip_all_if_not_using_authentication
38
+ redirect_to root_url unless $wiki_conf.use_authentication
39
+ end
40
+ end
41
+ 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%>