move account

This commit is contained in:
Your Name 2022-02-05 18:10:09 -05:00
parent 5635b06e73
commit e7ac920d34
4 changed files with 68 additions and 5 deletions

View file

@ -15,3 +15,4 @@ filetype
setproctitle
tqdm
opencc
dnspython

View file

@ -196,13 +196,33 @@
<div class="main-section-wrapper">
<div class="tools-section-wrapper">
<div class="import-panel">
<h5 class="import-panel__label">{% trans 'Mastodon/Pleroma社交关系数据' %}</h5>
<h5 class="import-panel__label">{% trans '更新社交关系数据' %}</h5>
<div class="import-panel__body">
<form action="{% url 'users:sync_mastodon' %}" method="POST" enctype="multipart/form-data" >
{% csrf_token %}
<input type="submit" class="import-panel__button" value="{% trans '同步' %}" id="uploadBtn" /> 上次更新时间 {{ user.mastodon_last_refresh }}
<div>
为了正确展示短评和评论NeoDB会缓存你的关注、屏蔽和静音列表。如果你刚刚更新过帐户的上锁状态、增减过关注、静音或屏蔽希望立即生效可以点击这里立刻更新这类信息也会每天自动同步。
为了正确高效的展示短评和评论NeoDB会缓存你在联邦网络的关注、屏蔽和静音列表。如果你刚刚更新过帐户的上锁状态、增减过关注、静音或屏蔽希望立即生效可以点击这里立刻更新这类信息也会每天自动同步。
</div>
</form>
</div>
</div>
</div>
</div>
<div class="main-section-wrapper">
<div class="tools-section-wrapper">
<div class="import-panel">
<h5 class="import-panel__label">{% trans '替换社交账号' %}</h5>
<div class="import-panel__body">
<form action="{% url 'users:reconnect' %}" method="POST" >
{% csrf_token %}
<div class="import-panel__checkbox">输入新社交账号所在的实例域名
<input type="input" name="domain" value="" placeholder="例如mastodon.online">
<input type="submit" class="import-panel__button" value="{% trans '登录新账号' %}" id="uploadBtn" />
</div>
<div>
替换后可使用新的联邦网络身份来登录NeoDB和控制数据可见性已有的标记评论收藏单等数据不受影响。
</div>
</form>
</div>
@ -217,9 +237,11 @@
<div class="import-panel__body">
<form action="{% url 'users:clear_data' %}" method="POST" >
{% csrf_token %}
<input type="submit" class="import-panel__button" value="{% trans '永久删除' %}" id="uploadBtn" />
<div class="import-panel__checkbox">输入完整的 用户名@实例名 以确认删除
<input type="input" name="verification" value="" placeholder="user@mastodon.social">
<input type="submit" class="import-panel__button" value="{% trans '永久删除' %}" id="uploadBtn" />
</div>
<div>
删除将无法撤销
</div>
</form>

View file

@ -6,6 +6,7 @@ urlpatterns = [
path('login/', login, name='login'),
path('register/', register, name='register'),
path('connect/', connect, name='connect'),
path('reconnect/', reconnect, name='reconnect'),
path('data/', data, name='data'),
path('data/export_reviews', export_reviews, name='export_reviews'),
path('data/export_marks', export_marks, name='export_marks'),

View file

@ -25,6 +25,7 @@ from movies.forms import MovieMarkStatusTranslator
from music.forms import MusicMarkStatusTranslator
from games.forms import GameMarkStatusTranslator
from mastodon.models import MastodonApplication
from mastodon.api import verify_account
from django.conf import settings
from urllib.parse import quote
import django_rq
@ -42,6 +43,30 @@ from collection.models import Collection
# Views
########################################
def swap_login(request, token, site):
del request.session['swap_login']
del request.session['swap_domain']
code, data = verify_account(site, token)
current_user = request.user
if code == 200 and data is not None:
username = data['username']
if username == current_user.username and site == current_user.mastodon_site:
messages.add_message(request, messages.ERROR, _(f'该身份 {username}@{site} 与当前账号相同。'))
else:
try:
existing_user = User.objects.get(username=username, mastodon_site=site)
messages.add_message(request, messages.ERROR, _(f'该身份 {username}@{site} 已被用于其它账号。'))
except ObjectDoesNotExist:
current_user.username = username
current_user.mastodon_site = site
current_user.mastodon_token = token
current_user.save(update_fields=['username', 'mastodon_site', 'mastodon_token'])
django_rq.get_queue('mastodon').enqueue(refresh_mastodon_data_task, current_user, token)
messages.add_message(request, messages.INFO, _(f'账号身份已更新为 {username}@{site}'))
else:
messages.add_message(request, messages.ERROR, _('连接联邦网络获取身份信息失败。'))
return redirect(reverse('users:data'))
# no page rendered
@mastodon_request_included
@ -57,7 +82,8 @@ def OAuth2_login(request):
except ObjectDoesNotExist:
return HttpResponseBadRequest("Mastodon site not registered")
if token:
# oauth is completed when token aquired
if request.session.get('swap_login', False) and request.user.is_authenticated: # swap login for existing user
return swap_login(request, token, site)
user = authenticate(request, token=token, site=site)
if user:
auth_login(request, user, token)
@ -113,7 +139,8 @@ def login(request):
def connect(request):
if not settings.MASTODON_ALLOW_ANY_SITE:
return redirect(reverse("users:login"))
login_domain = request.GET.get('domain').strip().lower().split('//')[-1].split('/')[0].split('@')[-1]
login_domain = request.session['swap_domain'] if request.session.get('swap_login') else request.GET.get('domain')
login_domain = login_domain.strip().lower().split('//')[-1].split('/')[0].split('@')[-1]
domain = get_instance_domain(login_domain)
app = MastodonApplication.objects.filter(domain_name=domain).first()
if app is None:
@ -151,6 +178,18 @@ def connect(request):
resp.set_cookie("mastodon_domain", domain)
return resp
@mastodon_request_included
@login_required
def reconnect(request):
if request.method == 'POST':
request.session['swap_login'] = True
request.session['swap_domain'] = request.POST['domain']
return connect(request)
else:
return HttpResponseBadRequest()
@mastodon_request_included
@login_required
def logout(request):