/[drupal]/contributions/modules/fileapi/drivers/s3.driver
ViewVC logotype

Contents of /contributions/modules/fileapi/drivers/s3.driver

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.4 - (show annotations) (download)
Wed Jun 18 12:04:57 2008 UTC (17 months, 1 week ago) by dopry
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +0 -0 lines
FILE REMOVED
a wholly different fileapi.
1 <?php
2
3 /**
4 * @file
5 * Amazon S3 storage driver for filesystem.
6 */
7
8
9 /**
10 * driver settings form. called by filesystem.module when creating a respository using this driver.
11 * @param $settings
12 * settings array from database.
13 */
14
15 function fileapi_driver_s3_settings_form($settings = array()) {
16 //debug_msg($settings);
17 $form = array(
18 '#type' => 'fieldset',
19 '#title' => t('Amazon S3 storage driver settings'),
20 '#tree' => TRUE,
21 );
22
23 $form['driver'] = array(
24 '#type' => 'hidden',
25 '#value' => 's3',
26 );
27
28 $form['s3 url'] = array(
29 '#type' => 'textfield',
30 '#title' => t('Amazon S3 url'),
31 '#default_value' => strlen($settings['s3 url']) ? $settings['s3 url'] : 'http://s3.amazonaws.com',
32 );
33
34 $form['awsID'] = array(
35 '#type' => 'textfield',
36 '#title' => t('AWS Access Key ID'),
37 '#default_value' => $settings['awsID'],
38 );
39
40 $form['awsSecret'] = array(
41 '#type' => 'textfield',
42 '#title' => t('AWS Secret'),
43 '#default_value' => $settings['awsSecret'],
44 );
45
46 return $form;
47 }
48
49 function fileapi_driver_s3_settings_form_validate() {
50 }
51
52
53 /**
54 * test if a path is a file.
55 * @param $path
56 * path to be tested
57 */
58 function fileapi_driver_s3_is_file($settings, $path) {
59
60 }
61
62 /**
63 * test if a path is a directory.
64 * @param $path
65 * path to be tested
66 */
67 function fileapi_driver_s3_is_dir($settings, $path) {
68 }
69
70
71 /**
72 * create a directory using standard php functions
73 * @param $path
74 */
75 function fileapi_driver_s3_mkdir($settings, $path) {
76 // there are technically no directories, so we can safely do
77 // nothing here.
78 return TRUE;
79 }
80
81
82 /**
83 * remove a directory using standard php functions
84 * @param $path
85 */
86
87 function fileapi_driver_s3_rmdir($settings, $path) {
88 // there are technically no directories.
89 // so we can test is there is a file in the 'directory' and return false here.
90 }
91
92
93 /**
94 * remove a file using standard php functions
95 * @param $path
96 */
97 function fileapi_driver_s3_remove($settings, $path) {
98 clearstatcache();
99
100 }
101
102 /**
103 * copy a file using standard php functions
104 * @param $src
105 * @param $dst
106 */
107 function fileapi_driver_s3_copy($settings, $src, $dst) {
108
109 }
110
111 /**
112 * move a file using standard php functions
113 * @param $src
114 * @param $dst
115 */
116 function fileapi_driver_s3_move($settings, $src, $dst) {
117
118 }
119
120 /**
121 * check if a file exists using standard php functions
122 * @param $path
123 */
124 function fileapi_driver_s3_exists($settings, $path) {
125 }
126
127 /**
128 * touch a path and create a file there.
129 * @param $path
130 * path to be touched.
131 */
132 function fileapi_driver_s3_touch($settings, $path) {
133 $tmp = file_directory_tmp() .'/'. basename($path);
134 touch($tmp);
135 $headers = array();
136 $headers['Content-Type'] = 'text/plain';
137 $body = file_get_contents($tmp);
138 s3_request('PUT', $path, $settings, array(), $body);
139 unlink($tmp);
140 }
141
142
143 /**
144 * read the contents of a directory.
145 * @param $path
146 * directory to be read.
147 * @return array
148 * action results and array of directory contents.
149 */
150 function fileapi_driver_s3_readdir($settings, $path) {
151 }
152
153 /**
154 * read the contents of a file.
155 * @param $path
156 * path of file to be read.
157 *
158 * NOTE: we are not including offset and maxlen since it is only supported in php > 5.1.0
159 * and our support target is 4.3.0.
160 */
161 function fileapi_driver_s3_fileread($settings, $path) {
162 return s3_request('GET', $path, $settings);
163 }
164
165 function fileapi_driver_s3_filewrite($settings, $path, $data) {
166 $headers = array('Content-Type' => 'text/plain');
167 s3_request('PUT', $path, $settings, array(), $data);
168 }
169
170
171 function s3_request($method, $resource, $settings, $headers=array(), $amzheaders=array(), $body= '') {
172 $url = $settings['s3 url'] . $settings['bucket'];
173
174 // Set date to proper format for S3.
175 $headers['Date'] = gmdate(DATE_RFC822);
176 $headers['Authorization'] = 'AWS '. $settings['awsID'] .':'. $signature;
177
178 // Build S3 authorization hash.
179 $auth_string = $method ."\n\n". $headers['Content-type'] ."\n";
180 $auth_string .= $headers['Date'] ."\n". implode("\n",$amzheaders) ."\n". $resource;
181 $signature = hex2b64(s3_hmac_sha1($settings['awsSecret'], $auth_string));
182
183 // Set date to proper format for S3.
184 $headers['Date'] = gmdate(DATE_RFC822);
185 $headers['Authorization'] = 'AWS '. $settings['awsID'] .':'. $signature;
186
187 $result = drupal_http_request($url .'/'. $resource, array_merge($headers, $amzheaders), $method, $body);
188 drupal_set_message('<pre>'. print_r($result, TRUE) .'</pre>');
189 }
190
191 /**
192 * Generate an sha1 signed hash of a string.
193 * @param K
194 * key to be used for the signature.
195 * @param string
196 * string to be signed.
197 */
198 function s3_hmac_sha1($K, $string) {
199 // hash function
200 $h = 'sha1';
201 // byte length of blocks operated on by hash function.
202 $B = '64';
203 // byte length of hash function output.
204 // seems unused in the HMAC algorithm
205 $L = '20';
206 return s3_hmac($h, $B, $K, $string);
207 }
208
209 /**
210 * HMAC implementation for drupal as per
211 * http://www.ietf.org/rfc/rfc2104.txt
212 *
213 * @param $h
214 * hashing function can be any
215 * @param $B
216 * block length iterated over by hashing algorithm
217 * @param $K
218 * key to be used for signing.
219 * @param $string
220 * string to be signed.
221 */
222 function s3_hmac($h, $B, $K, $string) {
223 // Hash the key if it exceeds the blocklength.
224 if (strlen($K) > $B) {
225 // Pack that dirty string.
226 $K = pack('H*', $h($K));
227 }
228 // pad it with 0 bytes to block length
229 $K = str_pad($K, $B, chr(0x00));
230
231 // Setup inner and outer pads as per the RFC.
232 $ipad = str_repeat(chr(0x36), $B)^$K;
233 $opad = str_repeat(chr(0x5C), $B)^$K;
234
235 // Do inner concat XOR hashing. Pack that dirty string.
236 $string = pack('H*', $h($ipad.$string));
237
238 // return outer concat XOR hash
239 return $h($opad.$string);
240 }
241
242
243

  ViewVC Help
Powered by ViewVC 1.1.2