2020from __future__ import annotations
2121
2222from dataclasses import dataclass
23- from typing import TYPE_CHECKING , NoReturn
23+ from typing import NoReturn
2424from urllib .parse import urlsplit
2525
2626import requests
2727from django .conf import settings
2828from django .core .management .base import BaseCommand , CommandError
2929from django .core .signing import BadSignature , SignatureExpired , dumps , loads
3030from django .db import DataError , IntegrityError
31- from django .urls import NoReverseMatch , reverse
3231
3332from weblate_web .models import ExternalSyncState , SamlIdentity
3433from weblate_web .saml import (
35- AmbiguousSamlIdentityError ,
3634 SamlSyncContext ,
3735 extract_profile ,
3836 get_default_saml_provider ,
39- get_legacy_candidates ,
4037 normalize_external_id ,
4138 sync_saml_payload ,
4239)
4340
44- if TYPE_CHECKING :
45- from django .contrib .auth .models import User
46-
4741SYNC_KEY = "hosted-users"
4842USER_SYNC_SALT = "weblate.user-sync"
4943USER_SYNC_RESPONSE_SALT = "weblate.user-sync-response"
@@ -175,7 +169,7 @@ def sync_user_payloads(
175169 processed += 1
176170 if not isinstance (user_payload , dict ):
177171 skipped = True
178- self .write_skip ("payload is not a mapping" , user_payload , context )
172+ self .write_skip ("payload is not a mapping" , user_payload )
179173 self .write_progress (processed , total , progress_every )
180174 continue
181175 if only_missing and self .get_existing_identity (user_payload , context ):
@@ -185,7 +179,6 @@ def sync_user_payloads(
185179 try :
186180 user , _created = sync_saml_payload (user_payload , context )
187181 except (
188- AmbiguousSamlIdentityError ,
189182 AttributeError ,
190183 DataError ,
191184 IntegrityError ,
@@ -194,12 +187,12 @@ def sync_user_payloads(
194187 ValueError ,
195188 ) as error :
196189 skipped = True
197- self .write_skip (error , user_payload , context )
190+ self .write_skip (error , user_payload )
198191 self .write_progress (processed , total , progress_every )
199192 continue
200193 if user is None :
201194 skipped = True
202- self .write_skip ("user not synchronized" , user_payload , context )
195+ self .write_skip ("user not synchronized" , user_payload )
203196 self .write_progress (processed , total , progress_every )
204197 continue
205198 count += 1
@@ -235,64 +228,25 @@ def write_skip(
235228 self ,
236229 error : object ,
237230 user_payload : object ,
238- context : SamlSyncContext | None ,
239231 ) -> None :
240232 self .stderr .write (f"Skipping hosted user payload: { error } " )
241- for line in self .describe_user_payload (user_payload , context ):
233+ for line in self .describe_user_payload (user_payload ):
242234 self .stderr .write (f" { line } " )
243235
244- def describe_user_payload (
245- self , user_payload : object , context : SamlSyncContext | None
246- ) -> list [str ]:
236+ def describe_user_payload (self , user_payload : object ) -> list [str ]:
247237 if not isinstance (user_payload , dict ):
248238 return [f"payload={ user_payload !r} " ]
249- provider = str (user_payload .get ("provider" , get_default_saml_provider ()))
250239 external_id = normalize_external_id (user_payload .get ("external_id" ))
251240 profile = extract_profile (user_payload )
252241 username = profile .get ("username" , user_payload .get ("username" , "" ))
253242 email = profile .get ("email" , "" )
254- lines = [
243+ return [
255244 (
256245 "hosted user: "
257246 f"external_id={ external_id !r} username={ username !r} email={ email !r} "
258247 f"admin={ self .get_hosted_user_admin_url (external_id )} "
259248 )
260249 ]
261- candidates = sorted (
262- get_legacy_candidates (profile , context ), key = lambda user : user .pk
263- )
264- if candidates :
265- lines .append ("local candidates:" )
266- lines .extend (f" { self .describe_local_user (user )} " for user in candidates )
267- if external_id :
268- lines .append (
269- "possible action: link the correct local candidate with "
270- f"SamlIdentity(provider={ provider !r} , "
271- f"external_id={ external_id !r} , user=<chosen user>)"
272- )
273- elif external_id :
274- lines .append (
275- "possible action: create a placeholder local user and link "
276- f"SamlIdentity(provider={ provider !r} , external_id={ external_id !r} )"
277- )
278- return lines
279-
280- def describe_local_user (self , user : User ) -> str :
281- identities = [
282- (
283- f"{ identity .provider } :{ identity .external_id } "
284- f"{ self .get_admin_url ('admin:weblate_web_samlidentity_change' , identity .pk )} "
285- )
286- for identity in SamlIdentity .objects .filter (user = user ).order_by (
287- "provider" , "external_id"
288- )
289- ]
290- return (
291- f"id={ user .pk } username={ user .username !r} email={ user .email !r} "
292- f"last_login={ user .last_login } "
293- f"admin={ self .get_admin_url ('admin:auth_user_change' , user .pk )} "
294- f"saml_identities={ identities } "
295- )
296250
297251 def get_existing_identity (
298252 self , user_payload : object , context : SamlSyncContext | None
@@ -311,13 +265,6 @@ def get_existing_identity(
311265 .first ()
312266 )
313267
314- def get_admin_url (self , viewname : str , object_id : object ) -> str :
315- try :
316- path = reverse (viewname , args = [object_id ])
317- except NoReverseMatch :
318- return ""
319- return f"{ settings .SITE_URL .rstrip ('/' )} { path } "
320-
321268 def get_hosted_user_admin_url (self , external_id : str ) -> str :
322269 if not external_id :
323270 return ""
0 commit comments