zendesk_apps_support 4.44.0.alpha.5 → 4.44.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/config/locales/en.yml +5 -0
- data/config/locales/translations/zendesk_apps_support.yml +16 -0
- data/lib/zendesk_apps_support/manifest/parameter.rb +2 -1
- data/lib/zendesk_apps_support/package.rb +2 -1
- data/lib/zendesk_apps_support/validations/manifest.rb +56 -8
- data/lib/zendesk_apps_support/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6ab47aa0e5d6274fd6b7527a5bb09dc16c833359464c5535855940892466687e
|
|
4
|
+
data.tar.gz: 34e8962b318292e95eb5b784bddaea7a409d4fe7feb0edd010aa76021bc13d04
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 3783f916fe8f1546a9c9eba93c13e91a7bb1690f8872fb056be89fec7f48f901b491f757a7b5117d7f14bf1bcb902ae2aef58dad4c9e733462c4a4648291eb37
|
|
7
|
+
data.tar.gz: 3a075c7d184f66d49ab4fe5f569ea8196eca5ef51288fad0a36035d9de0058cea9868047cece4f0fca78351944133d05132e53a511113238c1cf2262f34a3145
|
data/config/locales/en.yml
CHANGED
|
@@ -281,6 +281,11 @@ en:
|
|
|
281
281
|
invalid_url: '%{field} must be a valid URL, got "%{value}".'
|
|
282
282
|
password_parameter_type_deprecated: 'Password parameter type can no longer
|
|
283
283
|
be used. Use Secure settings instead. Learn more: %{link}.'
|
|
284
|
+
field_requires_secure_parameter: "%{field} cannot be defined in a non-secure
|
|
285
|
+
parameter."
|
|
286
|
+
field_cannot_be_empty: "%{field} cannot be empty."
|
|
287
|
+
field_contains_invalid_values: "%{field} contains invalid values: %{values}."
|
|
288
|
+
field_contains_invalid_keys: "%{field} contains invalid keys: %{keys}."
|
|
284
289
|
warning:
|
|
285
290
|
app_build:
|
|
286
291
|
deprecated_version: You are targeting a deprecated version of the framework.
|
|
@@ -633,3 +633,19 @@ parts:
|
|
|
633
633
|
key: "txt.apps.admin.error.app_build.password_parameter_type_deprecated"
|
|
634
634
|
title: "App builder job: Password parameter type is deprecated"
|
|
635
635
|
value: "Password parameter type can no longer be used. Use Secure settings instead. Learn more: %{link}."
|
|
636
|
+
- translation:
|
|
637
|
+
key: "txt.apps.admin.error.app_build.field_requires_secure_parameter"
|
|
638
|
+
title: "App builder job: Error when parameter field requires secure setting set to true. Placeholder %{field} shows parameter field along with parameter name like \"parameter[name='param'].scopes\" found in the supplied manifest file."
|
|
639
|
+
value: "%{field} cannot be defined in a non-secure parameter."
|
|
640
|
+
- translation:
|
|
641
|
+
key: "txt.apps.admin.error.app_build.field_cannot_be_empty"
|
|
642
|
+
title: "App builder job: field cannot be empty. %{field} will be replaced with empty fields such as \"name\", \"author\" \"parameter[name='param'].scopes\" etc in the supplied manifest file."
|
|
643
|
+
value: "%{field} cannot be empty."
|
|
644
|
+
- translation:
|
|
645
|
+
key: "txt.apps.admin.error.app_build.field_contains_invalid_values"
|
|
646
|
+
title: "App builder job: Error for invalid field values. Placeholder %{field} shows parameter fields like \"parameter[name='param'].scopes\" in the supplied manifest file, %{values} shows the invalid values in the user input corresponding to those fields."
|
|
647
|
+
value: "%{field} contains invalid values: %{values}."
|
|
648
|
+
- translation:
|
|
649
|
+
key: "txt.apps.admin.error.app_build.field_contains_invalid_keys"
|
|
650
|
+
title: "App builder job: Error for invalid field keys. Placeholder %{field} shows parameter fields like \"parameter[name='param'].scopes\" provided in the supplied manifest file, %{keys} shows the invalid keys found within the field."
|
|
651
|
+
value: "%{field} contains invalid keys: %{keys}."
|
|
@@ -4,7 +4,7 @@ module ZendeskAppsSupport
|
|
|
4
4
|
class Manifest
|
|
5
5
|
class Parameter
|
|
6
6
|
TYPES = %w[text password checkbox url number multiline hidden oauth].freeze
|
|
7
|
-
ATTRIBUTES = %i[name type required secure default].freeze
|
|
7
|
+
ATTRIBUTES = %i[name type required secure default scopes].freeze
|
|
8
8
|
attr_reader(*ATTRIBUTES)
|
|
9
9
|
def default?
|
|
10
10
|
@has_default
|
|
@@ -17,6 +17,7 @@ module ZendeskAppsSupport
|
|
|
17
17
|
@secure = p['secure'] || false
|
|
18
18
|
@has_default = p.key? 'default'
|
|
19
19
|
@default = p['default'] if @has_default
|
|
20
|
+
@scopes = p['scopes']
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
end
|
|
@@ -36,9 +36,10 @@ module ZendeskAppsSupport
|
|
|
36
36
|
skip_marketplace_translations = options.fetch(:skip_marketplace_translations, false)
|
|
37
37
|
error_on_password_parameter = options.fetch(:error_on_password_parameter, false)
|
|
38
38
|
validate_custom_objects_v2 = options.fetch(:validate_custom_objects_v2, false)
|
|
39
|
+
validate_scopes_for_secure_parameter = options.fetch(:validate_scopes_for_secure_parameter, false)
|
|
39
40
|
|
|
40
41
|
errors = []
|
|
41
|
-
errors << Validations::Manifest.call(self, error_on_password_parameter: error_on_password_parameter)
|
|
42
|
+
errors << Validations::Manifest.call(self, error_on_password_parameter: error_on_password_parameter, validate_scopes_for_secure_parameter: validate_scopes_for_secure_parameter)
|
|
42
43
|
|
|
43
44
|
if has_valid_manifest?(errors)
|
|
44
45
|
errors << Validations::Marketplace.call(self) if marketplace
|
|
@@ -11,9 +11,10 @@ module ZendeskAppsSupport
|
|
|
11
11
|
OAUTH_REQUIRED_FIELDS = %w[client_id client_secret authorize_uri access_token_uri].freeze
|
|
12
12
|
PARAMETER_TYPES = ZendeskAppsSupport::Manifest::Parameter::TYPES
|
|
13
13
|
OAUTH_MANIFEST_LINK = 'https://developer.zendesk.com/apps/docs/developer-guide/manifest#oauth'
|
|
14
|
+
SECURE_PARAM_SCOPES = %w[header body url_host url_path jwt_secret_key jwt_claim basic_auth_username basic_auth_password].freeze
|
|
14
15
|
|
|
15
16
|
class << self
|
|
16
|
-
def call(package, error_on_password_parameter: false)
|
|
17
|
+
def call(package, error_on_password_parameter: false, validate_scopes_for_secure_parameter: false)
|
|
17
18
|
unless package.has_file?('manifest.json')
|
|
18
19
|
nested_manifest = package.files.find { |file| file =~ %r{\A[^/]+?/manifest\.json\Z} }
|
|
19
20
|
if nested_manifest
|
|
@@ -24,7 +25,7 @@ module ZendeskAppsSupport
|
|
|
24
25
|
|
|
25
26
|
package.warnings << password_parameter_warning if !error_on_password_parameter && password_param_present?(package.manifest)
|
|
26
27
|
|
|
27
|
-
collate_manifest_errors(package, error_on_password_parameter)
|
|
28
|
+
collate_manifest_errors(package, error_on_password_parameter, validate_scopes_for_secure_parameter)
|
|
28
29
|
rescue JSON::ParserError => e
|
|
29
30
|
return [ValidationError.new(:manifest_not_json, errors: e)]
|
|
30
31
|
rescue ZendeskAppsSupport::Manifest::OverrideError => e
|
|
@@ -37,7 +38,7 @@ module ZendeskAppsSupport
|
|
|
37
38
|
manifest.parameters.any? { |p| p.type == 'password' }
|
|
38
39
|
end
|
|
39
40
|
|
|
40
|
-
def collate_manifest_errors(package, error_on_password_parameter)
|
|
41
|
+
def collate_manifest_errors(package, error_on_password_parameter, validate_scopes_for_secure_parameter)
|
|
41
42
|
manifest = package.manifest
|
|
42
43
|
|
|
43
44
|
errors = [
|
|
@@ -46,7 +47,7 @@ module ZendeskAppsSupport
|
|
|
46
47
|
oauth_error(manifest),
|
|
47
48
|
default_locale_error(manifest, package),
|
|
48
49
|
validate_urls(manifest),
|
|
49
|
-
validate_parameters(manifest),
|
|
50
|
+
validate_parameters(manifest, validate_scopes_for_secure_parameter),
|
|
50
51
|
if manifest.requirements_only? || manifest.marketing_only?
|
|
51
52
|
[ ban_location(manifest),
|
|
52
53
|
ban_framework_version(manifest) ]
|
|
@@ -87,7 +88,7 @@ module ZendeskAppsSupport
|
|
|
87
88
|
errors
|
|
88
89
|
end
|
|
89
90
|
|
|
90
|
-
def validate_parameters(manifest)
|
|
91
|
+
def validate_parameters(manifest, validate_scopes_for_secure_parameter)
|
|
91
92
|
if manifest.marketing_only?
|
|
92
93
|
marketing_only_errors(manifest)
|
|
93
94
|
else
|
|
@@ -97,7 +98,8 @@ module ZendeskAppsSupport
|
|
|
97
98
|
invalid_type_error(manifest),
|
|
98
99
|
too_many_oauth_parameters(manifest),
|
|
99
100
|
oauth_cannot_be_secure(manifest),
|
|
100
|
-
name_as_parameter_name_error(manifest)
|
|
101
|
+
name_as_parameter_name_error(manifest),
|
|
102
|
+
*(validate_scopes_for_secure_parameter ? invalid_secure_param_scopes_errors(manifest) : invalid_scopes_key_error(manifest)),
|
|
101
103
|
]
|
|
102
104
|
end
|
|
103
105
|
end
|
|
@@ -110,6 +112,52 @@ module ZendeskAppsSupport
|
|
|
110
112
|
end
|
|
111
113
|
end
|
|
112
114
|
|
|
115
|
+
def invalid_scopes_key_error(manifest)
|
|
116
|
+
errors = []
|
|
117
|
+
manifest.parameters.each do |parameter|
|
|
118
|
+
next if parameter.scopes.nil?
|
|
119
|
+
|
|
120
|
+
errors << ValidationError.new(:field_contains_invalid_keys,
|
|
121
|
+
field: "parameters[name=\"#{parameter.name}\"]",
|
|
122
|
+
keys: 'scopes')
|
|
123
|
+
end
|
|
124
|
+
errors
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def invalid_secure_param_scopes_errors(manifest)
|
|
128
|
+
errors = []
|
|
129
|
+
|
|
130
|
+
manifest.parameters.each do |parameter|
|
|
131
|
+
next if parameter.scopes.nil?
|
|
132
|
+
|
|
133
|
+
unless parameter.secure
|
|
134
|
+
errors << ValidationError.new(:field_requires_secure_parameter, field: "parameters[name=\"#{parameter.name}\"].scopes")
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
unless parameter.scopes.is_a?(Array)
|
|
138
|
+
errors << ValidationError.new(:unacceptable_array,
|
|
139
|
+
field: "parameters[name=\"#{parameter.name}\"].scopes",
|
|
140
|
+
value: parameter.scopes.class.to_s)
|
|
141
|
+
next
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
if parameter.scopes.empty?
|
|
145
|
+
errors << ValidationError.new(:field_cannot_be_empty, field: "parameters[name=\"#{parameter.name}\"].scopes")
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
invalid_scopes = parameter.scopes - SECURE_PARAM_SCOPES
|
|
149
|
+
if invalid_scopes.any?
|
|
150
|
+
errors << ValidationError.new(
|
|
151
|
+
:field_contains_invalid_values,
|
|
152
|
+
field: "parameters[name=\"#{parameter.name}\"].scopes",
|
|
153
|
+
values: invalid_scopes.join(I18n.t('txt.apps.admin.error.app_build.listing_comma'))
|
|
154
|
+
)
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
errors
|
|
159
|
+
end
|
|
160
|
+
|
|
113
161
|
def marketing_only_errors(manifest)
|
|
114
162
|
[
|
|
115
163
|
ban_parameters(manifest),
|
|
@@ -261,12 +309,12 @@ module ZendeskAppsSupport
|
|
|
261
309
|
end
|
|
262
310
|
|
|
263
311
|
invalid_required = manifest.parameters.map do |parameter|
|
|
264
|
-
validate_boolean(parameter.required, "parameters
|
|
312
|
+
validate_boolean(parameter.required, "parameters[name=\"#{parameter.name}\"].required")
|
|
265
313
|
end.compact
|
|
266
314
|
return invalid_required if invalid_required.any?
|
|
267
315
|
|
|
268
316
|
invalid_secure = manifest.parameters.map do |parameter|
|
|
269
|
-
validate_boolean(parameter.secure, "parameters
|
|
317
|
+
validate_boolean(parameter.secure, "parameters[name=\"#{parameter.name}\"].secure")
|
|
270
318
|
end.compact
|
|
271
319
|
return invalid_secure if invalid_secure.any?
|
|
272
320
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: zendesk_apps_support
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.44.0
|
|
4
|
+
version: 4.44.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- James A. Rosen
|
|
@@ -11,7 +11,7 @@ authors:
|
|
|
11
11
|
autorequire:
|
|
12
12
|
bindir: bin
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date: 2025-
|
|
14
|
+
date: 2025-11-06 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: i18n
|