From 5fdca154d1bf49769001518bd3ac432f86273631 Mon Sep 17 00:00:00 2001
From: Lathan Britz <jucallme@gmail.com>
Date: Fri, 2 Aug 2013 22:14:31 -0400
Subject: [PATCH] Use file api dont save fiels into DB

---
 site_verify.admin.inc | 99 +++++++++++++++++++++++++++++++++++++++------------
 site_verify.install   | 30 ++++++++++------
 site_verify.module    | 32 ++++++++++++-----
 3 files changed, 120 insertions(+), 41 deletions(-)

diff --git a/site_verify.admin.inc b/site_verify.admin.inc
index 732f999..99b37ec 100644
--- a/site_verify.admin.inc
+++ b/site_verify.admin.inc
@@ -59,8 +59,8 @@ function site_verify_edit_form($form, &$form_state, $record = array(), $engine =
     $record += array(
       'svid' => NULL,
       'file' => '',
-      'file_contents' => t('This is a verification page.'),
       'meta' => '',
+      'fid' => 0,
       'engine' => $engine,
     );
     $form_state['storage']['record'] = $record;
@@ -132,18 +132,14 @@ function site_verify_edit_form($form, &$form_state, $record = array(), $engine =
         '#element_validate' => $record['engine']['file_validate'],
         '#access' => $record['engine']['file'],
       );
-      $form['file_contents'] = array(
-        '#type' => 'textarea',
-        '#title' => t('Verification file contents'),
-        '#default_value' => $record['file_contents'],
-        '#element_validate' => $record['engine']['file_contents_validate'],
-        '#wysiwyg' => FALSE,
-        '#access' => $record['engine']['file_contents'],
+      $form['fid'] = array(
+        '#type' => 'value',
+        '#value' => $record['fid'],
       );
+
       if (!variable_get('clean_url', 0)) {
         drupal_set_message(t('Using verification files will not work if <a href="@clean-urls">clean URLs</a> are disabled.', array('@clean-urls' => url('admin/settings/clean-url'))), 'error', FALSE);
         $form['file']['#disabled'] = TRUE;
-        $form['file_contents']['#disabled'] = TRUE;
         $form['file_upload']['#disabled'] = TRUE;
       }
 
@@ -174,29 +170,67 @@ function site_verify_edit_form($form, &$form_state, $record = array(), $engine =
  * Validation callback; save the uploaded file and check file name uniqueness.
  */
 function site_verify_validate_file($form, &$form_state) {
-  $values = &$form_state['values'];
-
   // Import the uploaded verification file.
   $validators = array('file_validate_extensions' => array());
-  if ($file = file_save_upload('file_upload', $validators, FALSE, FILE_EXISTS_REPLACE)) {
+  if (!empty($values['meta'])) {
+    if (!site_validate_meta_tag($values['meta'])) {
+      form_set_error('meta', t('The meta tag "@tag" is not valid. View the w3schools <a href="http://www.w3schools.com/tags/tag_meta.asp" arget="_blank"> example</a>', array('@tag' => $values['meta'])));
+    }
+  }
+
+  // Pre pair saving this file.
+  $destination = 'private://site_verify/';
+  file_prepare_directory($destination, FILE_CREATE_DIRECTORY);
+
+  if ($file = file_save_upload('file_upload', $validators, $destination, FILE_EXISTS_ERROR)) {
     $contents = @file_get_contents($file->uri);
-    file_delete($file);
     if ($contents === FALSE) {
+      file_delete($file);
       drupal_set_message(t('The verification file import failed, because the file %filename could not be read.', array('%filename' => $file->filename)), 'error');
     }
     else {
-      $values['file'] = $file->filename;
-      $values['file_contents'] = $contents;
-      //drupal_set_message(t('The verification file <a href="@filename">@filename</a> was successfully imported.', array('@filename' => $file->filename)));
+      // Remove the old file...
+      if (isset($values['fid']) && $values['fid'] != 0) {
+        $old_file = file_load($values['fid']);
+        file_delete($old_file);
+      }
+      $form_state['values']['file'] = $file->filename;
+      // set the fid so it can be saved.
+      $form_state['values']['fid'] = $file->fid;
+       // Change the status
+      $file->status = FILE_STATUS_PERMANENT;
+      // Update the file status into the database
+      file_save($file);
     }
   }
+}
+
+/**
+ * Helper function to validate meta tags
+ * @param  string $string
+ *   The meta tag string to validate.
+ * @return boolean
+ *   A flag to indicate if validation passed.
+ */
+function site_validate_meta_tag($string) {
+  $doc = new DOMDocument();
+  @$doc->loadHTML($string);
+  $metas = $doc->getElementsByTagName('meta');
+
+  if ($metas->length <! 0) {
+    return FALSE;
+  }
 
-  if ($values['file']) {
-    $existing_file = db_query("SELECT svid FROM {site_verify} WHERE LOWER(file) = LOWER(:file) AND svid <> :svid", array(':file' => $values['file'], ':svid' => $values['svid']))->fetchField();
-    if ($existing_file) {
-      form_set_error('file', t('The file %filename is already being used in another verification.', array('%filename' => $values['file'])));
+  for ($i = 0; $i < $metas->length; $i++) {
+    $meta = $metas->item($i);
+    foreach($meta->attributes as $attribute_name => $attribute_node) {
+      if (!empty($attribute_name) && empty($attribute_node->nodeValue)) {
+        return FALSE;
+      }
     }
   }
+
+  return TRUE;
 }
 
 /**
@@ -212,10 +246,25 @@ function site_verify_edit_form_submit($form, &$form_state) {
   else {
     // Save the verification to the database.
     if ($form_state['values']['svid']) {
-      drupal_write_record('site_verify', $form_state['values'], array('svid'));
+      db_update('site_verify')
+        ->fields(array(
+          'engine' => $form_state['values']['engine'],
+          'fid' => $form_state['values']['fid'],
+          'meta' => $form_state['values']['meta'],
+          'file' => $form_state['values']['file'],
+        ))
+        ->condition('svid', $form_state['values']['svid'])
+        ->execute();
     }
     else {
-      drupal_write_record('site_verify', $form_state['values']);
+      db_insert('site_verify')
+        ->fields(array(
+          'engine' => $form_state['values']['engine'],
+          'fid' => $form_state['values']['fid'],
+          'meta' => $form_state['values']['meta'],
+          'file' => $form_state['values']['file'],
+        ))
+        ->execute();
     }
 
     drupal_set_message(t('Verification saved.'));
@@ -247,6 +296,12 @@ function site_verify_delete_form($form, $form_state, $record) {
 
 function site_verify_delete_form_submit($form, &$form_state) {
   $record = $form_state['values']['record'];
+  // Remove the old file...
+  if (isset($record['fid']) && $record['fid'] != 0) {
+    $old_file = file_load($record['fid']);
+    file_delete($old_file);
+  }
+
   db_delete('site_verify')->condition('svid', $record['svid'])->execute();
   drupal_set_message(t('Verification for %engine has been deleted.', array('%engine' => $record['engine']['name'])));
   watchdog('site_verify', 'Verification for %engine deleted.', array('%engine' => $record['engine']['name']), WATCHDOG_NOTICE);
diff --git a/site_verify.install b/site_verify.install
index a1177d5..018db35 100644
--- a/site_verify.install
+++ b/site_verify.install
@@ -25,17 +25,12 @@ function site_verify_schema() {
         'default' => '',
         'description' => '',
       ),
-      'file' => array(
-        'type' => 'varchar',
-        'length' => 255,
-        'default' => '',
-        'description' => '',
-      ),
-      'file_contents' => array(
-        'type' => 'text',
+      'fid' => array(
+        'type' => 'int',
         'not null' => TRUE,
-        'size' => 'big',
-        'description' => '',
+        'unsigned' => TRUE,
+        'default' => 0,
+        'description' => 'File ID',
       ),
       'meta' => array(
         'type' => 'text',
@@ -128,3 +123,18 @@ function site_verify_import_ghs() {
   variable_del('ghs_string_verify');
   module_disable(array('ghs'));
 }
+
+/**
+ * Add new column for file ID and drop old file_contents file.
+ */
+function site_verify_update_7001() {
+  db_drop_field('site_verify', 'file_contents');
+  $field = array(
+    'type' => 'int',
+    'not null' => TRUE,
+    'unsigned' => TRUE,
+    'default' => 0,
+    'description' => 'File ID',
+  );
+  db_add_field('site_verify', 'fid', $field);
+}
diff --git a/site_verify.module b/site_verify.module
index c3669dd..9ba7ffc 100755
--- a/site_verify.module
+++ b/site_verify.module
@@ -83,7 +83,7 @@ function site_verify_init() {
  *   An array of the site verification record, or FALSE if not found.
  */
 function site_verify_load($svid) {
-  $record = db_query("SELECT svid, engine, file, file_contents, meta FROM {site_verify} WHERE svid = :svid", array(':svid' => $svid))->fetchAssoc();
+  $record = db_query("SELECT svid, engine, file, fid, meta FROM {site_verify} WHERE svid = :svid", array(':svid' => $svid))->fetchAssoc();
   if ($record) {
     $record['engine'] = site_verify_engine_load($record['engine']);
   }
@@ -110,7 +110,7 @@ function site_verify_site_verify_engine_info() {
   $engines['google'] = array(
     'name' => t('Google'),
     'file' => TRUE,
-    'file_contents' => TRUE,
+    'fid' => 0,
     'file_example' => 'google1234567890abcdef.html',
     'meta' => TRUE,
     'meta_example' => '<meta name="google-site-verification" content="NbwaW3WIDp_SPsSsfl78Ive7F34-znm9lxLJXjuWNGE" />',
@@ -118,18 +118,19 @@ function site_verify_site_verify_engine_info() {
   $engines['yahoo'] = array(
     'name' => t('Yahoo!'),
     'file' => TRUE,
-    'file_contents' => TRUE,
+    'fid' => 0,
     'meta' => TRUE,
   );
   $engines['bing'] = array(
     'name' => t('Bing'),
     'file' => TRUE,
-    'file_contents' => TRUE,
+    'fid' => 0,
     'meta' => TRUE,
   );
   $engines['yandex'] = array(
     'name' => t('Yandex'),
     'file' => TRUE,
+    'fid' => 0,
     'file_example' => 'yandex_b5741169901f6c20.txt',
     'meta' => TRUE,
     'meta_example' => '<meta name="yandex-verification" content="b5741169901f6c20" />',
@@ -137,7 +138,7 @@ function site_verify_site_verify_engine_info() {
   $engines['custom'] = array(
     'name' => t('Custom verification'),
     'file' => TRUE,
-    'file_contents' => TRUE,
+    'fid' => 0,
     'meta' => TRUE,
   );
   return $engines;
@@ -162,9 +163,9 @@ function site_verify_get_engines() {
         'file' => FALSE,
         'file_example' => FALSE,
         'file_validate' => array(),
-        'file_contents' => FALSE,
         'file_contents_example' => FALSE,
         'file_contents_validate' => array(),
+        'fid' => 0,
         'meta' => FALSE,
         'meta_example' => FALSE,
         'meta_validate' => array(),
@@ -177,11 +178,24 @@ function site_verify_get_engines() {
 
 function site_verify_output($svid) {
   $verification = site_verify_load($svid);
-  if ($verification['file_contents'] && $verification['engine']['file_contents']) {
-    echo $verification['file_contents'];
+  if (!empty($verification['fid'])) {
+    if ($file = file_load($verification['fid'])) {
+      $contents = @file_get_contents($file->uri);
+      echo $contents;
+    }
+    else {
+      drupal_set_message(t("The verification file @file does not exitis.", array('@file' => $verification['file'])), 'error');
+      watchdog('site_verify', "The verification file @file does not exitis.", array('@file' => $verification['file']), WATCHDOG_ERROR);
+      drupal_set_title(t('Verification page'));
+      return t('This is a verification page for the @title search engine.', array('@title' => $verification['file']));
+    }
+  }
+  else if (!empty($verification['meta'])) {
+      $contents = $verification['meta'];
+      echo $contents;
   }
   else {
     drupal_set_title(t('Verification page'));
-    return t('This is a verification page for the @title search engine.', array('!title' => $verification['engine']['name']));
+    return t('This is a verification page for the @title search engine.', array('@title' => $verification['file']));
   }
 }
-- 
1.8.3.1

