|  | @@ -87,4 +87,138 @@ function blast_ui_theme_registry_alter(&$theme_registry) {
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Makes the tripal job_id unrecognizable.
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  | + * @param $job_id
 | 
	
		
			
				|  |  | + *   The tripal job_id of the blast you want to make secret.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @return
 | 
	
		
			
				|  |  | + *   A short string representing the job_id.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function blast_ui_make_secret($job_id) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  $mapping = blast_ui_secret_mapping();
 | 
	
		
			
				|  |  | +  $secret = str_replace(array_keys($mapping), $mapping, $job_id);
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  return $secret;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Reveals the true job_id for your secret blast result.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @param $secret
 | 
	
		
			
				|  |  | + *    The job_id previously made secret by blast_ui_make_secret().
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @return
 | 
	
		
			
				|  |  | + *    The revealed tripal job_id.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function blast_ui_reveal_secret($secret) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  $mapping = blast_ui_secret_mapping(TRUE);
 | 
	
		
			
				|  |  | +  $job_id = str_replace(array_keys($mapping), $mapping, $secret);
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Check that the job_id exists if it is an integer.
 | 
	
		
			
				|  |  | +  if (is_integer($job_id)) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $exists = db_query('SELECT job_id FROM {tripal_jobs} WHERE job_id=:id', array(':id' => $job_id))->fetchField();
 | 
	
		
			
				|  |  | +    if (!$exists) {
 | 
	
		
			
				|  |  | +      tripal_report_error(
 | 
	
		
			
				|  |  | +        'blast_ui',
 | 
	
		
			
				|  |  | +        TRIPAL_ERROR,
 | 
	
		
			
				|  |  | +        'Unable to decode the blast job_id from :id.',
 | 
	
		
			
				|  |  | +        array(':id' => $secret)
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else {
 | 
	
		
			
				|  |  | +      return $job_id;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }  
 | 
	
		
			
				|  |  | +  // Last ditch effort: maybe this job was encoded before the upgrade?
 | 
	
		
			
				|  |  | +  else {
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +    $job_id = base64_decode($secret);
 | 
	
		
			
				|  |  | +    $exists = db_query('SELECT job_id FROM {tripal_jobs} WHERE job_id=:id', array(':id' => $job_id))->fetchField();
 | 
	
		
			
				|  |  | +    if (!$exists) {
 | 
	
		
			
				|  |  | +      tripal_report_error(
 | 
	
		
			
				|  |  | +        'blast_ui',
 | 
	
		
			
				|  |  | +        TRIPAL_ERROR,
 | 
	
		
			
				|  |  | +        'Unable to decode the blast job_id from :id.',
 | 
	
		
			
				|  |  | +        array(':id' => $secret)
 | 
	
		
			
				|  |  | +      );
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    else {
 | 
	
		
			
				|  |  | +      return $job_id;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  return FALSE;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * A single location for keeping track of the mapping used in our secrets.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function blast_ui_secret_mapping($reveal = FALSE) {
 | 
	
		
			
				|  |  | +  $mapping = array(
 | 
	
		
			
				|  |  | +    1 => 'P',
 | 
	
		
			
				|  |  | +    2 => 'sA',
 | 
	
		
			
				|  |  | +    3 => 'b',
 | 
	
		
			
				|  |  | +    4 => 'Q',
 | 
	
		
			
				|  |  | +    5 => 'Hi',
 | 
	
		
			
				|  |  | +    6 => 'yt',
 | 
	
		
			
				|  |  | +    7 => 'f',
 | 
	
		
			
				|  |  | +    8 => 'zE',
 | 
	
		
			
				|  |  | +    9 => 'Km',
 | 
	
		
			
				|  |  | +    0 => 'jVo',
 | 
	
		
			
				|  |  | +  );
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  // Since this is an open-source module with all the code publically available, 
 | 
	
		
			
				|  |  | +  // our secret is not very secret... We are ok with this since the liklihood of 
 | 
	
		
			
				|  |  | +  // profiting by stealing random blast results is pretty low. That said, if this bothers
 | 
	
		
			
				|  |  | +  // you, feel free to implement the following function in a private module to change
 | 
	
		
			
				|  |  | +  // this mapping to something that cannot easily be looked up on github. ;-).
 | 
	
		
			
				|  |  | +  // NOTE: Ensure that the mapping you come up with is unique to ensure that the
 | 
	
		
			
				|  |  | +  // job_id can be consistently revealed or your users might end up unable to find 
 | 
	
		
			
				|  |  | +  // their own blast results...
 | 
	
		
			
				|  |  | +  if (function_exists('private_make_mapping_ultra_secret')) {
 | 
	
		
			
				|  |  | +    $mapping = private_make_mapping_ultra_secret($mapping);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  if ($reveal) {
 | 
	
		
			
				|  |  | +    return array_flip($mapping);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  else {
 | 
	
		
			
				|  |  | +    return $mapping;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Tests your secret mapping over a set of random integers 
 | 
	
		
			
				|  |  | + * to ensure the job_id can be recovered.
 | 
	
		
			
				|  |  | + *
 | 
	
		
			
				|  |  | + * @param $num_iterations
 | 
	
		
			
				|  |  | + *    An integer representing the number of times you wish to test your mapping.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +function blast_ui_test_secret_mapping($num_iterations = 10000) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  $all_work = TRUE;
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  for($i = 0; $i <= $num_iterations; $i++) {
 | 
	
		
			
				|  |  | +    $job_id = mt_rand(0,100000);
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    $secret = blast_ui_make_secret($job_id);
 | 
	
		
			
				|  |  | +    $recovered_job_id = blast_ui_reveal_secret($secret);
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    if ($job_id != $recovered_job_id) {
 | 
	
		
			
				|  |  | +      drupal_set_message("Unable to recover job_id: $job_id; Secret: $secret.",'error');
 | 
	
		
			
				|  |  | +      $all_work = FALSE;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +  if ($all_work) {
 | 
	
		
			
				|  |  | +    drupal_Set_message("Secret Mapping works over $num_iterations iterations with random integers.");
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +}
 |