initial commit

This commit is contained in:
Yorick
2016-04-01 14:09:55 +00:00
commit 2e04121fef
2175 changed files with 537519 additions and 0 deletions
Executable
+361
View File
@@ -0,0 +1,361 @@
// fmon version 2 - (Mains Frequency Monitoring API)
var express = require('express');
var crypto = require('crypto');
var router = express.Router();
var jwt = require('jwt-simple');
var sqlite3 = require('sqlite3').verbose();
var path = require('path');
var dbfile = "miniproject.db";
var db = new sqlite3.Database(dbfile);
var sys= require('sys');
var exec= require('child_process').exec;
function puts(error, stdout, stderr) { sys.puts(stdout) };
router.all( new RegExp("[^(\/login|\/register)]"), function (req, res, next) {
console.log("Authenticating...");
var token = (req.header('X-Access-Token')) || '';
if (token) {
try {
var decoded = jwt.decode(token, req.app.get('secretkey'));
var query = "SELECT COUNT(username) AS num FROM user WHERE access='" + token + "' AND username='" + decoded.iss + "';";
db.get(query, function (err, row) {
if(err) throw err;
console.log("Found " + row.num + " valid users");
if (row.num == 1) {
req.app.set("userid", decoded.iss);
console.log("Userid: " + req.app.get('userid'));
return next();
}
else {
res.status(401);
res.json({
"status": 401, "message": "unknown userid, bye"
});
return;
}
});
}
catch (err) {
console.log("Authorization failed: " + err);
res.status(401);
res.json({
"status": 401, "message": "unknown userid, bye"
});
}
}
else
{
console.log("Authorization failed: Token not set");
res.status(401);
res.json({
"status": 401, "message": "token not set"
});
}
});
// Restfull register
router.post('/register', function (req, res) {
var username = req.body.username || '';
var password = req.body.password || '';
// Check for empy body
if (username == '' || password == '') {
res.status(401);
res.json({
"status": 401,
"message": "Body is empty"
});
return;
}
var query = "SELECT COUNT(*) AS num FROM user WHERE username='" + username + "';";
db.get(query, function(err, row){
if(err) throw err;
if(row.num >= 1)
{
var results = [];
res.status(400);
results.push({
success:false,
msg: "Username already exists"
});
res.json(results);
return;
}
else
{
// db lookup
var query = "INSERT INTO user VALUES('" + username + "', '" + password + "', 'null');";
db.run(query);
var results = [];
res.status(200);
results.push({
success:true,
username: username,
password: password
});
res.json(results);
}
});
});
// Restfull login
router.post('/login', function (req, res) {
var username = req.body.username || '';
var password = req.body.password || '';
// Check for empy body
if (username == '' || password == '') {
res.status(401);
res.json({
"status": 401,
"message": "Body is empty"
});
return;
}
var query = "SELECT COUNT(*) AS num FROM user WHERE username='" + username + "' AND password='" + password + "';";
db.get(query, function (err, row) {
if(err) throw err;
// Check for valid user/passwd combo
if (row.num == 1) {
var now = new Date();
var expires = now.setHours(now.getDay() + 10);
var token = jwt.encode({
iss: username,
exp: expires
}, req.app.get('secretkey'));
var query = "UPDATE user SET access='" + token + "' WHERE username='" + username + "';";
db.run(query);
res.status(200);
res.json({
status: true,
token: token,
expires: expires,
user: username
});
}
else {
res.status(401);
res.json({
"status": 401,
"status": false,
"message": "Invalid username or password"
});
}
});
});
router.put('/light/:group/:num/:state', function (req, res) {
var group = req.params.group;
var num = req.params.num;
var state = req.params.state;
var results = [];
res.status(200);
results.push({
success:true,
group: group,
number:num,
state:state
});
exec('sudo ./kaku ' + group + ' ' + num + ' ' + state, puts);
res.json(results);
});
router.get('/light/:name/:state', function (req, res) {
var name = req.params.name;
var state = req.params.state;
var group;
var num;
var query = "SELECT class, channel FROM light WHERE name='" + name + "';";
db.get(query, function (err, row) {
if(err) throw err;
group = row.class;
num = row.channel;
var results = [];
res.status(200);
results.push({
success:true,
name: name,
group: group,
num: num,
state: state
});
exec('sudo ./kaku ' + group + ' ' + num + ' ' + state, puts);
res.json(results);
});
});
router.post('/light', function (req, res) {
var name = req.body.name || '';
var group = req.body.group || '';
var channel = req.body.channel || '';
// Check for empy body
if (name == '' || group == '' || channel == '') {
res.status(401);
res.json({
"status": 401,
"message": "Body is empty"
});
return;
}
var query = "SELECT COUNT(*) AS num FROM light WHERE name='" + name + "';";
db.get(query, function(err, row){
if(err) throw err;
if(row.num >= 1)
{
var results = [];
res.status(400);
results.push({
success:false,
msg: "Name already in use"
});
res.json(results);
return;
}
else
{
// db lookup
var query = "INSERT INTO light VALUES('" + name + "', '" + group + "', '" + channel + "');";
db.run(query);
var results = [];
res.status(200);
results.push({
success:true,
group: group,
channel: channel
});
res.json(results);
}
});
});
router.put('/light', function (req, res) {
var name = req.body.name || '';
var group = req.body.group || '';
var channel = req.body.channel || '';
// Check for empy body
if (name == '' || group == '' || channel == '') {
res.status(401);
res.json({
"status": 401,
"message": "Body is empty"
});
return;
}
// db lookup
var query = "UPDATE light SET class='" + group + "', channel='" + channel + "' WHERE name='" + name + "';";
db.run(query);
var results = [];
res.status(200);
results.push({
success:true,
name: name,
group: group,
channel: channel
});
res.json(results);
});
// Example call
router.get('/users', function (req, res) {
// db lookup
var query = "SELECT username, password, access FROM user WHERE 1;";
db.all(query, function (err, rows) {
if(err) throw err;
var results = [];
var users = [];
rows.forEach(function(item){
users.push({
username: item.username,
password: item.password,
access: item.access
});
});
results.push({users: users});
res.json(results);
});
res.status(200);
});
router.get('/lights', function (req, res) {
// db lookup
var query = "SELECT name, class, channel FROM light WHERE 1;";
db.all(query, function (err, rows) {
if(err) throw err;
var results = [];
var lights = [];
rows.forEach(function(item){
lights.push({
name: item.name,
group: item.class,
channel: item.channel
});
});
results.push({lights: lights});
res.json(results);
});
res.status(200);
});
//Fix
router.get('/light*', function (req, res) {
var results = [];
res.status(400);
results.push({
success:false,
message:'Params required'
});
res.json(results);
});
// Fall back, display some info
router.get('/', function (req, res) {
res.status(200);
res.json({
"description": "Project X API version 2. Welcome"
});
});
module.exports = router;