mirror of
https://github.com/WiiDatabase/nusdownloader.git
synced 2024-11-23 10:49:16 +01:00
- Removed some old code (it's in SVN anyway)
- Added an exception catcher on the download function
This commit is contained in:
parent
fbba04d759
commit
4197de03b7
@ -882,326 +882,17 @@ namespace NUS_Downloader
|
||||
else
|
||||
wadName = WAD_Saveas_Filename;
|
||||
|
||||
try
|
||||
{
|
||||
nusClient.DownloadTitle(titleidbox.Text, titleversion.Text, Path.Combine(CURRENT_DIR, "titles"), wadName, storeTypes);
|
||||
|
||||
WriteStatus("NUS Download Finished.");
|
||||
|
||||
/* THIS CODE WAD PRE-libWiiSharp
|
||||
// Preparations for Downloading
|
||||
Control.CheckForIllegalCrossThreadCalls = false; // this function would need major rewriting to get rid of this...
|
||||
if (!(script_mode))
|
||||
WriteStatus("Starting NUS Download. Please be patient!");
|
||||
SetEnableforDownload(false);
|
||||
downloadstartbtn.Text = "Starting NUS Download!";
|
||||
|
||||
// Creates the directory
|
||||
if (!script_mode)
|
||||
CreateTitleDirectory();
|
||||
|
||||
// Wii / DSi
|
||||
bool wiimode = (consoleCBox.SelectedIndex == 0);
|
||||
string activeNusUrl;
|
||||
if (wiimode)
|
||||
activeNusUrl = WII_NUS_URL;
|
||||
else
|
||||
activeNusUrl = DSI_NUS_URL;
|
||||
|
||||
string titleid = titleidbox.Text;
|
||||
string title_v = titleversion.Text;
|
||||
|
||||
// WebClient configuration
|
||||
WebClient nusWC = new WebClient();
|
||||
nusWC = ConfigureWithProxy(nusWC);
|
||||
nusWC.Headers.Add("User-Agent", "wii libnup/1.0"); // Set UserAgent to Wii value
|
||||
|
||||
// Create\Configure NusClient
|
||||
libWiiSharp.NusClient nusClient = new libWiiSharp.NusClient();
|
||||
nusClient.ConfigureNusClient(nusWC);
|
||||
nusClient.UseLocalFiles = localuse.Checked;
|
||||
|
||||
// Get placement directory early...
|
||||
string titledirectory;
|
||||
if (titleversion.Text == "")
|
||||
titledirectory = Path.Combine(CURRENT_DIR, titleid);
|
||||
else
|
||||
titledirectory = Path.Combine(CURRENT_DIR, (titleid + "v" + title_v));
|
||||
|
||||
if (script_mode)
|
||||
titledirectory = Path.Combine(CURRENT_DIR, "output_" + Path.GetFileNameWithoutExtension(script_filename));
|
||||
|
||||
downloadstartbtn.Text = "Prerequisites: (0/2)";
|
||||
|
||||
// Windows 7? Windows 7 Taskbar progress can be used.
|
||||
if (IsWin7())
|
||||
dlprogress.ShowInTaskbar = true;
|
||||
|
||||
// Download TMD before the rest...
|
||||
string tmdfull = "tmd";
|
||||
if (String.IsNullOrEmpty(title_v) == false)
|
||||
tmdfull += "." + title_v;
|
||||
|
||||
byte[] tmd;
|
||||
try
|
||||
{
|
||||
tmd = nusClient.DownloadTMD(titleid, title_v, activeNusUrl);
|
||||
//DownloadNUSFile(titleid, tmdfull, titledirectory, 0, wiimode);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WriteStatus("Download Failed: " + tmdfull);
|
||||
WriteStatus(" - Reason: " + ex.Message.ToString().Replace("The remote server returned an error: ", ""));
|
||||
SetEnableforDownload(true);
|
||||
downloadstartbtn.Text = "Start NUS Download!";
|
||||
dlprogress.Value = 0;
|
||||
DeleteTitleDirectory();
|
||||
return;
|
||||
}
|
||||
downloadstartbtn.Text = "Prerequisites: (1/2)";
|
||||
dlprogress.Value = 50;
|
||||
|
||||
if (script_mode)
|
||||
{
|
||||
packbox.Checked = true;
|
||||
packbox_CheckedChanged("scripted", new EventArgs());
|
||||
keepenccontents.Checked = false;
|
||||
wadnamebox.Enabled = false;
|
||||
}
|
||||
|
||||
// Download cetk (ticket) after tmd...
|
||||
//bool ticket_exists = true;
|
||||
byte[] cetkbuf = new byte[0];
|
||||
try
|
||||
{
|
||||
cetkbuf = nusClient.DownloadTicket(titleid, activeNusUrl);
|
||||
//DownloadNUSFile(titleid, "cetk", titledirectory, 0, wiimode);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//WriteStatus("Download Failed: cetk");
|
||||
|
||||
|
||||
WriteStatus("Ticket not found! Continuing, however WAD packing and decryption are not possible!");
|
||||
WriteStatus(" - Reason: " +
|
||||
ex.Message.ToString().Replace("The remote server returned an error: ", ""));
|
||||
|
||||
packbox.Checked = false;
|
||||
decryptbox.Checked = false;
|
||||
WAD_Saveas_Filename = String.Empty;
|
||||
//ticket_exists = false;
|
||||
}
|
||||
|
||||
downloadstartbtn.Text = "Prerequisites: (2/2)";
|
||||
dlprogress.Value = 100;
|
||||
|
||||
//byte[] cetkbuf = new byte[0];
|
||||
byte[] titlekey = new byte[0];
|
||||
if ((cetkbuf.Length > 0) == true)
|
||||
{
|
||||
// Create ticket file holder
|
||||
//cetkbuf = FileLocationToByteArray(Path.Combine(titledirectory, "cetk"));
|
||||
|
||||
// Obtain TitleKey
|
||||
titlekey = new byte[16];
|
||||
if (decryptbox.Checked == true)
|
||||
{
|
||||
// Load TitleKey into it's byte[]
|
||||
// It is currently encrypted...
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
titlekey[i] = cetkbuf[0x1BF + i];
|
||||
}
|
||||
|
||||
// IV (TITLEID+0000s)
|
||||
byte[] iv = new byte[16];
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
iv[i] = cetkbuf[0x1DC + i];
|
||||
}
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
iv[i + 8] = 0x00;
|
||||
}
|
||||
|
||||
// Standard/Korea Common Key
|
||||
byte[] keyBytes;
|
||||
if (cetkbuf[0x01F1] == 0x01)
|
||||
{
|
||||
WriteStatus("Key Type: Korean");
|
||||
keyBytes = libWiiSharp.CommonKey.GetKoreanKey();
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteStatus("Key Type: Standard");
|
||||
if (wiimode)
|
||||
keyBytes = libWiiSharp.CommonKey.GetStandardKey();
|
||||
else
|
||||
keyBytes = File.ReadAllBytes(Path.Combine(CURRENT_DIR, "dsikey.bin"));
|
||||
}
|
||||
|
||||
initCrypt(iv, keyBytes);
|
||||
|
||||
WriteStatus("Title Key: " + DisplayBytes(Decrypt(titlekey), ""));
|
||||
titlekey = Decrypt(titlekey);
|
||||
}
|
||||
}
|
||||
|
||||
// Read the tmd as a stream...
|
||||
//byte[] tmd = FileLocationToByteArray(Path.Combine(titledirectory, tmdfull));
|
||||
|
||||
if ((cetkbuf.Length > 0) == true)
|
||||
{
|
||||
// Locate Certs **************************************
|
||||
if (!(CertsValid()))
|
||||
{
|
||||
WriteStatus("Searching for certs...");
|
||||
ScanForCerts(tmd);
|
||||
ScanForCerts(cetkbuf);
|
||||
}
|
||||
else
|
||||
WriteStatus("Using cached certs...");
|
||||
// /Locate Cert **************************************
|
||||
}
|
||||
|
||||
// Read Title Version...
|
||||
if (String.IsNullOrEmpty(title_v))
|
||||
{
|
||||
string tmdversion = "";
|
||||
for (int x = 476; x < 478; x++)
|
||||
{
|
||||
tmdversion += MakeProperLength(ConvertToHex(Convert.ToString(tmd[x])));
|
||||
}
|
||||
titleversion.Text = Convert.ToString(int.Parse(tmdversion, System.Globalization.NumberStyles.HexNumber));
|
||||
title_v = tmdversion;
|
||||
}
|
||||
|
||||
//Read System Version (Needed IOS)
|
||||
string sysversion = IOSNeededFromTMD(tmd);
|
||||
if (sysversion != "0")
|
||||
WriteStatus("Requires: IOS" + sysversion);
|
||||
|
||||
// Read Content #...
|
||||
string contentstrnum = "";
|
||||
for (int x = 478; x < 480; x++)
|
||||
{
|
||||
contentstrnum += TrimLeadingZeros(Convert.ToString(tmd[x]));
|
||||
}
|
||||
WriteStatus("Content #: " + contentstrnum);
|
||||
downloadstartbtn.Text = String.Format("Content: (0/{0})", contentstrnum);
|
||||
dlprogress.Value = 0;
|
||||
|
||||
// Gather information...
|
||||
string[] tmdcontents = GetContentNames(tmd, Convert.ToInt32(contentstrnum));
|
||||
string[] tmdsizes = GetContentSizes(tmd, Convert.ToInt32(contentstrnum));
|
||||
byte[] tmdhashes = GetContentHashes(tmd, Convert.ToInt32(contentstrnum));
|
||||
byte[] tmdindices = GetContentIndices(tmd, Convert.ToInt32(contentstrnum));
|
||||
|
||||
// Progress bar total size tally info...
|
||||
float totalcontentsize = 0;
|
||||
float currentcontentlocation = 0;
|
||||
for (int i = 0; i < tmdsizes.Length; i++)
|
||||
{
|
||||
totalcontentsize += int.Parse(tmdsizes[i], System.Globalization.NumberStyles.HexNumber);
|
||||
}
|
||||
WriteStatus("Total Size: " + (long)totalcontentsize + " bytes");
|
||||
|
||||
// Write files from NUS out...
|
||||
File.WriteAllBytes(Path.Combine(titledirectory, tmdfull), tmd);
|
||||
File.WriteAllBytes(Path.Combine(titledirectory, "cetk"), cetkbuf);
|
||||
|
||||
// Download each content
|
||||
for (int i = 0; i < tmdcontents.Length; i++)
|
||||
{
|
||||
byte[] contbuf;
|
||||
try
|
||||
{
|
||||
// If it exists we leave it...
|
||||
if ((nusClient.UseLocalFiles) && (File.Exists(Path.Combine(titledirectory, tmdcontents[i]))))
|
||||
{
|
||||
WriteStatus("Leaving local " + tmdcontents[i] + ".");
|
||||
contbuf = File.ReadAllBytes(Path.Combine(titledirectory, tmdcontents[i]));
|
||||
}
|
||||
else
|
||||
{
|
||||
contbuf = nusClient.DownloadSingleContent(titleid, title_v, tmdcontents[i], activeNusUrl);
|
||||
//DownloadNUSFile(titleid, tmdcontents[i], titledirectory,
|
||||
//int.Parse(tmdsizes[i], System.Globalization.NumberStyles.HexNumber), wiimode);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WriteStatus("Download Failed: " + tmdcontents[i]);
|
||||
WriteStatus(" - Reason: " +
|
||||
ex.Message.ToString().Replace("The remote server returned an error: ", ""));
|
||||
SetEnableforDownload(true);
|
||||
downloadstartbtn.Text = "Start NUS Download!";
|
||||
dlprogress.Value = 0;
|
||||
DeleteTitleDirectory();
|
||||
return;
|
||||
}
|
||||
|
||||
if (File.Exists(Path.Combine(titledirectory, tmdcontents[i])) == false)
|
||||
File.WriteAllBytes(Path.Combine(titledirectory, tmdcontents[i]), contbuf);
|
||||
|
||||
// Progress reporting advances...
|
||||
downloadstartbtn.Text = String.Format("Content: ({0} / {1})", (i + 1), contentstrnum);
|
||||
currentcontentlocation += int.Parse(tmdsizes[i], System.Globalization.NumberStyles.HexNumber);
|
||||
|
||||
// Decrypt stuff...
|
||||
if (decryptbox.Checked == true)
|
||||
{
|
||||
// Create content file holder
|
||||
//byte[] contbuf =
|
||||
//FileLocationToByteArray(Path.Combine(titledirectory, tmdcontents[i]));
|
||||
|
||||
// IV (00+IDX+more000)
|
||||
byte[] iv = new byte[16];
|
||||
for (int x = 0; x < 16; x++)
|
||||
{
|
||||
iv[x] = 0x00;
|
||||
}
|
||||
iv[1] = tmdindices[i];
|
||||
|
||||
initCrypt(iv, titlekey);
|
||||
|
||||
|
||||
|
||||
FileStream decfs =
|
||||
new FileStream(
|
||||
Path.Combine(titledirectory, (tmdcontents[i] + ".app")),
|
||||
FileMode.Create);
|
||||
decfs.Write(Decrypt(contbuf), 0, int.Parse(tmdsizes[i], System.Globalization.NumberStyles.HexNumber));
|
||||
decfs.Close();
|
||||
WriteStatus(" - Decrypted: " + tmdcontents[i] + ".app");
|
||||
|
||||
// Hash Check...
|
||||
byte[] hash = new byte[20];
|
||||
for (int x = 0; x < 20; x++)
|
||||
{
|
||||
hash[x] = tmdhashes[(i*20) + x];
|
||||
}
|
||||
byte[] deccont = Decrypt(contbuf);
|
||||
Array.Resize(ref deccont, int.Parse(tmdsizes[i], System.Globalization.NumberStyles.HexNumber));
|
||||
if ((Convert.ToBase64String(ComputeSHA(deccont))) == Convert.ToBase64String(hash))
|
||||
{
|
||||
WriteStatus(" - Hash Check: Pass");
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteStatus(" - Hash Check: Fail");
|
||||
WriteStatus(" - True Hash: " + DisplayBytes(hash, ""));
|
||||
WriteStatus(" - You Have: " + DisplayBytes(ComputeSHA(Decrypt(contbuf)), ""));
|
||||
}
|
||||
}
|
||||
|
||||
dlprogress.Value = Convert.ToInt32(((currentcontentlocation/totalcontentsize)*100));
|
||||
WriteStatus("Uhoh, the download bombed: " + ex.Message + " ):");
|
||||
}
|
||||
|
||||
WriteStatus("NUS Download Finished.");
|
||||
|
||||
if ((packbox.Checked == true) && (wiimode == true))
|
||||
{
|
||||
PackWAD(titleid, tmdfull, titledirectory);
|
||||
} */
|
||||
}
|
||||
|
||||
void nusClient_Debug(object sender, libWiiSharp.MessageEventArgs e)
|
||||
@ -3172,67 +2863,6 @@ namespace NUS_Downloader
|
||||
return Bytes;
|
||||
}*/
|
||||
|
||||
/*private void commonKeykeybinToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
BackgroundWorker keyFetcher = new BackgroundWorker();
|
||||
keyFetcher.DoWork += new DoWorkEventHandler(RetrieveCommonKey);
|
||||
keyFetcher.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CommonKey_Retrieved);
|
||||
keyFetcher.RunWorkerAsync("key.bin");
|
||||
}
|
||||
|
||||
private void koreanKeykkeybinToolStripMenuItem_Click(object sender, EventArgs e)
|
||||
{
|
||||
BackgroundWorker keyFetcher = new BackgroundWorker();
|
||||
keyFetcher.DoWork += new DoWorkEventHandler(RetrieveCommonKey);
|
||||
keyFetcher.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CommonKey_Retrieved);
|
||||
keyFetcher.RunWorkerAsync("kkey.bin");
|
||||
}
|
||||
|
||||
void CommonKey_Retrieved(object sender, RunWorkerCompletedEventArgs e)
|
||||
{
|
||||
BootChecks();
|
||||
}
|
||||
|
||||
void RetrieveCommonKey(object sender, DoWorkEventArgs e)
|
||||
{
|
||||
WriteStatus(String.Format("Retrieving Key ({0})...", e.Argument.ToString()));
|
||||
|
||||
// Begin the epic grab for freedom
|
||||
WebClient keyclient = new WebClient();
|
||||
|
||||
// Proxy
|
||||
keyclient = ConfigureWithProxy(keyclient);
|
||||
|
||||
string htmlwithkey;
|
||||
if (e.Argument.ToString() == "key.bin")
|
||||
{
|
||||
htmlwithkey = keyclient.DownloadString("http://hackmii.com/2008/04/keys-keys-keys/");
|
||||
|
||||
// Find our start point
|
||||
string startofcommonkey = "Common key (";
|
||||
htmlwithkey = htmlwithkey.Substring(
|
||||
htmlwithkey.IndexOf(startofcommonkey) + startofcommonkey.Length, 32);
|
||||
WriteStatus(" - Got the Common Key as: ");
|
||||
WriteStatus(" " + htmlwithkey);
|
||||
byte[] commonkey = HexStringToByteArray(htmlwithkey);
|
||||
WriteCommonKey("key.bin", commonkey);
|
||||
}
|
||||
else if (e.Argument.ToString() == "kkey.bin")
|
||||
{
|
||||
htmlwithkey = keyclient.DownloadString("http://hackmii.com/2008/09/korean-wii/");
|
||||
|
||||
// Find our start point
|
||||
string startofcommonkey = "those.</p>";
|
||||
htmlwithkey = htmlwithkey.Substring(
|
||||
htmlwithkey.IndexOf(startofcommonkey) + startofcommonkey.Length + 6, 47);
|
||||
htmlwithkey = htmlwithkey.Replace(" ", "");
|
||||
WriteStatus(" - Got the Korean Key as: ");
|
||||
WriteStatus(" " + htmlwithkey);
|
||||
byte[] commonkey = HexStringToByteArray(htmlwithkey);
|
||||
WriteCommonKey("kkey.bin", commonkey);
|
||||
}
|
||||
}*/
|
||||
|
||||
string CombinePaths(params string[] parts)
|
||||
{
|
||||
string result = String.Empty;
|
||||
|
@ -310,6 +310,7 @@ namespace libWiiSharp
|
||||
byte[] tmdFileWithCerts;
|
||||
try
|
||||
{
|
||||
fireDebug(titleUrl + "/" + tmdFile);
|
||||
tmdFileWithCerts = wcNus.DownloadData(titleUrl + tmdFile);
|
||||
tmd = TMD.Load(tmdFileWithCerts);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user