|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- const AuthProvider = require('./provider');
-
- class DatabaseProvider extends AuthProvider {
-
- constructor(app, opts, name) {
- super(app, opts, name);
- this.users = opts.users;
- this.perms = opts.permissions;
- this.db = app.getDbConnection(opts.connection);
- }
-
- async validate(username, password, passwordVerify) {
- if (!username) return false;
- if (!password) password = '';
-
- let results = await this.db
- .select(this.users.identity, this.users.username, this.users.password)
- .from(this.users.table)
- .where(this.users.username, username);
-
- for (let result of results) {
- if (result[this.users.username] == username) {
- if (passwordVerify && result[this.users.password].startsWith('$')) {
- const argon2 = require('argon2');
- const valid = await argon2.verify(result[this.users.password], password);
- return valid ? result[this.users.identity] : false;
- } else if (result[this.users.password] == password) {
- return result[this.users.identity];
- }
- }
- }
-
- return false;
- }
-
- async permissions(identity, permissions) {
- for (let permission of permissions) {
- if (!this.perms[permission]) return false;
-
- let perm = this.perms[permission];
- let table = perm.table || this.users.table;
- let ident = perm.identity || this.users.identity;
-
- let results = await this.db
- .select(ident)
- .from(table)
- .where(ident, identity)
- .where(function() {
- for (let condition of perm.conditions) {
- if (condition.operator == 'in') {
- this.whereIn(condition.column, condition.value);
- } else if (condition.operator == 'not in') {
- this.whereNotIn(condition.column, condition.value);
- } else if (condition.operator == 'is null') {
- this.whereNull(condition.column);
- } else if (condition.operator == 'is not null') {
- this.whereNotNull(condition.column);
- } else {
- this.where(condition.column, condition.operator, condition.value);
- }
- }
- });
-
- if (!results.length) return false;
- }
-
- return true;
- }
-
- }
-
- module.exports = DatabaseProvider;
|