docs: def getAssociation(self, server_url, handle=None):
          """Retrieve an association. If no handle is specified, return
          the association with the latest expiration.
  
          (str, str or NoneType) -> Association or NoneType
          """
          if handle is None:
              handle = ''
  
          # The filename with the empty handle is a prefix of all other
          # associations for the given server URL.
          filename = self.getAssociationFilename(server_url, handle)
  
          if handle:
              return self._getAssociation(filename)
          else:
              association_files = os.listdir(self.association_dir)
              matching_files = []
              # strip off the path to do the comparison
              name = os.path.basename(filename)
              for association_file in association_files:
                  if association_file.startswith(name):
                      matching_files.append(association_file)
  
              matching_associations = []
              # read the matching files and sort by time issued
              for name in matching_files:
                  full_name = os.path.join(self.association_dir, name)
                  association = self._getAssociation(full_name)
                  if association is not None:
                      matching_associations.append(
                          (association.issued, association))
  
              matching_associations.sort()
  
              # return the most recently issued one.
              if matching_associations:
                  (_, assoc) = matching_associations[-1]
                  return assoc
              else:
                  return None