def build_realm_emoji(realm_id: int, name: str, id: int, file_name: str) -> ZerverFieldsT: return model_to_dict( RealmEmoji( realm_id=realm_id, name=name, id=id, file_name=file_name, ), )
def build_realmemoji( custom_emoji_list: ZerverFieldsT, realm_id: int ) -> Tuple[List[ZerverFieldsT], ZerverFieldsT]: zerver_realmemoji = [] emoji_url_map = {} emoji_id = 0 for emoji_name, url in custom_emoji_list.items(): if "emoji.slack-edge.com" in url: # Some of the emojis we get from the API have invalid links # this is to prevent errors related to them realmemoji = RealmEmoji( name=emoji_name, id=emoji_id, file_name=os.path.basename(url), deactivated=False ) realmemoji_dict = model_to_dict(realmemoji, exclude=["realm", "author"]) realmemoji_dict["author"] = None realmemoji_dict["realm"] = realm_id emoji_url_map[emoji_name] = url zerver_realmemoji.append(realmemoji_dict) emoji_id += 1 return zerver_realmemoji, emoji_url_map
def check_add_realm_emoji(realm: Realm, name: str, author: UserProfile, image_file: IO[bytes]) -> RealmEmoji: try: realm_emoji = RealmEmoji(realm=realm, name=name, author=author) realm_emoji.full_clean() realm_emoji.save() except django.db.utils.IntegrityError: # Match the string in upload_emoji. raise JsonableError(_("A custom emoji with this name already exists.")) emoji_file_name = get_emoji_file_name(image_file.name, realm_emoji.id) # The only user-controlled portion of 'emoji_file_name' is an extension, # which can not contain '..' or '/' or '\', making it difficult to exploit emoji_file_name = mark_sanitized(emoji_file_name) emoji_uploaded_successfully = False is_animated = False try: is_animated = upload_emoji_image(image_file, emoji_file_name, author) emoji_uploaded_successfully = True finally: if not emoji_uploaded_successfully: realm_emoji.delete() realm_emoji.file_name = emoji_file_name realm_emoji.is_animated = is_animated realm_emoji.save(update_fields=["file_name", "is_animated"]) notify_realm_emoji(realm_emoji.realm) return realm_emoji