### # Copyright (c) 2021, Georg Pfuetzenreuter # 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 requests import secrets import string from supybot import utils, plugins, ircutils, callbacks, ircdb from supybot.commands import * try: from supybot.i18n import PluginInternationalization _ = PluginInternationalization('Mailcow') except ImportError: # Placeholder that allows to run the plugin on a bot # without the i18n module _ = lambda x: x server = 'https://zz0.email' api = '/api/v1' get = api + '/get' api_key = "" capability = ircdb.checkCapability(hostmask='cranberry!~u@cranberry.juice', capability='owner', ignoreDefaultAllow=True) class Mailcow(callbacks.Plugin): """Mailcow API through IRC""" pass def maildomain(self, irc, msg, args, variant, id): """ i.e. 'get liberta.casa' will print infos about the respective MX zone""" if 'summary' in variant: URL = server + get + '/domain/' + id response = requests.get( URL, headers = {'accept': 'application/json', 'X-API-Key': api_key}, ) data = response.json() domain = data['domain_name'] description = data['description'] bytes_total = data['bytes_total'] irc.reply(f"Domain: {domain} | Description: {description} | Bytes Total: {bytes_total} " + str(capability)) elif 'create' in variant: URL = server + api + '/add/domain' #domain = id['domain'] payload = { "active": "1", "aliases": "20", "backupmx": "0", "defquota": "1024", "description": id, "domain": id, "mailboxes": "10", "maxquota": "2048", "quota": "5120", "relay_all_recipients": "0", "rl_frame": "s", "rl_value": "10", "restart_sogo": "10" } response = requests.post( URL, headers = {'accept': 'application/json', 'X-API-Key': api_key, 'Content-Type': 'application/json'}, json = payload, ) data = response.json() print(data) status = data[0]['type'] #object = data[0]['domain'] #active = data[0]['active'] msg = data[0]['msg'] #max_aliases = data['aliases'] #max_mailboxes = data['mailboxes'] #default_quota = data['defquota'] #max_mailbox_quota = data['maxquota'] #max_domain_quota = data['quota'] irc.reply(f"CREATION: {status} | {msg} | NOTE: SOGo is NOT being restarted automatically.")# Issue 'sogo restart' to make the object visible through Groupware. | Summary of object properties: MaxAliases: {aliases} | MaxMailboxes: {mailboxes} | DefaultQuota: {default_quota} | MaxMailBoxQuota: {max_mailbox_quota} | MaxDomainQuota: {max_domain_quota}") elif 'delete' in variant: URL = server + api + '/delete/domain' payload = [ id ] response = requests.post( URL, headers = {'accept': 'application/json', 'X-API-Key': api_key, 'Content-Type': 'application/json'}, json = payload, ) data = response.json() status = data[0]['type'] object = data[0]['msg'] irc.reply(f"DELETION: {status} - {msg} - Hey, where's that backup again?") else: irc.reply("Unknown option.") maildomain = wrap(maildomain, ['anything', 'anything']) def mailbox(self, irc, msg, args, variant, id): """ Modifies Mailboxes.""" if 'summary' in variant: URL = server + get + '/mailbox/' + id response = requests.get( URL, params={'q': 'requests'}, headers={'accept': 'application/json', 'X-API-Key': api_key}, ) data = response.json() #return(print(data)) irc.reply('Username: ' + data['username'] + ' | Quota: ' + str(data['quota']) + ' | Messages: ' + str(data['messages']) + ' | Mail Active: ' + str(data['active']) + ' | XMPP Active: ' + str(data['domain_xmpp'])) elif 'create' in variant: URL = server + api + '/add/mailbox/' + id user = id.split('@')[0] domain = id.split('@')[1] random = secrets.token_urlsafe(64) payload = { "active": "1", "domain": domain, "local_part": user, "name": user + '@' + domain, "password": random, "password2": random, "quota": "512", "force_pw_update": "1", "tls_enforce_in": "1", "tls_enforce_out": "1" } response = requests.post( URL, headers = {'accept': 'application/json', 'X-API-Key': api_key, 'Content-Type': 'application/json'}, json = payload, ) data = response.json() status = data[0]['type'] msg = data[0]['msg'] irc.reply(f"CREATION: {status} | {msg} | " + str(random) + server) elif 'delete' in variant: URL = server + api + '/delete/mailbox/' + id payload = [ id ] response = requests.post( URL, headers = {'accept': 'application/json', 'X-API-Key': api_key, 'Content-Type': 'application/json'}, json = payload, ) data = response.json() status = data[0]['type'] object = data[0]['msg'] irc.reply(f"DELETION: {status} - {msg}") else: irc.reply('Unknown function.') mailbox = wrap(mailbox, ['anything', 'anything']) Class = Mailcow # vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: