Esempio n. 1
0
    def get(self, request, *args, **kwargs):
        """ called by the template system to get the context data for the template """

        if not is_browser_supported(request):
            return redirect('Plein:niet-ondersteund')

        # zet alles goed voor bezoekers / geen rol
        template = TEMPLATE_PLEIN_BEZOEKER
        context = dict()

        if request.user.is_authenticated:
            account = request.user
            context['first_name'] = account.get_first_name()

            if account.otp_is_actief:
                if not account_rechten_is_otp_verified(request):
                    # eerste 2FA controle afdwingen
                    return HttpResponseRedirect(
                        reverse('Functie:otp-controle'))
            else:
                context['toon_koppel_2fa'] = True

            # beheerder
            template = TEMPLATE_PLEIN_BEHEERDER

            if request.user.is_staff:
                context['rol_is_it'] = True

        return render(request, template, context)
Esempio n. 2
0
def rol_activeer_functie(request, functie_pk):
    """ Activeer een andere rol gebaseerd op een Functie
        geen foutmelding of exceptions als het niet mag.
    """

    # conversie string (uit url) naar nummer
    try:
        functie_pk = int(functie_pk)
    except ValueError:
        pass
    else:
        try:
            rollen_functies = request.session[SESSIONVAR_ROL_PALLET_FUNCTIES]
        except KeyError:
            pass
        else:
            # controleer dat de gebruiker deze functie mag aannemen
            # (is al eerder vastgesteld en opgeslagen in de sessie)
            for child_tup, parent_tup in rollen_functies:
                mag_rol, mag_functie_pk = child_tup
                if mag_functie_pk == functie_pk:
                    # volledig correcte wissel - sla alles nu op
                    request.session[SESSIONVAR_ROL_HUIDIGE] = mag_rol
                    request.session[
                        SESSIONVAR_ROL_HUIDIGE_FUNCTIE_PK] = mag_functie_pk
                    request.session[
                        SESSIONVAR_ROL_BESCHRIJVING] = rol_bepaal_beschrijving(
                            mag_rol, mag_functie_pk)
                    return
            # for

            # IT en BB mogen wisselen naar SEC
            account = request.user
            if account.is_authenticated:  # pragma: no branch
                if account_rechten_is_otp_verified(
                        request):  # pragma: no branch
                    if account.is_staff or account.is_BB:
                        try:
                            functie = Functie.objects.get(pk=functie_pk)
                        except Functie.DoesNotExist:
                            pass
                        else:
                            # we komen hier alleen voor rollen die niet al in het pallet zitten bij IT/BB
                            if functie.rol == 'SEC':  # pragma: no branch
                                request.session[
                                    SESSIONVAR_ROL_HUIDIGE] = Rollen.ROL_SEC
                                request.session[
                                    SESSIONVAR_ROL_HUIDIGE_FUNCTIE_PK] = functie_pk
                                request.session[
                                    SESSIONVAR_ROL_BESCHRIJVING] = functie.beschrijving
                                return
Esempio n. 3
0
    def get_context_data(self, **kwargs):
        """ called by the template system to get the context data for the template """
        context = super().get_context_data(**kwargs)

        context['show_vhpg'], context['vhpg'] = account_needs_vhpg(
            self.request.user)
        context['huidige_rol'] = rol_get_beschrijving(self.request)

        if self.account.is_staff:
            context['url_admin_site'] = reverse('admin:index')
            context['url_login_as'] = reverse('Account:account-wissel')

        # als we hier komen weten is de tweede factor gekoppeld is
        # de controle van de tweede factor moet misschien nog uitgevoerd worden
        context['show_otp_controle'] = not account_rechten_is_otp_verified(
            self.request)

        if context['show_vhpg']:
            context['show_beheerder_intro'] = True

        context['wiki_2fa_url'] = reverse_handleiding(self.request,
                                                      settings.HANDLEIDING_2FA)
        context['wiki_rollen'] = reverse_handleiding(
            self.request, settings.HANDLEIDING_ROLLEN)
        context['wiki_intro_nieuwe_beheerders'] = reverse_handleiding(
            self.request, settings.HANDLEIDING_INTRO_NIEUWE_BEHEERDERS)

        # snel wissel kaartje voor BB
        if self.rol_nu == Rollen.ROL_BB:
            context['heeft_alle_rollen'] = self._maak_alle_rollen()
            context['url_wissel_naar_sec'] = reverse('Functie:wissel-naar-sec')

        # bedoeld voor de testsuite, maar kan geen kwaad
        context['insert_meta'] = True
        context['meta_rol'] = rol2url[self.rol_nu]
        if self.functie_nu:
            context[
                'meta_functie'] = self.functie_nu.beschrijving  # template doet html escaping
        else:
            context['meta_functie'] = ""

        eval_open_taken(self.request, forceer=True)

        menu_dynamics(self.request, context, actief='wissel-van-rol')
        return context
Esempio n. 4
0
    def login(self, request, extra_context=None):
        next_url = request.GET.get('next', '')

        # send the user to the login page only when required
        # send the 2FA page otherwise
        if request.user.is_active and request.user.is_staff and request.user.is_authenticated:
            # well, login is not needed
            if account_rechten_is_otp_verified(request):
                # what are we doing here?
                if next_url:
                    return HttpResponseRedirect(next_url)

                # reason for login unknown (no 'next') so send to main page
                return HttpResponseRedirect(reverse('Plein:plein'))

            # send to 2FA page
            url = reverse('Functie:otp-controle')
        else:
            # send to login page
            url = reverse('Account:login')

        if next_url:
            url += '?next=' + next_url
        return HttpResponseRedirect(url)
Esempio n. 5
0
 def has_permission(self, request):
     """ geef True terug als de gebruiker bij de admin pagina mag """
     return (request.user.is_active
             and request.user.is_staff
             and request.user.is_authenticated
             and account_rechten_is_otp_verified(request))
Esempio n. 6
0
def rol_zet_sessionvars(account, request):
    """ zet een paar session variabelen die gebruikt worden om de rol te beheren
        deze functie wordt aangeroepen vanuit de Account.LoginView

        session variables
            gebruiker_rol_mag_wisselen: gebruik van de Plein.WisselVanRolView
    """
    rollen_vast = list()  # list of rol
    rollen_functies = list()  # list of tuple(rol, functie_pk)

    # lees de functie tabel eenmalig in en kopieer alle informatie
    # om verdere queries te voorkomen
    functie_cache = dict()
    functie_rcl = dict()  # [regio nummer] = (functie_pk, functie_pk)

    for obj in (Functie.objects.select_related(
            'nhb_rayon', 'nhb_regio', 'nhb_regio__rayon',
            'nhb_ver').only('rol', 'comp_type', 'nhb_regio__regio_nr',
                            'nhb_rayon__rayon_nr',
                            'nhb_regio__rayon__rayon_nr', 'nhb_ver__ver_nr')):
        func = SimpleNamespace()
        func.pk = obj.pk
        func.obj = obj
        func.rol = obj.rol
        if func.rol == "BKO":
            func.comp_type = obj.comp_type
        elif func.rol == "RKO":
            func.rayon_nr = obj.nhb_rayon.rayon_nr
            func.comp_type = obj.comp_type
        elif func.rol == "RCL":
            func.regio_nr = obj.nhb_regio.regio_nr
            func.regio_rayon_nr = obj.nhb_regio.rayon.rayon_nr
            func.comp_type = obj.comp_type
            try:
                functie_rcl[func.regio_nr].append(func.pk)
            except KeyError:
                functie_rcl[func.regio_nr] = [func.pk]
        elif func.rol in ("HWL", "WL", "SEC"):
            func.ver_nr = obj.nhb_ver.ver_nr
        functie_cache[obj.pk] = func
    # for

    nhbver_cache = dict()  # wordt gevuld als er behoefte is

    if account.is_authenticated:
        show_vhpg, _ = account_needs_vhpg(account)
        if account_rechten_is_otp_verified(request) and not show_vhpg:
            if account.is_staff or account.is_BB:
                rollen_vast.append(Rollen.ROL_BB)

                for func in rol_expandeer_functies:
                    parent_tup = (Rollen.ROL_BB, None)
                    for nwe_tup in func(functie_cache, nhbver_cache,
                                        Rollen.ROL_BB, None):
                        tup = (nwe_tup, parent_tup)
                        rollen_functies.append(tup)
                    # for
                # for

            # analyseer de gekoppelde functies van dit account
            parent_tup = (None, None)
            for functie in account.functie_set.only('rol').all():
                rol = None
                if functie.rol == "BKO":
                    rol = Rollen.ROL_BKO
                elif functie.rol == "RKO":
                    rol = Rollen.ROL_RKO
                elif functie.rol == "RCL":
                    rol = Rollen.ROL_RCL
                elif functie.rol == "HWL":
                    rol = Rollen.ROL_HWL
                elif functie.rol == "WL":
                    rol = Rollen.ROL_WL
                elif functie.rol == "SEC":
                    rol = Rollen.ROL_SEC
                if rol:
                    child_tup = (rol, functie.pk)
                    tup = (child_tup, parent_tup)
                    rollen_functies.append(tup)

                    if rol == Rollen.ROL_RCL:
                        # zoek de andere RCL functie van deze regio erbij
                        func = functie_cache[functie.pk]
                        rcl_pks = functie_rcl[func.regio_nr]
                        for pk in rcl_pks:
                            if pk != functie.pk:
                                buur_tup = (rol, pk)
                                tup = (buur_tup, child_tup)
                                rollen_functies.append(tup)
                        # for
            # for

            # probeer elke rol nog verder te expanderen
            te_doorzoeken = rollen_functies[:]
            while len(te_doorzoeken) > 0:
                next_doorzoeken = list()
                for child_tup, parent_tup in te_doorzoeken:
                    # print("\n" + "expanding: child=%s, parent=%s" % (repr(child_tup), (parent_tup)))
                    nwe_functies = rol_bepaal_hulp_rechten(
                        functie_cache, nhbver_cache, *child_tup)

                    # voorkom dupes (zoals expliciete koppeling en erven van een rol)
                    for nwe_tup in nwe_functies:
                        if nwe_tup not in rollen_functies:
                            rollen_functies.append(nwe_tup)
                            next_doorzoeken.append(nwe_tup)
                    # for
                # for
                te_doorzoeken = next_doorzoeken
            # while

        # if user is otp verified
    # if user is authenticated

    if len(rollen_vast) + len(rollen_functies) > 0:
        request.session[SESSIONVAR_ROL_MAG_WISSELEN] = True
    elif account_needs_otp(account):
        # waarschijnlijk komen er meer rollen beschikbaar na de OTP controle
        request.session[SESSIONVAR_ROL_MAG_WISSELEN] = True
    else:
        request.session[SESSIONVAR_ROL_MAG_WISSELEN] = False

    rol = Rollen.ROL_NONE
    if account.is_authenticated:
        if account.sporter_set.count():
            # koppeling met Sporter, dus dit is een (potentiële) Schutter
            rollen_vast.append(Rollen.ROL_SPORTER)
            rol = Rollen.ROL_SPORTER
        else:
            if account.is_staff:
                # admin maar geen NHB lid koppeling
                rollen_vast.append(Rollen.ROL_NONE)

    request.session[SESSIONVAR_ROL_HUIDIGE] = rol
    request.session[SESSIONVAR_ROL_HUIDIGE_FUNCTIE_PK] = None
    request.session[SESSIONVAR_ROL_BESCHRIJVING] = rol_bepaal_beschrijving(rol)

    request.session[SESSIONVAR_ROL_PALLET_VAST] = rollen_vast
    request.session[SESSIONVAR_ROL_PALLET_FUNCTIES] = rollen_functies