2014-08-14 13:25:22 -04:00
|
|
|
var _ = require("lodash");
|
2014-08-13 19:43:11 -04:00
|
|
|
var fs = require("fs");
|
2014-08-13 21:51:54 -04:00
|
|
|
var Client = require("./client");
|
2014-09-13 08:23:17 -04:00
|
|
|
var Helper = require("./helper");
|
2016-06-11 16:03:59 -04:00
|
|
|
var Oidentd = require("./oidentd");
|
2014-08-13 19:43:11 -04:00
|
|
|
|
|
|
|
module.exports = ClientManager;
|
|
|
|
|
|
|
|
function ClientManager() {
|
2014-08-14 12:35:37 -04:00
|
|
|
this.clients = [];
|
2016-04-26 16:41:08 -04:00
|
|
|
|
2016-06-08 05:26:24 -04:00
|
|
|
if (typeof Helper.config.oidentd === "string") {
|
|
|
|
this.identHandler = new Oidentd(Helper.config.oidentd);
|
2016-04-26 16:41:08 -04:00
|
|
|
}
|
2014-08-13 19:43:11 -04:00
|
|
|
}
|
|
|
|
|
2014-08-14 12:35:37 -04:00
|
|
|
ClientManager.prototype.findClient = function(name) {
|
|
|
|
for (var i in this.clients) {
|
|
|
|
var client = this.clients[i];
|
2015-09-30 18:39:57 -04:00
|
|
|
if (client.name === name) {
|
2014-08-14 12:35:37 -04:00
|
|
|
return client;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
|
2014-09-24 18:23:54 -04:00
|
|
|
ClientManager.prototype.loadUsers = function() {
|
2014-08-13 19:43:11 -04:00
|
|
|
var users = this.getUsers();
|
2014-08-13 21:51:54 -04:00
|
|
|
for (var i in users) {
|
2014-09-24 18:23:54 -04:00
|
|
|
this.loadUser(users[i]);
|
2014-08-13 21:51:54 -04:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
ClientManager.prototype.loadUser = function(name) {
|
|
|
|
try {
|
2016-02-16 19:14:43 -05:00
|
|
|
var json = this.readUserConfig(name);
|
2015-09-30 18:39:57 -04:00
|
|
|
} catch (e) {
|
2016-04-16 07:32:38 -04:00
|
|
|
log.error("Failed to read user config", e);
|
2014-08-13 21:51:54 -04:00
|
|
|
return;
|
|
|
|
}
|
2014-09-24 18:23:54 -04:00
|
|
|
if (!this.findClient(name)) {
|
|
|
|
this.clients.push(new Client(
|
2016-02-16 19:14:43 -05:00
|
|
|
this,
|
2014-09-24 18:23:54 -04:00
|
|
|
name,
|
|
|
|
json
|
|
|
|
));
|
|
|
|
}
|
2014-08-13 19:43:11 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
ClientManager.prototype.getUsers = function() {
|
|
|
|
var users = [];
|
|
|
|
try {
|
2016-05-08 02:21:31 -04:00
|
|
|
var files = fs.readdirSync(Helper.USERS_PATH);
|
2014-10-14 18:24:15 -04:00
|
|
|
files.forEach(function(file) {
|
|
|
|
if (file.indexOf(".json") !== -1) {
|
|
|
|
users.push(file.replace(".json", ""));
|
|
|
|
}
|
2014-10-14 16:05:16 -04:00
|
|
|
});
|
2015-09-30 18:39:57 -04:00
|
|
|
} catch (e) {
|
2016-04-16 07:32:38 -04:00
|
|
|
log.error("Failed to get users", e);
|
2014-08-13 19:43:11 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
return users;
|
|
|
|
};
|
|
|
|
|
2014-08-13 21:51:54 -04:00
|
|
|
ClientManager.prototype.addUser = function(name, password) {
|
2014-08-13 19:43:11 -04:00
|
|
|
var users = this.getUsers();
|
|
|
|
if (users.indexOf(name) !== -1) {
|
2014-08-14 13:25:22 -04:00
|
|
|
return false;
|
2014-08-13 19:43:11 -04:00
|
|
|
}
|
|
|
|
try {
|
2016-04-02 17:19:57 -04:00
|
|
|
|
2016-05-08 02:21:31 -04:00
|
|
|
if (require("path").basename(name) !== name) {
|
2016-04-02 17:19:57 -04:00
|
|
|
throw new Error(name + " is an invalid username.");
|
|
|
|
}
|
|
|
|
|
2014-08-13 21:51:54 -04:00
|
|
|
var user = {
|
|
|
|
user: name,
|
|
|
|
password: password || "",
|
2014-10-14 15:25:04 -04:00
|
|
|
log: false,
|
2014-08-13 21:51:54 -04:00
|
|
|
networks: []
|
|
|
|
};
|
|
|
|
fs.writeFileSync(
|
2016-05-08 02:21:31 -04:00
|
|
|
Helper.getUserConfigPath(name),
|
2016-06-19 13:16:50 -04:00
|
|
|
JSON.stringify(user, null, "\t")
|
2014-08-13 21:51:54 -04:00
|
|
|
);
|
2015-09-30 18:39:57 -04:00
|
|
|
} catch (e) {
|
2016-04-02 17:19:57 -04:00
|
|
|
log.error("Failed to add user " + name, e);
|
2014-08-13 19:43:11 -04:00
|
|
|
throw e;
|
|
|
|
}
|
2014-08-14 13:25:22 -04:00
|
|
|
return true;
|
2014-08-13 19:43:11 -04:00
|
|
|
};
|
|
|
|
|
2016-02-16 19:14:43 -05:00
|
|
|
ClientManager.prototype.updateUser = function(name, opts) {
|
|
|
|
var users = this.getUsers();
|
|
|
|
if (users.indexOf(name) === -1) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (typeof opts === "undefined") {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-05-08 02:21:31 -04:00
|
|
|
var user = {};
|
2016-02-16 19:14:43 -05:00
|
|
|
try {
|
|
|
|
user = this.readUserConfig(name);
|
2016-04-02 04:16:31 -04:00
|
|
|
_.assign(user, opts);
|
2016-03-05 13:31:29 -05:00
|
|
|
fs.writeFileSync(
|
2016-05-08 02:21:31 -04:00
|
|
|
Helper.getUserConfigPath(name),
|
2016-06-19 13:16:50 -04:00
|
|
|
JSON.stringify(user, null, "\t")
|
2016-03-05 13:31:29 -05:00
|
|
|
);
|
2016-02-16 19:14:43 -05:00
|
|
|
} catch (e) {
|
2016-04-16 07:32:38 -04:00
|
|
|
log.error("Failed to update user", e);
|
2016-02-16 19:14:43 -05:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
|
|
|
|
ClientManager.prototype.readUserConfig = function(name) {
|
|
|
|
var users = this.getUsers();
|
|
|
|
if (users.indexOf(name) === -1) {
|
|
|
|
return false;
|
|
|
|
}
|
2016-05-08 02:21:31 -04:00
|
|
|
var data = fs.readFileSync(Helper.getUserConfigPath(name), "utf-8");
|
2016-06-12 02:43:35 -04:00
|
|
|
return JSON.parse(data);
|
2016-02-16 19:14:43 -05:00
|
|
|
};
|
|
|
|
|
2014-08-13 19:43:11 -04:00
|
|
|
ClientManager.prototype.removeUser = function(name) {
|
|
|
|
var users = this.getUsers();
|
|
|
|
if (users.indexOf(name) === -1) {
|
2014-08-14 13:25:22 -04:00
|
|
|
return false;
|
2014-08-13 19:43:11 -04:00
|
|
|
}
|
|
|
|
try {
|
2016-05-08 02:21:31 -04:00
|
|
|
fs.unlinkSync(Helper.getUserConfigPath(name));
|
2015-09-30 18:39:57 -04:00
|
|
|
} catch (e) {
|
2014-08-13 19:43:11 -04:00
|
|
|
throw e;
|
|
|
|
}
|
2014-08-14 13:25:22 -04:00
|
|
|
return true;
|
2014-08-13 19:43:11 -04:00
|
|
|
};
|
2014-09-24 18:23:54 -04:00
|
|
|
|
2015-09-30 18:39:57 -04:00
|
|
|
ClientManager.prototype.autoload = function(/* sockets */) {
|
2014-10-12 04:30:22 -04:00
|
|
|
var self = this;
|
2014-10-14 15:13:29 -04:00
|
|
|
setInterval(function() {
|
2016-02-14 12:09:51 -05:00
|
|
|
var loaded = _.map(
|
2014-10-14 15:13:29 -04:00
|
|
|
self.clients,
|
|
|
|
"name"
|
|
|
|
);
|
|
|
|
var added = _.difference(self.getUsers(), loaded);
|
|
|
|
_.each(added, function(name) {
|
|
|
|
self.loadUser(name);
|
|
|
|
});
|
|
|
|
var removed = _.difference(loaded, self.getUsers());
|
|
|
|
_.each(removed, function(name) {
|
|
|
|
var client = _.find(
|
|
|
|
self.clients, {
|
|
|
|
name: name
|
|
|
|
}
|
|
|
|
);
|
|
|
|
if (client) {
|
|
|
|
client.quit();
|
|
|
|
self.clients = _.without(self.clients, client);
|
2016-04-16 07:32:38 -04:00
|
|
|
log.info("User '" + name + "' disconnected");
|
2014-10-14 15:13:29 -04:00
|
|
|
}
|
|
|
|
});
|
|
|
|
}, 1000);
|
2014-09-24 18:23:54 -04:00
|
|
|
};
|