diff --git a/README.md b/README.md index bd3d96f..a739b53 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ crowd.search('group', 'name="*test*"', function (err, res) { Here you can find utilities for Managing, Creating, Removing, Users as well as Changing Passwords, and Basic Authentication (NON SSO). #### Finding a User by Username #### -user.find(userrname, callback) +user.find(username, callback) * username String * callback Function (err, res) @@ -103,6 +103,22 @@ crowd.user.find('user', function(err, res) { } }); ``` +#### Finding a User by Username (and return user's attributes) #### +user.findWithAttributes(username, callback) + +* username String +* callback Function (err, res) + +```javascript +crowd.user.findWithAttributes('user', function(err, res) { + if(err) { + throw err; + } + else { + console.log(res); + } +}); +``` #### Checking if User is Active #### user.active(username, callback) @@ -177,6 +193,63 @@ crowd.user.groups('testuser', function (err, res) { }); ``` +#### List a User's Attributes #### +user.getAttributes(username, callback) + +* username String +* callback Function (err, res) + +```javascript +crowd.user.getAttributes('user', function(err, res) { + if(err) { + throw err; + } + else { + console.log(res); + } +}); +``` + +#### Modify/Add User Attributes #### +user.postAttributes(username, attributes, callback) + +* username String +* attributes array of objects in the format: +* { +* "name" : "attributeName", +* "values" : [ "arrayOfArbitraryValues" ] +* } +* callback Function (err, res) + +```javascript +crowd.user.postAttributes('user', arrayOfAttributes, function(err, res) { + if(err) { + throw err; + } + else { + console.log(res); + } +}); +``` + +#### Delete a User's Attribute #### +user.deleteAttributes(username, attributeName, callback) + +* username String +* attributeName String +* callback Function (err, res) + +```javascript +crowd.user.deleteAttributes('user', 'attribute-name', function(err, res) { + if(err) { + throw err; + } + else { + console.log(res); + } +}); +``` + #### User Authentication (NON SSO) #### user.authenticate(username, password, callback) diff --git a/lib/index.js b/lib/index.js index c438686..66d0251 100644 --- a/lib/index.js +++ b/lib/index.js @@ -32,7 +32,7 @@ function AtlassianCrowd(options) { settings.authstring = settings.application.name + ":" + settings.application.password; - if(!settings.port) { + if(!settings.port) { settings.port = (uri.port) ? uri.port : (uri.protocol === "https:") ? 443 : 80; } } @@ -93,7 +93,7 @@ _doRequest = function (options, callback) { error = new Error("Missing POST Data"); error.type = "BAD_REQUEST"; return callback(error); - } + } } else { if(options.method === "DELETE") { @@ -109,7 +109,7 @@ _doRequest = function (options, callback) { response.on('data', function(chunk) { data += chunk.toString(); }); - + if(response.statusCode === 204) { return callback(null, response.statusCode); } @@ -117,12 +117,14 @@ _doRequest = function (options, callback) { if(response.statusCode === 401) { error = new Error("Application Authorization Error"); error.type = "APPLICATION_ACCESS_DENIED"; + error.statusCode = response.statusCode; return callback(error); } if(response.statusCode === 403) { error = new Error("Application Permission Denied"); error.type = "APPLICATION_PERMISSION_DENIED"; + error.statusCode = response.statusCode; return callback(error); } @@ -130,6 +132,9 @@ _doRequest = function (options, callback) { if (response.headers['content-type'] !== "application/json") { error = new Error("Invalid Response from Atlassian Crowd"); error.type = "INVALID_RESPONSE"; + error.statusCode = response.statusCode; + error.res = response; + error.headers = response.headers; return callback(error); } else { @@ -142,6 +147,7 @@ _doRequest = function (options, callback) { } error = new Error(data.message); error.type = data.reason; + error.statusCode = response.statusCode; return callback(error); } else { diff --git a/lib/user.js b/lib/user.js index 4de610f..9fd1bb8 100644 --- a/lib/user.js +++ b/lib/user.js @@ -14,6 +14,102 @@ module.exports.find = function (username, callback) { }); }; +module.exports.findWithAttributes = function (username, callback) { + var options = { + method: "GET", + path: "/user?username=" + username + "&expand=attributes" + }; + + _doRequest(options, function(err, res) { + if(err) { + callback(err); + } + else { + callback(null, res); + } + }); +}; + +module.exports.getAttributes = function (username, callback) { + var options = { + method: "GET", + path: "/user/attribute?username=" + username + }; + + _doRequest(options, function(err, res) { + if(err) { + callback(err); + } + else { + callback(null, res); + } + }); +}; + +module.exports.postAttributes = function (username, attributes, callback) { + // attributes param should be an array of json objects with following format: + // { + // "name" : "attributeName", + // "values" : [ "arrayOfArbitraryValues" ] + // } + var payload = { + "attributes": attributes + }; + + var options = { + "method": "POST", + "data": JSON.stringify(payload), + "path": "/user/attribute?username=" + username + }; + + _doRequest(options, function(err, res) { + if (err) { + return callback(err); + } else { + var error; + if (res === 204) { + return callback(null); + } if (res === 404) { + error = new Error("User could not be found in Crowd"); + error.type = "NOT_FOUND"; + return callback(error); + } else { + error = new Error("Invalid Response from Atlassian Crowd"); + error.type = "INVALID_RESPONSE"; + return callback(error); + } + } + }); +}; + +module.exports.deleteAttribute = function (username, attributeName, callback) { + + console.log(username, attributeName); + var options = { + method: "DELETE", + path: "/user/attribute?username=" + username + "&attributename=" + attributeName + }; + + _doRequest(options, function(err, res) { + if (err) { + return callback(err); + } else { + var error; + if (res === 204) { + return callback(null); + } if (res === 404) { + error = new Error("User or Attribute could not be found in Crowd"); + error.type = "NOT_FOUND"; + return callback(error); + } else { + error = new Error("Invalid Response from Atlassian Crowd"); + error.type = "INVALID_RESPONSE"; + return callback(error); + } + } + }); +}; + module.exports.create = function (firstname, lastname, displayname, email, username, password, callback) { var payload = { "name": username, @@ -44,7 +140,7 @@ module.exports.create = function (firstname, lastname, displayname, email, usern else { var error = new Error("Invalid Response from Atlassian Crowd"); error.type = "INVALID_RESPONSE"; - return callback(err); + return callback(error); } } }); @@ -60,7 +156,7 @@ module.exports.remove = function (username, callback) { _doRequest(options, function(err, res) { if(err) { return callback(err); - } + } else { if(res === 204) { return callback(null); @@ -68,7 +164,7 @@ module.exports.remove = function (username, callback) { else { var error = new Error("Invalid Response from Atlassian Crowd"); error.type = "INVALID_RESPONSE"; - return callback(err); + return callback(error); } } }); @@ -91,7 +187,7 @@ module.exports.changepassword = function (username, password, callback) { module.exports.active = function (username, callback) { this.find(username, function (err, res) { if(err) { - return callback(err); + return callback(err); } else { if(res.active.toString() === "true") {