conjur-asset-ui 1.3.0 → 1.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.jshintrc +41 -0
- data/Gemfile +3 -1
- data/README.md +34 -0
- data/Rakefile +69 -1
- data/bower.json +93 -0
- data/conjur-asset-ui.gemspec +1 -1
- data/features/navigation_bar.feature +31 -0
- data/features/step_definitions/custom_step.rb +32 -0
- data/features/support/env.rb +38 -0
- data/features/support/hooks.rb +30 -0
- data/features/support/world.rb +17 -0
- data/gulpfile.js +140 -0
- data/lib/conjur/command/ui.rb +1 -1
- data/lib/conjur/webserver/server.rb +14 -9
- data/lib/conjur-asset-ui-version.rb +1 -1
- data/package.json +47 -0
- data/preprocessor.js +7 -0
- data/public/_client_libs.html +2 -15
- data/public/css/styles.less +170 -4
- data/public/index.html.erb +5 -7
- data/public/js/init.js +183 -97
- data/public/js/lib/sorted-set.no-require.js +3 -28
- data/public/js/models/groupRecord.js +12 -11
- data/public/js/models/hostRecord.js +6 -7
- data/public/js/models/layerRecord.js +12 -11
- data/public/js/models/namespace.js +2 -0
- data/public/js/models/policyList.js +3 -1
- data/public/js/models/policyRecord.js +6 -7
- data/public/js/models/record.js +24 -23
- data/public/js/models/resourceList.js +28 -10
- data/public/js/models/userList.js +7 -2
- data/public/js/models/userRecord.js +7 -8
- data/public/js/models/variableList.js +18 -7
- data/public/js/models/variableRecord.js +13 -12
- data/public/js/routers.js +72 -26
- data/public/js/views/annotations.js +38 -27
- data/public/js/views/audit.js +23 -17
- data/public/js/views/chart.js +471 -0
- data/public/js/views/dashboard.js +94 -58
- data/public/js/views/generic.js +16 -9
- data/public/js/views/group.js +94 -55
- data/public/js/views/groups.js +3 -7
- data/public/js/views/host.js +75 -44
- data/public/js/views/hosts.js +2 -6
- data/public/js/views/layer.js +127 -82
- data/public/js/views/layers.js +2 -6
- data/public/js/views/mixins/search.js +12 -5
- data/public/js/views/mixins/tabs.js +95 -55
- data/public/js/views/navSearch.js +16 -5
- data/public/js/views/owned.js +14 -8
- data/public/js/views/permissions.js +244 -178
- data/public/js/views/policies.js +2 -4
- data/public/js/views/policy.js +65 -38
- data/public/js/views/resource.js +49 -34
- data/public/js/views/role.js +52 -37
- data/public/js/views/searchResults.js +205 -138
- data/public/js/views/time.js +26 -13
- data/public/js/views/user.js +178 -55
- data/public/js/views/users.js +2 -7
- data/public/js/views/variable.js +226 -45
- data/public/js/views/variables.js +4 -8
- metadata +20 -20
- data/public/_client_code.html +0 -42
- data/public/css/bootstrap.css +0 -7
- data/public/fonts/glyphicons-halflings-regular.eot +0 -0
- data/public/fonts/glyphicons-halflings-regular.svg +0 -229
- data/public/fonts/glyphicons-halflings-regular.ttf +0 -0
- data/public/fonts/glyphicons-halflings-regular.woff +0 -0
- data/public/js/lib/JSXTransformer.js +0 -10862
- data/public/js/lib/async.js +0 -958
- data/public/js/lib/backbone.js +0 -2
- data/public/js/lib/bootstrap.js +0 -6
- data/public/js/lib/less.js +0 -16
- data/public/js/lib/moment.js +0 -7768
- data/public/js/lib/react-bootstrap.js +0 -5346
- data/public/js/lib/react-bootstrap.min.js +0 -4
- data/public/js/lib/underscore-min.js +0 -6
- data/public/js/lib/underscore.string.min.js +0 -1
- data/public/js/main.js +0 -57
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 920fae5bec5f5fb7db777ce8d62f8757c899d46f
|
4
|
+
data.tar.gz: 901a548a419973aa082def5ca02a1f686575f363
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61d7902bcfc38bd17b99ba8ddab248329892e41f9cef1849953703aead6a418fe3502b87d7ca86dadfee6216c2fca2a7a8cc45f9dab9f3a84e327f11116c90a3
|
7
|
+
data.tar.gz: 59b390672aecf91d10b0b0886a1efd3638b680ac736c6a8554d63d3fe38f7c8f6e3316015a49b594fbcb4ca635a3c53a69f40271771f653ea381c28c332062df
|
data/.gitignore
CHANGED
data/.jshintrc
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
{
|
2
|
+
"bitwise": true,
|
3
|
+
"camelcase": true,
|
4
|
+
"curly": true,
|
5
|
+
"eqeqeq": true,
|
6
|
+
"es3": true,
|
7
|
+
"forin": true,
|
8
|
+
"freeze": true,
|
9
|
+
"immed": false,
|
10
|
+
"indent": 4,
|
11
|
+
"latedef": true,
|
12
|
+
"newcap": false,
|
13
|
+
"noarg": true,
|
14
|
+
"noempty": true,
|
15
|
+
"nonbsp": true,
|
16
|
+
"nonew": true,
|
17
|
+
"plusplus": false,
|
18
|
+
// "quotmark": "single",
|
19
|
+
"undef": true,
|
20
|
+
"unused": true,
|
21
|
+
"strict": true,
|
22
|
+
"maxparams": 8,
|
23
|
+
"maxdepth": 4,
|
24
|
+
"maxstatements": 20,
|
25
|
+
"maxcomplexity": 20,
|
26
|
+
"maxlen": 100,
|
27
|
+
"browser": true,
|
28
|
+
"couch": false,
|
29
|
+
"devel": true,
|
30
|
+
"dojo": false,
|
31
|
+
"jquery": true,
|
32
|
+
"mootools": false,
|
33
|
+
"node": false,
|
34
|
+
"nonstandard": true,
|
35
|
+
"phantom": false,
|
36
|
+
"prototypejs": false,
|
37
|
+
"rhino": false,
|
38
|
+
"worker": false,
|
39
|
+
"wsh": false,
|
40
|
+
"yui": false
|
41
|
+
}
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -39,3 +39,37 @@ And run the UI:
|
|
39
39
|
```
|
40
40
|
conjur ui
|
41
41
|
```
|
42
|
+
|
43
|
+
## Development
|
44
|
+
|
45
|
+
### System Dependencies
|
46
|
+
|
47
|
+
* rvm with installed Ruby
|
48
|
+
* npm
|
49
|
+
|
50
|
+
### Setup
|
51
|
+
|
52
|
+
Create a gemset with [rvm](http://rvm.io):
|
53
|
+
|
54
|
+
```sh-session
|
55
|
+
$ rvm gemset use conjur-asset-ui --create
|
56
|
+
$ bundle install
|
57
|
+
```
|
58
|
+
|
59
|
+
Run `rake prepare:deps`, and `rake assets:build` to build js and css assets.
|
60
|
+
|
61
|
+
### Running the project
|
62
|
+
|
63
|
+
Open 2 terminal tabs.
|
64
|
+
|
65
|
+
In one, run `rake assets:watch`. In the other run `conjur ui`.
|
66
|
+
|
67
|
+
gulp will rebuild assets as needed when files change.
|
68
|
+
|
69
|
+
### Testing
|
70
|
+
|
71
|
+
```sh-session
|
72
|
+
$ rake features
|
73
|
+
# or run only features marked with wip tag
|
74
|
+
$ rake features:wip
|
75
|
+
```
|
data/Rakefile
CHANGED
@@ -1,3 +1,71 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
2
3
|
require 'jasmine'
|
3
4
|
load 'jasmine/tasks/jasmine.rake'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'cucumber'
|
8
|
+
require 'cucumber/rake/task'
|
9
|
+
|
10
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
11
|
+
t.cucumber_opts = '--format pretty'
|
12
|
+
end
|
13
|
+
|
14
|
+
Cucumber::Rake::Task.new('features:wip') do |t|
|
15
|
+
t.cucumber_opts = '--format pretty --tags @wip'
|
16
|
+
end
|
17
|
+
|
18
|
+
rescue LoadError
|
19
|
+
desc 'Cucumber rake task not available'
|
20
|
+
|
21
|
+
task :features do
|
22
|
+
abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
namespace :deps do
|
27
|
+
desc 'Installs non-ruby dependencies like gulp, bower and nodejs packages'
|
28
|
+
task :install do
|
29
|
+
sh 'sudo npm install -g gulp bower'
|
30
|
+
sh 'npm install'
|
31
|
+
sh 'bower install'
|
32
|
+
end
|
33
|
+
|
34
|
+
desc 'Updates npm and bower packages'
|
35
|
+
task :update do
|
36
|
+
sh 'npm update'
|
37
|
+
sh 'bower update'
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'Removes npm and bower packages from filesystem'
|
41
|
+
task :clean do
|
42
|
+
sh 'rm -rf node_modules'
|
43
|
+
sh 'rm -rf bower_components'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
namespace :assets do
|
48
|
+
desc 'Build js and css'
|
49
|
+
task :build do
|
50
|
+
sh 'gulp build'
|
51
|
+
end
|
52
|
+
|
53
|
+
desc 'Watch the assets files and rebuild when one of them changes'
|
54
|
+
task :watch => :build do
|
55
|
+
sh 'gulp watch'
|
56
|
+
end
|
57
|
+
|
58
|
+
desc 'Clean builded assets'
|
59
|
+
task :clean do
|
60
|
+
sh 'gulp clean'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
task :build => %w(deps:install assets:build)
|
65
|
+
|
66
|
+
namespace :git do
|
67
|
+
desc 'Executes git clean'
|
68
|
+
task :clean do
|
69
|
+
sh 'git clean -dfX'
|
70
|
+
end
|
71
|
+
end
|
data/bower.json
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
{
|
2
|
+
"name": "conjur-asset-ui",
|
3
|
+
"private": true,
|
4
|
+
"version": "1.2.0",
|
5
|
+
"homepage": "https://github.com/conjurinc/conjur-asset-ui",
|
6
|
+
"authors": [
|
7
|
+
"Nikolai Sevostjanov <nikolai.sevostjanov@gmail.com>"
|
8
|
+
],
|
9
|
+
"license": "MIT",
|
10
|
+
"ignore": [
|
11
|
+
"**/.*",
|
12
|
+
"node_modules",
|
13
|
+
"bower_components",
|
14
|
+
"test",
|
15
|
+
"tests"
|
16
|
+
],
|
17
|
+
"dependencies": {
|
18
|
+
"jquery": "~2.1.1",
|
19
|
+
"async": "~0.9.0",
|
20
|
+
"backbone": "~1.1.2",
|
21
|
+
"moment": "~2.8.3",
|
22
|
+
"underscore": "~1.7.0",
|
23
|
+
"underscore.string": "~2.3.3",
|
24
|
+
"react": "~0.11.2",
|
25
|
+
"bootstrap": "~3.2.0",
|
26
|
+
"react-bootstrap": "~0.12.0",
|
27
|
+
"d3": "~3.4.13",
|
28
|
+
"underscore-deep-extend": "~0.0.5"
|
29
|
+
},
|
30
|
+
"overrides": {
|
31
|
+
"jquery": {
|
32
|
+
"main": [
|
33
|
+
"dist/jquery.min.js",
|
34
|
+
"dist/jquery.min.map"
|
35
|
+
]
|
36
|
+
},
|
37
|
+
"async": {
|
38
|
+
"main": [
|
39
|
+
"lib/async.js"
|
40
|
+
]
|
41
|
+
},
|
42
|
+
"backbone": {
|
43
|
+
"main": [
|
44
|
+
"backbone.js"
|
45
|
+
]
|
46
|
+
},
|
47
|
+
"moment": {
|
48
|
+
"main": [
|
49
|
+
"min/moment-with-locales.min.js"
|
50
|
+
]
|
51
|
+
},
|
52
|
+
"underscore": {
|
53
|
+
"main": [
|
54
|
+
"underscore-min.js"
|
55
|
+
]
|
56
|
+
},
|
57
|
+
"underscore.string": {
|
58
|
+
"main": [
|
59
|
+
"lib/underscore.string.js"
|
60
|
+
]
|
61
|
+
},
|
62
|
+
"react": {
|
63
|
+
"main": [
|
64
|
+
"react-with-addons.min.js"
|
65
|
+
]
|
66
|
+
},
|
67
|
+
"react-bootstrap": {
|
68
|
+
"main": [
|
69
|
+
"react-bootstrap.min.js"
|
70
|
+
]
|
71
|
+
},
|
72
|
+
"bootstrap": {
|
73
|
+
"main": [
|
74
|
+
"dist/js/bootstrap.min.js",
|
75
|
+
"dist/css/bootstrap.min.css",
|
76
|
+
"dist/fonts/*.eot",
|
77
|
+
"dist/fonts/*.svg",
|
78
|
+
"dist/fonts/*.ttf",
|
79
|
+
"dist/fonts/*.woff"
|
80
|
+
]
|
81
|
+
},
|
82
|
+
"d3": {
|
83
|
+
"main": [
|
84
|
+
"d3.min.js"
|
85
|
+
]
|
86
|
+
},
|
87
|
+
"underscore-deep-extend": {
|
88
|
+
"main": [
|
89
|
+
"index.js"
|
90
|
+
]
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}
|
data/conjur-asset-ui.gemspec
CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
13
13
|
spec.homepage = ""
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
|
-
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.files = `git ls-files`.split($/) + `find public/build`.split($/)
|
17
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
@@ -0,0 +1,31 @@
|
|
1
|
+
Feature: Navigation menu
|
2
|
+
Scenario: Open Dashboard page
|
3
|
+
Given I should logged in
|
4
|
+
When I click on the button Dashboard of the navigation menu
|
5
|
+
Then element having css "#content .dashboard" should be present
|
6
|
+
|
7
|
+
Scenario Outline: Open page using navigation bar
|
8
|
+
Given I should logged in
|
9
|
+
When I click on the button <btn> of the navigation menu
|
10
|
+
Then the <box> list should be present
|
11
|
+
And the <btn> button of the navigation menu should be active
|
12
|
+
And other button except the <btn> button of the navigation menu should be not active
|
13
|
+
|
14
|
+
Examples:
|
15
|
+
| btn | box |
|
16
|
+
| Users | User |
|
17
|
+
| Groups | Group |
|
18
|
+
| Hosts | Host |
|
19
|
+
| Layers | Layer |
|
20
|
+
| Variables | Variable |
|
21
|
+
| Policies | Policy |
|
22
|
+
|
23
|
+
Scenario: Open Audit page
|
24
|
+
Given I should logged in
|
25
|
+
When I click on the button Audit of the navigation menu
|
26
|
+
Then element having css "#content .audit h3" should be present
|
27
|
+
And the Audit button of the navigation menu should be active
|
28
|
+
And other button except the Audit button of the navigation menu should be not active
|
29
|
+
|
30
|
+
Scenario: Close the browser
|
31
|
+
Then I close browser
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'selenium-cucumber'
|
2
|
+
|
3
|
+
Given(/^I should logged in$/) do
|
4
|
+
step %[I navigate to "#{login_url}"]
|
5
|
+
end
|
6
|
+
|
7
|
+
When(/^I click on the button (.*) of the navigation menu$/) do |btn|
|
8
|
+
id = navigation_btn_to_id(btn)
|
9
|
+
|
10
|
+
step %[I click on element having css ".navbar .dropdown a"]
|
11
|
+
step %[element having css "#{id} a" should be present]
|
12
|
+
step %[I click on element having css "#{id} a"]
|
13
|
+
end
|
14
|
+
|
15
|
+
Then(/^the (.*) button of the navigation menu should be active$/) do |btn|
|
16
|
+
id = navigation_btn_to_id(btn)
|
17
|
+
|
18
|
+
step %[I click on element having css ".navbar .dropdown a"]
|
19
|
+
step %[element having css "#{id}.active a" should be present]
|
20
|
+
end
|
21
|
+
|
22
|
+
Then(/^the (.*) list should be present$/) do |btn|
|
23
|
+
btn = btn.downcase
|
24
|
+
|
25
|
+
step %[element having css "#content .#{btn}Box .#{btn}List h2" should be present]
|
26
|
+
end
|
27
|
+
|
28
|
+
Then(/^other button except the (.*) button of the navigation menu should be not active$/) do |btn|
|
29
|
+
id = navigation_btn_to_id(btn)
|
30
|
+
|
31
|
+
WAIT.until { $driver.find_elements(:css => '.navbar li.active').count } == 1
|
32
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'selenium-webdriver'
|
3
|
+
|
4
|
+
def print_error
|
5
|
+
puts "\nInappropraite browser \"#{ENV['BROWSER']}\""
|
6
|
+
puts "\nUsage : cucumber BROWSER=browser_name"
|
7
|
+
puts "\nbrowser_name can be one of following :"
|
8
|
+
puts "1.ie\n2.chrome\n3.ff\n4.safari\n5.opera"
|
9
|
+
puts "\nNow using default browser \"Firefox\""
|
10
|
+
end
|
11
|
+
|
12
|
+
case ENV['BROWSER']
|
13
|
+
when 'ie'
|
14
|
+
browser_type = :ie
|
15
|
+
when 'ff'
|
16
|
+
browser_type = :ff
|
17
|
+
when 'chrome'
|
18
|
+
browser_type = :chrome
|
19
|
+
when 'opera'
|
20
|
+
browser_type = :opera
|
21
|
+
when 'safari'
|
22
|
+
browser_type = :safari
|
23
|
+
else
|
24
|
+
if ENV['BROWSER']
|
25
|
+
print_error
|
26
|
+
end
|
27
|
+
|
28
|
+
browser_type = :ff
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
begin
|
33
|
+
$driver = Selenium::WebDriver.for(browser_type)
|
34
|
+
$driver.manage().window().maximize()
|
35
|
+
|
36
|
+
rescue Exception => e
|
37
|
+
puts e.message
|
38
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
Before do
|
2
|
+
require 'background_process'
|
3
|
+
command = 'conjur ui'
|
4
|
+
|
5
|
+
ENV['DONT_OPEN_IN_BROWSER'] = 'true'
|
6
|
+
|
7
|
+
@process = PTYBackgroundProcess.run command
|
8
|
+
|
9
|
+
exit = false
|
10
|
+
|
11
|
+
until exit do
|
12
|
+
raw_line = @process.stdout.gets
|
13
|
+
|
14
|
+
unless (match = /^If your browser did not opened the UI automatically, point it to (.*)$/.match(raw_line)).nil?
|
15
|
+
@login_url = match[1]
|
16
|
+
exit = true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
raise "Can't run #{command}" unless @process.running?
|
21
|
+
|
22
|
+
@process_thread = Thread.new do
|
23
|
+
# pass
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
After do
|
28
|
+
@process_thread.kill
|
29
|
+
@process.kill('TERM')
|
30
|
+
end
|
data/gulpfile.js
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
var gulp = require('gulp'),
|
2
|
+
autoprefixer = require('gulp-autoprefixer'),
|
3
|
+
flatten = require('gulp-flatten'),
|
4
|
+
cache = require('gulp-cached'),
|
5
|
+
concat = require('gulp-concat'),
|
6
|
+
uglify = require('gulp-uglify'),
|
7
|
+
plumber = require('gulp-plumber'),
|
8
|
+
react = require('gulp-react'),
|
9
|
+
remember = require('gulp-remember'),
|
10
|
+
jshint = require('gulp-jshint'),
|
11
|
+
stylish = require('jshint-stylish'),
|
12
|
+
less = require('gulp-less'),
|
13
|
+
sourcemaps = require('gulp-sourcemaps'),
|
14
|
+
mainBowerFiles = require('main-bower-files'),
|
15
|
+
minifyCSS = require('gulp-minify-css'),
|
16
|
+
filter = require('gulp-filter'),
|
17
|
+
del = require('del');
|
18
|
+
|
19
|
+
var paths = {
|
20
|
+
bower: 'bower_components',
|
21
|
+
styles: 'public/css/*.less',
|
22
|
+
scripts: [
|
23
|
+
'public/js/init.js',
|
24
|
+
'public/js/models/record.js',
|
25
|
+
'public/js/models/*.js',
|
26
|
+
'public/js/views/owned.js',
|
27
|
+
'public/js/views/chart.js',
|
28
|
+
'public/js/views/resource.js',
|
29
|
+
'public/js/views/role.js',
|
30
|
+
'public/js/views/role.js',
|
31
|
+
'public/js/views/permissions.js',
|
32
|
+
'public/js/views/time.js',
|
33
|
+
'public/js/views/mixins/search.js',
|
34
|
+
'public/js/views/mixins/tabs.js',
|
35
|
+
'public/js/views/**/*.js',
|
36
|
+
'public/js/routers.js'
|
37
|
+
]
|
38
|
+
};
|
39
|
+
|
40
|
+
gulp.task('clean', function(cb) {
|
41
|
+
del(['public/build'], cb);
|
42
|
+
});
|
43
|
+
|
44
|
+
gulp.task('bower', function() {
|
45
|
+
var jsFilter = filter(function(file) {
|
46
|
+
return /\.js$/.test(file.path) && !/\.min\.js$/.test(file.path);
|
47
|
+
});
|
48
|
+
|
49
|
+
var jsMinFilter = filter(['*.min.js']),
|
50
|
+
cssFilter = filter(['*.min.css']),
|
51
|
+
fontFilter = filter(['*.eot', '*.woff', '*.svg', '*.ttf']);
|
52
|
+
|
53
|
+
return gulp
|
54
|
+
.src(mainBowerFiles())
|
55
|
+
.pipe(fontFilter)
|
56
|
+
.pipe(flatten())
|
57
|
+
.pipe(gulp.dest('public/build/fonts'))
|
58
|
+
.pipe(fontFilter.restore())
|
59
|
+
|
60
|
+
.pipe(jsFilter)
|
61
|
+
.pipe(concat('vendor.min.js'))
|
62
|
+
.pipe(uglify())
|
63
|
+
.pipe(jsFilter.restore())
|
64
|
+
|
65
|
+
.pipe(jsMinFilter)
|
66
|
+
.pipe(concat('vendor.min.js'))
|
67
|
+
.pipe(gulp.dest('public/build/js'))
|
68
|
+
.pipe(jsFilter.restore())
|
69
|
+
|
70
|
+
.pipe(cssFilter)
|
71
|
+
.pipe(concat('vendor.css'))
|
72
|
+
.pipe(gulp.dest('public/build/css'))
|
73
|
+
.pipe(cssFilter.restore());
|
74
|
+
});
|
75
|
+
|
76
|
+
gulp.task('scripts', function() {
|
77
|
+
return gulp.src(paths.scripts)
|
78
|
+
.pipe(cache('scripts'))
|
79
|
+
.pipe(plumber())
|
80
|
+
.pipe(react())
|
81
|
+
.pipe(plumber.stop())
|
82
|
+
.pipe(remember('scripts'))
|
83
|
+
.pipe(sourcemaps.init())
|
84
|
+
.pipe(concat('app.min.js'))
|
85
|
+
.pipe(uglify())
|
86
|
+
.pipe(sourcemaps.write('../maps'))
|
87
|
+
.pipe(gulp.dest('public/build/js'));
|
88
|
+
});
|
89
|
+
|
90
|
+
gulp.task('jshint', function() {
|
91
|
+
var stream = gulp.src(paths.scripts)
|
92
|
+
.pipe(cache('linting'))
|
93
|
+
.pipe(plumber())
|
94
|
+
.pipe(react())
|
95
|
+
.pipe(plumber.stop())
|
96
|
+
.pipe(jshint())
|
97
|
+
.pipe(jshint.reporter(stylish));
|
98
|
+
|
99
|
+
if (process.env.CI) {
|
100
|
+
stream = stream.pipe(jshint.reporter('fail'));
|
101
|
+
}
|
102
|
+
|
103
|
+
return stream;
|
104
|
+
});
|
105
|
+
|
106
|
+
gulp.task('styles', function() {
|
107
|
+
return gulp.src(paths.styles)
|
108
|
+
// https://github.com/plus3network/gulp-less/pull/85
|
109
|
+
// .pipe(sourcemaps.init())
|
110
|
+
.pipe(less())
|
111
|
+
.pipe(autoprefixer({
|
112
|
+
browsers: ['> 1%', 'last 2 versions', 'Firefox ESR'],
|
113
|
+
cascade: false
|
114
|
+
}))
|
115
|
+
.pipe(minifyCSS({keepBreaks: true}))
|
116
|
+
// .pipe(sourcemaps.write('../maps'))
|
117
|
+
.pipe(gulp.dest('public/build/css'));
|
118
|
+
});
|
119
|
+
|
120
|
+
gulp.task('watch', function(cb) {
|
121
|
+
gulp.watch(paths.bower, ['bower']);
|
122
|
+
gulp.watch(paths.styles, ['styles']);
|
123
|
+
|
124
|
+
var watcher = gulp.watch(paths.scripts, ['jshint', 'scripts']);
|
125
|
+
|
126
|
+
watcher.on('change', function (event) {
|
127
|
+
if (event.type === 'deleted') {
|
128
|
+
delete cache.caches['scripts'][event.path];
|
129
|
+
remember.forget('scripts', event.path);
|
130
|
+
}
|
131
|
+
});
|
132
|
+
|
133
|
+
cb();
|
134
|
+
|
135
|
+
console.log('Watching files for changes...');
|
136
|
+
});
|
137
|
+
|
138
|
+
gulp.task('build', ['bower', 'styles', 'jshint', 'scripts']);
|
139
|
+
|
140
|
+
gulp.task('default', ['build']);
|
data/lib/conjur/command/ui.rb
CHANGED
@@ -27,7 +27,7 @@ class Conjur::Command::UI < Conjur::Command
|
|
27
27
|
|
28
28
|
#TODO: login page
|
29
29
|
api # just initialize API so if user is not logged in it will be asked for credentials *before* server is launched
|
30
|
-
@@api=nil # reset to avoid conflicts on server launch
|
30
|
+
@@api=nil # reset to avoid conflicts on server launch
|
31
31
|
|
32
32
|
# ugly hack to override Configuration.env issues which are not working any more
|
33
33
|
# after removal of sticky configurations support
|
@@ -30,7 +30,12 @@ module Conjur
|
|
30
30
|
require 'conjur/webserver/api_proxy'
|
31
31
|
require 'conjur/webserver/home'
|
32
32
|
require 'conjur/webserver/conjur_info'
|
33
|
-
|
33
|
+
|
34
|
+
# Pry is optional
|
35
|
+
begin
|
36
|
+
require 'pry'
|
37
|
+
rescue LoadError
|
38
|
+
end
|
34
39
|
|
35
40
|
sessionid = self.sessionid
|
36
41
|
cookie_options = {
|
@@ -53,7 +58,7 @@ module Conjur
|
|
53
58
|
api_stack.each{|args| use *args}
|
54
59
|
run Conjur::WebServer::APIProxy.new
|
55
60
|
end
|
56
|
-
%w(js css fonts images).each do |path|
|
61
|
+
%w(build js css fonts images).each do |path|
|
57
62
|
map "/#{path}" do
|
58
63
|
run Rack::File.new(File.join(root, path), 'Cache-Control' => 'max-age=0')
|
59
64
|
end
|
@@ -78,23 +83,23 @@ module Conjur
|
|
78
83
|
|
79
84
|
Rack::Server.start(options)
|
80
85
|
end
|
81
|
-
|
86
|
+
|
82
87
|
def open
|
83
88
|
require 'launchy'
|
84
89
|
url = "http://localhost:#{port}/login?sessionid=#{sessionid}"
|
85
90
|
# as launchy sometimes silently fails, we need human-friendly failover
|
86
|
-
$stderr.puts "If your browser did not opened the UI automatically, point it to #{url}"
|
87
|
-
Launchy.open(url)
|
91
|
+
$stderr.puts "If your browser did not opened the UI automatically, point it to #{url}"
|
92
|
+
Launchy.open(url) unless ENV['DONT_OPEN_IN_BROWSER']
|
88
93
|
end
|
89
|
-
|
94
|
+
|
90
95
|
protected
|
91
|
-
|
96
|
+
|
92
97
|
def port
|
93
98
|
@port ||= find_available_port
|
94
99
|
end
|
95
100
|
|
96
101
|
DEFAULT_PORT = 42_289
|
97
|
-
|
102
|
+
|
98
103
|
def find_available_port
|
99
104
|
begin
|
100
105
|
server = TCPServer.new('127.0.0.1', 0)
|
@@ -103,7 +108,7 @@ module Conjur
|
|
103
108
|
server.close if server
|
104
109
|
end
|
105
110
|
end
|
106
|
-
|
111
|
+
|
107
112
|
def sessionid
|
108
113
|
require 'securerandom'
|
109
114
|
@sessionid ||= SecureRandom.hex(32)
|