conjur-asset-ui 1.3.0 → 1.3.1

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 +3 -1
  3. data/.jshintrc +41 -0
  4. data/Gemfile +3 -1
  5. data/README.md +34 -0
  6. data/Rakefile +69 -1
  7. data/bower.json +93 -0
  8. data/conjur-asset-ui.gemspec +1 -1
  9. data/features/navigation_bar.feature +31 -0
  10. data/features/step_definitions/custom_step.rb +32 -0
  11. data/features/support/env.rb +38 -0
  12. data/features/support/hooks.rb +30 -0
  13. data/features/support/world.rb +17 -0
  14. data/gulpfile.js +140 -0
  15. data/lib/conjur/command/ui.rb +1 -1
  16. data/lib/conjur/webserver/server.rb +14 -9
  17. data/lib/conjur-asset-ui-version.rb +1 -1
  18. data/package.json +47 -0
  19. data/preprocessor.js +7 -0
  20. data/public/_client_libs.html +2 -15
  21. data/public/css/styles.less +170 -4
  22. data/public/index.html.erb +5 -7
  23. data/public/js/init.js +183 -97
  24. data/public/js/lib/sorted-set.no-require.js +3 -28
  25. data/public/js/models/groupRecord.js +12 -11
  26. data/public/js/models/hostRecord.js +6 -7
  27. data/public/js/models/layerRecord.js +12 -11
  28. data/public/js/models/namespace.js +2 -0
  29. data/public/js/models/policyList.js +3 -1
  30. data/public/js/models/policyRecord.js +6 -7
  31. data/public/js/models/record.js +24 -23
  32. data/public/js/models/resourceList.js +28 -10
  33. data/public/js/models/userList.js +7 -2
  34. data/public/js/models/userRecord.js +7 -8
  35. data/public/js/models/variableList.js +18 -7
  36. data/public/js/models/variableRecord.js +13 -12
  37. data/public/js/routers.js +72 -26
  38. data/public/js/views/annotations.js +38 -27
  39. data/public/js/views/audit.js +23 -17
  40. data/public/js/views/chart.js +471 -0
  41. data/public/js/views/dashboard.js +94 -58
  42. data/public/js/views/generic.js +16 -9
  43. data/public/js/views/group.js +94 -55
  44. data/public/js/views/groups.js +3 -7
  45. data/public/js/views/host.js +75 -44
  46. data/public/js/views/hosts.js +2 -6
  47. data/public/js/views/layer.js +127 -82
  48. data/public/js/views/layers.js +2 -6
  49. data/public/js/views/mixins/search.js +12 -5
  50. data/public/js/views/mixins/tabs.js +95 -55
  51. data/public/js/views/navSearch.js +16 -5
  52. data/public/js/views/owned.js +14 -8
  53. data/public/js/views/permissions.js +244 -178
  54. data/public/js/views/policies.js +2 -4
  55. data/public/js/views/policy.js +65 -38
  56. data/public/js/views/resource.js +49 -34
  57. data/public/js/views/role.js +52 -37
  58. data/public/js/views/searchResults.js +205 -138
  59. data/public/js/views/time.js +26 -13
  60. data/public/js/views/user.js +178 -55
  61. data/public/js/views/users.js +2 -7
  62. data/public/js/views/variable.js +226 -45
  63. data/public/js/views/variables.js +4 -8
  64. metadata +20 -20
  65. data/public/_client_code.html +0 -42
  66. data/public/css/bootstrap.css +0 -7
  67. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  68. data/public/fonts/glyphicons-halflings-regular.svg +0 -229
  69. data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
  70. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  71. data/public/js/lib/JSXTransformer.js +0 -10862
  72. data/public/js/lib/async.js +0 -958
  73. data/public/js/lib/backbone.js +0 -2
  74. data/public/js/lib/bootstrap.js +0 -6
  75. data/public/js/lib/less.js +0 -16
  76. data/public/js/lib/moment.js +0 -7768
  77. data/public/js/lib/react-bootstrap.js +0 -5346
  78. data/public/js/lib/react-bootstrap.min.js +0 -4
  79. data/public/js/lib/underscore-min.js +0 -6
  80. data/public/js/lib/underscore.string.min.js +0 -1
  81. data/public/js/main.js +0 -57
@@ -1,20 +1,133 @@
1
1
  /** @jsx React.DOM */
2
+ /* global conjur, _, React, ReactBootstrap */
2
3
 
3
- //var ReactBootstrap=root.ReactBootstrap;
4
- var TabbedArea = ReactBootstrap.TabbedArea;
5
- var TabPane = ReactBootstrap.TabPane;
6
-
7
- var User = React.createClass({
8
- mixins: [conjur.views.mixins.Tab],
9
- render: function(){
10
- var user = this.props.data.user;
11
-
12
- // TODO: refactor
13
- // TODO: show public keys
14
- // TODO: actions menu (e.g. 'upload public key', 'add annotation')
15
- // TODO: memberships panel
16
- var overview_tab =
17
- <TabPane key="overview" tab="Overview">
4
+ (function(conjur, _, React, ReactBootstrap) {
5
+ 'use strict';
6
+
7
+ var TabbedArea = ReactBootstrap.TabbedArea,
8
+ TabPane = ReactBootstrap.TabPane,
9
+ Tab = conjur.views.mixins.Tab,
10
+ AuditBox = window.AuditBox,
11
+ RoleLink = conjur.views.RoleLink;
12
+
13
+ var PubkeyItem = React.createClass({
14
+ render: function() {
15
+ return (
16
+ <div className="b-pubkey">
17
+ <div className="b-pubkey__logo">
18
+ <span className="badge">{this.props.pubkey[0]}</span>
19
+ </div>
20
+ <ul className="b-pubkey__list list-unstyled">
21
+ <li className="b-pubkey__name">
22
+ {this.props.pubkey[2]}
23
+ </li>
24
+ <li className="b-pubkey__fingerprint">
25
+ {/* TODO: key fingerprint */}
26
+ </li>
27
+ <li className="b-pubkey__info">
28
+ {/* TODO: When added, when last time used */}
29
+ </li>
30
+ </ul>
31
+ <div className="b-pubkeys__actions">
32
+ {/* TODO: Action buttons */}
33
+ </div>
34
+ </div>
35
+ );
36
+ }
37
+ });
38
+
39
+ var PubkeysList = React.createClass({
40
+ render: function() {
41
+ var login = this.props.login;
42
+
43
+ var pubkeysList = this.props.pubkeys.map(function(k, idx, coll) {
44
+ var tokens = k.split(' ');
45
+
46
+ console.log(arguments);
47
+
48
+ var className = 'b-pubkeys__item list-group-item list-group-item-noborder';
49
+
50
+ if (idx + 1 !== coll.length) {
51
+ className = className + ' b-pubkeys__item--headline';
52
+ }
53
+
54
+ return (
55
+ <li className={className}>
56
+ <PubkeyItem pubkey={tokens} />
57
+ </li>
58
+ );
59
+ });
60
+
61
+ return (
62
+ <div className="b-pubkeys">
63
+ <PubkeysHelp>
64
+ This is list of SSH public keys associated with user {login}.
65
+ </PubkeysHelp>
66
+ <ul className="b-pubkeys__list">
67
+ {pubkeysList}
68
+ </ul>
69
+ </div>
70
+ );
71
+ }
72
+ });
73
+
74
+ var PubkeysHelp = React.createClass({
75
+ render: function() {
76
+ var ret;
77
+
78
+ if (React.Children.count(this.props.children) > 0) {
79
+ ret = (
80
+ <p className="b-pubkeys__help">
81
+ {this.props.children}
82
+ </p>
83
+ );
84
+ } else {
85
+ var login = this.props.login;
86
+
87
+ ret = (
88
+ <p className="b-pubkeys__help">
89
+ User {login} have not any pubkey. Use follow command to create one:
90
+ <pre>$ conjur pubkeys add {login} @id_{login}.pub</pre>
91
+ </p>
92
+ );
93
+ }
94
+
95
+ return ret;
96
+ }
97
+ });
98
+
99
+ var PubkeysTabContent = React.createClass({
100
+ render: function() {
101
+ var body;
102
+
103
+ if (this.props.pubkeys.length > 0) {
104
+ body = (
105
+ <PubkeysList login={this.props.login} pubkeys={this.props.pubkeys} />
106
+ );
107
+ } else {
108
+ body = (
109
+ <div className="b-pubkeys">
110
+ <PubkeysHelp login={this.props.login} />
111
+ </div>
112
+ );
113
+ }
114
+
115
+ return body;
116
+ }
117
+ });
118
+
119
+ this.User = React.createClass({
120
+ mixins: [Tab],
121
+
122
+ render: function() {
123
+ var user = this.props.data.user;
124
+
125
+ // TODO: refactor
126
+ // TODO: show public keys
127
+ // TODO: actions menu (e.g. 'upload public key', 'add annotation')
128
+ // TODO: memberships panel
129
+ var overviewTab = (
130
+ <TabPane key="overview" tab="Overview">
18
131
  <dl className="dl-horizontal">
19
132
  <dt>Created by</dt>
20
133
  <dd><RoleLink id={user.userid}/></dd>
@@ -23,46 +136,56 @@ var User = React.createClass({
23
136
  <dt>Uidnumber</dt>
24
137
  <dd>{user.uidnumber}</dd>
25
138
  </dl>
26
- </TabPane>;
139
+ </TabPane>
140
+ );
27
141
 
28
- var audit_tab=
29
- <TabPane key="audit" tab="Recent Activity">
142
+ var auditTab = (
143
+ <TabPane key="audit" tab="Recent Activity">
30
144
  <div className="audit auditUser">
31
- <AuditBox roles={[user.roleid]} resources={[user.resource_identifier]} tabview={true}/>
145
+ <AuditBox roles={[user.roleid]}
146
+ resources={[user.resource_identifier]}
147
+ tabview={true} />
32
148
  </div>
33
- </TabPane>;
34
-
35
- var pubkeys_list = this.props.data.pubkeys.map(function(k) {
36
- var tokens = k.split(" ");
37
- return <li className="list-group-item list-group-item-noborder">
38
- <span className="badge">{tokens[0]}</span>
39
- {tokens[tokens.length-1]}
40
- </li>
41
- });
42
- var pubkeys_tab = <TabPane key="pubkeys" tab={get_tabname("Public Keys", this.props.data.pubkeys)}>
43
- <div className="pubkeys pubkeysUser">
44
- <ul className="list-group">
45
- {pubkeys_list}
46
- </ul>
47
- </div>
48
- </TabPane>;
49
-
50
- var permissions_tab = this.permissions_tab(user.roleid);
51
- var memberships_tab = this.memberships_tab(user.roleid);
52
- var annotations_tab = this.annotations_tab();
53
- var owned_tab = this.owned_tab();
54
-
55
- var tabs=_.compact([overview_tab, owned_tab, memberships_tab,
56
- permissions_tab, annotations_tab, pubkeys_tab, audit_tab]);
57
-
58
-
59
- return (
60
- <div className="user">
61
- <h2> User {user.login} </h2>
62
- <TabbedArea defaultActiveKey="overview">
63
- {tabs}
64
- </TabbedArea>
65
- </div>
66
- );
67
- }
68
- });
149
+ </TabPane>
150
+ );
151
+
152
+ var pubkeysTab = (
153
+ <TabPane key="pubkeys"
154
+ tab={conjur.utils.getTabname('Public Keys', this.props.data.pubkeys)}>
155
+ <PubkeysTabContent login={user.login} pubkeys={this.props.data.pubkeys} />
156
+ </TabPane>
157
+ );
158
+
159
+ var permissionsTab = this.permissionsTab(user.roleid);
160
+ var membershipsTab = this.membershipsTab(user.roleid);
161
+ var annotationsTab = this.annotationsTab();
162
+ var ownedTab = this.ownedTab();
163
+
164
+ var tabs = _.compact([
165
+ overviewTab,
166
+ ownedTab,
167
+ membershipsTab,
168
+ permissionsTab,
169
+ annotationsTab,
170
+ pubkeysTab,
171
+ auditTab
172
+ ]);
173
+
174
+ return (
175
+ <div className="user">
176
+ <h2>User {user.login}</h2>
177
+ <TabbedArea defaultActiveKey="overview">
178
+ {tabs}
179
+ </TabbedArea>
180
+ </div>
181
+ );
182
+ }
183
+ });
184
+
185
+ }).bind(conjur.views)
186
+ (
187
+ conjur,
188
+ _,
189
+ React,
190
+ ReactBootstrap
191
+ );
@@ -1,18 +1,13 @@
1
1
  /** @jsx React.DOM */
2
+ /* global conjur, React */
2
3
 
3
4
  (function(conjur, React) {
4
5
  'use strict';
5
6
 
6
7
  var GenericList = conjur.views.GenericList;
7
8
 
8
- var UserBox = this.UserBox = React.createClass({
9
- // no more external manipulation of state
10
- //getInitialState: function() {
11
- // return { currentNamespace: "", members: [] };
12
- //},
9
+ this.UserBox = React.createClass({
13
10
  render: function() {
14
- // <NamespaceFilter currentNamespace={this.props.currentNamespace}
15
- // namespaces={this.props.data.namespaces} />
16
11
  return (
17
12
  <div className="userBox">
18
13
  <div className="userList">
@@ -1,70 +1,251 @@
1
1
  /** @jsx React.DOM */
2
+ /* global conjur, React, ReactBootstrap, _ */
2
3
 
3
- var Variable = React.createClass({
4
- mixins: [conjur.views.mixins.Tab],
5
- render: function() {
6
- var updaters = this.props.data.updaters.map(function (member) {
7
- return <li className="list-group-item list-group-item-noborder">
8
- <RoleLink id={member} />
9
- </li>
10
- }.bind(this));
11
- var fetchers = this.props.data.fetchers.map(function (member) {
12
- return <li className="list-group-item list-group-item-noborder">
13
- <RoleLink id={member} />
14
- </li>
15
- }.bind(this));
16
- var resourceId = [ conjur.app.configuration.account, 'variable', this.props.data.variable.id ].join(':');
4
+ (function(conjur, React, ReactBootstrap, _) {
5
+ 'use strict';
17
6
 
7
+ var TabbedArea = ReactBootstrap.TabbedArea,
8
+ TabPane = ReactBootstrap.TabPane,
9
+ Tab = conjur.views.mixins.Tab,
10
+ RoleLink = conjur.views.RoleLink,
11
+ AuditBox = window.AuditBox;
18
12
 
13
+ var RevealerBox = React.createClass({
14
+ getInitialState: function() {
15
+ return {revealed: false};
16
+ },
19
17
 
18
+ handleClick: function() {
19
+ this.setState({revealed: !this.state.revealed});
20
+ },
20
21
 
21
- var overview_tab =
22
- <TabPane key="overview" tab="Overview">
23
- <dl className="dl-horizontal">
22
+ render: function() {
23
+ var valToShow = this.state.revealed ? 'SECRET HERE!' : 'Show Value';
24
+
25
+ return (
26
+ <div className="revealer well well-sm" onClick={this.handleClick}>
27
+ {valToShow}
28
+ </div>
29
+ );
30
+ }
31
+ });
32
+
33
+ var Breadcrumb = React.createClass({
34
+ render: function() {
35
+ return (
36
+ <div className="b-breadcrumb">
37
+
38
+ </div>
39
+ );
40
+ }
41
+ });
42
+
43
+ var Breadcrumbs = React.createClass({
44
+ render: function() {
45
+ return (
46
+ <div className="b-breadcrumbs">
47
+ <Breadcrumb />
48
+ </div>
49
+ );
50
+ }
51
+ });
52
+
53
+ var Activity = React.createClass({
54
+ getInitialState: function() {
55
+ var data = this.getData();
56
+
57
+ return {
58
+ data: data,
59
+ options: {
60
+ legend: {
61
+ close: 'Closed',
62
+ sread: 'Suc. read',
63
+ supdate: 'Suc. update',
64
+ fread: 'Failed read',
65
+ fupdate: 'Failed update'
66
+ },
67
+ axis: {
68
+ y: {
69
+ label: 'Value'
70
+ }
71
+ }
72
+ }
73
+ };
74
+ },
75
+
76
+ getData: function() {
77
+ return [];
78
+ },
79
+
80
+ render: function() {
81
+ return (
82
+ <div className="b-variable-activity">
83
+ <h2>Activity</h2>
84
+ <div className="b-variable-activity__graph">
85
+ <Chart options={this.state.options}
86
+ data={this.state.data} />
87
+ </div>
88
+ </div>
89
+ );
90
+ }
91
+ });
92
+
93
+ var Updaters = React.createClass({
94
+ render: function() {
95
+ return (
96
+ <div className="b-variable-updaters">
97
+ <h2>Updaters</h2>
98
+ </div>
99
+ );
100
+ }
101
+ });
102
+
103
+ var Fetchers = React.createClass({
104
+ render: function() {
105
+ return (
106
+ <div className="b-variable-fetchers">
107
+ <h2>Fetchers</h2>
108
+ </div>
109
+ );
110
+ }
111
+ });
112
+
113
+ var Updates = React.createClass({
114
+ render: function() {
115
+ return (
116
+ <div className="b-variable-updates">
117
+ <h2>Updates</h2>
118
+ </div>
119
+ );
120
+ }
121
+ });
122
+
123
+ var Warnings = React.createClass({
124
+ render: function() {
125
+ return (
126
+ <div className="b-variable-warnings">
127
+ <h2>Warnings</h2>
128
+ </div>
129
+ );
130
+ }
131
+ });
132
+
133
+ this.Variable = React.createClass({
134
+ mixins: [Tab],
135
+
136
+ render: function() {
137
+ var updaters = this.props.data.updaters.map(function(member) {
138
+ return (
139
+ <li className="list-group-item list-group-item-noborder">
140
+ <RoleLink id={member} />
141
+ </li>
142
+ );
143
+ });
144
+
145
+ var fetchers = this.props.data.fetchers.map(function(member) {
146
+ return (
147
+ <li className="list-group-item list-group-item-noborder">
148
+ <RoleLink id={member} />
149
+ </li>
150
+ );
151
+ });
152
+
153
+ var resourceId = [
154
+ conjur.app.configuration.account,
155
+ 'variable',
156
+ this.props.data.variable.id
157
+ ].join(':');
158
+
159
+ var overviewTab = (
160
+ <TabPane key="overview" tab="Overview">
161
+ <dl className="dl-horizontal pull-left">
24
162
  <dt>Owner</dt>
25
- <dd><RoleLink id={this.props.data.variable.ownerid}/></dd>
163
+ <dd><RoleLink id={this.props.data.variable.ownerid} /></dd>
164
+
26
165
  <dt>Created by</dt>
27
- <dd><RoleLink id={this.props.data.variable.userid}/></dd>
166
+ <dd><RoleLink id={this.props.data.variable.userid} /></dd>
167
+
28
168
  <dt>MIME type</dt>
29
169
  <dd>{this.props.data.variable.mime_type}</dd>
170
+
30
171
  <dt>Kind</dt>
31
172
  <dd>{this.props.data.variable.kind}</dd>
173
+
32
174
  <dt>Versions</dt>
33
175
  <dd>{this.props.data.variable.version_count}</dd>
34
176
  </dl>
35
- </TabPane>;
36
- var updaters_tab =
37
- <TabPane key="updaters" tab={get_tabname("Updaters",updaters)}>
177
+ <div className="pull-right">
178
+ <RevealerBox variable={this.props.data.variable} />
179
+ </div>
180
+ </TabPane>
181
+ );
182
+
183
+ var updatersTab = (
184
+ <TabPane key="updaters" tab={conjur.utils.getTabname('Updaters', updaters)}>
38
185
  <ul className="list-group">
39
186
  {updaters}
40
187
  </ul>
41
- </TabPane>;
42
- var fetchers_tab =
43
- <TabPane key="fetchers" tab={get_tabname("Fetchers",fetchers)}>
188
+ </TabPane>
189
+ );
190
+
191
+ var fetchersTab = (
192
+ <TabPane key="fetchers" tab={conjur.utils.getTabname('Fetchers', fetchers)}>
44
193
  <ul className="list-group">
45
194
  {fetchers}
46
195
  </ul>
47
- </TabPane>;
48
- var annotations_tab = this.annotations_tab();
196
+ </TabPane>
197
+ );
49
198
 
50
- var audit_tab =
51
- <TabPane key="audit" tab="Recent Activity">
199
+ var annotationsTab = this.annotationsTab();
200
+
201
+ var auditTab = (
202
+ <TabPane key="audit" tab="Recent Activity">
52
203
  <div className="audit auditHost">
53
204
  <AuditBox resources={[resourceId]} tabview={true}/>
54
205
  </div>
55
- </TabPane>;
56
-
57
-
58
- var tabs = _.compact([ overview_tab, updaters_tab, fetchers_tab,
59
- annotations_tab, audit_tab ]);
60
-
61
- return (
62
- <div className="variable">
63
- <h2>Variable {this.props.data.variable.id}</h2>
64
- <TabbedArea defaultActiveKey="overview">
65
- {tabs}
66
- </TabbedArea>
67
- </div>
68
- );
69
- }
70
- });
206
+ </TabPane>
207
+ );
208
+
209
+ var tabs = _.compact([
210
+ overviewTab,
211
+ updatersTab,
212
+ fetchersTab,
213
+ annotationsTab,
214
+ auditTab
215
+ ]);
216
+
217
+ // <Breadcrumbs />
218
+ // <hr />
219
+ // <Activity />
220
+ // <hr />
221
+ // <Updaters />
222
+ // <hr />
223
+ // <Fetchers />
224
+ // <hr />
225
+ // <Updates />
226
+ // <hr />
227
+ // <Warnings />
228
+ // <hr />
229
+ // <br />
230
+ // <br />
231
+ // <br />
232
+ // <br />
233
+
234
+ return (
235
+ <div className="variable">
236
+ <h2>Variable {this.props.data.variable.id}</h2>
237
+ <TabbedArea defaultActiveKey="overview">
238
+ {tabs}
239
+ </TabbedArea>
240
+ </div>
241
+ );
242
+ }
243
+ });
244
+
245
+ }).bind(conjur.views)
246
+ (
247
+ conjur,
248
+ React,
249
+ ReactBootstrap,
250
+ _
251
+ );
@@ -1,20 +1,16 @@
1
1
  /** @jsx React.DOM */
2
+ /* global conjur, React */
2
3
 
3
4
  (function(conjur, React) {
4
5
  'use strict';
5
6
 
6
7
  var GenericList = conjur.views.GenericList;
7
8
 
8
- var VariableBox = this.VariableBox = React.createClass({
9
- // getInitialState: function() {
10
- // return { currentNamespace: "", members: [] };
11
- // },
9
+ this.VariableBox = React.createClass({
12
10
  render: function() {
13
- // <NamespaceFilter currentNamespace={this.props.currentNamespace}
14
- // namespaces={this.props.data.namespaces} />
15
11
  return (
16
- <div className="groupBox">
17
- <div className="groupList">
12
+ <div className="variableBox">
13
+ <div className="variableList">
18
14
  <h2>Variables</h2>
19
15
  <GenericList data={{kind: 'variables', members: this.props.data.members}} />
20
16
  </div>