@@ -75,48 +75,91 @@ def logout(_):
7575
7676@Script .register ()
7777def import_tokens (_ ):
78- """Import authentication tokens from a web browser or an existing viwx session file."""
79- session = itv_account .itv_session ()
78+ """Import authentication tokens from a web browser or an existing viwx session file.
8079
81- file_path = xbmcgui .Dialog ().browseSingle (1 , 'Open cookie file' , 'files' )
80+ """
81+ file_path = xbmcgui .Dialog ().browseSingle (1 , 'Open token file' , 'files' )
8282 if not file_path :
83- logger .info ("Importing browser cookie canceled." )
83+ logger .info ("Importing auth tokens canceled." )
8484 return
8585
86- logger .info ("Importing browser cookie from %s." , file_path )
86+ logger .info ("Importing auth tokens from %s." , file_path )
8787 with xbmcvfs .File (file_path , 'r' ) as f :
88- data = f .read ()
88+ raw_data = f .read ()
89+ check_token_data (raw_data )
90+
8991
90- data = data .strip ()
92+ def check_token_data (raw_data : str ):
93+ data_type = "Unknown"
94+ data = raw_data .strip ()
95+ # Just in case some editor has inserted hard wraps.
96+ data = data .replace ('\n ' , '' )
97+ data = data .replace ('\r ' , '' )
9198 try :
92- if data .startswith ('Itv.Session:"{"tokens":' ):
93- logger .info ("Found Firefox cookie data..." )
94- data = data [13 :- 1 ]
95- session_data = json .loads (data )['tokens' ]['content' ]
96- elif data .startswith ('{"tokens":' ):
97- logger .info ("Found Chromium cookie data..." )
98- session_data = json .loads (data )['tokens' ]['content' ]
99+ if '.Session:"{' in data [:16 ]:
100+ data_type = "Firefox cookie"
101+ if not data .startswith ('Itv' ):
102+ raise errors .ParseError ("Firefox cookie data should start with 'ITV.Session'." )
103+ if not data .endswith ('"' ):
104+ raise errors .ParseError ('Firefox cookie data should end with a double quote (").' )
105+ token_data = _parse_cookie (data [13 :- 1 ])
106+ elif 'tokens":' in data [:11 ]:
107+ data_type = "Chromium cookie"
108+ if not data .startswith ('{' ):
109+ raise errors .ParseError ("Chromium cookie data should start with a '{'." )
110+ if not data .endswith ('}' ):
111+ raise errors .ParseError ("Chromium cookie data should end with a '}'." )
112+ token_data = _parse_cookie (data )
113+ elif '"vers": 2' in data :
114+ data_type = "viwX export"
115+ try :
116+ token_data = json .loads (data )['itv_session' ]
117+ except (json .JSONDecodeError , KeyError ):
118+ raise errors .ParseError ("This is not a valid viwX token export file." )
99119 else :
100- logger .info ("Expecting viwX data..." )
101- session_data = json .loads (data )['itv_session' ]
102- # Just to check its presence
103- _ = session_data ['refresh_token' ]
104- except (json .JSONDecodeError , KeyError , TypeError ):
105- logger .error ("Invalid auth cookie data:\n " , exc_info = True )
106- kodi_utils .msg_dlg (TXT_IMPORT_INVALID_DATA )
120+ raise errors .ParseError ("Unknown file format.\n "
121+ "Ensure to copy all data exactly as is." )
122+ except errors .ParseError as err :
123+ logger .error ("Invalid token data\n \t \t File format: %s\n \t \t start: '%s'\n \t \t end: '%s'\n " ,
124+ data_type , raw_data [:20 ], raw_data [- 20 :], exc_info = True )
125+ kodi_utils .msg_dlg ('\n ' .join ((Script .localize (TXT_IMPORT_INVALID_DATA ), str (err ))))
107126 return
108127
109- logger .debug ('Successfully read auth cookie file.' )
128+ try :
129+ # Just to check its presence
130+ _ = token_data ['refresh_token' ]
131+ except KeyError :
132+ logger .error ("Failed to import' refresh token not present." )
133+ kodi_utils .msg_dlg ('\n ' .join ((
134+ Script .localize (TXT_IMPORT_INVALID_DATA ),
135+ "Missing token.Are you sure you were signed in when copying the cookie?" ))
136+ )
137+ return
110138
111- session .account_data ['itv_session' ] = session_data
139+ logger .debug ('Successfully read auth tokens file.' )
140+ session = itv_account .itv_session ()
141+ session .account_data ['itv_session' ] = token_data
112142 session .account_data ['cookies' ] = {}
113143 if session .refresh ():
114144 kodi_utils .msg_dlg (TXT_IMPORT_SUCCESS , nickname = session .user_nickname )
115145 else :
116- session .save_account_data ()
117146 kodi_utils .msg_dlg (TXT_IMPORT_FAILED_REFRESH )
118147
119148
149+ def _parse_cookie (data : str ) -> dict :
150+ """Read tokens from cookie data and try to show an informative message on failure."""
151+ try :
152+ tokens = json .loads (data )['tokens' ]['content' ]
153+ return tokens
154+ except (json .JSONDecodeError , TypeError ):
155+ logger .error ("Error importing tokens from cookie:\n " , exc_info = True )
156+ raise errors .ParseError ('Invalid, or a incomplete authentication cookie.' )
157+ except KeyError :
158+ logger .error ("Error importing tokens from cookie:\n " , exc_info = True )
159+ raise errors .ParseError ('The cookie data is invalid, or incomplete.\n '
160+ 'Are you sure you were signed in when copying the cookie?' )
161+
162+
120163@Script .register ()
121164def export_tokens (_ ):
122165 import datetime
0 commit comments