char/avril
(wip) why'd you have to go and make things so complicaaaaated?
git clone https://git.t4t.associates/char/avril
05d50bd
main
1use std:: sync:: Arc ; 2 3use crate :: caps::{ Capabilities , CapabilitiesError , PathTarget }; 4 5# [ derive ( Clone , Copy , Debug , PartialEq , Eq )] 6pub enum SourceAccess { 7Execute , 8Read , 9} 10 11# [ derive ( Clone )] 12pub struct SourceAuthority { 13caps : Arc < Capabilities >, 14access : SourceAccess , 15} 16 17impl SourceAuthority { 18pub fn execute ( caps : Arc < Capabilities >) ->Self { 19Self { 20 caps, 21access : SourceAccess :: Execute , 22} 23} 24 25pub fn read ( caps : Arc < Capabilities >) ->Self { 26Self { caps, access : SourceAccess :: Read } 27} 28 29pub fn is_read ( & self ) ->bool { 30self . access ==SourceAccess :: Read 31} 32 33pub fn check_local ( & self , target : & PathTarget ) ->Result <(), CapabilitiesError > { 34match self . access { 35SourceAccess :: Execute =>self . caps . check_js_exec ( target), 36SourceAccess :: Read =>self . caps . check_read ( target), 37} 38} 39 40pub fn check_remote_module ( & self , url : & url:: Url ) ->Result <(), CapabilitiesError > { 41match self . access { 42SourceAccess :: Execute =>self . caps . check_remote_exec ( url), 43SourceAccess :: Read =>self . check_net_url ( url), 44} 45} 46 47pub fn check_remote_package ( & self , url : & url:: Url ) ->Result <(), CapabilitiesError > { 48match self . access { 49SourceAccess :: Execute =>self . caps . check_remote_acquire ( url), 50SourceAccess :: Read =>self . check_net_url ( url), 51} 52} 53 54fn check_net_url ( & self , url : & url:: Url ) ->Result <(), CapabilitiesError > { 55let host = url 56. host_str () 57. ok_or_else ( ||CapabilitiesError :: NetUrlDenied ( url. to_string ())) ?; 58let port = url 59. port_or_known_default () 60. ok_or_else ( ||CapabilitiesError :: NetUrlDenied ( url. to_string ())) ?; 61self . caps . check_net ( host, port) 62} 63 64/// Reauthorize an acquired artifact by its recorded final URL. No-op 65/// under Execute, which keeps requested-only redirect semantics. 66pub fn check_remote_final ( & self , final_url : & str ) ->Result <(), CapabilitiesError > { 67if self . is_read () { 68let url = url:: Url :: parse ( final_url) 69. map_err ( |_|CapabilitiesError :: NetUrlDenied ( final_url. to_owned ())) ?; 70self . check_net_url ( & url) 71} else { 72Ok (()) 73} 74} 75 76pub fn unrestricted_local ( & self ) ->bool { 77match self . access { 78SourceAccess :: Execute =>self . caps . unrestricted_js_exec (), 79SourceAccess :: Read =>self . caps . unrestricted_read (), 80} 81} 82}