
    pi0                        d 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 ej        	                    d          dk    rdej        d<   ndej        v rej        d= 	 ddl
mZ n&# e$ r  ed            ej        d	           Y nw xY w ej                    d
z  Zd Zd Zd ZddZddZd Zd Zd Zd Zd Zd Zd Zedk    r e             dS dS )ul  
iCloud 认证管理工具 — 「一次登录，长期免密」

核心原理：
  pyicloud 会将 session token 和 cookies 持久化到 cookie_directory（默认 ~/.pyicloud/）。
  只要 session 未过期，后续所有脚本都可以**无需密码**直接复用已缓存的会话。

使用方式：
  python icloud_auth.py login           # 交互式登录（仅需运行一次）
  python icloud_auth.py status          # 检查当前 session 是否有效
  python icloud_auth.py logout          # 清除已缓存的 session
  python icloud_auth.py refresh         # 刷新 session（延长有效期）

认证流程（面向高管/最终用户）：
  1. 首次使用时运行 `python icloud_auth.py login`
  2. 输入 Apple ID 和密码（密码仅用于本次登录，不会被保存到任何文件）
  3. 在 iPhone/iPad/Mac 上确认双重认证弹窗，输入 6 位验证码
  4. 完成！后续所有操作均自动复用 session，无需再输入密码

安全保证：
  - 密码不落盘、不写入配置文件、不存储为环境变量
  - 仅 session token + cookies 被缓存在 ~/.pyicloud/ 目录（权限 0o700）
  - session 过期后需重新运行 login，但无需泄露密码给任何人

环境变量（可选，替代交互输入）：
  ICLOUD_USERNAME    - Apple ID 邮箱
  ICLOUD_COOKIE_DIR  - 自定义 session 缓存目录（默认 ~/.pyicloud）
    N)PathICLOUD_CHINA1icloud_china)PyiCloudServiceu+   请先安装 pyicloud: pip install pyicloud   z	.pyicloudc                  p    t           j                            d          } | r| S t          t                    S )u   获取 session 缓存目录ICLOUD_COOKIE_DIR)osenvirongetstrDEFAULT_COOKIE_DIR)customs    K/root/.openclaw/workspace/skills/Openclaw-With-Apple/scripts/icloud_auth.pyget_cookie_directoryr   6   s2    Z^^/00F !"""    c                      t           j                            d          } | s!t          d                                          } | S )u<   获取 Apple ID（优先环境变量，其次交互输入）ICLOUD_USERNAMEu   Apple ID 邮箱: )r   r   r   inputstrip)usernames    r   get_usernamer   >   s=    z~~/00H 6,--3355Or   c                     t                      }d                    d | D                       }t          |          | dz  }t          |          | dz  }||fS )u*   获取指定用户的 session 文件路径 c              3   B   K   | ]}|                                 |V  d S N)isalnum).0chs     r   	<genexpr>z#get_session_file.<locals>.<genexpr>J   s/      >>r>>>>>>>r   z.sessionz
.cookiejar)r   joinr   )r   
cookie_dir	sanitizedsession_filecookie_files        r   get_session_filer'   F   sn    %''J>>X>>>>>I
##&<&<&<<Lz""	%=%=%==K$$r   c                    t                      }t          |           \  }}|                                s|                                sdS 	 |#t          j                            d          dk    }t          | d||          }|j        s|j        rdS |dfS # t          $ rA}t          |          }d|v sd	|                                v rY d}~d
S dd| dfcY d}~S d}~ww xY w)u   
    尝试仅通过 session 缓存恢复连接（不需要密码）。
    返回 (api, error_message)：
      - 成功: (api_instance, None)
      - 失败: (None, "错误描述")
    )NuF   未找到缓存的 session，请先运行: python icloud_auth.py loginNr   r   r   )passwordcookie_directorychina_mainland)NuO   Session 已过期，需要重新认证。请运行: python icloud_auth.py loginzMissing apple_idr)   )Nu@   Session 已过期，请重新登录: python icloud_auth.py loginu   恢复 session 失败: u-   
请重新登录: python icloud_auth.py login)r   r'   existsr   r   r   r   requires_2farequires_2sa	Exceptionr   lower)r   r+   r#   r%   r&   apie	error_strs           r   try_restore_sessionr4   P   sD    &''J 0 : :L+   ^););)=)= ^]]i!Z^^N;;sBN ')	
 
 
  	ks/ 	kjjDy i i iFF	**jIOO<M<M.M.M[[[[[[hyhhhhhhhhhh	is+   AB B 
C#")CCC#C#c                 J   | ct           j                            d          } | sBt                      } | s2t	          d           t	          d           t          j        d           t          | |          \  }}|r|S t	          d|            t          j        d           dS )u   
    供其他脚本调用的统一入口：优先 session 复用，不需要密码。
    如果 session 失效，给出明确提示而非要求输入密码。

    返回 PyiCloudService 实例，失败时 sys.exit(1)。
    Nr   u   ❌ 未指定 Apple IDuR      请设置环境变量 ICLOUD_USERNAME 或先运行: python icloud_auth.py loginr      ❌ )r   r   r   _guess_username_from_sessionprintsysexitr4   )r   r+   r1   errors       r   get_api_with_sessionr<   v   s     :>>"344 	355H .///jkkk$X~>>JC
 
	...HQKKKKKr   c                  D   t          t                                } |                                 sdS t          |                     d                    }t          |          dk    r9|d         j        }|                    dd                              dd          }|S dS )	u*   从 session 缓存目录中推断用户名Nz	*.sessionr   r   _at_@_dot_.)r   r   r,   listgloblenstemreplace)r#   session_filesnamer   s       r   r7   r7      s    *,,--J t 5566M
=QQ$<<,,44WcBB4r   c                     t          d           t          d           t                      } t          j        d          }|st          d           dS t                      }t          j                            dd          dk    }t          d|rd	nd
 d           	 t          | |||          }n*# t          $ r}t          d|            Y d}~dS d}~ww xY w|j	        rt          d           t          d           t          d                                          }|                    |          st          d           dS t          d           |j        s#|                                 t          d           n|j        rt          d           |j        }t#          |          D ]9\  }}	|	                    dd|dz              }
t          d|dz    d|
            :t%          t          d                    dz
  }||         }|                    |          st          d           dS t          d                                          }|                    ||          st          d           dS t          d           	 t+          |j                  }n# t          $ r Y nw xY wt          d|            t          d|             t          d           t          d            ~dS )!u5   交互式登录 — 密码仅用于本次，不保存u   🔐 iCloud 认证登录
uF      密码仅用于本次登录验证，不会保存到任何文件。
u&   Apple ID 密码（输入不可见）: u   ❌ 密码不能为空Nr   r   u   
🍎 正在连接 iCloudu   (中国大陆)r   z...)r*   r+   u   ❌ 连接失败: u   
🔐 需要双重认证u2      请查看 iPhone/iPad/Mac 上的验证码弹窗u      请输入 6 位验证码: u   ❌ 验证失败!u   ✅ 验证成功!u   ✅ 已信任此设备会话u   
🔐 需要双重验证
deviceNameu   设备 r   z   z. u)      选择接收验证码的设备编号: u   ❌ 发送验证码失败u      请输入验证码: u)   
✅ 登录成功! Session 已缓存到:       用户: uS   
💡 后续使用无需再输入密码，所有脚本将自动复用此 session。uH      Session 过期后重新运行 'python icloud_auth.py login' 即可。)r8   r   getpassr   r   r   r   r   r/   r-   r   r   validate_2fa_codeis_trusted_sessiontrust_sessionr.   trusted_devices	enumerateintsend_verification_codevalidate_verification_coderB   devices)r   r)   r#   chinar1   r2   coderU   idevrH   idxdevice_s                 r   	cmd_loginr]      sh   	
&'''	
STTT~~HGHHH &'''%''JJNN>3//36E	
M5'H'7'7b
M
M
MNNN	' 	
 
 
    &1&&'''
  #)***BCCC455;;==$$T** 	%&&&F!""" % 	20111		 #)***%(( 	' 	'FAs77<1Q399D%!%%t%%&&&&%CDDEEI))&11 	-...F.//5577--fd;; 	%&&&F!"""    

Cz
C
CDDD	
"
"
"###	
abbb	
UVVV 	s*   B2 2
C<CCJ$ $
J10J1c                  p   t          d           t          j                            d          pt	                      } | s t          d           t          d           dS t                      }t          |           \  }}t          d|             t          d|            t          d|                                rd	nd
            t          d|                                rd	nd
            |                                r	 t          |          5 }t          j
        |          }ddd           n# 1 swxY w Y   t          |                    d                    }t          d|rd	nd
            n# t          $ r t          d           Y nw xY wt          d           t          |           \  }}|rft          d           	 t          |j                  }	t          dt!          |	           d           dS # t          $ r t          d           Y dS w xY wt          d|            dS )u   检查当前 session 状态u"   🔍 检查 iCloud session 状态
r   u'   ❌ 未找到任何已缓存的 sessionu,      请先运行: python icloud_auth.py loginNrK   u      缓存目录: u      Session 文件: u
   ✅ 存在u   ❌ 不存在u      Cookie 文件: session_tokenz   Session Token: u&      Session 文件: ⚠️ 无法解析u%   
   正在验证 session 有效性...u,      ✅ Session 有效! 可以正常使用。u      📱 已关联 u
    个设备u4      ⚠️ 设备查询失败（可能需要刷新）u      ❌ )r8   r   r   r   r7   r   r'   r,   openjsonloadboolr/   r4   rB   rU   rD   )
r   r#   r%   r&   fdata	has_tokenr1   r;   rU   s
             r   
cmd_statusrg      s   	
/000z~~/00R4P4R4RH 7888<===%''J 0 : :L+	
"
"
"###	
*j
*
*+++	
\0C0C0E0E Z?
\
\]]]	
Z{/A/A/C/CX||
Z
Z[[[ =	=l## $qy||$ $ $ $ $ $ $ $ $ $ $ $ $ $ $TXXo6677IWy'U||oWWXXXX 	= 	= 	=;<<<<<	= 

3444$X..JC
 !=>>>	K3;''G?s7||???@@@@@ 	K 	K 	KIJJJJJJ	K 	     sH   E< D8,E< 8D<<E< ?D< ;E< <FF4H H! H!c                      t          d           t          j                            d          pt	                      } | st          d           dS t          |           \  }}d}|                                r(|                                 t          d|            d}|                                r(|                                 t          d|            d}|rt          d           dS t          d	           dS )
u   清除缓存的 sessionu   🗑️ 清除 iCloud session
r   u&      没有找到需要清除的 sessionNFu      ✅ 已删除: Tu6   
   Session 已清除。下次使用需重新登录。u$      没有找到需要清除的文件)r8   r   r   r   r7   r'   r,   unlink)r   r%   r&   removeds       r   
cmd_logoutrk     s   	
+,,,z~~/00R4P4R4RH 6777 0 : :L+G 1<11222 0;00111 7HIIIII566666r   c                     t          d           t          j                            d          pt	                      } | st          d           dS t          |           \  }}|st          d|            dS 	 t          |j                  }t          d           t          d|             dS # t          $ r,}t          d|            t          d	           Y d}~dS d}~ww xY w)
u    刷新 session，延长有效期u   🔄 刷新 iCloud session
r   uA   ❌ 未找到 session，请先登录: python icloud_auth.py loginNr6   u      ✅ Session 已刷新!rK   u      ⚠️ 刷新时出错: u8      可能需要重新登录: python icloud_auth.py login)	r8   r   r   r   r7   r4   rB   rU   r/   )r   r1   r;   r\   r2   s        r   cmd_refreshrm   .  s   	
()))z~~/00R4P4R4RH QRRR$X..JC nUnnK*+++&H&&''''' K K K/A//000IJJJJJJJJJKs   95B0 0
C&:!C!!C&c                  $    t          d           d S )Nu   
🔐 iCloud 认证管理工具

  「一次登录，长期免密」— 密码不落盘，session 自动缓存。

用法:
  python icloud_auth.py <命令>

命令:
  login     交互式登录（密码仅用一次，不保存）
  status    检查当前 session 是否有效
  refresh   刷新 session 延长有效期
  logout    清除已缓存的 session

环境变量（可选）:
  ICLOUD_USERNAME     Apple ID 邮箱
  ICLOUD_COOKIE_DIR   自定义缓存目录（默认 ~/.pyicloud）
  ICLOUD_CHINA        设为 1 表示中国大陆（默认 1）

安全说明:
  ✅ 密码仅在 login 时交互输入，输入不可见
  ✅ 密码不写入任何文件或环境变量
  ✅ 仅 session token 被缓存（~/.pyicloud/）
  ✅ session 过期后需重新 login
)r8    r   r   	show_helprp   F  s#    	      r   c                     t          t          j                  dk     st          j        d         dv r"t                       t          j        d           t          j        d         } | dk    rt                       d S | dk    rt                       d S | dk    rt                       d S | dk    rt                       d S t          d	|             t                       d S )
N   r   )z-hz--helphelpr   loginstatuslogoutrefreshu   ❌ 未知命令: )
rD   r9   argvrp   r:   r]   rg   rk   rm   r8   )cmds    r   mainrz   b  s    
38}}qCHQK+CCC
(1+C
g~~						(3(()))r   __main__r   )NN)__doc__r9   r   ra   rL   shutilpathlibr   r   r   pyicloudr   ImportErrorr8   r:   homer   r   r   r'   r4   r<   r7   r]   rg   rk   rm   rp   rz   __name__ro   r   r   <module>r      s   : 


 				          :>>.!!S((!$BJ~rz!!

>"(((((((   	E
7888CHQKKKKK
 TY[[;. # # #  % % %#i #i #i #iL   2   H H HV&! &! &!R7 7 76K K K0  8  ( zDFFFFF s   A  BB