diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2022-01-19 19:25:03 +0100 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2022-01-19 19:25:03 +0100 | 
| commit | 170c7e420e89ec780ee336a508f4862feed651f0 (patch) | |
| tree | 57c400f63af5f7238ecac8722a8bb94925a12876 /lib | |
| parent | 1233796866b332dbefc4c739acb0ea5932916537 (diff) | |
Controller/Account: refactor mail notifications into separate functions
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/Travelynx/Controller/Account.pm | 301 | 
1 files changed, 174 insertions, 127 deletions
| diff --git a/lib/Travelynx/Controller/Account.pm b/lib/Travelynx/Controller/Account.pm index 312cc9e..88df2d5 100644 --- a/lib/Travelynx/Controller/Account.pm +++ b/lib/Travelynx/Controller/Account.pm @@ -69,9 +69,6 @@ sub register {  	my $password  = $self->req->param('password');  	my $password2 = $self->req->param('password2');  	my $ip        = $self->req->headers->header('X-Forwarded-For'); -	my $ua        = $self->req->headers->user_agent; -	my $date      = DateTime->now( time_zone => 'Europe/Berlin' ) -	  ->strftime('%d.%m.%Y %H:%M:%S %z');  	# In case Mojolicious is not running behind a reverse proxy  	$ip @@ -153,6 +150,35 @@ sub register {  		token         => $token,  		password_hash => $pw_hash  	); + +	my $success = $self->send_registration_mail( +		email   => $email, +		token   => $token, +		ip      => $ip, +		user    => $user, +		user_id => $user_id +	); +	if ($success) { +		$tx->commit; +		$self->render( 'login', from => 'register' ); +	} +	else { +		$self->render( 'register', invalid => 'sendmail' ); +	} +} + +sub send_registration_mail { +	my ( $self, %opt ) = @_; + +	my $email   = $opt{email}; +	my $token   = $opt{token}; +	my $user    = $opt{user}; +	my $user_id = $opt{user_id}; +	my $ip      = $opt{ip}; +	my $date    = DateTime->now( time_zone => 'Europe/Berlin' ) +	  ->strftime('%d.%m.%Y %H:%M:%S %z'); + +	my $ua          = $self->req->headers->user_agent;  	my $reg_url     = $self->url_for('reg')->to_abs->scheme('https');  	my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); @@ -175,15 +201,8 @@ sub register {  	$body .= " * UserAgent: ${ua}\n\n\n";  	$body .= "Impressum: ${imprint_url}\n"; -	my $success -	  = $self->sendmail->custom( $email, 'Registrierung bei travelynx', $body ); -	if ($success) { -		$tx->commit; -		$self->render( 'login', from => 'register' ); -	} -	else { -		$self->render( 'register', invalid => 'sendmail' ); -	} +	return $self->sendmail->custom( $email, 'Registrierung bei travelynx', +		$body );  }  sub verify { @@ -425,7 +444,6 @@ sub change_mail {  		}  		my $token = make_token(); -		my $name  = $self->current_user->{name};  		my $db    = $self->pg->db;  		my $tx    = $db->begin; @@ -436,34 +454,7 @@ sub change_mail {  			token => $token  		); -		my $ip   = $self->req->headers->header('X-Forwarded-For'); -		my $ua   = $self->req->headers->user_agent; -		my $date = DateTime->now( time_zone => 'Europe/Berlin' ) -		  ->strftime('%d.%m.%Y %H:%M:%S %z'); - -		# In case Mojolicious is not running behind a reverse proxy -		$ip -		  //= sprintf( '%s:%s', $self->tx->remote_address, -			$self->tx->remote_port ); -		my $confirm_url -		  = $self->url_for('confirm_mail')->to_abs->scheme('https'); -		my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); - -		my $body = "Hallo ${name},\n\n"; -		$body .= "Bitte bestätige unter <${confirm_url}/${token}>,\n"; -		$body .= "dass du mit dieser Adresse E-Mail empfangen kannst.\n\n"; -		$body -		  .= "Du erhältst diese Mail, da eine Änderung der deinem travelynx-Account\n"; -		$body .= "zugeordneten Mail-Adresse beantragt wurde.\n\n"; -		$body .= "Daten zur Anfrage:\n"; -		$body .= " * Datum: ${date}\n"; -		$body .= " * Client: ${ip}\n"; -		$body .= " * UserAgent: ${ua}\n\n\n"; -		$body .= "Impressum: ${imprint_url}\n"; - -		my $success -		  = $self->sendmail->custom( $email, -			'travelynx: Mail-Adresse bestätigen', $body ); +		my $success = $self->send_address_confirmation_mail( $email, $token );  		if ($success) {  			$tx->commit; @@ -478,6 +469,37 @@ sub change_mail {  	}  } +sub send_address_confirmation_mail { +	my ( $self, $email, $token ) = @_; + +	my $name = $self->current_user->{name}; +	my $ip   = $self->req->headers->header('X-Forwarded-For'); +	my $ua   = $self->req->headers->user_agent; +	my $date = DateTime->now( time_zone => 'Europe/Berlin' ) +	  ->strftime('%d.%m.%Y %H:%M:%S %z'); + +	# In case Mojolicious is not running behind a reverse proxy +	$ip +	  //= sprintf( '%s:%s', $self->tx->remote_address, $self->tx->remote_port ); +	my $confirm_url = $self->url_for('confirm_mail')->to_abs->scheme('https'); +	my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); + +	my $body = "Hallo ${name},\n\n"; +	$body .= "Bitte bestätige unter <${confirm_url}/${token}>,\n"; +	$body .= "dass du mit dieser Adresse E-Mail empfangen kannst.\n\n"; +	$body +	  .= "Du erhältst diese Mail, da eine Änderung der deinem travelynx-Account\n"; +	$body .= "zugeordneten Mail-Adresse beantragt wurde.\n\n"; +	$body .= "Daten zur Anfrage:\n"; +	$body .= " * Datum: ${date}\n"; +	$body .= " * Client: ${ip}\n"; +	$body .= " * UserAgent: ${ua}\n\n\n"; +	$body .= "Impressum: ${imprint_url}\n"; + +	return $self->sendmail->custom( $email, +		'travelynx: Mail-Adresse bestätigen', $body ); +} +  sub change_name {  	my ($self) = @_; @@ -535,38 +557,43 @@ sub change_name {  		$self->flash( success => 'name' );  		$self->redirect_to('account'); -		my $ip   = $self->req->headers->header('X-Forwarded-For'); -		my $ua   = $self->req->headers->user_agent; -		my $date = DateTime->now( time_zone => 'Europe/Berlin' ) -		  ->strftime('%d.%m.%Y %H:%M:%S %z'); - -		# In case Mojolicious is not running behind a reverse proxy -		$ip -		  //= sprintf( '%s:%s', $self->tx->remote_address, -			$self->tx->remote_port ); -		my $confirm_url -		  = $self->url_for('confirm_mail')->to_abs->scheme('https'); -		my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); - -		my $body = "Hallo ${new_name},\n\n"; -		$body -		  .= "Der Name deines Travelynx-Accounts wurde erfolgreich geändert.\n"; -		$body .= "Alter Name: ${old_name}\n"; -		$body .= "Neue Name: ${new_name}\n\n"; -		$body .= "Daten zur Anfrage:\n"; -		$body .= " * Datum: ${date}\n"; -		$body .= " * Client: ${ip}\n"; -		$body .= " * UserAgent: ${ua}\n\n\n"; -		$body .= "Impressum: ${imprint_url}\n"; - -		$self->sendmail->custom( $self->current_user->{email}, -			'travelynx: Name geändert', $body ); +		$self->send_name_notification_mail( $old_name, $new_name );  	}  	else {  		$self->render( 'change_name', name => $old_name );  	}  } +sub send_name_notification_mail { +	my ( $self, $old_name, $new_name ) = @_; + +	my $ip   = $self->req->headers->header('X-Forwarded-For'); +	my $ua   = $self->req->headers->user_agent; +	my $date = DateTime->now( time_zone => 'Europe/Berlin' ) +	  ->strftime('%d.%m.%Y %H:%M:%S %z'); + +	# In case Mojolicious is not running behind a reverse proxy +	$ip +	  //= sprintf( '%s:%s', $self->tx->remote_address, $self->tx->remote_port ); +	my $confirm_url = $self->url_for('confirm_mail')->to_abs->scheme('https'); +	my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); + +	my $body = "Hallo ${new_name},\n\n"; +	$body .= "Der Name deines Travelynx-Accounts wurde erfolgreich geändert.\n"; +	$body +	  .= "Bitte beachte, dass du dich ab sofort nur mit dem neuen Namen anmelden kannst.\n\n"; +	$body .= "Alter Name: ${old_name}\n\n"; +	$body .= "Neue Name: ${new_name}\n\n"; +	$body .= "Daten zur Anfrage:\n"; +	$body .= " * Datum: ${date}\n"; +	$body .= " * Client: ${ip}\n"; +	$body .= " * UserAgent: ${ua}\n\n\n"; +	$body .= "Impressum: ${imprint_url}\n"; + +	return $self->sendmail->custom( $self->current_user->{email}, +		'travelynx: Name geändert', $body ); +} +  sub password_form {  	my ($self) = @_; @@ -613,12 +640,16 @@ sub change_password {  	$self->flash( success => 'password' );  	$self->redirect_to('account'); +	$self->send_password_notification_mail(); +} -	my $user  = $self->current_user->{name}; -	my $email = $self->current_user->{email}; -	my $ip    = $self->req->headers->header('X-Forwarded-For'); -	my $ua    = $self->req->headers->user_agent; -	my $date  = DateTime->now( time_zone => 'Europe/Berlin' ) +sub send_password_notification_mail { +	my ($self) = @_; +	my $user   = $self->current_user->{name}; +	my $email  = $self->current_user->{email}; +	my $ip     = $self->req->headers->header('X-Forwarded-For'); +	my $ua     = $self->req->headers->user_agent; +	my $date   = DateTime->now( time_zone => 'Europe/Berlin' )  	  ->strftime('%d.%m.%Y %H:%M:%S %z');  	# In case Mojolicious is not running behind a reverse proxy @@ -676,36 +707,12 @@ sub request_password_reset {  			return;  		} -		my $ip   = $self->req->headers->header('X-Forwarded-For'); -		my $ua   = $self->req->headers->user_agent; -		my $date = DateTime->now( time_zone => 'Europe/Berlin' ) -		  ->strftime('%d.%m.%Y %H:%M:%S %z'); - -		# In case Mojolicious is not running behind a reverse proxy -		$ip -		  //= sprintf( '%s:%s', $self->tx->remote_address, -			$self->tx->remote_port ); -		my $recover_url = $self->url_for('recover')->to_abs->scheme('https'); -		my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); - -		my $body = "Hallo ${name},\n\n"; -		$body .= "Unter ${recover_url}/${uid}/${token}\n"; -		$body -		  .= "kannst du ein neues Passwort für deinen travelynx-Account vergeben.\n\n"; -		$body -		  .= "Du erhältst diese Mail, da mit deinem Accountnamen und deiner Mail-Adresse\n"; -		$body -		  .= "ein Passwort-Reset angefordert wurde. Falls diese Anfrage nicht von dir\n"; -		$body .= "ausging, kannst du sie ignorieren.\n\n"; -		$body .= "Daten zur Anfrage:\n"; -		$body .= " * Datum: ${date}\n"; -		$body .= " * Client: ${ip}\n"; -		$body .= " * UserAgent: ${ua}\n\n\n"; -		$body .= "Impressum: ${imprint_url}\n"; - -		my $success -		  = $self->sendmail->custom( $email, 'travelynx: Neues Passwort', -			$body ); +		my $success = $self->send_lostpassword_confirmation_mail( +			email => $email, +			name  => $name, +			uid   => $uid, +			token => $token +		);  		if ($success) {  			$tx->commit; @@ -768,37 +775,77 @@ sub request_password_reset {  			token => $token  		); -		my $user  = $account->{name}; -		my $email = $account->{email}; -		my $ip    = $self->req->headers->header('X-Forwarded-For'); -		my $ua    = $self->req->headers->user_agent; -		my $date  = DateTime->now( time_zone => 'Europe/Berlin' ) -		  ->strftime('%d.%m.%Y %H:%M:%S %z'); - -		# In case Mojolicious is not running behind a reverse proxy -		$ip -		  //= sprintf( '%s:%s', $self->tx->remote_address, -			$self->tx->remote_port ); -		my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); - -		my $body = "Hallo ${user},\n\n"; -		$body -		  .= "Das Passwort deines travelynx-Accounts wurde soeben über die"; -		$body .= " 'Passwort vergessen'-Funktion geändert.\n\n"; -		$body .= "Daten zur Änderung:\n"; -		$body .= " * Datum: ${date}\n"; -		$body .= " * Client: ${ip}\n"; -		$body .= " * UserAgent: ${ua}\n\n\n"; -		$body .= "Impressum: ${imprint_url}\n"; - -		$self->sendmail->custom( $email, 'travelynx: Passwort geändert', -			$body ); +		$self->send_lostpassword_notification_mail($account);  	}  	else {  		$self->render('recover_password');  	}  } +sub send_lostpassword_confirmation_mail { +	my ( $self, %opt ) = @_; +	my $email = $opt{email}; +	my $name  = $opt{name}; +	my $uid   = $opt{uid}; +	my $token = $opt{token}; + +	my $ip   = $self->req->headers->header('X-Forwarded-For'); +	my $ua   = $self->req->headers->user_agent; +	my $date = DateTime->now( time_zone => 'Europe/Berlin' ) +	  ->strftime('%d.%m.%Y %H:%M:%S %z'); + +	# In case Mojolicious is not running behind a reverse proxy +	$ip +	  //= sprintf( '%s:%s', $self->tx->remote_address, $self->tx->remote_port ); +	my $recover_url = $self->url_for('recover')->to_abs->scheme('https'); +	my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); + +	my $body = "Hallo ${name},\n\n"; +	$body .= "Unter ${recover_url}/${uid}/${token}\n"; +	$body +	  .= "kannst du ein neues Passwort für deinen travelynx-Account vergeben.\n\n"; +	$body +	  .= "Du erhältst diese Mail, da mit deinem Accountnamen und deiner Mail-Adresse\n"; +	$body +	  .= "ein Passwort-Reset angefordert wurde. Falls diese Anfrage nicht von dir\n"; +	$body .= "ausging, kannst du sie ignorieren.\n\n"; +	$body .= "Daten zur Anfrage:\n"; +	$body .= " * Datum: ${date}\n"; +	$body .= " * Client: ${ip}\n"; +	$body .= " * UserAgent: ${ua}\n\n\n"; +	$body .= "Impressum: ${imprint_url}\n"; + +	my $success +	  = $self->sendmail->custom( $email, 'travelynx: Neues Passwort', $body ); +} + +sub send_lostpassword_notification_mail { +	my ( $self, $account ) = @_; +	my $user  = $account->{name}; +	my $email = $account->{email}; +	my $ip    = $self->req->headers->header('X-Forwarded-For'); +	my $ua    = $self->req->headers->user_agent; +	my $date  = DateTime->now( time_zone => 'Europe/Berlin' ) +	  ->strftime('%d.%m.%Y %H:%M:%S %z'); + +	# In case Mojolicious is not running behind a reverse proxy +	$ip +	  //= sprintf( '%s:%s', $self->tx->remote_address, $self->tx->remote_port ); +	my $imprint_url = $self->url_for('impressum')->to_abs->scheme('https'); + +	my $body = "Hallo ${user},\n\n"; +	$body .= "Das Passwort deines travelynx-Accounts wurde soeben über die"; +	$body .= " 'Passwort vergessen'-Funktion geändert.\n\n"; +	$body .= "Daten zur Änderung:\n"; +	$body .= " * Datum: ${date}\n"; +	$body .= " * Client: ${ip}\n"; +	$body .= " * UserAgent: ${ua}\n\n\n"; +	$body .= "Impressum: ${imprint_url}\n"; + +	return $self->sendmail->custom( $email, 'travelynx: Passwort geändert', +		$body ); +} +  sub recover_password {  	my ($self) = @_; | 
