Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 74 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)

Expand Down
12 changes: 9 additions & 3 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand Down Expand Up @@ -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") {
Expand All @@ -109,27 +109,32 @@ _doRequest = function (options, callback) {
response.on('data', function(chunk) {
data += chunk.toString();
});

if(response.statusCode === 204) {
return callback(null, response.statusCode);
}

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);
}

response.on('end', function () {
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 {
Expand All @@ -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 {
Expand Down
104 changes: 100 additions & 4 deletions lib/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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);
}
}
});
Expand All @@ -60,15 +156,15 @@ module.exports.remove = function (username, callback) {
_doRequest(options, function(err, res) {
if(err) {
return callback(err);
}
}
else {
if(res === 204) {
return callback(null);
}
else {
var error = new Error("Invalid Response from Atlassian Crowd");
error.type = "INVALID_RESPONSE";
return callback(err);
return callback(error);
}
}
});
Expand All @@ -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") {
Expand Down