Skip to content

Commit 5fa3962

Browse files
committed
Check if user can add to existing project during create from url
Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1530162
1 parent 16b8809 commit 5fa3962

File tree

4 files changed

+124
-56
lines changed

4 files changed

+124
-56
lines changed

app/scripts/controllers/createFromURL.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Controller of the openshiftConsole
88
*/
99
angular.module('openshiftConsole')
10-
.controller('CreateFromURLController', function ($scope, $routeParams, $location, $filter, AuthService, DataService, Navigate, ProjectsService ) {
10+
.controller('CreateFromURLController', function ($scope, $routeParams, $location, $filter, AuthService, AuthorizationService, DataService, Navigate, ProjectsService ) {
1111
AuthService.withUser();
1212

1313
$scope.alerts = {};
@@ -174,4 +174,18 @@ angular.module('openshiftConsole')
174174
$scope.canCreateProject = false;
175175
});
176176

177+
$scope.forms = {};
178+
// assume the user can add to project by default
179+
$scope.canIAddToProject = true;
180+
181+
$scope.canIAddToSelectedProject = function(selectedProject) {
182+
var selectedProjectName = _.get(selectedProject, 'metadata.name');
183+
AuthorizationService.getProjectRules(selectedProjectName).then(function() {
184+
$scope.canIAddToProject = AuthorizationService.canIAddToProject(selectedProjectName);
185+
if($scope.forms) {
186+
$scope.forms.selectProjectForm.selectProject.$setValidity('cannotAddToProject', $scope.canIAddToProject);
187+
}
188+
});
189+
};
190+
177191
});

app/views/create-from-url.html

+51-24
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,9 @@ <h2>Create a New Project</h2>
1515
</div>
1616
<div ng-if="!noProjects && !canCreateProject">
1717
<h2>Choose a Project</h2>
18-
<ui-select ng-model="selected.project">
19-
<ui-select-match placeholder="Project name">
20-
{{$select.selected | displayName}}
21-
</ui-select-match>
22-
<ui-select-choices repeat="project in projects | searchProjects : $select.search">
23-
<span ng-bind-html="project | displayName | highlightKeywords : $select.search"></span>
24-
<span ng-if="project | displayName : true" class="small text-muted">
25-
&ndash;
26-
<span ng-bind-html="project.metadata.name | highlightKeywords : $select.search"></span>
27-
</span>
28-
</ui-select-choices>
29-
</ui-select>
30-
</div>
31-
<div ng-if="!noProjects && canCreateProject">
32-
<uib-tabset>
33-
<uib-tab>
34-
<uib-tab-heading>Choose Existing Project</uib-tab-heading>
35-
<ui-select ng-model="selected.project">
18+
<form name="forms.selectProjectForm">
19+
<div class="form-group" ng-class="{'has-error': forms.selectProjectForm.selectProject.$error.cannotAddToProject}">
20+
<ui-select ng-model="selected.project" name="selectProject" on-select="canIAddToSelectedProject($item)">
3621
<ui-select-match placeholder="Project name">
3722
{{$select.selected | displayName}}
3823
</ui-select-match>
@@ -44,15 +29,57 @@ <h2>Choose a Project</h2>
4429
</span>
4530
</ui-select-choices>
4631
</ui-select>
32+
<div ng-if="forms.selectProjectForm.selectProject.$error.cannotAddToProject">
33+
<span class="help-block">
34+
You are not authorized to add to this project.
35+
</span>
36+
</div>
4737
<div class="button-group mar-bottom-lg mar-top-lg">
4838
<button
49-
type="submit"
50-
class="btn btn-primary btn-lg"
51-
ng-click="createWithProject()"
52-
ng-disabled="!(selected.project)"
53-
value="">Next</button>
54-
<a class="btn btn-default btn-lg" href="#" back>Cancel</a>
39+
type="submit"
40+
class="btn btn-primary"
41+
ng-click="createWithProject()"
42+
ng-disabled="!(selected.project) || !canIAddToProject"
43+
value="">Next</button>
44+
<a class="btn btn-default" href="#" back>Cancel</a>
5545
</div>
46+
</div>
47+
</form>
48+
</div>
49+
<div ng-if="!noProjects && canCreateProject">
50+
<uib-tabset>
51+
<uib-tab>
52+
<uib-tab-heading>Choose Existing Project</uib-tab-heading>
53+
<form name="forms.selectProjectForm">
54+
<div class="form-group" ng-class="{'has-error': forms.selectProjectForm.selectProject.$error.cannotAddToProject}">
55+
<ui-select ng-model="selected.project" name="selectProject" on-select="canIAddToSelectedProject($item)">
56+
<ui-select-match placeholder="Project name">
57+
{{$select.selected | displayName}}
58+
</ui-select-match>
59+
<ui-select-choices repeat="project in projects | searchProjects : $select.search">
60+
<span ng-bind-html="project | displayName | highlightKeywords : $select.search"></span>
61+
<span ng-if="project | displayName : true" class="small text-muted">
62+
&ndash;
63+
<span ng-bind-html="project.metadata.name | highlightKeywords : $select.search"></span>
64+
</span>
65+
</ui-select-choices>
66+
</ui-select>
67+
<div ng-if="forms.selectProjectForm.selectProject.$error.cannotAddToProject">
68+
<span class="help-block">
69+
You are not authorized to add to this project.
70+
</span>
71+
</div>
72+
<div class="button-group mar-bottom-lg mar-top-lg">
73+
<button
74+
type="submit"
75+
class="btn btn-primary"
76+
ng-click="createWithProject()"
77+
ng-disabled="!(selected.project) || !canIAddToProject"
78+
value="">Next</button>
79+
<a class="btn btn-default" href="#" back>Cancel</a>
80+
</div>
81+
</div>
82+
</form>
5683
</uib-tab>
5784
<uib-tab>
5885
<uib-tab-heading>Create a New Project</uib-tab-heading>

dist/scripts/scripts.js

+32-27
Original file line numberDiff line numberDiff line change
@@ -8403,24 +8403,24 @@ partialObjectMetadataList: !0
84038403
e.projectTemplates = t.by("metadata.name");
84048404
}));
84058405
}));
8406-
} ]), angular.module("openshiftConsole").controller("CreateFromURLController", [ "$scope", "$routeParams", "$location", "$filter", "AuthService", "DataService", "Navigate", "ProjectsService", function(e, t, n, r, a, o, i, s) {
8406+
} ]), angular.module("openshiftConsole").controller("CreateFromURLController", [ "$scope", "$routeParams", "$location", "$filter", "AuthService", "AuthorizationService", "DataService", "Navigate", "ProjectsService", function(e, t, n, r, a, o, i, s, c) {
84078407
a.withUser(), e.alerts = {}, e.selected = {};
8408-
var c = function(t) {
8408+
var l = function(t) {
84098409
e.alerts.invalidImageStream = {
84108410
type: "error",
84118411
message: 'The requested image stream "' + t + '" could not be loaded.'
84128412
};
8413-
}, l = function(t) {
8413+
}, u = function(t) {
84148414
e.alerts.invalidImageTag = {
84158415
type: "error",
84168416
message: 'The requested image stream tag "' + t + '" could not be loaded.'
84178417
};
8418-
}, u = function(t) {
8418+
}, d = function(t) {
84198419
e.alerts.invalidTemplate = {
84208420
type: "error",
84218421
message: 'The requested template "' + t + '" could not be loaded.'
84228422
};
8423-
}, d = function() {
8423+
}, m = function() {
84248424
try {
84258425
return t.templateParamsMap && JSON.parse(t.templateParamsMap) || {};
84268426
} catch (t) {
@@ -8429,44 +8429,44 @@ type: "error",
84298429
message: "The templateParamsMap is not valid JSON. " + t
84308430
};
84318431
}
8432-
}, m = window.OPENSHIFT_CONSTANTS.CREATE_FROM_URL_WHITELIST, p = [ "namespace", "name", "imageStream", "imageTag", "sourceURI", "sourceRef", "contextDir", "template", "templateParamsMap" ], f = _.pickBy(t, function(e, t) {
8433-
return _.includes(p, t) && _.isString(e);
8432+
}, p = window.OPENSHIFT_CONSTANTS.CREATE_FROM_URL_WHITELIST, f = [ "namespace", "name", "imageStream", "imageTag", "sourceURI", "sourceRef", "contextDir", "template", "templateParamsMap" ], g = _.pickBy(t, function(e, t) {
8433+
return _.includes(f, t) && _.isString(e);
84348434
});
8435-
f.namespace = f.namespace || "openshift";
8436-
_.includes(m, f.namespace) ? f.imageStream && f.template ? e.alerts.invalidResource = {
8435+
g.namespace = g.namespace || "openshift";
8436+
_.includes(p, g.namespace) ? g.imageStream && g.template ? e.alerts.invalidResource = {
84378437
type: "error",
84388438
message: "Image streams and templates cannot be combined."
8439-
} : f.imageStream || f.template ? f.name && !function(e) {
8439+
} : g.imageStream || g.template ? g.name && !function(e) {
84408440
return _.size(e) < 25 && /^[a-z]([-a-z0-9]*[a-z0-9])?$/.test(e);
8441-
}(f.name) ? function(t) {
8441+
}(g.name) ? function(t) {
84428442
e.alerts.invalidImageStream = {
84438443
type: "error",
84448444
message: 'The app name "' + t + "\" is not valid. An app name is an alphanumeric (a-z, and 0-9) string with a maximum length of 24 characters, where the first character is a letter (a-z), and the '-' character is allowed anywhere except the first or last character."
84458445
};
8446-
}(f.name) : (f.imageStream && o.get("imagestreams", f.imageStream, {
8447-
namespace: f.namespace
8446+
}(g.name) : (g.imageStream && i.get("imagestreams", g.imageStream, {
8447+
namespace: g.namespace
84488448
}, {
84498449
errorNotification: !1
84508450
}).then(function(t) {
8451-
e.imageStream = t, o.get("imagestreamtags", t.metadata.name + ":" + f.imageTag, {
8452-
namespace: f.namespace
8451+
e.imageStream = t, i.get("imagestreamtags", t.metadata.name + ":" + g.imageTag, {
8452+
namespace: g.namespace
84538453
}, {
84548454
errorNotification: !1
84558455
}).then(function(t) {
8456-
e.imageStreamTag = t, e.validationPassed = !0, e.resource = t, f.displayName = r("displayName")(t);
8456+
e.imageStreamTag = t, e.validationPassed = !0, e.resource = t, g.displayName = r("displayName")(t);
84578457
}, function() {
8458-
l(f.imageTag);
8458+
u(g.imageTag);
84598459
});
84608460
}, function() {
8461-
c(f.imageStream);
8462-
}), f.template && o.get("templates", f.template, {
8463-
namespace: f.namespace
8461+
l(g.imageStream);
8462+
}), g.template && i.get("templates", g.template, {
8463+
namespace: g.namespace
84648464
}, {
84658465
errorNotification: !1
84668466
}).then(function(t) {
8467-
e.template = t, d() && (e.validationPassed = !0, e.resource = t);
8467+
e.template = t, m() && (e.validationPassed = !0, e.resource = t);
84688468
}, function() {
8469-
u(f.template);
8469+
d(g.template);
84708470
})) : e.alerts.resourceRequired = {
84718471
type: "error",
84728472
message: "An image stream or template is required."
@@ -8475,20 +8475,25 @@ e.alerts.invalidNamespace = {
84758475
type: "error",
84768476
message: 'Resources from the namespace "' + t + '" are not permitted.'
84778477
};
8478-
}(f.namespace), angular.extend(e, {
8479-
createDetails: f,
8478+
}(g.namespace), angular.extend(e, {
8479+
createDetails: g,
84808480
createWithProject: function(r) {
84818481
r = r || e.selected.project.metadata.name;
8482-
var a = t.imageStream ? i.createFromImageURL(e.imageStream, f.imageTag, r, f) : i.createFromTemplateURL(e.template, r, f);
8482+
var a = t.imageStream ? s.createFromImageURL(e.imageStream, g.imageTag, r, g) : s.createFromTemplateURL(e.template, r, g);
84838483
n.url(a);
84848484
}
8485-
}), e.projects = {}, e.canCreateProject = void 0, s.list().then(function(t) {
8485+
}), e.projects = {}, e.canCreateProject = void 0, c.list().then(function(t) {
84868486
e.loaded = !0, e.projects = r("orderByDisplayName")(t.by("metadata.name")), e.noProjects = _.isEmpty(e.projects);
8487-
}), s.canCreate().then(function() {
8487+
}), c.canCreate().then(function() {
84888488
e.canCreateProject = !0;
84898489
}, function() {
84908490
e.canCreateProject = !1;
8491+
}), e.forms = {}, e.canIAddToProject = !0, e.canIAddToSelectedProject = function(t) {
8492+
var n = _.get(t, "metadata.name");
8493+
o.getProjectRules(n).then(function() {
8494+
e.canIAddToProject = o.canIAddToProject(n), e.forms && e.forms.selectProjectForm.selectProject.$setValidity("cannotAddToProject", e.canIAddToProject);
84918495
});
8496+
};
84928497
} ]), angular.module("openshiftConsole").controller("CreateProjectController", [ "$scope", "$location", "$window", "AuthService", "Constants", function(e, t, n, r, a) {
84938498
var o = !a.DISABLE_SERVICE_CATALOG_LANDING_PAGE;
84948499
e.onProjectCreated = function(e) {

dist/scripts/templates.js

+26-4
Original file line numberDiff line numberDiff line change
@@ -4554,7 +4554,9 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
45544554
"</div>\n" +
45554555
"<div ng-if=\"!noProjects && !canCreateProject\">\n" +
45564556
"<h2>Choose a Project</h2>\n" +
4557-
"<ui-select ng-model=\"selected.project\">\n" +
4557+
"<form name=\"forms.selectProjectForm\">\n" +
4558+
"<div class=\"form-group\" ng-class=\"{'has-error': forms.selectProjectForm.selectProject.$error.cannotAddToProject}\">\n" +
4559+
"<ui-select ng-model=\"selected.project\" name=\"selectProject\" on-select=\"canIAddToSelectedProject($item)\">\n" +
45584560
"<ui-select-match placeholder=\"Project name\">\n" +
45594561
"{{$select.selected | displayName}}\n" +
45604562
"</ui-select-match>\n" +
@@ -4566,12 +4568,25 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
45664568
"</span>\n" +
45674569
"</ui-select-choices>\n" +
45684570
"</ui-select>\n" +
4571+
"<div ng-if=\"forms.selectProjectForm.selectProject.$error.cannotAddToProject\">\n" +
4572+
"<span class=\"help-block\">\n" +
4573+
"You are not authorized to add to this project.\n" +
4574+
"</span>\n" +
4575+
"</div>\n" +
4576+
"<div class=\"button-group mar-bottom-lg mar-top-lg\">\n" +
4577+
"<button type=\"submit\" class=\"btn btn-primary\" ng-click=\"createWithProject()\" ng-disabled=\"!(selected.project) || !canIAddToProject\" value=\"\">Next</button>\n" +
4578+
"<a class=\"btn btn-default\" href=\"#\" back>Cancel</a>\n" +
4579+
"</div>\n" +
4580+
"</div>\n" +
4581+
"</form>\n" +
45694582
"</div>\n" +
45704583
"<div ng-if=\"!noProjects && canCreateProject\">\n" +
45714584
"<uib-tabset>\n" +
45724585
"<uib-tab>\n" +
45734586
"<uib-tab-heading>Choose Existing Project</uib-tab-heading>\n" +
4574-
"<ui-select ng-model=\"selected.project\">\n" +
4587+
"<form name=\"forms.selectProjectForm\">\n" +
4588+
"<div class=\"form-group\" ng-class=\"{'has-error': forms.selectProjectForm.selectProject.$error.cannotAddToProject}\">\n" +
4589+
"<ui-select ng-model=\"selected.project\" name=\"selectProject\" on-select=\"canIAddToSelectedProject($item)\">\n" +
45754590
"<ui-select-match placeholder=\"Project name\">\n" +
45764591
"{{$select.selected | displayName}}\n" +
45774592
"</ui-select-match>\n" +
@@ -4583,10 +4598,17 @@ angular.module('openshiftConsoleTemplates', []).run(['$templateCache', function(
45834598
"</span>\n" +
45844599
"</ui-select-choices>\n" +
45854600
"</ui-select>\n" +
4601+
"<div ng-if=\"forms.selectProjectForm.selectProject.$error.cannotAddToProject\">\n" +
4602+
"<span class=\"help-block\">\n" +
4603+
"You are not authorized to add to this project.\n" +
4604+
"</span>\n" +
4605+
"</div>\n" +
45864606
"<div class=\"button-group mar-bottom-lg mar-top-lg\">\n" +
4587-
"<button type=\"submit\" class=\"btn btn-primary btn-lg\" ng-click=\"createWithProject()\" ng-disabled=\"!(selected.project)\" value=\"\">Next</button>\n" +
4588-
"<a class=\"btn btn-default btn-lg\" href=\"#\" back>Cancel</a>\n" +
4607+
"<button type=\"submit\" class=\"btn btn-primary\" ng-click=\"createWithProject()\" ng-disabled=\"!(selected.project) || !canIAddToProject\" value=\"\">Next</button>\n" +
4608+
"<a class=\"btn btn-default\" href=\"#\" back>Cancel</a>\n" +
4609+
"</div>\n" +
45894610
"</div>\n" +
4611+
"</form>\n" +
45904612
"</uib-tab>\n" +
45914613
"<uib-tab>\n" +
45924614
"<uib-tab-heading>Create a New Project</uib-tab-heading>\n" +

0 commit comments

Comments
 (0)