Example #1
0
        private bool ValidateReceivedData(FileTransferIn fileTransfer, out string ErrorMessage)
        {
            ErrorMessage = "";
            switch (fileTransfer.FileType)
            {
            case FileTransferType.Submarine:
                System.IO.Stream stream;
                try
                {
                    stream = SaveUtil.DecompressFiletoStream(fileTransfer.FilePath);
                }
                catch (Exception e)
                {
                    ErrorMessage = "Loading received submarine \"" + fileTransfer.FileName + "\" failed! {" + e.Message + "}";
                    return(false);
                }

                if (stream == null)
                {
                    ErrorMessage = "Decompressing received submarine file \"" + fileTransfer.FilePath + "\" failed!";
                    return(false);
                }

                try
                {
                    stream.Position = 0;

                    XmlReaderSettings settings = new XmlReaderSettings
                    {
                        DtdProcessing = DtdProcessing.Prohibit,
                        IgnoreProcessingInstructions = true
                    };

                    using (var reader = XmlReader.Create(stream, settings))
                    {
                        while (reader.Read())
                        {
                            ;
                        }
                    }
                }
                catch
                {
                    stream?.Close();
                    ErrorMessage = "Parsing file \"" + fileTransfer.FilePath + "\" failed! The file may not be a valid submarine file.";
                    return(false);
                }

                stream?.Close();
                break;

            case FileTransferType.CampaignSave:
                try
                {
                    var files = SaveUtil.EnumerateContainedFiles(fileTransfer.FilePath);
                    foreach (var file in files)
                    {
                        string extension = Path.GetExtension(file);
                        if ((!extension.Equals(".sub", StringComparison.OrdinalIgnoreCase) &&
                             !file.Equals("gamesession.xml")) ||
                            file.CleanUpPathCrossPlatform(correctFilenameCase: false).Contains('/'))
                        {
                            ErrorMessage = $"Found unexpected file in \"{fileTransfer.FileName}\"! ({file})";
                            return(false);
                        }
                    }
                }
                catch (Exception e)
                {
                    ErrorMessage = $"Loading received campaign save \"{fileTransfer.FileName}\" failed! {{{e.Message}}}";
                    return(false);
                }
                break;
            }

            return(true);
        }