diff --git a/db/knex_router.ts b/db/knex_router.ts index 999fb9b3c8cb778e8b9191329bf07fff8d2b6a39..abdcb4783f8f1fac9d11d4c2d5360d8313a22e7f 100644 --- a/db/knex_router.ts +++ b/db/knex_router.ts @@ -8,4 +8,4 @@ const config = require('./knexfile')[environment]; console.log("Running Knex configuration '%s'", environment); -module.exports = require('knex')(config); +export default require('knex')(config); diff --git a/src/adminview/admin_router.ts b/src/adminview/admin_router.ts index 388e943ffa79d1093b996470503debe5d87b8191..931c4fbb6fceb377030d68e777dfe707078bfbfb 100644 --- a/src/adminview/admin_router.ts +++ b/src/adminview/admin_router.ts @@ -33,6 +33,8 @@ import flash from 'connect-flash'; import knex from '../../db/knex_router'; import { express as graphqlVoyager } from 'graphql-voyager/middleware'; +let port = process.env.PORT || 3000; + const whitelist = [ "magi.karp", "mew.two", @@ -49,7 +51,7 @@ function ensureIsAdmin(returnTo) { // ensure that the request was authenticated by passport ensureLoggedIn(returnTo); // lookup req.user against whitelist of admin users - if (req.user.uid in whitelist) { + if (req.user && req.user.uid in whitelist) { console.log("is an admin"); } else { console.log("is NOT an admin"); @@ -77,8 +79,6 @@ const router = Router(); //"The flash is a special area of the session used for storing messages. Messages are written to the flash and cleared after being displayed to the user." router.use(flash()); -let port = process.env.PORT || 3000; - /** * @desc Paths pour l'authentification : login, logout, page d'accueil * =================================================================== @@ -131,20 +131,13 @@ router.post('/avlogin', failureFlash: true }), (req, res) => { - // If this function gets called, authentication was successful. - // `req.user` contains the authenticated user. + // If this function gets called, authentication was successful. + // `req.user` contains the authenticated user. console.log("POST request to /adminview/avlogin: OK, authenticated by LDAP. req.user: "); console.log(req.user); - // lookup req.user against whitelist of admin users - if (req.user.uid in whitelist) { - console.log("is an admin"); - res.redirect("/adminview/admin"); - } else { - console.log("is NOT an admin"); - req.flash('error: not an admin'); - req.logout(); - res.redirect('/adminview/admin'); - } + // redirect to /admin + // in /admin, user will be looked up against whitelist anyway + res.redirect('adminview/admin'); } ); diff --git a/src/app.ts b/src/app.ts index 16810e7e0dd7d884f52c9492efee6a5784e11974..c1dcb15d0d162d7d92d056f501a5a3c7d78a04db 100644 --- a/src/app.ts +++ b/src/app.ts @@ -19,8 +19,8 @@ import schema from './graphql/schema'; // definition du schéma et des resolvers import router from './adminview/admin_router'; // packages pour l'authentification import passport from 'passport'; +import './config_passport'; // configure passport, pour l'authentification ldap et pour comment gérer les sessions (serializeUser/deserializeUser) import expressSession from 'express-session'; -import cookieParser from 'cookie-parser'; import cors from 'cors'; // HTTP request logger import morgan from 'morgan'; @@ -29,8 +29,6 @@ import path from 'path'; // config des paramètres de connexion au LDAP import { ldapConfig, credentialsLdapConfig } from './ldap/internal/config'; -// configure passport, pour l'authentification ldap et pour comment gérer les sessions (serializeUser/deserializeUser) -import './config_passport'; /** * @desc Création de l'application Express et setup de middlewares basiques @@ -42,8 +40,6 @@ app.use(bodyParser.json()); //parses bodies of media type "application/json" app.use(bodyParser.urlencoded({ //parses bodies of media type "application/x-www-form-urlencoded" extended: true //use qs library (see https://www.npmjs.com/package/body-parser#bodyparserurlencodedoptions) })); -// parse Cookie header and populate req.cookies with an object keyed by the cookie names -//app.use(cookieParser()); <-- req.cookies n'est pas utilisé. // ne *pas* inclure de header HTTP publicisant que l'application tourne sous Express app.disable('x-powered-by'); // use morgan (HTTP request logger middleware) @@ -93,9 +89,7 @@ app.use(favicon(path.resolve(__dirname, 'assets', 'favicon.ico'))); // load data from the session identified by the cookie (if one exists), into req.session // on ne manipulera pas req.session directement, on laisser toujours passport le faire pour nous app.use(expressSession({ - //secret: ldapConfig.sessionSecret, <-- wtf? nothing to do with ldap! secret: "asdfjklkjfdsasdfjklkljfdsa", - })); app.use(passport.initialize()); //passport.session(): load the user object onto req.user if a serialised user object was found in the req.session diff --git a/src/graphql/typeDefs/objects.graphql b/src/graphql/typeDefs/objects.graphql index dd8a612901ae94ff6eda43612979b5fd961d5fa0..83a91ae2ba31db78c27999b0ce17da43d9a87a0b 100644 --- a/src/graphql/typeDefs/objects.graphql +++ b/src/graphql/typeDefs/objects.graphql @@ -16,10 +16,10 @@ Conseils généraux pour toute tentative d'amélioration du schéma : - choisir des noms clairs, précis, concis. - commenter lorsque c'est pertinent, également en étant clair, précis, concis. -@author akka vodol, kadabra -""" +@author akka vodol, kadabra, ofacklam + + -""" Un utilisateur """ type User { @@ -69,6 +69,22 @@ interface Group { # Administrateurs, à contacter directement en cas de problème admins: [User] + + # Activité publique du groupe + frontPage: String # page d'accueil du groupe, en markdown + questions: [Question] + answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse + + # Activité interne + announcementsFromGroup: [Announcement] # annonces écrites par le groupe + announcementsToGroup: [Announcement] # annonces adressées au groupe + eventsFromGroup: [Event] + eventsToGroup: [Event] + privatePosts: [PrivatePost] + postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown + + # Graphe organique + visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique } # Le groupe de base, dont les membres sont des utilisateurs : binets, Kès... @@ -86,14 +102,6 @@ type SimpleGroup implements Group { speakers: [User] admins: [User] likers: [User] - - # Graphe organique des groupes - parent: SimpleGroup # Groupe parent - children: [SimpleGroup] # Groupes enfants - memberOfMeta: [MetaGroup] - visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique - - school: String # École d'origine du groupe (pour information) # Activité publique du groupe frontPage: String # page d'accueil du groupe, en markdown @@ -107,6 +115,14 @@ type SimpleGroup implements Group { eventsToGroup: [Event] privatePosts: [PrivatePost] postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown + + # Graphe organique des groupes + parent: SimpleGroup # Groupe parent + children: [SimpleGroup] # Groupes enfants + memberOfMeta: [MetaGroup] + visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique + + school: String # École d'origine du groupe (pour information) } # Un groupe dont les membre sont d'autres groupes @@ -123,10 +139,25 @@ type MetaGroup implements Group { admins: [User] members: [SimpleGroup] # Par choix de paradigme, on veut éviter d'avoir des méta-méta-groupes. + # Activité publique du groupe + frontPage: String # page d'accueil du groupe, en markdown + questions: [Question] + answers: [Answer] # permet d'obtenir les questions qui ont eu une réponse + + # Activité interne + announcementsFromGroup: [Announcement] # annonces écrites par le groupe + announcementsToGroup: [Announcement] # annonces adressées au groupe + eventsFromGroup: [Event] + eventsToGroup: [Event] + privatePosts: [PrivatePost] + postsSummary: String # récapitulatif de l'activité interne du groupe, en markdown + + # Graphe organique visibilityEdges: [Group] # se rendre visible par des groupes en plus du graphe organique } -union AuthorUnion = Group | [Group] | User +# union AuthorUnion = Group | [Group] | User +# il n'est pas possible de faire des unions avec des listes d'objets... """ L'interface Message représente toute information que veut communiquer un groupe ou un user. @@ -142,7 +173,7 @@ interface Message { title: String! content: String! - authors: AuthorUnion + #authors: AuthorUnion recipient: Group } diff --git a/src/graphql/typeDefs/queries.d.ts b/src/graphql/typeDefs/queries.d.ts index a66b57b88e349e0500ba9668821fe37f5e19d849..eb4096b19cb8ca7ab1bd83d439c4fdadcab9dadc 100644 --- a/src/graphql/typeDefs/queries.d.ts +++ b/src/graphql/typeDefs/queries.d.ts @@ -10,6 +10,6 @@ interface searchTOLArgs { sport: string, phone: string, mail: string, - address: string, - ip: string[] + addresses: string[], + ips: string[] } \ No newline at end of file