diff --git a/app/routes/settings.coffee b/app/routes/settings.coffee index 33d63f16..76889e85 100644 --- a/app/routes/settings.coffee +++ b/app/routes/settings.coffee @@ -42,12 +42,31 @@ Route = TravisRoute.extend response.active ); + hasPushAccess: -> + repoId = parseInt @modelFor('repo').get('id') + pushAccess = true + + Ajax.get '/users/permissions', (data) => + + admin = data.admin.filter (item) -> + return item == repoId + push = data.push.filter (item) -> + return item == repoId + pull = data.pull.filter (item) -> + return item == repoId + + if Ember.isEmpty admin && Ember.isEmpty push && !Ember.isEmpty pull + pushAccess = false + + pushAccess + model: () -> return Ember.RSVP.hash({ settings: @modelFor('repo').fetchSettings(), envVars: this.fetchEnvVars(), sshKey: this.fetchSshKey(), customSshKey: this.fetchCustomSshKey(), + hasPushAccess: this.hasPushAccess(), repositoryActive: this.fetchRepositoryActiveFlag() }); diff --git a/app/styles/app/layouts/requests.sass b/app/styles/app/layouts/requests.sass index 74108110..ac331376 100644 --- a/app/styles/app/layouts/requests.sass +++ b/app/styles/app/layouts/requests.sass @@ -34,7 +34,7 @@ .requests-time @media #{$medium-up} padding-left: 2em - border-left: 1px solid $grey-lighter + border-left: 1px solid $cream-dark .tile--jobs padding-left: 2.5em diff --git a/app/templates/components/ssh-key.hbs b/app/templates/components/ssh-key.hbs index 91b8cadf..6120f9aa 100644 --- a/app/templates/components/ssh-key.hbs +++ b/app/templates/components/ssh-key.hbs @@ -11,12 +11,19 @@ {{#if isDeleting}} {{loading-indicator}} {{else}} -
- - - -
Delete
-
+ {{#if pushAccess}} +
+ + + +
Delete
+
+ {{else}} +
+ +
You can't
delete keys
+
+ {{/if}} {{/if}} {{else}} diff --git a/app/templates/settings.hbs b/app/templates/settings.hbs index 0fdaecb0..60e25c6d 100644 --- a/app/templates/settings.hbs +++ b/app/templates/settings.hbs @@ -30,12 +30,19 @@

SSH Key

{{#if model.customSshKey}} - {{ssh-key key=model.customSshKey sshKeyDeleted="sshKeyDeleted"}} + {{ssh-key key=model.customSshKey sshKeyDeleted="sshKeyDeleted" pushAccess=model.hasPushAccess}} {{else}} {{ssh-key key=model.sshKey}} - {{add-ssh-key repo=repo sshKeyAdded="sshKeyAdded"}} + + {{#if model.hasPushAccess}} + {{add-ssh-key repo=repo sshKeyAdded="sshKeyAdded"}} + {{/if}} {{/if}} + {{#unless model.hasPushAccess}} +

You don't have sufficient permissons to add or remove ssh keys on this repository.

+ {{/unless}} + {{/if}} {{!--
diff --git a/tests/integration/components/ssh-key-test.js b/tests/integration/components/ssh-key-test.js index 0844f31b..ebdf5390 100644 --- a/tests/integration/components/ssh-key-test.js +++ b/tests/integration/components/ssh-key-test.js @@ -41,7 +41,7 @@ test('it renders the custom ssh key if custom key is set', function(assert) { }); -test('it deletes a custom key', function(assert) { +test('it deletes a custom key if permissions are right', function(assert) { assert.expect(1); var store = this.container.lookup('store:main'); @@ -52,7 +52,7 @@ test('it deletes a custom key', function(assert) { }); this.set('key', key); - this.render(hbs`{{ssh-key key=key sshKeyDeleted="sshKeyDeleted"}}`); + this.render(hbs`{{ssh-key key=key sshKeyDeleted="sshKeyDeleted" pushAccess=true}}`); this.on('sshKeyDeleted', function() {}); this.$('.ssh-key-action a').click(); @@ -60,3 +60,20 @@ test('it deletes a custom key', function(assert) { assert.ok(key.get('isDeleted'), 'key should be deleted'); }); + +test('it does not delete the custom key if permissions are insufficient', function(assert) { + assert.expect(1); + + var store = this.container.lookup('store:main'); + + var key; + Ember.run(function() { + key = store.push('sshKey', {description: 'fookey', fingerprint: 'somethingthing', id: 1}); + }); + + this.set('key', key); + this.render(hbs`{{ssh-key key=key sshKeyDeleted="sshKeyDeleted" pushAccess=false}}`); + + assert.ok(Ember.isEmpty(this.$('.ssh-key-action').find('a')), 'delete link should not be displayed'); + +}); \ No newline at end of file