mirror of
https://github.com/verdaccio/verdaccio.git
synced 2024-11-13 03:35:52 +01:00
66 lines
1.8 KiB
JavaScript
66 lines
1.8 KiB
JavaScript
var crypto = require('crypto')
|
|
var crypt3 = require('./crypt3')
|
|
var locker = require('../../file-locking')
|
|
|
|
// this function neither unlocks file nor closes it
|
|
// it'll have to be done manually later
|
|
function lock_and_read(name, cb) {
|
|
locker.readFile(name, {lock: true}, function (err, res) {
|
|
if (err) {
|
|
return cb(err)
|
|
}
|
|
return cb(null, res)
|
|
})
|
|
}
|
|
|
|
// close and unlock file
|
|
function unlock_file(name, cb) {
|
|
locker.unlockFile(name, cb)
|
|
}
|
|
|
|
function parse_htpasswd(input) {
|
|
var result = {}
|
|
input.split('\n').forEach(function(line) {
|
|
var args = line.split(':', 3)
|
|
if (args.length > 1) result[args[0]] = args[1]
|
|
})
|
|
return result
|
|
}
|
|
|
|
function verify_password(user, passwd, hash) {
|
|
if (hash.indexOf('{PLAIN}') === 0) {
|
|
return passwd === hash.substr(7)
|
|
} else if (hash.indexOf('{SHA}') === 0) {
|
|
return crypto.createHash('sha1').update(passwd, 'binary').digest('base64') === hash.substr(5)
|
|
} else if (crypt3) {
|
|
return crypt3(passwd, hash) === hash
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
|
|
function add_user_to_htpasswd(body, user, passwd) {
|
|
if (user !== encodeURIComponent(user)) {
|
|
var err = Error('username should not contain non-uri-safe characters')
|
|
err.status = 409
|
|
throw err
|
|
}
|
|
|
|
if (crypt3) {
|
|
passwd = crypt3(passwd)
|
|
} else {
|
|
passwd = '{SHA}' + crypto.createHash('sha1').update(passwd, 'binary').digest('base64')
|
|
}
|
|
var comment = 'autocreated ' + (new Date()).toJSON()
|
|
|
|
var newline = user + ':' + passwd + ':' + comment + '\n'
|
|
if (body.length && body[body.length-1] !== '\n') newline = '\n' + newline
|
|
return body + newline
|
|
}
|
|
|
|
module.exports.parse_htpasswd = parse_htpasswd
|
|
module.exports.verify_password = verify_password
|
|
module.exports.add_user_to_htpasswd = add_user_to_htpasswd
|
|
module.exports.lock_and_read = lock_and_read
|
|
module.exports.unlock_file = unlock_file
|