You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

254 lines
6.5 KiB

// Should be able to use this module to log into the registry, as well.
var tap = require('tap')
, CouchLogin = require('../couch-login.js')
// Yeah, go ahead and abuse my staging server, whatevs.
var auth = { name: 'testuser', password: 'test' }
, newAuth = { name: 'testuser', password: 'asdfasdf' }
, couch = new CouchLogin('https://staging.npmjs.org/')
, u = '/_users/org.couchdb.user:' + auth.name
, userRecordMarker
// simulate the 'must change password on next login' thing
newAuth.mustChangePass = true
auth.mustChangePass = false
function okStatus (t, res) {
var x = { found: res.statusCode, wanted: 'around 200' }
var r = res.statusCode
x.ok = (r >= 200 && r < 300)
return t.ok(x.ok, 'Status code should be 200-ish', x)
}
tap.test('login', function (t) {
couch.login(auth, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.deepEqual(data, { ok: true, name: 'testuser', roles: [] })
t.ok(couch.token)
t.deepEqual(couch.token,
{ AuthSession: couch.token && couch.token.AuthSession,
version: '1',
expires: couch.token && couch.token.expires,
path: '/',
httponly: true })
t.ok(couch.token, 'has token')
t.end()
})
})
var userRecord
tap.test('get', function (t) {
couch.get(u, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
t.ok(data, 'data')
t.ok(couch.token, 'token')
userRecord = data
okStatus(t, res)
t.end()
})
})
var userRecordMarker = require('crypto').randomBytes(30).toString('base64')
tap.test('add key to user record', function (t) {
userRecord.testingCouchLogin = userRecordMarker
var revved = u + '?rev=' + userRecord._rev
couch.put(revved, userRecord, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.ok(couch.token, 'token')
// get again so we have the current rev
couch.get(u, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data)
t.ok(userRecord)
t.equal(data.testingCouchLogin, userRecord.testingCouchLogin)
userRecord = data
t.end()
})
})
})
tap.test('remove key', function (t) {
var revved = u + '?rev=' + userRecord._rev
delete userRecord.testingCouchLogin
couch.put(revved, userRecord, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(couch.token, 'token')
couch.get(u, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.ok(couch.token, 'token')
t.equal(data.testingCouchLogin, undefined)
userRecord = data
t.end()
})
})
})
var crypto = require('crypto')
function sha (s) {
return crypto.createHash("sha1").update(s).digest("hex")
}
tap.test('change password manually', function (t) {
var revved = u + '?rev=' + userRecord._rev
, newPass = newAuth.password
, newSalt = 'test-salt-two'
, newSha = sha(newPass + newSalt)
userRecord.salt = newSalt
userRecord.password_sha = newSha
couch.put(revved, userRecord, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
// changing password invalidates session.
// need to re-login
couch.login(newAuth, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
couch.get(u, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.ok(couch.token, 'token')
t.equal(data.testingCouchLogin, undefined)
userRecord = data
t.end()
})
})
})
})
tap.test('change password back manually', function (t) {
var revved = u + '?rev=' + userRecord._rev
, newPass = auth.password
, newSalt = 'test-salt'
, newSha = sha(newPass + newSalt)
userRecord.salt = newSalt
userRecord.password_sha = newSha
couch.put(revved, userRecord, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.ok(couch.token, 'token')
couch.login(auth, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
couch.get(u, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.ok(couch.token, 'token')
userRecord = data
t.end()
})
})
})
})
tap.test('change password easy', function (t) {
couch.changePass(newAuth, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
couch.get(u, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.ok(couch.token, 'token')
t.equal(data.testingCouchLogin, undefined)
t.equal(data.mustChangePass, true)
userRecord = data
t.end()
})
})
})
tap.test('change password back easy', function (t) {
couch.changePass(auth, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
couch.get(u, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.ok(couch.token, 'token')
t.equal(data.testingCouchLogin, undefined)
t.equal(data.mustChangePass, false)
userRecord = data
t.end()
})
})
})
tap.test('logout', function (t) {
couch.logout(function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.notOk(couch.token, 'token')
t.end()
})
})
var signupUser = { name: 'test-user-signup', password: 'signup-test' }
tap.test('sign up as new user', function (t) {
couch.signup(signupUser, function (er, res, data) {
t.ifError(er)
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.has(data,
{ _id: 'org.couchdb.user:test-user-signup',
name: 'test-user-signup',
roles: [],
type: 'user' })
t.ok(data._rev, 'rev')
t.ok(data.date, 'date')
t.ok(data.password_sha, 'hash')
t.ok(data.salt, 'salt')
t.ok(couch.token, 'token')
// now delete account
var name = signupUser.name
couch.deleteAccount(name, function (er, res, data) {
t.ifError(er, 'should be no error deleting account')
if (er) return t.end()
okStatus(t, res)
t.ok(data, 'data')
t.end()
})
})
})