@@ -33,14 +33,7 @@ void DownloadManager::downloadTitleVersionList()
33
33
{
34
34
if (m_hasTitleVersionList)
35
35
return ;
36
- NAPI::AuthInfo authInfo;
37
- authInfo.accountId = m_authInfo.nnidAccountName ;
38
- authInfo.passwordHash = m_authInfo.passwordHash ;
39
- authInfo.deviceId = m_authInfo.deviceId ;
40
- authInfo.serial = m_authInfo.serial ;
41
- authInfo.country = m_authInfo.country ;
42
- authInfo.region = m_authInfo.region ;
43
- authInfo.deviceCertBase64 = m_authInfo.deviceCertBase64 ;
36
+ NAPI::AuthInfo authInfo = GetAuthInfo (false );
44
37
auto versionListVersionResult = NAPI::TAG_GetVersionListVersion (authInfo);
45
38
if (!versionListVersionResult.isValid )
46
39
return ;
@@ -195,23 +188,14 @@ struct StoredTokenInfo : public SerializerHelper
195
188
196
189
bool DownloadManager::_connect_refreshIASAccountIdAndDeviceToken ()
197
190
{
198
- NAPI::AuthInfo authInfo;
199
- authInfo.accountId = m_authInfo.nnidAccountName ;
200
- authInfo.passwordHash = m_authInfo.passwordHash ;
201
- authInfo.deviceId = m_authInfo.deviceId ;
202
- authInfo.serial = m_authInfo.serial ;
203
- authInfo.country = m_authInfo.country ;
204
- authInfo.region = m_authInfo.region ;
205
- authInfo.deviceCertBase64 = m_authInfo.deviceCertBase64 ;
206
-
191
+ NAPI::AuthInfo authInfo = GetAuthInfo (false );
207
192
// query IAS/ECS account id and device token (if not cached)
208
193
auto rChallenge = NAPI::IAS_GetChallenge (authInfo);
209
194
if (rChallenge.apiError != NAPI_RESULT::SUCCESS)
210
195
return false ;
211
196
auto rRegistrationInfo = NAPI::IAS_GetRegistrationInfo_QueryInfo (authInfo, rChallenge.challenge );
212
197
if (rRegistrationInfo.apiError != NAPI_RESULT::SUCCESS)
213
198
return false ;
214
-
215
199
m_iasToken.serviceAccountId = rRegistrationInfo.accountId ;
216
200
m_iasToken.deviceToken = rRegistrationInfo.deviceToken ;
217
201
// store to cache
@@ -221,24 +205,13 @@ bool DownloadManager::_connect_refreshIASAccountIdAndDeviceToken()
221
205
std::vector<uint8> serializedData;
222
206
if (!storedTokenInfo.serialize (serializedData))
223
207
return false ;
224
- s_nupFileCache->AddFileAsync ({ fmt::format (" {}/token_info" , m_authInfo.nnidAccountName ) }, serializedData.data (), serializedData.size ());
208
+ s_nupFileCache->AddFileAsync ({ fmt::format (" {}/token_info" , m_authInfo.cachefileName ) }, serializedData.data (), serializedData.size ());
225
209
return true ;
226
210
}
227
211
228
212
bool DownloadManager::_connect_queryAccountStatusAndServiceURLs ()
229
213
{
230
- NAPI::AuthInfo authInfo;
231
- authInfo.accountId = m_authInfo.nnidAccountName ;
232
- authInfo.passwordHash = m_authInfo.passwordHash ;
233
- authInfo.deviceId = m_authInfo.deviceId ;
234
- authInfo.serial = m_authInfo.serial ;
235
- authInfo.country = m_authInfo.country ;
236
- authInfo.region = m_authInfo.region ;
237
- authInfo.deviceCertBase64 = m_authInfo.deviceCertBase64 ;
238
-
239
- authInfo.IASToken .accountId = m_iasToken.serviceAccountId ;
240
- authInfo.IASToken .deviceToken = m_iasToken.deviceToken ;
241
-
214
+ NAPI::AuthInfo authInfo = GetAuthInfo (true );
242
215
NAPI::NAPI_ECSGetAccountStatus_Result accountStatusResult = NAPI::ECS_GetAccountStatus (authInfo);
243
216
if (accountStatusResult.apiError != NAPI_RESULT::SUCCESS)
244
217
{
@@ -291,7 +264,7 @@ void DownloadManager::loadTicketCache()
291
264
m_ticketCache.clear ();
292
265
cemu_assert_debug (m_ticketCache.empty ());
293
266
std::vector<uint8> ticketCacheBlob;
294
- if (!s_nupFileCache->GetFile ({ fmt::format (" {}/eticket_cache" , m_authInfo.nnidAccountName ) }, ticketCacheBlob))
267
+ if (!s_nupFileCache->GetFile ({ fmt::format (" {}/eticket_cache" , m_authInfo.cachefileName ) }, ticketCacheBlob))
295
268
return ;
296
269
MemStreamReader memReader (ticketCacheBlob.data (), ticketCacheBlob.size ());
297
270
uint8 version = memReader.readBE <uint8>();
@@ -343,23 +316,12 @@ void DownloadManager::storeTicketCache()
343
316
memWriter.writePODVector (cert);
344
317
}
345
318
auto serializedBlob = memWriter.getResult ();
346
- s_nupFileCache->AddFileAsync ({ fmt::format (" {}/eticket_cache" , m_authInfo.nnidAccountName ) }, serializedBlob.data (), serializedBlob.size ());
319
+ s_nupFileCache->AddFileAsync ({ fmt::format (" {}/eticket_cache" , m_authInfo.cachefileName ) }, serializedBlob.data (), serializedBlob.size ());
347
320
}
348
321
349
322
bool DownloadManager::syncAccountTickets ()
350
323
{
351
- NAPI::AuthInfo authInfo;
352
- authInfo.accountId = m_authInfo.nnidAccountName ;
353
- authInfo.passwordHash = m_authInfo.passwordHash ;
354
- authInfo.deviceId = m_authInfo.deviceId ;
355
- authInfo.serial = m_authInfo.serial ;
356
- authInfo.country = m_authInfo.country ;
357
- authInfo.region = m_authInfo.region ;
358
- authInfo.deviceCertBase64 = m_authInfo.deviceCertBase64 ;
359
-
360
- authInfo.IASToken .accountId = m_iasToken.serviceAccountId ;
361
- authInfo.IASToken .deviceToken = m_iasToken.deviceToken ;
362
-
324
+ NAPI::AuthInfo authInfo = GetAuthInfo (true );
363
325
// query TIV list from server
364
326
NAPI::NAPI_ECSAccountListETicketIds_Result resultTicketIds = NAPI::ECS_AccountListETicketIds (authInfo);
365
327
if (!resultTicketIds.isValid ())
@@ -425,19 +387,7 @@ bool DownloadManager::syncAccountTickets()
425
387
bool DownloadManager::syncSystemTitleTickets ()
426
388
{
427
389
setStatusMessage (_ (" Downloading system tickets..." ).utf8_string (), DLMGR_STATUS_CODE::CONNECTING);
428
- // todo - add GetAuth() function
429
- NAPI::AuthInfo authInfo;
430
- authInfo.accountId = m_authInfo.nnidAccountName ;
431
- authInfo.passwordHash = m_authInfo.passwordHash ;
432
- authInfo.deviceId = m_authInfo.deviceId ;
433
- authInfo.serial = m_authInfo.serial ;
434
- authInfo.country = m_authInfo.country ;
435
- authInfo.region = m_authInfo.region ;
436
- authInfo.deviceCertBase64 = m_authInfo.deviceCertBase64 ;
437
-
438
- authInfo.IASToken .accountId = m_iasToken.serviceAccountId ;
439
- authInfo.IASToken .deviceToken = m_iasToken.deviceToken ;
440
-
390
+ NAPI::AuthInfo authInfo = GetAuthInfo (true );
441
391
auto querySystemTitleTicket = [&](uint64 titleId) -> void
442
392
{
443
393
// check if cached already
@@ -520,8 +470,7 @@ bool DownloadManager::syncUpdateTickets()
520
470
if (findTicketByTitleIdAndVersion (itr.titleId , itr.availableTitleVersion ))
521
471
continue ;
522
472
523
- NAPI::AuthInfo dummyAuth;
524
- auto cetkResult = NAPI::CCS_GetCETK (dummyAuth, itr.titleId , itr.availableTitleVersion );
473
+ auto cetkResult = NAPI::CCS_GetCETK (GetDownloadMgrNetworkService (), itr.titleId , itr.availableTitleVersion );
525
474
if (!cetkResult.isValid )
526
475
continue ;
527
476
NCrypto::ETicketParser ticketParser;
@@ -657,7 +606,7 @@ void DownloadManager::_handle_connect()
657
606
if (s_nupFileCache)
658
607
{
659
608
std::vector<uint8> serializationBlob;
660
- if (s_nupFileCache->GetFile ({ fmt::format (" {}/token_info" , m_authInfo.nnidAccountName ) }, serializationBlob))
609
+ if (s_nupFileCache->GetFile ({ fmt::format (" {}/token_info" , m_authInfo.cachefileName ) }, serializationBlob))
661
610
{
662
611
StoredTokenInfo storedTokenInfo;
663
612
if (storedTokenInfo.deserialize (serializationBlob))
@@ -683,7 +632,7 @@ void DownloadManager::_handle_connect()
683
632
if (!_connect_queryAccountStatusAndServiceURLs ())
684
633
{
685
634
m_connectState.store (CONNECT_STATE::FAILED);
686
- setStatusMessage (_ (" Failed to query account status. Invalid account information? " ).utf8_string (), DLMGR_STATUS_CODE::FAILED);
635
+ setStatusMessage (_ (" Failed to query account status" ).utf8_string (), DLMGR_STATUS_CODE::FAILED);
687
636
return ;
688
637
}
689
638
// load ticket cache and sync
@@ -692,7 +641,7 @@ void DownloadManager::_handle_connect()
692
641
if (!syncTicketCache ())
693
642
{
694
643
m_connectState.store (CONNECT_STATE::FAILED);
695
- setStatusMessage (_ (" Failed to request tickets (invalid NNID?) " ).utf8_string (), DLMGR_STATUS_CODE::FAILED);
644
+ setStatusMessage (_ (" Failed to request tickets" ).utf8_string (), DLMGR_STATUS_CODE::FAILED);
696
645
return ;
697
646
}
698
647
searchForIncompleteDownloads ();
@@ -713,22 +662,10 @@ void DownloadManager::connect(
713
662
std::string_view serial,
714
663
std::string_view deviceCertBase64)
715
664
{
716
- if (nnidAccountName.empty ())
717
- {
718
- m_connectState.store (CONNECT_STATE::FAILED);
719
- setStatusMessage (_ (" This account is not linked with an NNID" ).utf8_string (), DLMGR_STATUS_CODE::FAILED);
720
- return ;
721
- }
722
665
runManager ();
723
666
m_authInfo.nnidAccountName = nnidAccountName;
724
667
m_authInfo.passwordHash = passwordHash;
725
- if (std::all_of (m_authInfo.passwordHash .begin (), m_authInfo.passwordHash .end (), [](uint8 v) { return v == 0 ; }))
726
- {
727
- cemuLog_log (LogType::Force, " DLMgr: Invalid password hash" );
728
- m_connectState.store (CONNECT_STATE::FAILED);
729
- setStatusMessage (_ (" Failed. Account does not have password set" ).utf8_string (), DLMGR_STATUS_CODE::FAILED);
730
- return ;
731
- }
668
+ m_authInfo.cachefileName = nnidAccountName.empty () ? " DefaultName" : nnidAccountName;
732
669
m_authInfo.region = region;
733
670
m_authInfo.country = country;
734
671
m_authInfo.deviceCertBase64 = deviceCertBase64;
@@ -744,6 +681,31 @@ bool DownloadManager::IsConnected() const
744
681
return m_connectState.load () != CONNECT_STATE::UNINITIALIZED;
745
682
}
746
683
684
+ NetworkService DownloadManager::GetDownloadMgrNetworkService ()
685
+ {
686
+ return NetworkService::Nintendo;
687
+ }
688
+
689
+ NAPI::AuthInfo DownloadManager::GetAuthInfo (bool withIasToken)
690
+ {
691
+ NAPI::AuthInfo authInfo;
692
+ authInfo.serviceOverwrite = GetDownloadMgrNetworkService ();
693
+ authInfo.accountId = m_authInfo.nnidAccountName ;
694
+ authInfo.passwordHash = m_authInfo.passwordHash ;
695
+ authInfo.deviceId = m_authInfo.deviceId ;
696
+ authInfo.serial = m_authInfo.serial ;
697
+ authInfo.country = m_authInfo.country ;
698
+ authInfo.region = m_authInfo.region ;
699
+ authInfo.deviceCertBase64 = m_authInfo.deviceCertBase64 ;
700
+ if (withIasToken)
701
+ {
702
+ cemu_assert_debug (!m_iasToken.serviceAccountId .empty ());
703
+ authInfo.IASToken .accountId = m_iasToken.serviceAccountId ;
704
+ authInfo.IASToken .deviceToken = m_iasToken.deviceToken ;
705
+ }
706
+ return authInfo;
707
+ }
708
+
747
709
/* package / downloading */
748
710
749
711
// start/resume/retry download
@@ -1022,17 +984,7 @@ void DownloadManager::reportPackageProgress(Package* package, uint32 currentProg
1022
984
1023
985
void DownloadManager::asyncPackageDownloadTMD (Package* package)
1024
986
{
1025
- NAPI::AuthInfo authInfo;
1026
- authInfo.accountId = m_authInfo.nnidAccountName ;
1027
- authInfo.passwordHash = m_authInfo.passwordHash ;
1028
- authInfo.deviceId = m_authInfo.deviceId ;
1029
- authInfo.serial = m_authInfo.serial ;
1030
- authInfo.country = m_authInfo.country ;
1031
- authInfo.region = m_authInfo.region ;
1032
- authInfo.deviceCertBase64 = m_authInfo.deviceCertBase64 ;
1033
- authInfo.IASToken .accountId = m_iasToken.serviceAccountId ;
1034
- authInfo.IASToken .deviceToken = m_iasToken.deviceToken ;
1035
-
987
+ NAPI::AuthInfo authInfo = GetAuthInfo (true );
1036
988
TitleIdParser titleIdParser (package->titleId );
1037
989
NAPI::NAPI_CCSGetTMD_Result tmdResult;
1038
990
if (titleIdParser.GetType () == TitleIdParser::TITLE_TYPE::AOC)
@@ -1196,7 +1148,7 @@ void DownloadManager::asyncPackageDownloadContentFile(Package* package, uint16 i
1196
1148
setPackageError (package, _ (" Cannot create file" ).utf8_string ());
1197
1149
return ;
1198
1150
}
1199
- if (!NAPI::CCS_GetContentFile (titleId, contentId, CallbackInfo::writeCallback, &callbackInfoData))
1151
+ if (!NAPI::CCS_GetContentFile (GetDownloadMgrNetworkService (), titleId, contentId, CallbackInfo::writeCallback, &callbackInfoData))
1200
1152
{
1201
1153
setPackageError (package, _ (" Download failed" ).utf8_string ());
1202
1154
delete callbackInfoData.fileOutput ;
@@ -1490,7 +1442,7 @@ void DownloadManager::prepareIDBE(uint64 titleId)
1490
1442
if (s_nupFileCache->GetFile ({ fmt::format (" idbe/{0:016x}" , titleId) }, idbeFile) && idbeFile.size () == sizeof (NAPI::IDBEIconDataV0))
1491
1443
return addToCache (titleId, (NAPI::IDBEIconDataV0*)(idbeFile.data ()));
1492
1444
// not cached, query from server
1493
- std::optional<NAPI::IDBEIconDataV0> iconData = NAPI::IDBE_Request (titleId);
1445
+ std::optional<NAPI::IDBEIconDataV0> iconData = NAPI::IDBE_Request (GetDownloadMgrNetworkService (), titleId);
1494
1446
if (!iconData)
1495
1447
return ;
1496
1448
s_nupFileCache->AddFileAsync ({ fmt::format (" idbe/{0:016x}" , titleId) }, (uint8*)&(*iconData), sizeof (NAPI::IDBEIconDataV0));
0 commit comments