ircbot: tie bot users to django auth user, part 3

get rid of is_admin(), instead check for django permissions. a couple
things were using is_admin(), so now there's an example of the
permission adding and usage, as those were ported
This commit is contained in:
Brian S. Stephan 2015-06-20 10:08:51 -05:00
parent df17e68456
commit 772df777ba
8 changed files with 93 additions and 17 deletions

View File

@ -558,8 +558,9 @@ class IRCBot(irc.client.SimpleIRCClient):
def handle_load(self, connection, event, match):
"""Handle IRC requests to load a plugin."""
log.debug(u"is admin?: %s", str(ircbotlib.is_admin(event.source)))
if ircbotlib.is_admin(event.source):
has_perm = ircbotlib.has_permission(event.source, 'ircbot.manage_loaded_plugins')
log.debug(u"has permission to load?: %s", str(has_perm))
if has_perm:
plugin_path = match.group(1)
log.debug(u"calling _load_plugin on %s", plugin_path)
self._load_plugin(connection, event, plugin_path)
@ -611,8 +612,9 @@ class IRCBot(irc.client.SimpleIRCClient):
def handle_unload(self, connection, event, match):
"""Handle IRC requests to unload a plugin."""
log.debug(u"is admin?: %s", str(ircbotlib.is_admin(event.source)))
if ircbotlib.is_admin(event.source):
has_perm = ircbotlib.has_permission(event.source, 'ircbot.manage_loaded_plugins')
log.debug(u"has permission to unload?: %s", str(has_perm))
if has_perm:
plugin_path = match.group(1)
log.debug(u"calling _unload_plugin on %s", plugin_path)
self._unload_plugin(connection, event, plugin_path)

View File

@ -1,6 +1,6 @@
import logging
from ircbot.lib import Plugin, is_admin
from ircbot.lib import Plugin, has_permission
from ircbot.models import IrcChannel
@ -35,7 +35,7 @@ class ChannelManagement(Plugin):
def handle_join(self, connection, event, match):
"""Handle the join command."""
if is_admin(event.source):
if has_permission(event.source, 'ircbot.manage_current_channels'):
channel = match.group(1)
# put it in the database if it isn't already
chan_mod, c = IrcChannel.objects.get_or_create(name=channel)
@ -47,7 +47,7 @@ class ChannelManagement(Plugin):
def handle_part(self, connection, event, match):
"""Handle the join command."""
if is_admin(event.source):
if has_permission(event.source, 'ircbot.manage_current_channels'):
channel = match.group(1)
# put it in the database if it isn't already
chan_mod, c = IrcChannel.objects.get_or_create(name=channel)
@ -59,7 +59,7 @@ class ChannelManagement(Plugin):
def handle_quit(self, connection, event, match):
"""Handle the join command."""
if is_admin(event.source):
if has_permission(event.source, 'ircbot.quit_bot'):
self.bot.die(msg=match.group(1))

View File

@ -6,6 +6,8 @@ import logging
import irc.client
from django.core.exceptions import ObjectDoesNotExist
from ircbot.models import BotUser
@ -44,7 +46,7 @@ class Plugin(object):
return text
def is_admin(source):
def has_permission(source, permission):
"""Check if the provided event source is a bot admin."""
try:
@ -54,7 +56,17 @@ def is_admin(source):
log.debug("could not find bot user for {0:s}".format(source))
return False
return True
try:
django_user = bot_user.user
if django_user.has_perm(permission):
log.debug("bot user {0:s} has requested permission {1:s}".format(bot_user, permission))
return True
except ObjectDoesNotExist:
log.error("could not find django user for bot user {0:s}".format(bot_user))
return False
log.debug("bot user {0:s} does not have requested permission {1:s}".format(bot_user, permission))
return False
def reply_destination_for_event(event):

View File

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('ircbot', '0010_auto_20150620_0930'),
]
operations = [
migrations.AlterModelOptions(
name='botuser',
options={'permissions': (('quit_bot', 'Can tell the bot to quit via IRC'),)},
),
migrations.AlterModelOptions(
name='ircchannel',
options={'permissions': (('manage_current_channels', 'Can join/part channels via IRC'),)},
),
migrations.AlterModelOptions(
name='ircplugin',
options={'ordering': ['path'], 'permissions': (('manage_loaded_plugins', 'Can load/unload plugins via IRC'),)},
),
]

View File

@ -43,6 +43,11 @@ class BotUser(models.Model):
nickmask = models.CharField(max_length=200, unique=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL)
class Meta:
permissions = (
('quit_bot', "Can tell the bot to quit via IRC"),
)
def __unicode__(self):
"""String representation."""
@ -60,6 +65,11 @@ class IrcChannel(models.Model):
topic_time = models.DateTimeField(default=timezone.now)
topic_by = models.CharField(max_length=200, default='', blank=True)
class Meta:
permissions = (
('manage_current_channels', "Can join/part channels via IRC"),
)
def __unicode__(self):
"""String representation."""
@ -75,6 +85,9 @@ class IrcPlugin(models.Model):
class Meta:
ordering = ['path']
permissions = (
('manage_loaded_plugins', "Can load/unload plugins via IRC"),
)
def __unicode__(self):
"""String representation."""

View File

@ -10,7 +10,7 @@ import twython
from django.conf import settings
from ircbot.lib import Plugin, is_admin
from ircbot.lib import Plugin, has_permission
from twitter.models import TwitterClient
@ -137,9 +137,9 @@ class Twitter(Plugin):
tweet = match.group(1)
if not self.twit.verify_credentials():
return self.bot.reply(event, "You must be authenticated to tweet.")
if not is_admin(event.source):
return self.bot.reply(event, "Only admins can tweet.")
return self.bot.reply(event, "The bot must be authenticated to tweet.")
if not has_permission(event.source, 'twitter.send_tweets'):
return self.bot.reply(event, "You do not have permission to send tweets.")
try:
if self.twit.update_status(status=tweet, display_coordinates=False) is not None:
@ -156,9 +156,9 @@ class Twitter(Plugin):
tweet = match.group(2)
if not self.twit.verify_credentials():
return self.bot.reply(event, "You must be authenticated to tweet.")
if not is_admin(event.source):
return self.bot.reply(event, "Only admins can tweet.")
return self.bot.reply(event, "The bot must be authenticated to tweet.")
if not has_permission(event.source, 'twitter.send_tweets'):
return self.bot.reply(event, "you do not have permission to send tweets.")
replyee_tweet = self.twit.show_status(id=status_id)
target = replyee_tweet['user']['screen_name'].encode('utf-8', 'ignore')

View File

@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('twitter', '0002_auto_20150616_2022'),
]
operations = [
migrations.AlterModelOptions(
name='twitterclient',
options={'permissions': (('send_tweets', 'Can send tweets via IRC'),)},
),
]

View File

@ -18,3 +18,8 @@ class TwitterClient(models.Model):
output_channel = models.CharField(max_length=200, default='', blank=True)
oauth_token = models.CharField(max_length=256, default='', blank=True)
oauth_token_secret = models.CharField(max_length=256, default='', blank=True)
class Meta:
permissions = (
('send_tweets', "Can send tweets via IRC"),
)