From a56a2b00579ebce745ba023f316ae00d8016ecc8 Mon Sep 17 00:00:00 2001 From: oroce Date: Fri, 31 Jan 2014 21:23:32 +0100 Subject: [PATCH] basic authentication added for elasticsearch --- src/app/components/settings.js | 21 +++++++++++-------- src/app/controllers/dash.js | 2 +- src/app/controllers/metricKeys.js | 12 ++++++++--- src/app/services/dashboard.js | 14 ++++++++++--- .../elasticjs/elastic-angular-client.js | 8 ++++++- 5 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/app/components/settings.js b/src/app/components/settings.js index 3a1519db699..7ea1bd65087 100644 --- a/src/app/components/settings.js +++ b/src/app/components/settings.js @@ -28,16 +28,19 @@ function (_, crypto) { settings[key] = typeof options[key] !== 'undefined' ? options[key] : defaults[key]; }); - var url = settings.graphiteUrl; - var passwordAt = url.indexOf('@'); - if (passwordAt > 0) { - var userStart = url.indexOf('//') + 2; - var userAndPassword = url.substring(userStart, passwordAt); - var bytes = crypto.charenc.Binary.stringToBytes(userAndPassword); - var base64 = crypto.util.bytesToBase64(bytes); - settings.graphiteBasicAuth = base64; - } + var basicAuth = function(url) { + var passwordAt = url.indexOf('@'); + if (passwordAt > 0) { + var userStart = url.indexOf('//') + 2; + var userAndPassword = url.substring(userStart, passwordAt); + var bytes = crypto.charenc.Binary.stringToBytes(userAndPassword); + var base64 = crypto.util.bytesToBase64(bytes); + return base64; + } + }; + settings.graphiteBasicAuth = basicAuth(settings.graphiteUrl); + settings.elasticsearchBasicAuth = basicAuth(settings.elasticsearch); return settings; }; }); diff --git a/src/app/controllers/dash.js b/src/app/controllers/dash.js index c9ec970548e..ed998aa6a77 100644 --- a/src/app/controllers/dash.js +++ b/src/app/controllers/dash.js @@ -58,7 +58,7 @@ function (angular, $, config, _) { $scope.reset_row(); - $scope.ejs = ejsResource(config.elasticsearch); + $scope.ejs = ejsResource(config.elasticsearch, config.elasticsearchBasicAuth); $scope.bindKeyboardShortcuts(); }; diff --git a/src/app/controllers/metricKeys.js b/src/app/controllers/metricKeys.js index 6188dc693d3..cd5ae08cf2d 100644 --- a/src/app/controllers/metricKeys.js +++ b/src/app/controllers/metricKeys.js @@ -10,7 +10,13 @@ function (angular, _, config) { module.controller('MetricKeysCtrl', function($scope, $http, $q) { var elasticSearchUrlForMetricIndex = config.elasticsearch + '/' + config.grafana_metrics_index + '/'; - + var httpOptions = {}; + if (config.elasticsearchBasicAuth) { + options.withCredentials = true; + options.headers = { + "Authorization": "Basic " + config.elasticsearchBasicAuth + }; + } $scope.init = function () { $scope.metricPath = "prod.apps.api.boobarella.*"; $scope.metricCounter = 0; @@ -77,7 +83,7 @@ function (angular, _, config) { function deleteIndex() { var deferred = $q.defer(); - $http.delete(elasticSearchUrlForMetricIndex) + $http.delete(elasticSearchUrlForMetricIndex, httpOptions) .success(function() { deferred.resolve('ok'); }) @@ -124,7 +130,7 @@ function (angular, _, config) { } } } - }); + }, httpOptions); } function receiveMetric(result) { diff --git a/src/app/services/dashboard.js b/src/app/services/dashboard.js index de9fc20b6ca..14a3e53d3f2 100644 --- a/src/app/services/dashboard.js +++ b/src/app/services/dashboard.js @@ -47,7 +47,7 @@ function (angular, $, kbn, _, config, moment, Modernizr) { }; // An elasticJS client to use - var ejs = ejsResource(config.elasticsearch); + var ejs = ejsResource(config.elasticsearch, config.elasticsearchBasicAuth); var gist_pattern = /(^\d{5,}$)|(^[a-z0-9]{10,}$)|(gist.github.com(\/*.*)\/[a-z0-9]{5,}\/*$)/; // Store a reference to this @@ -286,13 +286,21 @@ function (angular, $, kbn, _, config, moment, Modernizr) { }; this.elasticsearch_load = function(type,id) { - return $http({ + var options = { url: config.elasticsearch + "/" + config.grafana_index + "/"+type+"/"+id+'?' + new Date().getTime(), method: "GET", transformResponse: function(response) { return renderTemplate(angular.fromJson(response)._source.dashboard, $routeParams); } - }).error(function(data, status) { + }; + if (config.elasticsearchBasicAuth) { + options.withCredentials = true; + options.headers = { + "Authorization": "Basic " + config.elasticsearchBasicAuth + }; + } + return $http(options) + .error(function(data, status) { if(status === 0) { alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+ ". Please ensure that Elasticsearch is reachable from your system." ,'error'); diff --git a/src/vendor/elasticjs/elastic-angular-client.js b/src/vendor/elasticjs/elastic-angular-client.js index defed3119e4..41eabf5d736 100644 --- a/src/vendor/elasticjs/elastic-angular-client.js +++ b/src/vendor/elasticjs/elastic-angular-client.js @@ -13,7 +13,7 @@ be injected into your angular controllers. angular.module('elasticjs.service', []) .factory('ejsResource', ['$http', function ($http) { - return function (config) { + return function (config, basicAuth) { var @@ -43,6 +43,12 @@ angular.module('elasticjs.service', []) config.server = ''; } + // set authentication header + if (basicAuth || config.basicAuth) { + config.headers = angular.extend( config.headers||{}, { + "Authorization": "Basic " + (basicAuth||config.basicAuth) + }); + } /* implement the elastic.js client interface for angular */ ejs.client = { server: function (s) {