summaryrefslogtreecommitdiffstats
path: root/plugin.py
diff options
context:
space:
mode:
authorGeorg2021-08-31 22:59:00 +0200
committerGeorg2021-09-01 00:07:01 +0200
commitb747836374ef426079bfe3722bbc5dbba30d86a8 (patch)
tree4d277ed966ffd2aaf68e526f24845e22ef6eb2e7 /plugin.py
downloadkeycloak-b747836374ef426079bfe3722bbc5dbba30d86a8.tar.gz
keycloak-b747836374ef426079bfe3722bbc5dbba30d86a8.tar.bz2
keycloak-b747836374ef426079bfe3722bbc5dbba30d86a8.zip
Init + config values + basic registration function
Signed-off-by: Georg <georg@lysergic.dev>
Diffstat (limited to 'plugin.py')
-rw-r--r--plugin.py123
1 files changed, 123 insertions, 0 deletions
diff --git a/plugin.py b/plugin.py
new file mode 100644
index 0000000..0ca7894
--- /dev/null
+++ b/plugin.py
@@ -0,0 +1,123 @@
+###
+# 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 re
+import requests
+import secrets
+import string
+from supybot import utils, plugins, ircutils, callbacks
+from supybot.commands import *
+from supybot.ircmsgs import nick
+try:
+ from supybot.i18n import PluginInternationalization
+ _ = PluginInternationalization('Keycloak')
+except ImportError:
+ # Placeholder that allows to run the plugin on a bot
+ # without the i18n module
+ _ = lambda x: x
+
+
+class Keycloak(callbacks.Plugin):
+ """Interfaces with Keycloak SSO."""
+ threaded = True
+
+ def register(self, irc, msg, args, email):
+ """<email>
+ registers an account with your username and the specified email address"""
+
+ server = self.registryValue('backend.server')
+ realm = self.registryValue('backend.realm')
+ tokenurl = self.registryValue('backend.token')
+ usererr = self.registryValue('replies.error')
+
+ try:
+ tokendl = requests.get(tokenurl)
+ tokendata = tokendl.json()
+ token = tokendata['access_token']
+ url = server + '/auth/admin/realms/' + realm + '/users'
+ if re.match(r"[^@]+@[^@]+\.[^@]+", email):
+ payload = {
+ "firstName": "Foo",
+ "lastName": "Bar",
+ "email": email,
+ "enabled": "true",
+ "username": msg.nick,
+ "credentials": [{"type": "password", "value": "test123", "temporary": "true"}]
+ }
+ response = requests.post(
+ url,
+ headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token},
+ json = payload
+ )
+ print("Keycloak: HTTP Status ", response.status_code)
+ if response.text:
+ print("Keycloak: Response Text: ", response.text)
+ print("Keycloak: Response JSON: ", response.json())
+ status = response.status_code
+ #To-Do: figure out why this needs to bere instead of being fed from the usererr config variable defined above
+ #usererr = irc.error("Something went wrong. Please contact an administrator.")
+ if status == 201:
+ print(" SSO User " + msg.nick + " created.")
+ irc.reply("OK, please log in and change your password NOW.")
+ if status == 400:
+ print("ERROR: Keycloak indicated that the request is invalid.")
+ irc.error(usererr)
+ if status == 401:
+ print("ERROR: Fix your Keycloak API credentials and/or client roles, doh.")
+ irc.error(usererr)
+ if status == 403:
+ print("ERROR: Keycloak indicated that the authorization provided is not enough to access the resource.")
+ irc.error(usererr)
+ if status == 404:
+ print("ERROR: Keycloak indicated that the requested resource does not exist.")
+ irc.error(usererr)
+ if status == 409:
+ print("ERROR: Keycloak indicated that the resource already exists or \"some other coonflict when processing the request\" occured.")
+ irc.reply("Your username seems to already be registerd.")
+ if status == 415:
+ print("ERROR: Keycloak indicated that the requested media type is not supported.")
+ irc.error(usererr)
+ if status == 500:
+ print("ERROR: Keycloak indicated that the server could not fullfill the request due to \"some unexpected error \".")
+ irc.error(usererr)
+ else:
+ irc.error("Is that a valid email address?")
+ except:
+ print("ERROR: Keycloak token could not be installed.")
+ irc.error(usererr)
+
+ register = wrap(register, ['anything'])
+
+
+
+Class = Keycloak
+
+
+# vim:set shiftwidth=4 softtabstop=4 expandtab textwidth=79: