#!/usr/bin/python3

###
# Copyright (c) 2002-2004, Jeremiah Fincher
# Copyright (c) 2010-2021, Valentin Lorentz
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
#   * Redistributions of source code must retain the above copyright notice,
#     this list of conditions, and the following disclaimer.
#   * Redistributions in binary form must reproduce the above copyright notice,
#     this list of conditions, and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#   * Neither the name of the author of this software nor the name of
#     contributors to this software may be used to endorse or promote products
#     derived from this software without specific prior written consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###


import sys
import time

# Note: This warning block and the imports are the only patches in limnoria_adduser. The real patches happen in supybot-adduser-suse.
SUSEREADMEPATH = '/usr/share/doc/packages/python311-limnoria/README.SUSE'
try:
    print('')
    print('------------------------------------------------------------')
    print("""WARNING:\nYou are running the upstream limnoria_adduser script. It does not know about the correct directory layout and may interfere with the system installation of Limnoria.\nWhilst you are free to proceed with this upstream script at your own risk, it is highly recommended to run ` sudo -u limnoria limnoria_adduser-suse ` instead.\nPlease read %s for further SUSE specific details on operating your Limnoria installation.\nThe script execution will now pause for 10 seconds, giving you time to abort using Ctrl-C.""" % SUSEREADMEPATH)
    print('------------------------------------------------------------')
    print('')
    time.sleep(10)
except KeyboardInterrupt:
    sys.exit(0)

import optparse
import os
import pwd
import supybot
from supybot.questions import *

def main():
    import supybot.conf as conf
    parser = optparse.OptionParser(usage='Usage: sudo -u limnoria %prog [options] <instance>',
                                   version='supybot %s' % conf.version)
    parser.add_option('-u', '--username', action='store', default='',
                      dest='name',
                      help='username for the user.')
    parser.add_option('-p', '--password', action='store', default='',
                      dest='password',
                      help='password for the user.')
    parser.add_option('-c', '--capability', action='append',
                      dest='capabilities', metavar='CAPABILITY',
                      help='capability the user should have; '
                           'this option may be given multiple times.')
    (options, args) = parser.parse_args()
    if not pwd.getpwuid(os.getuid()).pw_name == 'limnoria':
        print('Please run this script using `sudo -u limnoria limnoria_adduser-suse <instance name>`.')
        sys.exit(1)
    if len(args) != 1:
        parser.error('Specify the instance name of the bot you\'d like to add a user for.')

    ### SUSE
    SUSEINSTANCECONFIG = '/etc/limnoria/.limnoria.configured'
    SUSECONFDIR = '/etc/limnoria/'
    SUSELOGDIR = '/var/log/limnoria/'
    SUSEDATADIR = '/var/lib/limnoria/'

    instance = args[0]

    with open(SUSEINSTANCECONFIG, 'r') as admFile:
        if not any(instance == instanceEntry.rstrip('\n') for instanceEntry in admFile):
            print("""Unable to find a bot instance called %s, was it configured using limnoria_wizard-suse?""" % instance)
            sys.exit(1)

    instanceConfigDir = SUSECONFDIR + instance
    instanceDataDir = SUSEDATADIR + instance
    instanceLogDir = SUSELOGDIR + instance

    conf.supybot.directories.log.setValue(instanceLogDir)
    conf.supybot.directories.data.setValue(instanceDataDir)
    conf.supybot.directories.conf.setValue(instanceConfigDir)

    import supybot.log as log
    conf.supybot.log.stdout.setValue(False)

    filename = '/etc/limnoria/' + instance + '/users.conf'
    conf.supybot.databases.users.filename.setValue(filename)

    import supybot.ircdb as ircdb

    if not options.name:
        name = ''
        while not name:
            name = something('What is the user\'s name?')
            try:
                # Check to see if the user is already in the database.
                _ = ircdb.users.getUser(name)
                # Uh oh.  That user already exists;
                # otherwise we'd have KeyError'ed.
                output('That user already exists.  Try another name.')
                name = ''
            except KeyError:
                # Good.  No such user exists.  We'll pass.
                pass
    else:
        try:
            # Same as above. We exit here instead.
            _ = ircdb.users.getUser(options.name)
            output('That user already exists.  Try another name.')
            sys.exit(-1)
        except KeyError:
            name = options.name

    if not options.password:
        password = getpass('What is %s\'s password? ' % name)
    else:
        password = options.password

    if not options.capabilities:
        capabilities = []
        prompt = 'Would you like to give %s a capability?' % name
        while yn(prompt):
            capabilities.append(anything('What capability?'))
            prompt = 'Would you like to give %s another capability?' % name
    else:
        capabilities = options.capabilities

    user = ircdb.users.newUser()
    user.name = name
    user.setPassword(password)
    for capability in capabilities:
        user.addCapability(capability)
    ircdb.users.setUser(user)
    ircdb.users.flush()
    #os.system('cat %s' % filename) # Was this here just for debugging?
    ircdb.users.close()
    print('User %s added.' % name)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        pass

# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79:
