tdiary 5.5.1 → 5.6.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 (175) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog +2 -0
  3. data/Gemfile +2 -1
  4. data/Gemfile.lock +37 -37
  5. data/doc/UPGRADE.md +1 -1
  6. data/lib/tdiary/admin.rb +11 -13
  7. data/lib/tdiary/application.rb +2 -7
  8. data/lib/tdiary/author_only_base.rb +78 -9
  9. data/lib/tdiary/base.rb +2 -2
  10. data/lib/tdiary/cgi_adapter.rb +7 -5
  11. data/lib/tdiary/cgi_compat.rb +27 -97
  12. data/lib/tdiary/configuration.rb +4 -0
  13. data/lib/tdiary/core_ext.rb +146 -1
  14. data/lib/tdiary/dispatcher/index_main.rb +5 -23
  15. data/lib/tdiary/dispatcher/update_main.rb +2 -17
  16. data/lib/tdiary/dispatcher.rb +29 -15
  17. data/lib/tdiary/filter/default.rb +2 -2
  18. data/lib/tdiary/filter/spam.rb +2 -2
  19. data/lib/tdiary/filter.rb +1 -1
  20. data/lib/tdiary/plugin/00default.rb +18 -3
  21. data/lib/tdiary/plugin/en/00default.rb +15 -0
  22. data/lib/tdiary/plugin/ja/00default.rb +15 -0
  23. data/lib/tdiary/plugin.rb +1 -1
  24. data/lib/tdiary/rack/error_handler.rb +36 -0
  25. data/lib/tdiary/rack.rb +1 -0
  26. data/lib/tdiary/request.rb +3 -2
  27. data/lib/tdiary/server.rb +25 -3
  28. data/lib/tdiary/version.rb +1 -1
  29. data/lib/tdiary/view.rb +33 -28
  30. data/lib/tdiary/view_helper.rb +10 -2
  31. data/lib/tdiary.rb +6 -1
  32. data/misc/plugin/image.rb +1 -1
  33. data/misc/plugin/makerss.rb +3 -3
  34. data/tdiary.conf.sample +8 -0
  35. data/tdiary.conf.sample-en +8 -0
  36. data/vendor/bundle/ruby/3.4.0/cache/net-imap-0.6.6.gem +0 -0
  37. data/vendor/bundle/ruby/3.4.0/cache/net-protocol-0.3.0.gem +0 -0
  38. data/vendor/bundle/ruby/3.4.0/cache/rack-3.2.7.gem +0 -0
  39. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/cgi-0.5.2/gem_make.out +5 -5
  40. data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/gem_make.out +5 -5
  41. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/Gemfile +3 -4
  42. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/README.md +1 -1
  43. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.6.6/Rakefile +24 -0
  44. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/command_data.rb +62 -92
  45. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/config/attr_accessors.rb +8 -9
  46. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/config/attr_inheritance.rb +64 -1
  47. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/config/attr_version_defaults.rb +1 -4
  48. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/config.rb +209 -35
  49. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/connection_state.rb +1 -1
  50. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/data_encoding.rb +127 -27
  51. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.6.6/lib/net/imap/errors.rb +372 -0
  52. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/esearch_result.rb +6 -0
  53. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/response_data.rb +90 -11
  54. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/response_parser/parser_utils.rb +14 -23
  55. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/response_parser.rb +41 -26
  56. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/response_reader.rb +16 -21
  57. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/scram_authenticator.rb +3 -3
  58. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/search_result.rb +11 -1
  59. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sequence_set.rb +620 -312
  60. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/uidplus_data.rb +2 -63
  61. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap.rb +279 -162
  62. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/net-imap.gemspec +1 -1
  63. data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/rakelib/rdoc.rake +1 -18
  64. data/vendor/bundle/ruby/3.4.0/gems/{net-protocol-0.2.2/LICENSE.txt → net-protocol-0.3.0/BSDL} +3 -3
  65. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.3.0/COPYING +56 -0
  66. data/vendor/bundle/ruby/3.4.0/gems/{net-protocol-0.2.2 → net-protocol-0.3.0}/lib/net/protocol.rb +58 -4
  67. data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/CHANGELOG.md +54 -1
  68. data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/utils.rb +3 -3
  69. data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/version.rb +1 -1
  70. data/vendor/bundle/ruby/3.4.0/specifications/{net-imap-0.5.15.gemspec → net-imap-0.6.6.gemspec} +4 -4
  71. data/vendor/bundle/ruby/3.4.0/specifications/{net-protocol-0.2.2.gemspec → net-protocol-0.3.0.gemspec} +5 -5
  72. data/vendor/bundle/ruby/3.4.0/specifications/{rack-3.2.6.gemspec → rack-3.2.7.gemspec} +3 -3
  73. data/views/tdiary.rconf +2 -0
  74. metadata +127 -131
  75. data/vendor/bundle/ruby/3.4.0/cache/net-imap-0.5.15.gem +0 -0
  76. data/vendor/bundle/ruby/3.4.0/cache/net-protocol-0.2.2.gem +0 -0
  77. data/vendor/bundle/ruby/3.4.0/cache/rack-3.2.6.gem +0 -0
  78. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/Rakefile +0 -13
  79. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/data_lite.rb +0 -226
  80. data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/errors.rb +0 -118
  81. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/Gemfile +0 -7
  82. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/Rakefile +0 -10
  83. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/bin/console +0 -14
  84. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/bin/setup +0 -8
  85. data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/net-protocol.gemspec +0 -33
  86. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/BSDL +0 -0
  87. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/COPYING +0 -0
  88. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/LICENSE.txt +0 -0
  89. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/docs/styles.css +0 -0
  90. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/authenticators.rb +0 -0
  91. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/config/attr_type_coercion.rb +0 -0
  92. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/deprecated_client_options.rb +0 -0
  93. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/fetch_data.rb +0 -0
  94. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/flags.rb +0 -0
  95. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/anonymous_authenticator.rb +0 -0
  96. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/authentication_exchange.rb +0 -0
  97. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/authenticators.rb +0 -0
  98. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/client_adapter.rb +0 -0
  99. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/cram_md5_authenticator.rb +0 -0
  100. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/digest_md5_authenticator.rb +0 -0
  101. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/external_authenticator.rb +0 -0
  102. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/gs2_header.rb +0 -0
  103. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/login_authenticator.rb +0 -0
  104. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/oauthbearer_authenticator.rb +0 -0
  105. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/plain_authenticator.rb +0 -0
  106. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/protocol_adapters.rb +0 -0
  107. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/scram_algorithm.rb +0 -0
  108. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/stringprep.rb +0 -0
  109. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl/xoauth2_authenticator.rb +0 -0
  110. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl.rb +0 -0
  111. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/sasl_adapter.rb +0 -0
  112. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/stringprep/nameprep.rb +0 -0
  113. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/stringprep/saslprep.rb +0 -0
  114. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/stringprep/saslprep_tables.rb +0 -0
  115. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/stringprep/tables.rb +0 -0
  116. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/stringprep/trace.rb +0 -0
  117. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/stringprep.rb +0 -0
  118. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/lib/net/imap/vanished_data.rb +0 -0
  119. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/rakelib/benchmarks.rake +0 -0
  120. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/rakelib/rfcs.rake +0 -0
  121. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/rakelib/saslprep.rake +0 -0
  122. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/rakelib/string_prep_tables_generator.rb +0 -0
  123. /data/vendor/bundle/ruby/3.4.0/gems/{net-imap-0.5.15 → net-imap-0.6.6}/sample/net-imap.rb +0 -0
  124. /data/vendor/bundle/ruby/3.4.0/gems/{net-protocol-0.2.2 → net-protocol-0.3.0}/README.md +0 -0
  125. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/CONTRIBUTING.md +0 -0
  126. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/MIT-LICENSE +0 -0
  127. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/README.md +0 -0
  128. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/SPEC.rdoc +0 -0
  129. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/auth/abstract/handler.rb +0 -0
  130. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/auth/abstract/request.rb +0 -0
  131. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/auth/basic.rb +0 -0
  132. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/bad_request.rb +0 -0
  133. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/body_proxy.rb +0 -0
  134. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/builder.rb +0 -0
  135. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/cascade.rb +0 -0
  136. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/common_logger.rb +0 -0
  137. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/conditional_get.rb +0 -0
  138. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/config.rb +0 -0
  139. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/constants.rb +0 -0
  140. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/content_length.rb +0 -0
  141. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/content_type.rb +0 -0
  142. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/deflater.rb +0 -0
  143. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/directory.rb +0 -0
  144. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/etag.rb +0 -0
  145. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/events.rb +0 -0
  146. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/files.rb +0 -0
  147. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/head.rb +0 -0
  148. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/headers.rb +0 -0
  149. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/lint.rb +0 -0
  150. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/lock.rb +0 -0
  151. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/media_type.rb +0 -0
  152. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/method_override.rb +0 -0
  153. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/mime.rb +0 -0
  154. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/mock.rb +0 -0
  155. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/mock_request.rb +0 -0
  156. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/mock_response.rb +0 -0
  157. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/multipart/generator.rb +0 -0
  158. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/multipart/parser.rb +0 -0
  159. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/multipart/uploaded_file.rb +0 -0
  160. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/multipart.rb +0 -0
  161. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/null_logger.rb +0 -0
  162. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/query_parser.rb +0 -0
  163. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/recursive.rb +0 -0
  164. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/reloader.rb +0 -0
  165. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/request.rb +0 -0
  166. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/response.rb +0 -0
  167. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/rewindable_input.rb +0 -0
  168. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/runtime.rb +0 -0
  169. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/sendfile.rb +0 -0
  170. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/show_exceptions.rb +0 -0
  171. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/show_status.rb +0 -0
  172. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/static.rb +0 -0
  173. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/tempfile_reaper.rb +0 -0
  174. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack/urlmap.rb +0 -0
  175. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.2.6 → rack-3.2.7}/lib/rack.rb +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f1b4744d343480c08b943bde469915fa83f6819440ca413f18ddefba0c862174
4
- data.tar.gz: b8edbc8bde908cfc678f8e8f7772380d10cc813ee74e3a7079c07b69da667282
3
+ metadata.gz: c52912654a8c3f8dcbef538b3ca818e71a46adea1416c691d76792747cf3d9a8
4
+ data.tar.gz: 2f578f65c5c636012a3971508916a1f463f37c4039d4bb8d9654c24720b6eb8f
5
5
  SHA512:
6
- metadata.gz: 0e64e1bfbf4571788070a450d5887938ec424abdf7eed170b6c26adcad0c2faf04f8f411c8415fc8fdf1a3af946533e8ecf0737cf8b199ab2c5570eb2a105f6b
7
- data.tar.gz: 24391decec11f8925375a9c564c25511ddaebaee602e8117b362f8307ca7fc5f54f54ad5f23060941c351f6cd4b190b59c38f7b60bf269bf541f25d9fedf5ed5
6
+ metadata.gz: 66fd5778cfbe863790cda5a64a3cd8812b28d6dd3434f08ce710fec49044986cb0677599d8f58055d05f4001734b2374ec7397b4ed04f7e0ea7b912b76d372ee
7
+ data.tar.gz: a2ddcc2c75d34cc2cd2cbbb669395b900b5a930dc129312ee325a960652995d0af04d2511f0f039e332fe461ed3dbcf4efd148abdf29ba5b167a8a99598fa28f
data/ChangeLog CHANGED
@@ -1,3 +1,5 @@
1
+ This ChangeLog is no longer updated. Changes in 5.5.0 and later are recorded in the release notes at https://github.com/tdiary/tdiary-core/releases.
2
+
1
3
  2025-06-13 Hiroshi SHIBATA <hsbt@ruby-lang.org>
2
4
  * support Ruby 3.4.
3
5
  * drop to support Ruby 3.0.
data/Gemfile CHANGED
@@ -12,6 +12,7 @@ gem 'mail'
12
12
  gem 'rake'
13
13
  gem 'cgi'
14
14
  gem 'pstore'
15
+ gem 'logger'
15
16
 
16
17
  group :development do
17
18
  gem 'pit', require: false
@@ -24,7 +25,7 @@ group :development do
24
25
  gem 'rspec'
25
26
  gem 'capybara', require: 'capybara/rspec'
26
27
  gem 'date', '>= 3.1.1' # for compatibility of capybara
27
- gem 'selenium-webdriver', '< 4.45' # 4.45+ requires Ruby >= 3.3
28
+ gem 'cuprite'
28
29
  gem 'launchy'
29
30
  gem 'sequel'
30
31
  gem 'sqlite3'
data/Gemfile.lock CHANGED
@@ -1,6 +1,6 @@
1
1
  GIT
2
2
  remote: https://github.com/tdiary/tdiary-contrib.git
3
- revision: b4fa12059634cfb6cea6e1a7d1b1d6341bd4024b
3
+ revision: 79c4f1909a8941a9f7feb856b8213af74a8e6cf3
4
4
  specs:
5
5
  tdiary-contrib (5.4.0)
6
6
  coderay
@@ -69,17 +69,25 @@ GEM
69
69
  commonmarker (2.9.0-x86_64-linux-musl)
70
70
  concurrent-ruby (1.3.8)
71
71
  connection_pool (3.0.2)
72
- dalli (5.0.5)
72
+ cuprite (0.17)
73
+ capybara (~> 3.0)
74
+ ferrum (~> 0.17.0)
75
+ dalli (5.1.0)
73
76
  logger
74
77
  date (3.5.1)
75
78
  diff-lcs (1.6.2)
76
- docile (1.4.1)
77
79
  drb (2.2.3)
78
80
  emot (0.0.4)
79
81
  thor
80
82
  faraday (0.17.6)
81
83
  multipart-post (>= 1.2, < 3)
82
84
  fastimage (2.4.1)
85
+ ferrum (0.17.2)
86
+ addressable (~> 2.5)
87
+ base64 (~> 0.2)
88
+ concurrent-ruby (~> 1.1)
89
+ webrick (~> 1.7)
90
+ websocket-driver (~> 0.7)
83
91
  hashie (5.1.0)
84
92
  logger
85
93
  hikidoc (0.1.1)
@@ -105,7 +113,7 @@ GEM
105
113
  mime-types (3.7.0)
106
114
  logger
107
115
  mime-types-data (~> 3.2025, >= 3.2025.0507)
108
- mime-types-data (3.2025.0603)
116
+ mime-types-data (3.2026.0701)
109
117
  mini_mime (1.1.5)
110
118
  mini_portile2 (2.8.9)
111
119
  minitest (6.0.6)
@@ -122,12 +130,12 @@ GEM
122
130
  bigdecimal (>= 3.1, < 5)
123
131
  multipart-post (2.4.1)
124
132
  mutex_m (0.3.0)
125
- net-imap (0.5.15)
133
+ net-imap (0.6.6)
126
134
  date
127
135
  net-protocol
128
136
  net-pop (0.1.2)
129
137
  net-protocol
130
- net-protocol (0.2.2)
138
+ net-protocol (0.3.0)
131
139
  timeout
132
140
  net-smtp (0.5.1)
133
141
  net-protocol
@@ -184,7 +192,7 @@ GEM
184
192
  faraday (>= 0.13.0, < 1.0)
185
193
  mime-types
186
194
  racc (1.8.1)
187
- rack (3.2.6)
195
+ rack (3.2.7)
188
196
  rack-protection (4.2.1)
189
197
  base64 (>= 0.1.0)
190
198
  logger (>= 1.6.0)
@@ -222,44 +230,32 @@ GEM
222
230
  rspec-support (~> 3.13.0)
223
231
  rspec-support (3.13.6)
224
232
  ruby2_keywords (0.0.5)
225
- rubyzip (2.4.1)
226
233
  securerandom (0.4.1)
227
- selenium-webdriver (4.33.0)
228
- base64 (~> 0.2)
229
- logger (~> 1.4)
230
- rexml (~> 3.2, >= 3.2.5)
231
- rubyzip (>= 1.2.2, < 3.0)
232
- websocket (~> 1.0)
233
- sequel (5.106.0)
234
+ sequel (5.107.0)
234
235
  bigdecimal
235
- simplecov (0.22.0)
236
- docile (~> 1.1)
237
- simplecov-html (~> 0.11)
238
- simplecov_json_formatter (~> 0.1)
239
- simplecov-html (0.13.1)
240
- simplecov_json_formatter (0.1.4)
236
+ simplecov (1.1.1)
241
237
  snaky_hash (2.0.7)
242
238
  hashie (>= 0.1.0, < 6)
243
239
  version_gem (~> 1.1, >= 1.1.14)
244
- sqlite3 (2.8.1)
240
+ sqlite3 (2.9.6)
245
241
  mini_portile2 (~> 2.8.0)
246
- sqlite3 (2.8.1-aarch64-linux-gnu)
247
- sqlite3 (2.8.1-aarch64-linux-musl)
248
- sqlite3 (2.8.1-arm-linux-gnu)
249
- sqlite3 (2.8.1-arm-linux-musl)
250
- sqlite3 (2.8.1-arm64-darwin)
251
- sqlite3 (2.8.1-x86-linux-gnu)
252
- sqlite3 (2.8.1-x86-linux-musl)
253
- sqlite3 (2.8.1-x86_64-darwin)
254
- sqlite3 (2.8.1-x86_64-linux-gnu)
255
- sqlite3 (2.8.1-x86_64-linux-musl)
256
- tdiary (5.4.0)
257
- bundler (>= 2.6, < 3.0)
242
+ sqlite3 (2.9.6-aarch64-linux-gnu)
243
+ sqlite3 (2.9.6-aarch64-linux-musl)
244
+ sqlite3 (2.9.6-arm-linux-gnu)
245
+ sqlite3 (2.9.6-arm-linux-musl)
246
+ sqlite3 (2.9.6-arm64-darwin)
247
+ sqlite3 (2.9.6-x86-linux-gnu)
248
+ sqlite3 (2.9.6-x86-linux-musl)
249
+ sqlite3 (2.9.6-x86_64-darwin)
250
+ sqlite3 (2.9.6-x86_64-linux-gnu)
251
+ sqlite3 (2.9.6-x86_64-linux-musl)
252
+ tdiary (5.5.1)
253
+ cgi
258
254
  emot
259
255
  fastimage
260
256
  hikidoc
261
257
  mail
262
- nkf
258
+ pstore
263
259
  rack
264
260
  rake
265
261
  rexml
@@ -285,7 +281,10 @@ GEM
285
281
  unf_ext (0.0.9.1)
286
282
  version_gem (1.1.14)
287
283
  webrick (1.9.2)
288
- websocket (1.2.11)
284
+ websocket-driver (0.8.2)
285
+ base64
286
+ websocket-extensions (>= 0.1.0)
287
+ websocket-extensions (0.1.5)
289
288
  xpath (3.2.0)
290
289
  nokogiri (~> 1.8)
291
290
 
@@ -311,12 +310,14 @@ DEPENDENCIES
311
310
  capybara
312
311
  cgi
313
312
  connection_pool
313
+ cuprite
314
314
  dalli
315
315
  date (>= 3.1.1)
316
316
  emot
317
317
  fastimage
318
318
  hikidoc
319
319
  launchy
320
+ logger
320
321
  mail
321
322
  memcachier
322
323
  mime-types
@@ -334,7 +335,6 @@ DEPENDENCIES
334
335
  redcarpet
335
336
  rexml
336
337
  rspec
337
- selenium-webdriver (< 4.45)
338
338
  sequel
339
339
  simplecov
340
340
  sqlite3
data/doc/UPGRADE.md CHANGED
@@ -4,7 +4,7 @@
4
4
  このドキュメントについて
5
5
  --
6
6
 
7
- tDiaryは、バージョン番号が「X.Y.Z」の形式のものがリリースバージョン、その後ろに「.YYYYMMDD」形式で日付が入っているものが開発バージョンとなっています。このドキュメントでは、リリースバージョン間の変更点について解説します。開発バージョンを使っている場合は、ChangeLogファイルを参照してください。
7
+ tDiaryは、バージョン番号が「X.Y.Z」の形式のものがリリースバージョン、その後ろに「.YYYYMMDD」形式で日付が入っているものが開発バージョンとなっています。このドキュメントでは、リリースバージョン間の変更点について解説します。開発バージョンを使っている場合は、[GitHub Releases](https://github.com/tdiary/tdiary-core/releases)を参照してください。
8
8
 
9
9
  4.0と5.0の違い
10
10
  -----
data/lib/tdiary/admin.rb CHANGED
@@ -8,7 +8,7 @@ module TDiary
8
8
  super
9
9
 
10
10
  begin
11
- @date = Time::local( @cgi.params['year'][0].to_i, @cgi.params['month'][0].to_i, @cgi.params['day'][0].to_i )
11
+ @date = Time::local( @request.param('year').to_i, @request.param('month').to_i, @request.param('day').to_i )
12
12
  rescue ArgumentError, NameError
13
13
  raise TDiaryError, 'bad date'
14
14
  end
@@ -71,12 +71,12 @@ module TDiary
71
71
  def initialize( cgi, rhtm, conf )
72
72
  super
73
73
 
74
- @title = @cgi.params['title'][0]
75
- @body = @cgi.params['body'][0]
74
+ @title = @request.param('title')
75
+ @body = @request.param('body')
76
76
  @title = @conf.to_native( @title )
77
77
  @body = @conf.to_native( @body )
78
- @old_date = @cgi.params['old'][0]
79
- @hide = @cgi.params['hide'][0] == 'true' ? true : false
78
+ @old_date = @request.param('old')
79
+ @hide = @request.param('hide') == 'true' ? true : false
80
80
 
81
81
  @io.transaction( @date ) do |diaries|
82
82
  @diaries = diaries
@@ -107,13 +107,11 @@ module TDiary
107
107
  #
108
108
  class TDiaryUpdate < TDiaryAdmin
109
109
  def initialize( request, rhtml, conf )
110
- # @cgi is not derived yet before super; go through the facade here
111
- params = request.cgi_compat.params
112
- @title = params['title'][0]
113
- @body = params['body'][0]
110
+ @title = request.param('title')
111
+ @body = request.param('body')
114
112
  @title = conf.to_native( @title )
115
113
  @body = conf.to_native( @body )
116
- @hide = params['hide'][0] == 'true' ? true : false
114
+ @hide = request.param('hide') == 'true' ? true : false
117
115
  super
118
116
  end
119
117
 
@@ -140,7 +138,7 @@ module TDiary
140
138
  @date = newdate
141
139
  end
142
140
 
143
- @author = @conf.multi_user ? @cgi.remote_user : nil
141
+ @author = @conf.multi_user ? @request.remote_user : nil
144
142
 
145
143
  @io.transaction( @date ) do |diaries|
146
144
  @diaries = diaries
@@ -166,7 +164,7 @@ module TDiary
166
164
  class TDiaryReplace < TDiaryUpdate
167
165
  def initialize( cgi, rhtm, conf )
168
166
  super
169
- old_date = @cgi.params['old'][0]
167
+ old_date = @request.param('old')
170
168
 
171
169
  @io.transaction( @date ) do |diaries|
172
170
  @diaries = diaries
@@ -203,7 +201,7 @@ module TDiary
203
201
  if @diary then
204
202
  idx = 0
205
203
  @diary.each_comment do |com|
206
- com.show = @cgi.params[(idx += 1).to_s][0] == 'true' ? true : false;
204
+ com.show = @request.param((idx += 1).to_s) == 'true' ? true : false;
207
205
  end
208
206
  self << @diary
209
207
  @io.clear_cache( /(latest|#{@date.strftime( '%Y%m' )})/ )
@@ -15,6 +15,7 @@ module TDiary
15
15
  base_dir ||= self.base_dir
16
16
 
17
17
  @app = ::Rack::Builder.app do
18
+ use TDiary::Rack::ErrorHandler
18
19
  map base_dir do
19
20
  map '/' do
20
21
  use TDiary::Rack::HtmlAnchor
@@ -39,13 +40,7 @@ module TDiary
39
40
  end
40
41
 
41
42
  def call( env )
42
- begin
43
- @app.call( env )
44
- rescue Exception => e
45
- body = ["#{e.class}: #{e}\n"]
46
- body << e.backtrace.join("\n")
47
- [500, {'content-type' => 'text/plain'}, body]
48
- end
43
+ @app.call( env )
49
44
  end
50
45
 
51
46
  def assets_paths
@@ -6,6 +6,68 @@ module TDiary
6
6
  class TDiaryAuthorOnlyBase < TDiaryBase
7
7
  def csrf_protection_get_is_okay; false; end
8
8
 
9
+ # pure decision helpers for csrf_check, class methods so unit specs
10
+ # can exercise them without building a full TDiaryBase
11
+
12
+ # referer must be non-empty with its query string stripped; it is
13
+ # allowed when it names the update page itself or matches the
14
+ # admin-configured regexp
15
+ def self.csrf_referer_allowed?( referer, config_uri, allowed_referer_regexp )
16
+ return true if config_uri == URI.parse( referer )
17
+ allowed_referer_regexp != '' && Regexp.new( allowed_referer_regexp ).match?( referer )
18
+ end
19
+
20
+ # normalize an absolute http(s) URL to its origin serialization
21
+ # (lowercase scheme://host, default port omitted); nil when the
22
+ # input has no usable origin
23
+ def self.csrf_origin_of( url )
24
+ uri = URI.parse( url.to_s )
25
+ return nil unless uri.kind_of?( URI::HTTP ) and uri.host
26
+ port = uri.port == uri.default_port ? '' : ":#{uri.port}"
27
+ "#{uri.scheme.downcase}://#{uri.host.downcase}#{port}"
28
+ rescue URI::InvalidURIError
29
+ nil
30
+ end
31
+
32
+ # classify the request provenance from browser fetch metadata:
33
+ # :same_origin / :cross_site / :unknown (no usable signal, e.g.
34
+ # non-browser clients or a user-initiated navigation)
35
+ def self.csrf_fetch_verdict( origin, sec_fetch_site, allowed_origins )
36
+ if origin and !origin.empty?
37
+ # 'null' (sandboxed or opaque initiators) never matches
38
+ return allowed_origins.include?( origin.downcase ) ? :same_origin : :cross_site
39
+ end
40
+ case sec_fetch_site
41
+ when 'same-origin'
42
+ :same_origin
43
+ when 'same-site', 'cross-site'
44
+ :cross_site
45
+ else
46
+ :unknown
47
+ end
48
+ end
49
+
50
+ # main csrf decision: Origin / Sec-Fetch-Site first, the legacy
51
+ # Referer check only as a fallback when neither header gives a
52
+ # usable signal. A cross-site verdict can still be allowed by an
53
+ # explicit Referer allowance (the update page itself or the
54
+ # admin-configured regexp), but not by the empty-referer tolerance
55
+ # of check_referer=false.
56
+ def self.csrf_provenance_ok?( origin, sec_fetch_site, referer, allowed_origins, config_uri, allowed_referer_regexp, check_referer )
57
+ case csrf_fetch_verdict( origin, sec_fetch_site, allowed_origins )
58
+ when :same_origin
59
+ true
60
+ when :cross_site
61
+ referer != '' && csrf_referer_allowed?( referer, config_uri, allowed_referer_regexp )
62
+ else
63
+ if referer == ''
64
+ !check_referer
65
+ else
66
+ csrf_referer_allowed?( referer, config_uri, allowed_referer_regexp )
67
+ end
68
+ end
69
+ end
70
+
9
71
  def initialize( cgi, rhtml, conf )
10
72
  super
11
73
  csrf_check( @request, conf )
@@ -43,8 +105,7 @@ module TDiary
43
105
 
44
106
  referer_is_empty = referer == ''
45
107
  referer_uri = URI.parse(referer) if !referer_is_empty
46
- referer_is_config = !referer_is_empty && config_uri == referer_uri
47
- referer_is_config ||= Regexp.new(updaterb_regexp) =~ referer if !referer_is_empty && updaterb_regexp != ''
108
+ referer_is_config = !referer_is_empty && self.class.csrf_referer_allowed?(referer, config_uri, updaterb_regexp)
48
109
  is_post = request.post?
49
110
 
50
111
  given_key = request.params['csrf_protection_key']
@@ -53,12 +114,18 @@ module TDiary
53
114
  is_key_ok = masterkey != '' && given_key == masterkey
54
115
 
55
116
  keycheck_ok = !check_key || is_key_ok
56
- referercheck_ok = referer_is_config || (!check_referer && referer_is_empty)
117
+
118
+ origin = request.env['HTTP_ORIGIN']
119
+ sec_fetch_site = request.env['HTTP_SEC_FETCH_SITE']
120
+ allowed_origins = [base_uri, config_uri, request.base_url].map {|url|
121
+ self.class.csrf_origin_of( url )
122
+ }.compact.uniq
123
+ provenance_ok = self.class.csrf_provenance_ok?( origin, sec_fetch_site, referer, allowed_origins, config_uri, updaterb_regexp, check_referer )
57
124
 
58
125
  if csrf_protection_get_is_okay then
59
126
  return if is_post || given_key == nil
60
127
  else
61
- return if keycheck_ok && referercheck_ok
128
+ return if keycheck_ok && provenance_ok
62
129
  end
63
130
 
64
131
  raise Exception.new(<<"EOS")
@@ -69,6 +136,8 @@ Security Error: Possible Cross-site Request Forgery (CSRF)
69
136
  - Mode is #{ self.mode || 'unknown' }
70
137
  - GET is #{ csrf_protection_get_is_okay ? '' : 'not '}allowed
71
138
  - Request Method is #{ is_post ? 'POST' : 'not POST' }
139
+ - Origin is #{ origin ? h(origin) : 'nothing' }
140
+ - Sec-Fetch-Site is #{ sec_fetch_site ? h(sec_fetch_site) : 'nothing' }
72
141
  - Referer is #{ referer_is_empty ? 'empty' : referer_is_config ? 'config' : 'another page' }
73
142
  - Given referer: #{h referer_uri.to_s}
74
143
  - Expected base URI: #{h base_uri.to_s}
@@ -91,11 +160,11 @@ EOS
91
160
  def initialize( cgi, rhtm, conf )
92
161
  super
93
162
 
94
- if @cgi.valid?( 'date' ) then
95
- if @cgi.params['date'][0].kind_of?( String ) then
96
- date = @cgi.params['date'][0]
163
+ if @request.valid?( 'date' ) then
164
+ if @request.param('date').kind_of?( String ) then
165
+ date = @request.param('date')
97
166
  else
98
- date = @cgi.params['date'][0].read
167
+ date = @request.param('date').read
99
168
  end
100
169
  @date = Time::local( *date.scan( /(\d{4})(\d\d)(\d\d)/ )[0] )
101
170
  else
@@ -125,7 +194,7 @@ EOS
125
194
 
126
195
  def initialize( cgi, rhtml, conf )
127
196
  super
128
- @key = @cgi.params['conf'][0] || ''
197
+ @key = @request.param('conf') || ''
129
198
  end
130
199
  end
131
200
 
data/lib/tdiary/base.rb CHANGED
@@ -203,7 +203,7 @@ module TDiary
203
203
  def initialize(cgi, rhtml, conf)
204
204
  super
205
205
 
206
- tdiary = tdiary_class(@cgi.params['date'][0] || '').new(@request, '', conf)
206
+ tdiary = tdiary_class(@request.param('date') || '').new(@request, '', conf)
207
207
  @date = tdiary.date
208
208
  @diaries = tdiary.diaries
209
209
  @last_modified = Time.now
@@ -221,7 +221,7 @@ module TDiary
221
221
 
222
222
  def plugin_name
223
223
  # plugin name MUST contain only words ([a-zA-Z0-9_])
224
- @plugin_name ||= (@cgi.params['plugin'][0] || '').match(/^(\w+)$/).to_a[1]
224
+ @plugin_name ||= (@request.param('plugin') || '').match(/^(\w+)$/).to_a[1]
225
225
  raise TDiary::PermissionError.new('invalid plugin name') unless @plugin_name
226
226
  @plugin_name
227
227
  end
@@ -1,4 +1,5 @@
1
1
  require 'stringio'
2
+ require 'tdiary/rack/error_handler'
2
3
 
3
4
  module TDiary
4
5
  #
@@ -23,9 +24,10 @@ module TDiary
23
24
 
24
25
  def run( request, dispatcher )
25
26
  env = build_env( request.env.to_hash, request.in, request.err )
26
- write_response( request.out, *dispatcher.call( env ) )
27
+ app = TDiary::Rack::ErrorHandler.new( dispatcher )
28
+ write_response( request.out, *app.call( env ) )
27
29
  rescue Exception => e
28
- write_error( request.out, e )
30
+ write_error( request, e )
29
31
  ensure
30
32
  request.finish
31
33
  end
@@ -69,9 +71,9 @@ module TDiary
69
71
  end
70
72
  end
71
73
 
72
- def write_error( out, e )
73
- body = "<h1>500 Internal Server Error</h1>\n<pre>#{CGI::escapeHTML( "#{e} (#{e.class})\n\n#{e.backtrace.join( "\n" )}" )}</pre>\n"
74
- write_response( out, 500, { 'content-type' => 'text/html' }, [body] )
74
+ def write_error( request, e )
75
+ TDiary::Rack::ErrorHandler.report( request.err, e )
76
+ write_response( request.out, 500, { 'content-type' => 'text/plain' }, ["500 Internal Server Error\n"] )
75
77
  end
76
78
  end
77
79
  end
@@ -16,37 +16,51 @@ module TDiary
16
16
  # built eagerly so that a clone (Object#clone copies instance
17
17
  # variables by reference) shares the same params Hash, like a
18
18
  # cloned CGI instance does. Plugins may still rely on this.
19
- @params = build_params
19
+ @params = request.cgi_params
20
20
  end
21
21
 
22
22
  attr_reader :params
23
23
 
24
- def valid?( param, idx = 0 )
25
- params[param] and params[param][idx] and params[param][idx].length > 0
24
+ # the env of the wrapped request, for the stateless RequestExtension
25
+ # readers (remote_addr, https?, tdiary_base_url, ...)
26
+ def env
27
+ @request.env
28
+ end
29
+
30
+ # the stateful RequestExtension readers delegate to the wrapped
31
+ # request, so core code reading the request directly sees the same
32
+ # params Hash and the same hidden-referer state as plugins do
33
+ # through this facade
34
+ def cgi_params
35
+ @request.cgi_params
36
+ end
37
+
38
+ def cgi_cookies
39
+ @request.cgi_cookies
40
+ end
41
+
42
+ def hide_referer!
43
+ @request.hide_referer!
44
+ end
45
+
46
+ def referer
47
+ @request.referer
26
48
  end
27
49
 
28
50
  def cookies
29
51
  # CGI::Cookie keeps the multi-value cookie behaviour (00default.rb
30
52
  # reads name and mail from the two values of the tdiary cookie)
31
- @cookies ||= CGI::Cookie.parse( env_table['HTTP_COOKIE'] )
53
+ cgi_cookies
32
54
  end
33
55
 
34
56
  def env_table
35
57
  @request.env
36
58
  end
37
59
 
38
- def referer
39
- env_table['HTTP_REFERER']
40
- end
41
-
42
60
  def user_agent
43
61
  env_table['HTTP_USER_AGENT']
44
62
  end
45
63
 
46
- def remote_addr
47
- env_table['REMOTE_ADDR']
48
- end
49
-
50
64
  def request_method
51
65
  env_table['REQUEST_METHOD']
52
66
  end
@@ -55,10 +69,6 @@ module TDiary
55
69
  env_table['SCRIPT_NAME']
56
70
  end
57
71
 
58
- def remote_user
59
- env_table['REMOTE_USER']
60
- end
61
-
62
72
  def auth_type
63
73
  env_table['AUTH_TYPE']
64
74
  end
@@ -77,12 +87,6 @@ module TDiary
77
87
 
78
88
  # the URL helpers below come from the CGI patches that used to live
79
89
  # in core_ext.rb
80
- def https?
81
- return true if env_table['HTTP_X_FORWARDED_PROTO'] == 'https'
82
- return false if env_table['HTTPS'].nil? or /off/i =~ env_table['HTTPS'] or env_table['HTTPS'] == ''
83
- true
84
- end
85
-
86
90
  def request_uri
87
91
  _request_uri = env_table['REQUEST_URI']
88
92
  _script_name = env_table['SCRIPT_NAME']
@@ -103,81 +107,7 @@ module TDiary
103
107
  end
104
108
 
105
109
  def base_url
106
- return '' unless script_name
107
- begin
108
- script_dirname = script_name.empty? ? '' : File::dirname(script_name)
109
- if https?
110
- port = (server_port == 443) ? '' : ':' + server_port.to_s
111
- "https://#{server_name}#{port}#{script_dirname}/"
112
- else
113
- port = (server_port == 80) ? '' : ':' + server_port.to_s
114
- "http://#{server_name}#{port}#{script_dirname}/"
115
- end.sub(%r|/+$|, '/')
116
- rescue SecurityError
117
- ''
118
- end
119
- end
120
-
121
- private
122
-
123
- def build_params
124
- source =
125
- if request_method == 'POST'
126
- if %r|\Amultipart/form-data|.match?( env_table['CONTENT_TYPE'].to_s )
127
- @request.POST
128
- else
129
- # Rack's nested query parser behind request.POST keeps only
130
- # the last of duplicated keys; CGI collects all of them.
131
- # CGI also splits on ';' as well as '&', and tDiary's own edit
132
- # links (00default.rb, edit_today.rb) still use ';'
133
- ::Rack::Utils.parse_query( read_raw_body, '&;' )
134
- end
135
- else
136
- ::Rack::Utils.parse_query( env_table['QUERY_STRING'].to_s, '&;' )
137
- end
138
-
139
- params = {}
140
- source.each do |key, value|
141
- values = value.kind_of?( Array ) ? value : [value]
142
- params[key] = values.map {|v| normalize_value( v ) }
143
- end
144
- params.default = []
145
- params
146
- end
147
-
148
- def read_raw_body
149
- input = env_table['rack.input']
150
- return '' unless input
151
- # Rack::Request#POST leaves rack.input at EOF, so rewind first in
152
- # case the request params were already parsed
153
- input.rewind if input.respond_to?( :rewind )
154
- body = input.read
155
- input.rewind if input.respond_to?( :rewind )
156
- body || ''
157
- end
158
-
159
- def normalize_value( value )
160
- if value.kind_of?( Hash ) and value[:tempfile]
161
- # Rack multipart file upload: expose an object responding to
162
- # read, which is all the consumers use
163
- value[:tempfile]
164
- else
165
- repair_encoding( value.to_s )
166
- end
167
- end
168
-
169
- # CGI/FCGI hosting retries broken UTF-8 input as Shift_JIS (index.rb,
170
- # misc/lib/fcgi_patch.rb). The facade implements the same fallback on
171
- # each value: invalid UTF-8 is converted from Shift_JIS when possible,
172
- # otherwise scrubbed.
173
- def repair_encoding( str )
174
- str = str.dup.force_encoding( Encoding::UTF_8 ) unless str.encoding == Encoding::UTF_8
175
- return str if str.valid_encoding?
176
- begin
177
- str.dup.force_encoding( Encoding::Shift_JIS ).encode( Encoding::UTF_8 )
178
- rescue EncodingError
179
- str.scrub
180
- end
110
+ tdiary_base_url
181
111
  end
182
112
  end
183
113
  end
@@ -87,6 +87,7 @@ module TDiary
87
87
  :tdiary_version,
88
88
  :html_title, :author_name, :author_mail, :index_page, :hour_offset,
89
89
  :description, :icon, :banner, :x_frame_options,
90
+ :referrer_policy, :hsts,
90
91
  :header, :footer,
91
92
  :section_anchor, :comment_anchor, :date_format, :latest_limit, :show_nyear,
92
93
  :theme, :css,
@@ -155,6 +156,9 @@ module TDiary
155
156
 
156
157
  @html_title = '' unless @html_title
157
158
  @x_frame_options = nil unless @x_frame_options
159
+ @referrer_policy = 'strict-origin-when-cross-origin' unless @referrer_policy
160
+ @hsts = nil unless @hsts
161
+ @hsts = 'max-age=31536000' if @hsts == true
158
162
  @header = '' unless @header
159
163
  @footer = '' unless @footer
160
164