diff --git a/backend/middlewares/ExtendedRequest.ts b/backend/middlewares/ExtendedRequest.ts new file mode 100644 index 00000000..adb7d99c --- /dev/null +++ b/backend/middlewares/ExtendedRequest.ts @@ -0,0 +1,10 @@ + +declare namespace Express { + + export interface Request { + } + + export interface Session { + user?; + } +} \ No newline at end of file diff --git a/backend/middlewares/UserMWs.ts b/backend/middlewares/UserMWs.ts new file mode 100644 index 00000000..d09f6eb3 --- /dev/null +++ b/backend/middlewares/UserMWs.ts @@ -0,0 +1,61 @@ + +import {UserManager} from "../model/UserManager"; +import {NextFunction, Request, Response} from "express"; + +export class UserMWs { + + + public static authenticate(req:Request, res:Response, next:NextFunction){ + if (typeof req.session.user === 'undefined') { + return res.redirect('/'); + } + return next(); + } + + public static inverseAuthenticate(req:Request, res:Response, next:NextFunction){ + if (typeof req.session.user !== 'undefined') { + return res.redirect('/'); + } + return next(); + } + + public static login(req:Request, res:Response, next:NextFunction){ + //not enough parameter + /* if ((typeof req.body === 'undefined') || (typeof req.body.email === 'undefined') || + (typeof req.body.password === 'undefined')) { + return next(); + }*/ + + //lets find the user + UserManager.findOne({ + // email: req.body.email + }, function (err, result) { + if ((err) || (!result)) { + // res.tpl.error.push('Your email address is not registered!'); + console.log(err); + return next(); + } + + /* //check password + if (result.password !== req.body.password) { + // res.tpl.error.push('Wrong password!'); + return next(); + } +*/ + //login is ok, save id to session + req.session.user = result; + + //redirect to / so the app can decide where to go next + // return res.redirect('/'); + + return next(); + }); + } + + + public static renderUser(req:Request, res:Response, next:NextFunction){ + res.json(req.session.user); + } + + +} \ No newline at end of file diff --git a/backend/model/UserManager.ts b/backend/model/UserManager.ts new file mode 100644 index 00000000..2330453a --- /dev/null +++ b/backend/model/UserManager.ts @@ -0,0 +1,10 @@ +import {User} from "../../common/entities/User"; +export class UserManager { + + private static DummyUser = new User("TestUser","test@test.hu","122345"); + + public static findOne(filter,cb:(error: any,result:User) => void){ + return cb(null, UserManager.DummyUser); + } + +} \ No newline at end of file diff --git a/backend/routes/PublicRouter.ts b/backend/routes/PublicRouter.ts new file mode 100644 index 00000000..d84847e5 --- /dev/null +++ b/backend/routes/PublicRouter.ts @@ -0,0 +1,14 @@ +/// + + +import * as _express from 'express'; +import * as path from 'path'; + +export class PublicRouter{ + constructor(private app){ + this.app.use(_express.static(path.resolve(__dirname, './../../frontend'))); + this.app.use('/node_modules',_express.static(path.resolve(__dirname, './../../node_modules'))); + + } + +} \ No newline at end of file diff --git a/backend/routes/UserRouter.ts b/backend/routes/UserRouter.ts new file mode 100644 index 00000000..7200dcda --- /dev/null +++ b/backend/routes/UserRouter.ts @@ -0,0 +1,19 @@ +/// + + + +import {UserMWs} from "../middlewares/UserMWs"; +export class UserRouter{ + constructor(private app){ + this.initLogin(); + } + + private initLogin() { + this.app.get("/api/login", + UserMWs.inverseAuthenticate, + UserMWs.login, + UserMWs.renderUser + ); + }; + +} \ No newline at end of file diff --git a/backend/server.ts b/backend/server.ts index 6293e88e..ce4842c6 100644 --- a/backend/server.ts +++ b/backend/server.ts @@ -1,10 +1,11 @@ /// import * as _express from 'express'; +import * as _session from 'express-session'; import * as _debug from 'debug'; import * as _http from 'http'; -import * as path from 'path'; -import {NetworkManager} from "./NetworkManager"; +import {PublicRouter} from "./routes/PublicRouter"; +import {UserRouter} from "./routes/UserRouter"; export class Server { @@ -24,14 +25,23 @@ export class Server { this.app.use(_morgan('dev')); } + /** + * Session above all + */ + this.app.use(_session({ - this.app.use(_express.static(path.resolve(__dirname, './../frontend'))); - this.app.use('/node_modules',_express.static(path.resolve(__dirname, './../node_modules'))); + secret: 'keyboard cat', + cookie: { + maxAge: 60000 + }, + resave: true, + saveUninitialized: false + })); + + + new PublicRouter(this.app); + new UserRouter(this.app); - var renderIndex = (req: _express.Request, res: _express.Response) => { - res.sendFile(path.resolve(__dirname, './../frontend/index.html')); - }; - this.app.get('/*', renderIndex); @@ -47,7 +57,6 @@ export class Server { this.server.on('error', this.onError); this.server.on('listening', this.onListening); - new NetworkManager(this.server); } diff --git a/package.json b/package.json index 1b3305e4..a0624249 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "PiGallery2", - "version": "0.0.0", + "version": "0.0.1", "private": true, "description": "This is a photo gallery optimised for running low resource servers (especially on raspberry pi)", "author": "Braun Patrik", @@ -27,6 +27,7 @@ "es6-shim": "^0.33.13", "es7-reflect-metadata": "^1.6.0", "express": "^4.13.4", + "express-session": "^1.13.0", "karma-jasmine": "^0.3.8", "morgan": "^1.7.0", "protractor": "^3.2.0", diff --git a/typings.json b/typings.json index 0c6558e8..e3b39215 100644 --- a/typings.json +++ b/typings.json @@ -2,13 +2,14 @@ "name": "PiGallery2", "version": false, "ambientDependencies": { - "express": "github:DefinitelyTyped/DefinitelyTyped/express/express.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e", - "node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e", "debug": "github:DefinitelyTyped/DefinitelyTyped/debug/debug.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e", + "express": "github:DefinitelyTyped/DefinitelyTyped/express/express.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e", + "express-session": "registry:dt/express-session#0.0.0+20160317120654", + "jasmine": "github:DefinitelyTyped/DefinitelyTyped/jasmine/jasmine.d.ts#d22516f9f089de107d7e7d5938566377370631f6", "mime": "github:DefinitelyTyped/DefinitelyTyped/mime/mime.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e", + "node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e", "serve-static": "github:DefinitelyTyped/DefinitelyTyped/serve-static/serve-static.d.ts#0d622d857f97d44ea7dcad2b3edec1f23c48fe9e", "socket.io": "github:DefinitelyTyped/DefinitelyTyped/socket.io/socket.io.d.ts#d22516f9f089de107d7e7d5938566377370631f6", - "socket.io-client": "github:DefinitelyTyped/DefinitelyTyped/socket.io-client/socket.io-client.d.ts#d22516f9f089de107d7e7d5938566377370631f6", - "jasmine": "github:DefinitelyTyped/DefinitelyTyped/jasmine/jasmine.d.ts#d22516f9f089de107d7e7d5938566377370631f6" + "socket.io-client": "github:DefinitelyTyped/DefinitelyTyped/socket.io-client/socket.io-client.d.ts#d22516f9f089de107d7e7d5938566377370631f6" } }