conjur-asset-ui 1.4.2 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +8 -3
- data/CHANGELOG.md +10 -0
- data/Makefile +19 -0
- data/README.md +0 -3
- data/Rakefile +22 -17
- data/TODO.md +0 -23
- data/app/.csscomb.json +304 -0
- data/app/.eslintignore +3 -0
- data/app/.eslintrc +265 -0
- data/app/config/preprocessor.js +19 -0
- data/app/config/webpack.js +124 -0
- data/app/gulpfile.js +96 -0
- data/app/package.json +86 -0
- data/app/src/actions.js +550 -0
- data/app/src/app.js +83 -0
- data/app/src/clients/audit.js +34 -0
- data/app/src/clients/auth.js +24 -0
- data/app/src/clients/generic.js +52 -0
- data/app/src/clients/graph.js +7 -0
- data/app/src/clients/layer_members.js +18 -0
- data/app/src/clients/list.js +31 -0
- data/app/src/clients/members.js +20 -0
- data/app/src/clients/request.js +531 -0
- data/app/src/clients/search.js +5 -0
- data/app/src/components/app/__tests__/app-test.js +22 -0
- data/app/src/components/app/app.js +36 -0
- data/app/src/components/app/wrapper.js +17 -0
- data/app/src/components/audit/__tests__/table_header-test.js +22 -0
- data/app/src/components/audit/box.js +9 -0
- data/app/src/components/audit/constants.js +5 -0
- data/app/src/components/audit/entry.js +105 -0
- data/app/src/components/audit/fields_mixin.js +11 -0
- data/app/src/components/audit/humanize_event.js +213 -0
- data/app/src/components/audit/table.js +64 -0
- data/app/src/components/audit/table_header.js +37 -0
- data/app/src/components/audit/timestamp.js +28 -0
- data/app/src/components/auth/login.js +177 -0
- data/app/src/components/auth/login.less +71 -0
- data/app/src/components/auth/logout.js +42 -0
- data/app/src/components/auth/logout.less +21 -0
- data/app/src/components/chart/chart.js +540 -0
- data/app/src/components/chart/chart_helper_mixin.js +78 -0
- data/app/src/components/custom/list.js +3 -0
- data/app/src/components/custom/view.js +81 -0
- data/app/src/components/dashboard/activity.js +144 -0
- data/app/src/components/dashboard/dashboard.js +46 -0
- data/app/src/components/flash/flash.js +98 -0
- data/app/src/components/flash/flash.less +3 -0
- data/app/src/components/generic/__tests__/time-test.js +42 -0
- data/app/src/components/generic/annotations.js +39 -0
- data/app/src/components/generic/breadcrumbs.js +57 -0
- data/app/src/components/generic/foldable_audit_section.js +204 -0
- data/app/src/components/generic/list.js +141 -0
- data/app/src/components/generic/list_factory.js +41 -0
- data/app/src/components/generic/resource_link.js +64 -0
- data/app/src/components/generic/role_link.js +66 -0
- data/app/src/components/generic/tab_mixin.js +146 -0
- data/app/src/components/generic/time.js +32 -0
- data/app/src/components/graph/__tests__/collapse-test.js +133 -0
- data/app/src/components/graph/__tests__/edges-from-vertices-test.js +48 -0
- data/app/src/components/graph/__tests__/new-vertex-set-test.js +16 -0
- data/app/src/components/graph/__tests__/next-id-test.js +27 -0
- data/app/src/components/graph/__tests__/role-kind-from-id-test.js +24 -0
- data/app/src/components/graph/__tests__/vertices-from-edges-test.js +72 -0
- data/app/src/components/graph/graph.js +449 -0
- data/app/src/components/graph/graph.less +39 -0
- data/app/src/components/graph/helpers.js +368 -0
- data/app/src/components/group/list.js +3 -0
- data/app/src/components/group/view.js +153 -0
- data/app/src/components/host/activity.js +111 -0
- data/app/src/components/host/details.js +28 -0
- data/app/src/components/host/executors.js +77 -0
- data/app/src/components/host/host_link.js +18 -0
- data/app/src/components/host/list.js +3 -0
- data/app/src/components/host/updaters.js +77 -0
- data/app/src/components/host/view.js +145 -0
- data/app/src/components/layer/list.js +3 -0
- data/app/src/components/layer/view.js +197 -0
- data/app/src/components/navbar/__tests__/navbar-test.js +21 -0
- data/app/src/components/navbar/nav_search_form.js +40 -0
- data/app/src/components/navbar/navbar.js +96 -0
- data/app/src/components/notfound/notfound.js +35 -0
- data/app/src/components/notfound/notfound.less +21 -0
- data/app/src/components/owned_resources/owned_resources.js +84 -0
- data/app/src/components/owned_resources/owned_resources_box.js +101 -0
- data/app/src/components/permissions/permissions.js +138 -0
- data/app/src/components/permissions/permissions_table.js +101 -0
- data/app/src/components/policy/list.js +3 -0
- data/app/src/components/policy/view.js +107 -0
- data/app/src/components/refresh/refresh.js +29 -0
- data/app/src/components/refresh/refresh.less +15 -0
- data/app/src/components/search/group.js +43 -0
- data/app/src/components/search/group_heading.js +50 -0
- data/app/src/components/search/group_title.js +37 -0
- data/app/src/components/search/result_item.js +55 -0
- data/app/src/components/search/search.js +118 -0
- data/app/src/components/user/activity.js +112 -0
- data/app/src/components/user/details.js +30 -0
- data/app/src/components/user/list.js +3 -0
- data/app/src/components/user/pubkeys.js +118 -0
- data/app/src/components/user/pubkeys.less +56 -0
- data/app/src/components/user/view.js +143 -0
- data/app/src/components/variable/activity.js +101 -0
- data/app/src/components/variable/details.js +46 -0
- data/app/src/components/variable/fetchers.js +77 -0
- data/app/src/components/variable/list.js +3 -0
- data/app/src/components/variable/updaters.js +77 -0
- data/app/src/components/variable/view.js +115 -0
- data/app/src/constants.js +36 -0
- data/{public → app/src}/images/conjur-logo.svg +0 -0
- data/{public → app/src}/images/icon-client-pc.svg +0 -0
- data/{public → app/src}/images/icon-environment.png +0 -0
- data/{public → app/src}/images/icon-person.svg +0 -0
- data/{public → app/src}/images/icon-policy.png +0 -0
- data/{public → app/src}/images/icon-resource.png +0 -0
- data/{public → app/src}/images/icon-service-dots.svg +0 -0
- data/{public → app/src}/images/icon-variable.png +0 -0
- data/app/src/pages/index.html +27 -0
- data/app/src/routes.js +64 -0
- data/app/src/stores/app_store.js +35 -0
- data/app/src/stores/audit_store.js +143 -0
- data/app/src/stores/graph_store.js +51 -0
- data/app/src/stores/group_store.js +104 -0
- data/app/src/stores/host_store.js +111 -0
- data/app/src/stores/layer_store.js +115 -0
- data/app/src/stores/policy_store.js +88 -0
- data/app/src/stores/resources_store.js +115 -0
- data/app/src/stores/route_store.js +21 -0
- data/app/src/stores/search_store.js +77 -0
- data/app/src/stores/user_store.js +109 -0
- data/app/src/stores/variable_store.js +93 -0
- data/app/src/styles/bootstrap.less +54 -0
- data/{public/css → app/src/styles}/styles.less +26 -82
- data/app/src/utils.js +38 -0
- data/app/src/vendor/pace.js +2 -0
- data/conjur-asset-ui.gemspec +3 -4
- data/docker/assets-build/Dockerfile +12 -0
- data/docker/conjur-ui/Dockerfile +33 -0
- data/docker/conjur-ui/README.md +38 -0
- data/docker/conjur-ui/mime.types +90 -0
- data/docker/conjur-ui/nginx.conf +110 -0
- data/docker/conjur-ui/start.py +72 -0
- data/docker/conjur-ui/start.sh +18 -0
- data/docker/conjur-ui/test.env +8 -0
- data/lib/conjur-asset-ui-version.rb +1 -1
- data/lib/conjur/command/ui.rb +10 -2
- data/lib/conjur/webserver/home.rb +3 -3
- data/lib/conjur/webserver/login.rb +1 -1
- data/lib/conjur/webserver/server.rb +16 -4
- data/public/js/views/roleGraph.js +91 -0
- metadata +167 -105
- data/.jshintrc +0 -41
- data/bower.json +0 -98
- data/gulpfile.js +0 -139
- data/package.json +0 -47
- data/preprocessor.js +0 -7
- data/public/_client_libs.html +0 -9
- data/public/index.html.erb +0 -63
- data/public/js/init.js +0 -196
- data/public/js/lib/pace.js +0 -2
- data/public/js/lib/sorted-set.no-require.js +0 -1145
- data/public/js/lib/sorted-set.no-require.js.txt +0 -6
- data/public/js/models/groupRecord.js +0 -72
- data/public/js/models/hostRecord.js +0 -60
- data/public/js/models/layerRecord.js +0 -79
- data/public/js/models/namespace.js +0 -12
- data/public/js/models/policyList.js +0 -16
- data/public/js/models/policyRecord.js +0 -54
- data/public/js/models/record.js +0 -117
- data/public/js/models/resourceList.js +0 -87
- data/public/js/models/userList.js +0 -25
- data/public/js/models/userRecord.js +0 -75
- data/public/js/models/variableList.js +0 -27
- data/public/js/models/variableRecord.js +0 -77
- data/public/js/routers.js +0 -242
- data/public/js/views/annotations.js +0 -47
- data/public/js/views/audit.js +0 -369
- data/public/js/views/breadcrumbs.js +0 -62
- data/public/js/views/chart.js +0 -617
- data/public/js/views/dashboard.js +0 -146
- data/public/js/views/generic.js +0 -122
- data/public/js/views/group.js +0 -109
- data/public/js/views/groups.js +0 -26
- data/public/js/views/host.js +0 -200
- data/public/js/views/hosts.js +0 -26
- data/public/js/views/layer.js +0 -146
- data/public/js/views/layers.js +0 -26
- data/public/js/views/mixins/search.js +0 -22
- data/public/js/views/mixins/tabs.js +0 -154
- data/public/js/views/namespaces.js +0 -40
- data/public/js/views/navSearch.js +0 -36
- data/public/js/views/owned.js +0 -184
- data/public/js/views/permissions.js +0 -254
- data/public/js/views/policies.js +0 -26
- data/public/js/views/policy.js +0 -70
- data/public/js/views/resource.js +0 -59
- data/public/js/views/role.js +0 -63
- data/public/js/views/searchResults.js +0 -212
- data/public/js/views/sections.js +0 -226
- data/public/js/views/time.js +0 -39
- data/public/js/views/user.js +0 -297
- data/public/js/views/users.js +0 -26
- data/public/js/views/variable.js +0 -310
- data/public/js/views/variables.js +0 -26
- data/spec/javascripts/helpers/.gitkeep +0 -0
- data/spec/javascripts/support/jasmine.yml +0 -112
- data/spec/javascripts/support/jasmine_helper.rb +0 -22
- data/spec/javascripts/support/run.html.erb +0 -23
- data/spec/javascripts/views/AuditSpec.js +0 -22
- data/spec/javascripts/views/AuditSpec.ls +0 -18
@@ -0,0 +1,64 @@
|
|
1
|
+
var React = require('react'),
|
2
|
+
update = require('react/lib/update');
|
3
|
+
|
4
|
+
import {sortByOrder} from 'lodash';
|
5
|
+
|
6
|
+
var AuditEntry = require('./entry'),
|
7
|
+
AuditTableHeader = require('./table_header'),
|
8
|
+
Refresh = require('../refresh/refresh');
|
9
|
+
|
10
|
+
export default React.createClass({
|
11
|
+
displayName: 'AuditTable',
|
12
|
+
|
13
|
+
propTypes: {
|
14
|
+
caption: React.PropTypes.string,
|
15
|
+
compact: React.PropTypes.bool,
|
16
|
+
events: React.PropTypes.array,
|
17
|
+
isLoading: React.PropTypes.bool
|
18
|
+
},
|
19
|
+
|
20
|
+
getDefaultProps() {
|
21
|
+
return {
|
22
|
+
caption: 'Audit',
|
23
|
+
compact: false,
|
24
|
+
events: [],
|
25
|
+
isLoading: false
|
26
|
+
};
|
27
|
+
},
|
28
|
+
|
29
|
+
render() {
|
30
|
+
var entries = sortByOrder(this.props.events, ['id'], [false]).map((event) => {
|
31
|
+
// new way to clone objects, custom clone$ does not work no more as expected
|
32
|
+
var args = update(event, {
|
33
|
+
$merge: {
|
34
|
+
key: event.id,
|
35
|
+
compact: this.props.compact
|
36
|
+
}
|
37
|
+
});
|
38
|
+
|
39
|
+
return (
|
40
|
+
<AuditEntry {...args} />
|
41
|
+
);
|
42
|
+
});
|
43
|
+
|
44
|
+
var title;
|
45
|
+
|
46
|
+
if (this.props.caption !== '') {
|
47
|
+
title = (
|
48
|
+
<h3>{this.props.caption}<Refresh show={this.props.isLoading} /></h3>
|
49
|
+
);
|
50
|
+
}
|
51
|
+
|
52
|
+
return (
|
53
|
+
<section className="audit">
|
54
|
+
{title}
|
55
|
+
<table className="audit-table">
|
56
|
+
<AuditTableHeader key="thead" compact={this.props.compact} />
|
57
|
+
<tbody key="tbody">
|
58
|
+
{entries}
|
59
|
+
</tbody>
|
60
|
+
</table>
|
61
|
+
</section>
|
62
|
+
);
|
63
|
+
}
|
64
|
+
});
|
@@ -0,0 +1,37 @@
|
|
1
|
+
var React = require('react');
|
2
|
+
|
3
|
+
import {map} from 'lodash';
|
4
|
+
|
5
|
+
var FieldsMixin = require('./fields_mixin');
|
6
|
+
|
7
|
+
export default React.createClass({
|
8
|
+
displayName: 'AuditTableHeader',
|
9
|
+
|
10
|
+
mixins: [FieldsMixin],
|
11
|
+
|
12
|
+
propTypes: {
|
13
|
+
compact: React.PropTypes.bool
|
14
|
+
},
|
15
|
+
|
16
|
+
getDefaultProps() {
|
17
|
+
return {
|
18
|
+
compact: false
|
19
|
+
};
|
20
|
+
},
|
21
|
+
|
22
|
+
render() {
|
23
|
+
var items = map(this.fields(), (field) => {
|
24
|
+
return (
|
25
|
+
<th key={field}>{field.replace('auditview_', '').replace('_', ' ')}</th>
|
26
|
+
);
|
27
|
+
});
|
28
|
+
|
29
|
+
return (
|
30
|
+
<thead>
|
31
|
+
<tr>
|
32
|
+
{items}
|
33
|
+
</tr>
|
34
|
+
</thead>
|
35
|
+
);
|
36
|
+
}
|
37
|
+
});
|
@@ -0,0 +1,28 @@
|
|
1
|
+
var React = require('react'),
|
2
|
+
moment = require('moment');
|
3
|
+
|
4
|
+
export default React.createClass({
|
5
|
+
displayName: 'AuditTimestamp',
|
6
|
+
|
7
|
+
propTypes: {
|
8
|
+
time: React.PropTypes.string
|
9
|
+
},
|
10
|
+
|
11
|
+
getDefaultProps() {
|
12
|
+
return {
|
13
|
+
time: '1970-01-01T00:00:00.000Z'
|
14
|
+
};
|
15
|
+
},
|
16
|
+
|
17
|
+
render() {
|
18
|
+
var ts = moment(this.props.time);
|
19
|
+
|
20
|
+
return (
|
21
|
+
<time className="timestamp"
|
22
|
+
dateTime={ts.format()}
|
23
|
+
title={ts.calendar()}>
|
24
|
+
{ts.fromNow()}
|
25
|
+
</time>
|
26
|
+
);
|
27
|
+
}
|
28
|
+
});
|
@@ -0,0 +1,177 @@
|
|
1
|
+
import React, {Component, PropTypes} from 'react';
|
2
|
+
import {readCookie} from '../../utils';
|
3
|
+
|
4
|
+
import './login.less';
|
5
|
+
|
6
|
+
export class Login extends Component {
|
7
|
+
constructor() {
|
8
|
+
super();
|
9
|
+
this.handleChange = this.handleChange.bind(this);
|
10
|
+
this.handleSubmit = this.handleSubmit.bind(this);
|
11
|
+
this.onLoginSuccess = this.onLoginSuccess.bind(this);
|
12
|
+
this.onLoginError = this.onLoginError.bind(this);
|
13
|
+
this.state = {
|
14
|
+
error: false,
|
15
|
+
isSubmiting: false,
|
16
|
+
applianceUrl: readCookie('conjur_appliance_url') || document.location.origin,
|
17
|
+
username: readCookie('conjur_username') || '',
|
18
|
+
password: readCookie('conjur_password') || ''
|
19
|
+
};
|
20
|
+
}
|
21
|
+
|
22
|
+
componentDidMount() {
|
23
|
+
const rmanager = this.context.flux.actions.getRManager();
|
24
|
+
|
25
|
+
if (rmanager.isLogged) {
|
26
|
+
this.redirect();
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
onLoginSuccess() {
|
31
|
+
const rmanager = this.context.flux.actions.getRManager();
|
32
|
+
|
33
|
+
if (rmanager.isLogged) {
|
34
|
+
this.redirect();
|
35
|
+
}
|
36
|
+
|
37
|
+
this.setState({error: false, isSubmiting: false});
|
38
|
+
}
|
39
|
+
|
40
|
+
onLoginError() {
|
41
|
+
this.setState({error: true, isSubmiting: false});
|
42
|
+
}
|
43
|
+
|
44
|
+
handleChange(e) {
|
45
|
+
e.preventDefault();
|
46
|
+
|
47
|
+
this.setState({
|
48
|
+
username: this.refs.username.getDOMNode().value,
|
49
|
+
password: this.refs.password.getDOMNode().value
|
50
|
+
});
|
51
|
+
}
|
52
|
+
|
53
|
+
handleSubmit(e) {
|
54
|
+
e.preventDefault();
|
55
|
+
|
56
|
+
if (!this.state.isSubmiting) {
|
57
|
+
const rmanager = this.context.flux.actions.getRManager();
|
58
|
+
|
59
|
+
rmanager
|
60
|
+
.login(
|
61
|
+
this.state.applianceUrl,
|
62
|
+
this.state.username,
|
63
|
+
this.state.password
|
64
|
+
)
|
65
|
+
.then(
|
66
|
+
(isSuccess) => {
|
67
|
+
if (isSuccess) {
|
68
|
+
this.onLoginSuccess();
|
69
|
+
} else {
|
70
|
+
this.onLoginError();
|
71
|
+
}
|
72
|
+
}
|
73
|
+
);
|
74
|
+
this.setState({isSubmiting: true});
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
redirect() {
|
79
|
+
let {router} = this.context,
|
80
|
+
returnTo = router.getCurrentQuery().returnTo || '/ui';
|
81
|
+
|
82
|
+
window.setTimeout(() => {
|
83
|
+
router.replaceWith(returnTo);
|
84
|
+
}, 1);
|
85
|
+
}
|
86
|
+
|
87
|
+
render() {
|
88
|
+
const error = this.state.error === true && (<p>Bad login information</p>);
|
89
|
+
|
90
|
+
return (
|
91
|
+
<div className="b-login">
|
92
|
+
<div className="b-login--row">
|
93
|
+
<div className="container-fluid b-login--grid">
|
94
|
+
<div className="row">
|
95
|
+
<div className="col-sm-12">
|
96
|
+
<div className="b-login--wrapper">
|
97
|
+
<div className="b-login--inner-wrapper">
|
98
|
+
<div className="b-login__box">
|
99
|
+
<div className="b-login__title-box text-center">
|
100
|
+
<h3 className="b-login__title">
|
101
|
+
Sign in to Conjur
|
102
|
+
</h3>
|
103
|
+
</div>
|
104
|
+
<div>
|
105
|
+
<div className="b-login__fields">
|
106
|
+
<div className="login-info">
|
107
|
+
Login to <strong>{this.state.applianceUrl}</strong> server
|
108
|
+
</div>
|
109
|
+
<form role="form" autoComplete="off">
|
110
|
+
<div className="form-group">
|
111
|
+
<div className="input-group input-group-lg">
|
112
|
+
<div className="input-group-addon">
|
113
|
+
<span className="glyphicon glyphicon-user" aria-hidden="true"></span>
|
114
|
+
</div>
|
115
|
+
<input className="form-control"
|
116
|
+
type="text"
|
117
|
+
placeholder="user name"
|
118
|
+
ref="username"
|
119
|
+
onChange={this.handleChange}
|
120
|
+
value={this.state.username}
|
121
|
+
disabled={this.state.isSubmiting} />
|
122
|
+
</div>
|
123
|
+
</div>
|
124
|
+
<div className="form-group">
|
125
|
+
<div className="input-group input-group-lg">
|
126
|
+
<div className="input-group-addon">
|
127
|
+
<span className="glyphicon glyphicon-pencil" aria-hidden="true"></span>
|
128
|
+
</div>
|
129
|
+
<input className="form-control"
|
130
|
+
type="password"
|
131
|
+
placeholder="password"
|
132
|
+
ref="password"
|
133
|
+
onChange={this.handleChange}
|
134
|
+
value={this.state.password}
|
135
|
+
disabled={this.state.isSubmiting} />
|
136
|
+
</div>
|
137
|
+
</div>
|
138
|
+
<div className="form-group">
|
139
|
+
<div className="container-fluid">
|
140
|
+
<div className="row">
|
141
|
+
<div className="col-xs-8">
|
142
|
+
{error}
|
143
|
+
</div>
|
144
|
+
<div className="col-xs-4 text-right"
|
145
|
+
style={{paddingRight: '0'}}>
|
146
|
+
<button role="button"
|
147
|
+
className="btn b-login__btn"
|
148
|
+
type="submit"
|
149
|
+
onClick={this.handleSubmit}
|
150
|
+
disabled={this.state.isSubmiting}>
|
151
|
+
Login
|
152
|
+
</button>
|
153
|
+
</div>
|
154
|
+
</div>
|
155
|
+
</div>
|
156
|
+
</div>
|
157
|
+
</form>
|
158
|
+
</div>
|
159
|
+
</div>
|
160
|
+
</div>
|
161
|
+
</div>
|
162
|
+
</div>
|
163
|
+
</div>
|
164
|
+
</div>
|
165
|
+
</div>
|
166
|
+
</div>
|
167
|
+
</div>
|
168
|
+
);
|
169
|
+
}
|
170
|
+
}
|
171
|
+
|
172
|
+
Login.displayName = 'AuthLogin';
|
173
|
+
|
174
|
+
Login.contextTypes = {
|
175
|
+
flux: PropTypes.object,
|
176
|
+
router: PropTypes.func
|
177
|
+
};
|
@@ -0,0 +1,71 @@
|
|
1
|
+
.b-login {
|
2
|
+
top: 0;
|
3
|
+
left: 0;
|
4
|
+
right: 0;
|
5
|
+
bottom: 0;
|
6
|
+
display: block;
|
7
|
+
overflow: auto;
|
8
|
+
position: fixed;
|
9
|
+
background: #43525A;
|
10
|
+
}
|
11
|
+
|
12
|
+
.b-login--row {
|
13
|
+
margin: 50px auto auto;
|
14
|
+
}
|
15
|
+
|
16
|
+
.b-login--grid {
|
17
|
+
width: 500px;
|
18
|
+
}
|
19
|
+
|
20
|
+
.b-login--wrapper {
|
21
|
+
position: relative;
|
22
|
+
}
|
23
|
+
|
24
|
+
.b-login--inner-wrapper {
|
25
|
+
background: #fff;
|
26
|
+
overflow: hidden;
|
27
|
+
position: relative;
|
28
|
+
border-radius: 8px;
|
29
|
+
margin-bottom: 25px;
|
30
|
+
}
|
31
|
+
|
32
|
+
.b-login__title-box {
|
33
|
+
color: white;
|
34
|
+
background: #4A90E2;
|
35
|
+
}
|
36
|
+
|
37
|
+
.b-login__box {
|
38
|
+
padding: 0;
|
39
|
+
}
|
40
|
+
|
41
|
+
.b-login__title {
|
42
|
+
margin: 0;
|
43
|
+
padding: 25px;
|
44
|
+
}
|
45
|
+
|
46
|
+
.b-login__fields {
|
47
|
+
padding: 25px;
|
48
|
+
paddingTop: 0;
|
49
|
+
paddingBottom: 0;
|
50
|
+
margin: auto;
|
51
|
+
marginBottom: 25px;
|
52
|
+
marginTop: 25px;
|
53
|
+
}
|
54
|
+
|
55
|
+
.b-login__btn {
|
56
|
+
color: #79B0EC;
|
57
|
+
background: 0 0;
|
58
|
+
line-height: 1.78571;
|
59
|
+
padding: 10px 25px;
|
60
|
+
border-radius: 20px;
|
61
|
+
border: 2px solid;
|
62
|
+
-webkit-transition: all .2s;
|
63
|
+
transition: all .2s;
|
64
|
+
text-transform: uppercase;
|
65
|
+
line-height: 1.78571;
|
66
|
+
}
|
67
|
+
|
68
|
+
.login-info {
|
69
|
+
padding-bottom: 25px;
|
70
|
+
font-size: 14px;
|
71
|
+
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
import React, {Component} from 'react';
|
2
|
+
|
3
|
+
import './logout.less';
|
4
|
+
|
5
|
+
export class Logout extends Component {
|
6
|
+
componentDidMount() {
|
7
|
+
this.context.flux.actions.getRManager().logout();
|
8
|
+
}
|
9
|
+
|
10
|
+
render() {
|
11
|
+
return (
|
12
|
+
<div className="container-fluid b-logout">
|
13
|
+
<div className="row b-logout--row">
|
14
|
+
<div className="col-md-12">
|
15
|
+
<div className="error-template">
|
16
|
+
<h1>
|
17
|
+
Goodbye!
|
18
|
+
</h1>
|
19
|
+
<h2>
|
20
|
+
See you next time
|
21
|
+
</h2>
|
22
|
+
<div className="error-details">
|
23
|
+
You have logged out from the Conjur. Feel free go to the login screen and signin again.
|
24
|
+
</div>
|
25
|
+
<div className="b-logout--actions">
|
26
|
+
<a href="/ui" className="btn btn-primary btn-lg">
|
27
|
+
<span className="glyphicon glyphicon-console"></span> Take me to the login screen again
|
28
|
+
</a>
|
29
|
+
</div>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
);
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
Logout.displayName = 'AuthLogout';
|
39
|
+
|
40
|
+
Logout.contextTypes = {
|
41
|
+
flux: React.PropTypes.object
|
42
|
+
};
|
@@ -0,0 +1,21 @@
|
|
1
|
+
.b-logout {
|
2
|
+
top: 0;
|
3
|
+
left: 0;
|
4
|
+
right: 0;
|
5
|
+
bottom: 0;
|
6
|
+
display: block;
|
7
|
+
overflow: auto;
|
8
|
+
position: fixed;
|
9
|
+
background: #43525A;
|
10
|
+
color: white;
|
11
|
+
}
|
12
|
+
|
13
|
+
.b-logout--row {
|
14
|
+
margin: 50px auto auto;
|
15
|
+
margin-top: 70px;
|
16
|
+
margin-left: 70px !important;
|
17
|
+
}
|
18
|
+
|
19
|
+
.b-logout--actions {
|
20
|
+
margin-top: 10px;
|
21
|
+
}
|