#!/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_reset-password. The real patches happen in limnoria_reset-password-suse.
SUSEREADMEPATH = '/usr/share/doc/packages/python311-limnoria/README.SUSE'
try:
    print('')
    print('------------------------------------------------------------')
    print("""WARNING:\nYou are running the upstream limnoria_reset-password 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_reset-password-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 supybot
from supybot.questions import *

def _main():
    import supybot.log as log
    import supybot.conf as conf
    conf.supybot.log.stdout.setValue(False)
    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='new password for the user.')
    (options, args) = parser.parse_args()
    if not pwd.getpwuid(os.getuid()).pw_name == 'limnoria':
        print('Please run this script using `sudo -u limnoria limnoria_reset_password-suse <instance name>`.')
        sys.exit(1)
    if len(args) != 1:
        parser.error('Specify the instance name of the bot you\'d like to start a password reset 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 supybot-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)
                # Success!
            except KeyError:
                # Failure.  No such user exists.  Try another name.
                output('That user doesn\'t exist.  Try another name.')
                name = ''
    else:
        try:
            _ = ircdb.users.getUser(options.name)
            name = options.name
        except KeyError:
            # Same as above. We exit here instead.
            output('That user doesn\'t exist.  Try another name.')
            sys.exit(-1)

    if not options.password:
        password = getpass('Please enter new password for %s: ' % name)
    else:
        password = options.password

    user = ircdb.users.getUser(name)
    user.setPassword(password)
    ircdb.users.setUser(user)
    ircdb.users.flush()
    ircdb.users.close()
    print('User %s\'s password reset!' % name)

def main():
    try:
        _main()
    except KeyboardInterrupt:
        pass

if __name__ == '__main__':
    main()

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