shopify-cli 1.3.1 → 1.7.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.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +2 -2
- data/.github/CONTRIBUTING.md +9 -1
- data/.github/PULL_REQUEST_TEMPLATE.md +10 -1
- data/.github/workflows/release.yml +61 -0
- data/.github/workflows/triage.yml +22 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +61 -8
- data/.rubocop_todo.yml +11 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +30 -0
- data/Gemfile +12 -11
- data/Gemfile.lock +39 -37
- data/README.md +39 -7
- data/RELEASING.md +19 -29
- data/Rakefile +32 -28
- data/bin/load_shopify.rb +6 -6
- data/bin/shopify +2 -2
- data/dev.yml +2 -2
- data/docs/_config.yml +1 -18
- data/docs/app/node/commands/index.md +2 -80
- data/docs/app/node/index.md +2 -33
- data/docs/app/rails/commands/index.md +2 -78
- data/docs/app/rails/index.md +2 -34
- data/docs/core/index.md +2 -84
- data/docs/getting-started/index.md +2 -25
- data/docs/getting-started/install/index.md +1 -118
- data/docs/getting-started/migrate/index.md +2 -94
- data/docs/getting-started/uninstall/index.md +2 -35
- data/docs/getting-started/upgrade/index.md +2 -39
- data/docs/help/start-app/index.md +2 -4
- data/docs/index.md +2 -24
- data/ext/shopify-cli/extconf.rb +7 -7
- data/install.sh +1 -1
- data/lib/docgen/markdown.rb +11 -11
- data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
- data/lib/project_types/extension/cli.rb +64 -47
- data/lib/project_types/extension/commands/build.rb +3 -3
- data/lib/project_types/extension/commands/create.rb +16 -9
- data/lib/project_types/extension/commands/extension_command.rb +8 -5
- data/lib/project_types/extension/commands/push.rb +8 -8
- data/lib/project_types/extension/commands/register.rb +19 -30
- data/lib/project_types/extension/commands/serve.rb +2 -2
- data/lib/project_types/extension/commands/tunnel.rb +12 -12
- data/lib/project_types/extension/extension_project.rb +4 -4
- data/lib/project_types/extension/extension_project_keys.rb +4 -4
- data/lib/project_types/extension/features/argo.rb +117 -0
- data/lib/project_types/extension/features/argo_config.rb +5 -5
- data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
- data/lib/project_types/extension/features/argo_setup.rb +2 -2
- data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
- data/lib/project_types/extension/forms/create.rb +28 -34
- data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
- data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
- data/lib/project_types/extension/forms/questions/ask_type.rb +36 -0
- data/lib/project_types/extension/messages/messages.rb +53 -52
- data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
- data/lib/project_types/extension/models/specification.rb +35 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
- data/lib/project_types/extension/models/specification_handlers/default.rb +67 -0
- data/lib/project_types/extension/models/specifications.rb +77 -0
- data/lib/project_types/extension/tasks/configure_features.rb +52 -0
- data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
- data/lib/project_types/extension/tasks/converters/registration_converter.rb +6 -6
- data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
- data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
- data/lib/project_types/extension/tasks/create_extension.rb +4 -4
- data/lib/project_types/extension/tasks/fetch_specifications.rb +38 -0
- data/lib/project_types/extension/tasks/get_app.rb +4 -4
- data/lib/project_types/extension/tasks/get_apps.rb +3 -3
- data/lib/project_types/extension/tasks/update_draft.rb +4 -4
- data/lib/project_types/extension/tasks/user_errors.rb +4 -4
- data/lib/project_types/node/cli.rb +19 -16
- data/lib/project_types/node/commands/connect.rb +15 -0
- data/lib/project_types/node/commands/create.rb +46 -38
- data/lib/project_types/node/commands/deploy.rb +4 -4
- data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
- data/lib/project_types/node/commands/generate.rb +9 -18
- data/lib/project_types/node/commands/open.rb +2 -2
- data/lib/project_types/node/commands/populate.rb +6 -6
- data/lib/project_types/node/commands/populate/customer.rb +5 -5
- data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
- data/lib/project_types/node/commands/populate/product.rb +5 -5
- data/lib/project_types/node/commands/serve.rb +9 -9
- data/lib/project_types/node/commands/tunnel.rb +7 -7
- data/lib/project_types/node/forms/create.rb +7 -7
- data/lib/project_types/node/messages/messages.rb +19 -53
- data/lib/project_types/rails/cli.rb +21 -18
- data/lib/project_types/rails/commands/connect.rb +15 -0
- data/lib/project_types/rails/commands/create.rb +60 -54
- data/lib/project_types/rails/commands/deploy.rb +4 -4
- data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
- data/lib/project_types/rails/commands/generate.rb +7 -7
- data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
- data/lib/project_types/rails/commands/open.rb +2 -2
- data/lib/project_types/rails/commands/populate.rb +6 -6
- data/lib/project_types/rails/commands/populate/customer.rb +5 -5
- data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
- data/lib/project_types/rails/commands/populate/product.rb +5 -5
- data/lib/project_types/rails/commands/serve.rb +11 -11
- data/lib/project_types/rails/commands/tunnel.rb +7 -7
- data/lib/project_types/rails/forms/create.rb +24 -24
- data/lib/project_types/rails/gem.rb +24 -24
- data/lib/project_types/rails/messages/messages.rb +12 -9
- data/lib/project_types/rails/ruby.rb +2 -2
- data/lib/project_types/script/cli.rb +42 -38
- data/lib/project_types/script/commands/create.rb +13 -10
- data/lib/project_types/script/commands/disable.rb +3 -3
- data/lib/project_types/script/commands/enable.rb +19 -9
- data/lib/project_types/script/commands/push.rb +10 -17
- data/lib/project_types/script/config/extension_points.yml +17 -12
- data/lib/project_types/script/errors.rb +38 -0
- data/lib/project_types/script/forms/create.rb +29 -5
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +12 -1
- data/lib/project_types/script/layers/application/build_script.rb +18 -19
- data/lib/project_types/script/layers/application/create_script.rb +13 -11
- data/lib/project_types/script/layers/application/disable_script.rb +2 -2
- data/lib/project_types/script/layers/application/enable_script.rb +2 -2
- data/lib/project_types/script/layers/application/extension_points.rb +24 -0
- data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
- data/lib/project_types/script/layers/application/push_script.rb +12 -18
- data/lib/project_types/script/layers/domain/errors.rb +7 -0
- data/lib/project_types/script/layers/domain/extension_point.rb +62 -7
- data/lib/project_types/script/layers/domain/metadata.rb +55 -0
- data/lib/project_types/script/layers/domain/push_package.rb +29 -6
- data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +19 -54
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +49 -18
- data/lib/project_types/script/layers/infrastructure/errors.rb +17 -1
- data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
- data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +20 -13
- data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
- data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
- data/lib/project_types/script/layers/infrastructure/script_service.rb +26 -16
- data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
- data/lib/project_types/script/messages/messages.rb +67 -10
- data/lib/project_types/script/script_project.rb +47 -16
- data/lib/project_types/script/ui/error_handler.rb +115 -45
- data/lib/project_types/script/ui/printing_spinner.rb +1 -1
- data/lib/project_types/script/ui/strict_spinner.rb +1 -1
- data/lib/project_types/theme/cli.rb +40 -0
- data/lib/project_types/theme/commands/connect.rb +54 -0
- data/lib/project_types/theme/commands/create.rb +48 -0
- data/lib/project_types/theme/commands/deploy.rb +38 -0
- data/lib/project_types/theme/commands/generate.rb +20 -0
- data/lib/project_types/theme/commands/generate/env.rb +79 -0
- data/lib/project_types/theme/commands/push.rb +55 -0
- data/lib/project_types/theme/commands/serve.rb +31 -0
- data/lib/project_types/theme/forms/connect.rb +34 -0
- data/lib/project_types/theme/forms/create.rb +22 -0
- data/lib/project_types/theme/messages/messages.rb +147 -0
- data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
- data/lib/project_types/theme/themekit.rb +113 -0
- data/lib/rubygems_plugin.rb +3 -3
- data/lib/shopify-cli/admin_api.rb +52 -12
- data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
- data/lib/shopify-cli/admin_api/schema.rb +3 -3
- data/lib/shopify-cli/api.rb +38 -37
- data/lib/shopify-cli/command.rb +1 -1
- data/lib/shopify-cli/commands.rb +9 -9
- data/lib/shopify-cli/commands/config.rb +28 -28
- data/lib/shopify-cli/commands/connect.rb +35 -18
- data/lib/shopify-cli/commands/create.rb +5 -5
- data/lib/shopify-cli/commands/help.rb +6 -6
- data/lib/shopify-cli/commands/logout.rb +3 -3
- data/lib/shopify-cli/commands/system.rb +40 -31
- data/lib/shopify-cli/commands/version.rb +2 -2
- data/lib/shopify-cli/context.rb +43 -22
- data/lib/shopify-cli/core.rb +4 -4
- data/lib/shopify-cli/core/entry_point.rb +6 -6
- data/lib/shopify-cli/core/executor.rb +1 -1
- data/lib/shopify-cli/core/help_resolver.rb +2 -2
- data/lib/shopify-cli/core/monorail.rb +21 -19
- data/lib/shopify-cli/db.rb +2 -2
- data/lib/shopify-cli/feature.rb +1 -3
- data/lib/shopify-cli/form.rb +1 -1
- data/lib/shopify-cli/git.rb +17 -17
- data/lib/shopify-cli/helpers.rb +1 -1
- data/lib/shopify-cli/helpers/haikunator.rb +1 -1
- data/lib/shopify-cli/heroku.rb +28 -28
- data/lib/shopify-cli/http_request.rb +27 -0
- data/lib/shopify-cli/js_deps.rb +13 -13
- data/lib/shopify-cli/js_system.rb +5 -5
- data/lib/shopify-cli/lazy_delegator.rb +55 -0
- data/lib/shopify-cli/messages/messages.rb +24 -10
- data/lib/shopify-cli/method_object.rb +104 -0
- data/lib/shopify-cli/oauth.rb +25 -25
- data/lib/shopify-cli/oauth/servlet.rb +9 -9
- data/lib/shopify-cli/options.rb +3 -3
- data/lib/shopify-cli/packager.rb +24 -24
- data/lib/shopify-cli/partners_api.rb +38 -16
- data/lib/shopify-cli/partners_api/organizations.rb +10 -10
- data/lib/shopify-cli/process_supervision.rb +8 -8
- data/lib/shopify-cli/project.rb +27 -23
- data/lib/shopify-cli/project_type.rb +21 -5
- data/lib/shopify-cli/resolve_constant.rb +25 -0
- data/lib/shopify-cli/resources.rb +1 -1
- data/lib/shopify-cli/resources/env_file.rb +9 -9
- data/lib/shopify-cli/result.rb +432 -0
- data/lib/shopify-cli/shopifolk.rb +84 -0
- data/lib/shopify-cli/sub_command.rb +1 -1
- data/lib/shopify-cli/task.rb +9 -1
- data/lib/shopify-cli/tasks.rb +7 -7
- data/lib/shopify-cli/tasks/create_api_client.rb +17 -6
- data/lib/shopify-cli/tasks/ensure_dev_store.rb +11 -11
- data/lib/shopify-cli/tasks/ensure_env.rb +18 -15
- data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
- data/lib/shopify-cli/tasks/select_org_and_shop.rb +29 -24
- data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
- data/lib/shopify-cli/transform_data_structure.rb +86 -0
- data/lib/shopify-cli/tunnel.rb +36 -30
- data/lib/shopify-cli/version.rb +1 -1
- data/lib/shopify_cli.rb +57 -51
- data/shopify-cli.gemspec +6 -6
- data/shopify.fish +1 -1
- data/shopify.sh +1 -1
- data/vendor/deps/cli-kit/REVISION +1 -1
- data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
- data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
- data/vendor/deps/cli-ui/REVISION +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
- data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
- data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
- data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
- data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
- data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
- data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
- data/vendor/deps/webrick/.gitignore +9 -0
- data/vendor/deps/webrick/Gemfile +3 -0
- data/vendor/deps/webrick/LICENSE.txt +22 -0
- data/vendor/deps/webrick/README.md +61 -0
- data/vendor/deps/webrick/Rakefile +10 -0
- data/vendor/deps/webrick/lib/webrick.rb +232 -0
- data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
- data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
- data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
- data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
- data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
- data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
- data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
- data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
- data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
- data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
- data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
- data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
- data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
- data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
- data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
- data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
- data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
- data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
- data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
- data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
- data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
- data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
- data/vendor/deps/webrick/webrick.gemspec +74 -0
- data/vendor/gen/template/bin/update-deps +9 -9
- metadata +84 -29
- data/docs/Gemfile +0 -5
- data/docs/Gemfile.lock +0 -258
- data/docs/_data/nav.yml +0 -35
- data/docs/_includes/footer.html +0 -15
- data/docs/_includes/head.html +0 -19
- data/docs/_includes/sidebar_nav.html +0 -22
- data/docs/_includes/toc.html +0 -112
- data/docs/_layouts/default.html +0 -79
- data/docs/css/docs.css +0 -157
- data/docs/images/header.png +0 -0
- data/docs/installing-ruby.md +0 -28
- data/lib/project_types/extension/features/argo/admin.rb +0 -20
- data/lib/project_types/extension/features/argo/base.rb +0 -129
- data/lib/project_types/extension/features/argo/checkout.rb +0 -20
- data/lib/project_types/extension/forms/register.rb +0 -47
- data/lib/project_types/extension/models/type.rb +0 -81
- data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
- data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
- data/lib/project_types/node/commands/generate/billing.rb +0 -39
- data/lib/project_types/node/commands/generate/page.rb +0 -59
- data/lib/project_types/node/commands/generate/webhook.rb +0 -37
- data/lib/project_types/script/layers/domain/script.rb +0 -18
- data/lib/project_types/script/layers/infrastructure/assemblyscript_tsconfig.rb +0 -38
- data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -59
- data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
- data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# cookie.rb -- Cookie class
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: cookie.rb,v 1.16 2002/09/21 12:23:35 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
require 'time'
|
|
13
|
+
require_relative 'httputils'
|
|
14
|
+
|
|
15
|
+
module WEBrick
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Processes HTTP cookies
|
|
19
|
+
|
|
20
|
+
class Cookie
|
|
21
|
+
|
|
22
|
+
##
|
|
23
|
+
# The cookie name
|
|
24
|
+
|
|
25
|
+
attr_reader :name
|
|
26
|
+
|
|
27
|
+
##
|
|
28
|
+
# The cookie value
|
|
29
|
+
|
|
30
|
+
attr_accessor :value
|
|
31
|
+
|
|
32
|
+
##
|
|
33
|
+
# The cookie version
|
|
34
|
+
|
|
35
|
+
attr_accessor :version
|
|
36
|
+
|
|
37
|
+
##
|
|
38
|
+
# The cookie domain
|
|
39
|
+
attr_accessor :domain
|
|
40
|
+
|
|
41
|
+
##
|
|
42
|
+
# The cookie path
|
|
43
|
+
|
|
44
|
+
attr_accessor :path
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Is this a secure cookie?
|
|
48
|
+
|
|
49
|
+
attr_accessor :secure
|
|
50
|
+
|
|
51
|
+
##
|
|
52
|
+
# The cookie comment
|
|
53
|
+
|
|
54
|
+
attr_accessor :comment
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# The maximum age of the cookie
|
|
58
|
+
|
|
59
|
+
attr_accessor :max_age
|
|
60
|
+
|
|
61
|
+
#attr_accessor :comment_url, :discard, :port
|
|
62
|
+
|
|
63
|
+
##
|
|
64
|
+
# Creates a new cookie with the given +name+ and +value+
|
|
65
|
+
|
|
66
|
+
def initialize(name, value)
|
|
67
|
+
@name = name
|
|
68
|
+
@value = value
|
|
69
|
+
@version = 0 # Netscape Cookie
|
|
70
|
+
|
|
71
|
+
@domain = @path = @secure = @comment = @max_age =
|
|
72
|
+
@expires = @comment_url = @discard = @port = nil
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
##
|
|
76
|
+
# Sets the cookie expiration to the time +t+. The expiration time may be
|
|
77
|
+
# a false value to disable expiration or a Time or HTTP format time string
|
|
78
|
+
# to set the expiration date.
|
|
79
|
+
|
|
80
|
+
def expires=(t)
|
|
81
|
+
@expires = t && (t.is_a?(Time) ? t.httpdate : t.to_s)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
##
|
|
85
|
+
# Retrieves the expiration time as a Time
|
|
86
|
+
|
|
87
|
+
def expires
|
|
88
|
+
@expires && Time.parse(@expires)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
##
|
|
92
|
+
# The cookie string suitable for use in an HTTP header
|
|
93
|
+
|
|
94
|
+
def to_s
|
|
95
|
+
ret = +""
|
|
96
|
+
ret << @name << "=" << @value
|
|
97
|
+
ret << "; " << "Version=" << @version.to_s if @version > 0
|
|
98
|
+
ret << "; " << "Domain=" << @domain if @domain
|
|
99
|
+
ret << "; " << "Expires=" << @expires if @expires
|
|
100
|
+
ret << "; " << "Max-Age=" << @max_age.to_s if @max_age
|
|
101
|
+
ret << "; " << "Comment=" << @comment if @comment
|
|
102
|
+
ret << "; " << "Path=" << @path if @path
|
|
103
|
+
ret << "; " << "Secure" if @secure
|
|
104
|
+
ret
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
##
|
|
108
|
+
# Parses a Cookie field sent from the user-agent. Returns an array of
|
|
109
|
+
# cookies.
|
|
110
|
+
|
|
111
|
+
def self.parse(str)
|
|
112
|
+
if str
|
|
113
|
+
ret = []
|
|
114
|
+
cookie = nil
|
|
115
|
+
ver = 0
|
|
116
|
+
str.split(/;\s+/).each{|x|
|
|
117
|
+
key, val = x.split(/=/,2)
|
|
118
|
+
val = val ? HTTPUtils::dequote(val) : ""
|
|
119
|
+
case key
|
|
120
|
+
when "$Version"; ver = val.to_i
|
|
121
|
+
when "$Path"; cookie.path = val
|
|
122
|
+
when "$Domain"; cookie.domain = val
|
|
123
|
+
when "$Port"; cookie.port = val
|
|
124
|
+
else
|
|
125
|
+
ret << cookie if cookie
|
|
126
|
+
cookie = self.new(key, val)
|
|
127
|
+
cookie.version = ver
|
|
128
|
+
end
|
|
129
|
+
}
|
|
130
|
+
ret << cookie if cookie
|
|
131
|
+
ret
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
##
|
|
136
|
+
# Parses the cookie in +str+
|
|
137
|
+
|
|
138
|
+
def self.parse_set_cookie(str)
|
|
139
|
+
cookie_elem = str.split(/;/)
|
|
140
|
+
first_elem = cookie_elem.shift
|
|
141
|
+
first_elem.strip!
|
|
142
|
+
key, value = first_elem.split(/=/, 2)
|
|
143
|
+
cookie = new(key, HTTPUtils.dequote(value))
|
|
144
|
+
cookie_elem.each{|pair|
|
|
145
|
+
pair.strip!
|
|
146
|
+
key, value = pair.split(/=/, 2)
|
|
147
|
+
if value
|
|
148
|
+
value = HTTPUtils.dequote(value.strip)
|
|
149
|
+
end
|
|
150
|
+
case key.downcase
|
|
151
|
+
when "domain" then cookie.domain = value
|
|
152
|
+
when "path" then cookie.path = value
|
|
153
|
+
when "expires" then cookie.expires = value
|
|
154
|
+
when "max-age" then cookie.max_age = Integer(value)
|
|
155
|
+
when "comment" then cookie.comment = value
|
|
156
|
+
when "version" then cookie.version = Integer(value)
|
|
157
|
+
when "secure" then cookie.secure = true
|
|
158
|
+
end
|
|
159
|
+
}
|
|
160
|
+
return cookie
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
##
|
|
164
|
+
# Parses the cookies in +str+
|
|
165
|
+
|
|
166
|
+
def self.parse_set_cookies(str)
|
|
167
|
+
return str.split(/,(?=[^;,]*=)|,$/).collect{|c|
|
|
168
|
+
parse_set_cookie(c)
|
|
169
|
+
}
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#--
|
|
3
|
+
# htmlutils.rb -- HTMLUtils Module
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: htmlutils.rb,v 1.7 2002/09/21 12:23:35 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
module WEBrick
|
|
13
|
+
module HTMLUtils
|
|
14
|
+
|
|
15
|
+
##
|
|
16
|
+
# Escapes &, ", > and < in +string+
|
|
17
|
+
|
|
18
|
+
def escape(string)
|
|
19
|
+
return "" unless string
|
|
20
|
+
str = string.b
|
|
21
|
+
str.gsub!(/&/n, '&')
|
|
22
|
+
str.gsub!(/\"/n, '"')
|
|
23
|
+
str.gsub!(/>/n, '>')
|
|
24
|
+
str.gsub!(/</n, '<')
|
|
25
|
+
str.force_encoding(string.encoding)
|
|
26
|
+
end
|
|
27
|
+
module_function :escape
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# httpauth.rb -- HTTP access authentication
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2000, 2001 TAKAHASHI Masayoshi, GOTOU Yuuzou
|
|
7
|
+
# Copyright (c) 2002 Internet Programming with Ruby writers. All rights
|
|
8
|
+
# reserved.
|
|
9
|
+
#
|
|
10
|
+
# $IPR: httpauth.rb,v 1.14 2003/07/22 19:20:42 gotoyuzo Exp $
|
|
11
|
+
|
|
12
|
+
require_relative 'httpauth/basicauth'
|
|
13
|
+
require_relative 'httpauth/digestauth'
|
|
14
|
+
require_relative 'httpauth/htpasswd'
|
|
15
|
+
require_relative 'httpauth/htdigest'
|
|
16
|
+
require_relative 'httpauth/htgroup'
|
|
17
|
+
|
|
18
|
+
module WEBrick
|
|
19
|
+
|
|
20
|
+
##
|
|
21
|
+
# HTTPAuth provides both basic and digest authentication.
|
|
22
|
+
#
|
|
23
|
+
# To enable authentication for requests in WEBrick you will need a user
|
|
24
|
+
# database and an authenticator. To start, here's an Htpasswd database for
|
|
25
|
+
# use with a DigestAuth authenticator:
|
|
26
|
+
#
|
|
27
|
+
# config = { :Realm => 'DigestAuth example realm' }
|
|
28
|
+
#
|
|
29
|
+
# htpasswd = WEBrick::HTTPAuth::Htpasswd.new 'my_password_file'
|
|
30
|
+
# htpasswd.auth_type = WEBrick::HTTPAuth::DigestAuth
|
|
31
|
+
# htpasswd.set_passwd config[:Realm], 'username', 'password'
|
|
32
|
+
# htpasswd.flush
|
|
33
|
+
#
|
|
34
|
+
# The +:Realm+ is used to provide different access to different groups
|
|
35
|
+
# across several resources on a server. Typically you'll need only one
|
|
36
|
+
# realm for a server.
|
|
37
|
+
#
|
|
38
|
+
# This database can be used to create an authenticator:
|
|
39
|
+
#
|
|
40
|
+
# config[:UserDB] = htpasswd
|
|
41
|
+
#
|
|
42
|
+
# digest_auth = WEBrick::HTTPAuth::DigestAuth.new config
|
|
43
|
+
#
|
|
44
|
+
# To authenticate a request call #authenticate with a request and response
|
|
45
|
+
# object in a servlet:
|
|
46
|
+
#
|
|
47
|
+
# def do_GET req, res
|
|
48
|
+
# @authenticator.authenticate req, res
|
|
49
|
+
# end
|
|
50
|
+
#
|
|
51
|
+
# For digest authentication the authenticator must not be created every
|
|
52
|
+
# request, it must be passed in as an option via WEBrick::HTTPServer#mount.
|
|
53
|
+
|
|
54
|
+
module HTTPAuth
|
|
55
|
+
module_function
|
|
56
|
+
|
|
57
|
+
def _basic_auth(req, res, realm, req_field, res_field, err_type,
|
|
58
|
+
block) # :nodoc:
|
|
59
|
+
user = pass = nil
|
|
60
|
+
if /^Basic\s+(.*)/o =~ req[req_field]
|
|
61
|
+
userpass = $1
|
|
62
|
+
user, pass = userpass.unpack("m*")[0].split(":", 2)
|
|
63
|
+
end
|
|
64
|
+
if block.call(user, pass)
|
|
65
|
+
req.user = user
|
|
66
|
+
return
|
|
67
|
+
end
|
|
68
|
+
res[res_field] = "Basic realm=\"#{realm}\""
|
|
69
|
+
raise err_type
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
##
|
|
73
|
+
# Simple wrapper for providing basic authentication for a request. When
|
|
74
|
+
# called with a request +req+, response +res+, authentication +realm+ and
|
|
75
|
+
# +block+ the block will be called with a +username+ and +password+. If
|
|
76
|
+
# the block returns true the request is allowed to continue, otherwise an
|
|
77
|
+
# HTTPStatus::Unauthorized error is raised.
|
|
78
|
+
|
|
79
|
+
def basic_auth(req, res, realm, &block) # :yield: username, password
|
|
80
|
+
_basic_auth(req, res, realm, "Authorization", "WWW-Authenticate",
|
|
81
|
+
HTTPStatus::Unauthorized, block)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
##
|
|
85
|
+
# Simple wrapper for providing basic authentication for a proxied request.
|
|
86
|
+
# When called with a request +req+, response +res+, authentication +realm+
|
|
87
|
+
# and +block+ the block will be called with a +username+ and +password+.
|
|
88
|
+
# If the block returns true the request is allowed to continue, otherwise
|
|
89
|
+
# an HTTPStatus::ProxyAuthenticationRequired error is raised.
|
|
90
|
+
|
|
91
|
+
def proxy_basic_auth(req, res, realm, &block) # :yield: username, password
|
|
92
|
+
_basic_auth(req, res, realm, "Proxy-Authorization", "Proxy-Authenticate",
|
|
93
|
+
HTTPStatus::ProxyAuthenticationRequired, block)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#--
|
|
3
|
+
# httpauth/authenticator.rb -- Authenticator mix-in module.
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2003 Internet Programming with Ruby writers. All rights
|
|
7
|
+
# reserved.
|
|
8
|
+
#
|
|
9
|
+
# $IPR: authenticator.rb,v 1.3 2003/02/20 07:15:47 gotoyuzo Exp $
|
|
10
|
+
|
|
11
|
+
module WEBrick
|
|
12
|
+
module HTTPAuth
|
|
13
|
+
|
|
14
|
+
##
|
|
15
|
+
# Module providing generic support for both Digest and Basic
|
|
16
|
+
# authentication schemes.
|
|
17
|
+
|
|
18
|
+
module Authenticator
|
|
19
|
+
|
|
20
|
+
RequestField = "Authorization" # :nodoc:
|
|
21
|
+
ResponseField = "WWW-Authenticate" # :nodoc:
|
|
22
|
+
ResponseInfoField = "Authentication-Info" # :nodoc:
|
|
23
|
+
AuthException = HTTPStatus::Unauthorized # :nodoc:
|
|
24
|
+
|
|
25
|
+
##
|
|
26
|
+
# Method of authentication, must be overridden by the including class
|
|
27
|
+
|
|
28
|
+
AuthScheme = nil
|
|
29
|
+
|
|
30
|
+
##
|
|
31
|
+
# The realm this authenticator covers
|
|
32
|
+
|
|
33
|
+
attr_reader :realm
|
|
34
|
+
|
|
35
|
+
##
|
|
36
|
+
# The user database for this authenticator
|
|
37
|
+
|
|
38
|
+
attr_reader :userdb
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
# The logger for this authenticator
|
|
42
|
+
|
|
43
|
+
attr_reader :logger
|
|
44
|
+
|
|
45
|
+
private
|
|
46
|
+
|
|
47
|
+
# :stopdoc:
|
|
48
|
+
|
|
49
|
+
##
|
|
50
|
+
# Initializes the authenticator from +config+
|
|
51
|
+
|
|
52
|
+
def check_init(config)
|
|
53
|
+
[:UserDB, :Realm].each{|sym|
|
|
54
|
+
unless config[sym]
|
|
55
|
+
raise ArgumentError, "Argument #{sym.inspect} missing."
|
|
56
|
+
end
|
|
57
|
+
}
|
|
58
|
+
@realm = config[:Realm]
|
|
59
|
+
@userdb = config[:UserDB]
|
|
60
|
+
@logger = config[:Logger] || Log::new($stderr)
|
|
61
|
+
@reload_db = config[:AutoReloadUserDB]
|
|
62
|
+
@request_field = self::class::RequestField
|
|
63
|
+
@response_field = self::class::ResponseField
|
|
64
|
+
@resp_info_field = self::class::ResponseInfoField
|
|
65
|
+
@auth_exception = self::class::AuthException
|
|
66
|
+
@auth_scheme = self::class::AuthScheme
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
##
|
|
70
|
+
# Ensures +req+ has credentials that can be authenticated.
|
|
71
|
+
|
|
72
|
+
def check_scheme(req)
|
|
73
|
+
unless credentials = req[@request_field]
|
|
74
|
+
error("no credentials in the request.")
|
|
75
|
+
return nil
|
|
76
|
+
end
|
|
77
|
+
unless match = /^#{@auth_scheme}\s+/i.match(credentials)
|
|
78
|
+
error("invalid scheme in %s.", credentials)
|
|
79
|
+
info("%s: %s", @request_field, credentials) if $DEBUG
|
|
80
|
+
return nil
|
|
81
|
+
end
|
|
82
|
+
return match.post_match
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def log(meth, fmt, *args)
|
|
86
|
+
msg = format("%s %s: ", @auth_scheme, @realm)
|
|
87
|
+
msg << fmt % args
|
|
88
|
+
@logger.__send__(meth, msg)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def error(fmt, *args)
|
|
92
|
+
if @logger.error?
|
|
93
|
+
log(:error, fmt, *args)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def info(fmt, *args)
|
|
98
|
+
if @logger.info?
|
|
99
|
+
log(:info, fmt, *args)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# :startdoc:
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
##
|
|
107
|
+
# Module providing generic support for both Digest and Basic
|
|
108
|
+
# authentication schemes for proxies.
|
|
109
|
+
|
|
110
|
+
module ProxyAuthenticator
|
|
111
|
+
RequestField = "Proxy-Authorization" # :nodoc:
|
|
112
|
+
ResponseField = "Proxy-Authenticate" # :nodoc:
|
|
113
|
+
InfoField = "Proxy-Authentication-Info" # :nodoc:
|
|
114
|
+
AuthException = HTTPStatus::ProxyAuthenticationRequired # :nodoc:
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
#
|
|
3
|
+
# httpauth/basicauth.rb -- HTTP basic access authentication
|
|
4
|
+
#
|
|
5
|
+
# Author: IPR -- Internet Programming with Ruby -- writers
|
|
6
|
+
# Copyright (c) 2003 Internet Programming with Ruby writers. All rights
|
|
7
|
+
# reserved.
|
|
8
|
+
#
|
|
9
|
+
# $IPR: basicauth.rb,v 1.5 2003/02/20 07:15:47 gotoyuzo Exp $
|
|
10
|
+
|
|
11
|
+
require_relative '../config'
|
|
12
|
+
require_relative '../httpstatus'
|
|
13
|
+
require_relative 'authenticator'
|
|
14
|
+
|
|
15
|
+
module WEBrick
|
|
16
|
+
module HTTPAuth
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Basic Authentication for WEBrick
|
|
20
|
+
#
|
|
21
|
+
# Use this class to add basic authentication to a WEBrick servlet.
|
|
22
|
+
#
|
|
23
|
+
# Here is an example of how to set up a BasicAuth:
|
|
24
|
+
#
|
|
25
|
+
# config = { :Realm => 'BasicAuth example realm' }
|
|
26
|
+
#
|
|
27
|
+
# htpasswd = WEBrick::HTTPAuth::Htpasswd.new 'my_password_file', password_hash: :bcrypt
|
|
28
|
+
# htpasswd.set_passwd config[:Realm], 'username', 'password'
|
|
29
|
+
# htpasswd.flush
|
|
30
|
+
#
|
|
31
|
+
# config[:UserDB] = htpasswd
|
|
32
|
+
#
|
|
33
|
+
# basic_auth = WEBrick::HTTPAuth::BasicAuth.new config
|
|
34
|
+
|
|
35
|
+
class BasicAuth
|
|
36
|
+
include Authenticator
|
|
37
|
+
|
|
38
|
+
AuthScheme = "Basic" # :nodoc:
|
|
39
|
+
|
|
40
|
+
##
|
|
41
|
+
# Used by UserDB to create a basic password entry
|
|
42
|
+
|
|
43
|
+
def self.make_passwd(realm, user, pass)
|
|
44
|
+
pass ||= ""
|
|
45
|
+
pass.crypt(Utils::random_string(2))
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
attr_reader :realm, :userdb, :logger
|
|
49
|
+
|
|
50
|
+
##
|
|
51
|
+
# Creates a new BasicAuth instance.
|
|
52
|
+
#
|
|
53
|
+
# See WEBrick::Config::BasicAuth for default configuration entries
|
|
54
|
+
#
|
|
55
|
+
# You must supply the following configuration entries:
|
|
56
|
+
#
|
|
57
|
+
# :Realm:: The name of the realm being protected.
|
|
58
|
+
# :UserDB:: A database of usernames and passwords.
|
|
59
|
+
# A WEBrick::HTTPAuth::Htpasswd instance should be used.
|
|
60
|
+
|
|
61
|
+
def initialize(config, default=Config::BasicAuth)
|
|
62
|
+
check_init(config)
|
|
63
|
+
@config = default.dup.update(config)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
##
|
|
67
|
+
# Authenticates a +req+ and returns a 401 Unauthorized using +res+ if
|
|
68
|
+
# the authentication was not correct.
|
|
69
|
+
|
|
70
|
+
def authenticate(req, res)
|
|
71
|
+
unless basic_credentials = check_scheme(req)
|
|
72
|
+
challenge(req, res)
|
|
73
|
+
end
|
|
74
|
+
userid, password = basic_credentials.unpack("m*")[0].split(":", 2)
|
|
75
|
+
password ||= ""
|
|
76
|
+
if userid.empty?
|
|
77
|
+
error("user id was not given.")
|
|
78
|
+
challenge(req, res)
|
|
79
|
+
end
|
|
80
|
+
unless encpass = @userdb.get_passwd(@realm, userid, @reload_db)
|
|
81
|
+
error("%s: the user is not allowed.", userid)
|
|
82
|
+
challenge(req, res)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
case encpass
|
|
86
|
+
when /\A\$2[aby]\$/
|
|
87
|
+
password_matches = BCrypt::Password.new(encpass.sub(/\A\$2[aby]\$/, '$2a$')) == password
|
|
88
|
+
else
|
|
89
|
+
password_matches = password.crypt(encpass) == encpass
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
unless password_matches
|
|
93
|
+
error("%s: password unmatch.", userid)
|
|
94
|
+
challenge(req, res)
|
|
95
|
+
end
|
|
96
|
+
info("%s: authentication succeeded.", userid)
|
|
97
|
+
req.user = userid
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
##
|
|
101
|
+
# Returns a challenge response which asks for authentication information
|
|
102
|
+
|
|
103
|
+
def challenge(req, res)
|
|
104
|
+
res[@response_field] = "#{@auth_scheme} realm=\"#{@realm}\""
|
|
105
|
+
raise @auth_exception
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
##
|
|
110
|
+
# Basic authentication for proxy servers. See BasicAuth for details.
|
|
111
|
+
|
|
112
|
+
class ProxyBasicAuth < BasicAuth
|
|
113
|
+
include ProxyAuthenticator
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|