diff -r a38e6916504c -r e135ccae6783 lib/ezmlm/list.rb --- 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. ###