def reblog(cls, account, op_json, block_date): """Handle legacy 'reblog' op""" blogger = op_json['account'] author = op_json['author'] permlink = op_json['permlink'] if blogger != account: return # impersonation if not all(map(Accounts.exists, [author, blogger])): return post_id, depth = Posts.get_id_and_depth(author, permlink) if depth > 0: return # prevent comment reblogs if not post_id: log.debug("reblog: post not found: %s/%s", author, permlink) return if 'delete' in op_json and op_json['delete'] == 'delete': DB.query("DELETE FROM hive_reblogs WHERE account = :a AND " "post_id = :pid LIMIT 1", a=blogger, pid=post_id) if not DbState.is_initial_sync(): FeedCache.delete(post_id, Accounts.get_id(blogger)) else: sql = ("INSERT INTO hive_reblogs (account, post_id, created_at) " "VALUES (:a, :pid, :date) ON CONFLICT (account, post_id) DO NOTHING") DB.query(sql, a=blogger, pid=post_id, date=block_date) if not DbState.is_initial_sync(): FeedCache.insert(post_id, Accounts.get_id(blogger), block_date)
def process_json_follow_op(account, op_json, block_date): """ Process legacy 'follow' plugin ops (follow/mute/clear, reblog) """ if type(op_json) != list: return if len(op_json) != 2: return if first(op_json) not in ['follow', 'reblog']: return if not isinstance(second(op_json), dict): return cmd, op_json = op_json # ['follow', {data...}] if cmd == 'follow': if type(op_json['what']) != list: return what = first(op_json['what']) or 'clear' if what not in ['blog', 'clear', 'ignore']: return if not all([key in op_json for key in ['follower', 'following']]): print("bad follow op: {} {}".format(block_date, op_json)) return follower = op_json['follower'] following = op_json['following'] if follower != account: return # impersonation if not all(map(Accounts.exists, [follower, following])): return # invalid input sql = """ INSERT INTO hive_follows (follower, following, created_at, state) VALUES (:fr, :fg, :at, :state) ON DUPLICATE KEY UPDATE state = :state """ state = {'clear': 0, 'blog': 1, 'ignore': 2}[what] query(sql, fr=follower, fg=following, at=block_date, state=state) Accounts.dirty_follows(follower) Accounts.dirty_follows(following) elif cmd == 'reblog': blogger = op_json['account'] author = op_json['author'] permlink = op_json['permlink'] if blogger != account: return # impersonation if not all(map(Accounts.exists, [author, blogger])): return post_id, depth = Posts.get_id_and_depth(author, permlink) if depth > 0: return # prevent comment reblogs if not post_id: print("reblog: post not found: {}/{}".format(author, permlink)) return if 'delete' in op_json and op_json['delete'] == 'delete': query( "DELETE FROM hive_reblogs WHERE account = :a AND post_id = :pid LIMIT 1", a=blogger, pid=post_id) sql = "DELETE FROM hive_feed_cache WHERE account = :account AND post_id = :id" query(sql, account=blogger, id=post_id) else: query( "INSERT IGNORE INTO hive_reblogs (account, post_id, created_at) " "VALUES (:a, :pid, :date)", a=blogger, pid=post_id, date=block_date) sql = "INSERT IGNORE INTO hive_feed_cache (account, post_id, created_at) VALUES (:account, :id, :created_at)" query(sql, account=blogger, id=post_id, created_at=block_date)
def process_json_community_op(account, op_json, date): """Validates community op and apply state changes to db.""" #pylint: disable=line-too-long cmd_name, cmd_op = op_json # ['flagPost', {community: '', author: '', ...}] commands = list(flatten(PERMISSIONS.values())) if cmd_name not in commands: return print("community op from {} @ {} -- {}".format(account, date, op_json)) community = cmd_op['community'] community_exists = is_community(community) # special case: community creation. TODO: does this require ACTIVE auth? or POSTING will suffice? if cmd_name == 'create' and not community_exists: if account != community: # only the OWNER may create return ctype = cmd_op['type'] # restricted, open-comment, public # INSERT INTO hive_communities (account, name, about, description, lang, is_nsfw, is_private, created_at) # VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, '%s')" % [account, name, about, description, lang, is_nsfw ? 1 : 0, is_private ? 1 : 0, block_date] # INSERT ADMINS--- # validate permissions if not community_exists or not is_permitted(account, community, cmd_name): return # If command references a post, ensure it's valid post_id, depth = Posts.get_id_and_depth(cmd_op.get('author'), cmd_op.get('permlink')) if not post_id: return # If command references an account, ensure it's valid account_id = Accounts.get_id(cmd_op.get('account')) # If command references a list of accounts, ensure they are valid account_ids = list(map(Accounts.get_id, cmd_op.get('accounts'))) # ADMIN Actions # ------------- if cmd_name == 'add_admins': assert account_ids # UPDATE hive_members SET is_admin = 1 WHERE account IN (%s) AND community = '%s' if cmd_name == 'remove_admins': assert account_ids # todo: validate at least one admin remains!!! # UPDATE hive_members SET is_admin = 0 WHERE account IN (%s) AND community = '%s' if cmd_name == 'add_mods': assert account_ids # UPDATE hive_members SET is_mod = 1 WHERE account IN (%s) AND community = '%s' if cmd_name == 'remove_mods': assert account_ids # UPDATE hive_members SET is_mod = 0 WHERE account IN (%s) AND community = '%s' # MOD USER Actions # ---------------- if cmd_name == 'update_settings': # name, about, description, lang, is_nsfw # settings {bg_color, bg_color2, text_color} # UPDATE hive_communities SET .... WHERE community = '%s' assert account_id if cmd_name == 'add_posters': assert account_ids # UPDATE hive_members SET is_approved = 1 WHERE account IN (%s) AND community = '%s' if cmd_name == 'remove_posters': assert account_ids # UPDATE hive_members SET is_approved = 0 WHERE account IN (%s) AND community = '%s' if cmd_name == 'mute_user': assert account_id # UPDATE hive_members SET is_muted = 1 WHERE account = '%s' AND community = '%s' if cmd_name == 'unmute_user': assert account_id # UPDATE hive_members SET is_muted = 0 WHERE account = '%s' AND community = '%s' if cmd_name == 'set_user_title': assert account_id # UPDATE hive_members SET title = '%s' WHERE account = '%s' AND community = '%s' # MOD POST Actions # ---------------- if cmd_name == 'mute_post': assert post_id # assert all([account_id, post_id]) # UPDATE hive_posts SET is_muted = 1 WHERE community = '%s' AND author = '%s' AND permlink = '%s' if cmd_name == 'unmute_post': assert post_id # UPDATE hive_posts SET is_muted = 0 WHERE community = '%s' AND author = '%s' AND permlink = '%s' if cmd_name == 'pin_post': assert post_id # UPDATE hive_posts SET is_pinned = 1 WHERE community = '%s' AND author = '%s' AND permlink = '%s' if cmd_name == 'unpin_post': assert post_id # UPDATE hive_posts SET is_pinned = 0 WHERE community = '%s' AND author = '%s' AND permlink = '%s' # GUEST POST Actions # ------------------ if cmd_name == 'flag_post': assert post_id # INSERT INTO hive_flags (account, community, author, permlink, comment, created_at) VALUES () # track success (TODO: failures as well?) # INSERT INTO hive_modlog (account, community, action, created_at) VALUES (account, community, json.inspect, block_date) return True