Check searchableBy on posts when performing search

main
Bob Mottram 2024-10-12 18:09:26 +01:00
parent aa6e483bd8
commit 53545813e5
4 changed files with 67 additions and 20 deletions

View File

@ -17,7 +17,6 @@ from utils import has_object_string_type
from utils import remove_domain_port
from utils import has_users_path
from utils import get_full_domain
from utils import get_followers_list
from utils import valid_nickname
from utils import domain_permitted
from utils import get_domain_from_actor
@ -213,22 +212,6 @@ def is_following_actor(base_dir: str,
return False
def get_mutuals_of_person(base_dir: str,
nickname: str, domain: str) -> []:
"""Returns the mutuals of a person
i.e. accounts which they follow and which also follow back
"""
followers = \
get_followers_list(base_dir, nickname, domain, 'followers.txt')
following = \
get_followers_list(base_dir, nickname, domain, 'following.txt')
mutuals = []
for handle in following:
if handle in followers:
mutuals.append(handle)
return mutuals
def add_follower_of_person(base_dir: str, nickname: str, domain: str,
follower_nickname: str, follower_domain: str,
federation_list: [], debug: bool,

View File

@ -5878,7 +5878,6 @@ def _test_functions():
'thread_send_post',
'send_to_followers',
'expire_cache',
'get_mutuals_of_person',
'run_posts_queue',
'run_shares_expire',
'run_posts_watchdog',

View File

@ -3015,6 +3015,22 @@ def _search_virtual_box_posts(base_dir: str, nickname: str, domain: str,
return res
def _get_mutuals_of_person(base_dir: str,
nickname: str, domain: str) -> []:
"""Returns the mutuals of a person
i.e. accounts which they follow and which also follow back
"""
followers = \
get_followers_list(base_dir, nickname, domain, 'followers.txt')
following = \
get_followers_list(base_dir, nickname, domain, 'following.txt')
mutuals = []
for handle in following:
if handle in followers:
mutuals.append(handle)
return mutuals
def search_box_posts(base_dir: str, nickname: str, domain: str,
search_str: str, max_results: int,
box_name='outbox') -> []:
@ -3038,22 +3054,67 @@ def search_box_posts(base_dir: str, nickname: str, domain: str,
else:
search_words = [search_str]
mutuals_list = []
check_searchable_by = False
if box_name == 'inbox':
check_searchable_by = True
# create a string containing all of the mutuals
mutuals_list = _get_mutuals_of_person(base_dir, nickname, domain)
res = []
for root, _, fnames in os.walk(path):
for fname in fnames:
file_path = os.path.join(root, fname)
try:
with open(file_path, 'r', encoding='utf-8') as fp_post:
data = fp_post.read().lower()
data = fp_post.read()
data_lower = data.lower()
not_found = False
for keyword in search_words:
if keyword not in data:
if keyword not in data_lower:
not_found = True
break
if not_found:
continue
# if this is not an outbox/bookmarks search then is the
# post marked as being searchable?
if check_searchable_by:
if '"searchableBy":' not in data:
continue
searchable_by = \
data.split('"searchableBy":')[1].strip()
if searchable_by.startswith('['):
searchable_by = searchable_by.split(']')[0]
if '"' in searchable_by:
searchable_by = searchable_by.split('"')[1]
else:
continue
if '#Public' not in searchable_by and \
'/followers' not in searchable_by:
if '/mutuals' in searchable_by and mutuals_list:
data_actor = \
searchable_by.split('/mutuals')[0]
if '"' in data_actor:
data_actor = data_actor.split('"')[-1]
if data_actor not in mutuals_list:
data_nickname = \
get_nickname_from_actor(data_actor)
data_domain, data_port = \
get_domain_from_actor(data_actor)
if not data_nickname or \
not data_domain:
continue
data_domain_full = \
get_full_domain(data_domain, data_port)
data_handle = \
data_nickname + '@' + data_domain_full
if data_handle not in mutuals_list:
continue
else:
continue
res.append(file_path)
if len(res) >= max_results:
return res

View File

@ -730,6 +730,10 @@ def html_history_search(translate: {}, base_dir: str,
box_filenames = \
search_box_posts(base_dir, nickname, domain,
historysearch, posts_per_page, box_name)
if box_name == 'outbox':
box_filenames += \
search_box_posts(base_dir, nickname, domain,
historysearch, posts_per_page, 'inbox')
css_filename = base_dir + '/epicyon-profile.css'
if os.path.isfile(base_dir + '/epicyon.css'):