@@ -1745,6 +1745,60 @@ fn a_verified_remote_install_uses_resolution_root_grant_and_content_in_order() {
17451745 assert ! ( requests[ 3 ] . url. ends_with( "/content" ) ) ;
17461746}
17471747
1748+ #[ test]
1749+ fn a_public_grant_may_serve_content_from_a_service_subdomain ( ) {
1750+ let ( pin, mut responses) = verified_remote_responses ( ) ;
1751+ let mut grant: serde_json:: Value = serde_json:: from_slice ( & responses[ 2 ] . body ) . unwrap ( ) ;
1752+ grant[ "contentUrl" ] = json ! ( "https://artifacts.skilld.dev/sha256/example" ) ;
1753+ responses[ 2 ] = response ( 200 , serde_json:: to_vec ( & grant) . unwrap ( ) ) ;
1754+ let http = Arc :: new ( FakeHttp :: with ( responses) ) ;
1755+ let remote = SkilldRemote :: new (
1756+ http. clone ( ) ,
1757+ Arc :: new ( NoTokenProvider ) ,
1758+ NativeRemoteConfig :: Pinned ( pin) ,
1759+ )
1760+ . with_endpoint ( "https://skilld.dev" )
1761+ . unwrap ( )
1762+ . with_sleeper ( Arc :: new ( NoSleep ) ) ;
1763+ let selector = RemoteSelector :: parse ( "skilld:skilld-dev/skills/example" ) . unwrap ( ) ;
1764+
1765+ let prepared = remote. prepare ( & selector, false ) . unwrap ( ) ;
1766+
1767+ assert ! ( matches!(
1768+ prepared. source_status,
1769+ SourceStatus :: Verified { .. }
1770+ ) ) ;
1771+ let requests = http. requests . lock ( ) . unwrap ( ) ;
1772+ assert_eq ! ( requests. len( ) , 4 ) ;
1773+ assert_eq ! (
1774+ requests[ 3 ] . url,
1775+ "https://artifacts.skilld.dev/sha256/example"
1776+ ) ;
1777+ }
1778+
1779+ #[ test]
1780+ fn a_public_grant_on_an_unrelated_origin_is_rejected_before_download ( ) {
1781+ let ( pin, mut responses) = verified_remote_responses ( ) ;
1782+ let mut grant: serde_json:: Value = serde_json:: from_slice ( & responses[ 2 ] . body ) . unwrap ( ) ;
1783+ grant[ "contentUrl" ] = json ! ( "https://example.com/sha256/example" ) ;
1784+ responses[ 2 ] = response ( 200 , serde_json:: to_vec ( & grant) . unwrap ( ) ) ;
1785+ let http = Arc :: new ( FakeHttp :: with ( responses) ) ;
1786+ let remote = SkilldRemote :: new (
1787+ http. clone ( ) ,
1788+ Arc :: new ( NoTokenProvider ) ,
1789+ NativeRemoteConfig :: Pinned ( pin) ,
1790+ )
1791+ . with_endpoint ( "https://skilld.dev" )
1792+ . unwrap ( )
1793+ . with_sleeper ( Arc :: new ( NoSleep ) ) ;
1794+ let selector = RemoteSelector :: parse ( "skilld:skilld-dev/skills/example" ) . unwrap ( ) ;
1795+
1796+ let error = remote. prepare ( & selector, false ) . unwrap_err ( ) ;
1797+
1798+ assert_eq ! ( error. code, "REMOTE_ORIGIN_REJECTED" ) ;
1799+ assert_eq ! ( http. requests. lock( ) . unwrap( ) . len( ) , 3 ) ;
1800+ }
1801+
17481802#[ test]
17491803fn a_private_artifact_download_sends_the_account_and_one_time_grant ( ) {
17501804 let ( pin, mut responses) = verified_remote_responses ( ) ;
0 commit comments