mirror of
https://github.com/mclueppers/xo-server.git
synced 2025-07-28 16:34:40 +02:00
Minor bug fixes. Complete MySQL backend support for User management
This commit is contained in:
parent
7bc47a5ab9
commit
1a6aa64a1a
@ -99,4 +99,15 @@ mysql:
|
|||||||
# If uri is specified the above configuration options are not in use
|
# If uri is specified the above configuration options are not in use
|
||||||
#
|
#
|
||||||
# Default: mysql://xoauser:xoapass@localhost/xoa
|
# Default: mysql://xoauser:xoapass@localhost/xoa
|
||||||
#uri: mysql://xoauser:xoapass@localhost/xoa
|
#uri: mysql://xoauser:xoapass@localhost/xoa
|
||||||
|
|
||||||
|
# Configuration of the userdb
|
||||||
|
userdb:
|
||||||
|
# Type of the backend?
|
||||||
|
#
|
||||||
|
# Syntax: mysql, redis, postgres, ldap
|
||||||
|
#
|
||||||
|
# /!\ Currently supported backends: redis, mysql
|
||||||
|
#
|
||||||
|
# Default: redis
|
||||||
|
#type: redis
|
||||||
|
@ -29,18 +29,12 @@ function MySQL(options, models)
|
|||||||
options = {};
|
options = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!options.uri)
|
|
||||||
{
|
|
||||||
throw 'MySQL missing option: uri';
|
|
||||||
}
|
|
||||||
|
|
||||||
_.defaults(options, {
|
_.defaults(options, {
|
||||||
'indexes': [],
|
'indexes': [],
|
||||||
});
|
});
|
||||||
|
|
||||||
MySQL.super_.call(this, models);
|
MySQL.super_.call(this, models);
|
||||||
|
|
||||||
this.uri = options.uri;
|
|
||||||
this.indexes = options.indexes;
|
this.indexes = options.indexes;
|
||||||
this.prefix = options.prefix;
|
this.prefix = options.prefix;
|
||||||
}
|
}
|
||||||
@ -159,8 +153,6 @@ MySQL.prototype._add = function (models, options)
|
|||||||
};
|
};
|
||||||
|
|
||||||
_.each(models, function (model) {
|
_.each(models, function (model) {
|
||||||
var promise;
|
|
||||||
|
|
||||||
// Extend the schema adding missing values
|
// Extend the schema adding missing values
|
||||||
var tday = new Date().toISOString().replace(/T/, ' ').replace(/\..+/, ''); // @todo: use of nodejs library maybe?!
|
var tday = new Date().toISOString().replace(/T/, ' ').replace(/\..+/, ''); // @todo: use of nodejs library maybe?!
|
||||||
|
|
||||||
@ -175,11 +167,11 @@ MySQL.prototype._add = function (models, options)
|
|||||||
activationtoken: null
|
activationtoken: null
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log(data);
|
|
||||||
|
|
||||||
if (!replace) {
|
if (!replace) {
|
||||||
promises.push(knex('users').insert(data));
|
promises.push(knex('users').insert(data));
|
||||||
} else {
|
} else {
|
||||||
|
delete data.created;
|
||||||
|
//data.lastmodified(tday);
|
||||||
promises.push(knex('users').where('email', model.email).update(data));
|
promises.push(knex('users').where('email', model.email).update(data));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -200,20 +192,16 @@ MySQL.prototype._remove = function (ids)
|
|||||||
keys.push(ids[i]);
|
keys.push(ids[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(keys);
|
|
||||||
console.log(ids);
|
|
||||||
|
|
||||||
// @todo Handle indexes.
|
// @todo Handle indexes.
|
||||||
//promises.push(knex('users').whereIn('email', keys).del());
|
promises.push(knex('users').whereIn('email', keys).del());
|
||||||
|
|
||||||
promises.push(true);
|
|
||||||
|
|
||||||
return Q.all(promises);
|
return Q.all(promises);
|
||||||
};
|
};
|
||||||
|
|
||||||
MySQL.prototype._update = function (models)
|
MySQL.prototype._update = function (models)
|
||||||
{
|
{
|
||||||
console.info('Not yet implemented: _update');
|
// _add already handles variable sanitation
|
||||||
|
return this._add(models, {replace: true});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -91,8 +91,6 @@ Redis.prototype._add = function (models, options) {
|
|||||||
|
|
||||||
var promises = [];
|
var promises = [];
|
||||||
|
|
||||||
console.log(models);
|
|
||||||
|
|
||||||
_.each(models, function (model) {
|
_.each(models, function (model) {
|
||||||
var promise;
|
var promise;
|
||||||
|
|
||||||
@ -195,7 +193,6 @@ Redis.prototype._get = function (properties) {
|
|||||||
|
|
||||||
ids = [id];
|
ids = [id];
|
||||||
}
|
}
|
||||||
console.log(ids);
|
|
||||||
return self._extract(ids);
|
return self._extract(ids);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -369,7 +369,7 @@ cfg.merge({
|
|||||||
'binddn' : 'dc=example,dc=com',
|
'binddn' : 'dc=example,dc=com',
|
||||||
},
|
},
|
||||||
'userdb': {
|
'userdb': {
|
||||||
'type' : 'mysql' // Accepted values 'redis', 'mysql' and 'ldap'. More to come later on
|
'type' : 'redis' // Accepted values 'redis', 'mysql' and 'ldap'. More to come later on
|
||||||
},
|
},
|
||||||
// End of mod by Martin Dobrev
|
// End of mod by Martin Dobrev
|
||||||
});
|
});
|
||||||
@ -422,6 +422,11 @@ read_file(__dirname +'/../config/local.yaml').then(
|
|||||||
var username = cfg.get('mysql', 'username').toString();
|
var username = cfg.get('mysql', 'username').toString();
|
||||||
var password = cfg.get('mysql', 'password').toString();
|
var password = cfg.get('mysql', 'password').toString();
|
||||||
|
|
||||||
|
// Initialize Knex
|
||||||
|
//
|
||||||
|
// /!\ Initialize it only once
|
||||||
|
//
|
||||||
|
// on later stage use knex = require('knex').knex for DB queries
|
||||||
Knex.knex = Knex.initialize(
|
Knex.knex = Knex.initialize(
|
||||||
{
|
{
|
||||||
client: 'mysql',
|
client: 'mysql',
|
||||||
|
56
src/xo.js
56
src/xo.js
@ -5,7 +5,6 @@ var Q = require('q');
|
|||||||
|
|
||||||
var MemoryCollection = require('./collection/memory');
|
var MemoryCollection = require('./collection/memory');
|
||||||
var RedisCollection = require('./collection/redis');
|
var RedisCollection = require('./collection/redis');
|
||||||
var MySQLCollection = require('./collection/mysql');
|
|
||||||
var Model = require('./model');
|
var Model = require('./model');
|
||||||
var Xapi = require('./xapi');
|
var Xapi = require('./xapi');
|
||||||
|
|
||||||
@ -136,8 +135,12 @@ var User = Model.extend({
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* Mod by Martin Dobrev
|
||||||
|
This snippet is obsolete now
|
||||||
|
Take a look at the InitializeUsersBackend function
|
||||||
|
|
||||||
// @todo handle email uniqueness.
|
// @todo handle email uniqueness.
|
||||||
var Users = MySQLCollection.extend({
|
var Users = RedisCollection.extend({
|
||||||
'model': User,
|
'model': User,
|
||||||
|
|
||||||
'create': function (email, password, permission) {
|
'create': function (email, password, permission) {
|
||||||
@ -155,6 +158,47 @@ var Users = MySQLCollection.extend({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
*/
|
||||||
|
|
||||||
|
function InitializeUsersBackend(backend)
|
||||||
|
{
|
||||||
|
var collection = null;
|
||||||
|
|
||||||
|
switch (backend)
|
||||||
|
{
|
||||||
|
case 'redis' : collection = require('./collection/redis'); break;
|
||||||
|
case 'mysql' : collection = require('./collection/mysql'); break;
|
||||||
|
case 'postgre' : break;
|
||||||
|
case 'sqlite' : break;
|
||||||
|
case 'ldap' : break;
|
||||||
|
default : throw "Userdb backend not supported: " + backend; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (collection !== null) {
|
||||||
|
console.info('UserDB initialized with %s backend', backend);
|
||||||
|
|
||||||
|
return collection.extend({
|
||||||
|
'model': User,
|
||||||
|
|
||||||
|
'create': function (email, password, permission) {
|
||||||
|
var user = new User({
|
||||||
|
'email': email,
|
||||||
|
});
|
||||||
|
if (permission)
|
||||||
|
{
|
||||||
|
user.set('permission', permission);
|
||||||
|
}
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
return user.setPassword(password).then(function () {
|
||||||
|
return self.add(user);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
throw "Unable to initialize UserDB Collection";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
@ -230,6 +274,10 @@ Xo.prototype.computeStats = _.throttle(function () {
|
|||||||
Xo.prototype.start = function (cfg) {
|
Xo.prototype.start = function (cfg) {
|
||||||
var xo = this;
|
var xo = this;
|
||||||
var redis = require('then-redis').createClient(cfg.get('redis', 'uri'));
|
var redis = require('then-redis').createClient(cfg.get('redis', 'uri'));
|
||||||
|
|
||||||
|
// Modified by Martin Dobrev @ 2013-10-25
|
||||||
|
var userdb = InitializeUsersBackend(cfg.get('userdb', 'type'));
|
||||||
|
// End of mod
|
||||||
|
|
||||||
//--------------------------------------
|
//--------------------------------------
|
||||||
// Persistent collections.
|
// Persistent collections.
|
||||||
@ -244,10 +292,10 @@ Xo.prototype.start = function (cfg) {
|
|||||||
'prefix': 'xo:token',
|
'prefix': 'xo:token',
|
||||||
'indexes': ['user_id'],
|
'indexes': ['user_id'],
|
||||||
});
|
});
|
||||||
xo.users = new Users({
|
// Mod by Martin Dobrev - Replaced Users with the result of the UserDB initializer
|
||||||
|
xo.users = new userdb({
|
||||||
'connection': redis,
|
'connection': redis,
|
||||||
'prefix' : 'xo:user',
|
'prefix' : 'xo:user',
|
||||||
'uri' : cfg.get('mysql', 'uri'),
|
|
||||||
'indexes' : ['email'],
|
'indexes' : ['email'],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user