mirror of
https://github.com/zulip/zulip.git
synced 2025-11-03 13:33:24 +00:00
Move API super users configuration into the database.
(imported from commit 3cc702f93e7252b42930dba4bde93a915b6dbf44)
This commit is contained in:
@@ -1462,16 +1462,17 @@ def do_change_default_all_public_streams(user_profile, value, log=True):
|
|||||||
default_all_public_streams=user_profile.default_all_public_streams,)),
|
default_all_public_streams=user_profile.default_all_public_streams,)),
|
||||||
bot_owner_userids(user_profile))
|
bot_owner_userids(user_profile))
|
||||||
|
|
||||||
def do_change_is_admin(user_profile, is_admin):
|
def do_change_is_admin(user_profile, is_admin, permission='administer'):
|
||||||
if is_admin:
|
if is_admin:
|
||||||
assign_perm('administer', user_profile, user_profile.realm)
|
assign_perm(permission, user_profile, user_profile.realm)
|
||||||
else:
|
else:
|
||||||
remove_perm('administer', user_profile, user_profile.realm)
|
remove_perm(permission, user_profile, user_profile.realm)
|
||||||
|
|
||||||
event = dict(type="realm_user", op="update",
|
if permission == 'administer':
|
||||||
person=dict(email=user_profile.email,
|
event = dict(type="realm_user", op="update",
|
||||||
is_admin=is_admin))
|
person=dict(email=user_profile.email,
|
||||||
send_event(event, active_user_ids(user_profile.realm))
|
is_admin=is_admin))
|
||||||
|
send_event(event, active_user_ids(user_profile.realm))
|
||||||
|
|
||||||
def do_make_stream_public(user_profile, realm, stream_name):
|
def do_make_stream_public(user_profile, realm, stream_name):
|
||||||
stream_name = stream_name.strip()
|
stream_name = stream_name.strip()
|
||||||
|
|||||||
@@ -24,6 +24,11 @@ ONLY perform this on customer request from an authorized person.
|
|||||||
action="store_false",
|
action="store_false",
|
||||||
default=True,
|
default=True,
|
||||||
help='Remove an administrator\'s rights.')
|
help='Remove an administrator\'s rights.')
|
||||||
|
parser.add_argument('--permission',
|
||||||
|
dest='permission',
|
||||||
|
action="store",
|
||||||
|
default='administer',
|
||||||
|
help='Permission to grant/remove.')
|
||||||
parser.add_argument('email', metavar='<email>', type=str,
|
parser.add_argument('email', metavar='<email>', type=str,
|
||||||
help="email of user to knight")
|
help="email of user to knight")
|
||||||
|
|
||||||
@@ -35,21 +40,21 @@ ONLY perform this on customer request from an authorized person.
|
|||||||
raise CommandError("No such user.")
|
raise CommandError("No such user.")
|
||||||
|
|
||||||
if options['grant']:
|
if options['grant']:
|
||||||
if profile.has_perm('administer', profile.realm):
|
if profile.has_perm(options['permission'], profile.realm):
|
||||||
raise CommandError("User already has permission for this realm.")
|
raise CommandError("User already has permission for this realm.")
|
||||||
else:
|
else:
|
||||||
if options['ack']:
|
if options['ack']:
|
||||||
do_change_is_admin(profile, True)
|
do_change_is_admin(profile, True, permission=options['permission'])
|
||||||
print "Done!"
|
print "Done!"
|
||||||
else:
|
else:
|
||||||
print "Would have made %s an administrator for %s" % (email, profile.realm.domain)
|
print "Would have granted %s %s rights for %s" % (email, options['permission'], profile.realm.domain)
|
||||||
else:
|
else:
|
||||||
if profile.has_perm('administer', profile.realm):
|
if profile.has_perm(options['permission'], profile.realm):
|
||||||
if options['ack']:
|
if options['ack']:
|
||||||
do_change_is_admin(profile, False)
|
do_change_is_admin(profile, False, permission=options['permission'])
|
||||||
print "Done!"
|
print "Done!"
|
||||||
else:
|
else:
|
||||||
print "Would have removed %s's administrator rights on %s" % (email,
|
print "Would have removed %s's %s rights on %s" % (email, options['permission'],
|
||||||
profile.realm.domain)
|
profile.realm.domain)
|
||||||
else:
|
else:
|
||||||
raise CommandError("User did not have permission for this realm!")
|
raise CommandError("User did not have permission for this realm!")
|
||||||
|
|||||||
18
zerver/migrations/0005_auto_20150920_1340.py
Normal file
18
zerver/migrations/0005_auto_20150920_1340.py
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('zerver', '0004_userprofile_left_side_userlist'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='realm',
|
||||||
|
options={'permissions': (('administer', 'Administer a realm'), ('api_super_user', 'Can send messages as other users for mirroring'))},
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -34,8 +34,8 @@ bugdown = None
|
|||||||
MAX_SUBJECT_LENGTH = 60
|
MAX_SUBJECT_LENGTH = 60
|
||||||
MAX_MESSAGE_LENGTH = 10000
|
MAX_MESSAGE_LENGTH = 10000
|
||||||
|
|
||||||
def is_super_user(user):
|
def is_super_user(user_profile):
|
||||||
return user.email in settings.API_SUPER_USERS
|
return user_profile.is_api_super_user()
|
||||||
|
|
||||||
def is_super_user_api(request):
|
def is_super_user_api(request):
|
||||||
return request.user.is_authenticated() and is_super_user(request.user)
|
return request.user.is_authenticated() and is_super_user(request.user)
|
||||||
@@ -158,6 +158,7 @@ class Realm(models.Model):
|
|||||||
class Meta:
|
class Meta:
|
||||||
permissions = (
|
permissions = (
|
||||||
('administer', "Administer a realm"),
|
('administer', "Administer a realm"),
|
||||||
|
('api_super_user', "Can send messages as other users for mirroring"),
|
||||||
)
|
)
|
||||||
|
|
||||||
post_save.connect(flush_realm, sender=Realm)
|
post_save.connect(flush_realm, sender=Realm)
|
||||||
@@ -385,6 +386,11 @@ class UserProfile(AbstractBaseUser, PermissionsMixin):
|
|||||||
def is_admin(self):
|
def is_admin(self):
|
||||||
return self.has_perm('administer', self.realm)
|
return self.has_perm('administer', self.realm)
|
||||||
|
|
||||||
|
def is_api_super_user(self):
|
||||||
|
# TODO: Remove API_SUPER_USERS hack; fixing this will require
|
||||||
|
# setting the email bot as a super user in the provision process.
|
||||||
|
return self.has_perm('api_super_user', self.realm) or self.email in settings.API_SUPER_USERS
|
||||||
|
|
||||||
def last_reminder_tzaware(self):
|
def last_reminder_tzaware(self):
|
||||||
if self.last_reminder is not None and timezone.is_naive(self.last_reminder):
|
if self.last_reminder is not None and timezone.is_naive(self.last_reminder):
|
||||||
logging.warning("Loaded a user_profile.last_reminder for user %s that's not tz-aware: %s"
|
logging.warning("Loaded a user_profile.last_reminder for user %s that's not tz-aware: %s"
|
||||||
|
|||||||
@@ -443,6 +443,33 @@ class StreamMessagesTest(AuthedTestCase):
|
|||||||
message = most_recent_message(user_profile)
|
message = most_recent_message(user_profile)
|
||||||
assert(UserMessage.objects.get(user_profile=user_profile, message=message).flags.mentioned.is_set)
|
assert(UserMessage.objects.get(user_profile=user_profile, message=message).flags.mentioned.is_set)
|
||||||
|
|
||||||
|
def test_stream_message_mirroring(self):
|
||||||
|
from zerver.lib.actions import do_change_is_admin
|
||||||
|
user_profile = get_user_profile_by_email("iago@zulip.com")
|
||||||
|
|
||||||
|
do_change_is_admin(user_profile, True, 'api_super_user')
|
||||||
|
result = self.client.post("/api/v1/send_message", {"type": "stream",
|
||||||
|
"to": "Verona",
|
||||||
|
"sender": "cordelia@zulip.com",
|
||||||
|
"client": "test suite",
|
||||||
|
"subject": "announcement",
|
||||||
|
"content": "Everyone knows Iago rules",
|
||||||
|
"forged": "true",
|
||||||
|
"email": user_profile.email,
|
||||||
|
"api-key": user_profile.api_key})
|
||||||
|
self.assert_json_success(result)
|
||||||
|
do_change_is_admin(user_profile, False, 'api_super_user')
|
||||||
|
result = self.client.post("/api/v1/send_message", {"type": "stream",
|
||||||
|
"to": "Verona",
|
||||||
|
"sender": "cordelia@zulip.com",
|
||||||
|
"client": "test suite",
|
||||||
|
"subject": "announcement",
|
||||||
|
"content": "Everyone knows Iago rules",
|
||||||
|
"forged": "true",
|
||||||
|
"email": user_profile.email,
|
||||||
|
"api-key": user_profile.api_key})
|
||||||
|
self.assert_json_error(result, "User not authorized for this query")
|
||||||
|
|
||||||
@slow(0.28, 'checks all users')
|
@slow(0.28, 'checks all users')
|
||||||
def test_message_to_stream(self):
|
def test_message_to_stream(self):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -111,14 +111,6 @@ NAGIOS_STAGING_RECEIVE_BOT = 'cordelia@zulip.com'
|
|||||||
# Also used for support email in emails templates
|
# Also used for support email in emails templates
|
||||||
ZULIP_ADMINISTRATOR = 'support@zulip.com'
|
ZULIP_ADMINISTRATOR = 'support@zulip.com'
|
||||||
|
|
||||||
# TODO: Store this info in the database
|
|
||||||
# Also note -- the email gateway bot is automatically added.
|
|
||||||
API_SUPER_USERS = set(["tabbott/extra@mit.edu",
|
|
||||||
"irc-bot@zulip.com",
|
|
||||||
"bot1@customer35.invalid",
|
|
||||||
"bot1@customer36.invalid",
|
|
||||||
"hipchat-bot@zulip.com",])
|
|
||||||
|
|
||||||
ADMINS = (
|
ADMINS = (
|
||||||
('Zulip Error Reports', 'errors@zulip.com'),
|
('Zulip Error Reports', 'errors@zulip.com'),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user