Пример #1
0
def account_create(username, voornaam, achternaam, wachtwoord, email, email_is_bevestigd):
    """ Maak een nieuw Account aan met een willekeurige naam
        Email wordt er meteen in gezet en heeft geen bevestiging nodig
    """

    if not mailer_email_is_valide(email):
        raise AccountCreateError('Dat is geen valide e-mail')

    if Account.objects.filter(username=username).count() != 0:
        raise AccountCreateError('Account bestaat al')

    # maak het account aan
    account = Account()
    account.username = username
    account.set_password(wachtwoord)
    account.first_name = voornaam
    account.last_name = achternaam
    account.save()

    # maak het email record aan
    mail = AccountEmail()
    mail.account = account
    if email_is_bevestigd:
        mail.email_is_bevestigd = True
        mail.bevestigde_email = email
        mail.nieuwe_email = ''
    else:
        mail.email_is_bevestigd = False
        mail.bevestigde_email = ''
        mail.nieuwe_email = email
    mail.save()

    return account, mail
Пример #2
0
    def post(self, request, *args, **kwargs):

        from_ip = get_safe_from_ip(request)
        context = super().get_context_data(**kwargs)
        context['foutmelding'] = ''

        email = request.POST.get('email',
                                 '')[:150]  # afkappen voor extra veiligheid
        if not mailer_email_is_valide(email):
            context[
                'foutmelding'] = 'Voer een valide e-mailadres in van een bestaand account'

        if not context['foutmelding']:
            username = request.POST.get(
                'lid_nr', '')[:10]  # afkappen voor extra veiligheid

            # zoek een account met deze email
            try:
                account_email = (
                    AccountEmail.objects.get(
                        bevestigde_email__iexact=
                        email,  # iexact = case insensitive volledige match
                        account__username=username))

            except AccountEmail.DoesNotExist:
                # email is niet bekend en past niet bij de inlog naam
                context[
                    'foutmelding'] = 'Voer het e-mailadres en NHB nummer in van een bestaand account'
                # (niet te veel wijzer maken over de combi NHB nummer en e-mailadres)

        # we controleren hier niet of het account inactief is, dat doet login wel weer

        menu_dynamics(self.request, context)

        if not context['foutmelding']:
            # we hebben nu het account waar we een de e-mail voor moeten sturen

            schrijf_in_logboek(
                account=None,
                gebruikte_functie="Wachtwoord",
                activiteit=
                "Stuur e-mail naar adres %s voor account %s, verzocht vanaf IP %s."
                %
                (repr(account_email.bevestigde_email),
                 repr(account_email.account.get_account_full_name()), from_ip))

            account_stuur_email_wachtwoord_vergeten(
                account_email,
                wachtwoord='vergeten',
                email=account_email.bevestigde_email)
            httpresp = render(request, TEMPLATE_EMAIL, context)
        else:
            httpresp = render(request, self.template_name, context)

        return httpresp
Пример #3
0
def sporter_create_account_nhb(lid_nr_str, email, nieuw_wachtwoord):
    """ Maak een nieuw account aan voor een NHB lid
        raises AccountError als:
            - er al een account bestaat
            - het nhb nummer niet valide is
            - het email adres niet bekend is bij de nhb
            - het email adres niet overeen komt
        geeft de url terug die in de email verstuurd moet worden
    """
    # zoek het email adres van dit NHB lid erbij
    try:
        # deze conversie beschermd ook tegen gevaarlijke invoer
        lid_nr = int(lid_nr_str)
    except ValueError:
        raise AccountCreateError('Onbekend NHB nummer')

    try:
        sporter = Sporter.objects.get(lid_nr=lid_nr)
    except Sporter.DoesNotExist:
        raise AccountCreateError('Onbekend NHB nummer')

    if not mailer_email_is_valide(sporter.email):
        raise SporterGeenEmail(sporter)

    # vergelijk e-mailadres hoofdletter ongevoelig
    if email.lower() != sporter.email.lower():
        raise AccountCreateError('De combinatie van NHB nummer en email worden niet herkend. Probeer het nog eens.')

    if not sporter.is_actief_lid or not sporter.bij_vereniging:
        raise SporterInactief()

    # maak het account aan
    account, accountmail = account_create(lid_nr_str, sporter.voornaam, sporter.achternaam, nieuw_wachtwoord, sporter.email, False)

    # koppelen sporter en account
    sporter.account = account
    sporter.save()

    # indien dit een secretaris is, ook meteen koppelen aan SEC functie van zijn vereniging
    try:
        secs = Secretaris.objects.filter(vereniging=sporter.bij_vereniging)
    except Secretaris.DoesNotExist:
        pass
    else:
        if secs.count() > 0:
            sec = secs.all()[0]
            if sec.sporter == sporter:
                functie = Functie.objects.get(rol='SEC', nhb_ver=sporter.bij_vereniging)
                functie.accounts.add(account)

    account_vraag_email_bevestiging(accountmail, nhb_nummer=lid_nr_str, email=email)
Пример #4
0
def account_create(username, voornaam, achternaam, wachtwoord, email,
                   email_is_bevestigd):
    """ Maak een nieuw Account aan met een willekeurige naam
        Email wordt er meteen in gezet en heeft geen bevestiging nodig
    """

    if not mailer_email_is_valide(email):
        raise AccountCreateError('Dat is geen valide e-mail')

    if Account.objects.filter(username=username).count() != 0:
        raise AccountCreateError('Account bestaat al')

    # maak het account aan
    account = Account()
    account.username = username
    account.set_password(wachtwoord)
    account.first_name = voornaam
    account.last_name = achternaam

    try:
        account.save()
    except psycopg2.errors.UniqueViolation:  # pragma: no cover
        # FUTURE: vervang dit door veilige database operatie (get_or_create?)
        # dus ondanks de check hierboven lukt het sommige mensen toch om een dubbel account aan te maken
        raise AccountCreateError('Account bestaat al')

    # maak het email record aan
    mail = AccountEmail()
    mail.account = account
    if email_is_bevestigd:
        mail.email_is_bevestigd = True
        mail.bevestigde_email = email
        mail.nieuwe_email = ''
    else:
        mail.email_is_bevestigd = False
        mail.bevestigde_email = ''
        mail.nieuwe_email = email
    mail.save()

    return account, mail
Пример #5
0
    def post(self, request, *args, **kwargs):

        from_ip = get_safe_from_ip(request)
        context = super().get_context_data(**kwargs)
        context['foutmelding'] = ''

        email = request.POST.get('email',
                                 '')[:150]  # afkappen voor extra veiligheid
        if not mailer_email_is_valide(email):
            context[
                'foutmelding'] = 'Voer het e-mailadres in van een bestaand account'

        if not context['foutmelding']:
            # zoek een account met deze email
            try:
                account_email = (
                    AccountEmail.objects.get(bevestigde_email__iexact=email)
                )  # iexact = case insensitive volledige match

            except AccountEmail.DoesNotExist:
                # email is ook niet bekend
                context[
                    'foutmelding'] = 'Voer het e-mailadres in van een bestaand account'

            except AccountEmail.MultipleObjectsReturned:
                # kan niet kiezen tussen verschillende accounts
                # werkt dus niet als het email hergebruikt is voor meerdere accounts
                context[
                    'foutmelding'] = 'Er is een probleem met dit e-mailadres. Neem contact op met het bondsburo!'

                # schrijf de intentie in het logboek
                schrijf_in_logboek(
                    account=None,
                    gebruikte_functie="Wachtwoord",
                    activiteit=
                    "E-mail adres %s wordt gebruikt voor meer dan een account. Dit wordt niet ondersteund."
                    % repr(email))

        # we controleren hier niet of het account inactief is, dat doet login wel weer

        if not context['foutmelding']:
            # we hebben nu het account waar we een de e-mail voor moeten sturen

            schrijf_in_logboek(
                account=None,
                gebruikte_functie="Wachtwoord",
                activiteit=
                "Stuur e-mail naar adres %s voor account %s, verzocht vanaf IP %s."
                %
                (repr(account_email.bevestigde_email),
                 repr(account_email.account.get_account_full_name()), from_ip))

            account_stuur_email_wachtwoord_vergeten(
                account_email,
                wachtwoord='vergeten',
                email=account_email.bevestigde_email)
            httpresp = render(request, TEMPLATE_EMAIL, context)
        else:
            httpresp = render(request, self.template_name, context)

        return httpresp
Пример #6
0
    def post(self, request, *args, **kwargs):
        """ deze functie wordt aangeroepen als een POST request ontvangen is """

        # begrens hoe snel deze functie misbruikt kan worden
        time.sleep(1)

        code = kwargs['code'][:32]  # afkappen voor veiligheid

        email = request.POST.get('email', '')
        email = email.strip().lower()

        if len(code) != 32 or not mailer_email_is_valide(email):
            # geen goede code of geen valide email ingevoerd
            return self.get(request, *args, **kwargs)

        try:
            levering = (Levering
                        .objects
                        .select_related('opdracht')
                        .get(url_code=code))
        except Levering.DoesNotExist:
            return render(request, TEMPLATE_LEVERING_NIET_GEVONDEN)

        if levering.is_geblokkeerd:
            return render(request, TEMPLATE_LEVERING_NIET_GEVONDEN)

        if levering.to_email.strip().lower() != email:
            # verkeerde e-mail: laat de gebruiker opnieuw een e-mail invoeren
            return self.get(request, *args, **kwargs)

        # zoek het bestand erbij en stuur deze over
        product = levering.product
        fpath, naam = get_path_to_product_bestand(product)

        klein = naam.lower()
        if '.zip' in klein:
            content_type = 'application/zip'
        elif '.pdf' in klein:
            content_type = 'application/pdf'
        else:
            content_type = 'application/octet-stream'

        try:
            with open(fpath, 'rb') as file_handle:
                response = HttpResponse(file_handle, content_type=content_type)
                response['Content-Disposition'] = 'attachment; filename="%s"' % naam
        except (FileNotFoundError, OSError) as exc:
            # bestand niet gevonden
            my_logger.error('Download levering %s (%s) mislukt: %s' % (levering.pk, fpath, str(exc)))
            return render(request, TEMPLATE_LEVERING_NIET_GEVONDEN)

        from_ip = get_safe_from_ip(request)
        my_logger.info('Download levering %s (%s) vanaf IP %s' % (levering.pk, fpath, from_ip))

        if levering.download_count > 0:
            levering.download_count -= 1
        if levering.download_count <= 0:
            levering.is_geblokkeerd = True
        levering.save()

        opdracht = levering.opdracht
        if opdracht:
            if not opdracht.is_afgehandeld:
                opdracht.is_afgehandeld = True
                opdracht.save()

        return response
Пример #7
0
    def _maak_opdracht(self, inbox, items, order, template_taal):
        try:
            email = items['E-mail']
            naam = items['Naam']
        except KeyError:
            if self._verbose:
                self.stderr.write('[ERROR] Inbox pk=%s heeft niet alle benodigde items' % inbox.pk)
                self.stderr.write('Dit zijn de items:')
                for key, value in items.items():
                    self.stderr.write('   %s / %s' % (key, value))
            my_logger.error('Inbox pk=%s heeft niet alle benodigde items' % inbox.pk)
            return False        # faal

        email = email.strip()
        if not mailer_email_is_valide(email):
            self.stderr.write('[ERROR] Inbox pk=%s heeft geen valide e-mail: %s' % (inbox.pk, repr(email)))
            my_logger.error('Inbox pk=%s heeft geen valide e-mail: %s' % (inbox.pk, repr(email)))
            return False        # faal

        try:
            opdracht = Opdracht.objects.get(bron=inbox)
        except Opdracht.DoesNotExist:
            # maak een nieuwe opdracht aan
            opdracht = Opdracht()
            opdracht.bron = inbox
        else:
            # hergebruik de opdracht (voorkom duplicates)
            opdracht.producten.clear()

        opdracht.eigenaar = Account.objects.get(username=settings.DEFAULT_EIGENAAR)
        opdracht.to_email = email
        opdracht.to_naam = naam
        opdracht.regels = "\n".join([regel for _, regel in order])
        opdracht.regels += '\n\nGekozen taal voor de levering: %s' % template_taal
        opdracht.save()

        opdracht.is_vrijgegeven_voor_levering = True

        # zoek matchende producten
        prod_links = list()
        for taal, regel in order:
            # print('taal: %s, regel: %s' % (taal, repr(regel)))
            for prod in (Product
                         .objects
                         .filter(eigenaar=opdracht.eigenaar,
                                 taal=taal)):
                if prod.is_match(regel):
                    # controleer dat het bestand bestaat, anders niet leveren
                    fpath, _ = get_path_to_product_bestand(prod)
                    if os.path.exists(fpath):
                        opdracht.producten.add(prod)

                        # levering aanmaken (of hergebruiken)
                        try:
                            levering = Levering.objects.get(opdracht=opdracht,
                                                            product=prod)
                        except Levering.DoesNotExist:
                            levering = Levering(opdracht=opdracht,
                                                product=prod,
                                                eigenaar=opdracht.eigenaar,
                                                to_email=email)
                            levering.maak_url_code()
                            levering.download_count = settings.DOWNLOAD_CREDITS
                            levering.save()

                        url = settings.SITE_URL + '/code/%s/' % levering.url_code
                        link = '%s: %s' % (prod.korte_beschrijving, url)
                        if link not in prod_links:
                            prod_links.append(link)
                    else:
                        self.stderr.write('[ERROR] Kan bestand %s niet vinden' % repr(fpath))

                    if prod.handmatig_vrijgeven:
                        opdracht.is_vrijgegeven_voor_levering = False
            # for
        # for

        if len(prod_links) == 0:
            # geen producten kunnen matchen
            opdracht.is_vrijgegeven_voor_levering = False
            my_logger.warning('Opdracht pk=%s niet kunnen koppelen aan een product' % opdracht.pk)
            opdracht.save()
            return False        # faal

        try:
            template = (BerichtTemplate
                        .objects
                        .get(eigenaar=opdracht.eigenaar,
                             taal=template_taal))
        except BerichtTemplate.DoesNotExist:
            # geen template kunnen maken
            opdracht.is_vrijgegeven_voor_levering = False
            my_logger.error('Geen template voor taal %s en eigenaar %s' % (
                                    repr(template_taal),
                                    opdracht.eigenaar.get_first_name()))
            opdracht.save()
            return False

        if len(prod_links) > 1:
            msg = template.plural
        else:
            msg = template.singular
        msg = msg.replace('%NAME%', opdracht.to_naam)
        msg = msg.replace('%LINKS%', "\n".join(prod_links))

        opdracht.mail_body = msg
        opdracht.subject = template.subject
        opdracht.save()

        # indien automatisch vrijgegeven, verstuur meteen de e-mail
        if opdracht.is_vrijgegeven_voor_levering:
            mailer_queue_email(opdracht.to_email,
                               opdracht.subject,
                               opdracht.mail_body)

        # success
        return True