Пример #1
0
        public void MergeContentRuleTest()
        {
            string oid      = "1.2.840.113556.1.5.24";
            string name     = "remoteMailRecipient";
            string other    = "SUP top STRUCTURAL";
            string aux      = "( bootableDevice $ domainRelatedObject )";
            string must     = "( cn $ info $ labeledURI )";
            string may      = "( remoteSource $ secretary $ showInAddressBook $ telephoneNumber $ userCertificate )";
            string newOcStr = "( 1.2.840.113556.1.5.24 NAME 'remoteMailRecipient' SUP top STRUCTURAL AUX ( bootableDevice $ domainRelatedObject ) MUST ( cn $ info $ labeledURI ) MAY ( remoteSource $ secretary $ showInAddressBook $ telephoneNumber $ userCertificate ) )";

            ObjectClass oc = new ObjectClass(ocStr);
            ContentRule cr = new ContentRule(crStr);

            oc.MergeContentRule(cr);

            Assert.AreEqual(oid, oc.oid);
            Assert.AreEqual(name, oc.name);
            Assert.AreEqual(other, oc.other);
            Assert.AreEqual(aux, oc.aux);
            Assert.AreEqual(must, oc.must);
            Assert.AreEqual(may, oc.may);
            Assert.AreEqual(newOcStr, oc.ToString());
        }
Пример #2
0
        private static void Main(string[] args)
        {
            Console.WriteLine("CNUSPacker v0.01-c2w by NicoAICP [C# Port of NUSPacker by timogus, FIX94]\n\n");

            string inputPath  = "input";
            string outputPath = "output";

            string encryptionKey  = "";
            string encryptKeyWith = "";

            long  titleID      = 0x0L;
            long  osVersion    = 0x000500101000400AL;
            uint  appType      = 0x80000000;
            short titleVersion = 0;

            bool skipXMLReading = false;

            if (args.Length == 0)
            {
                Console.WriteLine("Please provide at least the in and out parameter");

                ShowHelp();
                Environment.Exit(0);
            }

            for (int i = 0; i < args.Length; i++)
            {
                if (args[i].Equals("-in"))
                {
                    if (args.Length > i + 1)
                    {
                        inputPath = args[i + 1];
                        i++;
                    }
                }
                else if (args[i].Equals("-out"))
                {
                    if (args.Length > i + 1)
                    {
                        outputPath = args[i + 1];
                        Directory.CreateDirectory(outputPath);
                        i++;
                    }
                }
                else if (args[i].Equals("-tID"))
                {
                    if (args.Length > i + 1)
                    {
                        titleID = Convert.ToInt64(args[i + 1], 16);
                        i++;
                    }
                }
                else if (args[i].Equals("-OSVersion"))
                {
                    if (args.Length > i + 1)
                    {
                        osVersion = Convert.ToInt64(args[i + 1], 16);
                        i++;
                    }
                }
                else if (args[i].Equals("-appType"))
                {
                    if (args.Length > i + 1)
                    {
                        appType = Convert.ToUInt32(args[i + 1], 16);
                        i++;
                    }
                }
                else if (args[i].Equals("-titleVersion"))
                {
                    if (args.Length > i + 1)
                    {
                        titleVersion = Convert.ToInt16(args[i + 1], 16);
                        i++;
                    }
                }
                else if (args[i].Equals("-encryptionKey"))
                {
                    if (args.Length > i + 1)
                    {
                        encryptionKey = args[i + 1];
                        i++;
                    }
                }
                else if (args[i].Equals("-encryptKeyWith"))
                {
                    if (args.Length > i + 1)
                    {
                        encryptKeyWith = args[i + 1];
                        i++;
                    }
                }
                else if (args[i].Equals("-skipXMLParsing"))
                {
                    skipXMLReading = true;
                }
                else if (args[i].Equals("-help"))
                {
                    ShowHelp();
                    Environment.Exit(0);
                }
            }

            if (!Directory.Exists(Path.Combine(inputPath, "code")) || !Directory.Exists(Path.Combine(inputPath, "content")) || !Directory.Exists(Path.Combine(inputPath, "meta")))
            {
                Console.WriteLine($"Invalid input dir ({Path.GetFullPath(inputPath)}): It's missing either the code, content or meta folder");
                Environment.Exit(0);
            }

            AppXMLInfo appinfo = new AppXMLInfo
            {
                titleID      = titleID,
                groupID      = (short)(titleID >> 8),
                appType      = appType,
                osVersion    = osVersion,
                titleVersion = titleVersion
            };

            if (encryptionKey == "" || encryptionKey.Length != 32)
            {
                encryptionKey = Settings.defaultEncryptionKey;
                Console.WriteLine($"Empty or invalid encryption provided. Will use {encryptionKey} instead");
            }
            Console.WriteLine();
            if (encryptKeyWith == "" || encryptKeyWith.Length != 32)
            {
                Console.WriteLine($"Will try to load the encryptionWith key from the file \"{Settings.encryptWithFile}\".");
                encryptKeyWith = LoadEncryptWithKey();
            }
            if (encryptKeyWith == "" || encryptKeyWith.Length != 32)
            {
                encryptKeyWith = Settings.defaultEncryptWithKey;
                Console.WriteLine("!!!!!!!!!!!!!!!!!!!!!!!!");
                Console.WriteLine($"WARNING:Empty or invalid encryptWith key provided. Will use {encryptKeyWith} instead!");
                Console.WriteLine("!!!!!!!!!!!!!!!!!!!!!!!!");
            }
            Console.WriteLine();

            string appxml = inputPath + Settings.pathToAppXml;

            if (!skipXMLReading)
            {
                Console.WriteLine("Parsing app.xml in code folder (use the -skipXMLParsing argument to disable it)");
                try
                {
                    XMLParser parser = new XMLParser();
                    parser.LoadDocument(appxml);

                    appinfo = parser.GetAppXMLInfo();
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Error while parsing the app.xml from path \"{Settings.pathToAppXml}\".");
                    Console.WriteLine(e.Message);
                }
            }
            else
            {
                Console.WriteLine("Skipped app.xml parsing");
            }

            short content_group = appinfo.groupID;

            titleID = appinfo.titleID;

            long parentID = titleID & ~0x0000000F00000000L;

            Console.WriteLine();
            Console.WriteLine("Configuration:");
            Console.WriteLine($"Input            : \"{inputPath}\"");
            Console.WriteLine($"Output           : \"{outputPath}\"");

            Console.WriteLine($"TitleID          : {appinfo.titleID:X16}");
            Console.WriteLine($"GroupID          : {appinfo.groupID:X4}");
            Console.WriteLine($"ParentID         : {parentID:X16}");
            Console.WriteLine($"AppType          : {appinfo.appType:X8}");
            Console.WriteLine($"OSVersion        : {appinfo.osVersion:X16}");
            Console.WriteLine($"Encryption key   : {encryptionKey}");
            Console.WriteLine($"Encrypt key with : {encryptKeyWith}");
            Console.WriteLine();

            Console.WriteLine("---");
            List <ContentRule> rules = ContentRule.GetCommonRules(content_group, parentID);

            Directory.CreateDirectory(Settings.tmpDir);

            NusPackageConfiguration config = new NusPackageConfiguration(inputPath, appinfo, new Key(encryptionKey), new Key(encryptKeyWith), rules);
            NUSpackage nuspackage          = NUSPackageFactory.CreateNewPackage(config);

            nuspackage.PackContents(outputPath);
            nuspackage.PrintTicketInfos();

            Utils.DeleteDir(Settings.tmpDir);
        }