From 1dee3344141bcaf555d2ba07242fd3941ac2a7ee Mon Sep 17 00:00:00 2001 From: Siddarth R Date: Sat, 20 Oct 2018 02:53:32 +0530 Subject: [PATCH 1/8] Added DataDog Configuration Documentation --- .../images/saml_configure_datadog_01.png | Bin 0 -> 30118 bytes .../images/saml_configure_datadog_02.png | Bin 0 -> 51526 bytes .../images/saml_configure_datadog_03.png | Bin 0 -> 32263 bytes .../images/saml_configure_datadog_04.png | Bin 0 -> 38913 bytes app/assets/stylesheets/application.scss | 5 +- app/controllers/organisations_controller.rb | 36 ++++++---- app/controllers/saml_idp_controller.rb | 11 +++ .../organisations/config_saml_app.html.slim | 7 ++ app/views/organisations/index.html.slim | 8 ++- .../organisations/saml_apps/_datadog.html.erb | 64 ++++++++++++++++++ config/application.yml.sample | 1 + config/routes.rb | 1 + spec/factories/organisations.rb | 2 +- .../organisations/config_saml_app_spec.rb | 63 +++++++++++++++++ spec/features/saml/show_spec.rb | 23 +++++++ 15 files changed, 206 insertions(+), 15 deletions(-) create mode 100644 app/assets/images/saml_configure_datadog_01.png create mode 100644 app/assets/images/saml_configure_datadog_02.png create mode 100644 app/assets/images/saml_configure_datadog_03.png create mode 100644 app/assets/images/saml_configure_datadog_04.png create mode 100644 app/views/organisations/config_saml_app.html.slim create mode 100644 app/views/organisations/saml_apps/_datadog.html.erb create mode 100644 spec/features/organisations/config_saml_app_spec.rb create mode 100644 spec/features/saml/show_spec.rb diff --git a/app/assets/images/saml_configure_datadog_01.png b/app/assets/images/saml_configure_datadog_01.png new file mode 100644 index 0000000000000000000000000000000000000000..8c2e6c6ddcf562705a14d4666da0cfaafa0627b7 GIT binary patch literal 30118 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 eZM46he!^vc3T$OA`3r$RPT&s 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/saml_configure_datadog_04.png b/app/assets/images/saml_configure_datadog_04.png new file mode 100644 index 0000000000000000000000000000000000000000..36f5ac213ce7154a3a7bcf522b12b5d060dce26c GIT binary patch literal 38913 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 ol { margin-bottom: 10px; } diff --git a/app/controllers/organisations_controller.rb b/app/controllers/organisations_controller.rb index a2293bfa..80c22d07 100644 --- a/app/controllers/organisations_controller.rb +++ b/app/controllers/organisations_controller.rb @@ -1,4 +1,6 @@ class OrganisationsController < ApplicationController + before_action :load_org, only: %i(config_saml_app update show setup_saml) + def index render :index, locals: { org_list: Organisation.all } end @@ -7,6 +9,16 @@ def new render :new, locals: { org: Organisation.new } end + def config_saml_app + saml_apps = Figaro.env.saml_apps.split(',').map(&:downcase) + app_name = params[:app_name] + if saml_apps.include?(app_name.downcase) + render :config_saml_app, locals: { app_name: params[:app_name], org: @org } + else + redirect_to organisation_path(id: params[:organisation_id]) + end + end + def create org = Organisation.setup(organisation_params.to_h || {}) if org.errors.blank? @@ -19,27 +31,25 @@ def create end def update - org = load_org - org.update_profile(organisation_params.to_h || {}) - if org.errors.blank? + @org.update_profile(organisation_params.to_h || {}) + if @org.errors.blank? flash[:success] = 'Successfully updated organisation' redirect_to organisations_path else - flash[:errors] = org.errors.full_messages - render :show, locals: { org: org } + flash[:errors] = @org.errors.full_messages + render :show, locals: { org: @org } end end def show - render :show, locals: { org: load_org } + render :show, locals: { org: @org } end def setup_saml - org = load_org - if org.saml_setup? + if @org.saml_setup? flash[:errors] = 'SAML Certificates Already Setup' else - load_org.setup_saml_certs + @org.setup_saml_certs flash[:success] = 'Successfully setup SAML Certificates' end redirect_to organisations_path @@ -48,9 +58,11 @@ def setup_saml private def load_org - org = Organisation.where(params[:id]).first - redirect_to organisations_path if org.blank? - org + id = params[:id] || params[:organisation_id] + @org = Organisation.where(id: id).first + if @org.blank? + redirect_to organisations_path + end end def organisation_params diff --git a/app/controllers/saml_idp_controller.rb b/app/controllers/saml_idp_controller.rb index 7a1695ec..d19984a5 100644 --- a/app/controllers/saml_idp_controller.rb +++ b/app/controllers/saml_idp_controller.rb @@ -2,6 +2,17 @@ class SamlIdpController < SamlIdp::IdpController layout false before_action :setup_saml_configuration + def show + xml_content = SamlIdp.metadata.signed + if params.key?(:download) + send_data xml_content, + type: 'text/xml', + filename: 'metadata.xml' + else + render xml: xml_content + end + end + private def idp_authenticate(email, password) diff --git a/app/views/organisations/config_saml_app.html.slim b/app/views/organisations/config_saml_app.html.slim new file mode 100644 index 00000000..fca9becc --- /dev/null +++ b/app/views/organisations/config_saml_app.html.slim @@ -0,0 +1,7 @@ +.container.col-md-8 + .row.mb-3.mt-2 + .col-md-12 + h5 Configure #{app_name.titleize} + .row.mb-3.mt-2 + .col-md-12 + = render partial: "organisations/saml_apps/#{app_name}", locals: {org: org, app_name: app_name} diff --git a/app/views/organisations/index.html.slim b/app/views/organisations/index.html.slim index 7cbd5fac..39040e86 100644 --- a/app/views/organisations/index.html.slim +++ b/app/views/organisations/index.html.slim @@ -26,7 +26,13 @@ td = link_to org.website, org.website td = org.domain td - - unless org.saml_setup? + - if org.saml_setup? + .dropdown.position-relative#configureAppDropDownMenuContainer + button.btn.btn-primary.btn-sm.dropdown-toggle type="button" id="configureAppDropDownMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" data-boundary="configureAppDropDownMenuContainer" + = "Configure App" + .dropdown-menu aria-labelledby="configureAppDropDownMenu" + = link_to "Datadog", organisation_config_saml_app_path(organisation_id: org.id, app_name: 'datadog'), class: 'dropdown-item' + - else = link_to "Setup SAML", organisation_setup_saml_path(org) - else td.text-center colspan='3' diff --git a/app/views/organisations/saml_apps/_datadog.html.erb b/app/views/organisations/saml_apps/_datadog.html.erb new file mode 100644 index 00000000..81bf8fcf --- /dev/null +++ b/app/views/organisations/saml_apps/_datadog.html.erb @@ -0,0 +1,64 @@ +

+
+
+
Pre Requisites
+
    +
  1. You need to have a valid account @ datadog.com
  2. +
  3. You need to be an administrator of the datadog account
  4. +
+
Instruction Steps
+
    +
  1. Configuration Steps on DataDog
  2. +
  3. Configuration Steps on Gate
  4. +
  5. Manage Users on Gate
  6. +
+
Configuration Steps on Datadog
+
    +
  1. Login to Datadog as an administrator
  2. +
  3. +

    + Click on in the bottom left, then select Configure SAML +

    + <%= image_tag("saml_configure_datadog_01.png") %> +
  4. +
  5. Download the IdP Metadata by clicking <%= link_to "here", metadata_path(slug: org.slug, app: 'datadog', download: true) %>
  6. +
  7. +

    Click Choose file, locate the metadata.xml you just saved, and then click Upload File

    + <%= image_tag("saml_configure_datadog_02.png") %> +
  8. +
  9. +

    Click Enable

    + <%= image_tag("saml_configure_datadog_03.png") %> +
  10. +
  11. Make a copy of your Single Sign-on URL value
  12. +
  13. +

    For the below image follow the following steps:

    +
      +
    1. Enable Identity Provider (IdP) Initiated Login
    2. +
    3. Enable SAML Strict Mode
    4. +
    5. Note: We will not be using JIT, instead managing users will be done via a different panel
    6. +
    7. Hit Save
    8. +
    + <%= image_tag("saml_configure_datadog_04.png") %> +
  14. +
+
Configuration Steps on Gate
+
Manage Users on Gate
+
+
+ settings +
+
+ manage users +
+
diff --git a/config/application.yml.sample b/config/application.yml.sample index c6aa7e3a..6e5c6732 100644 --- a/config/application.yml.sample +++ b/config/application.yml.sample @@ -14,4 +14,5 @@ GATE_DB_USER: '' GATE_DB_PASSWORD: '' DEFAULT_HOST_PATTERN: 's*' UID_BUFFER: 5000 +SAML_APPS: 'datadog' GATE_URL: 'https://gate.gojek.co.id/' diff --git a/config/routes.rb b/config/routes.rb index 49736649..a7eead8a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,6 +12,7 @@ authenticated :user do resources :organisations, except: %i(destroy) do get 'setup_saml', action: :setup_saml + get 'config_saml_app/:app_name', action: :config_saml_app, as: 'config_saml_app' end end diff --git a/spec/factories/organisations.rb b/spec/factories/organisations.rb index ad5de926..ad41b149 100644 --- a/spec/factories/organisations.rb +++ b/spec/factories/organisations.rb @@ -1,7 +1,7 @@ FactoryBot.define do country = Country.find_country_by_name(Country.all.map(&:name).sort.sample) factory :organisation do - sequence(:slug) { |n| "#{Faker::Internet.slug}_#{n}" } + sequence(:slug) { |n| "#{Faker::Lorem.word}_#{n}" } name { Faker::Lorem.word } website { Faker::Internet.url } domain { Faker::Internet.email.split('@').last } diff --git a/spec/features/organisations/config_saml_app_spec.rb b/spec/features/organisations/config_saml_app_spec.rb new file mode 100644 index 00000000..3d398af4 --- /dev/null +++ b/spec/features/organisations/config_saml_app_spec.rb @@ -0,0 +1,63 @@ +require 'rails_helper' +RSpec.feature 'Config Saml App', type: :feature do + let(:org) { create(:organisation) } + let(:user) { create(:user) } + let(:saml_apps) { Figaro.env.saml_apps.split(',') } + + before do + sign_in(user) + end + + scenario 'Redirect to organisation detail if app not found' do + visit organisation_config_saml_app_path( + organisation_id: org.id, app_name: Faker::Lorem.word + ) + expect(current_path).to eq(organisation_path(id: org.id)) + end + + scenario 'Redirect to list organisations if organisation not found' do + visit organisation_config_saml_app_path( + organisation_id: Faker::Number.number(1), + app_name: Faker::Lorem.word + ) + expect(current_path).to eq(organisations_path) + end + + scenario 'View saml app configuration options' do + saml_app = saml_apps.sample + config_saml_app_path = organisation_config_saml_app_path( + organisation_id: org.id, + app_name: saml_app + ) + visit config_saml_app_path + expect(current_path).to eq(config_saml_app_path) + expect(page).to have_xpath( + "//a[@id='instruction-tab' and @href='#instruction' and .='Instructions']" + ) + expect(page).to have_xpath( + "//a[@id='settings-tab' and @href='#settings' and .='Settings']" + ) + expect(page).to have_xpath( + "//a[@id='manage-users-tab' and @href='#manage-users' and .='Manage Users']" + ) + end + + scenario 'Instrutions for DataDog and Gate Configuration Steps, Manage Users on Gate' do + saml_app = saml_apps.sample + config_saml_app_path = organisation_config_saml_app_path( + organisation_id: org.id, + app_name: saml_app + ) + visit config_saml_app_path + expect(current_path).to eq(config_saml_app_path) + expect(page).to have_xpath( + "//h6[@id='configureDataDog' and .='Configuration Steps on #{saml_app.titleize}']" + ) + expect(page).to have_xpath( + "//h6[@id='configureGate' and .='Configuration Steps on Gate']" + ) + expect(page).to have_xpath( + "//h6[@id='manageUsersGate' and .='Manage Users on Gate']" + ) + end +end diff --git a/spec/features/saml/show_spec.rb b/spec/features/saml/show_spec.rb new file mode 100644 index 00000000..4260ba65 --- /dev/null +++ b/spec/features/saml/show_spec.rb @@ -0,0 +1,23 @@ +require 'rails_helper' +RSpec.feature 'Config Saml App', type: :feature do + let(:org) { create(:organisation) } + let(:user) { create(:user) } + let(:saml_apps) { Figaro.env.saml_apps.split(',') } + let(:xml_content) { Nokogiri::XML::Builder.new { |xml| xml.foo_bar 'hello' }.to_xml } + + before do + sign_in(user) + allow(SamlIdp.metadata).to receive(:signed).and_return(xml_content) + end + + scenario 'Show metadata when no download flag' do + visit metadata_path(slug: org.slug, app: saml_apps.sample) + expect(page.body).to eq(xml_content) + end + + scenario 'Download metadata with download flag' do + visit metadata_path(slug: org.slug, app: saml_apps.sample, download: true) + expect(page.response_headers['Content-Type']).to eq('text/xml') + expect(page.response_headers['Content-Disposition']).to include('metadata.xml') + end +end From 09e123ee36b0b5d183d97b7a975395b93c124143 Mon Sep 17 00:00:00 2001 From: Siddarth R Date: Mon, 22 Oct 2018 00:17:14 +0530 Subject: [PATCH 2/8] Added documentation and configuring for datadog for the saml app --- .../images/saml_configure_datadog_05.png | Bin 0 -> 17233 bytes .../images/saml_configure_datadog_06.png | Bin 0 -> 21537 bytes .../images/saml_configure_datadog_07.png | Bin 0 -> 28587 bytes app/controllers/organisations_controller.rb | 34 +- app/lib/datadog.rb | 15 + app/lib/saml_app.rb | 18 ++ app/models/saml_app_config.rb | 10 + .../organisations/config_saml_app.html.slim | 2 +- .../organisations/saml_apps/_datadog.html.erb | 36 ++- config/application.rb | 5 +- config/routes.rb | 1 + .../20181016093315_create_saml_app_configs.rb | 13 + db/schema.rb | 304 +++++++++--------- spec/factories/saml_app_configs.rb | 9 + .../save_config_saml_app_spec.rb | 51 +++ spec/lib/datadog_spec.rb | 45 +++ 16 files changed, 381 insertions(+), 162 deletions(-) create mode 100644 app/assets/images/saml_configure_datadog_05.png create mode 100644 app/assets/images/saml_configure_datadog_06.png create mode 100644 app/assets/images/saml_configure_datadog_07.png create mode 100644 app/lib/datadog.rb create mode 100644 app/lib/saml_app.rb create mode 100644 app/models/saml_app_config.rb create mode 100644 db/migrate/20181016093315_create_saml_app_configs.rb create mode 100644 spec/factories/saml_app_configs.rb create mode 100644 spec/features/organisations/save_config_saml_app_spec.rb create mode 100644 spec/lib/datadog_spec.rb diff --git a/app/assets/images/saml_configure_datadog_05.png b/app/assets/images/saml_configure_datadog_05.png new file mode 100644 index 0000000000000000000000000000000000000000..d03f961a70b6cd55f5628f02a7268b60375bb4c9 GIT binary patch literal 17233 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/saml_configure_datadog_06.png b/app/assets/images/saml_configure_datadog_06.png new file mode 100644 index 0000000000000000000000000000000000000000..08b839b8b3f67f4f730633214024513151603f94 GIT binary patch literal 21537 zcmZ7eb9g1q7d8sVwr$%scI-@S+Y{Ty#P%ea*tTt36WczS=l6c!d9U+VcU{%HtLk2> z7VcWTBNXK&;9+oJfPjGDr6k3afq+0}5&q#s1xD&MZ*0iIVs6E|&|uD&MVaRU@dIw!7)+r6$9t|qd0S>68P;lgq|xJiN8Xi{bW zL5Ndm#XW&++8qrm+3hv|WDtA&+kUmbWjW7Cy|+#r4{z_0syAtbasTA8ZQS1lCI8=ILqJKn_san4zq*;Um~(sYW;;Tp(H-~nu@Dk@C&Z}^sD zf<~tuYnHB0LP85+j20^2X4duelirT`_!F_&is?q7qO(ObkfWg~aS{~M}K!g&DC#G|$e*j0rQ5Fi|AU#S+gA3>?Oz7ps! zBuGY%Co1Pb912h1|ECQ?Hk;>SS|gPK{P(s%&}mbOc|mQ0B-tw}n2)vPtVn)*u4ByC zbE44td`iIhEjBR&DGu*n`#~jAw1mxx5aYEtsBkxtC?!NvS>JEK1e|I6h=-fq4moL-V`{9diE?HPkr9#8BzY z6Y19gf~?=)pLlDX*=ho+R5a88TMu9|Wv$A*BrTImCN?z@hJ+qLHi)W6j_}Cvp?uLW zhv9)YMO`(p!a@H4pSM7{+Q*9x7(z}7X^Gg40;e`g5&tm!bJItv>S_r^SvUnKz>i`_!?WhPZxZ6=dvjS8(csC&HN05wOx zZ2aBR%b=BTq60K_(h??2Q~*M#z9QICg*L1NP07X#n7E)8HW1tW4jI@fQAdzeNg?;O6m*jWpg4>INjVwOWd>aa=C*ZO zEW$rJ03TS<*A)z=KX7?AX;Ej#a6Ye$; zzhym;%GD}6q7UpZ^Nwsh%sk=kWNKR4nSggKtyyM?5&_YkodH@|*!PftAYhyHF&hri z#TB9fBik6v*xSceuc;KbH?*%?>9Jj10zraT6lk3#utL4EwgD55n)U1+ZrmKL$}S>I zR{A}rqrZFZ$bLuL&u*{I>wN$~3HRfMVCwvd%Tb&6>hgr2VNk)A!(~S{EvnW<`pe?1 z*NFA*RFQ{Sq-W=6G;GOo&;tan7xVCtW(jX)75kSNPLO7{o}U?Z<+8$;iG9zMt8JVX zM=9z&O!17?NmV34CM9Ty_Jr#@&Mi~v@G#xKt=+m+VWUOD+NJ`0Fe z-(g@buC|?QPW{2Zm0ph1{BESAte~QvgTe>L5&B2oA)jtrQC-=j478|x*B25y(Gv7t zKW^0V*Z!NJcNnYd~>}#)?f$Uqu?lM-o3`Xx#^^0GqOK zmwi3oY$p7$pe@hJZqNJS32jSix@>z~o0{T{m%ZmX^Aog4nL7I30;4vlZGkIf68s(z zq?qJ7q^8b48fcaeqH<891Gh_#dCK_ab-G4H8?(q$WgSTm3 zb8KXt-0yCM&bo1zlNl$n74~$wSo$a^p0i$vU*pzUAbje9&XU`S2Dm-SeP*Jz;DD{g zoXBsdl`b~gA+ce@V@keF(}(u$M$dceac$%hC@9=bm;3q7TeACo9`|r=mU-6~XO24p ztXscC_?F-kmt5!@J}nO|I$g_hQ&ci-8Oiz9{XJc`H27?=qg&@WonSC|o`;3PoId|p z8y~G4PGyc%X))N?A8uD8Z0`S zIyVy)!;*&ipiOp~kcE{XW}b*yi8(Oo=1e(WuZAYMT#=yAWu@iiL0&>!IUe`Ecq`4A z z$_C3@qQ@KNR3!Z58U)?YJ`ixBt0VybdhmWgTu_WyfcV`}ep4M(rx${do*{8xL4jcd zvhhTCzJ>&@p^DSkP26(sAR+D&DIXn*L@Ys2{R&)jo+K8Im6EDb%#`XQaeo*wV>MQK ztINi=P81*tPK9DCjI z=r=JR3)JD^1JY>L4C@A}r!8!OC*n{o=v%GNn;jg^TGXv_JkmIb_BxoF!}mv|4OnN4g&p9E8eyHnqHx?qKC^Tz z;CF|Pc4)faZr>$(IhuqEGr~B&WH_1elT$UP3Sg%C6Fs~nVlZLAh3@@Qred`QHDpox ze68`xip*_uufvj{8h2^P_`RsT8n^T;y(XRQa{bp{tM=d~Tg;^z@YHxOv;)X;08pyS zGVtp~j>)>%-m-pbRwlSDP)*ysJ`KIrbNvI$*8$ikN$$`SnJVxCXipp z*4BfcuJks=$qKiIw)VQ~X%Rz8d41(<)YY}W5nF`aN376yO=7nrw?P7yUn3=72?&#sQyIb7(ZFF$(qdKHE z1A~nvW{PFZ>v}2zV_h?O5^Qtd-$e$*f{AFGfjolC3 z?V_6}VrjvuBU%a`F{m6cCP>Kv&F1w`q94%Lt;Z=+WaH!L;d^YDV{eiqa0czwR=zGp^xf7BLn=my-?&4R;&!M*RU^(>)w zcHTm@5OY26psAx4;a%j&_r%fTMRuGA8c?Ttd7~jvl?3f#VKqI3(EF2+Mr*aiS2hW% z4G?BS4Ne=&-}Rj*-(W^hLxi*>xms z^>{8?GJLPNRMnS_z7oWgb1@**d70IQ?T2u$I%0Aqf8@j^;*(8PjZD!G2HzAq?wN30 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

!=;UgmIIeY>oA-(m%jzq8k9~%yy&AHbJEG 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 JHL~U*{{x7aG6w(v literal 0 HcmV?d00001 diff --git a/app/assets/images/saml_configure_datadog_07.png b/app/assets/images/saml_configure_datadog_07.png new file mode 100644 index 0000000000000000000000000000000000000000..62cd6471460b7541983645ce42ae6b0fe2725dd1 GIT binary patch literal 28587 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

Configuration Steps on Gate
+
    +
  1. +

    Copy the entity Id from the below picture after setting up SAML using the previous Instructions

    + <%= image_tag("saml_configure_datadog_03.png") %> +
  2. +
  3. Navigate to Datadog API Setup to setup your API and App Keys
  4. +
  5. +

    Refer the below image, to add the API Key

    + <%= image_tag("saml_configure_datadog_05.png") %> +
  6. +
  7. +

    Refer the below image, to add the App Key

    + <%= image_tag("saml_configure_datadog_06.png") %> +
  8. +
  9. +

    Update the SSO Url, Application Key, API Key from the previous steps by refering the below image

    + <%= image_tag("saml_configure_datadog_07.png") %> +
  10. +
  11. As a part of this process a group will be auto generated to add and remove users for accessing Datadog. The group created would be called saml_datadog_users
  12. +
Manage Users on Gate
- settings + <%= form_for saml_config, url: organisation_save_config_saml_app_path(organisation_id: org.id, app_name: app_name), method: :post do |f| %> +
+ <%= label_tag :datadog_sso_url %> + <%= f.text_field :sso_url, class: 'form-control' %> +
+
+ <%= label_tag :application_key %> + <%= text_field_tag 'config[app_key]', saml_config.config['app_key'], class: 'form-control' %> +
+
+ <%= label_tag :api_key %> + <%= text_field_tag 'config[api_key]', saml_config.config['api_key'], class: 'form-control' %> +
+ <%= f.submit 'Update Configuration', class: 'btn btn-primary mb-2'%> + <% end %>
manage users diff --git a/config/application.rb b/config/application.rb index b93cf838..86c93f05 100644 --- a/config/application.rb +++ b/config/application.rb @@ -11,7 +11,10 @@ class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. - config.autoload_paths += %W["#{config.root}/app/validators/"] + config.autoload_paths += %W[ + "#{config.root}/app/validators/", + "#{config.root}/app/lib/" + ] # config.active_record.raise_in_transactional_callbacks = true Mime::Type.register 'application/x-apple-aspen-config', :mobileconfig end diff --git a/config/routes.rb b/config/routes.rb index a7eead8a..8837888a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,6 +13,7 @@ resources :organisations, except: %i(destroy) do get 'setup_saml', action: :setup_saml get 'config_saml_app/:app_name', action: :config_saml_app, as: 'config_saml_app' + post 'config_saml_app/:app_name', action: :save_config_saml_app, as: :save_config_saml_app end end diff --git a/db/migrate/20181016093315_create_saml_app_configs.rb b/db/migrate/20181016093315_create_saml_app_configs.rb new file mode 100644 index 00000000..471b4ea7 --- /dev/null +++ b/db/migrate/20181016093315_create_saml_app_configs.rb @@ -0,0 +1,13 @@ +class CreateSamlAppConfigs < ActiveRecord::Migration[5.0] + def change + create_table :saml_app_configs do |t| + t.references :group, foreign_key: true + t.string :sso_url + t.json :config + t.references :organisation, foreign_key: true + t.string :app_name + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 77a432e6..754f724a 100755 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,4 +1,3 @@ -# encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to # incrementally modify your database, and then regenerate this schema definition. @@ -11,222 +10,221 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20181002023107) do +ActiveRecord::Schema.define(version: 20181016093315) do - create_table "access_tokens", force: :cascade do |t| - t.string "hashed_token", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "user_id", limit: 4 + create_table "access_tokens", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "hashed_token" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "user_id" + t.index ["hashed_token"], name: "index_access_tokens_on_hashed_token", using: :btree + t.index ["user_id"], name: "fk_rails_96fc070778", using: :btree end - add_index "access_tokens", ["hashed_token"], name: "index_access_tokens_on_hashed_token", using: :btree - add_index "access_tokens", ["user_id"], name: "fk_rails_96fc070778", using: :btree - - create_table "api_resources", force: :cascade do |t| - t.string "name", limit: 255 - t.string "description", limit: 255 - t.string "hashed_access_key", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "user_id", limit: 4 - t.integer "group_id", limit: 4 + create_table "api_resources", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "name" + t.string "description" + t.string "hashed_access_key" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "user_id" + t.integer "group_id" + t.index ["group_id"], name: "index_api_resources_on_group_id", using: :btree + t.index ["user_id"], name: "index_api_resources_on_user_id", using: :btree end - add_index "api_resources", ["group_id"], name: "index_api_resources_on_group_id", using: :btree - add_index "api_resources", ["user_id"], name: "index_api_resources_on_user_id", using: :btree - - create_table "group_admins", force: :cascade do |t| - t.integer "group_id", limit: 4 - t.integer "user_id", limit: 4 + create_table "group_admins", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "group_id" + t.integer "user_id" t.datetime "created_at" t.datetime "updated_at" + t.index ["group_id"], name: "fk_rails_1a1d29d2d3", using: :btree + t.index ["user_id"], name: "fk_rails_0ac5a6fa32", using: :btree end - add_index "group_admins", ["group_id"], name: "fk_rails_1a1d29d2d3", using: :btree - add_index "group_admins", ["user_id"], name: "fk_rails_0ac5a6fa32", using: :btree - - create_table "group_associations", force: :cascade do |t| - t.integer "user_id", limit: 4 - t.integer "group_id", limit: 4 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "group_associations", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "user_id" + t.integer "group_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["group_id", "user_id"], name: "index_group_associations_on_group_id_and_user_id", using: :btree end - add_index "group_associations", ["group_id", "user_id"], name: "index_group_associations_on_group_id_and_user_id", using: :btree - - create_table "groups", force: :cascade do |t| - t.string "name", limit: 255 - t.integer "gid", limit: 4 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "deleted_by", limit: 4 + create_table "groups", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "name" + t.integer "gid" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "deleted_by" t.datetime "deleted_at" - t.string "description", limit: 255 + t.string "description" + t.index ["gid"], name: "index_groups_on_gid", using: :btree + t.index ["name"], name: "index_groups_on_name", unique: true, using: :btree end - add_index "groups", ["gid"], name: "index_groups_on_gid", using: :btree - add_index "groups", ["name"], name: "index_groups_on_name", unique: true, using: :btree - - create_table "host_access_groups", force: :cascade do |t| - t.integer "host_machine_id", limit: 4 - t.integer "group_id", limit: 4 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + create_table "host_access_groups", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "host_machine_id" + t.integer "group_id" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["host_machine_id", "group_id"], name: "index_host_access_groups_on_host_machine_id_and_group_id", using: :btree end - add_index "host_access_groups", ["host_machine_id", "group_id"], name: "index_host_access_groups_on_host_machine_id_and_group_id", using: :btree - - create_table "host_machines", force: :cascade do |t| - t.string "name", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "api_key", limit: 255 - t.string "access_key", limit: 255 - t.boolean "default_admins", default: true + create_table "host_machines", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "api_key" + t.string "access_key" + t.boolean "default_admins", default: true + t.index ["access_key"], name: "index_host_machines_on_access_key", using: :btree end - add_index "host_machines", ["access_key"], name: "index_host_machines_on_access_key", using: :btree - - create_table "hosts", force: :cascade do |t| - t.string "host_pattern", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "user_id", limit: 4 + create_table "hosts", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "host_pattern" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "user_id" t.datetime "deleted_at" - t.integer "deleted_by", limit: 4 - end - - add_index "hosts", ["deleted_at"], name: "index_hosts_on_deleted_at", using: :btree - add_index "hosts", ["deleted_by"], name: "index_hosts_on_deleted_by", using: :btree - add_index "hosts", ["host_pattern"], name: "index_hosts_on_host_pattern", using: :btree - add_index "hosts", ["user_id"], name: "index_hosts_on_user_id", using: :btree - - create_table "ip_addresses", force: :cascade do |t| - t.string "address", limit: 255 - t.string "mac_address", limit: 255 - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.integer "host_machine_id", limit: 4 - end - - add_index "ip_addresses", ["address"], name: "index_ip_addresses_on_address", using: :btree - add_index "ip_addresses", ["host_machine_id"], name: "index_ip_addresses_on_host_machine_id", using: :btree - add_index "ip_addresses", ["mac_address"], name: "index_ip_addresses_on_mac_address", using: :btree - - create_table "organisations", force: :cascade do |t| - t.string "name", limit: 255 - t.string "website", limit: 255 - t.string "domain", limit: 255 + t.integer "deleted_by" + t.index ["deleted_at"], name: "index_hosts_on_deleted_at", using: :btree + t.index ["deleted_by"], name: "index_hosts_on_deleted_by", using: :btree + t.index ["host_pattern"], name: "index_hosts_on_host_pattern", using: :btree + t.index ["user_id"], name: "index_hosts_on_user_id", using: :btree + end + + create_table "ip_addresses", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "address" + t.string "mac_address" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.integer "host_machine_id" + t.index ["address"], name: "index_ip_addresses_on_address", using: :btree + t.index ["host_machine_id"], name: "index_ip_addresses_on_host_machine_id", using: :btree + t.index ["mac_address"], name: "index_ip_addresses_on_mac_address", using: :btree + end + + create_table "organisations", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "name" + t.string "website" + t.string "domain" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.string "country", limit: 255 - t.string "state", limit: 255 - t.string "address", limit: 255 - t.string "unit_name", limit: 255 - t.string "admin_email_address", limit: 255 - t.string "slug", limit: 255 - t.string "cert_fingerprint", limit: 255 + t.string "country" + t.string "state" + t.string "address" + t.string "unit_name" + t.string "admin_email_address" + t.string "slug" + t.string "cert_fingerprint" t.text "cert_key", limit: 65535 t.text "cert_private_key", limit: 65535 end - create_table "users", force: :cascade do |t| - t.string "email", limit: 255, default: "", null: false - t.string "encrypted_password", limit: 255, default: "", null: false - t.string "reset_password_token", limit: 255 + create_table "saml_app_configs", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "group_id" + t.string "sso_url" + t.json "config" + t.integer "organisation_id" + t.string "app_name" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.index ["group_id"], name: "index_saml_app_configs_on_group_id", using: :btree + t.index ["organisation_id"], name: "index_saml_app_configs_on_organisation_id", using: :btree + end + + create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "email", default: "", null: false + t.string "encrypted_password", default: "", null: false + t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", limit: 4, default: 0, null: false + t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.string "current_sign_in_ip", limit: 255 - t.string "last_sign_in_ip", limit: 255 + t.string "current_sign_in_ip" + t.string "last_sign_in_ip" t.datetime "created_at", null: false t.datetime "updated_at", null: false - t.string "provider", limit: 255 - t.string "uid", limit: 255 - t.string "name", limit: 255 - t.string "auth_key", limit: 255 - t.string "provisioning_uri", limit: 255 + t.string "provider" + t.string "uid" + t.string "name" + t.string "auth_key" + t.string "provisioning_uri" t.boolean "active", default: true t.boolean "admin", default: false - t.string "home_dir", limit: 255 - t.string "shell", limit: 255 + t.string "home_dir" + t.string "shell" t.text "public_key", limit: 65535 - t.string "user_login_id", limit: 255 - t.string "product_name", limit: 255 - t.string "access_key", limit: 255 + t.string "user_login_id" + t.string "product_name" + t.string "access_key" t.datetime "deactivated_at" + t.index ["email"], name: "index_users_on_email", unique: true, using: :btree + t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree + t.index ["uid"], name: "index_users_on_uid", using: :btree + t.index ["user_login_id"], name: "index_users_on_user_login_id", using: :btree end - add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree - add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree - add_index "users", ["uid"], name: "index_users_on_uid", using: :btree - add_index "users", ["user_login_id"], name: "index_users_on_user_login_id", using: :btree - - create_table "versions", force: :cascade do |t| + create_table "versions", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4" do |t| t.string "item_type", limit: 191, null: false - t.integer "item_id", limit: 4, null: false - t.string "event", limit: 255, null: false - t.string "whodunnit", limit: 255 + t.integer "item_id", null: false + t.string "event", null: false + t.string "whodunnit" t.text "object", limit: 4294967295 t.text "object_changes", limit: 65535 t.datetime "created_at" + t.index ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id", using: :btree end - add_index "versions", ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id", using: :btree - - create_table "vpn_domain_name_servers", force: :cascade do |t| - t.integer "vpn_id", limit: 4 - t.string "server_address", limit: 255 + create_table "vpn_domain_name_servers", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "vpn_id" + t.string "server_address" t.datetime "created_at" t.datetime "updated_at" end - create_table "vpn_group_associations", force: :cascade do |t| - t.integer "group_id", limit: 4 - t.integer "vpn_id", limit: 4 + create_table "vpn_group_associations", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "group_id" + t.integer "vpn_id" t.datetime "created_at" t.datetime "updated_at" + t.index ["group_id"], name: "fk_rails_67a460ac90", using: :btree + t.index ["vpn_id"], name: "fk_rails_9be3690c1d", using: :btree end - add_index "vpn_group_associations", ["group_id"], name: "fk_rails_67a460ac90", using: :btree - add_index "vpn_group_associations", ["vpn_id"], name: "fk_rails_9be3690c1d", using: :btree - - create_table "vpn_group_user_associations", force: :cascade do |t| - t.integer "user_id", limit: 4 - t.integer "vpn_id", limit: 4 - t.integer "group_id", limit: 4 + create_table "vpn_group_user_associations", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "user_id" + t.integer "vpn_id" + t.integer "group_id" t.datetime "created_at" t.datetime "updated_at" + t.index ["group_id"], name: "fk_rails_30de0bd58e", using: :btree + t.index ["user_id"], name: "fk_rails_275419a627", using: :btree + t.index ["vpn_id"], name: "fk_rails_dbd29a5c87", using: :btree end - add_index "vpn_group_user_associations", ["group_id"], name: "fk_rails_30de0bd58e", using: :btree - add_index "vpn_group_user_associations", ["user_id"], name: "fk_rails_275419a627", using: :btree - add_index "vpn_group_user_associations", ["vpn_id"], name: "fk_rails_dbd29a5c87", using: :btree - - create_table "vpn_search_domains", force: :cascade do |t| - t.integer "vpn_id", limit: 4 - t.string "search_domain", limit: 255 + create_table "vpn_search_domains", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "vpn_id" + t.string "search_domain" t.datetime "created_at" t.datetime "updated_at" end - create_table "vpn_supplemental_match_domains", force: :cascade do |t| - t.integer "vpn_id", limit: 4 - t.string "supplemental_match_domain", limit: 255 + create_table "vpn_supplemental_match_domains", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.integer "vpn_id" + t.string "supplemental_match_domain" t.datetime "created_at" t.datetime "updated_at" end - create_table "vpns", force: :cascade do |t| - t.string "name", limit: 255 - t.string "host_name", limit: 255 + create_table "vpns", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t| + t.string "name" + t.string "host_name" t.datetime "created_at" t.datetime "updated_at" - t.string "ip_address", limit: 255 - t.string "uuid", limit: 255 + t.string "ip_address" + t.string "uuid" end add_foreign_key "access_tokens", "users" @@ -236,6 +234,8 @@ add_foreign_key "group_admins", "users" add_foreign_key "hosts", "users" add_foreign_key "ip_addresses", "host_machines" + add_foreign_key "saml_app_configs", "groups" + add_foreign_key "saml_app_configs", "organisations" add_foreign_key "vpn_group_associations", "groups" add_foreign_key "vpn_group_associations", "vpns" add_foreign_key "vpn_group_user_associations", "groups" diff --git a/spec/factories/saml_app_configs.rb b/spec/factories/saml_app_configs.rb new file mode 100644 index 00000000..d6863e70 --- /dev/null +++ b/spec/factories/saml_app_configs.rb @@ -0,0 +1,9 @@ +FactoryBot.define do + factory :saml_app_config do + sso_url { Faker::Internet.url } + group { create(:group, name: 'saml_datadog_users') } + config { { app_key: Faker::Internet.password(8), api_key: Faker::Internet.password(8) } } + organisation { build(:organisation) } + app_name { 'datadog' } + end +end diff --git a/spec/features/organisations/save_config_saml_app_spec.rb b/spec/features/organisations/save_config_saml_app_spec.rb new file mode 100644 index 00000000..50f269a3 --- /dev/null +++ b/spec/features/organisations/save_config_saml_app_spec.rb @@ -0,0 +1,51 @@ +require 'rails_helper' +RSpec.feature 'Save Config Saml App', type: :feature do + let(:org) { create(:organisation) } + let(:user) { create(:user) } + let(:app_name) { 'datadog' } + + before do + sign_in(user) + end + + scenario 'Load Present Configuration' do + url = Faker::Internet.url + saml_app = Datadog.new(org.id) + app_key = Faker::Internet.password(8) + api_key = Faker::Internet.password(8) + saml_app.save_config(url, app_key: app_key, api_key: api_key) + visit organisation_config_saml_app_path( + organisation_id: org.id, app_name: app_name + ) + page.find('#settings-tab').click + expect(page.find_field('saml_app_config_sso_url').value).to eq(url) + expect(page.find_field('config_app_key').value).to eq(app_key) + expect(page.find_field('config_api_key').value).to eq(api_key) + end + + scenario 'Load New Configuration If Not Saved' do + visit organisation_config_saml_app_path( + organisation_id: org.id, app_name: app_name + ) + page.find('#settings-tab').click + expect(page.find_field('saml_app_config_sso_url').value.blank?).to eq(true) + expect(page.find_field('config_app_key').value.blank?).to eq(true) + expect(page.find_field('config_api_key').value.blank?).to eq(true) + end + + scenario 'Save Configuration' do + url = Faker::Internet.url + app_key = Faker::Internet.password(8) + api_key = Faker::Internet.password(8) + path = organisation_config_saml_app_path( + organisation_id: org.id, app_name: app_name + ) + visit path + page.find('#settings-tab').click + page.find_field('saml_app_config_sso_url').set(url) + page.find_field('config_app_key').set(app_key) + page.find_field('config_api_key').set(api_key) + page.find('#new_saml_app_config').click + expect(current_path).to eq(path) + end +end diff --git a/spec/lib/datadog_spec.rb b/spec/lib/datadog_spec.rb new file mode 100644 index 00000000..47788d7e --- /dev/null +++ b/spec/lib/datadog_spec.rb @@ -0,0 +1,45 @@ +require 'rails_helper' + +RSpec.describe Datadog do + + let(:org) { create(:organisation) } + let(:app_name) { 'datadog' } + + describe 'initialize' do + it 'fetches configuration if already saved' do + config = create(:saml_app_config, organisation: org) + saml_app = Datadog.new(org.id) + expect(saml_app.config).to eq(config) + end + + it 'initializes configuration if not created' do + saml_app = Datadog.new(org.id) + expect(saml_app.config.persisted?).to eq(false) + end + end + + describe 'save_config' do + let(:url) { Faker::Internet.url } + let(:app_key) { Faker::Internet.password(8) } + let(:api_key) { Faker::Internet.password(8) } + it 'creates group if configuration isn\'t initialized' do + saml_app = Datadog.new(org.id) + saml_app.save_config(url, app_key: app_key, api_key: api_key) + expect(saml_app.config.group.name).to eq('saml_datadog_users') + expect(saml_app.config.persisted?).to eq(true) + expect(saml_app.config.config['app_key']).to eq(app_key) + expect(saml_app.config.config['api_key']).to eq(api_key) + expect(saml_app.config.sso_url).to eq(url) + end + + it 'saves the configuration for the application' do + config = create(:saml_app_config, organisation: org) + saml_app = Datadog.new(org.id) + saml_app.save_config(url, app_key: app_key, api_key: api_key) + expect(saml_app.config.id).to eq(config.id) + expect(saml_app.config.config['app_key']).to eq(app_key) + expect(saml_app.config.config['api_key']).to eq(api_key) + expect(saml_app.config.sso_url).to eq(url) + end + end +end From d7fb7a3c6bdcdfe6defd9dca6c98afad9909bcdc Mon Sep 17 00:00:00 2001 From: Siddarth R Date: Wed, 24 Oct 2018 03:23:31 +0530 Subject: [PATCH 3/8] Added Support for adding user and removing users to the group --- app/models/group.rb | 10 ++++++++++ spec/models/group_spec.rb | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/app/models/group.rb b/app/models/group.rb index add70747..4e48d7aa 100755 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -167,4 +167,14 @@ def self.get_default_sysadmin_group_for_host sysadmins_login_ids, default_admins sysadmin_group[:gr_passwd] = "x" return sysadmin_group end + + def add_user(user_id) + unless group_associations.map(&:user_id).include?(user_id) + group_associations.create(user_id: user_id) + end + end + + def remove_user(user_id) + group_associations.where(user_id: user_id).delete_all + end end diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 6004cab3..f6a5bbf3 100755 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -47,4 +47,30 @@ expect(host_response[:groups][0]).to eq(group.name) end + describe 'add_user' do + let(:user) { create(:user) } + let(:group) { create(:group) } + + it 'add user to the group' do + group.add_user(user.id) + expect(group.users.map(&:id).include?(user.id)).to eq(true) + end + + it 'not add user if already added to the group' do + group.add_user(user.id) + group.add_user(user.id) + expect(group.users.where(id: user.id).size).to eq(1) + end + end + + describe 'remove_user' do + let(:user) { create(:user) } + let(:group) { create(:group) } + + it 'removes users from the group' do + group.add_user(user.id) + group.remove_user(user.id) + expect(group.users.map(&:id).include?(user.id)).to eq(false) + end + end end From 07e51eb77847818095b8716cf220bfa059a74060 Mon Sep 17 00:00:00 2001 From: Siddarth R Date: Wed, 24 Oct 2018 03:24:06 +0530 Subject: [PATCH 4/8] Added Datadog Client --- app/clients/data_dog_client.rb | 62 ++++++++++++++++++++ config/application.rb | 3 +- spec/clients/data_dog_client_spec.rb | 86 ++++++++++++++++++++++++++++ 3 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 app/clients/data_dog_client.rb create mode 100644 spec/clients/data_dog_client_spec.rb diff --git a/app/clients/data_dog_client.rb b/app/clients/data_dog_client.rb new file mode 100644 index 00000000..5f477cc7 --- /dev/null +++ b/app/clients/data_dog_client.rb @@ -0,0 +1,62 @@ +class DataDogClient + include HTTParty + base_uri 'https://api.datadoghq.com/api/v1' + + def initialize(app_key, api_key) + @base_path = 'https://api.datadoghq.com/api/v1' + @app_key = app_key + @api_key = api_key + @headers = { + 'Content-Type' => 'application/json', + 'Accept' => 'application/json', + } + end + + def get_user(email) + url = append_auth("/user/#{email}") + response = self.class.get(url, headers: @headers) + if response.success? + JSON.parse(response.body)['user'] + else + {} + end + end + + def new_user(email) + url = append_auth('/user') + response = self.class.post(url, body: { handle: email }.to_json, headers: @headers) + if response.success? + JSON.parse(response.body)['user'] + else + {} + end + end + + def activate_user(email) + url = append_auth("/user/#{email}") + response = self.class.put(url, body: { email: email, disabled: false }.to_json, headers: @headers) + if response.success? + JSON.parse(response.body)['user'] + else + {} + end + end + + def deactivate_user(email) + url = append_auth("/user/#{email}") + response = self.class.put(url, body: { email: email, disabled: true }.to_json, headers: @headers) + if response.success? + JSON.parse(response.body)['user'] + else + {} + end + end + + private + + def append_auth(str) + auth_str = "api_key=#{@api_key}&application_key=#{@app_key}" + str += str.include?('?') ? "&#{auth_str}" : "?#{auth_str}" + str + end +end diff --git a/config/application.rb b/config/application.rb index 86c93f05..c0d327ef 100644 --- a/config/application.rb +++ b/config/application.rb @@ -13,7 +13,8 @@ class Application < Rails::Application # -- all .rb files in that directory are automatically loaded. config.autoload_paths += %W[ "#{config.root}/app/validators/", - "#{config.root}/app/lib/" + "#{config.root}/app/lib/", + "#{config.root}/app/clients" ] # config.active_record.raise_in_transactional_callbacks = true Mime::Type.register 'application/x-apple-aspen-config', :mobileconfig diff --git a/spec/clients/data_dog_client_spec.rb b/spec/clients/data_dog_client_spec.rb new file mode 100644 index 00000000..fe53d012 --- /dev/null +++ b/spec/clients/data_dog_client_spec.rb @@ -0,0 +1,86 @@ +require 'rails_helper' + +RSpec.describe DataDogClient do + + let(:email) { Faker::Internet.email } + let(:org) { create(:organisation) } + let(:app_key) { Faker::Internet.password(8) } + let(:api_key) { Faker::Internet.password(8) } + let(:base_url) { 'https://api.datadoghq.com/api/v1' } + let(:client) { DataDogClient.new(app_key, api_key) } + let(:auth_str) do + "api_key=#{api_key}&application_key=#{app_key}" + end + let(:headers) do + { + 'Accept' => 'application/json', + 'Content-Type' => 'application/json', + } + end + + describe 'get_user' do + it 'get user details for registered email address' do + stub_request(:get, "#{base_url}/user/#{email}?#{auth_str}"). + to_return(status: 200, body: { user: { handle: email } }.to_json) + expect(client.get_user(email)['handle']).to eq(email) + end + + it 'get a blank hash for unregistered email address' do + stub_request(:get, "#{base_url}/user/#{email}?#{auth_str}"). + with(headers: headers). + to_return(status: 401) + expect(client.get_user(email)).to eq({}) + end + end + + describe 'new_user' do + let(:params) { { handle: email }.to_json } + it 'create a new user' do + stub_request(:post, "#{base_url}/user?#{auth_str}"). + with(body: params, headers: headers). + to_return(status: 200, body: { user: { handle: email } }.to_json) + expect(client.new_user(email)['handle']).to eq(email) + end + + it 'shouldn\'t create user if already exists' do + stub_request(:post, "#{base_url}/user?#{auth_str}"). + with(body: params, headers: headers). + to_return(status: 409) + expect(client.new_user(email)).to eq({}) + end + end + + describe 'activate_user' do + let(:params) { { email: email, disabled: false }.to_json } + it 'activates user and returns user object if email is found' do + stub_request(:put, "#{base_url}/user/#{email}?#{auth_str}"). + with(body: params, headers: headers). + to_return(status: 200, body: { user: { handle: email } }.to_json) + expect(client.activate_user(email)['handle']).to eq(email) + end + + it 'returns empty object if email is not found' do + stub_request(:put, "#{base_url}/user/#{email}?#{auth_str}"). + with(body: params, headers: headers). + to_return(status: 500) + expect(client.activate_user(email)).to eq({}) + end + end + + describe 'deactivate_user' do + let(:params) { { email: email, disabled: true }.to_json } + it 'deactivates user and returns user object if email is found' do + stub_request(:put, "#{base_url}/user/#{email}?#{auth_str}"). + with(body: params, headers: headers). + to_return(status: 200, body: { user: { handle: email } }.to_json) + expect(client.deactivate_user(email)['handle']).to eq(email) + end + + it 'returns empty object if email is not found' do + stub_request(:put, "#{base_url}/user/#{email}?#{auth_str}"). + with(body: params, headers: headers). + to_return(status: 500) + expect(client.deactivate_user(email)).to eq({}) + end + end +end From 5c9f0b95fc709e9791175eb71a08b644b2da3da7 Mon Sep 17 00:00:00 2001 From: Siddarth R Date: Wed, 24 Oct 2018 03:25:35 +0530 Subject: [PATCH 5/8] Added support for adding and removing users for datadog --- Gemfile | 1 + Gemfile.lock | 3 + .../images/saml_configure_datadog_08.png | Bin 0 -> 5070 bytes .../images/saml_configure_datadog_09.png | Bin 0 -> 11699 bytes app/controllers/organisations_controller.rb | 37 +++++- app/lib/datadog.rb | 24 +++- app/lib/saml_app.rb | 21 +++- .../organisations/config_saml_app.html.slim | 2 +- .../organisations/saml_apps/_datadog.html.erb | 39 +++++- config/routes.rb | 2 + spec/factories/saml_app_configs.rb | 2 +- .../organisations/add_user_saml_app_spec.rb | 29 +++++ .../organisations/list_user_saml_app_spec.rb | 72 +++++++++++ .../remove_user_saml_app_spec.rb | 28 +++++ spec/lib/datadog_spec.rb | 117 +++++++++++++----- spec/lib/saml_app_spec.rb | 86 +++++++++++++ 16 files changed, 426 insertions(+), 37 deletions(-) create mode 100644 app/assets/images/saml_configure_datadog_08.png create mode 100644 app/assets/images/saml_configure_datadog_09.png create mode 100644 spec/features/organisations/add_user_saml_app_spec.rb create mode 100644 spec/features/organisations/list_user_saml_app_spec.rb create mode 100644 spec/features/organisations/remove_user_saml_app_spec.rb create mode 100644 spec/lib/saml_app_spec.rb diff --git a/Gemfile b/Gemfile index e8e2bc69..969d3287 100755 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,7 @@ gem 'countries', require: 'countries/global' gem 'devise' gem 'figaro' gem 'font-awesome-rails' +gem 'httparty' gem 'jbuilder' gem 'jquery-rails' gem 'mysql2', '~> 0.4.10' diff --git a/Gemfile.lock b/Gemfile.lock index b1686c49..4ef8b37c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -123,6 +123,8 @@ GEM hashdiff (0.3.7) hashie (3.5.7) hirb (0.7.3) + httparty (0.16.2) + multi_xml (>= 0.5.2) i18n (0.9.5) concurrent-ruby (~> 1.0) i18n_data (0.8.0) @@ -357,6 +359,7 @@ DEPENDENCIES faker figaro font-awesome-rails + httparty jbuilder jquery-rails mock_redis diff --git a/app/assets/images/saml_configure_datadog_08.png b/app/assets/images/saml_configure_datadog_08.png new file mode 100644 index 0000000000000000000000000000000000000000..ec803bce01b8973622d8e731b9cd1fcab2a04f5d GIT binary patch literal 5070 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/saml_configure_datadog_09.png b/app/assets/images/saml_configure_datadog_09.png new file mode 100644 index 0000000000000000000000000000000000000000..baca31923db0fd03fed9f61837d07f827e7d7790 GIT binary patch literal 11699 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 Vj@8iCEI>XNX>kRy8WF>Q{|EJu2kZa< literal 0 HcmV?d00001 diff --git a/app/controllers/organisations_controller.rb b/app/controllers/organisations_controller.rb index 0fcd343a..258a296e 100644 --- a/app/controllers/organisations_controller.rb +++ b/app/controllers/organisations_controller.rb @@ -1,6 +1,12 @@ class OrganisationsController < ApplicationController - before_action :load_org, only: %i(config_saml_app update show setup_saml save_config_saml_app) - before_action :validate_app_name, only: %i(config_saml_app save_config_saml_app) + before_action :load_org, only: %i( + config_saml_app update show setup_saml save_config_saml_app + remove_user_saml_app add_user_saml_app + ) + before_action :validate_app_name, only: %i( + config_saml_app save_config_saml_app + remove_user_saml_app add_user_saml_app + ) def index render :index, locals: { org_list: Organisation.all } @@ -13,10 +19,13 @@ def new def config_saml_app app_name = params[:app_name] saml_app = app_name.titleize.constantize.new(@org.id) + config = saml_app.config + users = config.persisted? ? config.group.users : [] render :config_saml_app, locals: { org: @org, - saml_config: saml_app.config, + saml_config: config, app_name: app_name, + users: users, } end @@ -32,6 +41,28 @@ def save_config_saml_app ) end + def remove_user_saml_app + app_name = params[:app_name] + saml_app = app_name.titleize.constantize.new(@org.id) + if saml_app.remove_user(params[:email]) + flash[:success] = 'User removed successfullly' + else + flash[:error] = 'Issue removing the user' + end + redirect_to organisation_config_saml_app_path + end + + def add_user_saml_app + app_name = params[:app_name] + saml_app = app_name.titleize.constantize.new(@org.id) + if saml_app.add_user(params[:email]) + flash[:success] = 'User added successfullly' + else + flash[:error] = 'Issue adding the user' + end + redirect_to organisation_config_saml_app_path + end + def create org = Organisation.setup(organisation_params.to_h || {}) if org.errors.blank? diff --git a/app/lib/datadog.rb b/app/lib/datadog.rb index 4c9e46aa..34cb7a36 100644 --- a/app/lib/datadog.rb +++ b/app/lib/datadog.rb @@ -2,8 +2,13 @@ class Datadog < SamlApp def initialize(org_id) @app_name = 'datadog' - super - unless @config.persisted? + super(org_id) + if @config.persisted? + @client = DataDogClient.new( + @config.config['app_key'], + @config.config['api_key'] + ) + else @config.config = { app_key: '', api_key: '' } end end @@ -12,4 +17,19 @@ def save_config(sso_url, config = {}) @config.config = @config.config.merge(config) super(sso_url, config) end + + def add_user(email) + user_detail_response = @client.get_user(email) + response = if user_detail_response.eql?({}) + @client.new_user(email) + else + @client.activate_user(email) + end + super(email) unless response.eql?({}) + end + + def remove_user(email) + response = @client.deactivate_user(email) + super(email) unless response.eql?({}) + end end diff --git a/app/lib/saml_app.rb b/app/lib/saml_app.rb index 879b08a8..8910bb5b 100644 --- a/app/lib/saml_app.rb +++ b/app/lib/saml_app.rb @@ -10,9 +10,28 @@ def initialize(org_id) def save_config(sso_url, config = {}) unless @config.persisted? - @config.group = Group.find_or_create_by(name: "saml_#{app_name}_users") + group_name = "#{@config.organisation.slug}_saml_#{app_name}_users" + @config.group = Group.find_or_create_by(name: group_name) end @config.sso_url = sso_url @config.save end + + def add_user(email) + user = User.where(email: email).first + unless user.blank? + @config.group.add_user(user.id) + return true + end + false + end + + def remove_user(email) + user = User.where(email: email).first + unless user.blank? + @config.group.remove_user(user.id) + return true + end + false + end end diff --git a/app/views/organisations/config_saml_app.html.slim b/app/views/organisations/config_saml_app.html.slim index 6de48f01..20ac24ed 100644 --- a/app/views/organisations/config_saml_app.html.slim +++ b/app/views/organisations/config_saml_app.html.slim @@ -4,4 +4,4 @@ h5 Configure #{app_name.titleize} .row.mb-3.mt-2 .col-md-12 - = render partial: "organisations/saml_apps/#{app_name}", locals: {org: org, app_name: app_name, saml_config: saml_config} + = render partial: "organisations/saml_apps/#{app_name}", locals: {org: org, app_name: app_name, saml_config: saml_config, users: users} diff --git a/app/views/organisations/saml_apps/_datadog.html.erb b/app/views/organisations/saml_apps/_datadog.html.erb index 75c4453f..119a26ea 100644 --- a/app/views/organisations/saml_apps/_datadog.html.erb +++ b/app/views/organisations/saml_apps/_datadog.html.erb @@ -74,6 +74,17 @@
  • As a part of this process a group will be auto generated to add and remove users for accessing Datadog. The group created would be called saml_datadog_users
  • Manage Users on Gate
    +
      +
    1. Click on Manage Users to add/remove users
    2. +
    3. +

      Enter the email address in the below box to add users to datadog

      + <%= image_tag("saml_configure_datadog_08.png") %> +
    4. +
    5. +

      When you click on the page, you will get a list of users with a remove button. You can click remove to remove users from accessing datadog

      + <%= image_tag("saml_configure_datadog_09.png") %> +
    6. +
    <%= form_for saml_config, url: organisation_save_config_saml_app_path(organisation_id: org.id, app_name: app_name), method: :post do |f| %> @@ -93,6 +104,32 @@ <% end %>
    - manage users + <%= form_tag organisation_add_user_saml_app_path(organisation_id: org.id, app_name: app_name), method: :post do %> +
    + <%= label_tag :email_address %> + <%= text_field_tag 'email', '', class: 'form-control' %> +
    + <%= submit_tag 'Add User', class: 'btn btn-primary mb-2', id: 'add_user_to_app' %> + <% end %> +
    + + + + + + + + + + <% users.each do |user| %> + + + + + + <% end %> + +
    NameEmailActions
    <%= link_to user.name, user_path(id: user.id) %><%= user.email %><%= link_to "Remove", organisation_remove_user_saml_app_path(organisation_id: org.id, app_name: app_name, email: user.email), method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-sm btn-danger', id: "saml_user_remove_#{user.id}" %>
    +
    diff --git a/config/routes.rb b/config/routes.rb index 8837888a..ef914640 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -14,6 +14,8 @@ get 'setup_saml', action: :setup_saml get 'config_saml_app/:app_name', action: :config_saml_app, as: 'config_saml_app' post 'config_saml_app/:app_name', action: :save_config_saml_app, as: :save_config_saml_app + post 'config_saml_app/:app_name/add_user', action: :add_user_saml_app, as: :add_user_saml_app + delete 'config_saml_app/:app_name', action: :remove_user_saml_app, as: :remove_user_saml_app end end diff --git a/spec/factories/saml_app_configs.rb b/spec/factories/saml_app_configs.rb index d6863e70..49b704ed 100644 --- a/spec/factories/saml_app_configs.rb +++ b/spec/factories/saml_app_configs.rb @@ -1,7 +1,7 @@ FactoryBot.define do factory :saml_app_config do sso_url { Faker::Internet.url } - group { create(:group, name: 'saml_datadog_users') } + group { create(:group, name: "saml_#{Faker::Lorem.word}_datadog_users") } config { { app_key: Faker::Internet.password(8), api_key: Faker::Internet.password(8) } } organisation { build(:organisation) } app_name { 'datadog' } diff --git a/spec/features/organisations/add_user_saml_app_spec.rb b/spec/features/organisations/add_user_saml_app_spec.rb new file mode 100644 index 00000000..77589bf7 --- /dev/null +++ b/spec/features/organisations/add_user_saml_app_spec.rb @@ -0,0 +1,29 @@ +require 'rails_helper' +RSpec.feature 'Config Saml App', type: :feature do + let(:user) { create(:user) } + let(:users) { create_list(:user, 10) } + let(:org) { create(:organisation) } + + before do + sign_in(user) + end + + scenario 'Add user to group' do + create( + :saml_app_config, + organisation: org, + group: Group.new(name: "#{org.slug}_saml_datadog_users") + ) + allow_any_instance_of(Group).to receive(:users).and_return(users) + home_path = organisation_config_saml_app_path( + organisation_id: org.id, app_name: 'datadog' + ) + visit home_path + page.find('#manage-users-tab').click + page.find_field('email').set(user.email) + expect_any_instance_of(Datadog). + to receive(:add_user).with(user.email) + page.find('#add_user_to_app').click + expect(current_path).to eq(home_path) + end +end diff --git a/spec/features/organisations/list_user_saml_app_spec.rb b/spec/features/organisations/list_user_saml_app_spec.rb new file mode 100644 index 00000000..c1f0a3e0 --- /dev/null +++ b/spec/features/organisations/list_user_saml_app_spec.rb @@ -0,0 +1,72 @@ +require 'rails_helper' +RSpec.feature 'Config Saml App', type: :feature do + let(:user) { create(:user) } + let(:users) { create_list(:user, 10) } + let(:org) { create(:organisation) } + + before do + sign_in(user) + end + + scenario 'Display list of users for the saml app' do + create( + :saml_app_config, + organisation: org, + group: Group.new(name: "#{org.slug}_saml_datadog_users") + ) + allow_any_instance_of(Group).to receive(:users).and_return(users) + visit organisation_config_saml_app_path( + organisation_id: org.id, app_name: 'datadog' + ) + page.find('#manage-users-tab').click + users.each do |user| + expect(page).to have_xpath( + "//td[.='#{user.email}']" + ) + expect(page).to have_xpath( + "//td/a[.='#{user.name}']" + ) + end + end + + scenario 'Display link for user profile' do + create( + :saml_app_config, + organisation: org, + group: Group.new(name: "#{org.slug}_saml_datadog_users") + ) + allow_any_instance_of(Group).to receive(:users).and_return(users) + visit organisation_config_saml_app_path( + organisation_id: org.id, app_name: 'datadog' + ) + page.find('#manage-users-tab').click + users.each do |user| + expect(page).to have_xpath( + "//td/a[.='#{user.name}' and @href='#{user_path(id: user.id)}']" + ) + end + end + + scenario 'Display remove link for users' do + create( + :saml_app_config, + organisation: org, + group: Group.new(name: "#{org.slug}_saml_datadog_users") + ) + allow_any_instance_of(Group).to receive(:users).and_return(users) + visit organisation_config_saml_app_path( + organisation_id: org.id, app_name: 'datadog' + ) + page.find('#manage-users-tab').click + users.each do |user| + remove_path = organisation_remove_user_saml_app_path( + organisation_id: org.id, + app_name: 'datadog', + email: user.email + ) + expect(page).to have_xpath( + "//td/a[.='Remove' and @href='#{remove_path}']" + ) + end + end +end diff --git a/spec/features/organisations/remove_user_saml_app_spec.rb b/spec/features/organisations/remove_user_saml_app_spec.rb new file mode 100644 index 00000000..5ee10d92 --- /dev/null +++ b/spec/features/organisations/remove_user_saml_app_spec.rb @@ -0,0 +1,28 @@ +require 'rails_helper' +RSpec.feature 'Config Saml App', type: :feature do + let(:user) { create(:user) } + let(:users) { create_list(:user, 10) } + let(:org) { create(:organisation) } + + before do + sign_in(user) + end + + scenario 'Remove user from group' do + create( + :saml_app_config, + organisation: org, + group: Group.new(name: "#{org.slug}_saml_datadog_users") + ) + allow_any_instance_of(Group).to receive(:users).and_return(users) + home_path = organisation_config_saml_app_path( + organisation_id: org.id, app_name: 'datadog' + ) + visit home_path + page.find('#manage-users-tab').click + expect_any_instance_of(Datadog). + to receive(:remove_user).with(users.first.email) + page.find("#saml_user_remove_#{users.first.id}").click + expect(current_path).to eq(home_path) + end +end diff --git a/spec/lib/datadog_spec.rb b/spec/lib/datadog_spec.rb index 47788d7e..70c5183c 100644 --- a/spec/lib/datadog_spec.rb +++ b/spec/lib/datadog_spec.rb @@ -6,40 +6,101 @@ let(:app_name) { 'datadog' } describe 'initialize' do - it 'fetches configuration if already saved' do + it 'initialize datadog client if already saved' do config = create(:saml_app_config, organisation: org) - saml_app = Datadog.new(org.id) - expect(saml_app.config).to eq(config) + expect(DataDogClient).to receive(:new).with( + config.config['app_key'], config.config['api_key'] + ) + Datadog.new(org.id) end + end + + describe 'save_config' do + let(:config) { build(:saml_app_config, organisation: org) } + let(:saml_app) { Datadog.new(org.id) } - it 'initializes configuration if not created' do - saml_app = Datadog.new(org.id) - expect(saml_app.config.persisted?).to eq(false) + it 'should update the configuration of the application' do + saml_app.save_config(config.sso_url, config.config) + expect(saml_app.config.config).to eq(config.config) + end + + it 'should call the parent class to update url and initialize group for the app' do + expect_any_instance_of(SamlApp). + to receive(:save_config).with( + config.sso_url, + config.config + ) + saml_app.save_config(config.sso_url, config.config) end end - describe 'save_config' do - let(:url) { Faker::Internet.url } - let(:app_key) { Faker::Internet.password(8) } - let(:api_key) { Faker::Internet.password(8) } - it 'creates group if configuration isn\'t initialized' do - saml_app = Datadog.new(org.id) - saml_app.save_config(url, app_key: app_key, api_key: api_key) - expect(saml_app.config.group.name).to eq('saml_datadog_users') - expect(saml_app.config.persisted?).to eq(true) - expect(saml_app.config.config['app_key']).to eq(app_key) - expect(saml_app.config.config['api_key']).to eq(api_key) - expect(saml_app.config.sso_url).to eq(url) - end - - it 'saves the configuration for the application' do - config = create(:saml_app_config, organisation: org) - saml_app = Datadog.new(org.id) - saml_app.save_config(url, app_key: app_key, api_key: api_key) - expect(saml_app.config.id).to eq(config.id) - expect(saml_app.config.config['app_key']).to eq(app_key) - expect(saml_app.config.config['api_key']).to eq(api_key) - expect(saml_app.config.sso_url).to eq(url) + describe 'add_user' do + let(:email) { Faker::Internet.email } + let(:saml_app) { Datadog.new(org.id) } + + before do + create(:saml_app_config, organisation: org) + end + + it 'adds a user when a user doesn\'t exist' do + allow_any_instance_of(DataDogClient). + to receive(:get_user).and_return({}) + expect_any_instance_of(DataDogClient).to receive(:new_user) + saml_app.add_user(email) + end + + it 'activates a user when a user exists' do + allow_any_instance_of(DataDogClient). + to receive(:get_user).and_return(handle: email) + expect_any_instance_of(DataDogClient).to receive(:activate_user) + saml_app.add_user(email) + end + + it 'calls the parent class to add user to a group for a valid response' do + allow_any_instance_of(DataDogClient). + to receive(:get_user).and_return(handle: email) + allow_any_instance_of(DataDogClient).to receive(:activate_user).and_return(handle: email) + expect_any_instance_of(SamlApp).to receive(:add_user). + with(email) + saml_app.add_user(email) + end + + it 'doesn\'t call the parent class to add user to a group for a invalid response' do + allow_any_instance_of(DataDogClient). + to receive(:get_user).and_return(handle: email) + allow_any_instance_of(DataDogClient).to receive(:activate_user).and_return({}) + expect_any_instance_of(SamlApp).not_to receive(:add_user). + with(email) + saml_app.add_user(email) + end + end + + describe 'remove_user' do + let(:email) { Faker::Internet.email } + let(:saml_app) { Datadog.new(org.id) } + + before do + create(:saml_app_config, organisation: org) + end + + it 'deactivates a user for a valid email address' do + expect_any_instance_of(DataDogClient). + to receive(:deactivate_user) + saml_app.remove_user(email) + end + + it 'call the parent class to remove user from group for valid email' do + allow_any_instance_of(DataDogClient). + to receive(:deactivate_user).and_return(handle: email) + expect_any_instance_of(SamlApp).to receive(:remove_user) + saml_app.remove_user(email) + end + + it 'not call the parent class to remove user from group for valid email' do + allow_any_instance_of(DataDogClient). + to receive(:deactivate_user).and_return({}) + expect_any_instance_of(SamlApp).not_to receive(:remove_user) + saml_app.remove_user(email) end end end diff --git a/spec/lib/saml_app_spec.rb b/spec/lib/saml_app_spec.rb new file mode 100644 index 00000000..f7f48ad8 --- /dev/null +++ b/spec/lib/saml_app_spec.rb @@ -0,0 +1,86 @@ +require 'rails_helper' + +RSpec.describe Datadog do + + let(:org) { create(:organisation) } + let(:app_name) { 'datadog' } + let(:user) { create(:user) } + + describe 'initialize' do + it 'fetches configuration if already saved' do + config = create(:saml_app_config, organisation: org) + saml_app = Datadog.new(org.id) + expect(saml_app.config).to eq(config) + end + + it 'initializes configuration if not created' do + saml_app = Datadog.new(org.id) + expect(saml_app.config.persisted?).to eq(false) + end + end + + describe 'save_config' do + let(:config) { build(:saml_app_config, organisation: org) } + let(:saml_app) { Datadog.new(org.id) } + + it 'update the url' do + saml_app.save_config(config.sso_url, config.config) + expect(saml_app.config.sso_url).to eq(config.sso_url) + end + + it 'create a group if a group doesn\'t exist' do + org_name = "#{org.slug}_saml_#{saml_app.app_name}_users" + expect(Group).to receive(:find_or_create_by). + with(name: org_name) + saml_app.save_config(config.sso_url, config.config) + end + + it 'creates a group name with slug_saml_app_name_users' do + org_name = "#{org.slug}_saml_#{saml_app.app_name}_users" + saml_app.save_config(config.sso_url, config.config) + expect(saml_app.config.group.name).to eq(org_name) + end + end + + describe 'add_user' do + let(:saml_app) { Datadog.new(org.id) } + + before do + create( + :saml_app_config, + organisation: org, + group: Group.new(name: "#{org.slug}_saml_datadog_users") + ) + allow_any_instance_of(DataDogClient). + to receive(:get_user).and_return(handle: user.email) + allow_any_instance_of(DataDogClient). + to receive(:activate_user).and_return(handle: user.email) + end + + it 'add user to the group' do + expect_any_instance_of(Group). + to receive(:add_user).with(user.id) + saml_app.add_user(user.email) + end + end + + describe 'remove_user' do + let(:saml_app) { Datadog.new(org.id) } + + before do + create( + :saml_app_config, + organisation: org, + group: Group.new(name: "#{org.slug}_saml_datadog_users") + ) + allow_any_instance_of(DataDogClient). + to receive(:deactivate_user).and_return(handle: user.email) + end + + it 'remove user from the group' do + expect_any_instance_of(Group). + to receive(:remove_user).with(user.id) + saml_app.remove_user(user.email) + end + end +end From 02f42e856e3891ed1b7967d5606aa5ae812a25e3 Mon Sep 17 00:00:00 2001 From: Siddarth R Date: Wed, 24 Oct 2018 04:21:37 +0530 Subject: [PATCH 6/8] Modified .travis file to support mysql json support --- .travis.yml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c0f6f84e..d5aa72dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,13 @@ rvm: services: - redis-server - mysql +addons: + apt: + sources: + - mysql-5.7-trusty + packages: + - mysql-server + - mysql-client env: global: - GATE_OAUTH_CLIENT_ID=totally_secret_client_id @@ -27,11 +34,14 @@ env: - COMMIT=${TRAVIS_COMMIT::8} - DOCKER_COMPOSE_VERSION=1.11.2 before_install: + - sudo mysql -e "use mysql; update user set authentication_string=PASSWORD('LlmZctqmhudM') where User='root'; update user set plugin='mysql_native_password';FLUSH PRIVILEGES;" + - sudo mysql_upgrade -u root -pLlmZctqmhudM + - sudo service mysql restart - mysql -e 'CREATE DATABASE IF NOT EXISTS gate_test;' - gem install bundler script: - bundle package --all - - bundle install --binstubs --local + - bundle install --binstubs --local - bundle exec rake db:migrate - bundle exec rake spec - bundle exec rake assets:precompile RAILS_ENV=production @@ -48,7 +58,7 @@ deploy: skip_cleanup: true api_key: secure: VWDGnrtrECoeJBATfe71HdpvnD15IKTkHWq/cQDfo9FTrm005ngTusQpW0eim76tSTMcJ1OBLoE9aAkd4Szi00TWenNPaAWHtgodcvNXxjqyZEtznRmtZW/vSk2H+iwJxJZoPDMZqStjmmSoD0dA1t2GLGltFzeJ5Y409YeroLUsVdRcTJY0mvQYbuLt1aZCu76gY5nB01yH7ib4ykZllJQbkyX57TKBYSLoQVUQ3hqo9BLUoROknHSfFGBHjSN9D3zIqKoh0XDOuTnyMHB+zMGmjjJbHMx5Z2eW1NW1HvpqDUOPl8uRnUEoCCfujA7OUlGgdadRBeUJObzpNkpQUNLEh5zIIr9NAZzjunzYkMiMZIseTNflJ6HOajld2Bcgz3PcbzM8hcIFog5loE7CBLWEzDoOIY/B75NYuHPIzRzTbgw7jf8XdfypCNMm0RLWiCXiDmuDMcNPZT9NrrheNGFz1CDmWkwpJmUTIv8J13J2Ux9ex1NY9iSRD8rgJ+bLOfp/u1nJWjACki8zq2/vffm2oUWz/R7q23Keq5Itddpe3mJUyFjokTUZPNSAlC45rF+rgK4ka7yJb+ZZAOaq/N8iIfVkgnfviWtaPQzAWRkO8J8Wzt1GrfQpNlo2BMM6Cpy0iV9ANYqAVYerImAopMWlzQmjbtt8P+xmmYA0FIw= - file_glob: true + file_glob: true file: $TRAVIS_BUILD_DIR/*.tar.gz on: repo: gate-sso/gate From f9b151a0dce49ae376538a17bdd7ad4b219c0687 Mon Sep 17 00:00:00 2001 From: Siddarth R Date: Wed, 24 Oct 2018 04:21:37 +0530 Subject: [PATCH 7/8] Modified .travis file to support mysql json support --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index d5aa72dc..fca06d52 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,8 +34,7 @@ env: - COMMIT=${TRAVIS_COMMIT::8} - DOCKER_COMPOSE_VERSION=1.11.2 before_install: - - sudo mysql -e "use mysql; update user set authentication_string=PASSWORD('LlmZctqmhudM') where User='root'; update user set plugin='mysql_native_password';FLUSH PRIVILEGES;" - - sudo mysql_upgrade -u root -pLlmZctqmhudM + - sudo mysql_upgrade -u root - sudo service mysql restart - mysql -e 'CREATE DATABASE IF NOT EXISTS gate_test;' - gem install bundler From ec8f47f3682df75d8d4ff40641504c7aecafcf21 Mon Sep 17 00:00:00 2001 From: Siddarth R Date: Wed, 24 Oct 2018 04:21:37 +0530 Subject: [PATCH 8/8] Modified .travis file to support mysql json support --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index fca06d52..8b66a1a7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,6 +28,7 @@ env: - GATE_DB_PORT=3306 - GATE_DB_USER=root - GATE_DB_PASSWORD= + - SAML_APPS="datadog" - secure: Q2/gUeT/Y6IUKsRzgiiE6HGxLcHAzTtVCv6+6TcQnpJL9+HEO06+ISwekNXHRe/2BNMiWzDG5ufqo2YpA1j9h8899KAJZRYDULbbV0o8nrpT2kZSac1ZejBVYb/SrhDk8wrnQxQ061o6SdKpFEEwbIiJDzaqeQkv4tkyw3dEOq6+FRGS/QXj3mPIIArPbNCOtwcvnmg0mGIuPAAxuRZmz4Tuk2F6JdR4LrZstf33mvUYqbTw02Kl7UoErFjGSx2Ti+JPYIVDJ6D8pNCjv5va3awJskcXE5bj0evR5+OiP69GK6T2/UbP+QKwN2J36Pb9RxBKGuEkBTNuduch+h+RMiYk0A8MDO3Sy47i2v8Oj1xTEYqsNm0scmD2utZ93/VqPipYTrxuos7gbC4mdiW3dcMzyrhgaULEJlvalKaSQV41Xex8h/V7NCRvpoYjnyuWVUMQFgGSnE25Xpt1LvP3epcxlEBA9LcndskbEHaWup8mCD2bp+2Zq10iWi/hNnR2IBrj61fApTWBSoNplJMsMZNb3bverQVFFG79Gfr320HWk+eJVahZNFwUYp9VYn17r38nMRdfP9B85hm2ZUEiokzOvEXEKoSa2QVlCNQHk4HGJmfykPn4L8kDnS6LhYV3Yxugxwsl//1iUOwv4+ARMGn/rs13BDOixWXc+GVZIvk= - secure: hTSsv54GMEfKuZfk5UL3cekNK4ZgEEWwTp2cbfN39ViWBbq4xtXok1jREx4QyhwkNak47ewHuY0rifxPEYkJVJfj+tA/xiGs9BOG73gNEtQYhXXN/ZodXF0Kq3pYOfcVWDDo7oMAUoohkohHK2TA+KY3mfk5sFbxbXHOlNdSn0vXDSa8MgzALoN6+w1oWkC41perODfNS4EYD3gdhwDg4x6QHrmakrt0oOP4PPMCpOWinvkzWq7lBDdhkPSze47BwGilyUDFSJnunSKip88s6DlP4gNj6YYBiT6xGTPLuR76tgEPma9rp25zGvLxH9LsluMXTNuN0L3/6FzVyv0kJgXIwQrpgreQ+B45q3mT6iNom0alyNk3fYDKU59azpH9G0rC0zflmOhW+jssgwyJN08rJN8rFkhpQreD4dgey7+UDjf7qF3rOd0kXmqBvA/3z/aF8Mla/2+EIb1DjyHwnjAcPF2E0/97Gv2eGpZR/PPrQIVN2m8vEe3ce/39c4S/l9OU0G4Dqz9HMqIBG+0qFdS24+egbjaIoOQzO/eJwG/eew4ncvaz/ES8qCDtvFNeKR+QnfxcbJysybrxDNTqt3cBGTeotIdZxIB3rYK63+s+dvzggm09vBMafoP7zyWzD0xjSES7m+Gv9V8Jlvc7h5JSWrkmAgLmgnqt7FpI7hs= - secure: KtmItMzRHfZEPS54hTnYXNAWsqxCZZMtmxamJPcr2SVP+pzM/25eEF3M2b0JZECFRtW3xPBGita+4BjH8IY4NljH0IDVhPPKQsMHaVKtaqEeiTCRXCqkJd0DMUDeqyRcccwPDJSy9HeZns6E+zQDCGaC/tmFwDUWy5BYpairWd7sdw436iOeTmQ2fJ8SQ9lBr9LGpk8NwDmkYqg14fnOraIhw70tiWv9Wn82mEv+OwY4iKphOv2ZXEBeJYitoT1LQmhnaVvNvax16TYIY3Mxh89Oy2gVkKCgvbR9q1NmAIiWmMTyCLWxF0bd6A6Q+dHDDaQZF0pDsQqe83rnoA0xuaJUF9dh+ahvW0bn0aVFIa8tWgiBEMXWxHEDuEyfCWFis9vf3uj1xJl0SV0ktE5oIRzaF/0cTQorAwRy0UpN1HxK1yB9aITCad/BJ9ERK8MXYnfzC65jn2zHuQMjBz9Aeig4sgLc4IgtGM2DzabsIkhYG3ygL1TYaXXSj5Mo2KDwOuaZ46C7B6qxlzcesPmSnM3KF1CBatRZQK5tjsMm5GnxXKKtqg/udGtOA2fELlNolFsojtpmO4A79TAnebRUpEsU2vP0da1x7yTD5+2NWg6dnvq7tA3c5b8qBK2cAMnCHS0gmjaN3RYeFhLYO55dHDdmx/DNyQQ1V/YEkuisy80=