@@ -5,7 +5,12 @@ use diesel::prelude::*;
5
5
use serde:: { Deserialize , Serialize } ;
6
6
use utoipa:: ToSchema ;
7
7
8
- use crate :: { error:: Error , routes:: auth:: VERIFICATION_EXPIRATION_DAYS , utils:: { get_connection, web_block_unpacked} , AppState } ;
8
+ use crate :: {
9
+ error:: Error ,
10
+ routes:: auth:: VERIFICATION_EXPIRATION_DAYS ,
11
+ utils:: { get_connection, web_block_unpacked} ,
12
+ AppState ,
13
+ } ;
9
14
10
15
use db_connector:: models:: { users:: User , verification:: Verification } ;
11
16
@@ -40,12 +45,30 @@ fn send_verification_mail(
40
45
41
46
let ( body, subject) = match lang. as_str ( ) {
42
47
"de" | "de-DE" => {
43
- let template = VerifyEmailDETemplate { name : & name, link : & link } ;
44
- match template. render ( ) { Ok ( body) => ( body, "Email verifizieren" ) , Err ( e) => { log:: error!( "Failed to render German verification email template for user '{name}': {e}" ) ; return Err ( Error :: InternalError . into ( ) ) ; } }
48
+ let template = VerifyEmailDETemplate {
49
+ name : & name,
50
+ link : & link,
51
+ } ;
52
+ match template. render ( ) {
53
+ Ok ( body) => ( body, "Email verifizieren" ) ,
54
+ Err ( e) => {
55
+ log:: error!( "Failed to render German verification email template for user '{name}': {e}" ) ;
56
+ return Err ( Error :: InternalError . into ( ) ) ;
57
+ }
58
+ }
45
59
}
46
60
_ => {
47
- let template = VerifyEmailENTemplate { name : & name, link : & link } ;
48
- match template. render ( ) { Ok ( body) => ( body, "Verify email" ) , Err ( e) => { log:: error!( "Failed to render English verification email template for user '{name}': {e}" ) ; return Err ( Error :: InternalError . into ( ) ) ; } }
61
+ let template = VerifyEmailENTemplate {
62
+ name : & name,
63
+ link : & link,
64
+ } ;
65
+ match template. render ( ) {
66
+ Ok ( body) => ( body, "Verify email" ) ,
67
+ Err ( e) => {
68
+ log:: error!( "Failed to render English verification email template for user '{name}': {e}" ) ;
69
+ return Err ( Error :: InternalError . into ( ) ) ;
70
+ }
71
+ }
49
72
}
50
73
} ;
51
74
@@ -69,7 +92,6 @@ pub async fn resend_verification(
69
92
) -> actix_web:: Result < impl Responder > {
70
93
use db_connector:: schema:: users:: dsl as u_dsl;
71
94
72
-
73
95
let mut conn = get_connection ( & state) ?;
74
96
let user_email = data. email . to_lowercase ( ) ;
75
97
@@ -78,14 +100,17 @@ pub async fn resend_verification(
78
100
match u_dsl:: users
79
101
. filter ( u_dsl:: email. eq ( & user_email) )
80
102
. select ( User :: as_select ( ) )
81
- . get_result ( & mut conn) {
82
- Ok ( u) => Ok ( u) ,
83
- Err ( diesel:: result:: Error :: NotFound ) => Err ( Error :: UserDoesNotExist ) ,
84
- Err ( _) => Err ( Error :: InternalError )
85
- }
86
- } ) . await ?;
103
+ . get_result ( & mut conn)
104
+ {
105
+ Ok ( u) => Ok ( u) ,
106
+ Err ( diesel:: result:: Error :: NotFound ) => Err ( Error :: UserDoesNotExist ) ,
107
+ Err ( _) => Err ( Error :: InternalError ) ,
108
+ }
109
+ } )
110
+ . await ?;
87
111
88
- if db_user. email_verified { // silently return success
112
+ if db_user. email_verified {
113
+ // silently return success
89
114
return Ok ( HttpResponse :: Ok ( ) ) ;
90
115
}
91
116
@@ -98,25 +123,37 @@ pub async fn resend_verification(
98
123
// remove old tokens
99
124
let _ = diesel:: delete ( verification. filter ( user. eq ( user_id) ) ) . execute ( & mut conn) ;
100
125
101
- let exp = chrono:: Utc :: now ( ) . checked_add_days ( Days :: new ( VERIFICATION_EXPIRATION_DAYS ) ) . ok_or ( Error :: InternalError ) ?;
102
-
103
- let verify = Verification { id : uuid:: Uuid :: new_v4 ( ) , user : user_id, expiration : exp. naive_utc ( ) } ;
104
- diesel:: insert_into ( verification) . values ( & verify) . execute ( & mut conn) . map_err ( |_| Error :: InternalError ) ?;
126
+ let exp = chrono:: Utc :: now ( )
127
+ . checked_add_days ( Days :: new ( VERIFICATION_EXPIRATION_DAYS ) )
128
+ . ok_or ( Error :: InternalError ) ?;
129
+
130
+ let verify = Verification {
131
+ id : uuid:: Uuid :: new_v4 ( ) ,
132
+ user : user_id,
133
+ expiration : exp. naive_utc ( ) ,
134
+ } ;
135
+ diesel:: insert_into ( verification)
136
+ . values ( & verify)
137
+ . execute ( & mut conn)
138
+ . map_err ( |_| Error :: InternalError ) ?;
105
139
Ok ( verify)
106
- } ) . await . and_then ( |_verify| {
140
+ } )
141
+ . await
142
+ . map ( |_verify| {
107
143
#[ cfg( not( test) ) ]
108
144
{
109
145
let user_name = db_user. name . clone ( ) ;
110
146
let lang: String = lang. into ( ) ;
111
147
let state_cpy = state. clone ( ) ;
112
148
let email_cpy = data. email . clone ( ) ;
113
149
std:: thread:: spawn ( move || {
114
- if let Err ( e) = send_verification_mail ( user_name, _verify, email_cpy, state_cpy, lang) {
150
+ if let Err ( e) =
151
+ send_verification_mail ( user_name, _verify, email_cpy, state_cpy, lang)
152
+ {
115
153
log:: error!( "Failed to resend verification mail: {e:?}" ) ;
116
154
}
117
155
} ) ;
118
156
}
119
- Ok ( ( ) )
120
157
} ) ?;
121
158
122
159
Ok ( HttpResponse :: Ok ( ) )
@@ -125,18 +162,23 @@ pub async fn resend_verification(
125
162
#[ cfg( test) ]
126
163
mod tests {
127
164
use super :: * ;
128
- use actix_web:: { test, App } ;
129
- use crate :: tests:: configure;
130
165
use crate :: routes:: auth:: register:: tests:: { create_user, delete_user} ;
131
166
use crate :: routes:: auth:: verify:: tests:: fast_verify;
167
+ use crate :: tests:: configure;
168
+ use actix_web:: { test, App } ;
132
169
133
170
#[ actix_web:: test]
134
171
async fn test_resend_unverified ( ) {
135
172
136
173
create_user ( mail) . await ;
137
174
let app = App :: new ( ) . configure ( configure) . service ( resend_verification) ;
138
175
let app = test:: init_service ( app) . await ;
139
- let req = test:: TestRequest :: post ( ) . uri ( "/resend_verification" ) . set_json ( & ResendSchema { email : mail. to_string ( ) } ) . to_request ( ) ;
176
+ let req = test:: TestRequest :: post ( )
177
+ . uri ( "/resend_verification" )
178
+ . set_json ( & ResendSchema {
179
+ email : mail. to_string ( ) ,
180
+ } )
181
+ . to_request ( ) ;
140
182
let resp = test:: call_service ( & app, req) . await ;
141
183
assert ! ( resp. status( ) . is_success( ) ) ;
142
184
delete_user ( mail) ;
@@ -149,7 +191,12 @@ mod tests {
149
191
fast_verify ( mail) ;
150
192
let app = App :: new ( ) . configure ( configure) . service ( resend_verification) ;
151
193
let app = test:: init_service ( app) . await ;
152
- let req = test:: TestRequest :: post ( ) . uri ( "/resend_verification" ) . set_json ( & ResendSchema { email : mail. to_string ( ) } ) . to_request ( ) ;
194
+ let req = test:: TestRequest :: post ( )
195
+ . uri ( "/resend_verification" )
196
+ . set_json ( & ResendSchema {
197
+ email : mail. to_string ( ) ,
198
+ } )
199
+ . to_request ( ) ;
153
200
let resp = test:: call_service ( & app, req) . await ;
154
201
assert ! ( resp. status( ) . is_success( ) ) ;
155
202
delete_user ( mail) ;
@@ -160,7 +207,12 @@ mod tests {
160
207
161
208
let app = App :: new ( ) . configure ( configure) . service ( resend_verification) ;
162
209
let app = test:: init_service ( app) . await ;
163
- let req = test:: TestRequest :: post ( ) . uri ( "/resend_verification" ) . set_json ( & ResendSchema { email : mail. to_string ( ) } ) . to_request ( ) ;
210
+ let req = test:: TestRequest :: post ( )
211
+ . uri ( "/resend_verification" )
212
+ . set_json ( & ResendSchema {
213
+ email : mail. to_string ( ) ,
214
+ } )
215
+ . to_request ( ) ;
164
216
let resp = test:: call_service ( & app, req) . await ;
165
217
assert_eq ! ( resp. status( ) . as_u16( ) , 400 ) ; // mapped from UserDoesNotExist
166
218
}
0 commit comments