diff --git a/hive/indexer/follow.py b/hive/indexer/follow.py index 1dcc90cf6ab82e38770b39095d1eabb11866f096..3cfa5f5b5d5ca90fe85dd25b5efaea1cd66b0eb3 100644 --- a/hive/indexer/follow.py +++ b/hive/indexer/follow.py @@ -2,6 +2,7 @@ import logging from time import perf_counter as perf +from json import dumps from funcy.seqs import first from hive.db.adapter import Db @@ -12,6 +13,7 @@ from hive.indexer.accounts import Accounts from hive.indexer.db_adapter_holder import DbAdapterHolder from hive.utils.normalize import escape_characters + log = logging.getLogger(__name__) FOLLOWERS = 'followers' @@ -100,7 +102,20 @@ class Follow(DbAdapterHolder): return None op['following'] = op['following'] if isinstance(op['following'], list) else [op['following']] + + # additional layer of protection against putting complex data types as user names + as_str = [] + for following in op['following']: + if isinstance(following, list) or isinstance(following, dict): + as_str.append(dumps(following)) + else: + as_str.append(str(following)) + op['following'] = as_str + if isinstance(op['follower'], list) or isinstance(op['follower'], dict): + op['follower'] = dumps(op['follower']) + else: + op['follower'] = str(op['follower']) # follower/following is empty if not op['follower'] or not op['following']: diff --git a/mock_data/block_data/follow_op/mock_block_data_follow.json b/mock_data/block_data/follow_op/mock_block_data_follow.json index fd6cb77fc7d31c7cd55775cc7467550dd6429ca8..e0089d8a89030b9f22721ff85ae7546709a2e4d6 100644 --- a/mock_data/block_data/follow_op/mock_block_data_follow.json +++ b/mock_data/block_data/follow_op/mock_block_data_follow.json @@ -365,6 +365,72 @@ "id": "follow", "json": "[\"follow\",{\"follower\":\"te'%@ter1\",\"following\":[\"tester3\", \"tester4\"],\"what\":[\"blog\"]}]" } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "{\"tester1\":\"tester1\"}" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":{\"tester1\":\"tester1\"},\"following\":{\"tester3\":\"tester4\"},\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "tester1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"tester1\",\"following\":{\"tester3\":\"tester4\"},\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "tester1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"tester1\",\"following\":[\"tester3\", [\"tester4\"]],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "tester1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":[\"tester1\"],\"following\":[\"tester3\", [\"tester4\"]],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "[\"tester1\"]" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":[\"tester1\"],\"following\":[\"tester3\", {\"tester4\":\"tester5\"}],\"what\":[\"blog\"]}]" + } + }, + { + "type": "custom_json_operation", + "value": { + "required_auths": [], + "required_posting_auths": [ + "tester1" + ], + "id": "follow", + "json": "[\"follow\",{\"follower\":\"tester1\",\"following\":[\"tester3\", {\"tester4\":\"tester5\"}],\"what\":[\"blog\"]}]" + } } ] }