
    g                          d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	m
Z
mZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZ d
Zd Zd ZddZd Zd Zy)    N)BytesIO)Image	ImageDraw	ImageFont)RangedFileResponse)ImproperlyConfigured)Http404HttpResponse)settings)captcha_audio_urlcaptcha_image_url)CaptchaStore   c                 2   t        | d      r | j                  |      \  }}}}||z
  ||z
  fS t        | d      rIt        t        | j	                  |      | j                  |            D cg c]
  \  }}||z    c}}      S | j	                  |      S c c}}w )Ngetbbox	getoffset)hasattrr   tuplezipgetsizer   )fonttext_top_left_right_bottomxys           P/var/www/html/brdwt/brdwt/brdwtenv/lib/python3.12/site-packages/captcha/views.pyr   r      s    tY'+||D'9$eVW~w~--	{	#DLL,>t@T(UV1a!eVWW||D!! Ws   +B
c                     t         j                  dk(  rt        j                  d|       }|S t        j                  d| t         j                        }|S )NtransparentRGBARGB)r   CAPTCHA_BACKGROUND_COLORr   new)sizeimages     r   makeimgr(   "   sF    ((M9		&$' L 		%x'H'HIL    c                 8
   |dk(  rt         j                  st        	 t        j                  j                  |      }t        j                  |       |j                  }t        t         j                  t              rt         j                  }nSt        t         j                  t        t        f      r$t        j                   t         j                        }nt#        d      |j%                         j'                         j)                  d      r(t+        j,                  |t         j.                  |z        }nt+        j0                  |      }t         j2                  rt         j2                  }n%t5        ||      }|d   dz  t7        |d   d	z        f}t9        |      }d}	g }
|D ]A  }|t         j:                  v rt=        |
      dk\  r|
d
xx   |z  cc<   1|
j?                  |       C tA        |
      D ]  \  }}tC        jD                  d|t        jF                  |djI                  |
                  }tC        jD                  dt5        |d|z        d      }tK        jL                  |      }|jO                  dd|z  |d       t         jP                  r@|jS                  t        jT                  t         jP                   dtB        jV                        }|jY                  |j[                               }tC        jD                  d|      }|j]                  ||	t^        |	|j`                  d   z   t^        |j`                  d   z   f       |j`                  }tC        jb                  |||      }|	dz   |j`                  d   z   }	 t         j2                  rst9        |      }|j]                  |t7        |d   |	z
  dz        t7        |d   j`                  d   z
  dz  t^        z
        f       |jY                  dd|d   |d   f      }n|jY                  dd|	dz   |d   f      }tK        jL                  |      }t        jd                         D ]  } |||      } t        jf                         D ]
  } ||      } ti               }|jk                  |d       |jm                  d       t        d      }|jo                  |jq                                |js                         |d<   t        j                          |S # t        j                  $ r t        d      cY S w xY w)N   hashkey  statuszQsettings.CAPTCHA_FONT_PATH needs to be a path to a font or list of paths to fontsttfr      gffffff?r#    Lz %s z#000000)r   r   z#ffffff)r   fill)expandresamplePNGz	image/pngcontent_typezContent-length):r   CAPTCHA_2X_IMAGEr	   r   objectsgetDoesNotExistr
   randomseed	challenge
isinstanceCAPTCHA_FONT_PATHstrlistr   choicer   lowerstripendswithr   truetypeCAPTCHA_FONT_SIZEloadCAPTCHA_IMAGE_SIZEr   intr(   CAPTCHA_PUNCTUATIONlenappend	enumerater   r%   get_letter_colorjoinr   Drawr   CAPTCHA_LETTER_ROTATIONrotate	randrangeBICUBICcropr   pasteDISTANCE_FROM_TOPr&   	compositenoise_functionsfilter_functionsr   saveseekwritereadtell)requestkeyscalestorer   fontpathr   r&   r'   xposcharlistcharindexfgimage	charimagechardraw	maskimagetmpimgdrawfoutresponses                         r   captcha_imagerx   *   sR   z(33($$(((5
 KK??D(,,c2--	H..u	>==!;!;<"_
 	
 ~~((/!!(H,F,F,NO~~h'""**tT"Q!Sa3/0DMEDH "8///CMQ4FRLD LOOD!	" !* ,t))4225"''(:KL
 IIc74$#?K	>>),fftm$YG++!((  ("B"BC ) I
 NN9#4#4#67	IIc4(	!y~~a((!INN1$55		
 ~~	:ax)..++7,: ""T!Wt^q()T!Wy~~a00A58IIJ	
 Q47DG45

Aq$(DG45>>% D%%' u~&&( % )C	JJsEHHQK5HNN388:!$H KKMOM $$ (3''(s    S7 7TTc                 n   t         j                  r\	 t        j                  j	                  |      }|j                  }dt         j                  k(  r3|j                  dd      j                  dd      j                  d	d
      }ndj                  t        |            }t        t        j                  j                  t        j                          | dt#        j$                  d       d            }t'        j(                  t         j                  d|d|g       t         j*                  r	 t'        j(                  t         j*                  dd|gd      j,                  j/                         j1                         }t        t        j                  j                  t        j                          | dt#        j$                  d       d            }t'        j(                  t         j*                  d|d|dddddg
       t        t        j                  j                  t        j                          | dt#        j$                  d       d            }t'        j(                  t         j*                  d||ddd d!|g	       t        j4                  |       t        j4                  |       t        j6                  ||       t        j                  j9                  |      rt        j:                         }t=        |d"      5 }	|j?                  |	jA                                d d d        |jC                  d#       t        j4                  |       tE        | |d$%      }
d&jG                  |      |
d'<   |
S tH        # t        j
                  $ r t        d      cY S w xY w# t2        $ r d}Y +w xY w# 1 sw Y   xY w)(Nr,   r.   r/   zcaptcha.helpers.math_challenge*times-minus+plusz, _   z.wavz-tz-oz--iz-rT)capture_output8000z
_noise.wavz-nsynth2
brownnoisegainz-15z_merged.wavz-mwavpcmz-b16rbr   z	audio/wavr:   zattachment; filename="{}.wav"zContent-Disposition)%r   CAPTCHA_FLITE_PATHr   r=   r>   r?   r
   rB   CAPTCHA_CHALLENGE_FUNCTreplacerU   rF   rE   ospathtempfile
gettempdirsecretstoken_urlsafe
subprocessrunCAPTCHA_SOX_PATHstdoutdecoderI   	ExceptionremoverenameisfileTemporaryFileopenrc   rd   rb   r   formatr	   )rf   rg   ri   r   r   sample_ratearbnoisepath
mergedpathtemporary_fileoriginal_filerw   s              r   captcha_audior      s"   ""	, ((,,S,9E
 +x/O/OO<<W-55c7CKKCQWXD99T$Z(DGGLL,,.3%q9N9Nq9Q8RRV0WX
 	33T4tLM $$%NN!22E4F'+ VFFHUW  '')e1W22156jAL NN--   '')e1W22156kBJ NN-- 
 IIl#IIdOIIj$'77>>$%335NdD! ;]$$]%7%7%9:;"IIdO)kH /N.T.T/H*+ O
Mo (( 	,s++	,4  %$%b; ;s0    M4 -AN < N+4NNN('N(+N4c                    | j                   j                  d      dk(  st        t        j                         }|t        |      t        j                  rt        |      ndd}t        t        j                  |      d      S )z5Return json with new captcha for ajax refresh requestzx-requested-withXMLHttpRequestN)rg   	image_url	audio_urlzapplication/jsonr:   )headersr>   r	   r   pickr   r   r   r   r
   jsondumps)rf   new_keyto_json_responses      r   captcha_refreshr      sq    ??126FF!G&w/&& 'w/ 

#34CUVVr)   )r2   ) r   r   r@   r   r   r   ior   PILr   r   r   ranged_responser   django.core.exceptionsr   django.httpr	   r
   captcha.confr   captcha.helpersr   r   captcha.modelsr   r]   r   r(   rx   r   r    r)   r   <module>r      sX     	      + + . 7 - ! @ '  "k\[|Wr)   