@@ -46,14 +46,19 @@ impl InProcDatabaseLocation {
4646/// A connection to a sqlite database
4747pub struct InProcConnection {
4848 location : InProcDatabaseLocation ,
49+ allow_attach_file : bool ,
4950 connection : OnceLock < Arc < Mutex < rusqlite:: Connection > > > ,
5051}
5152
5253impl InProcConnection {
53- pub fn new ( location : InProcDatabaseLocation ) -> Result < Self , sqlite:: Error > {
54+ pub fn new (
55+ location : InProcDatabaseLocation ,
56+ allow_attach_file : bool ,
57+ ) -> Result < Self , sqlite:: Error > {
5458 let connection = OnceLock :: new ( ) ;
5559 Ok ( Self {
5660 location,
61+ allow_attach_file,
5762 connection,
5863 } )
5964 }
@@ -74,6 +79,18 @@ impl InProcConnection {
7479 InProcDatabaseLocation :: Path ( path) => rusqlite:: Connection :: open ( path) ,
7580 }
7681 . map_err ( |e| sqlite:: Error :: Io ( e. to_string ( ) ) ) ?;
82+ if !self . allow_attach_file {
83+ connection. authorizer ( Some ( |ctx : rusqlite:: hooks:: AuthContext < ' _ > | {
84+ use rusqlite:: hooks:: { AuthAction , Authorization } ;
85+ match ctx. action {
86+ // Deny attaching files except tempfile ("") and in-memory (":memory:") databases
87+ AuthAction :: Attach { filename } if !matches ! ( filename, "" | ":memory:" ) => {
88+ Authorization :: Deny
89+ }
90+ _ => Authorization :: Allow ,
91+ }
92+ } ) ) ;
93+ }
7794 Ok ( Arc :: new ( Mutex :: new ( connection) ) )
7895 }
7996}
0 commit comments