# Copyright (C) 2002-2018 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

"""Provide some customization for site-wide behavior.

This should be considered experimental for Mailman 2.1.  The default
implementation should work for standard Mailman.
"""

import os
import errno

from Mailman import mm_cfg

try:
    True, False
except NameError:
    True = 1
    False = 0



def _makedir(path):
    try:
        omask = os.umask(0)
        try:
            os.makedirs(path, 02775)
        finally:
            os.umask(omask)
    except OSError, e:
        # Ignore the exceptions if the directory already exists
        if e.errno <> errno.EEXIST:
            raise



# BAW: We don't really support domain<>None yet.  This will be added in a
# future version.  By default, Mailman will never pass in a domain argument.
def get_listpath(listname, domain=None, create=0):
    """Return the file system path to the list directory for the named list.

    If domain is given, it is the virtual domain for the named list.  The
    default is to not distinguish list paths on the basis of virtual domains.

    If the create flag is true, then this method should create the path
    hierarchy if necessary.  If the create flag is false, then this function
    should not attempt to create the path heirarchy (and in fact the absence
    of the path might be significant).
    """
    path = os.path.join(mm_cfg.LIST_DATA_DIR, listname)
    if create:
        _makedir(path)
    return path



# BAW: We don't really support domain<>None yet.  This will be added in a
# future version.  By default, Mailman will never pass in a domain argument.
def get_archpath(listname, domain=None, create=False, public=False):
    """Return the file system path to the list's archive directory for the
    named list in the named virtual domain.

    If domain is given, it is the virtual domain for the named list.  The
    default is to not distinguish list paths on the basis of virtual domains.

    If the create flag is true, then this method should create the path
    hierarchy if necessary.  If the create flag is false, then this function
    should not attempt to create the path heirarchy (and in fact the absence
    of the path might be significant).

    If public is true, then the path points to the public archive path (which
    is usually a symlink instead of a directory).
    """
    if public:
        subdir = mm_cfg.PUBLIC_ARCHIVE_FILE_DIR
    else:
        subdir = mm_cfg.PRIVATE_ARCHIVE_FILE_DIR
    path = os.path.join(subdir, listname)
    if create:
        _makedir(path)
    return path



# BAW: We don't really support domain<>None yet.  This will be added in a
# future version.  By default, Mailman will never pass in a domain argument.
def get_listnames(domain=None):
    """Return the names of all the known lists for the given domain.

    If domain is given, it is the virtual domain for the named list.  The
    default is to not distinguish list paths on the basis of virtual domains.
    """
    # Import this here to avoid circular imports
    from Mailman.Utils import list_exists
    # We don't currently support separate virtual domain directories
    got = []
    for fn in os.listdir(mm_cfg.LIST_DATA_DIR):
        if list_exists(fn):
            got.append(fn)
    return got
