tdiary 5.4.0 → 5.5.0.beta1
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.
- checksums.yaml +4 -4
- data/Gemfile +25 -2
- data/Gemfile.lock +211 -61
- data/README.md +4 -4
- data/doc/HOWTO-make-plugin.md +1 -1
- data/doc/HOWTO-testing-tDiary.md +2 -2
- data/doc/INSTALL-cgi.md +7 -0
- data/doc/INSTALL-paas.md +11 -11
- data/doc/INSTALL.md +2 -2
- data/doc/README.en.md +1 -1
- data/doc/README.md +1 -1
- data/lib/aws/pa_api.rb +6 -2
- data/lib/tdiary/admin.rb +6 -4
- data/lib/tdiary/application.rb +17 -17
- data/lib/tdiary/author_only_base.rb +6 -13
- data/lib/tdiary/base.rb +52 -16
- data/lib/tdiary/cgi_adapter.rb +86 -0
- data/lib/tdiary/cgi_compat.rb +189 -0
- data/lib/tdiary/configuration.rb +1 -1
- data/lib/tdiary/core_ext.rb +4 -53
- data/lib/tdiary/diary_container.rb +23 -11
- data/lib/tdiary/dispatcher/index_main.rb +16 -16
- data/lib/tdiary/dispatcher/update_main.rb +16 -16
- data/lib/tdiary/dispatcher.rb +4 -28
- data/lib/tdiary/environment.rb +12 -0
- data/lib/tdiary/filter.rb +5 -2
- data/lib/tdiary/io/pstore.rb +6 -3
- data/lib/tdiary/plugin/00default.rb +10 -14
- data/lib/tdiary/plugin/05referer.rb +6 -6
- data/lib/tdiary/plugin/60sf.rb +1 -1
- data/lib/tdiary/plugin.rb +76 -16
- data/lib/tdiary/request.rb +11 -353
- data/lib/tdiary/tasks/db.rake +17 -4
- data/lib/tdiary/tasks/heroku.rake +9 -0
- data/lib/tdiary/tasks/release.rake +126 -146
- data/lib/tdiary/version.rb +1 -1
- data/lib/tdiary/view.rb +3 -3
- data/lib/tdiary.rb +3 -1
- data/misc/convert2.rb +3 -0
- data/misc/migrate.rb +3 -0
- data/misc/plugin/a.rb +1 -6
- data/misc/plugin/amazon.rb +5 -4
- data/misc/plugin/calendar2.rb +1 -1
- data/misc/plugin/en/disp_referrer.rb +1 -1
- data/misc/plugin/ja/disp_referrer.rb +1 -1
- data/misc/plugin/kw.rb +2 -21
- data/misc/plugin/makelirs.rb +1 -4
- data/tdiary.conf.sample +8 -0
- data/theme/base.css +15 -0
- data/vendor/bundle/ruby/3.4.0/bin/emot +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/hikidoc +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rackup +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/rake +29 -0
- data/vendor/bundle/ruby/3.4.0/bin/thor +29 -0
- data/vendor/bundle/ruby/3.4.0/cache/base64-0.3.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/cgi-0.5.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/date-3.5.1.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/emot-0.0.4.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/fastimage-2.4.1.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/hikidoc-0.1.1.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/logger-1.7.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/mail-2.9.1.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/mini_mime-1.1.5.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/net-imap-0.5.15.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/net-pop-0.1.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/net-protocol-0.2.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/net-smtp-0.5.1.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/pstore-0.2.1.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rack-3.2.6.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rack-session-2.1.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rackup-2.3.1.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/rake-13.4.2.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/thor-1.5.0.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/cache/timeout-0.6.1.gem +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/cgi-0.5.2/cgi/escape.so +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/cgi-0.5.2/gem.build_complete +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/cgi-0.5.2/gem_make.out +18 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/date_core.so +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/gem.build_complete +0 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/gem_make.out +24 -0
- data/vendor/bundle/ruby/3.4.0/extensions/x86_64-linux/3.4.0/date-3.5.1/mkmf.log +93 -0
- data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/LEGAL +60 -0
- data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/README.md +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/lib/base64.rb +381 -0
- data/vendor/bundle/ruby/3.4.0/gems/base64-0.3.0/sig/base64.rbs +355 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/README.md +98 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/ext/cgi/escape/Makefile +275 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/ext/cgi/escape/depend +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/ext/cgi/escape/escape.c +487 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/ext/cgi/escape/extconf.rb +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/cookie.rb +212 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/core.rb +1273 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/escape.rb +227 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/escape.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/html.rb +1040 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/session/pstore.rb +91 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/session.rb +574 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi/util.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/cgi-0.5.2/lib/cgi.rb +310 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/README.md +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/Makefile +273 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_core.c +10065 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_parse.c +3086 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_strftime.c +638 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_strptime.c +704 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/date_tmx.h +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/extconf.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/prereq.mk +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/zonetab.h +1564 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/ext/date/zonetab.list +330 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/lib/date.rb +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/date-3.5.1/lib/date_core.so +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/Gemfile +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/README.md +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/Rakefile +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/bin/emot +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/emot.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot/cli.rb +62 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot/map.rb +894 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot/symbol_ext.rb +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot/version.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/lib/emot.rb +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/spec/cli_spec.rb +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/spec/emot_spec.rb +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/emot-0.0.4/spec/spec_helper.rb +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/MIT-LICENSE +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/README.md +209 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage.rb +471 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/avif.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/bmp.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/exif.rb +76 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/fiber_stream.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/gif.rb +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/heic.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/ico.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/image_base.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/iso_bmff.rb +176 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/jpeg.rb +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/jxl.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/jxlc.rb +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/png.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/psd.rb +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/stream_util.rb +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/svg.rb +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/tiff.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/type_parser.rb +74 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/fastimage_parsing/webp.rb +60 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/fastimage-2.4.1/lib/fastimage.rb +73 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/COPYING +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/Gemfile +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/NEWS +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/NEWS.ja +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/README +95 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/README.ja +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/README.ja.md +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/README.md +114 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/Rakefile +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/TextFormattingRules +320 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/TextFormattingRules.ja +318 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/TextFormattingRules.ja.md +385 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/TextFormattingRules.md +388 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/bin/hikidoc +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/hikidoc.gemspec +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/lib/hikidoc.rb +912 -0
- data/vendor/bundle/ruby/3.4.0/gems/hikidoc-0.1.1/test/hikidoc_test.rb +514 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/README.md +104 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/errors.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/formatter.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/log_device.rb +265 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/period.rb +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/severity.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger/version.rb +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/logger-1.7.0/lib/logger.rb +789 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/MIT-LICENSE +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/README.md +771 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/attachments_list.rb +109 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/body.rb +305 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/configuration.rb +78 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/constants.rb +79 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/address.rb +258 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/address_list.rb +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/content_disposition_element.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/content_location_element.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/content_transfer_encoding_element.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/content_type_element.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/date_time_element.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/envelope_from_element.rb +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/message_ids_element.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/mime_version_element.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/phrase_list.rb +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements/received_element.rb +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/elements.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/7bit.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/8bit.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/base64.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/binary.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/identity.rb +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/quoted_printable.rb +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/transfer_encoding.rb +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings/unix_to_unix.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/encodings.rb +314 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/envelope.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/field.rb +313 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/field_list.rb +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/bcc_field.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/cc_field.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/comments_field.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/common_address_field.rb +162 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/common_date_field.rb +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/common_field.rb +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/common_message_id_field.rb +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_description_field.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_disposition_field.rb +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_id_field.rb +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_location_field.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_transfer_encoding_field.rb +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/content_type_field.rb +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/date_field.rb +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/from_field.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/in_reply_to_field.rb +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/keywords_field.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/message_id_field.rb +36 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/mime_version_field.rb +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/named_structured_field.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/named_unstructured_field.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/optional_field.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/parameter_hash.rb +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/received_field.rb +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/references_field.rb +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/reply_to_field.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_bcc_field.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_cc_field.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_date_field.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_from_field.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_message_id_field.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_sender_field.rb +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/resent_to_field.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/return_path_field.rb +60 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/sender_field.rb +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/structured_field.rb +24 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/subject_field.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/to_field.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields/unstructured_field.rb +189 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/fields.rb +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/header.rb +237 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/indifferent_hash.rb +147 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/mail.rb +267 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/matchers/attachment_matchers.rb +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/matchers/has_sent_mail.rb +201 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/message.rb +2159 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/multibyte/chars.rb +318 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/multibyte/unicode.rb +405 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/multibyte/utils.rb +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/multibyte.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/exim.rb +50 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/file_delivery.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/logger_delivery.rb +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/sendmail.rb +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/smtp.rb +200 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/smtp_connection.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/delivery_methods/test_mailer.rb +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/retriever_methods/base.rb +64 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/retriever_methods/imap.rb +190 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/retriever_methods/pop3.rb +143 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network/retriever_methods/test_retriever.rb +45 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/network.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parser_tools.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/address_lists_parser.rb +33245 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/address_lists_parser.rl +183 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_disposition_parser.rb +904 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_disposition_parser.rl +93 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_location_parser.rb +825 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_location_parser.rl +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_transfer_encoding_parser.rb +525 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_transfer_encoding_parser.rl +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_type_parser.rb +1051 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/content_type_parser.rl +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/date_time_parser.rb +894 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/date_time_parser.rl +73 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/envelope_from_parser.rb +3678 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/envelope_from_parser.rl +93 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/message_ids_parser.rb +5164 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/message_ids_parser.rl +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/mime_version_parser.rb +516 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/mime_version_parser.rl +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/phrase_lists_parser.rb +887 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/phrase_lists_parser.rl +94 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/received_parser.rb +8785 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/received_parser.rl +95 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc2045_content_type.rl +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc2045_mime.rl +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc2183_content_disposition.rl +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc3629_utf8.rl +19 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5234_abnf_core_rules.rl +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5322.rl +74 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5322_address.rl +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5322_date_time.rl +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers/rfc5322_lexical_tokens.rl +60 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parsers.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/part.rb +119 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/parts_list.rb +131 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/smtp_envelope.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/utilities.rb +576 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/values/unicode_tables.dat +0 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/version.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail/yaml.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/mail-2.9.1/lib/mail.rb +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/CHANGELOG +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/CODE_OF_CONDUCT.md +74 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/Gemfile +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/LICENSE.txt +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/README.md +114 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/Rakefile +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/bench/bench.rb +51 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/bin/console +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/bin/db_pull_request +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/bin/setup +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/lib/db/content_type_mime.db +880 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/lib/db/ext_mime.db +1201 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/lib/mini_mime/version.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/lib/mini_mime.rb +186 -0
- data/vendor/bundle/ruby/3.4.0/gems/mini_mime-1.1.5/mini_mime.gemspec +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/Gemfile +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/LICENSE.txt +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/README.md +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/Rakefile +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/docs/styles.css +85 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/authenticators.rb +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/command_data.rb +507 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config/attr_accessors.rb +75 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config/attr_inheritance.rb +90 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config/attr_type_coercion.rb +74 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config/attr_version_defaults.rb +93 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/config.rb +500 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/connection_state.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/data_encoding.rb +214 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/data_lite.rb +226 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/deprecated_client_options.rb +142 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/errors.rb +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/esearch_result.rb +219 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/fetch_data.rb +597 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/flags.rb +262 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/response_data.rb +1113 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/response_parser/parser_utils.rb +245 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/response_parser.rb +2282 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/response_reader.rb +92 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/anonymous_authenticator.rb +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/authentication_exchange.rb +139 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/authenticators.rb +122 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/client_adapter.rb +123 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/cram_md5_authenticator.rb +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/digest_md5_authenticator.rb +342 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/external_authenticator.rb +83 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/gs2_header.rb +80 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/login_authenticator.rb +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/oauthbearer_authenticator.rb +199 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/plain_authenticator.rb +101 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/protocol_adapters.rb +101 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/scram_algorithm.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/scram_authenticator.rb +361 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/stringprep.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl/xoauth2_authenticator.rb +106 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl.rb +182 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sasl_adapter.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/search_result.rb +145 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/sequence_set.rb +1952 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/nameprep.rb +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/saslprep.rb +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/saslprep_tables.rb +96 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/tables.rb +146 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep/trace.rb +85 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/stringprep.rb +159 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/uidplus_data.rb +244 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap/vanished_data.rb +65 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/lib/net/imap.rb +3968 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/net-imap.gemspec +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/benchmarks.rake +91 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/rdoc.rake +70 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/rfcs.rake +170 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/saslprep.rake +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/rakelib/string_prep_tables_generator.rb +449 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-imap-0.5.15/sample/net-imap.rb +167 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/Gemfile +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/README.md +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/Rakefile +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/lib/net/pop.rb +1025 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-pop-0.1.2/net-pop.gemspec +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/Gemfile +7 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/LICENSE.txt +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/README.md +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/Rakefile +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/bin/console +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/bin/setup +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/lib/net/protocol.rb +544 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-protocol-0.2.2/net-protocol.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/LICENSE.txt +2 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/NEWS.md +133 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/README.md +97 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/auth_cram_md5.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/auth_login.rb +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/auth_plain.rb +9 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/auth_xoauth2.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp/authenticator.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/lib/net/smtp.rb +1164 -0
- data/vendor/bundle/ruby/3.4.0/gems/net-smtp-0.5.1/net-smtp.gemspec +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/Gemfile +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/README.md +95 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/Rakefile +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/bin/console +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/bin/setup +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/lib/pstore.rb +736 -0
- data/vendor/bundle/ruby/3.4.0/gems/pstore-0.2.1/pstore.gemspec +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/CHANGELOG.md +1346 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/CONTRIBUTING.md +144 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/MIT-LICENSE +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/README.md +384 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/SPEC.rdoc +258 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/auth/abstract/handler.rb +41 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/auth/abstract/request.rb +51 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/auth/basic.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/bad_request.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/body_proxy.rb +63 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/builder.rb +296 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/cascade.rb +67 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/common_logger.rb +89 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/conditional_get.rb +87 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/config.rb +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/constants.rb +68 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/content_length.rb +34 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/content_type.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/deflater.rb +158 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/directory.rb +208 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/etag.rb +71 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/events.rb +172 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/files.rb +216 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/head.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/headers.rb +238 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/lint.rb +964 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/lock.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/media_type.rb +52 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/method_override.rb +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/mime.rb +694 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/mock.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/mock_request.rb +161 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/mock_response.rb +156 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/multipart/generator.rb +99 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/multipart/parser.rb +621 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/multipart/uploaded_file.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/multipart.rb +77 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/null_logger.rb +48 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/query_parser.rb +261 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/recursive.rb +66 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/reloader.rb +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/request.rb +790 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/response.rb +403 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/rewindable_input.rb +116 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/runtime.rb +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/sendfile.rb +197 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/show_exceptions.rb +409 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/show_status.rb +121 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/static.rb +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/tempfile_reaper.rb +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/urlmap.rb +99 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/utils.rb +714 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack/version.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-3.2.6/lib/rack.rb +64 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/abstract/id.rb +535 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/constants.rb +13 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/cookie.rb +315 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/encryptor.rb +415 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/pool.rb +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session/version.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/lib/rack/session.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/license.md +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/readme.md +47 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/releases.md +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rack-session-2.1.2/security.md +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/bin/rackup +5 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler/cgi.rb +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler/webrick.rb +196 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler.rb +113 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/lobster.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/server.rb +462 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/stream.rb +199 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/version.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup.rb +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/license.md +80 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/readme.md +82 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/releases.md +28 -0
- data/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/security.md +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/History.rdoc +2454 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/MIT-LICENSE +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/README.rdoc +155 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/command_line_usage.rdoc +171 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile1 +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/Rakefile2 +35 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/a.c +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/b.c +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/example/main.c +11 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/glossary.rdoc +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/jamis.rb +592 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/proto_rake.rdoc +127 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rake.1 +156 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rakefile.rdoc +635 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/doc/rational.rdoc +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/exe/rake +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/application.rb +847 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/backtrace.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/clean.rb +78 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cloneable.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/cpu_counter.rb +122 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/default_loader.rb +15 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/dsl_definition.rb +196 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/early_time.rb +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/core.rb +26 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/ext/string.rb +176 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_creation_task.rb +25 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_list.rb +435 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_task.rb +58 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils.rb +137 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/file_utils_ext.rb +135 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_chain.rb +57 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/invocation_exception_mixin.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/late_time.rb +18 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/linked_list.rb +112 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/loaders/makefile.rb +54 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/multi_task.rb +14 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/name_space.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/options.rb +31 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/packagetask.rb +222 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/phony.rb +16 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/private_reader.rb +21 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/promise.rb +100 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/pseudo_status.rb +30 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_module.rb +67 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rake_test_loader.rb +27 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/rule_recursion_overflow_error.rb +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/scope.rb +43 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task.rb +434 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_argument_error.rb +8 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_arguments.rb +113 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/task_manager.rb +333 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/tasklib.rb +12 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/testtask.rb +192 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_history_display.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/thread_pool.rb +157 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/trace_output.rb +23 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/version.rb +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake/win32.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/lib/rake.rb +69 -0
- data/vendor/bundle/ruby/3.4.0/gems/rake-13.4.2/rake.gemspec +102 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/CONTRIBUTING.md +32 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/LICENSE.md +20 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/README.md +44 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/bin/thor +6 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/create_file.rb +105 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/create_link.rb +61 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/directory.rb +108 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/empty_directory.rb +143 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/file_manipulation.rb +407 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions/inject_into_file.rb +163 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/actions.rb +340 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/base.rb +826 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/command.rb +151 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/core_ext/hash_with_indifferent_access.rb +107 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/error.rb +106 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/group.rb +292 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/invocation.rb +178 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/line_editor/basic.rb +37 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/line_editor/readline.rb +88 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/line_editor.rb +17 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/nested_context.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser/argument.rb +86 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser/arguments.rb +195 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser/option.rb +178 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser/options.rb +294 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/parser.rb +4 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/rake_compat.rb +72 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/runner.rb +335 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/basic.rb +392 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/color.rb +117 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/column_printer.rb +29 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/html.rb +84 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/lcs_diff.rb +49 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/table_printer.rb +118 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/terminal.rb +42 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell/wrapped_printer.rb +38 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/shell.rb +81 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/util.rb +285 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor/version.rb +3 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/lib/thor.rb +707 -0
- data/vendor/bundle/ruby/3.4.0/gems/thor-1.5.0/thor.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/BSDL +22 -0
- data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/COPYING +56 -0
- data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/Gemfile +10 -0
- data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/README.md +39 -0
- data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/lib/timeout.rb +314 -0
- data/vendor/bundle/ruby/3.4.0/gems/timeout-0.6.1/timeout.gemspec +33 -0
- data/vendor/bundle/ruby/3.4.0/specifications/base64-0.3.0.gemspec +23 -0
- data/vendor/bundle/ruby/3.4.0/specifications/cgi-0.5.2.gemspec +25 -0
- data/vendor/bundle/ruby/3.4.0/specifications/date-3.5.1.gemspec +25 -0
- data/vendor/bundle/ruby/3.4.0/specifications/emot-0.0.4.gemspec +30 -0
- data/vendor/bundle/ruby/3.4.0/specifications/fastimage-2.4.1.gemspec +32 -0
- data/vendor/bundle/ruby/3.4.0/specifications/hikidoc-0.1.1.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/specifications/logger-1.7.0.gemspec +22 -0
- data/vendor/bundle/ruby/3.4.0/specifications/mail-2.9.1.gemspec +38 -0
- data/vendor/bundle/ruby/3.4.0/specifications/mini_mime-1.1.5.gemspec +30 -0
- data/vendor/bundle/ruby/3.4.0/specifications/net-imap-0.5.15.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/specifications/net-pop-0.1.2.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/specifications/net-protocol-0.2.2.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/specifications/net-smtp-0.5.1.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/specifications/pstore-0.2.1.gemspec +22 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rack-3.2.6.gemspec +31 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rack-session-2.1.2.gemspec +30 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rackup-2.3.1.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/specifications/rake-13.4.2.gemspec +26 -0
- data/vendor/bundle/ruby/3.4.0/specifications/thor-1.5.0.gemspec +28 -0
- data/vendor/bundle/ruby/3.4.0/specifications/timeout-0.6.1.gemspec +22 -0
- metadata +595 -20
- data/js/02edit.js +0 -15
- data/lib/tdiary/compatible.rb +0 -56
- data/misc/lib/fcgi_patch.rb +0 -89
- data/misc/paas/heroku/Gemfile.local +0 -12
- data/misc/paas/heroku/Gemfile.lock +0 -287
- data/public/index.rdf +0 -22
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "openssl"
|
|
4
|
+
require "securerandom"
|
|
5
|
+
|
|
6
|
+
require_relative "gs2_header"
|
|
7
|
+
require_relative "scram_algorithm"
|
|
8
|
+
|
|
9
|
+
module Net
|
|
10
|
+
class IMAP
|
|
11
|
+
module SASL
|
|
12
|
+
|
|
13
|
+
# Abstract base class for the "+SCRAM-*+" family of SASL mechanisms,
|
|
14
|
+
# defined in RFC5802[https://www.rfc-editor.org/rfc/rfc5802]. Use via
|
|
15
|
+
# Net::IMAP#authenticate.
|
|
16
|
+
#
|
|
17
|
+
# Directly supported:
|
|
18
|
+
# * +SCRAM-SHA-1+ --- ScramSHA1Authenticator
|
|
19
|
+
# * +SCRAM-SHA-256+ --- ScramSHA256Authenticator
|
|
20
|
+
#
|
|
21
|
+
# New +SCRAM-*+ mechanisms can easily be added for any hash algorithm
|
|
22
|
+
# supported by
|
|
23
|
+
# OpenSSL::Digest[https://ruby.github.io/openssl/OpenSSL/Digest.html].
|
|
24
|
+
# Subclasses need only set an appropriate +DIGEST_NAME+ constant.
|
|
25
|
+
#
|
|
26
|
+
# === SCRAM algorithm
|
|
27
|
+
#
|
|
28
|
+
# See the documentation and method definitions on ScramAlgorithm for an
|
|
29
|
+
# overview of the algorithm. The different mechanisms differ only by
|
|
30
|
+
# which hash function that is used (or by support for channel binding with
|
|
31
|
+
# +-PLUS+).
|
|
32
|
+
#
|
|
33
|
+
# See also the methods on GS2Header.
|
|
34
|
+
#
|
|
35
|
+
# ==== Server messages
|
|
36
|
+
#
|
|
37
|
+
# As server messages are received, they are validated and loaded into
|
|
38
|
+
# the various attributes, e.g: #snonce, #salt, #iterations, #verifier,
|
|
39
|
+
# #server_error, etc.
|
|
40
|
+
#
|
|
41
|
+
# Unlike many other SASL mechanisms, the +SCRAM-*+ family supports mutual
|
|
42
|
+
# authentication and can return server error data in the server messages.
|
|
43
|
+
# If #process raises an Error for the server-final-message, then
|
|
44
|
+
# server_error may contain error details.
|
|
45
|
+
#
|
|
46
|
+
# === TLS Channel binding
|
|
47
|
+
#
|
|
48
|
+
# <em>The <tt>SCRAM-*-PLUS</tt> mechanisms and channel binding are not
|
|
49
|
+
# supported yet.</em>
|
|
50
|
+
#
|
|
51
|
+
# === Caching SCRAM secrets
|
|
52
|
+
#
|
|
53
|
+
# <em>Caching of salted_password, client_key, stored_key, and server_key
|
|
54
|
+
# is not supported yet.</em>
|
|
55
|
+
#
|
|
56
|
+
class ScramAuthenticator
|
|
57
|
+
include GS2Header
|
|
58
|
+
include ScramAlgorithm
|
|
59
|
+
|
|
60
|
+
# :call-seq:
|
|
61
|
+
# new(username, password, **options) -> auth_ctx
|
|
62
|
+
# new(username:, password:, **options) -> auth_ctx
|
|
63
|
+
# new(authcid:, password:, **options) -> auth_ctx
|
|
64
|
+
#
|
|
65
|
+
# Creates an authenticator for one of the "+SCRAM-*+" SASL mechanisms.
|
|
66
|
+
# Each subclass defines #digest to match a specific mechanism.
|
|
67
|
+
#
|
|
68
|
+
# Called by Net::IMAP#authenticate and similar methods on other clients.
|
|
69
|
+
#
|
|
70
|
+
# === Parameters
|
|
71
|
+
#
|
|
72
|
+
# * #authcid ― Identity whose #password is used.
|
|
73
|
+
#
|
|
74
|
+
# #username - An alias for #authcid.
|
|
75
|
+
# * #password ― Password or passphrase associated with this #username.
|
|
76
|
+
# * _optional_ #authzid ― Alternate identity to act as or on behalf of.
|
|
77
|
+
# * _optional_ #min_iterations - Overrides the default value (4096).
|
|
78
|
+
# * _optional_ #max_iterations - Overrides the default value (2³¹ - 1).
|
|
79
|
+
#
|
|
80
|
+
# Any other keyword parameters are quietly ignored.
|
|
81
|
+
#
|
|
82
|
+
# *NOTE:* <em>It is the user's responsibility</em> to enforce minimum
|
|
83
|
+
# and maximum iteration counts that are appropriate for their security
|
|
84
|
+
# context.
|
|
85
|
+
def initialize(username_arg = nil, password_arg = nil,
|
|
86
|
+
authcid: nil, username: nil,
|
|
87
|
+
authzid: nil,
|
|
88
|
+
password: nil, secret: nil,
|
|
89
|
+
min_iterations: 4096, # see both RFC5802 and RFC7677
|
|
90
|
+
max_iterations: 2**31 - 1, # max int32
|
|
91
|
+
cnonce: nil, # must only be set in tests
|
|
92
|
+
**options)
|
|
93
|
+
@username = username || username_arg || authcid or
|
|
94
|
+
raise ArgumentError, "missing username (authcid)"
|
|
95
|
+
@password = password || secret || password_arg or
|
|
96
|
+
raise ArgumentError, "missing password"
|
|
97
|
+
@authzid = authzid
|
|
98
|
+
|
|
99
|
+
@min_iterations = Integer min_iterations
|
|
100
|
+
@min_iterations.positive? or
|
|
101
|
+
raise ArgumentError, "min_iterations must be positive"
|
|
102
|
+
|
|
103
|
+
@max_iterations = Integer max_iterations.to_int
|
|
104
|
+
@min_iterations <= @max_iterations or
|
|
105
|
+
raise ArgumentError, "max_iterations must be more than min_iterations"
|
|
106
|
+
|
|
107
|
+
@cnonce = cnonce || SecureRandom.base64(32)
|
|
108
|
+
|
|
109
|
+
# These attrs are set from the server challenges
|
|
110
|
+
@server_first_message = @snonce = @salt = @iterations = nil
|
|
111
|
+
@server_error = nil
|
|
112
|
+
|
|
113
|
+
# Memoized after @salt and @iterations have been sent.
|
|
114
|
+
@salted_password = @client_key = @server_key = nil
|
|
115
|
+
|
|
116
|
+
# These values are created and cached in response to server challenges
|
|
117
|
+
@client_first_message_bare = nil
|
|
118
|
+
@client_final_message_without_proof = nil
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Authentication identity: the identity that matches the #password.
|
|
122
|
+
#
|
|
123
|
+
# RFC-2831[https://www.rfc-editor.org/rfc/rfc2831] uses the term
|
|
124
|
+
# +username+. "Authentication identity" is the generic term used by
|
|
125
|
+
# RFC-4422[https://www.rfc-editor.org/rfc/rfc4422].
|
|
126
|
+
# RFC-4616[https://www.rfc-editor.org/rfc/rfc4616] and many later RFCs
|
|
127
|
+
# abbreviate this to +authcid+.
|
|
128
|
+
attr_reader :username
|
|
129
|
+
alias authcid username
|
|
130
|
+
|
|
131
|
+
# A password or passphrase that matches the #username.
|
|
132
|
+
attr_reader :password
|
|
133
|
+
alias secret password
|
|
134
|
+
|
|
135
|
+
# Authorization identity: an identity to act as or on behalf of. The
|
|
136
|
+
# identity form is application protocol specific. If not provided or
|
|
137
|
+
# left blank, the server derives an authorization identity from the
|
|
138
|
+
# authentication identity. For example, an administrator or superuser
|
|
139
|
+
# might take on another role:
|
|
140
|
+
#
|
|
141
|
+
# imap.authenticate "SCRAM-SHA-256", "root", passwd, authzid: "user"
|
|
142
|
+
#
|
|
143
|
+
# The server is responsible for verifying the client's credentials and
|
|
144
|
+
# verifying that the identity it associates with the client's
|
|
145
|
+
# authentication identity is allowed to act as (or on behalf of) the
|
|
146
|
+
# authorization identity.
|
|
147
|
+
attr_reader :authzid
|
|
148
|
+
|
|
149
|
+
# The minimal allowed iteration count. Lower #iterations will raise an
|
|
150
|
+
# Error.
|
|
151
|
+
#
|
|
152
|
+
# *WARNING:* The default value (4096) is set to match guidance from
|
|
153
|
+
# both {RFC5802}[https://www.rfc-editor.org/rfc/rfc5802#page-12]
|
|
154
|
+
# and RFC7677[https://www.rfc-editor.org/rfc/rfc7677#section-4], but
|
|
155
|
+
# {modern recommendations}[https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html#pbkdf2]
|
|
156
|
+
# are significantly higher.
|
|
157
|
+
#
|
|
158
|
+
# It is ultimately the server's responsibility to securely store
|
|
159
|
+
# password hashes. While this parameter can alert the user to
|
|
160
|
+
# insecure password storage and prevent insecure authentication
|
|
161
|
+
# exchange, updating the iteration count generally requires resetting
|
|
162
|
+
# the password on the server.
|
|
163
|
+
attr_reader :min_iterations
|
|
164
|
+
|
|
165
|
+
# The maximal allowed iteration count. Higher #iterations will raise an
|
|
166
|
+
# Error.
|
|
167
|
+
#
|
|
168
|
+
# As noted in {RFC5802}[https://www.rfc-editor.org/rfc/rfc5802#section-9]
|
|
169
|
+
# >>>
|
|
170
|
+
# A hostile server can perform a computational denial-of-service
|
|
171
|
+
# attack on clients by sending a big iteration count value.
|
|
172
|
+
#
|
|
173
|
+
# *WARNING:* The default value is <tt>2³¹ - 1</tt>, the maximum signed
|
|
174
|
+
# 32-bit integer. This is large enough for the computation to take
|
|
175
|
+
# several minutes, and insufficient protection against hostile servers.
|
|
176
|
+
#
|
|
177
|
+
# Note that <tt>OpenSSL::KDF.pbkdf2_hmac</tt> is implemented by a
|
|
178
|
+
# blocking C function, and cannot be interrupted by +Timeout+ or
|
|
179
|
+
# <tt>Thread.raise</tt>. And it keeps the Global VM lock, as of v4.0 of
|
|
180
|
+
# the +openssl+ gem, so other ruby threads will not be able to run.
|
|
181
|
+
#
|
|
182
|
+
# <em>To prevent a denial of service attack,</em> this must be set to a
|
|
183
|
+
# safe value, depending on hardware and version of OpenSSL. <em>It is
|
|
184
|
+
# the user's responsibility</em> to enforce minimum and maximum
|
|
185
|
+
# iteration counts that are appropriate for their security context.
|
|
186
|
+
attr_reader :max_iterations
|
|
187
|
+
|
|
188
|
+
# The client nonce, generated by SecureRandom
|
|
189
|
+
attr_reader :cnonce
|
|
190
|
+
|
|
191
|
+
# The server nonce, which must start with #cnonce
|
|
192
|
+
attr_reader :snonce
|
|
193
|
+
|
|
194
|
+
# The salt used by the server for this user
|
|
195
|
+
attr_reader :salt
|
|
196
|
+
|
|
197
|
+
# The iteration count for the selected hash function and user
|
|
198
|
+
attr_reader :iterations
|
|
199
|
+
|
|
200
|
+
# An error reported by the server during the \SASL exchange.
|
|
201
|
+
#
|
|
202
|
+
# Does not include errors reported by the protocol, e.g.
|
|
203
|
+
# Net::IMAP::NoResponseError.
|
|
204
|
+
attr_reader :server_error
|
|
205
|
+
|
|
206
|
+
# Memoized ScramAlgorithm#salted_password (needs #salt and #iterations)
|
|
207
|
+
def salted_password; @salted_password ||= compute_salted { super } end
|
|
208
|
+
|
|
209
|
+
# Memoized ScramAlgorithm#client_key (needs #salt and #iterations)
|
|
210
|
+
def client_key; @client_key ||= compute_salted { super } end
|
|
211
|
+
|
|
212
|
+
# Memoized ScramAlgorithm#server_key (needs #salt and #iterations)
|
|
213
|
+
def server_key; @server_key ||= compute_salted { super } end
|
|
214
|
+
|
|
215
|
+
# Returns a new OpenSSL::Digest object, set to the appropriate hash
|
|
216
|
+
# function for the chosen mechanism.
|
|
217
|
+
#
|
|
218
|
+
# <em>The class's +DIGEST_NAME+ constant must be set to the name of an
|
|
219
|
+
# algorithm supported by OpenSSL::Digest.</em>
|
|
220
|
+
def digest; OpenSSL::Digest.new self.class::DIGEST_NAME end
|
|
221
|
+
|
|
222
|
+
# See {RFC5802 §7}[https://www.rfc-editor.org/rfc/rfc5802#section-7]
|
|
223
|
+
# +client-first-message+.
|
|
224
|
+
def initial_client_response
|
|
225
|
+
"#{gs2_header}#{client_first_message_bare}"
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# responds to the server's challenges
|
|
229
|
+
def process(challenge)
|
|
230
|
+
case (@state ||= :initial_client_response)
|
|
231
|
+
when :initial_client_response
|
|
232
|
+
initial_client_response.tap { @state = :server_first_message }
|
|
233
|
+
when :server_first_message
|
|
234
|
+
recv_server_first_message challenge
|
|
235
|
+
final_message_with_proof.tap { @state = :server_final_message }
|
|
236
|
+
when :server_final_message
|
|
237
|
+
recv_server_final_message challenge
|
|
238
|
+
"".tap { @state = :done }
|
|
239
|
+
else
|
|
240
|
+
raise Error, "server sent after complete, %p" % [challenge]
|
|
241
|
+
end
|
|
242
|
+
rescue Exception => ex
|
|
243
|
+
@state = ex
|
|
244
|
+
raise
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# Is the authentication exchange complete?
|
|
248
|
+
#
|
|
249
|
+
# If false, another server continuation is required.
|
|
250
|
+
def done?; @state == :done end
|
|
251
|
+
|
|
252
|
+
private
|
|
253
|
+
|
|
254
|
+
# Checks for +salt+ and +iterations+ before yielding
|
|
255
|
+
def compute_salted
|
|
256
|
+
salt in String or raise Error, "unknown salt"
|
|
257
|
+
iterations in Integer or raise Error, "unknown iterations"
|
|
258
|
+
yield
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# Need to store this for auth_message
|
|
262
|
+
attr_reader :server_first_message
|
|
263
|
+
|
|
264
|
+
def format_message(hash) hash.map { _1.join("=") }.join(",") end
|
|
265
|
+
|
|
266
|
+
def recv_server_first_message(server_first_message)
|
|
267
|
+
@server_first_message = server_first_message
|
|
268
|
+
sparams = parse_challenge server_first_message
|
|
269
|
+
@snonce = sparams["r"] or
|
|
270
|
+
raise Error, "server did not send nonce"
|
|
271
|
+
@salt = sparams["s"]&.unpack1("m") or
|
|
272
|
+
raise Error, "server did not send salt"
|
|
273
|
+
@iterations = sparams["i"]&.then {|i| Integer i } or
|
|
274
|
+
raise Error, "server did not send iteration count"
|
|
275
|
+
min_iterations <= iterations or
|
|
276
|
+
raise Error, "too few iterations: %d" % [iterations]
|
|
277
|
+
max_iterations.nil? || iterations <= max_iterations or
|
|
278
|
+
raise Error, "too many iterations: %d" % [iterations]
|
|
279
|
+
mext = sparams["m"] and
|
|
280
|
+
raise Error, "mandatory extension: %p" % [mext]
|
|
281
|
+
snonce.start_with? cnonce or
|
|
282
|
+
raise Error, "invalid server nonce"
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def recv_server_final_message(server_final_message)
|
|
286
|
+
sparams = parse_challenge server_final_message
|
|
287
|
+
@server_error = sparams["e"] and
|
|
288
|
+
raise Error, "server error: %s" % [server_error]
|
|
289
|
+
verifier = sparams["v"].unpack1("m") or
|
|
290
|
+
raise Error, "server did not send verifier"
|
|
291
|
+
verifier == server_signature or
|
|
292
|
+
raise Error, "server verify failed: %p != %p" % [
|
|
293
|
+
server_signature, verifier
|
|
294
|
+
]
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# See {RFC5802 §7}[https://www.rfc-editor.org/rfc/rfc5802#section-7]
|
|
298
|
+
# +client-first-message-bare+.
|
|
299
|
+
def client_first_message_bare
|
|
300
|
+
@client_first_message_bare ||=
|
|
301
|
+
format_message(n: gs2_saslname_encode(SASL.saslprep(username)),
|
|
302
|
+
r: cnonce)
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# See {RFC5802 §7}[https://www.rfc-editor.org/rfc/rfc5802#section-7]
|
|
306
|
+
# +client-final-message+.
|
|
307
|
+
def final_message_with_proof
|
|
308
|
+
proof = [client_proof].pack("m0")
|
|
309
|
+
"#{client_final_message_without_proof},p=#{proof}"
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# See {RFC5802 §7}[https://www.rfc-editor.org/rfc/rfc5802#section-7]
|
|
313
|
+
# +client-final-message-without-proof+.
|
|
314
|
+
def client_final_message_without_proof
|
|
315
|
+
@client_final_message_without_proof ||=
|
|
316
|
+
format_message(c: [cbind_input].pack("m0"), # channel-binding
|
|
317
|
+
r: snonce) # nonce
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# See {RFC5802 §7}[https://www.rfc-editor.org/rfc/rfc5802#section-7]
|
|
321
|
+
# +cbind-input+.
|
|
322
|
+
#
|
|
323
|
+
# >>>
|
|
324
|
+
# *TODO:* implement channel binding, appending +cbind-data+ here.
|
|
325
|
+
alias cbind_input gs2_header
|
|
326
|
+
|
|
327
|
+
# RFC5802 specifies "that the order of attributes in client or server
|
|
328
|
+
# messages is fixed, with the exception of extension attributes", but
|
|
329
|
+
# this parses it simply as a hash, without respect to order. Note that
|
|
330
|
+
# repeated keys (violating the spec) will use the last value.
|
|
331
|
+
def parse_challenge(challenge)
|
|
332
|
+
challenge.split(/,/).to_h {|pair| pair.split(/=/, 2) }
|
|
333
|
+
rescue ArgumentError
|
|
334
|
+
raise Error, "unparsable challenge: %p" % [challenge]
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
# Authenticator for the "+SCRAM-SHA-1+" SASL mechanism, defined in
|
|
340
|
+
# RFC5802[https://www.rfc-editor.org/rfc/rfc5802].
|
|
341
|
+
#
|
|
342
|
+
# Uses the "SHA-1" digest algorithm from OpenSSL::Digest.
|
|
343
|
+
#
|
|
344
|
+
# See ScramAuthenticator.
|
|
345
|
+
class ScramSHA1Authenticator < ScramAuthenticator
|
|
346
|
+
DIGEST_NAME = "SHA1"
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
# Authenticator for the "+SCRAM-SHA-256+" SASL mechanism, defined in
|
|
350
|
+
# RFC7677[https://www.rfc-editor.org/rfc/rfc7677].
|
|
351
|
+
#
|
|
352
|
+
# Uses the "SHA-256" digest algorithm from OpenSSL::Digest.
|
|
353
|
+
#
|
|
354
|
+
# See ScramAuthenticator.
|
|
355
|
+
class ScramSHA256Authenticator < ScramAuthenticator
|
|
356
|
+
DIGEST_NAME = "SHA256"
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
end
|
|
360
|
+
end
|
|
361
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Net::IMAP::SASL
|
|
4
|
+
|
|
5
|
+
# Alias for Net::IMAP::StringPrep::SASLprep.
|
|
6
|
+
SASLprep = Net::IMAP::StringPrep::SASLprep
|
|
7
|
+
StringPrep = Net::IMAP::StringPrep # :nodoc:
|
|
8
|
+
BidiStringError = Net::IMAP::StringPrep::BidiStringError # :nodoc:
|
|
9
|
+
ProhibitedCodepoint = Net::IMAP::StringPrep::ProhibitedCodepoint # :nodoc:
|
|
10
|
+
StringPrepError = Net::IMAP::StringPrep::StringPrepError # :nodoc:
|
|
11
|
+
|
|
12
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Authenticator for the "+XOAUTH2+" SASL mechanism. This mechanism was
|
|
4
|
+
# originally created for GMail and widely adopted by hosted email providers.
|
|
5
|
+
# +XOAUTH2+ has been documented by
|
|
6
|
+
# Google[https://developers.google.com/gmail/imap/xoauth2-protocol] and
|
|
7
|
+
# Microsoft[https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth].
|
|
8
|
+
#
|
|
9
|
+
# This mechanism requires an OAuth2 access token which has been authorized
|
|
10
|
+
# with the appropriate OAuth2 scopes to access the user's services. Most of
|
|
11
|
+
# these scopes are not standardized---consult each service provider's
|
|
12
|
+
# documentation for their scopes.
|
|
13
|
+
#
|
|
14
|
+
# Although this mechanism was never standardized and has been obsoleted by
|
|
15
|
+
# "+OAUTHBEARER+", it is still very widely supported.
|
|
16
|
+
#
|
|
17
|
+
# See Net::IMAP::SASL::OAuthBearerAuthenticator.
|
|
18
|
+
class Net::IMAP::SASL::XOAuth2Authenticator
|
|
19
|
+
|
|
20
|
+
# It is unclear from {Google's original XOAUTH2
|
|
21
|
+
# documentation}[https://developers.google.com/gmail/imap/xoauth2-protocol],
|
|
22
|
+
# whether "User" refers to the authentication identity (+authcid+) or the
|
|
23
|
+
# authorization identity (+authzid+). The authentication identity is
|
|
24
|
+
# established for the client by the OAuth token, so it seems that +username+
|
|
25
|
+
# must be the authorization identity.
|
|
26
|
+
#
|
|
27
|
+
# {Microsoft's documentation for shared
|
|
28
|
+
# mailboxes}[https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth#sasl-xoauth2-authentication-for-shared-mailboxes-in-office-365]
|
|
29
|
+
# _clearly_ indicates that the Office 365 server interprets it as the
|
|
30
|
+
# authorization identity.
|
|
31
|
+
#
|
|
32
|
+
# Although they _should_ validate that the token has been authorized to access
|
|
33
|
+
# the service for +username+, _some_ servers appear to ignore this field,
|
|
34
|
+
# relying only the identity and scope authorized by the token.
|
|
35
|
+
attr_reader :username
|
|
36
|
+
|
|
37
|
+
# Note that, unlike most other authenticators, #username is an alias for the
|
|
38
|
+
# authorization identity and not the authentication identity. The
|
|
39
|
+
# authenticated identity is established for the client by the #oauth2_token.
|
|
40
|
+
alias authzid username
|
|
41
|
+
|
|
42
|
+
# An OAuth2 access token which has been authorized with the appropriate OAuth2
|
|
43
|
+
# scopes to use the service for #username.
|
|
44
|
+
attr_reader :oauth2_token
|
|
45
|
+
alias secret oauth2_token
|
|
46
|
+
|
|
47
|
+
# :call-seq:
|
|
48
|
+
# new(username, oauth2_token, **) -> authenticator
|
|
49
|
+
# new(username:, oauth2_token:, **) -> authenticator
|
|
50
|
+
# new(authzid:, oauth2_token:, **) -> authenticator
|
|
51
|
+
#
|
|
52
|
+
# Creates an Authenticator for the "+XOAUTH2+" SASL mechanism, as specified by
|
|
53
|
+
# Google[https://developers.google.com/gmail/imap/xoauth2-protocol],
|
|
54
|
+
# Microsoft[https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth]
|
|
55
|
+
# and Yahoo[https://senders.yahooinc.com/developer/documentation].
|
|
56
|
+
#
|
|
57
|
+
# === Properties
|
|
58
|
+
#
|
|
59
|
+
# * #username --- the username for the account being accessed.
|
|
60
|
+
#
|
|
61
|
+
# #authzid --- an alias for #username.
|
|
62
|
+
#
|
|
63
|
+
# Note that, unlike some other authenticators, +username+ sets the
|
|
64
|
+
# _authorization_ identity and not the _authentication_ identity. The
|
|
65
|
+
# authenticated identity is established for the client with the OAuth token.
|
|
66
|
+
#
|
|
67
|
+
# * #oauth2_token --- An OAuth2.0 access token which is authorized to access
|
|
68
|
+
# the service for #username.
|
|
69
|
+
#
|
|
70
|
+
# Any other keyword parameters are quietly ignored.
|
|
71
|
+
def initialize(user = nil, token = nil, username: nil, oauth2_token: nil,
|
|
72
|
+
authzid: nil, secret: nil, **)
|
|
73
|
+
@username = authzid || username || user or
|
|
74
|
+
raise ArgumentError, "missing username (authzid)"
|
|
75
|
+
@oauth2_token = oauth2_token || secret || token or
|
|
76
|
+
raise ArgumentError, "missing oauth2_token"
|
|
77
|
+
@done = false
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# :call-seq:
|
|
81
|
+
# initial_response? -> true
|
|
82
|
+
#
|
|
83
|
+
# +XOAUTH2+ can send an initial client response.
|
|
84
|
+
def initial_response?; true end
|
|
85
|
+
|
|
86
|
+
# Returns the XOAUTH2 formatted response, which combines the +username+
|
|
87
|
+
# with the +oauth2_token+.
|
|
88
|
+
def process(_data)
|
|
89
|
+
build_oauth2_string(@username, @oauth2_token)
|
|
90
|
+
ensure
|
|
91
|
+
@done = true
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Returns true when the initial client response was sent.
|
|
95
|
+
#
|
|
96
|
+
# The authentication should not succeed unless this returns true, but it
|
|
97
|
+
# does *not* indicate success.
|
|
98
|
+
def done?; @done end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
def build_oauth2_string(username, oauth2_token)
|
|
103
|
+
format("user=%s\1auth=Bearer %s\1\1", username, oauth2_token)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
end
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Net
|
|
4
|
+
class IMAP
|
|
5
|
+
|
|
6
|
+
# Pluggable authentication mechanisms for protocols which support SASL
|
|
7
|
+
# (Simple Authentication and Security Layer), such as IMAP4, SMTP, LDAP, and
|
|
8
|
+
# XMPP. {RFC-4422}[https://www.rfc-editor.org/rfc/rfc4422] specifies the
|
|
9
|
+
# common \SASL framework:
|
|
10
|
+
# >>>
|
|
11
|
+
# SASL is conceptually a framework that provides an abstraction layer
|
|
12
|
+
# between protocols and mechanisms as illustrated in the following
|
|
13
|
+
# diagram.
|
|
14
|
+
#
|
|
15
|
+
# SMTP LDAP XMPP Other protocols ...
|
|
16
|
+
# \ | | /
|
|
17
|
+
# \ | | /
|
|
18
|
+
# SASL abstraction layer
|
|
19
|
+
# / | | \
|
|
20
|
+
# / | | \
|
|
21
|
+
# EXTERNAL GSSAPI PLAIN Other mechanisms ...
|
|
22
|
+
#
|
|
23
|
+
# Net::IMAP uses SASL via the Net::IMAP#authenticate method.
|
|
24
|
+
#
|
|
25
|
+
# == Mechanisms
|
|
26
|
+
#
|
|
27
|
+
# Each mechanism has different properties and requirements. Please consult
|
|
28
|
+
# the documentation for the specific mechanisms you are using:
|
|
29
|
+
#
|
|
30
|
+
# +ANONYMOUS+::
|
|
31
|
+
# See AnonymousAuthenticator.
|
|
32
|
+
#
|
|
33
|
+
# Allows the user to gain access to public services or resources without
|
|
34
|
+
# authenticating or disclosing an identity.
|
|
35
|
+
#
|
|
36
|
+
# +EXTERNAL+::
|
|
37
|
+
# See ExternalAuthenticator.
|
|
38
|
+
#
|
|
39
|
+
# Authenticates using already established credentials, such as a TLS
|
|
40
|
+
# certificate or IPSec.
|
|
41
|
+
#
|
|
42
|
+
# +OAUTHBEARER+::
|
|
43
|
+
# See OAuthBearerAuthenticator.
|
|
44
|
+
#
|
|
45
|
+
# Login using an OAuth2 Bearer token. This is the standard mechanism
|
|
46
|
+
# for using OAuth2 with \SASL, but it is not yet deployed as widely as
|
|
47
|
+
# +XOAUTH2+.
|
|
48
|
+
#
|
|
49
|
+
# +PLAIN+::
|
|
50
|
+
# See PlainAuthenticator.
|
|
51
|
+
#
|
|
52
|
+
# Login using clear-text username and password.
|
|
53
|
+
#
|
|
54
|
+
# +SCRAM-SHA-1+::
|
|
55
|
+
# +SCRAM-SHA-256+::
|
|
56
|
+
# See ScramAuthenticator.
|
|
57
|
+
#
|
|
58
|
+
# Login by username and password. The password is not sent to the
|
|
59
|
+
# server but is used in a salted challenge/response exchange.
|
|
60
|
+
# +SCRAM-SHA-1+ and +SCRAM-SHA-256+ are directly supported by
|
|
61
|
+
# Net::IMAP::SASL. New authenticators can easily be added for any other
|
|
62
|
+
# <tt>SCRAM-*</tt> mechanism if the digest algorithm is supported by
|
|
63
|
+
# OpenSSL::Digest.
|
|
64
|
+
#
|
|
65
|
+
# +XOAUTH2+::
|
|
66
|
+
# See XOAuth2Authenticator.
|
|
67
|
+
#
|
|
68
|
+
# Login using a username and an OAuth2 access token. Non-standard and
|
|
69
|
+
# obsoleted by +OAUTHBEARER+, but widely supported.
|
|
70
|
+
#
|
|
71
|
+
# See the {SASL mechanism
|
|
72
|
+
# registry}[https://www.iana.org/assignments/sasl-mechanisms/sasl-mechanisms.xhtml]
|
|
73
|
+
# for a list of all SASL mechanisms and their specifications. To register
|
|
74
|
+
# new authenticators, see Authenticators.
|
|
75
|
+
#
|
|
76
|
+
# === Deprecated mechanisms
|
|
77
|
+
#
|
|
78
|
+
# <em>Obsolete mechanisms should be avoided, but are still available for
|
|
79
|
+
# backwards compatibility.</em>
|
|
80
|
+
#
|
|
81
|
+
# >>>
|
|
82
|
+
# For +DIGEST-MD5+ see DigestMD5Authenticator.
|
|
83
|
+
#
|
|
84
|
+
# For +LOGIN+, see LoginAuthenticator.
|
|
85
|
+
#
|
|
86
|
+
# For +CRAM-MD5+, see CramMD5Authenticator.
|
|
87
|
+
#
|
|
88
|
+
# <em>Using a deprecated mechanism will print a warning.</em>
|
|
89
|
+
#
|
|
90
|
+
module SASL
|
|
91
|
+
# Exception class for any client error detected during the authentication
|
|
92
|
+
# exchange.
|
|
93
|
+
#
|
|
94
|
+
# When the _server_ reports an authentication failure, it will respond
|
|
95
|
+
# with a protocol specific error instead, e.g: +BAD+ or +NO+ in IMAP.
|
|
96
|
+
#
|
|
97
|
+
# When the client encounters any error, it *must* consider the
|
|
98
|
+
# authentication exchange to be unsuccessful and it might need to drop the
|
|
99
|
+
# connection. For example, if the server reports that the authentication
|
|
100
|
+
# exchange was successful or the protocol does not allow additional
|
|
101
|
+
# authentication attempts.
|
|
102
|
+
Error = Class.new(StandardError)
|
|
103
|
+
|
|
104
|
+
# Indicates an authentication exchange that will be or has been canceled
|
|
105
|
+
# by the client, not due to any error or failure during processing.
|
|
106
|
+
AuthenticationCanceled = Class.new(Error)
|
|
107
|
+
|
|
108
|
+
# Indicates an error when processing a server challenge, e.g: an invalid
|
|
109
|
+
# or unparsable challenge. An underlying exception may be available as
|
|
110
|
+
# the exception's #cause.
|
|
111
|
+
AuthenticationError = Class.new(Error)
|
|
112
|
+
|
|
113
|
+
# Indicates that authentication cannot proceed because one of the server's
|
|
114
|
+
# messages has not passed integrity checks.
|
|
115
|
+
AuthenticationFailed = Class.new(Error)
|
|
116
|
+
|
|
117
|
+
# Indicates that authentication cannot proceed because the server ended
|
|
118
|
+
# authentication prematurely.
|
|
119
|
+
class AuthenticationIncomplete < AuthenticationFailed
|
|
120
|
+
# The success response from the server
|
|
121
|
+
attr_reader :response
|
|
122
|
+
|
|
123
|
+
def initialize(response, message = "authentication ended prematurely")
|
|
124
|
+
super(message)
|
|
125
|
+
@response = response
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# autoloading to avoid loading all of the regexps when they aren't used.
|
|
130
|
+
sasl_stringprep_rb = File.expand_path("sasl/stringprep", __dir__)
|
|
131
|
+
autoload :StringPrep, sasl_stringprep_rb
|
|
132
|
+
autoload :SASLprep, sasl_stringprep_rb
|
|
133
|
+
autoload :StringPrepError, sasl_stringprep_rb
|
|
134
|
+
autoload :ProhibitedCodepoint, sasl_stringprep_rb
|
|
135
|
+
autoload :BidiStringError, sasl_stringprep_rb
|
|
136
|
+
|
|
137
|
+
sasl_dir = File.expand_path("sasl", __dir__)
|
|
138
|
+
autoload :AuthenticationExchange, "#{sasl_dir}/authentication_exchange"
|
|
139
|
+
autoload :ClientAdapter, "#{sasl_dir}/client_adapter"
|
|
140
|
+
autoload :ProtocolAdapters, "#{sasl_dir}/protocol_adapters"
|
|
141
|
+
|
|
142
|
+
autoload :Authenticators, "#{sasl_dir}/authenticators"
|
|
143
|
+
autoload :GS2Header, "#{sasl_dir}/gs2_header"
|
|
144
|
+
autoload :ScramAlgorithm, "#{sasl_dir}/scram_algorithm"
|
|
145
|
+
|
|
146
|
+
autoload :AnonymousAuthenticator, "#{sasl_dir}/anonymous_authenticator"
|
|
147
|
+
autoload :ExternalAuthenticator, "#{sasl_dir}/external_authenticator"
|
|
148
|
+
autoload :OAuthBearerAuthenticator, "#{sasl_dir}/oauthbearer_authenticator"
|
|
149
|
+
autoload :PlainAuthenticator, "#{sasl_dir}/plain_authenticator"
|
|
150
|
+
autoload :ScramAuthenticator, "#{sasl_dir}/scram_authenticator"
|
|
151
|
+
autoload :ScramSHA1Authenticator, "#{sasl_dir}/scram_authenticator"
|
|
152
|
+
autoload :ScramSHA256Authenticator, "#{sasl_dir}/scram_authenticator"
|
|
153
|
+
autoload :XOAuth2Authenticator, "#{sasl_dir}/xoauth2_authenticator"
|
|
154
|
+
|
|
155
|
+
autoload :CramMD5Authenticator, "#{sasl_dir}/cram_md5_authenticator"
|
|
156
|
+
autoload :DigestMD5Authenticator, "#{sasl_dir}/digest_md5_authenticator"
|
|
157
|
+
autoload :LoginAuthenticator, "#{sasl_dir}/login_authenticator"
|
|
158
|
+
|
|
159
|
+
# Returns the default global SASL::Authenticators instance.
|
|
160
|
+
def self.authenticators; @authenticators ||= Authenticators.new end
|
|
161
|
+
|
|
162
|
+
# Creates a new SASL authenticator, using SASL::Authenticators#new.
|
|
163
|
+
#
|
|
164
|
+
# +registry+ defaults to SASL.authenticators. All other arguments are
|
|
165
|
+
# forwarded to to <tt>registry.new</tt>.
|
|
166
|
+
def self.authenticator(*args, registry: authenticators, **kwargs, &block)
|
|
167
|
+
registry.new(*args, **kwargs, &block)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Delegates to ::authenticators. See Authenticators#add_authenticator.
|
|
171
|
+
def self.add_authenticator(...) authenticators.add_authenticator(...) end
|
|
172
|
+
|
|
173
|
+
module_function
|
|
174
|
+
|
|
175
|
+
# See Net::IMAP::StringPrep::SASLprep#saslprep.
|
|
176
|
+
def saslprep(string, **opts)
|
|
177
|
+
Net::IMAP::StringPrep::SASLprep.saslprep(string, **opts)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Net
|
|
4
|
+
class IMAP
|
|
5
|
+
|
|
6
|
+
# Experimental
|
|
7
|
+
class SASLAdapter < SASL::ClientAdapter
|
|
8
|
+
include SASL::ProtocolAdapters::IMAP
|
|
9
|
+
|
|
10
|
+
RESPONSE_ERRORS = [NoResponseError, BadResponseError, ByeResponseError]
|
|
11
|
+
.freeze
|
|
12
|
+
|
|
13
|
+
def response_errors; RESPONSE_ERRORS end
|
|
14
|
+
def sasl_ir_capable?; client.capable?("SASL-IR") end
|
|
15
|
+
def drop_connection; client.logout! end
|
|
16
|
+
def drop_connection!; client.disconnect end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|