diff --git a/.editorconfig b/.editorconfig index deda54c..ebf776b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,7 +6,7 @@ indent_size = 3 end_of_line = crlf charset = utf-8 trim_trailing_whitespace = false -insert_final_newline = false +insert_final_newline = true [*.yml] -indent_size = 2 \ No newline at end of file +indent_size = 2 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..27c5166 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode"] +} diff --git a/locales/de.json b/locales/de.json index 6963aaa..c44a514 100644 --- a/locales/de.json +++ b/locales/de.json @@ -37,5 +37,6 @@ "No special token": "No special token", "Login token invalid": "Login token invalid", "No login token": "No login token", - "You are not logged in or your login is expired (Login token invalid)": "You are not logged in or your login is expired (Login token invalid)" + "You are not logged in or your login is expired (Login token invalid)": "You are not logged in or your login is expired (Login token invalid)", + "You are not logged in or your login is expired (No special token)": "You are not logged in or your login is expired (No special token)" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 895f9f8..90b2929 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "open_auth_service", - "version": "1.0.0", + "version": "1.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index d7aeba9..13ce4bf 100644 --- a/package.json +++ b/package.json @@ -73,4 +73,4 @@ "u2f": "^0.1.3", "uuid": "^7.0.2" } -} \ No newline at end of file +} diff --git a/src/api/user/contact.ts b/src/api/user/contact.ts new file mode 100644 index 0000000..f313c58 --- /dev/null +++ b/src/api/user/contact.ts @@ -0,0 +1,16 @@ +import { Request, Response } from "express"; +import Stacker from "../middlewares/stacker"; +import { GetUserMiddleware } from "../middlewares/user"; +import Mail from "../../models/mail"; + +export const GetContactInfos = Stacker(GetUserMiddleware(true, true), async (req: Request, res: Response) => { + let mails = await Promise.all( + req.user.mails.map(mail => Mail.findById(mail)) + ); + + let contact = { + mails: mails.filter(e => !!e), + phones: req.user.phones + }; + res.json({ contact }); +}); diff --git a/src/api/user/index.ts b/src/api/user/index.ts index 8215fb8..900b4e2 100644 --- a/src/api/user/index.ts +++ b/src/api/user/index.ts @@ -4,6 +4,7 @@ import Login from "./login"; import TwoFactorRoute from "./twofactor"; import { GetToken, DeleteToken } from "./token"; import { GetAccount } from "./account"; +import { GetContactInfos } from "./contact"; const UserRoute: Router = Router(); @@ -105,10 +106,24 @@ UserRoute.delete("/token/:id", DeleteToken); * @apiSuccess {Boolean} success * @apiSuccess {Object[]} user * @apiSuccess {String} user.id User ID - * @apiSuccess {String} token.name Full name of the user - * @apiSuccess {String} token.username Username of user - * @apiSuccess {Date} token.birthday Birthday - * @apiSuccess {Number} token.gender Gender of user (none = 0, male = 1, female = 2, other = 3) + * @apiSuccess {String} user.name Full name of the user + * @apiSuccess {String} user.username Username of user + * @apiSuccess {Date} user.birthday Birthday + * @apiSuccess {Number} user.gender Gender of user (none = 0, male = 1, female = 2, other = 3) */ UserRoute.get("/account", GetAccount); + +/** + * @api {delete} /user/account + * @apiName UserGetAccount + * + * @apiGroup user + * @apiPermission user + * + * @apiSuccess {Boolean} success + * @apiSuccess {Object} contact + * @apiSuccess {Object[]} user.mail EMail addresses + * @apiSuccess {Object[]} user.phone Phone numbers + */ +UserRoute.get("/contact", GetContactInfos); export default UserRoute; \ No newline at end of file diff --git a/src/testdata.ts b/src/testdata.ts index 40287ac..d3e5141 100644 --- a/src/testdata.ts +++ b/src/testdata.ts @@ -11,10 +11,23 @@ import TwoFactor from "./models/twofactor"; import * as speakeasy from "speakeasy"; import LoginToken from "./models/login_token"; -import { log } from "handlebars"; +import Mail from "./models/mail"; export default async function TestData() { await DB.db.dropDatabase(); + + let mail = await Mail.findOne({ mail: "test@test.de" }); + if (!mail) { + mail = Mail.new({ + mail: "test@test.de", + primary: true, + verified: true + }) + + await Mail.save(mail); + } + + let u = await User.findOne({ username: "test" }); if (!u) { Logging.log("Adding test user"); @@ -25,7 +38,12 @@ export default async function TestData() { name: "Test Test", password: "125d6d03b32c84d492747f79cf0bf6e179d287f341384eb5d6d3197525ad6be8e6df0116032935698f99a09e265073d1d6c32c274591bf1d0a20ad67cba921bc", salt: "test", - admin: true + admin: true, + phones: [ + { phone: "+4915962855955", primary: true, verified: true }, + { phone: "+4915962855932", primary: false, verified: false } + ], + mails: [mail._id] }) await User.save(u); } diff --git a/src/views/views.ts b/src/views/views.ts index df15492..11f0cfa 100644 --- a/src/views/views.ts +++ b/src/views/views.ts @@ -1,4 +1,4 @@ -import { Router, IRouter, Request, static as ServeStatic } from "express" +import { Router, IRouter, Request, static as ServeStatic } from "express"; import GetLoginPage from "./login"; import GetAuthPage from "./authorize"; import promiseMiddleware from "../helper/promiseMiddleware"; @@ -17,105 +17,120 @@ import { UserMiddleware, GetUserMiddleware } from "../api/middlewares/user"; Handlebars.registerHelper("appname", () => config.core.name); -const cacheTime = config.core.dev ? moment.duration(1, "month").asSeconds() : 10; +const cacheTime = config.core.dev + ? moment.duration(1, "month").asSeconds() + : 10; const ViewRouter: IRouter = Router(); ViewRouter.get("/", UserMiddleware, (req, res) => { - res.send("This is the main page") -}) + res.send("This is the main page"); +}); ViewRouter.get("/register", (req, res) => { res.setHeader("Cache-Control", "public, max-age=" + cacheTime); res.send(GetRegistrationPage(req.__)); -}) +}); ViewRouter.use("/login", ServeStatic("./views_repo/build/login")); -// ViewRouter.use("/login", (req, res) => { -// res.setHeader("Cache-Control", "public, max-age=" + cacheTime); -// res.send(GetLoginPage(req.__)) -// }) +ViewRouter.use("/user", ServeStatic("./views_repo/build/user")); ViewRouter.get("/code", (req, res) => { res.setHeader("Cache-Control", "no-cache"); - if (req.query.error) - res.send("Some error occured: " + req.query.error); - else - res.send(`Your code is: ${req.query.code}`); -}) + if (req.query.error) res.send("Some error occured: " + req.query.error); + else res.send(`Your code is: ${req.query.code}`); +}); -ViewRouter.get("/admin", GetUserMiddleware(false, true), (req: Request, res, next) => { - if (!req.isAdmin) res.sendStatus(HttpStatusCode.FORBIDDEN) - else next() -}, (req, res) => { - res.send(GetAdminPage(req.__)) -}) - -// ViewRouter.get("/user", Stacker(GetUserMiddleware(false, true), (req, res) => { -// res.setHeader("Cache-Control", "public, max-age=" + cacheTime); -// res.send(GetUserPage(req.__)); -// })); - -ViewRouter.get("/auth", Stacker(GetUserMiddleware(false, true), async (req, res) => { - let { scope, redirect_uri, state, client_id }: { [key: string]: string } = req.query; - const sendError = (type) => { - res.redirect(redirect_uri += `?error=${type}&state=${state}`); - } - let client = await Client.findOne({ client_id: client_id }) - if (!client) { - return sendError("unauthorized_client") +ViewRouter.get( + "/admin", + GetUserMiddleware(false, true), + (req: Request, res, next) => { + if (!req.isAdmin) res.sendStatus(HttpStatusCode.FORBIDDEN); + else next(); + }, + (req, res) => { + res.send(GetAdminPage(req.__)); } +); - let permissions: IPermission[] = []; - let proms: PromiseLike[] = []; - if (scope) { - for (let perm of scope.split(";").filter(e => e !== "read_user")) { - proms.push(Permission.findById(perm).then(p => { - if (!p) return Promise.reject(new Error()); - permissions.push(p); - })); +ViewRouter.get( + "/auth", + Stacker(GetUserMiddleware(false, true), async (req, res) => { + let { + scope, + redirect_uri, + state, + client_id + }: { [key: string]: string } = req.query; + const sendError = type => { + res.redirect((redirect_uri += `?error=${type}&state=${state}`)); + }; + let client = await Client.findOne({ client_id: client_id }); + if (!client) { + return sendError("unauthorized_client"); } - } - let err = false; - await Promise.all(proms).catch(e => { - err = true; + + let permissions: IPermission[] = []; + let proms: PromiseLike[] = []; + if (scope) { + for (let perm of scope.split(";").filter(e => e !== "read_user")) { + proms.push( + Permission.findById(perm).then(p => { + if (!p) return Promise.reject(new Error()); + permissions.push(p); + }) + ); + } + } + let err = false; + await Promise.all(proms).catch(e => { + err = true; + }); + Logging.debug(err); + if (err) { + return sendError("invalid_scope"); + } + let scopes = await Promise.all( + permissions.map(async perm => { + let client = await Client.findById(perm.client); + return { + name: perm.name, + description: perm.description, + logo: client.logo + }; + }) + ); + res.send(GetAuthPage(req.__, client.name, scopes)); }) - Logging.debug(err); - if (err) { - return sendError("invalid_scope") - } - let scopes = await Promise.all(permissions.map(async perm => { - let client = await Client.findById(perm.client); - return { - name: perm.name, - description: perm.description, - logo: client.logo - } - })) - res.send(GetAuthPage(req.__, client.name, scopes)); -})); +); if (config.core.dev) { - const logo = "data:image/png;base64,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" + const logo = + "data:image/png;base64,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"; ViewRouter.get("/devauth", (req, res) => { - res.send(GetAuthPage(req.__, "Test 05265", [ - { - name: "Access Profile", - description: "It allows the application to know who you are. Required for all applications. And a lot of more Text, because why not? This will not stop, till it is multiple lines long and maybe kill the layout, so keep reading as long as you like, but I promise it will get boring after some time. So this should be enougth.", - logo: logo - }, - { - name: "Test 1", - description: "This is not an real permission. This is used just to verify the layout", - logo: logo - }, - { - name: "Test 2", - description: "This is not an real permission. This is used just to verify the layout", - logo: logo - } - ])) - }) + res.send( + GetAuthPage(req.__, "Test 05265", [ + { + name: "Access Profile", + description: + "It allows the application to know who you are. Required for all applications. And a lot of more Text, because why not? This will not stop, till it is multiple lines long and maybe kill the layout, so keep reading as long as you like, but I promise it will get boring after some time. So this should be enougth.", + logo: logo + }, + { + name: "Test 1", + description: + "This is not an real permission. This is used just to verify the layout", + logo: logo + }, + { + name: "Test 2", + description: + "This is not an real permission. This is used just to verify the layout", + logo: logo + } + ]) + ); + }); } -export default ViewRouter; \ No newline at end of file +export default ViewRouter; diff --git a/views/package-lock.json b/views/package-lock.json index a2c6ebc..ff7ea2f 100644 --- a/views/package-lock.json +++ b/views/package-lock.json @@ -243,7 +243,7 @@ }, "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, diff --git a/views_repo b/views_repo index 47f9867..e30b04f 160000 --- a/views_repo +++ b/views_repo @@ -1 +1 @@ -Subproject commit 47f98674eae7bdb6a92917a57bf4fe46dd593e8b +Subproject commit e30b04f83c959e19393e82fc5ccc74a363aae53b