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
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
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)
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
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
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
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