diff --git a/.bowerrc b/.bowerrc index 44491d3d..69fad358 100644 --- a/.bowerrc +++ b/.bowerrc @@ -1,3 +1,3 @@ { - "directory": "bower_components" + "directory": "bower_components" } diff --git a/.jshintrc b/.jshintrc index 5962a012..fbb95838 100644 --- a/.jshintrc +++ b/.jshintrc @@ -1,29 +1,29 @@ { - "node": true, - "browser": true, - "esnext": true, "bitwise": true, + "browser": true, "camelcase": false, "curly": true, "eqeqeq": true, + "esnext": true, + "globals": { + "_": false, + "angular": false, + "d3": false, + "moment": false, + "self": false, + "toaster": false + }, "immed": true, "indent": 2, "latedef": false, "newcap": false, "noarg": true, + "node": true, "quotmark": "single", "regexp": true, - "undef": true, - "unused": true, + "smarttabs": true, "strict": true, "trailing": true, - "smarttabs": true, - "globals": { - "angular": false, - "moment": false, - "toaster": false, - "d3": false, - "self": false, - "_": false - } + "undef": true, + "unused": true } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f3d19151..904adc32 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,6 +4,12 @@ - id: trailing-whitespace - id: flake8 - id: check-merge-conflict + - id: pretty-format-json + - id: check-ast + - id: check-case-conflict + - id: check-yaml + - id: autopep8-wrapper + - repo: git://github.com/pre-commit/mirrors-jshint sha: v2.9.5 hooks: diff --git a/bower.json b/bower.json index f7d5500d..51090e6c 100644 --- a/bower.json +++ b/bower.json @@ -1,50 +1,39 @@ { - "name": "lemur", - "repository": { - "type": "git", - "url": "git://github.com/netflix/lemur.git" - }, - "private": true, "dependencies": { - "jquery": "~2.2.0", - "angular-wizard": "~0.4.0", "angular": "1.4.9", - "json3": "~3.3", - "es5-shim": "~4.5.0", - "bootstrap": "~3.3.6", - "angular-bootstrap": "~1.1.1", "angular-animate": "~1.4.9", - "restangular": "~1.5.1", - "ng-table": "~0.8.3", - "moment": "~2.11.1", + "angular-bootstrap": "~1.1.1", + "angular-chart.js": "~0.8.8", + "angular-clipboard": "~1.3.0", + "angular-file-saver": "~1.0.1", "angular-loading-bar": "~0.8.0", "angular-moment": "~0.10.3", - "moment-range": "~2.1.0", - "angular-clipboard": "~1.3.0", - "angularjs-toaster": "~1.0.0", - "angular-chart.js": "~0.8.8", - "ngletteravatar": "~4.0.0", - "bootswatch": "~3.3.6", - "fontawesome": "~4.5.0", - "satellizer": "~0.13.4", - "angular-ui-router": "~0.2.15", - "font-awesome": "~4.5.0", - "lodash": "~4.0.1", - "underscore": "~1.8.3", + "angular-sanitize": "~1.5.0", "angular-smart-table": "2.1.8", "angular-strap": ">= 2.2.2", - "angular-underscore": "^0.5.0", "angular-translate": "^2.9.0", - "angular-ui-switch": "~0.1.0", - "angular-sanitize": "~1.5.0", - "angular-file-saver": "~1.0.1", + "angular-ui-router": "~0.2.15", "angular-ui-select": "~0.17.1", - "d3": "^3.5.17" - }, - "resolutions": { - "moment": ">=2.8.0 <2.11.0", - "lodash": ">=1.3.0 <2.5.0", - "angular": "1.4.9" + "angular-ui-switch": "~0.1.0", + "angular-underscore": "^0.5.0", + "angular-wizard": "~0.4.0", + "angularjs-toaster": "~1.0.0", + "bootstrap": "~3.3.6", + "bootswatch": "~3.3.6", + "d3": "^3.5.17", + "es5-shim": "~4.5.0", + "font-awesome": "~4.5.0", + "fontawesome": "~4.5.0", + "jquery": "~2.2.0", + "json3": "~3.3", + "lodash": "~4.0.1", + "moment": "~2.11.1", + "moment-range": "~2.1.0", + "ng-table": "~0.8.3", + "ngletteravatar": "~4.0.0", + "restangular": "~1.5.1", + "satellizer": "~0.13.4", + "underscore": "~1.8.3" }, "ignore": [ "**/.*", @@ -52,5 +41,16 @@ "bower_components", "test", "tests" - ] + ], + "name": "lemur", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/netflix/lemur.git" + }, + "resolutions": { + "angular": "1.4.9", + "lodash": ">=1.3.0 <2.5.0", + "moment": ">=2.8.0 <2.11.0" + } } diff --git a/docs/administration.rst b/docs/administration.rst index eec01cc5..610acc56 100644 --- a/docs/administration.rst +++ b/docs/administration.rst @@ -313,7 +313,7 @@ LDAP support requires the pyldap python library, which also depends on the follo To configure the use of an LDAP server, a number of settings need to be configured in `lemur.conf.py`. Here is an example LDAP configuration stanza you can add to your config. Adjust to suit your environment of course. - + .. code-block:: python LDAP_AUTH = True diff --git a/docs/conf.py b/docs/conf.py index d5b1698c..a719f545 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -203,21 +203,21 @@ htmlhelp_basename = 'lemurdoc' # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # Additional stuff for the LaTeX preamble. + # 'preamble': '', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'lemur.tex', u'Lemur Documentation', + ('index', 'lemur.tex', u'Lemur Documentation', u'Kevin Glisson', 'manual'), ] @@ -261,7 +261,7 @@ man_pages = [ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'Lemur', u'Lemur Documentation', + ('index', 'Lemur', u'Lemur Documentation', u'Kevin Glisson', 'Lemur', 'SSL Certificate Management', 'Miscellaneous'), ] diff --git a/docs/production/index.rst b/docs/production/index.rst index 42f6648a..b7aa22c4 100644 --- a/docs/production/index.rst +++ b/docs/production/index.rst @@ -217,23 +217,23 @@ An example apache config:: # HSTS (mod_headers is required) (15768000 seconds = 6 months) Header always set Strict-Transport-Security "max-age=15768000" ... - + # Set the lemur DocumentRoot to static/dist DocumentRoot /www/lemur/lemur/static/dist - + # Uncomment to force http 1.0 connections to proxy # SetEnv force-proxy-request-1.0 1 - + #Don't keep proxy connections alive SetEnv proxy-nokeepalive 1 - + # Only need to do reverse proxy ProxyRequests Off - + # Proxy requests to the api to the lemur service (and sanitize redirects from it) ProxyPass "/api" "http://127.0.0.1:8000/api" ProxyPassReverse "/api" "http://127.0.0.1:8000/api" - + Also included in the configurations above are several best practices when it comes to deploying TLS. Things like enabling diff --git a/gulp/build.js b/gulp/build.js index eed59503..284eed6b 100644 --- a/gulp/build.js +++ b/gulp/build.js @@ -240,8 +240,8 @@ gulp.task('addUrlContextPath',['addUrlContextPath:revreplace'], function(){ .pipe(gulpif(urlContextPathExists, replace('angular/', argv.urlContextPath + '/angular/'))) .pipe(gulp.dest(function(file){ return file.base; - })) - }) + })); + }); }); gulp.task('addUrlContextPath:revision', function(){ @@ -249,16 +249,16 @@ gulp.task('addUrlContextPath:revision', function(){ .pipe(rev()) .pipe(gulp.dest('lemur/static/dist')) .pipe(rev.manifest()) - .pipe(gulp.dest('lemur/static/dist')) -}) + .pipe(gulp.dest('lemur/static/dist')); +}); gulp.task('addUrlContextPath:revreplace', ['addUrlContextPath:revision'], function(){ - var manifest = gulp.src("lemur/static/dist/rev-manifest.json"); + var manifest = gulp.src('lemur/static/dist/rev-manifest.json'); var urlContextPathExists = argv.urlContextPath ? true : false; - return gulp.src( "lemur/static/dist/index.html") + return gulp.src('lemur/static/dist/index.html') .pipe(gulpif(urlContextPathExists, revReplace({prefix: argv.urlContextPath + '/', manifest: manifest}, revReplace({manifest: manifest})))) .pipe(gulp.dest('lemur/static/dist')); -}) +}); gulp.task('build', ['build:ngviews', 'build:inject', 'build:images', 'build:fonts', 'build:html', 'build:extras']); diff --git a/gulp/karma.conf.js b/gulp/karma.conf.js index b9777c7a..527f9cb9 100644 --- a/gulp/karma.conf.js +++ b/gulp/karma.conf.js @@ -1,10 +1,12 @@ +'use strict'; // Contents of: config/karma.conf.js + module.exports = function (config) { config.set({ basePath : '../', // Fix for "JASMINE is not supported anymore" warning - frameworks : ["jasmine"], + frameworks : ['jasmine'], files : [ 'app/lib/angular/angular.js', diff --git a/gulp/server.js b/gulp/server.js index 777100f6..87f526c8 100644 --- a/gulp/server.js +++ b/gulp/server.js @@ -3,7 +3,7 @@ var gulp = require('gulp'); var browserSync = require('browser-sync'); -var httpProxy = require('http-proxy'); +require('http-proxy'); /* This configuration allow you to configure browser sync to proxy your backend */ /* diff --git a/lemur/auth/ldap.py b/lemur/auth/ldap.py index 398a5830..a4ac44ee 100644 --- a/lemur/auth/ldap.py +++ b/lemur/auth/ldap.py @@ -18,6 +18,7 @@ class LdapPrincipal(): """ Provides methods for authenticating against an LDAP server. """ + def __init__(self, args): self._ldap_validate_conf() # setup ldap config diff --git a/lemur/auth/views.py b/lemur/auth/views.py index 7a1bb34c..13c26904 100644 --- a/lemur/auth/views.py +++ b/lemur/auth/views.py @@ -211,6 +211,7 @@ class Login(Resource): on your uses cases but. It is important to not that there is currently no build in method to revoke a users token \ and force re-authentication. """ + def __init__(self): self.reqparse = reqparse.RequestParser() super(Login, self).__init__() @@ -282,10 +283,10 @@ class Login(Resource): metrics.send('login', 'counter', 1, metric_tags={'status': SUCCESS_METRIC_STATUS}) return dict(token=create_token(user)) except Exception as e: - current_app.logger.error("ldap error: {0}".format(e)) - ldap_message = 'ldap error: %s' % e - metrics.send('login', 'counter', 1, metric_tags={'status': FAILURE_METRIC_STATUS}) - return dict(message=ldap_message), 403 + current_app.logger.error("ldap error: {0}".format(e)) + ldap_message = 'ldap error: %s' % e + metrics.send('login', 'counter', 1, metric_tags={'status': FAILURE_METRIC_STATUS}) + return dict(message=ldap_message), 403 # if not valid user - no certificates for you metrics.send('login', 'counter', 1, metric_tags={'status': FAILURE_METRIC_STATUS}) @@ -302,6 +303,7 @@ class Ping(Resource): provider uses for its callbacks. 2. Add or change the Lemur AngularJS Configuration to point to your new provider """ + def __init__(self): self.reqparse = reqparse.RequestParser() super(Ping, self).__init__() diff --git a/lemur/authorities/views.py b/lemur/authorities/views.py index b85c9b70..25fb9000 100644 --- a/lemur/authorities/views.py +++ b/lemur/authorities/views.py @@ -25,6 +25,7 @@ api = Api(mod) class AuthoritiesList(AuthenticatedResource): """ Defines the 'authorities' endpoint """ + def __init__(self): self.reqparse = reqparse.RequestParser() super(AuthoritiesList, self).__init__() diff --git a/lemur/common/fields.py b/lemur/common/fields.py index 9a0198e9..aa40cdcb 100644 --- a/lemur/common/fields.py +++ b/lemur/common/fields.py @@ -25,6 +25,7 @@ class Hex(Field): """ A hex formatted string. """ + def _serialize(self, value, attr, obj): if value: value = hex(int(value))[2:].upper() @@ -317,6 +318,7 @@ class SubjectAlternativeNameExtension(Field): :param kwargs: The same keyword arguments that :class:`Field` receives. """ + def _serialize(self, value, attr, obj): general_names = [] name_type = None diff --git a/lemur/defaults/views.py b/lemur/defaults/views.py index 5a573829..b4ead848 100644 --- a/lemur/defaults/views.py +++ b/lemur/defaults/views.py @@ -19,6 +19,7 @@ api = Api(mod) class LemurDefaults(AuthenticatedResource): """ Defines the 'defaults' endpoint """ + def __init__(self): super(LemurDefaults) diff --git a/lemur/destinations/views.py b/lemur/destinations/views.py index 7084e8e9..6e890f98 100644 --- a/lemur/destinations/views.py +++ b/lemur/destinations/views.py @@ -24,6 +24,7 @@ api = Api(mod) class DestinationsList(AuthenticatedResource): """ Defines the 'destinations' endpoint """ + def __init__(self): self.reqparse = reqparse.RequestParser() super(DestinationsList, self).__init__() @@ -335,6 +336,7 @@ class Destinations(AuthenticatedResource): class CertificateDestinations(AuthenticatedResource): """ Defines the 'certificate/
- diff --git a/lemur/static/app/angular/dns_providers/dns_provider/dns_provider.tpl.html b/lemur/static/app/angular/dns_providers/dns_provider/dns_provider.tpl.html index 85882de1..9ff6a1b8 100644 --- a/lemur/static/app/angular/dns_providers/dns_provider/dns_provider.tpl.html +++ b/lemur/static/app/angular/dns_providers/dns_provider/dns_provider.tpl.html @@ -42,7 +42,7 @@ {{ item.name | titleCase }}
- diff --git a/lemur/tests/js/.jshintrc b/lemur/tests/js/.jshintrc index b1be025b..7ce6fe1f 100644 --- a/lemur/tests/js/.jshintrc +++ b/lemur/tests/js/.jshintrc @@ -1,23 +1,10 @@ { - "node": true, - "browser": true, - "esnext": true, "bitwise": true, + "browser": true, "camelcase": true, "curly": true, "eqeqeq": true, - "immed": true, - "indent": 2, - "latedef": true, - "newcap": true, - "noarg": true, - "quotmark": "single", - "regexp": true, - "undef": true, - "unused": true, - "strict": true, - "trailing": true, - "smarttabs": true, + "esnext": true, "globals": { "after": false, "afterEach": false, @@ -31,6 +18,18 @@ "it": false, "jasmine": false, "spyOn": false - } + }, + "immed": true, + "indent": 2, + "latedef": true, + "newcap": true, + "noarg": true, + "node": true, + "quotmark": "single", + "regexp": true, + "smarttabs": true, + "strict": true, + "trailing": true, + "undef": true, + "unused": true } - diff --git a/lemur/tests/test_ldap.py b/lemur/tests/test_ldap.py index a636afdc..6e0c0a54 100644 --- a/lemur/tests/test_ldap.py +++ b/lemur/tests/test_ldap.py @@ -1,5 +1,5 @@ import pytest -from lemur.auth.ldap import * # noqa +from lemur.auth.ldap import * # noqa from mock import patch, MagicMock diff --git a/lemur/users/views.py b/lemur/users/views.py index eb67f014..01972c74 100644 --- a/lemur/users/views.py +++ b/lemur/users/views.py @@ -27,6 +27,7 @@ api = Api(mod) class UsersList(AuthenticatedResource): """ Defines the 'users' endpoint """ + def __init__(self): self.reqparse = reqparse.RequestParser() super(UsersList, self).__init__() diff --git a/package.json b/package.json index f47978db..d18485da 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,4 @@ { - "name": "Lemur", - "private": true, - "repository": { - "type": "git", - "url": "git://github.com/netflix/lemur.git" - }, "dependencies": { "bower": "^1.8.2", "browser-sync": "^2.3.1", @@ -51,16 +45,22 @@ "uglify-save-license": "^0.4.1", "yargs": "^7.0.2" }, - "scripts": { - "postinstall": "node_modules/.bin/bower install --allow-root --config.interactive=false", - "pretest": "npm install && npm run build_static", - "build_static": "gulp build", - "prelint": "npm install", - "lint": "jshint lemur/static/app/", - "test": "gulp test" - }, "devDependencies": { "jshint": "^2.8.0", "karma-chrome-launcher": "^2.0.0" + }, + "name": "Lemur", + "private": true, + "repository": { + "type": "git", + "url": "git://github.com/netflix/lemur.git" + }, + "scripts": { + "build_static": "gulp build", + "lint": "jshint lemur/static/app/", + "postinstall": "node_modules/.bin/bower install --allow-root --config.interactive=false", + "prelint": "npm install", + "pretest": "npm install && npm run build_static", + "test": "gulp test" } } diff --git a/requirements-dev.txt b/requirements-dev.txt index cb9be135..ec21eb70 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -24,7 +24,7 @@ requests-toolbelt==0.8.0 # via twine requests==2.19.1 # via requests-toolbelt, twine six==1.11.0 # via cfgv, pre-commit toml==0.9.4 # via pre-commit -tqdm==4.24.0 # via twine +tqdm==4.25.0 # via twine twine==1.11.0 urllib3==1.23 # via requests virtualenv==16.0.0 # via pre-commit diff --git a/requirements-docs.txt b/requirements-docs.txt index 22621681..91885da7 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -79,7 +79,7 @@ s3transfer==0.1.13 six==1.11.0 snowballstemmer==1.2.1 # via sphinx sphinx-rtd-theme==0.4.1 -sphinx==1.7.6 +sphinx==1.7.7 sphinxcontrib-httpdomain==1.7.0 sphinxcontrib-websupport==1.1.0 # via sphinx sqlalchemy-utils==0.33.3 diff --git a/requirements-tests.txt b/requirements-tests.txt index 2575b631..966c0756 100644 --- a/requirements-tests.txt +++ b/requirements-tests.txt @@ -8,9 +8,9 @@ asn1crypto==0.24.0 # via cryptography atomicwrites==1.1.5 # via pytest attrs==18.1.0 # via pytest aws-xray-sdk==0.95 # via moto -boto3==1.7.79 # via moto +boto3==1.7.82 # via moto boto==2.49.0 # via moto -botocore==1.10.79 # via boto3, moto, s3transfer +botocore==1.10.82 # via boto3, moto, s3transfer certifi==2018.8.13 # via requests cffi==1.11.5 # via cryptography chardet==3.0.4 # via requests @@ -47,7 +47,7 @@ pycryptodome==3.6.6 # via python-jose pyflakes==2.0.0 pytest-flask==0.10.0 pytest-mock==1.10.0 -pytest==3.7.1 +pytest==3.7.2 python-dateutil==2.7.3 # via botocore, faker, freezegun, moto python-jose==2.0.2 # via moto pytz==2018.5 # via moto @@ -59,7 +59,7 @@ s3transfer==0.1.13 # via boto3 six==1.11.0 # via cryptography, docker, docker-pycreds, faker, freezegun, mock, more-itertools, moto, pytest, python-dateutil, python-jose, requests-mock, responses, websocket-client text-unidecode==1.2 # via faker urllib3==1.23 # via requests -websocket-client==0.49.0 # via docker +websocket-client==0.51.0 # via docker werkzeug==0.14.1 # via flask, moto, pytest-flask wrapt==1.10.11 # via aws-xray-sdk xmltodict==0.11.0 # via moto diff --git a/requirements.txt b/requirements.txt index 5503758b..3e8ee223 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,8 +13,8 @@ asn1crypto==0.24.0 # via cryptography asyncpool==1.0 bcrypt==3.1.4 # via flask-bcrypt, paramiko blinker==1.4 # via flask-mail, flask-principal, raven -boto3==1.7.79 -botocore==1.10.79 # via boto3, s3transfer +boto3==1.7.82 +botocore==1.10.82 # via boto3, s3transfer certifi==2018.8.13 cffi==1.11.5 # via bcrypt, cryptography, pynacl chardet==3.0.4 # via requests @@ -73,7 +73,7 @@ retrying==1.3.3 s3transfer==0.1.13 # via boto3 six==1.11.0 sqlalchemy-utils==0.33.3 -sqlalchemy==1.2.10 # via alembic, flask-sqlalchemy, marshmallow-sqlalchemy, sqlalchemy-utils +sqlalchemy==1.2.11 # via alembic, flask-sqlalchemy, marshmallow-sqlalchemy, sqlalchemy-utils tabulate==0.8.2 urllib3==1.23 # via requests werkzeug==0.14.1 # via flask diff --git a/setup.py b/setup.py index 1511b013..6cecad32 100644 --- a/setup.py +++ b/setup.py @@ -59,6 +59,7 @@ class SmartInstall(install): If the package indicator is missing, this will also force a run of `build_static` which is required for JavaScript assets and other things. """ + def _needs_static(self): return not os.path.exists(os.path.join(ROOT, 'lemur/static/dist'))