Skip to content
Snippets Groups Projects
Select Git revision
  • 47ad197101f3d9c95be25ac1336c6e51ab7f0a95
  • main default protected
2 results

tree.py

Blame
  • GitlabRoutes.ts 2.72 KiB
    import { Express }        from 'express-serve-static-core';
    import express            from 'express';
    import { StatusCodes }    from 'http-status-codes';
    import RoutesManager      from '../express/RoutesManager';
    import ApiRequest         from '../models/ApiRequest';
    import SecurityMiddleware from '../middlewares/SecurityMiddleware';
    import SecurityCheckType  from '../types/SecurityCheckType';
    import GitlabHelper       from '../helpers/GitlabHelper';
    import GitlabRepository   from '../shared/types/Gitlab/GitlabRepository';
    import GitlabVisibility   from '../shared/types/Gitlab/GitlabVisibility';
    import Config             from '../config/Config';
    import GitlabAccessLevel  from '../shared/types/Gitlab/GitlabAccessLevel';
    
    
    class EnonceRoutes implements RoutesManager {
        private static _instance: EnonceRoutes;
    
        private constructor() { }
    
        public static get instance(): EnonceRoutes {
            if ( !EnonceRoutes._instance ) {
                EnonceRoutes._instance = new EnonceRoutes();
            }
    
            return EnonceRoutes._instance;
        }
    
        registerOnBackend(backend: Express) {
            backend.get('/gitlab/project/:idOrNamespace/checkTemplateAccess', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), this.checkTemplateAccess);
        }
    
        private async checkTemplateAccess(req: ApiRequest, res: express.Response) {
            const idOrNamespace: string = req.params.idOrNamespace;
    
            // Get the Gitlab project and check if it have public or internal visibility
            try {
                const project: GitlabRepository = await GitlabHelper.getRepository(idOrNamespace);
    
                if ( [ GitlabVisibility.Public.valueOf(), GitlabVisibility.Internal.valueOf() ].includes(project.visibility) ) {
                    return res.status(StatusCodes.OK).send();
                }
            } catch ( e ) {
                return res.status(StatusCodes.NOT_FOUND).send();
            }
    
            // Check if the user and dojo are members (with at least reporter access) of the project
            const members = await GitlabHelper.getRepositoryMembers(idOrNamespace);
            const isUsersAtLeastReporter = {
                user: false,
                dojo: false
            };
            members.forEach(member => {
                if ( member.access_level >= GitlabAccessLevel.Reporter ) {
                    if ( member.id === req.session.profile.userGitlabId ) {
                        isUsersAtLeastReporter.user = true;
                    } else if ( member.id === Config.gitlab.account.id ) {
                        isUsersAtLeastReporter.dojo = true;
                    }
                }
            });
    
            req.session.sendResponse(res, isUsersAtLeastReporter.user && isUsersAtLeastReporter.dojo ? StatusCodes.OK : StatusCodes.UNAUTHORIZED);
        }
    }
    
    
    export default EnonceRoutes.instance;