adding auth checks on trigger create and delete
diff --git a/actions/changes.js b/actions/changes.js
index 19bc087..0fa5597 100644
--- a/actions/changes.js
+++ b/actions/changes.js
@@ -36,7 +36,7 @@
     if (lifecycleEvent === 'CREATE') {
 
         // handle any invalid parameters here
-    	for(var prop in msg) {
+    	for (var prop in msg) {
     	    if (!(prop in validProperties)) {
     	    	var eMsg = 'cloudant trigger feed: invalid property not supported: ' + prop;
     	    	console.log(eMsg,'[error:]', whisk.error(eMsg));
@@ -69,62 +69,55 @@
 
         // auth key for trigger
         var apiKey = msg.authKey;
-        var auth = apiKey.split(':');
         var input = {};
-        input["accounturl"] = "https://" + host;
-        input["host"] = host;
-        input["port"] = port;
-        input["protocol"] = protocol;
-        input["dbname"] = dbname;
-        input["user"] = user;
-        input["pass"] = pass;
-        input["apikey"] = apiKey;
-        input["maxTriggers"] = maxTriggers;
-        input["callback"] = {};
-        input["callback"]["action"] = {};
-        input["callback"]["action"]["name"] = trigger;
+        input.accounturl = "https://" + host;
+        input.host = host;
+        input.port = port;
+        input.protocol = protocol;
+        input.dbname = dbname;
+        input.user = user;
+        input.pass = pass;
+        input.apikey = apiKey;
+        input.maxTriggers = maxTriggers;
+        input.callback = {};
+        input.callback.action = {};
+        input.callback.action.name = trigger;
 
-        return cloudantHelper(provider_endpoint, 'put', replaceNameTrigger, auth, input);
+        return cloudantHelper(provider_endpoint, 'put', replaceNameTrigger, input);
     } else if (lifecycleEvent === 'DELETE') {
-        return cloudantHelper(provider_endpoint, 'delete', replaceNameTrigger);
+
+        var jsonOptions = {};
+        jsonOptions.apikey = msg.authKey;
+
+        return cloudantHelper(provider_endpoint, 'delete', replaceNameTrigger, jsonOptions);
     } else {
     	return whisk.error('operation is neither CREATE or DELETE');
     }
 }
 
-function cloudantHelper(endpoint, verb, name, auth, input) {
-    var uri = 'http://' + endpoint + '/cloudanttriggers/' + name;
-    var options = {
-        method : verb,
-        uri : uri
-    };
-
-    if(auth){
-        options.auth = {
-            user : auth[0],
-            pass : auth[1]
-        };
-    }
-
-    if (verb === 'put') {
-        options.json = input;
-    }
-
+function cloudantHelper(endpoint, verb, name, input) {
+    var url = 'http://' + endpoint + '/cloudanttriggers/' + name;
     var promise = new Promise(function(resolve, reject) {
-      request(options, function(error, response, body) {
-          console.log('cloudant trigger feed: done http request', '[error:]', error);
-          if (!error && response.statusCode === 200) {
-              console.log(body);
-              resolve();
-          } else {
-              if (response) {
-                  console.log('response code:', response.statusCode);
-              } else {
-                  console.log('no response');
-              }
-              reject(error);
-          }
-      });
+        request({
+            method : verb,
+            url : url,
+            json: input
+        }, function(error, response, body) {
+            console.log('cloudant trigger feed: done http request');
+            if (!error && response.statusCode === 200) {
+                console.log(body);
+                resolve();
+            }
+            else {
+                if (response) {
+                    console.log('response code:', response.statusCode);
+                    reject(body);
+                } else {
+                    console.log('no response');
+                    reject(error);
+                }
+            }
+        });
     });
 
     return promise;
diff --git a/provider/app.js b/provider/app.js
index 7f135b3..9a25a47 100644
--- a/provider/app.js
+++ b/provider/app.js
@@ -92,10 +92,9 @@
         }
     }
 
-    ///
     var nanoDb = createTriggerDb();
     if (nanoDb === null) {
-    	logger.error(tid, 'init', 'found an error creating database: ', err);
+    	logger.error(tid, 'init', 'found an error creating database: ');
     } else {
 
       logger.info(tid, 'init', 'trigger storage database details: ', nanoDb);
diff --git a/provider/lib/delete.js b/provider/lib/delete.js
index b1c68eb..a7d89a7 100644
--- a/provider/lib/delete.js
+++ b/provider/lib/delete.js
@@ -1,15 +1,55 @@
+var request = require('request');
+
 module.exports = function(tid, logger, utils) {
 
-  // Test Endpoint
-  this.endPoint = '/cloudanttriggers/:id';
+    // Test Endpoint
+    this.endPoint = '/cloudanttriggers/:id';
 
-  // Delete Logic
-  this.delete = function (req, res) {
+    // Delete Logic
+    this.delete = function (req, res) {
 
-    var method = 'DELETE /cloudanttriggers';
-    logger.info(tid, method);
-    utils.deleteTriggerFromDB(req.params.id, res);
+        var method = 'DELETE /cloudanttriggers';
+        logger.info(tid, method);
 
-  };
+        var id = req.params.id;
+        var args = typeof req.body === 'object' ? req.body : JSON.parse(req.body);
+
+        //Check that user has access rights to delete a trigger
+        var triggerObj = utils.parseQName(id, ':');
+        var host = 'https://' + utils.routerHost +':'+ 443;
+        var triggerURL = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
+        var auth = args.apikey.split(':');
+
+        request({
+            method: 'get',
+            url: triggerURL,
+            auth: {
+                user: auth[0],
+                pass: auth[1]
+            }
+        }, function(error, response, body) {
+            //delete from database if user is authenticated (200) or if trigger has already been deleted (404)
+            if (!error && (response.statusCode === 200 || response.statusCode === 404)) {
+                utils.deleteTriggerFromDB(id, res);
+            }
+             else {
+                var errorMsg = 'Cloudant data trigger ' + id  + ' cannot be deleted.';
+                logger.error(tid, method, errorMsg, error);
+                if (error) {
+                    res.status(400).json({
+                        message: errorMsg,
+                        error: error.message
+                    });
+                }
+                else {
+                    var info = JSON.parse(body);
+                    res.status(response.statusCode).json({
+                        message: errorMsg,
+                        error: info.error
+                    });
+                }
+            }
+        });
+    };
 
 };
diff --git a/provider/lib/update.js b/provider/lib/update.js
index a467d29..28c9907 100644
--- a/provider/lib/update.js
+++ b/provider/lib/update.js
@@ -1,46 +1,81 @@
+var request = require('request');
+
 module.exports = function(tid, logger, utils) {
 
-  // Test Endpoint
-  this.endPoint = '/cloudanttriggers/:id';
+    // Test Endpoint
+    this.endPoint = '/cloudanttriggers/:id';
 
-  // Update Logic
-  this.update = function (req, res) {
+    // Update Logic
+    this.update = function (req, res) {
 
-    var method = 'PUT /cloudanttriggers';
+        var method = 'PUT /cloudanttriggers';
 
-    logger.info(tid, method);
-    var args = typeof req.body === 'object' ? req.body : JSON.parse(req.body);
-    if(args.maxTriggers > utils.triggersLimit) {
-        // TODO: update error code to indicate that content provided is not correct
-        logger.warn(tid, method, 'maxTriggers > ' + utils.triggersLimit + ' is not allowed');
-        res.status(400).json({
-            error: 'maxTriggers > ' + utils.triggersLimit + ' is not allowed'
+        logger.info(tid, method);
+        var args = typeof req.body === 'object' ? req.body : JSON.parse(req.body);
+        if (args.maxTriggers > utils.triggersLimit) {
+            logger.warn(tid, method, 'maxTriggers > ' + utils.triggersLimit + ' is not allowed');
+            res.status(400).json({
+                error: 'maxTriggers > ' + utils.triggersLimit + ' is not allowed'
+            });
+            return;
+        } else if (!args.callback || !args.callback.action || !args.callback.action.name) {
+            logger.warn(tid, method, 'Your callback is unknown for cloudant trigger:', args.callback);
+            res.status(400).json({
+                error: 'Your callback is unknown for cloudant trigger.'
+            });
+            return;
+        }
+        //Check that user has access rights to create a trigger
+        var triggerName = args.callback.action.name;
+        var triggerObj = utils.parseQName(triggerName);
+        var host = 'https://' + utils.routerHost +':'+ 443;
+        var triggerURL = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
+        var auth = args.apikey.split(':');
+
+        logger.info(tid, method, 'Checking if user has access rights to create a trigger');
+        request({
+            method: 'get',
+            url: triggerURL,
+            auth: {
+                user: auth[0],
+                pass: auth[1]
+            }
+        }, function(error, response, body) {
+            if (error || response.statusCode >= 400) {
+                var errorMsg = 'Trigger authentication request failed.';
+                logger.error(tid, method, errorMsg, error);
+                if (error) {
+                    res.status(400).json({
+                        message: errorMsg,
+                        error: error.message
+                    });
+                }
+                else {
+                    var info = JSON.parse(body);
+                    res.status(response.statusCode).json({
+                        message: errorMsg,
+                        error: info.error
+                    });
+                }
+            }
+            else {
+                var id = req.params.id;
+                var trigger = utils.initTrigger(args, id);
+                // 10 is number of retries to create a trigger.
+                utils.createTrigger(trigger, 10)
+                .then(function (newTrigger) {
+                    logger.info(tid, method, 'Trigger was added and database is confirmed.', newTrigger);
+                    utils.addTriggerToDB(newTrigger, res);
+                }, function (err) {
+                    logger.error(tid, method, 'Trigger could not be created.', err);
+                    utils.deleteTrigger(id);
+                    res.status(400).json({
+                        message: 'Trigger could not be created.',
+                        error: err
+                    });
+                });
+            }
         });
-        return;
-    } else if (!args.callback || !args.callback.action || !args.callback.action.name) {
-        // TODO: update error code to indicate that content provided is not correct
-        logger.warn(tid, method, 'Your callback is unknown for cloudant trigger:', args.callback);
-        res.status(400).json({
-            error: 'You callback is unknown for cloudant trigger.'
-        });
-        return;
-    }
-    var id = req.params.id;
-    var trigger = utils.initTrigger(args, id);
-    // 10 is number of retries to create a trigger.
-    var promise = utils.createTrigger(trigger, utils.retryCount);
-    promise.then(function(newTrigger) {
-        logger.info(tid, method, "Trigger was added and database is confirmed.", newTrigger);
-        utils.addTriggerToDB(newTrigger, res);
-    }, function(err) {
-        logger.error(tid, method, "Trigger could not be created.", err);
-        utils.deleteTrigger(id);
-        res.status(400).json({
-            message: "Trigger could not be created.",
-            error: err
-        });
-    });
-
-  };
+    };
 
 };
diff --git a/provider/lib/utils.js b/provider/lib/utils.js
index 7a25a57..db82187 100644
--- a/provider/lib/utils.js
+++ b/provider/lib/utils.js
@@ -45,116 +45,116 @@
     // Add a trigger: listen for changes and dispatch.
     this.createTrigger = function(dataTrigger, retryCount) {
 
-      var method = 'createTrigger';
+        var method = 'createTrigger';
 
-      // Cleanup connection when trigger is deleted.
-      var sinceToUse = dataTrigger.since ? dataTrigger.since : "now";
-      var nanoConnection;
-      var dbURL;
-      var dbProtocol = 'https'; // unless specified protocol will default to https
-      if (dataTrigger.protocol) {
-        dbProtocol = dataTrigger.protocol;
-      }
+        // Cleanup connection when trigger is deleted.
+        var sinceToUse = dataTrigger.since ? dataTrigger.since : "now";
+        var nanoConnection;
+        var dbURL;
+        var dbProtocol = 'https'; // unless specified protocol will default to https
+        if (dataTrigger.protocol) {
+            dbProtocol = dataTrigger.protocol;
+        }
 
-      // unless specified host will default to accounturl without the https:// in front
-      var dbHost;
-      if (dataTrigger.host) {
-    	  dbHost = dataTrigger.host;
-      } else {
-    	  dbHost = dataTrigger.accounturl;
-    	  dbHost = dbHost.replace('https://','');
-      }
+        // unless specified host will default to accounturl without the https:// in front
+        var dbHost;
+        if (dataTrigger.host) {
+    	    dbHost = dataTrigger.host;
+        } else {
+    	    dbHost = dataTrigger.accounturl;
+    	    dbHost = dbHost.replace('https://','');
+        }
 
-      // both couch and cloudant should have their URLs in the username:password@host format
-      dbURL = dbProtocol + '://' + dataTrigger.user + ':' + dataTrigger.pass + '@' + dbHost;
+        // both couch and cloudant should have their URLs in the username:password@host format
+        dbURL = dbProtocol + '://' + dataTrigger.user + ':' + dataTrigger.pass + '@' + dbHost;
 
-      // add port if specified
-      if (dataTrigger.port) {
-        dbURL = dbURL + ':' + dataTrigger.port;
-      }
+        // add port if specified
+        if (dataTrigger.port) {
+            dbURL = dbURL + ':' + dataTrigger.port;
+        }
 
-      logger.info(tid, method,'found trigger url: ', dbURL);
-      nanoConnection = require('nano')(dbURL);
+        logger.info(tid, method,'found trigger url: ', dbURL);
+        nanoConnection = require('nano')(dbURL);
 
-      try {
+        try {
     	  
-          var triggeredDB = nanoConnection.use(dataTrigger.dbname);
+            var triggeredDB = nanoConnection.use(dataTrigger.dbname);
           
-          // Listen for changes on this database.
-          // always set the include doc setting to false
-          var feed = triggeredDB.follow({since: sinceToUse, include_docs: false});
+            // Listen for changes on this database.
+            // always set the include doc setting to false
+            var feed = triggeredDB.follow({since: sinceToUse, include_docs: false});
 
-          dataTrigger.feed = feed;
-          that.triggers[dataTrigger.id] = dataTrigger;
+            dataTrigger.feed = feed;
+            that.triggers[dataTrigger.id] = dataTrigger;
 
-          feed.on('change', function (change) {
-              var triggerHandle = that.triggers[dataTrigger.id];
+            feed.on('change', function (change) {
+                var triggerHandle = that.triggers[dataTrigger.id];
 
-              logger.info(tid, method, 'Got change from', dataTrigger.dbname, change, triggerHandle);
-              logger.info(tid, method, 'Found triggerHandle', triggerHandle);
+                logger.info(tid, method, 'Got change from', dataTrigger.dbname, change, triggerHandle);
+                logger.info(tid, method, 'Found triggerHandle', triggerHandle);
         	  
-              if (triggerHandle && triggerHandle.retriesLeft > 0) {
+                if (triggerHandle && triggerHandle.retriesLeft > 0) {
             	  
-            	  logger.info(tid, method, 'triggers left:', triggerHandle.triggersLeft);
-            	  logger.info(tid, method, 'retries left:', triggerHandle.retriesLeft);
+            	    logger.info(tid, method, 'triggers left:', triggerHandle.triggersLeft);
+            	    logger.info(tid, method, 'retries left:', triggerHandle.retriesLeft);
             	  
-                  if (triggerHandle.triggersLeft === -1) {
-                	  logger.info(tid, method, 'found a trigger fire limit set to -1.  setting it to fire infinitely many times');
-                      that.unlimitedTriggerFires = true;
-                  } else {
-                	  that.unlimitedTriggerFires = false;
-                  }
+                    if (triggerHandle.triggersLeft === -1) {
+                	    logger.info(tid, method, 'found a trigger fire limit set to -1.  setting it to fire infinitely many times');
+                        that.unlimitedTriggerFires = true;
+                    } else {
+                	    that.unlimitedTriggerFires = false;
+                    }
 
-                  if(that.unlimitedTriggerFires || triggerHandle.triggersLeft > 0) {
-                      try {
-                    	  logger.info(tid, method, 'found a valid trigger.  lets fire this trigger', triggerHandle);
-                          that.fireTrigger(dataTrigger.id, change);
-                      } catch (e) {
-                          logger.error(tid, method, 'Exception occurred in callback', e);
-                      }
-                  }
-              }
-          });
+                    if (that.unlimitedTriggerFires || triggerHandle.triggersLeft > 0) {
+                        try {
+                    	    logger.info(tid, method, 'found a valid trigger.  lets fire this trigger', triggerHandle);
+                            that.fireTrigger(dataTrigger.id, change);
+                        } catch (e) {
+                            logger.error(tid, method, 'Exception occurred in callback', e);
+                        }
+                    }
+                }
+            });
 
-          feed.follow();
+            feed.follow();
 
-          return new Promise(function(resolve, reject) {
+            return new Promise(function(resolve, reject) {
 
-          feed.on('error', function (err) {
-              logger.error(tid, method,'Error occurred for trigger', dataTrigger.id, '(db ' + dataTrigger.dbname + '):', err);
-              // revive the feed if an error occured for now
-              // the user should be in charge of removing the feeds
-              logger.info(tid, "attempting to recreate trigger", dataTrigger.id);
-              that.deleteTrigger(dataTrigger.id);
-              dataTrigger.since = "now";
-              if (retryCount > 0) {
-                  var addTriggerPromise = that.createTrigger(dataTrigger, (retryCount - 1));
-                  addTriggerPromise.then(function(trigger) {
-                      logger.error(tid, method, "Retry Count:", (retryCount - 1));
-                      resolve(trigger);
-                  }, function(err) {
-                      reject(err);
-                  });
-              } else {
-                  logger.error(tid, method, "Trigger's feed produced too many errors. Deleting the trigger", dataTrigger.id, '(db ' + dataTrigger.dbname + ')');
-                  reject({
-                      error: err,
-                      message: "Trigger's feed produced too many errors. Deleting the trigger " + dataTrigger.id
-                  });
-              }
-          });
+            feed.on('error', function (err) {
+                logger.error(tid, method,'Error occurred for trigger', dataTrigger.id, '(db ' + dataTrigger.dbname + '):', err);
+                // revive the feed if an error occured for now
+                // the user should be in charge of removing the feeds
+                logger.info(tid, "attempting to recreate trigger", dataTrigger.id);
+                that.deleteTrigger(dataTrigger.id);
+                dataTrigger.since = "now";
+                if (retryCount > 0) {
+                    that.createTrigger(dataTrigger, (retryCount - 1))
+                    .then(function(trigger) {
+                        logger.error(tid, method, "Retry Count:", (retryCount - 1));
+                        resolve(trigger);
+                    }, function(err) {
+                        reject(err);
+                    });
+                } else {
+                    logger.error(tid, method, "Trigger's feed produced too many errors. Deleting the trigger", dataTrigger.id, '(db ' + dataTrigger.dbname + ')');
+                    reject({
+                        error: err,
+                        message: "Trigger's feed produced too many errors. Deleting the trigger " + dataTrigger.id
+                    });
+                }
+            });
 
-          feed.on('confirm', function (dbObj) {
-              logger.info(tid, method, 'Added cloudant data trigger', dataTrigger.id, 'listening for changes in database', dataTrigger.dbname);
-              resolve(dataTrigger);
-          });
+            feed.on('confirm', function (dbObj) {
+                logger.info(tid, method, 'Added cloudant data trigger', dataTrigger.id, 'listening for changes in database', dataTrigger.dbname);
+                resolve(dataTrigger);
+            });
 
         });
         
-      } catch (err) {
-          logger.info('caught an exception: ' + err);
-          return Promise.reject(err);
-      }  
+        } catch (err) {
+            logger.info('caught an exception: ' + err);
+            return Promise.reject(err);
+        }
 
     };
 
@@ -333,8 +333,8 @@
         logger.info(tid, method, 'fireTrigger: form =', form);
         logger.info(tid, method, 'for trigger', id, 'invoking action', triggerName, 'with db update', JSON.stringify(form));
 
-        var host = 'https://'+routerHost+':'+443;
-        var uri = host+'/api/v1/namespaces/' + triggerObj.namespace +'/triggers/'+triggerObj.name;
+        var host = 'https://' + routerHost + ':' + 443;
+        var uri = host + '/api/v1/namespaces/' + triggerObj.namespace + '/triggers/' + triggerObj.name;
         var auth = apikey.split(':');
         logger.info(tid, method, uri, auth, form);
 
@@ -386,9 +386,9 @@
         });
     };
 
-    this.parseQName = function (qname) {
+    this.parseQName = function (qname, separator) {
         var parsed = {};
-        var delimiter = '/';
+        var delimiter = separator || '/';
         var defaultNamespace = '_';
         if (qname && qname.charAt(0) === delimiter) {
             var parts = qname.split(delimiter);