conjur-asset-ui 1.3.2 → 1.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.jshintrc +41 -0
  4. data/CHANGELOG.md +7 -0
  5. data/Gemfile +3 -1
  6. data/README.md +38 -4
  7. data/Rakefile +69 -1
  8. data/TODO.md +31 -0
  9. data/bower.json +98 -0
  10. data/conjur-asset-ui.gemspec +3 -3
  11. data/features/navigation_bar.feature +31 -0
  12. data/features/step_definitions/custom_step.rb +32 -0
  13. data/features/support/env.rb +38 -0
  14. data/features/support/hooks.rb +30 -0
  15. data/features/support/world.rb +17 -0
  16. data/gulpfile.js +139 -0
  17. data/lib/conjur/command/ui.rb +1 -1
  18. data/lib/conjur/webserver/server.rb +14 -8
  19. data/lib/conjur-asset-ui-version.rb +1 -1
  20. data/package.json +47 -0
  21. data/preprocessor.js +7 -0
  22. data/public/_client_libs.html +1 -16
  23. data/public/build/css/styles.css +87 -0
  24. data/public/build/css/vendor.css +5 -0
  25. data/public/build/fonts/glyphicons-halflings-regular.eot +0 -0
  26. data/public/{fonts → build/fonts}/glyphicons-halflings-regular.svg +47 -47
  27. data/public/{fonts → build/fonts}/glyphicons-halflings-regular.ttf +0 -0
  28. data/public/build/fonts/glyphicons-halflings-regular.woff +0 -0
  29. data/public/build/js/app.min.js +4 -0
  30. data/public/build/js/vendor.min.js +23 -0
  31. data/public/build/maps/app.min.js.map +1 -0
  32. data/public/build/maps/vendor.min.js.map +1 -0
  33. data/public/css/styles.less +246 -17
  34. data/public/index.html.erb +11 -10
  35. data/public/js/init.js +186 -97
  36. data/public/js/lib/sorted-set.no-require.js +3 -28
  37. data/public/js/models/groupRecord.js +14 -12
  38. data/public/js/models/hostRecord.js +13 -8
  39. data/public/js/models/layerRecord.js +14 -12
  40. data/public/js/models/namespace.js +2 -0
  41. data/public/js/models/policyList.js +3 -1
  42. data/public/js/models/policyRecord.js +8 -8
  43. data/public/js/models/record.js +59 -27
  44. data/public/js/models/resourceList.js +28 -10
  45. data/public/js/models/userList.js +7 -2
  46. data/public/js/models/userRecord.js +14 -9
  47. data/public/js/models/variableList.js +18 -7
  48. data/public/js/models/variableRecord.js +18 -14
  49. data/public/js/routers.js +74 -37
  50. data/public/js/views/annotations.js +39 -28
  51. data/public/js/views/audit.js +31 -25
  52. data/public/js/views/breadcrumbs.js +62 -0
  53. data/public/js/views/chart.js +617 -0
  54. data/public/js/views/dashboard.js +144 -65
  55. data/public/js/views/generic.js +16 -9
  56. data/public/js/views/group.js +103 -55
  57. data/public/js/views/groups.js +3 -7
  58. data/public/js/views/host.js +192 -56
  59. data/public/js/views/hosts.js +2 -6
  60. data/public/js/views/layer.js +136 -82
  61. data/public/js/views/layers.js +2 -6
  62. data/public/js/views/mixins/search.js +12 -5
  63. data/public/js/views/mixins/tabs.js +95 -55
  64. data/public/js/views/navSearch.js +16 -5
  65. data/public/js/views/owned.js +14 -8
  66. data/public/js/views/permissions.js +244 -178
  67. data/public/js/views/policies.js +2 -4
  68. data/public/js/views/policy.js +65 -38
  69. data/public/js/views/resource.js +54 -34
  70. data/public/js/views/role.js +59 -37
  71. data/public/js/views/searchResults.js +205 -138
  72. data/public/js/views/sections.js +226 -0
  73. data/public/js/views/time.js +38 -13
  74. data/public/js/views/user.js +288 -59
  75. data/public/js/views/users.js +2 -7
  76. data/public/js/views/variable.js +293 -53
  77. data/public/js/views/variables.js +4 -8
  78. metadata +34 -56
  79. data/.git-hooks/pre_commit/ensure_livescript_compiled.rb +0 -31
  80. data/.overcommit.yml +0 -5
  81. data/compile_ls +0 -6
  82. data/livescript/views/audit.ls +0 -136
  83. data/public/_client_code.html +0 -42
  84. data/public/css/bootstrap.css +0 -7
  85. data/public/fonts/glyphicons-halflings-regular.eot +0 -0
  86. data/public/fonts/glyphicons-halflings-regular.woff +0 -0
  87. data/public/js/lib/JSXTransformer.js +0 -10862
  88. data/public/js/lib/async.js +0 -958
  89. data/public/js/lib/backbone.js +0 -2
  90. data/public/js/lib/bootstrap.js +0 -6
  91. data/public/js/lib/date.extensions.js +0 -141
  92. data/public/js/lib/less.js +0 -16
  93. data/public/js/lib/moment.js +0 -7768
  94. data/public/js/lib/prelude-browser-min.js +0 -1
  95. data/public/js/lib/react-bootstrap.js +0 -5346
  96. data/public/js/lib/react-bootstrap.min.js +0 -4
  97. data/public/js/lib/underscore-min.js +0 -6
  98. data/public/js/lib/underscore.string.min.js +0 -1
  99. data/public/js/main.js +0 -57
  100. data/vendor/prelude-ls/.gitignore +0 -2
  101. data/vendor/prelude-ls/.travis.yml +0 -3
  102. data/vendor/prelude-ls/CHANGELOG.md +0 -81
  103. data/vendor/prelude-ls/LICENSE +0 -22
  104. data/vendor/prelude-ls/Makefile +0 -50
  105. data/vendor/prelude-ls/README.md +0 -15
  106. data/vendor/prelude-ls/browser/prelude-browser-min.js +0 -1
  107. data/vendor/prelude-ls/browser/prelude-browser.js +0 -1172
  108. data/vendor/prelude-ls/lib/Func.js +0 -40
  109. data/vendor/prelude-ls/lib/List.js +0 -602
  110. data/vendor/prelude-ls/lib/Num.js +0 -129
  111. data/vendor/prelude-ls/lib/Obj.js +0 -153
  112. data/vendor/prelude-ls/lib/Str.js +0 -68
  113. data/vendor/prelude-ls/lib/index.js +0 -164
  114. data/vendor/prelude-ls/package.json +0 -50
  115. data/vendor/prelude-ls/package.ls +0 -46
  116. data/vendor/prelude-ls/src/Func.ls +0 -17
  117. data/vendor/prelude-ls/src/List.ls +0 -299
  118. data/vendor/prelude-ls/src/Num.ls +0 -83
  119. data/vendor/prelude-ls/src/Obj.ls +0 -61
  120. data/vendor/prelude-ls/src/Str.ls +0 -32
  121. data/vendor/prelude-ls/src/index.ls +0 -56
  122. data/vendor/prelude-ls/test/Func.ls +0 -36
  123. data/vendor/prelude-ls/test/List.ls +0 -751
  124. data/vendor/prelude-ls/test/Num.ls +0 -258
  125. data/vendor/prelude-ls/test/Obj.ls +0 -145
  126. data/vendor/prelude-ls/test/Prelude.ls +0 -49
  127. data/vendor/prelude-ls/test/Str.ls +0 -208
  128. data/vendor/prelude-ls/test/browser.html +0 -5
@@ -1,67 +1,146 @@
1
1
  /**@jsx React.DOM*/
2
+ /* global conjur, React, jQuery */
2
3
 
3
- var DashboardSearchForm = React.createClass({
4
- mixins: [ conjur.views.mixins.Search ],
5
-
6
- render: function() {
7
- return (
8
- <form id="dashboard-search" className="form-inline search" role="search" onSubmit={this.handleSubmit}>
9
- <div className="form-group">
10
- <input ref="input" type="text" className="form-control" placeholder="Search Conjur" value={this.props.searchText}>
11
- </input>
12
- </div>
13
- <button type="submit" className="btn btn-default search-button">Search</button>
14
- </form>
15
- );
16
- }
17
- });
18
-
19
- var DashboardFrequent = React.createClass({
20
- getInitialState: function() {
21
- return {resources: [], loaded: false}
22
- },
23
-
24
- componentWillMount: function() {
25
- $.get("/api/authz/" + conjur.app.configuration.account + "/resources?owner=" + encodeURIComponent(conjur.app.userId), function(data) {
26
- var filtered_data = data.filter( function(item) {
27
- return item.id.split(':')[1]!="secret"; // assets of 'secret' kind are internal
28
- });
29
- this.setState({resources: filtered_data, loaded: true});
30
- }.bind(this));
31
- },
32
-
33
- render: function() {
34
- var content,
35
- OwnedResourcesBox = conjur.views.OwnedResourcesBox;
36
-
37
- if (this.state.loaded)
38
- content = <OwnedResourcesBox resources={this.state.resources} />
39
- else
40
- content = <span>Loading...</span>
41
-
42
- return <section>
43
- <h3>Owned assets</h3>
44
- {content}
45
- </section>;
46
- }
47
- });
48
-
49
- var Dashboard = React.createClass({
50
- render: function(){
51
- return (
52
- <div className="dashboard">
53
- <div className="row">
54
- <DashboardSearchForm />
55
- </div>
56
- <div className="row summary">
57
- <div className="col-xs-6">
58
- <DashboardFrequent />
59
- </div>
60
- <div className="col-xs-6 audit">
61
- <AuditTable src={'/api/audit/all'} caption={'Recent activity'} compact={true}/>
62
- </div>
63
- </div>
64
- </div>
65
- );
66
- }
67
- });
4
+ (function(conjur, React, $) {
5
+ 'use strict';
6
+
7
+ var Chart = conjur.views.Chart,
8
+ ChartHelperMixin = conjur.views.ChartHelperMixin,
9
+ FoldableAuditSection = conjur.views.FoldableAuditSection;
10
+
11
+ var Activity = React.createClass({
12
+ mixins: [ChartHelperMixin],
13
+
14
+ getDefaultProps: function() {
15
+ return {
16
+ options: {
17
+ legend: {
18
+ slogins: 'Logins',
19
+ ssudo: 'Sudo calls',
20
+ sreads: 'Secret reads',
21
+ supdates: 'Secret updates',
22
+ fsudo: 'Sudo failures',
23
+ freads: 'Secret read failures',
24
+ fupdates: 'Secret update failures',
25
+ fother: 'Other failures'
26
+ },
27
+ axis: {
28
+ y: {
29
+ label: 'Value'
30
+ }
31
+ }
32
+ }
33
+ };
34
+ },
35
+
36
+ getDefaultItem: function() {
37
+ return {
38
+ slogins: 0,
39
+ ssudo: 0,
40
+ fsudo: 0,
41
+ sreads: 0,
42
+ freads: 0,
43
+ supdates: 0,
44
+ fupdates: 0,
45
+ fother: 0
46
+ };
47
+ },
48
+
49
+ getEventType: function(e) {
50
+ if (e.hasOwnProperty('facility') && e.facility === 'ssh') {
51
+ if (e.allowed === true) {
52
+ if (e.action === 'sudo') {
53
+ return 'ssudo';
54
+ }
55
+
56
+ if (e.action === 'login') {
57
+ return 'slogins';
58
+ }
59
+ }
60
+
61
+ if (e.allowed === false) {
62
+ if (e.action === 'sudo') {
63
+ return 'fsudo';
64
+ }
65
+ }
66
+ }
67
+
68
+ if ((e.action === 'check') && e.hasOwnProperty('resource') && e.resource.split(':')[1] === 'variable') {
69
+ if (e.hasOwnProperty('error') || e.allowed === false) {
70
+ if (e.privilege === 'execute') {
71
+ return 'freads';
72
+ }
73
+
74
+ if (e.privilege === 'update') {
75
+ return 'fupdates';
76
+ }
77
+ }
78
+
79
+ if (!e.hasOwnProperty('error') && e.allowed !== false) {
80
+ if (e.privilege === 'execute') {
81
+ return 'sreads';
82
+ }
83
+
84
+ if (e.privilege === 'update') {
85
+ return 'supdates';
86
+ }
87
+ }
88
+ }
89
+
90
+ if (e.hasOwnProperty('error') || e.allowed === false) {
91
+ return 'fother';
92
+ }
93
+
94
+ return null;
95
+ },
96
+
97
+ render: function() {
98
+ var data = this.getData(this.props.audit);
99
+
100
+ return (
101
+ <div className="b-dashboard-activity">
102
+ <h2>Activity</h2>
103
+ <div className="b-dashboard-activity__graph">
104
+ <Chart options={this.props.options}
105
+ data={data} />
106
+ </div>
107
+ </div>
108
+ );
109
+ }
110
+ });
111
+
112
+ this.Dashboard = React.createClass({
113
+ getInitialState: function() {
114
+ return {audit: []};
115
+ },
116
+
117
+ componentWillMount: function() {
118
+ $.get('/api/audit/all',
119
+ function(data) {
120
+ this.setState({audit: data});
121
+ }.bind(this));
122
+ },
123
+
124
+ render: function() {
125
+ return (
126
+ <div className="b-dashboard">
127
+ <Activity audit={this.state.audit} />
128
+ <hr />
129
+ {FoldableAuditSection.warnings(this.state.audit)}
130
+ <hr />
131
+ {FoldableAuditSection.changes(this.state.audit)}
132
+ <hr />
133
+ <AuditTable src="/api/audit/all"
134
+ caption="Recent activity"
135
+ />
136
+ </div>
137
+ );
138
+ }
139
+ });
140
+
141
+ }).bind(conjur.views)
142
+ (
143
+ conjur,
144
+ React,
145
+ jQuery
146
+ );
@@ -1,14 +1,17 @@
1
1
  /** @jsx React.DOM */
2
+ /* global conjur, React, _ */
2
3
 
3
- (function(conjur, React) {
4
+ (function(conjur, React, _) {
4
5
  'use strict';
5
6
 
7
+ var RoleLink = conjur.views.RoleLink;
8
+
6
9
  var GenericListItem = React.createClass({
7
10
  render: function() {
8
- var recordUrl = '/ui/'
9
- + this.props.data.kind
10
- + '/'
11
- + window.encodeURIComponent(this.props.data.record.identifier);
11
+ var recordUrl = '/ui/' +
12
+ this.props.data.kind +
13
+ '/' +
14
+ window.encodeURIComponent(this.props.data.record.identifier);
12
15
 
13
16
  return (
14
17
  <tr>
@@ -25,7 +28,7 @@
25
28
  }
26
29
  });
27
30
 
28
- var GenericList = this.GenericList = React.createClass({
31
+ this.GenericList = React.createClass({
29
32
  getInitialState: function() {
30
33
  return {
31
34
  sort: {
@@ -53,7 +56,7 @@
53
56
 
54
57
  var order = (this.state.sort.order === 'asc') ? 'desc' : 'asc';
55
58
 
56
- if (this.state.sort.column != column) {
59
+ if (this.state.sort.column !== column) {
57
60
  order = this.state.columns[column].defaultSortOrder;
58
61
  }
59
62
 
@@ -74,7 +77,10 @@
74
77
  });
75
78
 
76
79
  items = _.sortBy(items, this.state.sort.column);
77
- if (this.state.sort.order === 'desc') items.reverse();
80
+
81
+ if (this.state.sort.order === 'desc') {
82
+ items.reverse();
83
+ }
78
84
 
79
85
  var rows = items.map(function (o) {
80
86
  var componentName = _.str.capitalize(
@@ -111,5 +117,6 @@
111
117
  }).bind(conjur.views)
112
118
  (
113
119
  conjur,
114
- React
120
+ React,
121
+ _
115
122
  );
@@ -1,61 +1,109 @@
1
1
  /** @jsx React.DOM */
2
+ /* global conjur, React, ReactBootstrap, _ */
2
3
 
3
- var Group = React.createClass({
4
- mixins: [conjur.views.mixins.Tab],
5
- render: function() {
6
- var members = this.props.data.members.map(function (member) {
7
- return <li className="list-group-item list-group-item-noborder">
8
- <RoleLink id={member.member} />
9
- </li>
10
- }.bind(this));
11
- var resourceId = [ conjur.app.configuration.account, 'group', this.props.data.group.id ].join(':')
12
- var group = this.props.data.group;
13
-
14
-
15
- // TODO: refactor (common code should go to mixins)
16
- // TODO: memberships
17
- // TODO: controls for members management
18
- var overview_tab =
19
- <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
+ Breadcrumbs = conjur.views.Breadcrumbs,
12
+ RoleLink = conjur.views.RoleLink;
13
+
14
+ this.Group = React.createClass({
15
+ mixins: [Tab],
16
+
17
+ render: function() {
18
+ var data = this.props.data;
19
+
20
+ var members = data.members.map(function(member) {
21
+ return (
22
+ <li className="list-group-item list-group-item-noborder">
23
+ <RoleLink id={member.member} />
24
+ </li>
25
+ );
26
+ });
27
+
28
+ var resourceId = [
29
+ conjur.app.configuration.account,
30
+ 'group',
31
+ data.group.id
32
+ ].join(':');
33
+
34
+ var group = data.group;
35
+
36
+ // TODO: refactor (common code should go to mixins)
37
+ // TODO: memberships
38
+ // TODO: controls for members management
39
+ var overviewTab =(
40
+ <TabPane key="overview" tab="Overview">
20
41
  <dl className="dl-horizontal">
21
42
  <dt>Created by</dt>
22
- <dd><RoleLink id={group.userid}/></dd>
43
+ <dd><RoleLink id={group.userid} /></dd>
44
+
23
45
  <dt>Owner</dt>
24
- <dd><RoleLink id={this.props.data.group.ownerid}/></dd>
46
+ <dd><RoleLink id={data.owner} /></dd>
25
47
  </dl>
26
- </TabPane>;
27
- var members_tab =
28
- <TabPane key="members" tab={get_tabname("Members",members)}>
29
- <ul className="list-group">
30
- {members}
31
- </ul>
32
- </TabPane>;
33
- var owned_tab = this.owned_tab();
34
- var memberships_tab = this.memberships_tab(group.roleid);
35
- var permissions_tab = this.permissions_tab(group.roleid);
36
- var annotations_tab = this.annotations_tab();
37
-
38
- var audit_tab =
39
- <TabPane key="audit" tab="Recent Activity">
40
- <div className="audit auditGroup">
41
- <AuditBox roles={[resourceId]} resources={[resourceId]} tabview={true}/>
42
- </div>
43
- </TabPane>;
44
-
45
- <TabPane key="annotations" tab={get_tabname("Annotations",this.props.data.annotations)}>
46
- <AnnotationsBox annotations={this.props.data.annotations}/>
47
- </TabPane>;
48
-
49
- var tabs = _.compact([overview_tab, members_tab, owned_tab, memberships_tab,
50
- permissions_tab, annotations_tab, audit_tab]);
51
-
52
- return (
53
- <div className="group">
54
- <h2>Group {this.props.data.group.id}</h2>
55
- <TabbedArea defaultActiveKey="overview">
56
- {tabs}
57
- </TabbedArea>
58
- </div>
59
- );
60
- }
61
- });
48
+ </TabPane>
49
+ );
50
+
51
+ var membersTab = (
52
+ <TabPane key="members" tab={conjur.utils.getTabname('Members', members)}>
53
+ <ul className="list-group">
54
+ {members}
55
+ </ul>
56
+ </TabPane>
57
+ );
58
+
59
+ var ownedTab = this.ownedTab(),
60
+ membershipsTab = this.membershipsTab(group.roleid),
61
+ permissionsTab = this.permissionsTab(group.roleid),
62
+ annotationsTab = this.annotationsTab();
63
+
64
+ var auditTab = (
65
+ <TabPane key="audit" tab="Recent Activity">
66
+ <div className="audit auditGroup">
67
+ <AuditBox roles={[resourceId]}
68
+ resources={[resourceId]}
69
+ tabview={true} />
70
+ </div>
71
+ </TabPane>
72
+ );
73
+
74
+ var tabs = _.compact([
75
+ overviewTab,
76
+ membersTab,
77
+ ownedTab,
78
+ membershipsTab,
79
+ permissionsTab,
80
+ annotationsTab,
81
+ auditTab
82
+ ]);
83
+
84
+ var elems = [
85
+ {url: '/ui/groups', text: 'Groups'},
86
+ {url: '', text: this.props.data.group.id},
87
+ {url: '', text: '(owned by ' + this.props.data.group.ownerid + ')'}
88
+ ];
89
+
90
+ return (
91
+ <div className="b-group">
92
+ <Breadcrumbs elems={elems} />
93
+ <hr />
94
+ <h2>Group {data.group.id}</h2>
95
+ <TabbedArea defaultActiveKey="overview">
96
+ {tabs}
97
+ </TabbedArea>
98
+ </div>
99
+ );
100
+ }
101
+ });
102
+
103
+ }).bind(conjur.views)
104
+ (
105
+ conjur,
106
+ React,
107
+ ReactBootstrap,
108
+ _
109
+ );
@@ -1,22 +1,18 @@
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 GroupBox = this.GroupBox = React.createClass({
9
- /*getInitialState: function() {
10
- return { currentNamespace: "", members: [] };
11
- },*/
9
+ this.GroupBox = React.createClass({
12
10
  render: function() {
13
- //<NamespaceFilter currentNamespace={this.props.currentNamespace}
14
- // namespaces={this.props.data.namespaces} />
15
11
  return (
16
12
  <div className="groupBox">
17
13
  <div className="groupList">
18
14
  <h2>Groups</h2>
19
- <GenericList data={{kind: "groups", members: this.props.data.members}} />
15
+ <GenericList data={{kind: 'groups', members: this.props.data.members}} />
20
16
  </div>
21
17
  </div>
22
18
  );