diff --git a/geocoder.admin.inc b/geocoder.admin.inc index c4ca49b..b6a9cac 100644 --- a/geocoder.admin.inc +++ b/geocoder.admin.inc @@ -42,6 +42,22 @@ function geocoder_admin_settings($form, &$form_state) { '#size' => 10, ); + $form['geocoder_client_google'] = array( + '#type' => 'textfield', + '#title' => t('Google Client Id'), + '#description' => t('The client ID identifies you as a Maps API for Business customer and enables support and purchased quota for your application'), + '#default_value' => empty($geocoder_settings['geocoder_client_google']) ? '' : $geocoder_settings['geocoder_client_google'], + '#required' => FALSE, + ); + + $form['geocoder_signature_google'] = array( + '#type' => 'textfield', + '#title' => t('Google Signature'), + '#description' => t('Your welcome letter includes a cryptographic signing key, which you must use to generate unique signatures for your web service requests.'), + '#default_value' => empty($geocoder_settings['geocoder_signature_google']) ? '' : $geocoder_settings['geocoder_signature_google'], + '#required' => FALSE, + ); + $form['#submit'][] = 'geocoder_admin_settings_submit'; return system_settings_form($form); } @@ -57,5 +73,7 @@ function geocoder_admin_settings_submit($form, &$form_state) { $geocoder_settings['geocoder_apikey_yahoo'] = trim($form_state['values']['geocoder_apikey_yahoo']); $geocoder_settings['geocoder_apikey_yandex'] = trim($form_state['values']['geocoder_apikey_yandex']); $geocoder_settings['geocoder_apikey_bing'] = trim($form_state['values']['geocoder_apikey_bing']); + $geocoder_settings['geocoder_signature_google'] = trim($form_state['values']['geocoder_signature_google']); + $geocoder_settings['geocoder_client_google'] = trim($form_state['values']['geocoder_client_google']); variable_set("geocoder_settings", $geocoder_settings); } diff --git a/plugins/geocoder_handler/google.inc b/plugins/geocoder_handler/google.inc index ea5a845..110cb5a 100755 --- a/plugins/geocoder_handler/google.inc +++ b/plugins/geocoder_handler/google.inc @@ -37,7 +37,23 @@ function geocoder_google($address, $options = array()) { 'sensor' => 'false', ); + $geocoder_settings = variable_get("geocoder_settings", array()); + if (!empty($geocoder_settings["geocoder_client_google"])) { + $client_id = $geocoder_settings["geocoder_client_google"]; + } + if (!empty($geocoder_settings["geocoder_signature_google"])) { + $signature = $geocoder_settings["geocoder_signature_google"]; + } + + if (isset($client_id)) { + $query['client'] = $client_id; + } + $url = url("http://maps.googleapis.com/maps/api/geocode/json", array('query' => $query)); + if (isset($signature)) { + $url = geocoder_google_sign_url($url, $signature); + } + $result = drupal_http_request($url); $delay_trigger = TRUE; @@ -145,6 +161,22 @@ function geocoder_google_field($field, $field_item, $options = array()) { } } +/** + * Authenticates a Google API request with a signature. + */ +function geocoder_google_sign_url($input, $signature) { + $url_parts = parse_url($input); + $pathquery = $url_parts['path'] . "?" . $url_parts['query']; + $key = base64_decode(str_replace(array('-', '_'), array('+', '/'), $signature)); + + // Create a signature using the private key and the URL-encoded + // string using HMAC SHA1. This signature will be binary. + $hashed = hash_hmac("sha1", $pathquery, $key, TRUE); + + $encoded_signature = str_replace(array('+', '/'), array('-', '_'), base64_encode($hashed)); + return $input . "&signature=" . $encoded_signature; +} + function geocoder_google_form($default_values = array()) { $form = array();