Move functions

main
Bob Mottram 2020-09-25 14:21:56 +01:00
parent 6ac45978e8
commit e5eaf42a36
5 changed files with 111 additions and 109 deletions

View File

@ -25,6 +25,7 @@ from posts import archivePosts
from posts import sendPostViaServer from posts import sendPostViaServer
from posts import getPublicPostsOfPerson from posts import getPublicPostsOfPerson
from posts import getUserUrl from posts import getUserUrl
from posts import checkDomains
from session import createSession from session import createSession
from session import getJson from session import getJson
from filters import addFilter from filters import addFilter
@ -35,7 +36,6 @@ import sys
import time import time
from pprint import pprint from pprint import pprint
from daemon import runDaemon from daemon import runDaemon
from follow import checkDomains
from follow import clearFollows from follow import clearFollows
from follow import followerOfPerson from follow import followerOfPerson
from follow import sendFollowRequestViaServer from follow import sendFollowRequestViaServer
@ -555,12 +555,12 @@ if args.checkDomains:
elif args.gnunet: elif args.gnunet:
proxyType = 'gnunet' proxyType = 'gnunet'
maxBlockedDomains = 2 maxBlockedDomains = 2
# checkDomains(None, checkDomains(None,
# baseDir, nickname, domain, baseDir, nickname, domain,
# proxyType, args.port, proxyType, args.port,
# httpPrefix, debug, httpPrefix, debug,
# __version__, __version__,
# maxBlockedDomains, False) maxBlockedDomains, False)
sys.exit() sys.exit()
if args.socnet: if args.socnet:

102
follow.py
View File

@ -8,6 +8,7 @@ __status__ = "Production"
from pprint import pprint from pprint import pprint
import os import os
from utils import getFollowersOfPerson
from utils import validNickname from utils import validNickname
from utils import domainPermitted from utils import domainPermitted
from utils import getDomainFromActor from utils import getDomainFromActor
@ -25,61 +26,6 @@ from auth import createBasicAuthHeader
from session import postJson from session import postJson
def checkDomains(session, baseDir: str,
nickname: str, domain: str,
proxyType: str, port: int, httpPrefix: str,
debug: bool, projectVersion: str,
maxBlockedDomains: int, singleCheck: bool):
"""Checks follower accounts for references to globally blocked domains
"""
nonMutuals = getNonMutualsOfPerson(baseDir, nickname, domain)
if not nonMutuals:
return
followerWarningFilename = baseDir + '/accounts/followerWarnings.txt'
updateFollowerWarnings = False
followerWarningStr = ''
if os.path.isfile(followerWarningFilename):
with open(followerWarningFilename, 'r') as fp:
followerWarningStr = fp.read()
if singleCheck:
# checks a single random non-mutual
index = random.randrange(0, len(nonMutuals))
domainName = nonMutuals[index]
blockedDomains = \
getPublicPostDomainsBlocked(session, baseDir,
nickname, domain,
proxyType, port, httpPrefix,
debug, projectVersion, [])
if blockedDomains:
if len(blockedDomains) > maxBlockedDomains:
followerWarningStr += domainName + '\n'
updateFollowerWarnings = True
else:
# checks all non-mutuals
for domainName in nonMutuals:
if domainName in followerWarningStr:
continue
blockedDomains = \
getPublicPostDomainsBlocked(session, baseDir,
nickname, domain,
proxyType, port, httpPrefix,
debug, projectVersion, [])
if blockedDomains:
print(domainName)
for d in blockedDomains:
print(' ' + d)
if len(blockedDomains) > maxBlockedDomains:
followerWarningStr += domainName + '\n'
updateFollowerWarnings = True
if updateFollowerWarnings and followerWarningStr:
with open(followerWarningFilename, 'w+') as fp:
fp.write(followerWarningStr)
if not singleCheck:
print(followerWarningStr)
def preApprovedFollower(baseDir: str, def preApprovedFollower(baseDir: str,
nickname: str, domain: str, nickname: str, domain: str,
approveHandle: str) -> bool: approveHandle: str) -> bool:
@ -182,52 +128,6 @@ def getMutualsOfPerson(baseDir: str,
return mutuals return mutuals
def getNonMutualsOfPerson(baseDir: str,
nickname: str, domain: str) -> []:
"""Returns the followers who are not mutuals of a person
i.e. accounts which follow you but you don't follow them
"""
followers = \
getFollowersOfPerson(baseDir, nickname, domain, 'followers')
following = \
getFollowersOfPerson(baseDir, nickname, domain, 'following')
nonMutuals = []
for handle in following:
if handle not in followers:
nonMutuals.append(handle)
return nonMutuals
def getFollowersOfPerson(baseDir: str,
nickname: str, domain: str,
followFile='following.txt') -> []:
"""Returns a list containing the followers of the given person
Used by the shared inbox to know who to send incoming mail to
"""
followers = []
if ':' in domain:
domain = domain.split(':')[0]
handle = nickname + '@' + domain
if not os.path.isdir(baseDir + '/accounts/' + handle):
return followers
for subdir, dirs, files in os.walk(baseDir + '/accounts'):
for account in dirs:
filename = os.path.join(subdir, account) + '/' + followFile
if account == handle or account.startswith('inbox@'):
continue
if not os.path.isfile(filename):
continue
with open(filename, 'r') as followingfile:
for followingHandle in followingfile:
followingHandle2 = followingHandle.replace('\n', '')
followingHandle2 = followingHandle2.replace('\r', '')
if followingHandle2 == handle:
if account not in followers:
followers.append(account)
break
return followers
def followerOfPerson(baseDir: str, nickname: str, domain: str, def followerOfPerson(baseDir: str, nickname: str, domain: str,
followerNickname: str, followerDomain: str, followerNickname: str, followerDomain: str,
federationList: [], debug: bool) -> bool: federationList: [], debug: bool) -> bool:

View File

@ -30,6 +30,7 @@ from session import postJsonString
from session import postImage from session import postImage
from webfinger import webfingerHandle from webfinger import webfingerHandle
from httpsig import createSignedHeader from httpsig import createSignedHeader
from utils import getFollowersOfPerson
from utils import isEvil from utils import isEvil
from utils import removeIdEnding from utils import removeIdEnding
from utils import siteIsActive from utils import siteIsActive
@ -3331,6 +3332,77 @@ def getPublicPostDomainsBlocked(session, baseDir: str,
return blockedDomains return blockedDomains
def getNonMutualsOfPerson(baseDir: str,
nickname: str, domain: str) -> []:
"""Returns the followers who are not mutuals of a person
i.e. accounts which follow you but you don't follow them
"""
followers = \
getFollowersOfPerson(baseDir, nickname, domain, 'followers')
following = \
getFollowersOfPerson(baseDir, nickname, domain, 'following')
nonMutuals = []
for handle in following:
if handle not in followers:
nonMutuals.append(handle)
return nonMutuals
def checkDomains(session, baseDir: str,
nickname: str, domain: str,
proxyType: str, port: int, httpPrefix: str,
debug: bool, projectVersion: str,
maxBlockedDomains: int, singleCheck: bool):
"""Checks follower accounts for references to globally blocked domains
"""
nonMutuals = getNonMutualsOfPerson(baseDir, nickname, domain)
if not nonMutuals:
return
followerWarningFilename = baseDir + '/accounts/followerWarnings.txt'
updateFollowerWarnings = False
followerWarningStr = ''
if os.path.isfile(followerWarningFilename):
with open(followerWarningFilename, 'r') as fp:
followerWarningStr = fp.read()
if singleCheck:
# checks a single random non-mutual
index = random.randrange(0, len(nonMutuals))
domainName = nonMutuals[index]
blockedDomains = \
getPublicPostDomainsBlocked(session, baseDir,
nickname, domain,
proxyType, port, httpPrefix,
debug, projectVersion, [])
if blockedDomains:
if len(blockedDomains) > maxBlockedDomains:
followerWarningStr += domainName + '\n'
updateFollowerWarnings = True
else:
# checks all non-mutuals
for domainName in nonMutuals:
if domainName in followerWarningStr:
continue
blockedDomains = \
getPublicPostDomainsBlocked(session, baseDir,
nickname, domain,
proxyType, port, httpPrefix,
debug, projectVersion, [])
if blockedDomains:
print(domainName)
for d in blockedDomains:
print(' ' + d)
if len(blockedDomains) > maxBlockedDomains:
followerWarningStr += domainName + '\n'
updateFollowerWarnings = True
if updateFollowerWarnings and followerWarningStr:
with open(followerWarningFilename, 'w+') as fp:
fp.write(followerWarningStr)
if not singleCheck:
print(followerWarningStr)
def sendCapabilitiesUpdate(session, baseDir: str, httpPrefix: str, def sendCapabilitiesUpdate(session, baseDir: str, httpPrefix: str,
nickname: str, domain: str, port: int, nickname: str, domain: str, port: int,
followerUrl, updateCaps: [], followerUrl, updateCaps: [],

View File

@ -42,10 +42,10 @@ from utils import copytree
from utils import loadJson from utils import loadJson
from utils import saveJson from utils import saveJson
from utils import getStatusNumber from utils import getStatusNumber
from utils import getFollowersOfPerson
from follow import followerOfPerson from follow import followerOfPerson
from follow import unfollowPerson from follow import unfollowPerson
from follow import unfollowerOfPerson from follow import unfollowerOfPerson
from follow import getFollowersOfPerson
from follow import sendFollowRequest from follow import sendFollowRequest
from person import createPerson from person import createPerson
from person import setDisplayNickname from person import setDisplayNickname

View File

@ -19,6 +19,36 @@ from calendar import monthrange
from followingCalendar import addPersonToCalendar from followingCalendar import addPersonToCalendar
def getFollowersOfPerson(baseDir: str,
nickname: str, domain: str,
followFile='following.txt') -> []:
"""Returns a list containing the followers of the given person
Used by the shared inbox to know who to send incoming mail to
"""
followers = []
if ':' in domain:
domain = domain.split(':')[0]
handle = nickname + '@' + domain
if not os.path.isdir(baseDir + '/accounts/' + handle):
return followers
for subdir, dirs, files in os.walk(baseDir + '/accounts'):
for account in dirs:
filename = os.path.join(subdir, account) + '/' + followFile
if account == handle or account.startswith('inbox@'):
continue
if not os.path.isfile(filename):
continue
with open(filename, 'r') as followingfile:
for followingHandle in followingfile:
followingHandle2 = followingHandle.replace('\n', '')
followingHandle2 = followingHandle2.replace('\r', '')
if followingHandle2 == handle:
if account not in followers:
followers.append(account)
break
return followers
def removeIdEnding(idStr: str) -> str: def removeIdEnding(idStr: str) -> str:
"""Removes endings such as /activity and /undo """Removes endings such as /activity and /undo
""" """