Unfollowing from web interface

master
Bob Mottram 2019-07-29 21:36:26 +01:00
parent 4bdd930454
commit cdba45bd68
3 changed files with 89 additions and 3 deletions

View File

@ -66,6 +66,7 @@ from webinterface import htmlLogin
from webinterface import htmlGetLoginCredentials from webinterface import htmlGetLoginCredentials
from webinterface import htmlNewPost from webinterface import htmlNewPost
from webinterface import htmlFollowConfirm from webinterface import htmlFollowConfirm
from webinterface import htmlUnfollowConfirm
from shares import getSharesFeedForPerson from shares import getSharesFeedForPerson
from shares import outboxShareUpload from shares import outboxShareUpload
from shares import outboxUndoShareUpload from shares import outboxUndoShareUpload
@ -594,6 +595,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.GETbusy=False self.server.GETbusy=False
return return
# follow a person from the web interface by selecting Follow on the dropdown
if '/users/' in self.path: if '/users/' in self.path:
if '?follow=' in self.path: if '?follow=' in self.path:
followStr=self.path.split('?follow=')[1] followStr=self.path.split('?follow=')[1]
@ -601,6 +603,7 @@ class PubServer(BaseHTTPRequestHandler):
if ';' in followStr: if ';' in followStr:
followActor=followStr.split(';')[0] followActor=followStr.split(';')[0]
followProfileUrl=followStr.split(';')[1] followProfileUrl=followStr.split(';')[1]
# show the confirm follow screen
self._set_headers('text/html',cookie) self._set_headers('text/html',cookie)
self.wfile.write(htmlFollowConfirm(self.server.baseDir,originPathStr,followActor,followProfileUrl).encode()) self.wfile.write(htmlFollowConfirm(self.server.baseDir,originPathStr,followActor,followProfileUrl).encode())
self.server.GETbusy=False self.server.GETbusy=False
@ -608,6 +611,23 @@ class PubServer(BaseHTTPRequestHandler):
self._redirect_headers(originPathStr,cookie) self._redirect_headers(originPathStr,cookie)
self.server.GETbusy=False self.server.GETbusy=False
return return
# Unfollow a person from the web interface by selecting Unfollow on the dropdown
if '/users/' in self.path:
if '?unfollow=' in self.path:
followStr=self.path.split('?unfollow=')[1]
originPathStr=self.path.split('?unfollow=')[0]
if ';' in followStr:
followActor=followStr.split(';')[0]
followProfileUrl=followStr.split(';')[1]
# show the confirm follow screen
self._set_headers('text/html',cookie)
self.wfile.write(htmlUnfollowConfirm(self.server.baseDir,originPathStr,followActor,followProfileUrl).encode())
self.server.GETbusy=False
return
self._redirect_headers(originPathStr,cookie)
self.server.GETbusy=False
return
if '/users/' in self.path and \ if '/users/' in self.path and \
(self.path.endswith('/newpost') or \ (self.path.endswith('/newpost') or \
@ -1440,7 +1460,7 @@ class PubServer(BaseHTTPRequestHandler):
self.server.POSTbusy=False self.server.POSTbusy=False
# decision to follow in the web interface is confirmed # decision to follow in the web interface is confirmed
if authorized and self.path.endswith('/followconfirm'): if authorized and self.path.endswith('/followconfirm'):
originPathStr=self.path.split('/followconfirm')[0] originPathStr=self.path.split('/followconfirm')[0]
followerNickname=getNicknameFromActor(originPathStr) followerNickname=getNicknameFromActor(originPathStr)
length = int(self.headers['Content-length']) length = int(self.headers['Content-length'])
@ -1473,8 +1493,43 @@ class PubServer(BaseHTTPRequestHandler):
self.server.cachedWebfingers, \ self.server.cachedWebfingers, \
self.server.personCache, \ self.server.personCache, \
self.server.debug) self.server.debug)
else: self._redirect_headers(originPathStr,cookie)
print('Follow no') self.server.POSTbusy=False
return
# decision to unfollow in the web interface is confirmed
if authorized and self.path.endswith('/unfollowconfirm'):
originPathStr=self.path.split('/unfollowconfirm')[0]
followerNickname=getNicknameFromActor(originPathStr)
length = int(self.headers['Content-length'])
followConfirmParams=self.rfile.read(length).decode('utf-8')
if '&submitYes=' in followConfirmParams:
followingActor=followConfirmParams.replace('%3A',':').replace('%2F','/').split('actor=')[1]
if '&' in followingActor:
followingActor=followingActor.split('&')[0]
followingNickname=getNicknameFromActor(followingActor)
followingDomain,followingPort=getDomainFromActor(followingActor)
if followerNickname==followingNickname and \
followingDomain==self.server.domain and \
followingPort==self.server.port:
if self.server.debug:
print('You cannot unfollow yourself!')
else:
if self.server.debug:
print(followerNickname+' stops following '+followingActor)
followActor=self.server.httpPrefix+'://'+self.server.domainFull+'/users/'+followerNickname
unfollowJson = {
'type': 'Undo',
'actor': followActor,
'object': {
'type': 'Follow',
'actor': followActor,
'object': followingActor,
'to': [followingActor],
'cc': ['https://www.w3.org/ns/activitystreams#Public']
}
}
self._postToOutbox(unfollowJson)
self._redirect_headers(originPathStr,cookie) self._redirect_headers(originPathStr,cookie)
self.server.POSTbusy=False self.server.POSTbusy=False
return return

View File

@ -706,6 +706,7 @@ def outboxUndoFollow(baseDir: str,messageJson: {},debug: bool) -> None:
"""When an unfollow request is received by the outbox from c2s """When an unfollow request is received by the outbox from c2s
This removes the followed handle from the following.txt file This removes the followed handle from the following.txt file
of the relevant account of the relevant account
TODO the unfollow should also be sent to the previously followed account
""" """
if not messageJson.get('type'): if not messageJson.get('type'):
return return

View File

@ -591,3 +591,33 @@ def htmlFollowConfirm(baseDir: str,originPathStr: str,followActor: str,followPro
followStr+='</div>' followStr+='</div>'
followStr+=htmlFooter() followStr+=htmlFooter()
return followStr return followStr
def htmlUnfollowConfirm(baseDir: str,originPathStr: str,followActor: str,followProfileUrl: str) -> str:
"""Asks to confirm unfollowing an actor
"""
followDomain,port=getDomainFromActor(followActor)
if os.path.isfile(baseDir+'/img/follow-background.png'):
if not os.path.isfile(baseDir+'/accounts/follow-background.png'):
copyfile(baseDir+'/img/follow-background.png',baseDir+'/accounts/follow-background.png')
with open(baseDir+'/epicyon-follow.css', 'r') as cssFile:
profileStyle = cssFile.read()
followStr=htmlHeader(profileStyle)
followStr+='<div class="follow">'
followStr+=' <div class="followAvatar">'
followStr+=' <center>'
followStr+=' <a href="'+followActor+'">'
followStr+=' <img src="'+followProfileUrl+'"/></a>'
followStr+=' <p class="followText">Stop following '+getNicknameFromActor(followActor)+'@'+followDomain+' ?</p>'
followStr+= \
' <form method="POST" action="'+originPathStr+'/unfollowconfirm">' \
' <input type="hidden" name="actor" value="'+followActor+'">' \
' <button type="submit" class="button" name="submitYes">Yes</button>' \
' <a href="'+originPathStr+'"><button class="button">No</button></a>' \
' </form>'
followStr+='</center>'
followStr+='</div>'
followStr+='</div>'
followStr+=htmlFooter()
return followStr