11mod sql;
2+ mod sql_pseudofunctions;
23
3- use actix_web:: http:: StatusCode ;
4- use actix_web_httpauth:: headers:: authorization:: Basic ;
54use anyhow:: { anyhow, Context } ;
65use futures_util:: stream:: { self , BoxStream , Stream } ;
76use futures_util:: StreamExt ;
@@ -15,7 +14,8 @@ use std::time::Duration;
1514use crate :: app_config:: AppConfig ;
1615pub use crate :: file_cache:: FileCache ;
1716use crate :: utils:: add_value_to_map;
18- use crate :: webserver:: http:: { RequestInfo , SingleOrVec } ;
17+ use crate :: webserver:: database:: sql_pseudofunctions:: extract_req_param;
18+ use crate :: webserver:: http:: RequestInfo ;
1919use crate :: MIGRATIONS_DIR ;
2020pub use sql:: make_placeholder;
2121pub use sql:: ParsedSqlFile ;
@@ -162,86 +162,6 @@ fn bind_parameters<'a>(
162162 Ok ( stmt. statement . query_with ( arguments) )
163163}
164164
165- fn extract_req_param < ' a > (
166- param : & StmtParam ,
167- request : & ' a RequestInfo ,
168- ) -> anyhow:: Result < Option < Cow < ' a , str > > > {
169- Ok ( match param {
170- StmtParam :: Get ( x) => request. get_variables . get ( x) . map ( SingleOrVec :: as_json_str) ,
171- StmtParam :: Post ( x) => request. post_variables . get ( x) . map ( SingleOrVec :: as_json_str) ,
172- StmtParam :: GetOrPost ( x) => request
173- . post_variables
174- . get ( x)
175- . or_else ( || request. get_variables . get ( x) )
176- . map ( SingleOrVec :: as_json_str) ,
177- StmtParam :: Cookie ( x) => request. cookies . get ( x) . map ( SingleOrVec :: as_json_str) ,
178- StmtParam :: Header ( x) => request. headers . get ( x) . map ( SingleOrVec :: as_json_str) ,
179- StmtParam :: Error ( x) => anyhow:: bail!( "{}" , x) ,
180- StmtParam :: BasicAuthPassword => extract_basic_auth_password ( request)
181- . map ( Cow :: Borrowed )
182- . map ( Some ) ?,
183- StmtParam :: BasicAuthUsername => extract_basic_auth_username ( request)
184- . map ( Cow :: Borrowed )
185- . map ( Some ) ?,
186- StmtParam :: HashPassword ( inner) => extract_req_param ( inner, request) ?
187- . map_or ( Ok ( None ) , |x| hash_password ( & x) . map ( Cow :: Owned ) . map ( Some ) ) ?,
188- StmtParam :: RandomString ( len) => Some ( Cow :: Owned ( random_string ( * len) ) ) ,
189- } )
190- }
191-
192- fn random_string ( len : usize ) -> String {
193- use rand:: { distributions:: Alphanumeric , Rng } ;
194- password_hash:: rand_core:: OsRng
195- . sample_iter ( & Alphanumeric )
196- . take ( len)
197- . map ( char:: from)
198- . collect ( )
199- }
200-
201- fn hash_password ( password : & str ) -> anyhow:: Result < String > {
202- let phf = argon2:: Argon2 :: default ( ) ;
203- let salt = password_hash:: SaltString :: generate ( & mut password_hash:: rand_core:: OsRng ) ;
204- let password_hash = & password_hash:: PasswordHash :: generate ( phf, password, & salt)
205- . map_err ( |e| anyhow ! ( "Unable to hash password: {}" , e) ) ?;
206- Ok ( password_hash. to_string ( ) )
207- }
208-
209- #[ derive( Debug ) ]
210- pub struct ErrorWithStatus {
211- pub status : StatusCode ,
212- }
213- impl std:: fmt:: Display for ErrorWithStatus {
214- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
215- write ! ( f, "{}" , self . status)
216- }
217- }
218- impl std:: error:: Error for ErrorWithStatus { }
219-
220- fn extract_basic_auth ( request : & RequestInfo ) -> anyhow:: Result < & Basic > {
221- request
222- . basic_auth
223- . as_ref ( )
224- . ok_or_else ( || {
225- anyhow:: Error :: new ( ErrorWithStatus {
226- status : StatusCode :: UNAUTHORIZED ,
227- } )
228- } )
229- . with_context ( || "Expected the user to be authenticated with HTTP basic auth" )
230- }
231-
232- fn extract_basic_auth_username ( request : & RequestInfo ) -> anyhow:: Result < & str > {
233- Ok ( extract_basic_auth ( request) ?. user_id ( ) )
234- }
235-
236- fn extract_basic_auth_password ( request : & RequestInfo ) -> anyhow:: Result < & str > {
237- let password = extract_basic_auth ( request) ?. password ( ) . ok_or_else ( || {
238- anyhow:: Error :: new ( ErrorWithStatus {
239- status : StatusCode :: UNAUTHORIZED ,
240- } )
241- } ) ?;
242- Ok ( password)
243- }
244-
245165#[ derive( Debug ) ]
246166pub enum DbItem {
247167 Row ( Value ) ,
@@ -371,7 +291,7 @@ fn set_custom_connect_options(options: &mut AnyConnectOptions, config: &AppConfi
371291}
372292struct PreparedStatement {
373293 statement : AnyStatement < ' static > ,
374- parameters : Vec < StmtParam > ,
294+ parameters : Vec < sql_pseudofunctions :: StmtParam > ,
375295}
376296
377297impl Display for PreparedStatement {
@@ -380,20 +300,6 @@ impl Display for PreparedStatement {
380300 }
381301}
382302
383- #[ derive( Debug , PartialEq , Eq ) ]
384- enum StmtParam {
385- Get ( String ) ,
386- Post ( String ) ,
387- GetOrPost ( String ) ,
388- Cookie ( String ) ,
389- Header ( String ) ,
390- Error ( String ) ,
391- BasicAuthPassword ,
392- BasicAuthUsername ,
393- HashPassword ( Box < StmtParam > ) ,
394- RandomString ( usize ) ,
395- }
396-
397303#[ actix_web:: test]
398304async fn test_row_to_json ( ) -> anyhow:: Result < ( ) > {
399305 use sqlx:: Connection ;
0 commit comments