| 
					
				 | 
			
			
				@@ -44,6 +44,9 @@ static strmap_t *country_idxplus1_by_lc_code = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** A list of all known geoip_entry_t, sorted by ip_low. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static smartlist_t *geoip_entries = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** SHA1 digest of the GeoIP file to include in extra-info descriptors. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static char geoip_digest[DIGEST_LEN]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Return the index of the <b>country</b>'s entry in the GeoIP DB 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * if it is a valid 2-letter country code, otherwise return -1. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -201,6 +204,7 @@ geoip_load_file(const char *filename, or_options_t *options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   FILE *f; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const char *msg = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int severity = options_need_geoip_info(options, &msg) ? LOG_WARN : LOG_INFO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  crypto_digest_env_t *geoip_digest_env = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   clear_geoip_db(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!(f = fopen(filename, "r"))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_fn(severity, LD_GENERAL, "Failed to open GEOIP file %s.  %s", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -214,11 +218,13 @@ geoip_load_file(const char *filename, or_options_t *options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_free(geoip_entries); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   geoip_entries = smartlist_create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  geoip_digest_env = crypto_new_digest_env(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   log_notice(LD_GENERAL, "Parsing GEOIP file."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   while (!feof(f)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     char buf[512]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (fgets(buf, (int)sizeof(buf), f) == NULL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    crypto_digest_add_bytes(geoip_digest_env, buf, strlen(buf)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* FFFF track full country name. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     geoip_parse_entry(buf); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -231,6 +237,11 @@ geoip_load_file(const char *filename, or_options_t *options) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    * country. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   refresh_all_country_info(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* Remember file digest so that we can include it in our extra-info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * descriptors. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  crypto_digest_get_digest(geoip_digest_env, geoip_digest, DIGEST_LEN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  crypto_free_digest_env(geoip_digest_env); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -278,6 +289,13 @@ geoip_is_loaded(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return geoip_countries != NULL && geoip_entries != NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** Return the hex-encoded SHA1 digest of the loaded GeoIP file. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const char * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+geoip_db_digest(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return hex_str(geoip_digest, DIGEST_LEN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Entry in a map from IP address to the last time we've seen an incoming 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * connection from that IP address. Used by bridges only, to track which 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * countries have them blocked. */ 
			 |