@@ -86,4 +86,42 @@ public function containerExists(string $name): bool
8686            throw  $ e ;
8787        }
8888    }
89+ 
90+     /** 
91+      * Creates a temporary URL to access object in private containers. 
92+      * This method loosely follows swift command's way to generate temporary url: `swift tempurl $METHOD $EXPIRE $PATH $KEY`. 
93+      * 
94+      * @param string $method  An HTTP method to allow for this temporary URL. Any of GET, POST, HEAD, PUT, POST, DELETE. 
95+      * @param int    $expires Unix timestamp 
96+      * @param string $path    The full path or storage URL to the Swift object. Example: '/v1/AUTH_account/c/o'  or: 'http://saio:8080/v1/AUTH_account/c/o' 
97+      *                        For prefix based signature, set path to 'prefix:/v1/AUTH_account/container/pre' 
98+      * @param string $key     The secret temporary URL key set on the Swift cluster* 
99+      * @param string $ipRange [OPTIONAL] If present, the temporary URL will be restricted to the given ip or ip range 
100+      * @param string $digest  [OPTIONAL] The digest algorithm to be used may be configured by the operator. Default to sha1. 
101+      *                        Check the tempurl.allowed_digests  entry in the cluster's capabilities response to see which algorithms are supported by your 
102+      *                        deployment; 
103+      * 
104+      * @return string 
105+      * 
106+      * @throws \RuntimeException 
107+      */ 
108+     public  function  tempUrl (string  $ method , int  $ expires , string  $ path , string  $ key , string  $ ipRange  = null , string  $ digest  = 'sha1 ' ): string 
109+     {
110+         if  (!function_exists ('hash_hmac ' )) {
111+             throw  new  \RuntimeException (sprintf ('tempUrl requires hash extension enabled. ' ));
112+         }
113+ 
114+         if  ($ ipRange ) {
115+             $ message  = sprintf ("ip=%s \n%s \n%s \n%s " , $ ipRange , $ method , $ expires , $ path );
116+         } else  {
117+             $ message  = sprintf ("%s \n%s \n%s " , $ method , $ expires , $ path );
118+         }
119+ 
120+         $ signature  = hash_hmac ($ digest , $ message , $ key );
121+ 
122+         // sha512 requires prefixing signature 
123+         $ signature  = 'sha512 '  === $ digest  ? 'sha512: ' .$ signature  : $ signature ;
124+ 
125+         return  sprintf ('%s?temp_url_sig=%s&temp_url_expires=%s ' , $ path , $ signature , $ expires );
126+     }
89127}
0 commit comments