lib/ezmlm/list.rb
changeset 16 e135ccae6783
parent 15 a38e6916504c
child 17 23c7f5c8ee39
--- a/lib/ezmlm/list.rb	Fri May 12 11:09:36 2017 -0700
+++ b/lib/ezmlm/list.rb	Fri May 12 16:17:41 2017 -0700
@@ -19,10 +19,6 @@
 ###
 class Ezmlm::List
 
-	# Quick address space detection, to (hopefully)
-	# match the overflow size on this machine.
-	ADDRESS_SPACE = [ 'i' ].pack( 'p' ).size * 8
-
 	# Valid subdirectories/sections for subscriptions.
 	SUBSCRIPTION_DIRS = %w[ deny mod digest allow ]
 
@@ -75,7 +71,7 @@
 	###
 	def include?( addr, section: nil )
 		addr.downcase!
-		file = self.subscription_dir( section ) + self.hashchar( addr )
+		file = self.subscription_dir( section ) + Ezmlm::Hash.subscriber( addr )
 		return false unless file.exist?
 		return file.read.scan( /T([^\0]+)\0/ ).flatten.include?( addr )
 	end
@@ -97,7 +93,7 @@
 			next unless address.index( '@' )
 			address.downcase!
 
-			file = self.subscription_dir( section ) + self.hashchar( address )
+			file = self.subscription_dir( section ) + Ezmlm::Hash.subscriber( address )
 			self.with_safety do
 				if file.exist?
 					addresses = file.read.scan( /T([^\0]+)\0/ ).flatten
@@ -123,7 +119,7 @@
 		addr.each do |address|
 			address.downcase!
 
-			file = self.subscription_dir( section ) + self.hashchar( address )
+			file = self.subscription_dir( section ) + Ezmlm::Hash.subscriber( address )
 			self.with_safety do
 				next unless file.exist?
 				addresses = file.read.scan( /T([^\0]+)\0/ ).flatten
@@ -680,10 +676,12 @@
 	end
 
 
-	### Return an Author object for the given +author_id+.
+	### Return an Author object for the given +author_id+, which
+	### could also be an email address.
 	###
 	def author( author_id )
 		raise "Archiving is not enabled." unless self.archived?
+		author_id = Ezmlm::Hash.address(author_id) if author_id.index( '@' )
 		return Ezmlm::List::Author.new( self, author_id )
 	end
 
@@ -729,34 +727,6 @@
 	protected
 	#########
 
-	### Hash an email address, using the ezmlm algorithm for
-	### fast user lookups.  Returns the hashed integer.
-	###
-	### Older ezmlm didn't lowercase addresses, anything within the last
-	### decade did.  We're not going to worry about compatibility there.
-	###
-	### See: subhash.c in the ezmlm source.
-	###
-	def subhash( addr )
-		h = 5381
-		over = 2 ** ADDRESS_SPACE
-
-		addr = 'T' + addr.downcase
-		addr.each_char do |c|
-			h = ( h + ( h << 5 ) ) ^ c.ord
-			h = h % over if h > over # emulate integer overflow
-		end
-		return h % 53
-	end
-
-
-	### Given an email address, return the ascii hash prefix.
-	###
-	def hashchar( addr )
-		return ( self.subhash(addr) + 64 ).chr
-	end
-
-
 	### Just return the contents of the provided +file+, rooted
 	### in the list directory.
 	###