diff --git a/Rakefile b/Rakefile index 3f106672..15230f8f 100644 --- a/Rakefile +++ b/Rakefile @@ -4,7 +4,7 @@ require 'rspec/core/rake_task' Rake::TestTask.new do |t| t.libs << 'test' - t.test_files = FileList['test/sendgrid/test*.rb', 'test/sendgrid/helpers/mail/test*.rb'] + t.test_files = FileList['test/sendgrid/test*.rb', 'test/sendgrid/helpers/mail/test*.rb', 'test/sendgrid/helpers/permissions/test*.rb'] t.verbose = true end diff --git a/examples/scopes/scopes.rb b/examples/scopes/scopes.rb index ba035586..21ba46ea 100644 --- a/examples/scopes/scopes.rb +++ b/examples/scopes/scopes.rb @@ -1,9 +1,7 @@ -require 'sendgrid-ruby' - +require_relative '../../lib/sendgrid-ruby.rb' sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY']) - ################################################## # Retrieve a list of scopes for which this user has access. # # GET /scopes # @@ -13,3 +11,51 @@ puts response.body puts response.headers +################################################## +# Update the name & scopes of an API Key # +# PUT /api_keys/{api_key_id} # + + +scopes = [ + "user.profile.read", + "user.profile.update" +] + +data = { + "name": "A New Hope", + "scopes": scopes +} +api_key_id = "test_url_param" +response = sg.client.api_keys._(api_key_id).put(request_body: data) +puts response.status_code +puts response.body +puts response.headers + +# The above method shows how to update the scopes +# To get various scopes that each of the endpoint has, use the following + +# To get all admin permissions +scopes = SendGrid::Scope.admin_permissions + +# To get all read only permissions +scopes = SendGrid::Scope.read_only_permissions + +# There are two methods for each endpoints, namely +# {endpoint}_read_only_permissions and {endpoint}_full_access_permissions + +# These are the endpoints : +# alerts, api_keys, asm_groups, billing, categories, credentials, stats, ips, mail_settings, mail, +# marketing_campaigns, partner_settings, scheduled_sends, subusers, suppression, teammates, +# templates, tracking_settings, user_settings, webhooks, whitelabel, access_settings + +# read only permissions for alerts +scopes = SendGrid::Scope.alerts_read_only_permissions + +# full access permissions for alerts +scopes = SendGrid::Scope.alerts_full_access_permissions + +# read only permissions for billing +scopes = SendGrid::Scope.billing_read_only_permissions + +# full access permissions for billing +scopes = SendGrid::Scope.billing_full_access_permissions \ No newline at end of file diff --git a/lib/sendgrid-ruby.rb b/lib/sendgrid-ruby.rb index f856ab39..1d055793 100644 --- a/lib/sendgrid-ruby.rb +++ b/lib/sendgrid-ruby.rb @@ -25,3 +25,4 @@ require_relative 'sendgrid/helpers/stats/email_stats' require_relative 'sendgrid/helpers/stats/stats_response' require_relative 'sendgrid/helpers/stats/metrics' +require_relative 'sendgrid/helpers/permissions/scope' diff --git a/lib/sendgrid/helpers/permissions/scope.rb b/lib/sendgrid/helpers/permissions/scope.rb new file mode 100644 index 00000000..944ab4d2 --- /dev/null +++ b/lib/sendgrid/helpers/permissions/scope.rb @@ -0,0 +1,28 @@ +# This is used for getting scopes +require 'yaml' + +module SendGrid + class Scope + SCOPES = YAML.load_file(File.dirname(__FILE__) + '/scopes.yml').freeze + + class << self + def admin_permissions + SCOPES.values.map(&:values).flatten + end + + def read_only_permissions + SCOPES.map { |_, v| v[:read] }.flatten + end + + SCOPES.each_key do |endpoint| + define_method "#{endpoint}_read_only_permissions" do + SCOPES[endpoint][:read] + end + + define_method "#{endpoint}_full_access_permissions" do + SCOPES[endpoint].values.flatten + end + end + end + end +end diff --git a/lib/sendgrid/helpers/permissions/scopes.yml b/lib/sendgrid/helpers/permissions/scopes.yml new file mode 100644 index 00000000..d0925a03 --- /dev/null +++ b/lib/sendgrid/helpers/permissions/scopes.yml @@ -0,0 +1,309 @@ +--- +:alerts: + :create: + - alerts.create + :delete: + - alerts.delete + :read: + - alerts.read + :update: + - alerts.update +:api_keys: + :create: + - api_keys.create + :delete: + - api_keys.delete + :read: + - api_keys.read + :update: + - api_keys.update +:asm_groups: + :create: + - asm.groups.create + :delete: + - asm.groups.delete + :read: + - asm.groups.read + :update: + - asm.groups.update +:billing: + :create: + - billing.create + :delete: + - billing.delete + :read: + - billing.read + :update: + - billing.update +:categories: + :create: + - categories.create + :delete: + - categories.delete + :read: + - categories.read + - categories.stats.read + - categories.stats.sums.read + :update: + - categories.update +:credentials: + :create: + - credentials.create + :delete: + - credentials.delete + :read: + - credentials.read + :update: + - credentials.update +:stats: + :create: [] + :delete: [] + :read: + - email_activity.read + - stats.read + - stats.global.read + - browsers.stats.read + - devices.stats.read + - geo.stats.read + - mailbox_providers.stats.read + - clients.desktop.stats.read + - clients.phone.stats.read + - clients.stats.read + - clients.tablet.stats.read + - clients.webmail.stats.read + :update: [] +:ips: + :create: + - ips.pools.create + - ips.pools.ips.create + - ips.warmup.create + :delete: + - ips.pools.delete + - ips.pools.ips.delete + - ips.warmup.delete + :read: + - ips.assigned.read + - ips.read + - ips.pools.read + - ips.pools.ips.read + - ips.warmup.read + :update: + - ips.pools.update + - ips.pools.ips.update + - ips.warmup.update +:mail_settings: + :create: [] + :delete: [] + :read: + - mail_settings.address_whitelist.read + - mail_settings.bcc.read + - mail_settings.bounce_purge.read + - mail_settings.footer.read + - mail_settings.forward_bounce.read + - mail_settings.forward_spam.read + - mail_settings.plain_content.read + - mail_settings.read + - mail_settings.spam_check.read + - mail_settings.template.read + :update: + - mail_settings.address_whitelist.update + - mail_settings.bcc.update + - mail_settings.bounce_purge.update + - mail_settings.footer.update + - mail_settings.forward_bounce.update + - mail_settings.forward_spam.update + - mail_settings.plain_content.update + - mail_settings.spam_check.update + - mail_settings.template.update +:mail: + :create: + - mail.send + - mail.batch.create + :delete: + - mail.batch.delete + :read: + - mail.batch.read + :update: + - mail.batch.update +:marketing_campaigns: + :create: + - marketing_campaigns.create + :delete: + - marketing_campaigns.delete + :read: + - marketing_campaigns.read + :update: + - marketing_campaigns.update +:partner_settings: + :create: [] + :delete: [] + :read: + - partner_settings.new_relic.read + - partner_settings.read + - partner_settings.sendwithus.read + :update: + - partner_settings.new_relic.update + - partner_settings.sendwithus.update +:scheduled_sends: + :create: + - user.scheduled_sends.create + :delete: + - user.scheduled_sends.delete + :read: + - user.scheduled_sends.read + :update: + - user.scheduled_sends.update +:subusers: + :create: + - subusers.create + - subusers.credits.create + - subusers.credits.remaining.create + - subusers.monitor.create + :delete: + - subusers.delete + - subusers.credits.delete + - subusers.credits.remaining.delete + - subusers.monitor.delete + :read: + - subusers.read + - subusers.credits.read + - subusers.stats.read + - subusers.credits.remaining.read + - subusers.monitor.read + - subusers.reputations.read + - subusers.stats.monthly.read + - subusers.stats.sums.read + - subusers.summary.read + :update: + - subusers.update + - subusers.credits.update + - subusers.credits.remaining.update + - subusers.monitor.update +:suppression: + :create: + - suppression.create + - suppression.bounces.create + - suppression.blocks.create + - suppression.invalid_emails.create + - suppression.spam_reports.create + - suppression.unsubscribes.create + :delete: + - suppression.delete + - suppression.bounces.delete + - suppression.blocks.delete + - suppression.invalid_emails.delete + - suppression.spam_reports.delete + - suppression.unsubscribes.delete + :read: + - suppression.read + - suppression.bounces.read + - suppression.blocks.read + - suppression.invalid_emails.read + - suppression.spam_reports.read + - suppression.unsubscribes.read + :update: + - suppression.update + - suppression.bounces.update + - suppression.blocks.update + - suppression.invalid_emails.update + - suppression.spam_reports.update + - suppression.unsubscribes.update +:teammates: + :create: + - teammates.create + :delete: + - teammates.delete + :read: + - teammates.read + :update: + - teammates.update +:templates: + :create: + - templates.create + - templates.versions.activate.create + - templates.versions.create + :delete: + - templates.delete + - templates.versions.activate.delete + - templates.versions.delete + :read: + - templates.read + - templates.versions.activate.read + - templates.versions.read + :update: + - templates.update + - templates.versions.activate.update + - templates.versions.update +:tracking_settings: + :create: [] + :delete: [] + :read: + - tracking_settings.click.read + - tracking_settings.google_analytics.read + - tracking_settings.open.read + - tracking_settings.read + - tracking_settings.subscription.read + :update: + - tracking_settings.click.update + - tracking_settings.google_analytics.update + - tracking_settings.open.update + - tracking_settings.subscription.update +:user_settings: + :create: + - user.email.create + - user.multifactor_authentication.create + :delete: + - user.email.delete + - user.multifactor_authentication.delete + :read: + - user.account.read + - user.credits.read + - user.email.read + - user.multifactor_authentication.read + - user.password.read + - user.profile.read + - user.timezone.read + - user.settings.enforced_tls.read + - user.username.read + :update: + - user.email.update + - user.multifactor_authentication.update + - user.password.update + - user.profile.update + - user.settings.enforced_tls.update + - user.timezone.update + - user.username.update +:webhooks: + :create: + - user.webhooks.event.test.create + - user.webhooks.parse.settings.create + :delete: + - user.webhooks.parse.settings.delete + :read: + - user.webhooks.event.settings.read + - user.webhooks.event.test.read + - user.webhooks.parse.settings.read + - user.webhooks.parse.stats.read + :update: + - user.webhooks.event.settings.update + - user.webhooks.event.test.update + - user.webhooks.parse.settings.update +:whitelabel: + :create: + - whitelabel.create + :delete: + - whitelabel.delete + :read: + - whitelabel.read + :update: + - whitelabel.update +:access_settings: + :create: + - access_settings.whitelist.create + :delete: + - access_settings.whitelist.delete + :read: + - access_settings.activity.read + - access_settings.whitelist.read + :update: + - access_settings.whitelist.update diff --git a/test/sendgrid/permissions/test_scopes.rb b/test/sendgrid/permissions/test_scopes.rb new file mode 100644 index 00000000..2d5eefb3 --- /dev/null +++ b/test/sendgrid/permissions/test_scopes.rb @@ -0,0 +1,38 @@ +require_relative '../../../lib/sendgrid/helpers/permissions/scope' +require 'minitest/autorun' + +class TestCategory < Minitest::Test + + include SendGrid + + # usecases + # 1. test admin scopes + # 2. test read only scopes + # 3. test read only and full access scopes for a method by hardcoding + # 4. test read only and full access scopes by loading scopes.yaml + + def setup + @scopes_from_yaml = YAML.load_file(File.dirname(__FILE__) + '/../../../lib/sendgrid/helpers/permissions/scopes.yml').freeze + end + + def test_admin_scopes + assert_equal Scope.admin_permissions, @scopes_from_yaml.values.map(&:values).flatten + end + + def test_read_only_scopes + assert_equal Scope.read_only_permissions, @scopes_from_yaml.map { |_, v| v[:read] }.flatten + end + + def test_read_only_and_full_access_for_mail_hardcoded + assert_equal Scope.mail_read_only_permissions, ["mail.batch.read"] + assert_equal Scope.mail_full_access_permissions, ["mail.send", "mail.batch.create", "mail.batch.delete", "mail.batch.read", "mail.batch.update"] + end + + def test_read_only_and_full_access_from_file + @scopes_from_yaml.each_key do |endpoint| + assert_equal Scope.send("#{endpoint}_read_only_permissions"), @scopes_from_yaml[endpoint][:read] + assert_equal Scope.send("#{endpoint}_full_access_permissions"), @scopes_from_yaml[endpoint].values.flatten + end + end + +end