conjur-asset-ui 1.3.1 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -3
  3. data/Gemfile +1 -3
  4. data/README.md +0 -34
  5. data/Rakefile +1 -69
  6. data/conjur-asset-ui.gemspec +1 -1
  7. data/lib/conjur-asset-ui-version.rb +1 -1
  8. data/lib/conjur/command/ui.rb +1 -1
  9. data/lib/conjur/webserver/server.rb +8 -14
  10. data/public/_client_code.html +42 -0
  11. data/public/_client_libs.html +15 -2
  12. data/public/css/bootstrap.css +7 -0
  13. data/public/css/styles.less +4 -170
  14. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  15. data/public/fonts/glyphicons-halflings-regular.svg +229 -0
  16. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  17. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  18. data/public/index.html.erb +7 -5
  19. data/public/js/init.js +97 -183
  20. data/public/js/lib/JSXTransformer.js +10862 -0
  21. data/public/js/lib/async.js +958 -0
  22. data/public/js/lib/backbone.js +2 -0
  23. data/public/js/lib/bootstrap.js +6 -0
  24. data/public/js/lib/less.js +16 -0
  25. data/public/js/lib/moment.js +7768 -0
  26. data/public/js/lib/react-bootstrap.js +5346 -0
  27. data/public/js/lib/react-bootstrap.min.js +4 -0
  28. data/public/js/lib/sorted-set.no-require.js +28 -3
  29. data/public/js/lib/underscore-min.js +6 -0
  30. data/public/js/lib/underscore.string.min.js +1 -0
  31. data/public/js/main.js +57 -0
  32. data/public/js/models/groupRecord.js +11 -12
  33. data/public/js/models/hostRecord.js +7 -6
  34. data/public/js/models/layerRecord.js +11 -12
  35. data/public/js/models/namespace.js +0 -2
  36. data/public/js/models/policyList.js +1 -3
  37. data/public/js/models/policyRecord.js +7 -6
  38. data/public/js/models/record.js +23 -24
  39. data/public/js/models/resourceList.js +10 -28
  40. data/public/js/models/userList.js +2 -7
  41. data/public/js/models/userRecord.js +8 -7
  42. data/public/js/models/variableList.js +7 -18
  43. data/public/js/models/variableRecord.js +12 -13
  44. data/public/js/routers.js +26 -72
  45. data/public/js/views/annotations.js +27 -38
  46. data/public/js/views/audit.js +17 -23
  47. data/public/js/views/dashboard.js +58 -94
  48. data/public/js/views/generic.js +9 -16
  49. data/public/js/views/group.js +55 -94
  50. data/public/js/views/groups.js +7 -3
  51. data/public/js/views/host.js +44 -75
  52. data/public/js/views/hosts.js +6 -2
  53. data/public/js/views/layer.js +82 -127
  54. data/public/js/views/layers.js +6 -2
  55. data/public/js/views/mixins/search.js +5 -12
  56. data/public/js/views/mixins/tabs.js +55 -95
  57. data/public/js/views/navSearch.js +5 -16
  58. data/public/js/views/owned.js +8 -14
  59. data/public/js/views/permissions.js +178 -244
  60. data/public/js/views/policies.js +4 -2
  61. data/public/js/views/policy.js +38 -65
  62. data/public/js/views/resource.js +34 -49
  63. data/public/js/views/role.js +37 -52
  64. data/public/js/views/searchResults.js +138 -205
  65. data/public/js/views/time.js +13 -26
  66. data/public/js/views/user.js +55 -178
  67. data/public/js/views/users.js +7 -2
  68. data/public/js/views/variable.js +45 -226
  69. data/public/js/views/variables.js +8 -4
  70. metadata +19 -18
  71. data/.jshintrc +0 -41
  72. data/bower.json +0 -93
  73. data/features/navigation_bar.feature +0 -31
  74. data/features/step_definitions/custom_step.rb +0 -32
  75. data/features/support/env.rb +0 -38
  76. data/features/support/hooks.rb +0 -30
  77. data/features/support/world.rb +0 -17
  78. data/gulpfile.js +0 -140
  79. data/package.json +0 -47
  80. data/preprocessor.js +0 -7
  81. data/public/js/views/chart.js +0 -471
@@ -1,29 +1,18 @@
1
1
  /** @jsx React.DOM */
2
- /* global conjur, React */
3
2
 
4
3
  (function(conjur, React) {
5
4
  'use strict';
6
5
 
7
- var Search = conjur.views.mixins.Search;
8
-
9
- this.NavSearchForm = React.createClass({
10
- mixins: [Search],
6
+ var NavSearchForm = this.NavSearchForm = React.createClass({
7
+ mixins: [conjur.views.mixins.Search],
11
8
 
12
9
  render: function() {
13
10
  return (
14
- <form className="form-inline navbar-form"
15
- role="search"
16
- onSubmit={this.handleSubmit}>
11
+ <form className="form-inline navbar-form" role="search" onSubmit={this.handleSubmit}>
17
12
  <div className="form-group">
18
- <input ref="input"
19
- type="text"
20
- className="form-control"
21
- placeholder="Search Conjur"></input>
13
+ <input ref="input" type="text" className="form-control" placeholder="Search Conjur"></input>
22
14
  </div>
23
- <button type="submit"
24
- className="btn btn-default search-button">
25
- Search
26
- </button>
15
+ <button type="submit" className="btn btn-default search-button">Search</button>
27
16
  </form>
28
17
  );
29
18
  }
@@ -1,7 +1,6 @@
1
1
  /** @jsx React.DOM */
2
- /* global conjur, React, _ */
3
2
 
4
- (function(conjur, React, _) {
3
+ (function(conjur, _, React) {
5
4
  'use strict';
6
5
 
7
6
  var knownTypes = ['user', 'group', 'layer', 'host', 'variable', 'policy'];
@@ -35,16 +34,11 @@
35
34
  return a.id.toLowerCase().localeCompare(b.id.toLowerCase());
36
35
  }).map(function(resource) {
37
36
  var kind = resource.id.split(':')[1];
38
-
39
37
  filters.push(kind);
40
38
 
41
- if ((this.state.filter === '') ||
42
- (this.state.filter !== 'other' && this.state.filter === kind) ||
43
- (this.state.filter === 'other' &&
44
- _.intersection([kind], knownTypes).length === 0)) {
45
-
46
- var ResourceLink = conjur.views.ResourceLink;
47
-
39
+ if ((this.state.filter === '')
40
+ || (this.state.filter != 'other' && this.state.filter === kind)
41
+ || (this.state.filter === 'other' && _.intersection([kind], knownTypes).length === 0)) {
48
42
  return (
49
43
  <li className="list-group-item list-group-item-noborder">
50
44
  <ResourceLink data={resource} />
@@ -67,7 +61,7 @@
67
61
 
68
62
  var filterSelect = '';
69
63
 
70
- if (this.props.resources.length > 9 || this.state.filter !== '') {
64
+ if (this.props.resources.length > 9 || this.state.filter != '') {
71
65
  // TODO: sort, when done with previous TODO
72
66
  filterSelect = _.intersection(_.uniq(filters, true), knownTypes).map(function(f) {
73
67
  return (
@@ -133,7 +127,7 @@
133
127
  }
134
128
  });
135
129
 
136
- this.OwnedResources = React.createClass({
130
+ var OwnedResources = this.OwnedResources = React.createClass({
137
131
  getInitialState: function() {
138
132
  return {
139
133
  expanded: false
@@ -179,6 +173,6 @@
179
173
  }).bind(conjur.views)
180
174
  (
181
175
  conjur,
182
- React,
183
- _
176
+ _,
177
+ React
184
178
  );
@@ -1,254 +1,188 @@
1
1
  /** @jsx React.DOM */
2
- /* global conjur, React, jQuery, _ */
3
-
4
- (function(conjur, React, $, _) {
5
- 'use strict';
6
-
7
- var ResourceLink = conjur.views.ResourceLink,
8
- RoleLink = conjur.views.RoleLink;
9
-
10
- var PermissionsTable = this.PermissionsTable = React.createClass({
11
- render: function() {
12
- var rows = [];
13
-
14
- var resources = _.sortBy(this.props.resources, function(r) {
15
- return r.id; // this way it will be sorting by (kind, id)
16
- });
17
-
18
- resources.forEach(function(r) {
19
- var rowspan = r.permissions.length + 1,
20
- parts = r.id.split(':'),
21
- kind = parts[1]; // ignore env?
22
-
23
- var cells = [
24
- (<td rowSpan={rowspan}> <ResourceLink id={r.id}/> </td>),
25
- (<td rowSpan={rowspan}> {kind} </td>)
26
- ];
27
-
28
- if (rowspan === 1) {
29
- cells.push(<td colSpan="3"> full permissions </td>);
30
- }
31
-
32
- rows.push(
33
- (<tr key={r.id}>{cells}</tr>)
34
- );
35
-
36
- if (rowspan > 1) {
37
- rows.push(r.permissions.map(function(p) {
38
- return (
39
- <PermissionRow data={p}/>
40
- );
41
- }));
42
- }
43
-
44
- });
45
-
46
- rows = _.flatten(rows);
47
-
48
- var showhidelink = (
49
- <div>
50
- <a onClick={this.props.hideHandler}>Hide all &laquo;</a>
51
- </div>
52
- );
53
-
54
- if (this.props.tabview) {
55
- showhidelink = '';
56
- }
57
-
58
- if (rows.length === 0) {
59
- return (
60
- <span>None</span>
61
- );
62
- }
63
-
64
- return (
65
- <div>
66
- {showhidelink}
67
- <table>
68
- <thead>
69
- <tr>
70
- <th> Resource </th>
71
- <th> Kind </th>
72
- <th> Privilege </th>
73
- <th> Can Grant? </th>
74
- <th> Granted By </th>
75
- </tr>
76
- </thead>
77
- <tbody>
78
- {rows}
79
- </tbody>
80
- </table>
81
- </div>
82
- );
83
- }
84
- });
85
2
 
3
+ var PermissionsTable = React.createClass({
4
+ render: function() {
5
+ var rows = [];
6
+ var resources = _.sortBy(this.props.resources, function(r){
7
+ return r.id; // this way it will be sorting by (kind, id)
8
+ });
9
+ resources.forEach(function(r){
10
+ var rowspan = r.permissions.length + 1;
11
+ var parts = r.id.split(":");
12
+ var id = parts[2];
13
+ var kind = parts[1]; // ignore env?
14
+ var cells = [
15
+ <td rowSpan={rowspan}> <ResourceLink id={r.id}/> </td>,
16
+ <td rowSpan={rowspan}> {kind} </td>
17
+ ];
18
+ if(rowspan == 1){
19
+ cells.push(<td colSpan="3"> full permissions </td>);
20
+ }
21
+
22
+ rows.push(
23
+ <tr key={r.id}>{cells}</tr>
24
+ );
25
+
26
+ if(rowspan > 1){
27
+ rows.push(r.permissions.map(function(p){
28
+ return <PermissionRow data={p}/>
29
+ }));
30
+ }
86
31
 
87
- // Renders a permission as a tr
88
- var PermissionRow = React.createClass({
89
- render: function() {
90
- var p = this.props.data;
32
+ });
33
+ rows = _.flatten(rows);
34
+
35
+ var showhidelink = <div><a onClick={this.props.hideHandler}>Hide all &laquo;</a></div>;
36
+
37
+ if (this.props.tabview) {
38
+ showhidelink="";
39
+ }
40
+
41
+ if (rows.length==0) {
42
+ return <span>None</span>;
43
+ }
44
+
45
+ return <div>
46
+ {showhidelink}
47
+ <table>
48
+ <thead>
49
+ <tr>
50
+ <th> Resource </th>
51
+ <th> Kind </th>
52
+ <th> Privilege </th>
53
+ <th> Can Grant? </th>
54
+ <th> Granted By </th>
55
+ </tr>
56
+ </thead>
57
+ <tbody> {rows} </tbody>
58
+ </table>
59
+ </div>
60
+ }
61
+ });
62
+
63
+
64
+ // Renders a permission as a tr
65
+ var PermissionRow = React.createClass({
66
+ render: function(){
67
+ var p = this.props.data;
68
+ return <tr>
69
+ <td> { p.privilege } </td>
70
+ <td> { p.grant_option ? "yes" : "no" }</td>
71
+ <td> <RoleLink id={p.grantor}/> </td>
72
+ </tr>;
73
+ }
74
+ });
75
+
76
+ var PermissionsSummary = React.createClass({
77
+ render: function() {
78
+ var expand = "";
79
+ if ( this.props.length > 0 )
80
+ expand = <span>
81
+ <br/>
82
+ <span>
83
+ <a onClick={this.props.expandHandler}>Show all &raquo;</a>
84
+ </span>
85
+ </span>;
86
+
87
+ return <div>
88
+ <span>
89
+ {this.props.length} permissions
90
+ </span>
91
+ {expand}
92
+ </div>
93
+ }
94
+ });
95
+
96
+ var Permissions = React.createClass({
97
+ getInitialState: function() {
98
+ return {resources: null, loaded: false, expand: false}
99
+ },
100
+
101
+ expand: function(event) {
102
+ this.setState({expand: true})
103
+ },
104
+
105
+ collapse: function(event) {
106
+ this.setState({expand: false})
107
+ },
108
+
109
+ componentWillMount: function() { // shouldn't it be done in model??? otherwise it will re-load stuff on each re-rendering of parent block
110
+ if ( this.props.roles ) {
111
+ $.get(this.url(), function(data){
112
+ this.setPermissions(data);
113
+ }.bind(this));
114
+ }
115
+ },
116
+
117
+ setPermissions: function(_resources) {
118
+ /**
119
+ * Filter out owned resources.
120
+ * Filter out permissions on resources which are not held by the current role.
121
+ */
122
+ var resources;
123
+
124
+ if ( this.props.owned ) {
125
+ var ownedIds = _.pluck(this.props.owned, 'id');
126
+ resources = _resources.filter(function(r) {
127
+ return !_.contains(ownedIds, r.id);
128
+ });
129
+ }
130
+ else
131
+ resources = _resources;
132
+
133
+ var roleSet = {};
134
+ this.props.roles.forEach(function(r) {
135
+ roleSet[r] = r;
136
+ });
91
137
 
92
- return (
93
- <tr>
94
- <td>{p.privilege}</td>
95
- <td>{p.grant_option ? 'yes' : 'no'}</td>
96
- <td><RoleLink id={p.grantor}/></td>
97
- </tr>
98
- );
99
- }
138
+ var cleanResources = resources.filter(function(item) {
139
+ return item.id.split(':')[1] !== "secret"; // assets of 'secret' kind are internal
100
140
  });
101
141
 
102
- var PermissionsSummary = React.createClass({
103
- render: function() {
104
- var expand = '';
105
-
106
- if (this.props.length > 0) {
107
- expand = (
108
- <span>
109
- <br/>
110
- <span>
111
- <a onClick={this.props.expandHandler}>Show all &raquo;</a>
112
- </span>
113
- </span>
114
- );
115
- }
116
-
117
- return (
118
- <div>
119
- <span>
120
- {this.props.length} permissions
121
- </span>
122
- {expand}
123
- </div>
124
- );
125
- }
142
+ cleanResources.forEach(function(resource) {
143
+ var permissions = resource.permissions;
144
+ var hasPermissions = [];
145
+ permissions.forEach(function(permission) {
146
+ if ( roleSet.hasOwnProperty(permission['role']) )
147
+ hasPermissions.push(permission);
148
+ });
149
+ resource.permissions = hasPermissions;
126
150
  });
127
151
 
128
- this.Permissions = React.createClass({
129
- getInitialState: function() {
130
- return {resources: null, loaded: false, expand: false};
131
- },
132
-
133
- expand: function() {
134
- this.setState({expand: true});
135
- },
136
-
137
- collapse: function() {
138
- this.setState({expand: false});
139
- },
140
-
141
- componentWillMount: function() {
142
- // shouldn't it be done in model??? otherwise it will
143
- // re-load stuff on each re-rendering of parent block
144
- if (this.props.roles) {
145
- $.get(this.url(), function(data) {
146
- this.setPermissions(data);
147
- }.bind(this));
148
- }
149
- },
150
-
151
- setPermissions: function(_resources) {
152
- /**
153
- * Filter out owned resources.
154
- * Filter out permissions on resources which are not held by the current role.
155
- */
156
- var resources;
157
-
158
- if (this.props.owned) {
159
- var ownedIds = _.pluck(this.props.owned, 'id');
160
-
161
- resources = _resources.filter(function(r) {
162
- return !_.contains(ownedIds, r.id);
163
- });
164
- } else {
165
- resources = _resources;
166
- }
167
-
168
- var roleSet = {};
169
-
170
- this.props.roles.forEach(function(r) {
171
- roleSet[r] = r;
172
- });
173
-
174
- var cleanResources = resources.filter(function(item) {
175
- // assets of 'secret' kind are internal
176
- return item.id.split(':')[1] !== 'secret';
177
- });
178
-
179
- cleanResources.forEach(function(resource) {
180
- var permissions = resource.permissions,
181
- hasPermissions = [];
182
-
183
- permissions.forEach(function(permission) {
184
- if (roleSet.hasOwnProperty(permission.role)) {
185
- hasPermissions.push(permission);
186
- }
187
- });
188
-
189
- resource.permissions = hasPermissions;
190
- });
191
-
192
- this.setState({resources: cleanResources, loaded: true});
193
- },
194
-
195
- render: function() {
196
- var content;
197
-
198
- if (this.state.loaded) {
199
- if (this.state.expand || this.props.tabview) {
200
- content = (
201
- <PermissionsTable resources={this.state.resources}
202
- hideHandler={this.collapse}
203
- tabview={this.props.tabview} />
204
- );
205
- } else {
206
- content = (
207
- <PermissionsSummary length={this.state.resources.length}
208
- expandHandler={this.expand} />
209
- );
210
- }
211
- } else {
212
- if (this.props.roles) {
213
- content = (
214
- <span>Loading...</span>
215
- );
216
- } else {
217
- content = 'You are not authorized to see these permissions';
218
- }
219
- }
220
-
221
- var cx = React.addons.classSet;
222
-
223
- var classes = cx({
224
- permissions: true,
225
- loading: !this.state.loaded
226
- });
227
-
228
- var permissionsheader = this.props.tabview ? '' : (<h3>Permissions held</h3>);
229
-
230
- return (
231
- <section className={classes}>
232
- {permissionsheader}
233
- <div id="permissionDetails">
234
- {content}
235
- </div>
236
- </section>
237
- );
238
- },
239
-
240
- url: function() {
241
- return '/api/authz/' +
242
- conjur.app.configuration.account +
243
- '/resources?acting_as=' +
244
- this.props.role;
245
- }
152
+ this.setState({resources: cleanResources, loaded: true});
153
+ },
154
+
155
+ render: function(){
156
+ var content;
157
+ if (this.state.loaded) {
158
+ if ( this.state.expand || this.props.tabview )
159
+ content = <PermissionsTable resources={this.state.resources} hideHandler={this.collapse} tabview={this.props.tabview}/>
160
+ else
161
+ content = <PermissionsSummary length={this.state.resources.length} expandHandler={this.expand} />
162
+ }
163
+ else {
164
+ if ( this.props.roles )
165
+ content = <span>Loading...</span>
166
+ else
167
+ content = "You are not authorized to see these permissions";
168
+ }
169
+
170
+ var cx = React.addons.classSet;
171
+ var classes = cx({
172
+ permissions: true,
173
+ loading: !this.state.loaded
246
174
  });
247
175
 
248
- }).bind(conjur.views)
249
- (
250
- conjur,
251
- React,
252
- jQuery,
253
- _
254
- );
176
+ var permissionsheader = this.props.tabview ? "" : <h3>Permissions held</h3>;
177
+ return <section className={classes}>
178
+ {permissionsheader}
179
+ <div id="permissionDetails">
180
+ {content}
181
+ </div>
182
+ </section>;
183
+ },
184
+
185
+ url: function(){
186
+ return "/api/authz/" + conjur.app.configuration.account + "/resources?acting_as=" + this.props.role;
187
+ }
188
+ })