This commit is contained in:
Iliyan Angelov
2025-09-14 23:24:25 +03:00
commit c67067a2a4
71311 changed files with 6800714 additions and 0 deletions

View File

@@ -0,0 +1,44 @@
from allauth.socialaccount.providers.base import ProviderAccount
from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider
class OdnoklassnikiAccount(ProviderAccount):
def get_profile_url(self):
return "https://ok.ru/profile/" + self.account.extra_data["uid"]
def get_avatar_url(self):
ret = None
pic_big_url = self.account.extra_data.get("pic1024x768")
pic_medium_url = self.account.extra_data.get("pic640x480")
pic_small_url = self.account.extra_data.get("pic190x190")
if pic_big_url:
return pic_big_url
elif pic_medium_url:
return pic_medium_url
elif pic_small_url:
return pic_small_url
else:
return ret
def to_str(self):
dflt = super(OdnoklassnikiAccount, self).to_str()
return self.account.extra_data.get("name", dflt)
class OdnoklassnikiProvider(OAuth2Provider):
id = "odnoklassniki"
name = "Odnoklassniki"
account_class = OdnoklassnikiAccount
def extract_uid(self, data):
return data["uid"]
def extract_common_fields(self, data):
return dict(
last_name=data.get("last_name"),
first_name=data.get("first_name"),
email=data.get("email"),
)
provider_classes = [OdnoklassnikiProvider]

View File

@@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from allauth.socialaccount.tests import OAuth2TestsMixin
from allauth.tests import MockedResponse, TestCase
from .provider import OdnoklassnikiProvider
class OdnoklassnikiTests(OAuth2TestsMixin, TestCase):
provider_id = OdnoklassnikiProvider.id
def get_mocked_response(self, verified_email=True):
return MockedResponse(
200,
"""
{"uid":"561999209121","birthday":"1999-09-09","age":33,"first_name":"Ivan",
"last_name":"Petrov","name":"Ivan Petrov","locale":"en","gender":"male",
"has_email":true,"location":{"city":"Moscow","country":"RUSSIAN_FEDERATION",
"countryCode":"RU","countryName":"Russia"},"online":"web","pic_1":
"http://i500.mycdn.me/res/stub_50x50.gif",
"pic_2":"http://usd1.mycdn.me/res/stub_128x96.gif"}
""",
)
def get_login_response_json(self, with_refresh_token=True):
return '{"access_token": "testac"}' # noqa

View File

@@ -0,0 +1,6 @@
from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns
from .provider import OdnoklassnikiProvider
urlpatterns = default_urlpatterns(OdnoklassnikiProvider)

View File

@@ -0,0 +1,67 @@
import requests
from hashlib import md5
from allauth.socialaccount.providers.oauth2.views import (
OAuth2Adapter,
OAuth2CallbackView,
OAuth2LoginView,
)
from .provider import OdnoklassnikiProvider
USER_FIELDS = [
"age",
"birthday",
"current_status",
"current_status_date",
"current_status_id",
"email",
"first_name",
"gender",
"has_email",
"last_name",
"locale",
"location",
"name",
"online",
"photo_id",
"pic1024x768", # big
"pic190x190", # small
"pic640x480", # medium
"pic_1", # aka pic50x50
"pic_2", # aka pic128max
"uid",
]
class OdnoklassnikiOAuth2Adapter(OAuth2Adapter):
provider_id = OdnoklassnikiProvider.id
access_token_url = "https://api.odnoklassniki.ru/oauth/token.do"
authorize_url = "https://www.odnoklassniki.ru/oauth/authorize"
profile_url = "https://api.odnoklassniki.ru/fb.do"
access_token_method = "POST"
def complete_login(self, request, app, token, **kwargs):
data = {
"method": "users.getCurrentUser",
"access_token": token.token,
"fields": ",".join(USER_FIELDS),
"format": "JSON",
"application_key": app.key,
}
suffix = md5(
"{0:s}{1:s}".format(data["access_token"], app.secret).encode("utf-8")
).hexdigest()
check_list = sorted(
["{0:s}={1:s}".format(k, v) for k, v in data.items() if k != "access_token"]
)
data["sig"] = md5(("".join(check_list) + suffix).encode("utf-8")).hexdigest()
response = requests.get(self.profile_url, params=data)
extra_data = response.json()
return self.get_provider().sociallogin_from_response(request, extra_data)
oauth2_login = OAuth2LoginView.adapter_view(OdnoklassnikiOAuth2Adapter)
oauth2_callback = OAuth2CallbackView.adapter_view(OdnoklassnikiOAuth2Adapter)