Restore SEBPatch
This commit is contained in:
@@ -0,0 +1,168 @@
|
||||
/*
|
||||
* Copyright (c) 2024 ETH Zürich, IT Services
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using System.Text;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
using SafeExamBrowser.Configuration.DataFormats;
|
||||
using SafeExamBrowser.Configuration.Contracts;
|
||||
using SafeExamBrowser.Configuration.Contracts.Cryptography;
|
||||
using SafeExamBrowser.Configuration.Contracts.DataCompression;
|
||||
using SafeExamBrowser.Configuration.Contracts.DataFormats;
|
||||
using SafeExamBrowser.Logging.Contracts;
|
||||
|
||||
namespace SafeExamBrowser.Configuration.UnitTests.DataFormats
|
||||
{
|
||||
[TestClass]
|
||||
public class BinaryParserTests
|
||||
{
|
||||
private Mock<IDataCompressor> compressor;
|
||||
private Mock<IHashAlgorithm> hashAlgorithm;
|
||||
private Mock<ILogger> logger;
|
||||
private Mock<IPasswordEncryption> passwordEncryption;
|
||||
private Mock<IPublicKeyEncryption> publicKeyEncryption;
|
||||
private Mock<IPublicKeyEncryption> symmetricEncryption;
|
||||
private Mock<IDataParser> xmlParser;
|
||||
|
||||
private BinaryParser sut;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
compressor = new Mock<IDataCompressor>();
|
||||
hashAlgorithm = new Mock<IHashAlgorithm>();
|
||||
logger = new Mock<ILogger>();
|
||||
passwordEncryption = new Mock<IPasswordEncryption>();
|
||||
publicKeyEncryption = new Mock<IPublicKeyEncryption>();
|
||||
symmetricEncryption = new Mock<IPublicKeyEncryption>();
|
||||
xmlParser = new Mock<IDataParser>();
|
||||
|
||||
xmlParser.Setup(p => p.TryParse(It.IsAny<Stream>(), It.IsAny<PasswordParameters>())).Returns(new ParseResult { Status = LoadStatus.Success });
|
||||
|
||||
sut = new BinaryParser(compressor.Object, hashAlgorithm.Object, logger.Object, passwordEncryption.Object, publicKeyEncryption.Object, symmetricEncryption.Object, xmlParser.Object);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlyDetectValidPrefixes()
|
||||
{
|
||||
var data = new byte[123];
|
||||
var pswd = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.Password).Concat(data).ToArray());
|
||||
var pwcc = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PasswordConfigureClient).Concat(data).ToArray());
|
||||
var plnd = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PlainData).Concat(data).ToArray());
|
||||
var pkhs = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PublicKey).Concat(data).ToArray());
|
||||
var phsk = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PublicKeySymmetric).Concat(data).ToArray());
|
||||
|
||||
Assert.IsFalse(sut.CanParse(null));
|
||||
Assert.IsFalse(sut.CanParse(new MemoryStream()));
|
||||
Assert.IsFalse(sut.CanParse(new MemoryStream(data)));
|
||||
|
||||
Assert.IsTrue(sut.CanParse(pswd));
|
||||
Assert.IsTrue(sut.CanParse(pwcc));
|
||||
Assert.IsTrue(sut.CanParse(plnd));
|
||||
Assert.IsTrue(sut.CanParse(pkhs));
|
||||
Assert.IsTrue(sut.CanParse(phsk));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlyParsePasswordBlock()
|
||||
{
|
||||
var data = new byte[123];
|
||||
var decrypted = default(Stream);
|
||||
var pswd = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.Password).Concat(data).ToArray()) as Stream;
|
||||
|
||||
passwordEncryption.Setup(p => p.Decrypt(It.IsAny<Stream>(), It.Is<string>(s => s == "wrong"), out decrypted)).Returns(LoadStatus.PasswordNeeded);
|
||||
passwordEncryption.Setup(p => p.Decrypt(It.IsAny<Stream>(), It.Is<string>(s => s == "correct"), out decrypted)).Returns(LoadStatus.Success);
|
||||
|
||||
var result = sut.TryParse(pswd);
|
||||
|
||||
Assert.AreEqual(LoadStatus.PasswordNeeded, result.Status);
|
||||
|
||||
result = sut.TryParse(pswd, new PasswordParameters { Password = "wrong" });
|
||||
|
||||
Assert.AreEqual(LoadStatus.PasswordNeeded, result.Status);
|
||||
|
||||
result = sut.TryParse(pswd, new PasswordParameters { Password = "correct" });
|
||||
|
||||
passwordEncryption.Verify(p => p.Decrypt(It.IsAny<Stream>(), It.IsAny<string>(), out decrypted), Times.AtLeastOnce);
|
||||
xmlParser.Verify(p => p.TryParse(It.Is<Stream>(s => s == decrypted), It.IsAny<PasswordParameters>()), Times.Once);
|
||||
publicKeyEncryption.VerifyNoOtherCalls();
|
||||
symmetricEncryption.VerifyNoOtherCalls();
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlyParsePlainDataBlock()
|
||||
{
|
||||
var data = new byte[123];
|
||||
var plnd = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PlainData).Concat(data).ToArray());
|
||||
|
||||
compressor.Setup(c => c.Decompress(It.IsAny<Stream>())).Returns(plnd);
|
||||
compressor.Setup(c => c.Peek(It.IsAny<Stream>(), It.IsAny<int>())).Returns(Encoding.UTF8.GetBytes(BinaryBlock.PlainData));
|
||||
compressor.Setup(c => c.IsCompressed(It.IsAny<Stream>())).Returns(true);
|
||||
|
||||
var result = sut.TryParse(plnd);
|
||||
|
||||
compressor.Verify(c => c.IsCompressed(It.IsAny<Stream>()), Times.AtLeastOnce);
|
||||
compressor.Verify(c => c.Decompress(It.IsAny<Stream>()), Times.AtLeastOnce);
|
||||
xmlParser.Verify(x => x.TryParse(It.IsAny<Stream>(), It.IsAny<PasswordParameters>()), Times.Once);
|
||||
passwordEncryption.VerifyNoOtherCalls();
|
||||
publicKeyEncryption.VerifyNoOtherCalls();
|
||||
symmetricEncryption.VerifyNoOtherCalls();
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlyParsePublicKeyBlock()
|
||||
{
|
||||
var data = new byte[123];
|
||||
var certificate = default(X509Certificate2);
|
||||
var decrypted = default(Stream);
|
||||
var pswd = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.Password).Concat(data).ToArray()) as Stream;
|
||||
var pkhs = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PublicKey).Concat(data).ToArray());
|
||||
|
||||
passwordEncryption.Setup(p => p.Decrypt(It.IsAny<Stream>(), It.IsAny<string>(), out decrypted)).Returns(LoadStatus.Success);
|
||||
publicKeyEncryption.Setup(p => p.Decrypt(It.IsAny<Stream>(), out pswd, out certificate)).Returns(LoadStatus.Success);
|
||||
|
||||
var result = sut.TryParse(pkhs, new PasswordParameters { Password = "blubb" });
|
||||
|
||||
publicKeyEncryption.Verify(p => p.Decrypt(It.IsAny<Stream>(), out decrypted, out certificate), Times.Once);
|
||||
passwordEncryption.Verify(p => p.Decrypt(It.IsAny<Stream>(), It.Is<string>(s => s == "blubb"), out decrypted), Times.Once);
|
||||
symmetricEncryption.VerifyNoOtherCalls();
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustOnlyParseIfFormatSupported()
|
||||
{
|
||||
var data = new byte[123];
|
||||
var certificate = default(X509Certificate2);
|
||||
var decrypted = default(Stream);
|
||||
var pswd = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.Password).Concat(data).ToArray()) as Stream;
|
||||
var pwcc = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PasswordConfigureClient).Concat(data).ToArray());
|
||||
var plnd = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PlainData).Concat(data).ToArray());
|
||||
var pkhs = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PublicKey).Concat(data).ToArray());
|
||||
var phsk = new MemoryStream(Encoding.UTF8.GetBytes(BinaryBlock.PublicKeySymmetric).Concat(data).ToArray());
|
||||
|
||||
passwordEncryption.Setup(p => p.Decrypt(It.IsAny<Stream>(), It.IsAny<string>(), out decrypted)).Returns(LoadStatus.Success);
|
||||
publicKeyEncryption.Setup(p => p.Decrypt(It.IsAny<Stream>(), out pswd, out certificate)).Returns(LoadStatus.Success);
|
||||
symmetricEncryption.Setup(p => p.Decrypt(It.IsAny<Stream>(), out pswd, out certificate)).Returns(LoadStatus.Success);
|
||||
|
||||
Assert.AreEqual(LoadStatus.InvalidData, sut.TryParse(new MemoryStream(data)).Status);
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, sut.TryParse(pswd, new PasswordParameters { Password = "blubb" })?.Status);
|
||||
Assert.AreEqual(LoadStatus.Success, sut.TryParse(pwcc, new PasswordParameters { Password = "blubb" })?.Status);
|
||||
Assert.AreEqual(LoadStatus.Success, sut.TryParse(plnd).Status);
|
||||
Assert.AreEqual(LoadStatus.Success, sut.TryParse(pkhs, new PasswordParameters { Password = "blubb" }).Status);
|
||||
Assert.AreEqual(LoadStatus.Success, sut.TryParse(phsk, new PasswordParameters { Password = "blubb" }).Status);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright (c) 2024 ETH Zürich, IT Services
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
using SafeExamBrowser.Configuration.DataFormats;
|
||||
using SafeExamBrowser.Configuration.Contracts;
|
||||
using SafeExamBrowser.Configuration.Contracts.Cryptography;
|
||||
using SafeExamBrowser.Configuration.Contracts.DataCompression;
|
||||
using SafeExamBrowser.Configuration.Contracts.DataFormats;
|
||||
using SafeExamBrowser.Logging.Contracts;
|
||||
|
||||
namespace SafeExamBrowser.Configuration.UnitTests.DataFormats
|
||||
{
|
||||
[TestClass]
|
||||
public class BinarySerializerTests
|
||||
{
|
||||
private Mock<IDataCompressor> compressor;
|
||||
private Mock<ILogger> logger;
|
||||
private Mock<IPasswordEncryption> passwordEncryption;
|
||||
private Mock<IPublicKeyEncryption> publicKeyEncryption;
|
||||
private Mock<IPublicKeyEncryption> symmetricEncryption;
|
||||
private Mock<IDataSerializer> xmlSerializer;
|
||||
private SerializeResult xmlResult;
|
||||
|
||||
private BinarySerializer sut;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
compressor = new Mock<IDataCompressor>();
|
||||
logger = new Mock<ILogger>();
|
||||
passwordEncryption = new Mock<IPasswordEncryption>();
|
||||
publicKeyEncryption = new Mock<IPublicKeyEncryption>();
|
||||
symmetricEncryption = new Mock<IPublicKeyEncryption>();
|
||||
xmlResult = new SerializeResult { Data = new MemoryStream(), Status = SaveStatus.Success };
|
||||
xmlSerializer = new Mock<IDataSerializer>();
|
||||
|
||||
compressor.Setup(c => c.Compress(It.IsAny<Stream>())).Returns(new MemoryStream());
|
||||
xmlSerializer.Setup(x => x.TrySerialize(It.IsAny<IDictionary<string, object>>(), It.IsAny<EncryptionParameters>())).Returns(xmlResult);
|
||||
|
||||
sut = new BinarySerializer(compressor.Object, logger.Object, passwordEncryption.Object, publicKeyEncryption.Object, symmetricEncryption.Object, xmlSerializer.Object);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustOnlySupportBinaryFormat()
|
||||
{
|
||||
var values = Enum.GetValues(typeof(FormatType));
|
||||
|
||||
foreach (var value in values)
|
||||
{
|
||||
if (value is FormatType format && format != FormatType.Binary)
|
||||
{
|
||||
Assert.IsFalse(sut.CanSerialize(format));
|
||||
}
|
||||
}
|
||||
|
||||
Assert.IsTrue(sut.CanSerialize(FormatType.Binary));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlySerializePlainDataBlock()
|
||||
{
|
||||
var data = new Dictionary<string, object>();
|
||||
var result = sut.TrySerialize(data);
|
||||
|
||||
compressor.Verify(c => c.Compress(It.IsAny<Stream>()), Times.Exactly(2));
|
||||
xmlSerializer.Verify(x => x.TrySerialize(It.Is<IDictionary<string, object>>(d => d == data), It.Is<EncryptionParameters>(e => e == null)), Times.Once);
|
||||
passwordEncryption.VerifyNoOtherCalls();
|
||||
publicKeyEncryption.VerifyNoOtherCalls();
|
||||
symmetricEncryption.VerifyNoOtherCalls();
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlySerializePasswordBlock()
|
||||
{
|
||||
var encrypted = new MemoryStream() as Stream;
|
||||
var data = new Dictionary<string, object>();
|
||||
var encryption = new PasswordParameters { Password = "blubb" };
|
||||
|
||||
passwordEncryption.Setup(p => p.Encrypt(It.IsAny<Stream>(), It.IsAny<string>(), out encrypted)).Returns(SaveStatus.Success);
|
||||
|
||||
var result = sut.TrySerialize(data, encryption);
|
||||
|
||||
compressor.Verify(c => c.Compress(It.IsAny<Stream>()), Times.Exactly(2));
|
||||
passwordEncryption.Verify(p => p.Encrypt(It.IsAny<Stream>(), It.Is<string>(s => s == encryption.Password), out encrypted), Times.Once);
|
||||
xmlSerializer.Verify(x => x.TrySerialize(It.Is<IDictionary<string, object>>(d => d == data), It.Is<EncryptionParameters>(e => e == null)), Times.Once);
|
||||
publicKeyEncryption.VerifyNoOtherCalls();
|
||||
symmetricEncryption.VerifyNoOtherCalls();
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlySerializePublicKeyBlock()
|
||||
{
|
||||
var encrypted = new MemoryStream() as Stream;
|
||||
var data = new Dictionary<string, object>();
|
||||
var encryption = new PublicKeyParameters
|
||||
{
|
||||
InnerEncryption = new PasswordParameters { Password = "test" },
|
||||
SymmetricEncryption = false
|
||||
};
|
||||
|
||||
passwordEncryption.Setup(p => p.Encrypt(It.IsAny<Stream>(), It.IsAny<string>(), out encrypted)).Returns(SaveStatus.Success);
|
||||
publicKeyEncryption.Setup(p => p.Encrypt(It.IsAny<Stream>(), It.IsAny<X509Certificate2>(), out encrypted)).Returns(SaveStatus.Success);
|
||||
|
||||
var result = sut.TrySerialize(data, encryption);
|
||||
|
||||
compressor.Verify(c => c.Compress(It.IsAny<Stream>()), Times.Exactly(2));
|
||||
passwordEncryption.Verify(p => p.Encrypt(It.IsAny<Stream>(), It.Is<string>(s => s == encryption.InnerEncryption.Password), out encrypted), Times.Once);
|
||||
publicKeyEncryption.Verify(p => p.Encrypt(It.IsAny<Stream>(), It.IsAny<X509Certificate2>(), out encrypted), Times.Once);
|
||||
xmlSerializer.Verify(x => x.TrySerialize(It.Is<IDictionary<string, object>>(d => d == data), It.Is<EncryptionParameters>(e => e == null)), Times.Once);
|
||||
symmetricEncryption.VerifyNoOtherCalls();
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlySerializePublicKeySymmetricBlock()
|
||||
{
|
||||
var encrypted = new MemoryStream() as Stream;
|
||||
var data = new Dictionary<string, object>();
|
||||
var encryption = new PublicKeyParameters
|
||||
{
|
||||
SymmetricEncryption = true
|
||||
};
|
||||
|
||||
symmetricEncryption.Setup(p => p.Encrypt(It.IsAny<Stream>(), It.IsAny<X509Certificate2>(), out encrypted)).Returns(SaveStatus.Success);
|
||||
|
||||
var result = sut.TrySerialize(data, encryption);
|
||||
|
||||
compressor.Verify(c => c.Compress(It.IsAny<Stream>()), Times.Exactly(2));
|
||||
symmetricEncryption.Verify(p => p.Encrypt(It.IsAny<Stream>(), It.IsAny<X509Certificate2>(), out encrypted), Times.Once);
|
||||
xmlSerializer.Verify(x => x.TrySerialize(It.Is<IDictionary<string, object>>(d => d == data), It.Is<EncryptionParameters>(e => e == null)), Times.Once);
|
||||
passwordEncryption.VerifyNoOtherCalls();
|
||||
publicKeyEncryption.VerifyNoOtherCalls();
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,239 @@
|
||||
/*
|
||||
* Copyright (c) 2024 ETH Zürich, IT Services
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
using SafeExamBrowser.Configuration.ConfigurationData;
|
||||
using SafeExamBrowser.Configuration.Contracts;
|
||||
using SafeExamBrowser.Configuration.Contracts.DataCompression;
|
||||
using SafeExamBrowser.Configuration.Contracts.DataFormats;
|
||||
using SafeExamBrowser.Configuration.DataFormats;
|
||||
using SafeExamBrowser.Logging.Contracts;
|
||||
|
||||
namespace SafeExamBrowser.Configuration.UnitTests.DataFormats
|
||||
{
|
||||
[TestClass]
|
||||
public class XmlParserTests
|
||||
{
|
||||
private Mock<IDataCompressor> compressor;
|
||||
private Mock<ILogger> logger;
|
||||
private XmlParser sut;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
compressor = new Mock<IDataCompressor>();
|
||||
logger = new Mock<ILogger>();
|
||||
|
||||
sut = new XmlParser(compressor.Object, logger.Object);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustOnlyParseXmlData()
|
||||
{
|
||||
Assert.IsFalse(sut.CanParse(null));
|
||||
Assert.IsFalse(sut.CanParse(new MemoryStream(Encoding.UTF8.GetBytes("<key>someKey</key><value>1</value>"))));
|
||||
Assert.IsFalse(sut.CanParse(new MemoryStream(Encoding.UTF8.GetBytes("<html></html>"))));
|
||||
Assert.IsFalse(sut.CanParse(new MemoryStream(Encoding.UTF8.GetBytes("<?x"))));
|
||||
Assert.IsTrue(sut.CanParse(new MemoryStream(Encoding.UTF8.GetBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"))));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlyParseXml()
|
||||
{
|
||||
var data = LoadTestData();
|
||||
var result = sut.TryParse(data);
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
Assert.AreEqual(FormatType.Xml, result.Format);
|
||||
Assert.IsNull(result.Encryption);
|
||||
Assert.IsNotNull(result.RawData);
|
||||
|
||||
Assert.AreEqual("test123", result.RawData["someString"]);
|
||||
Assert.AreEqual(9876, result.RawData["someInteger"]);
|
||||
Assert.IsTrue(Convert.FromBase64String("/5vlF76sb+5vgkhjiNTOn7l1SN3Ho2UAMJD3TtLo49M=").SequenceEqual(result.RawData["someData"] as IEnumerable<byte>));
|
||||
Assert.AreEqual(true, result.RawData["someBoolean"]);
|
||||
Assert.AreEqual(false, result.RawData["anotherBoolean"]);
|
||||
Assert.AreEqual(12.34, result.RawData["someReal"]);
|
||||
Assert.AreEqual(new DateTime(2019, 02, 20, 12, 30, 00, 123), result.RawData["someDate"]);
|
||||
|
||||
var array = result.RawData["anArray"] as List<object>;
|
||||
var dictOne = array[0] as Dictionary<string, object>;
|
||||
var dictTwo = array[1] as Dictionary<string, object>;
|
||||
var dictThree = array[2] as Dictionary<string, object>;
|
||||
|
||||
Assert.AreEqual(3, dictOne["dictOneKeyOne"]);
|
||||
Assert.AreEqual(4, dictOne["dictOneKeyTwo"]);
|
||||
Assert.AreEqual(5, dictTwo["dictTwoKeyOne"]);
|
||||
Assert.AreEqual(6, dictTwo["dictTwoKeyTwo"]);
|
||||
Assert.AreEqual(7, dictThree["dictThreeKeyOne"]);
|
||||
Assert.AreEqual(1, (dictThree["dictThreeKeyTwo"] as List<object>)[0]);
|
||||
Assert.AreEqual(2, (dictThree["dictThreeKeyTwo"] as List<object>)[1]);
|
||||
Assert.AreEqual(3, (dictThree["dictThreeKeyTwo"] as List<object>)[2]);
|
||||
Assert.AreEqual(4, (dictThree["dictThreeKeyTwo"] as List<object>)[3]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlyParseTestSettings()
|
||||
{
|
||||
var data = LoadTestSettings();
|
||||
var result = sut.TryParse(data);
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
Assert.AreEqual(FormatType.Xml, result.Format);
|
||||
Assert.IsNull(result.Encryption);
|
||||
Assert.IsNotNull(result.RawData);
|
||||
|
||||
Assert.AreEqual(true, result.RawData[Keys.Browser.AllowConfigurationDownloads]);
|
||||
Assert.AreEqual(0, result.RawData[Keys.ConfigurationFile.ConfigurationPurpose]);
|
||||
Assert.AreEqual("https://safeexambrowser.org/start", result.RawData[Keys.Browser.StartUrl]);
|
||||
Assert.AreEqual(true, result.RawData[Keys.Keyboard.EnableF5]);
|
||||
Assert.IsInstanceOfType(result.RawData[Keys.Network.Certificates.EmbeddedCertificates], typeof(List<object>));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCheckForRootDictionary()
|
||||
{
|
||||
var xml = "<?xml version=\"1.0\"?><plist></plist>";
|
||||
var xml2 = "<?xml version=\"1.0\"?><plist><key>someKey</key><integer>5</integer></plist>";
|
||||
var xml3 = "<?xml version=\"1.0\"?><plist><dictionary></dictionary></plist>";
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
|
||||
|
||||
Assert.AreEqual(LoadStatus.InvalidData, result.Status);
|
||||
|
||||
result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml2)));
|
||||
Assert.AreEqual(LoadStatus.InvalidData, result.Status);
|
||||
|
||||
result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml3)));
|
||||
Assert.AreEqual(LoadStatus.InvalidData, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustDecompressDataIfCompressed()
|
||||
{
|
||||
var bytes = Encoding.UTF8.GetBytes("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
|
||||
var data = LoadTestData();
|
||||
var stream = new MemoryStream(Encoding.UTF8.GetBytes("some incorrect data here"));
|
||||
|
||||
compressor.Setup(c => c.Peek(It.IsAny<Stream>(), It.IsAny<int>())).Returns<Stream, int>((d, c) => bytes.Take(c).ToArray());
|
||||
compressor.Setup(c => c.IsCompressed(It.IsAny<Stream>())).Returns(true);
|
||||
|
||||
Assert.IsTrue(sut.CanParse(stream));
|
||||
|
||||
compressor.Verify(c => c.IsCompressed(It.IsAny<Stream>()), Times.Once);
|
||||
compressor.Verify(c => c.Peek(It.IsAny<Stream>(), It.IsAny<int>()), Times.Once);
|
||||
|
||||
compressor.Setup(c => c.Decompress(It.IsAny<Stream>())).Returns(data);
|
||||
|
||||
var result = sut.TryParse(stream);
|
||||
|
||||
compressor.Verify(c => c.IsCompressed(It.IsAny<Stream>()), Times.AtLeast(2));
|
||||
compressor.Verify(c => c.Decompress(It.IsAny<Stream>()), Times.Once);
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustParseEmptyXml()
|
||||
{
|
||||
var xml = "<?xml version=\"1.0\"?><plist><dict></dict></plist>";
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
Assert.AreEqual(0, result.RawData.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustDetectInvalidKey()
|
||||
{
|
||||
var xml = "<?xml version=\"1.0\"?><plist><dict><nokey>blubb</nokey><true /></dict></plist>";
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
|
||||
|
||||
Assert.AreEqual(LoadStatus.InvalidData, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustDetectInvalidValueType()
|
||||
{
|
||||
var xml = "<?xml version=\"1.0\"?><plist><dict><key>blubb</key><globb>1234</globb></dict></plist>";
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
|
||||
|
||||
Assert.AreEqual(LoadStatus.InvalidData, result.Status);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustAllowEmptyArray()
|
||||
{
|
||||
var xml = "<?xml version=\"1.0\"?><plist><dict><key>value</key><array /></dict></plist>";
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
Assert.IsInstanceOfType(result.RawData["value"], typeof(IList<object>));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustAbortParsingArrayOnError()
|
||||
{
|
||||
var xml = "<?xml version=\"1.0\"?><plist><dict><key>value</key><array><blobb /></array></dict></plist>";
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
|
||||
|
||||
Assert.AreEqual(LoadStatus.InvalidData, result.Status);
|
||||
Assert.AreEqual(0, result.RawData.Count);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustAllowEmptyDictionary()
|
||||
{
|
||||
var xml = "<?xml version=\"1.0\"?><plist><dict><key>value</key><dict /></dict></plist>";
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
Assert.IsInstanceOfType(result.RawData["value"], typeof(IDictionary<string, object>));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustMapNullForEmptyStringElement()
|
||||
{
|
||||
var xml = "<?xml version=\"1.0\"?><plist><dict><key>value</key><string /></dict></plist>";
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes(xml)));
|
||||
|
||||
Assert.AreEqual(LoadStatus.Success, result.Status);
|
||||
Assert.IsNull(result.RawData["value"]);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustNotFailWithWrongData()
|
||||
{
|
||||
var result = sut.TryParse(new MemoryStream(Encoding.UTF8.GetBytes("some random text")));
|
||||
|
||||
Assert.AreEqual(LoadStatus.InvalidData, result.Status);
|
||||
}
|
||||
|
||||
private Stream LoadTestData()
|
||||
{
|
||||
var path = $"{nameof(SafeExamBrowser)}.{nameof(Configuration)}.{nameof(UnitTests)}.{nameof(DataFormats)}.XmlTestData.xml";
|
||||
var data = Assembly.GetAssembly(GetType()).GetManifestResourceStream(path);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
private Stream LoadTestSettings()
|
||||
{
|
||||
var path = $"{nameof(SafeExamBrowser)}.{nameof(Configuration)}.{nameof(UnitTests)}.{nameof(DataFormats)}.XmlTestSettings.xml";
|
||||
var data = Assembly.GetAssembly(GetType()).GetManifestResourceStream(path);
|
||||
|
||||
return data;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,287 @@
|
||||
/*
|
||||
* Copyright (c) 2024 ETH Zürich, IT Services
|
||||
*
|
||||
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
using Moq;
|
||||
using SafeExamBrowser.Configuration.DataFormats;
|
||||
using SafeExamBrowser.Configuration.Contracts;
|
||||
using SafeExamBrowser.Configuration.Contracts.DataFormats;
|
||||
using SafeExamBrowser.Logging.Contracts;
|
||||
|
||||
namespace SafeExamBrowser.Configuration.UnitTests.DataFormats
|
||||
{
|
||||
[TestClass]
|
||||
public class XmlSerializerTests
|
||||
{
|
||||
private Mock<ILogger> logger;
|
||||
private XmlSerializer sut;
|
||||
|
||||
[TestInitialize]
|
||||
public void Initialize()
|
||||
{
|
||||
logger = new Mock<ILogger>();
|
||||
sut = new XmlSerializer(logger.Object);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustOnlySupportXmlFormat()
|
||||
{
|
||||
var values = Enum.GetValues(typeof(FormatType));
|
||||
|
||||
foreach (var value in values)
|
||||
{
|
||||
if (value is FormatType format && format != FormatType.Xml)
|
||||
{
|
||||
Assert.IsFalse(sut.CanSerialize(format));
|
||||
}
|
||||
}
|
||||
|
||||
Assert.IsTrue(sut.CanSerialize(FormatType.Xml));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlySerializeEmptyDictionary()
|
||||
{
|
||||
var result = sut.TrySerialize(new Dictionary<string, object>());
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
Assert.IsNotNull(result.Data);
|
||||
Assert.AreNotEqual(0, result.Data.Length);
|
||||
|
||||
result.Data.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
var xml = XDocument.Load(result.Data);
|
||||
|
||||
Assert.AreEqual(XmlElement.Root, xml.Root.Name);
|
||||
Assert.AreEqual(1, xml.Root.Nodes().Count());
|
||||
Assert.AreEqual(XmlElement.Dictionary, (xml.Root.Nodes().First() as XElement).Name);
|
||||
Assert.IsTrue((xml.Root.Nodes().First() as XElement).IsEmpty);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlySerializeDictionary()
|
||||
{
|
||||
var data = new Dictionary<string, object> { { "abc", 1 }, { "def", 2 }, { "ghi", 3 } };
|
||||
var result = sut.TrySerialize(data);
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
|
||||
result.Data.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
var xml = XDocument.Load(result.Data);
|
||||
|
||||
Assert.AreEqual(XmlElement.Root, xml.Root.Name);
|
||||
Assert.AreEqual(1, xml.Root.Nodes().Count());
|
||||
|
||||
var dictionary = xml.Root.Nodes().First() as XElement;
|
||||
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(0) as XElement).Name);
|
||||
Assert.AreEqual("abc", (dictionary.Nodes().ElementAt(0) as XElement).Value);
|
||||
Assert.AreEqual(XmlElement.Integer, (dictionary.Nodes().ElementAt(1) as XElement).Name);
|
||||
Assert.AreEqual(1, Convert.ToInt32((dictionary.Nodes().ElementAt(1) as XElement).Value));
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(2) as XElement).Name);
|
||||
Assert.AreEqual("def", (dictionary.Nodes().ElementAt(2) as XElement).Value);
|
||||
Assert.AreEqual(XmlElement.Integer, (dictionary.Nodes().ElementAt(3) as XElement).Name);
|
||||
Assert.AreEqual(2, Convert.ToInt32((dictionary.Nodes().ElementAt(3) as XElement).Value));
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(4) as XElement).Name);
|
||||
Assert.AreEqual("ghi", (dictionary.Nodes().ElementAt(4) as XElement).Value);
|
||||
Assert.AreEqual(XmlElement.Integer, (dictionary.Nodes().ElementAt(5) as XElement).Name);
|
||||
Assert.AreEqual(3, Convert.ToInt32((dictionary.Nodes().ElementAt(5) as XElement).Value));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlySerializeArray()
|
||||
{
|
||||
var data = new Dictionary<string, object> { { "test", new List<object> { 12.3, 23.4, 34.5, 45.6 } } };
|
||||
var result = sut.TrySerialize(data);
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
|
||||
result.Data.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
var xml = XDocument.Load(result.Data);
|
||||
|
||||
Assert.AreEqual(XmlElement.Root, xml.Root.Name);
|
||||
Assert.AreEqual(1, xml.Root.Nodes().Count());
|
||||
|
||||
var dictionary = xml.Root.Nodes().First() as XElement;
|
||||
var array = dictionary.Nodes().ElementAt(1) as XElement;
|
||||
var values = array.Nodes().Cast<XElement>();
|
||||
|
||||
Assert.AreEqual(XmlElement.Array, array.Name);
|
||||
Assert.AreEqual(4, values.Count());
|
||||
Assert.AreEqual(XmlElement.Real, values.ElementAt(0).Name);
|
||||
Assert.AreEqual(12.3, Convert.ToDouble(values.ElementAt(0).Value));
|
||||
Assert.AreEqual(XmlElement.Real, values.ElementAt(1).Name);
|
||||
Assert.AreEqual(23.4, Convert.ToDouble(values.ElementAt(1).Value));
|
||||
Assert.AreEqual(XmlElement.Real, values.ElementAt(2).Name);
|
||||
Assert.AreEqual(34.5, Convert.ToDouble(values.ElementAt(2).Value));
|
||||
Assert.AreEqual(XmlElement.Real, values.ElementAt(3).Name);
|
||||
Assert.AreEqual(45.6, Convert.ToDouble(values.ElementAt(3).Value));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorrectlySerializeNestedCollections()
|
||||
{
|
||||
var data = new Dictionary<string, object>
|
||||
{
|
||||
{ "ArrayOfDictionaries",
|
||||
new List<object>
|
||||
{
|
||||
new Dictionary<string, object>
|
||||
{
|
||||
{ "Double", 123.5 },
|
||||
{ "Text", "Hello World!" }
|
||||
},
|
||||
new Dictionary<string, object>
|
||||
{
|
||||
{ "InnerArray", new List<object> { 6, 7, 8 } }
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "SomeDictionary", new Dictionary<string, object> { { "blubb", 123 } } },
|
||||
{ "SomeArray", new List<object> { 1, 2, 3, 4 } }
|
||||
};
|
||||
var result = sut.TrySerialize(data);
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
|
||||
result.Data.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
var xml = XDocument.Load(result.Data);
|
||||
|
||||
Assert.AreEqual(XmlElement.Root, xml.Root.Name);
|
||||
Assert.AreEqual(1, xml.Root.Nodes().Count());
|
||||
|
||||
var dictionary = xml.Root.Nodes().First() as XElement;
|
||||
var arrayOfDictionaries = dictionary.Nodes().ElementAt(1) as XElement;
|
||||
var innerDictionaryOne = arrayOfDictionaries.Nodes().ElementAt(0) as XElement;
|
||||
var innerDictionaryTwo = arrayOfDictionaries.Nodes().ElementAt(1) as XElement;
|
||||
var innerDictionaryTwoArray = innerDictionaryTwo.Nodes().ElementAt(1) as XElement;
|
||||
var someArray = dictionary.Nodes().ElementAt(3) as XElement;
|
||||
var someDictionary = dictionary.Nodes().ElementAt(5) as XElement;
|
||||
|
||||
Assert.AreEqual(6, dictionary.Nodes().Count());
|
||||
Assert.AreEqual(2, arrayOfDictionaries.Nodes().Count());
|
||||
Assert.AreEqual(4, someArray.Nodes().Count());
|
||||
Assert.AreEqual(2, someDictionary.Nodes().Count());
|
||||
|
||||
Assert.AreEqual(XmlElement.Array, arrayOfDictionaries.Name);
|
||||
Assert.AreEqual(XmlElement.Array, someArray.Name);
|
||||
Assert.AreEqual(XmlElement.Dictionary, someDictionary.Name);
|
||||
|
||||
Assert.AreEqual(123.5, Convert.ToDouble((innerDictionaryOne.Nodes().ElementAt(1) as XElement).Value));
|
||||
Assert.AreEqual("Hello World!", (innerDictionaryOne.Nodes().ElementAt(3) as XElement).Value);
|
||||
Assert.AreEqual(6, Convert.ToInt32((innerDictionaryTwoArray.Nodes().ElementAt(0) as XElement).Value));
|
||||
Assert.AreEqual(7, Convert.ToInt32((innerDictionaryTwoArray.Nodes().ElementAt(1) as XElement).Value));
|
||||
Assert.AreEqual(8, Convert.ToInt32((innerDictionaryTwoArray.Nodes().ElementAt(2) as XElement).Value));
|
||||
|
||||
Assert.AreEqual(1, Convert.ToInt32((someArray.Nodes().ElementAt(0) as XElement).Value));
|
||||
Assert.AreEqual(2, Convert.ToInt32((someArray.Nodes().ElementAt(1) as XElement).Value));
|
||||
Assert.AreEqual(3, Convert.ToInt32((someArray.Nodes().ElementAt(2) as XElement).Value));
|
||||
Assert.AreEqual(4, Convert.ToInt32((someArray.Nodes().ElementAt(3) as XElement).Value));
|
||||
|
||||
Assert.AreEqual(123, Convert.ToInt32((someDictionary.Nodes().ElementAt(1) as XElement).Value));
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustCorectlySerializeSimpleTypes()
|
||||
{
|
||||
var data = new Dictionary<string, object>
|
||||
{
|
||||
{ "SomeData", Convert.FromBase64String("/5vlF76sb+5vgkhjiNTOn7l1SN3Ho2UAMJD3TtLo49M=") },
|
||||
{ "SomeDate", new DateTime(2019, 02, 20, 14, 30, 00, 123, DateTimeKind.Utc) },
|
||||
{ "SomeBoolean", true },
|
||||
{ "AnotherBoolean", false },
|
||||
{ "SomeInteger", 4567 },
|
||||
{ "SomeDouble", 4567.8912 },
|
||||
{ "SomeText", "Here goes some text" }
|
||||
};
|
||||
var result = sut.TrySerialize(data);
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
|
||||
result.Data.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
var xml = XDocument.Load(result.Data);
|
||||
|
||||
Assert.AreEqual(XmlElement.Root, xml.Root.Name);
|
||||
Assert.AreEqual(1, xml.Root.Nodes().Count());
|
||||
|
||||
var dictionary = xml.Root.Nodes().First() as XElement;
|
||||
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(0) as XElement).Name);
|
||||
Assert.AreEqual("AnotherBoolean", (dictionary.Nodes().ElementAt(0) as XElement).Value);
|
||||
Assert.AreEqual(false, Convert.ToBoolean((dictionary.Nodes().ElementAt(1) as XElement).Name.LocalName));
|
||||
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(2) as XElement).Name);
|
||||
Assert.AreEqual("SomeBoolean", (dictionary.Nodes().ElementAt(2) as XElement).Value);
|
||||
Assert.AreEqual(true, Convert.ToBoolean((dictionary.Nodes().ElementAt(3) as XElement).Name.LocalName));
|
||||
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(4) as XElement).Name);
|
||||
Assert.AreEqual("SomeData", (dictionary.Nodes().ElementAt(4) as XElement).Value);
|
||||
Assert.AreEqual(XmlElement.Data, (dictionary.Nodes().ElementAt(5) as XElement).Name);
|
||||
Assert.AreEqual("/5vlF76sb+5vgkhjiNTOn7l1SN3Ho2UAMJD3TtLo49M=", (dictionary.Nodes().ElementAt(5) as XElement).Value);
|
||||
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(6) as XElement).Name);
|
||||
Assert.AreEqual("SomeDate", (dictionary.Nodes().ElementAt(6) as XElement).Value);
|
||||
Assert.AreEqual(XmlElement.Date, (dictionary.Nodes().ElementAt(7) as XElement).Name);
|
||||
Assert.AreEqual("2019-02-20T14:30:00.123Z", (dictionary.Nodes().ElementAt(7) as XElement).Value);
|
||||
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(8) as XElement).Name);
|
||||
Assert.AreEqual("SomeDouble", (dictionary.Nodes().ElementAt(8) as XElement).Value);
|
||||
Assert.AreEqual(XmlElement.Real, (dictionary.Nodes().ElementAt(9) as XElement).Name);
|
||||
Assert.AreEqual(4567.8912, Convert.ToDouble((dictionary.Nodes().ElementAt(9) as XElement).Value));
|
||||
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(10) as XElement).Name);
|
||||
Assert.AreEqual("SomeInteger", (dictionary.Nodes().ElementAt(10) as XElement).Value);
|
||||
Assert.AreEqual(XmlElement.Integer, (dictionary.Nodes().ElementAt(11) as XElement).Name);
|
||||
Assert.AreEqual(4567, Convert.ToInt32((dictionary.Nodes().ElementAt(11) as XElement).Value));
|
||||
|
||||
Assert.AreEqual(XmlElement.Key, (dictionary.Nodes().ElementAt(12) as XElement).Name);
|
||||
Assert.AreEqual("SomeText", (dictionary.Nodes().ElementAt(12) as XElement).Value);
|
||||
Assert.AreEqual(XmlElement.String, (dictionary.Nodes().ElementAt(13) as XElement).Name);
|
||||
Assert.AreEqual("Here goes some text", (dictionary.Nodes().ElementAt(13) as XElement).Value);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustSerializeNullAsString()
|
||||
{
|
||||
var data = new Dictionary<string, object> { { "test", null } };
|
||||
var result = sut.TrySerialize(data);
|
||||
|
||||
Assert.AreEqual(SaveStatus.Success, result.Status);
|
||||
|
||||
result.Data.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
var xml = XDocument.Load(result.Data);
|
||||
|
||||
Assert.AreEqual(XmlElement.Root, xml.Root.Name);
|
||||
Assert.AreEqual(1, xml.Root.Nodes().Count());
|
||||
|
||||
var dictionary = xml.Root.Nodes().First() as XElement;
|
||||
|
||||
Assert.IsTrue((dictionary.Nodes().ElementAt(1) as XElement).IsEmpty);
|
||||
Assert.AreEqual(XmlElement.String, (dictionary.Nodes().ElementAt(1) as XElement).Name);
|
||||
}
|
||||
|
||||
[TestMethod]
|
||||
public void MustFailForUnknownSimpleType()
|
||||
{
|
||||
var data = new Dictionary<string, object> { { "test", new Tuple<int>(123) } };
|
||||
var result = sut.TrySerialize(data);
|
||||
|
||||
Assert.AreEqual(SaveStatus.InvalidData, result.Status);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<plist>
|
||||
<dict>
|
||||
<key>someString</key>
|
||||
<string>test123</string>
|
||||
<key>someInteger</key>
|
||||
<integer>9876</integer>
|
||||
<key>someData</key>
|
||||
<data>/5vlF76sb+5vgkhjiNTOn7l1SN3Ho2UAMJD3TtLo49M=</data>
|
||||
<key>anArray</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>dictOneKeyOne</key>
|
||||
<integer>3</integer>
|
||||
<key>dictOneKeyTwo</key>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>dictTwoKeyOne</key>
|
||||
<integer>5</integer>
|
||||
<key>dictTwoKeyTwo</key>
|
||||
<integer>6</integer>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>dictThreeKeyOne</key>
|
||||
<integer>7</integer>
|
||||
<key>dictThreeKeyTwo</key>
|
||||
<array>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
<integer>3</integer>
|
||||
<integer>4</integer>
|
||||
</array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>someBoolean</key>
|
||||
<true />
|
||||
<key>anotherBoolean</key>
|
||||
<false />
|
||||
<key>someReal</key>
|
||||
<real>12.34</real>
|
||||
<key>someDate</key>
|
||||
<date>2019-02-20T14:30:00.1230000+02:00</date>
|
||||
</dict>
|
||||
</plist>
|
@@ -0,0 +1,795 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>originatorVersion</key>
|
||||
<string>SEB_Win_2.1.1</string>
|
||||
<key>startURL</key>
|
||||
<string>https://safeexambrowser.org/start</string>
|
||||
<key>startResource</key>
|
||||
<string />
|
||||
<key>sebServerURL</key>
|
||||
<string />
|
||||
<key>hashedAdminPassword</key>
|
||||
<string />
|
||||
<key>allowQuit</key>
|
||||
<true />
|
||||
<key>ignoreExitKeys</key>
|
||||
<true />
|
||||
<key>hashedQuitPassword</key>
|
||||
<string />
|
||||
<key>exitKey1</key>
|
||||
<integer>2</integer>
|
||||
<key>exitKey2</key>
|
||||
<integer>10</integer>
|
||||
<key>exitKey3</key>
|
||||
<integer>5</integer>
|
||||
<key>sebMode</key>
|
||||
<integer>0</integer>
|
||||
<key>browserMessagingSocket</key>
|
||||
<string>ws://localhost:8706</string>
|
||||
<key>browserMessagingPingTime</key>
|
||||
<integer>120000</integer>
|
||||
<key>sebConfigPurpose</key>
|
||||
<integer>0</integer>
|
||||
<key>allowPreferencesWindow</key>
|
||||
<true />
|
||||
<key>useAsymmetricOnlyEncryption</key>
|
||||
<false />
|
||||
<key>browserViewMode</key>
|
||||
<integer>0</integer>
|
||||
<key>mainBrowserWindowWidth</key>
|
||||
<string>100%</string>
|
||||
<key>mainBrowserWindowHeight</key>
|
||||
<string>100%</string>
|
||||
<key>mainBrowserWindowPositioning</key>
|
||||
<integer>1</integer>
|
||||
<key>enableBrowserWindowToolbar</key>
|
||||
<false />
|
||||
<key>hideBrowserWindowToolbar</key>
|
||||
<false />
|
||||
<key>showMenuBar</key>
|
||||
<false />
|
||||
<key>showTaskBar</key>
|
||||
<true />
|
||||
<key>taskBarHeight</key>
|
||||
<integer>40</integer>
|
||||
<key>touchOptimized</key>
|
||||
<false />
|
||||
<key>enableZoomText</key>
|
||||
<true />
|
||||
<key>enableZoomPage</key>
|
||||
<true />
|
||||
<key>zoomMode</key>
|
||||
<integer>0</integer>
|
||||
<key>allowSpellCheck</key>
|
||||
<false />
|
||||
<key>allowDictionaryLookup</key>
|
||||
<false />
|
||||
<key>allowSpellCheckDictionary</key>
|
||||
<array></array>
|
||||
<key>additionalDictionaries</key>
|
||||
<array></array>
|
||||
<key>showReloadButton</key>
|
||||
<true />
|
||||
<key>showTime</key>
|
||||
<true />
|
||||
<key>showInputLanguage</key>
|
||||
<true />
|
||||
<key>enableTouchExit</key>
|
||||
<false />
|
||||
<key>oskBehavior</key>
|
||||
<integer>2</integer>
|
||||
<key>audioControlEnabled</key>
|
||||
<true />
|
||||
<key>audioMute</key>
|
||||
<false />
|
||||
<key>audioVolumeLevel</key>
|
||||
<integer>25</integer>
|
||||
<key>audioSetVolumeLevel</key>
|
||||
<false />
|
||||
<key>browserScreenKeyboard</key>
|
||||
<false />
|
||||
<key>newBrowserWindowByLinkPolicy</key>
|
||||
<integer>2</integer>
|
||||
<key>newBrowserWindowByScriptPolicy</key>
|
||||
<integer>2</integer>
|
||||
<key>newBrowserWindowByLinkBlockForeign</key>
|
||||
<false />
|
||||
<key>newBrowserWindowByScriptBlockForeign</key>
|
||||
<false />
|
||||
<key>newBrowserWindowByLinkWidth</key>
|
||||
<string>1000</string>
|
||||
<key>newBrowserWindowByLinkHeight</key>
|
||||
<string>100%</string>
|
||||
<key>newBrowserWindowByLinkPositioning</key>
|
||||
<integer>2</integer>
|
||||
<key>enablePlugIns</key>
|
||||
<true />
|
||||
<key>enableJava</key>
|
||||
<false />
|
||||
<key>enableJavaScript</key>
|
||||
<true />
|
||||
<key>blockPopUpWindows</key>
|
||||
<false />
|
||||
<key>allowVideoCapture</key>
|
||||
<false />
|
||||
<key>allowAudioCapture</key>
|
||||
<false />
|
||||
<key>allowBrowsingBackForward</key>
|
||||
<false />
|
||||
<key>newBrowserWindowNavigation</key>
|
||||
<true />
|
||||
<key>removeBrowserProfile</key>
|
||||
<false />
|
||||
<key>removeLocalStorage</key>
|
||||
<false />
|
||||
<key>enableSebBrowser</key>
|
||||
<true />
|
||||
<key>browserWindowAllowReload</key>
|
||||
<true />
|
||||
<key>newBrowserWindowAllowReload</key>
|
||||
<true />
|
||||
<key>showReloadWarning</key>
|
||||
<true />
|
||||
<key>newBrowserWindowShowReloadWarning</key>
|
||||
<false />
|
||||
<key>browserUserAgentWinDesktopMode</key>
|
||||
<integer>0</integer>
|
||||
<key>browserUserAgentWinDesktopModeCustom</key>
|
||||
<string />
|
||||
<key>browserUserAgentWinTouchMode</key>
|
||||
<integer>0</integer>
|
||||
<key>browserUserAgentWinTouchModeIPad</key>
|
||||
<string>Mozilla/5.0 (iPad; CPU OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.3 Mobile/15E216 Safari/605.1.15</string>
|
||||
<key>browserUserAgentWinTouchModeCustom</key>
|
||||
<string />
|
||||
<key>browserUserAgent</key>
|
||||
<string />
|
||||
<key>browserUserAgentMac</key>
|
||||
<integer>0</integer>
|
||||
<key>browserUserAgentMacCustom</key>
|
||||
<string />
|
||||
<key>browserWindowTitleSuffix</key>
|
||||
<string />
|
||||
<key>allowDownUploads</key>
|
||||
<true />
|
||||
<key>downloadDirectoryOSX</key>
|
||||
<string>~/Downloads</string>
|
||||
<key>downloadDirectoryWin</key>
|
||||
<string />
|
||||
<key>openDownloads</key>
|
||||
<false />
|
||||
<key>chooseFileToUploadPolicy</key>
|
||||
<integer>0</integer>
|
||||
<key>downloadPDFFiles</key>
|
||||
<false />
|
||||
<key>allowPDFPlugIn</key>
|
||||
<false />
|
||||
<key>downloadAndOpenSebConfig</key>
|
||||
<true />
|
||||
<key>examKeySalt</key>
|
||||
<data>/5vlF76sb+5vgkhjiNTOn7l1SN3Ho2UAMJD3TtLo49M=</data>
|
||||
<key>browserExamKey</key>
|
||||
<string />
|
||||
<key>browserURLSalt</key>
|
||||
<true />
|
||||
<key>sendBrowserExamKey</key>
|
||||
<false />
|
||||
<key>quitURL</key>
|
||||
<string />
|
||||
<key>quitURLConfirm</key>
|
||||
<true />
|
||||
<key>restartExamURL</key>
|
||||
<string />
|
||||
<key>restartExamUseStartURL</key>
|
||||
<false />
|
||||
<key>restartExamText</key>
|
||||
<string />
|
||||
<key>restartExamPasswordProtected</key>
|
||||
<true />
|
||||
<key>additionalResources</key>
|
||||
<array></array>
|
||||
<key>monitorProcesses</key>
|
||||
<true />
|
||||
<key>allowSwitchToApplications</key>
|
||||
<false />
|
||||
<key>allowFlashFullscreen</key>
|
||||
<false />
|
||||
<key>permittedProcesses</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>autostart</key>
|
||||
<true />
|
||||
<key>iconInTaskbar</key>
|
||||
<true />
|
||||
<key>runInBackground</key>
|
||||
<false />
|
||||
<key>allowUserToChooseApp</key>
|
||||
<false />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>title</key>
|
||||
<string>SEB</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>executable</key>
|
||||
<string>firefox.exe</string>
|
||||
<key>originalName</key>
|
||||
<string>firefox.exe</string>
|
||||
<key>path</key>
|
||||
<string>../xulrunner/</string>
|
||||
<key>identifier</key>
|
||||
<string>Firefox</string>
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>arguments</key>
|
||||
<array></array>
|
||||
</dict>
|
||||
</array>
|
||||
<key>prohibitedProcesses</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>join.me</string>
|
||||
<key>originalName</key>
|
||||
<string>join.me</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>RPCSuite</string>
|
||||
<key>originalName</key>
|
||||
<string>RPCSuite</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>RPCService</string>
|
||||
<key>originalName</key>
|
||||
<string>RPCService</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>RemotePCDesktop</string>
|
||||
<key>originalName</key>
|
||||
<string>RemotePCDesktop</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>beamyourscreen-host</string>
|
||||
<key>originalName</key>
|
||||
<string>beamyourscreen-host</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>AeroAdmin</string>
|
||||
<key>originalName</key>
|
||||
<string>AeroAdmin</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>Mikogo-host</string>
|
||||
<key>originalName</key>
|
||||
<string>Mikogo-host</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>chromoting</string>
|
||||
<key>originalName</key>
|
||||
<string>chromoting</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>vncserverui</string>
|
||||
<key>originalName</key>
|
||||
<string>vncserverui</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>vncviewer</string>
|
||||
<key>originalName</key>
|
||||
<string>vncviewer</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>vncserver</string>
|
||||
<key>originalName</key>
|
||||
<string>vncserver</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>TeamViewer</string>
|
||||
<key>originalName</key>
|
||||
<string>TeamViewer</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>GotoMeetingWinStore</string>
|
||||
<key>originalName</key>
|
||||
<string>GotoMeetingWinStore</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>g2mcomm.exe</string>
|
||||
<key>originalName</key>
|
||||
<string>g2mcomm.exe</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>SkypeHost</string>
|
||||
<key>originalName</key>
|
||||
<string>SkypeHost</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
<dict>
|
||||
<key>active</key>
|
||||
<true />
|
||||
<key>currentUser</key>
|
||||
<true />
|
||||
<key>strongKill</key>
|
||||
<false />
|
||||
<key>os</key>
|
||||
<integer>1</integer>
|
||||
<key>executable</key>
|
||||
<string>Skype</string>
|
||||
<key>originalName</key>
|
||||
<string>Skype</string>
|
||||
<key>description</key>
|
||||
<string />
|
||||
<key>identifier</key>
|
||||
<string />
|
||||
<key>windowHandlingProcess</key>
|
||||
<string />
|
||||
<key>user</key>
|
||||
<string />
|
||||
</dict>
|
||||
</array>
|
||||
<key>enableURLFilter</key>
|
||||
<false />
|
||||
<key>enableURLContentFilter</key>
|
||||
<false />
|
||||
<key>URLFilterRules</key>
|
||||
<array></array>
|
||||
<key>URLFilterEnable</key>
|
||||
<false />
|
||||
<key>URLFilterEnableContentFilter</key>
|
||||
<false />
|
||||
<key>blacklistURLFilter</key>
|
||||
<string />
|
||||
<key>whitelistURLFilter</key>
|
||||
<string />
|
||||
<key>urlFilterTrustedContent</key>
|
||||
<true />
|
||||
<key>urlFilterRegex</key>
|
||||
<true />
|
||||
<key>embeddedCertificates</key>
|
||||
<array></array>
|
||||
<key>pinEmbeddedCertificates</key>
|
||||
<false />
|
||||
<key>proxySettingsPolicy</key>
|
||||
<integer>0</integer>
|
||||
<key>proxies</key>
|
||||
<dict>
|
||||
<key>ExceptionsList</key>
|
||||
<array></array>
|
||||
<key>ExcludeSimpleHostnames</key>
|
||||
<false />
|
||||
<key>AutoDiscoveryEnabled</key>
|
||||
<false />
|
||||
<key>AutoConfigurationEnabled</key>
|
||||
<false />
|
||||
<key>AutoConfigurationJavaScript</key>
|
||||
<string />
|
||||
<key>AutoConfigurationURL</key>
|
||||
<string />
|
||||
<key>FTPPassive</key>
|
||||
<true />
|
||||
<key>HTTPEnable</key>
|
||||
<false />
|
||||
<key>HTTPPort</key>
|
||||
<integer>80</integer>
|
||||
<key>HTTPProxy</key>
|
||||
<string />
|
||||
<key>HTTPRequiresPassword</key>
|
||||
<false />
|
||||
<key>HTTPUsername</key>
|
||||
<string />
|
||||
<key>HTTPPassword</key>
|
||||
<string />
|
||||
<key>HTTPSEnable</key>
|
||||
<false />
|
||||
<key>HTTPSPort</key>
|
||||
<integer>443</integer>
|
||||
<key>HTTPSProxy</key>
|
||||
<string />
|
||||
<key>HTTPSRequiresPassword</key>
|
||||
<false />
|
||||
<key>HTTPSUsername</key>
|
||||
<string />
|
||||
<key>HTTPSPassword</key>
|
||||
<string />
|
||||
<key>FTPEnable</key>
|
||||
<false />
|
||||
<key>FTPPort</key>
|
||||
<integer>21</integer>
|
||||
<key>FTPProxy</key>
|
||||
<string />
|
||||
<key>FTPRequiresPassword</key>
|
||||
<false />
|
||||
<key>FTPUsername</key>
|
||||
<string />
|
||||
<key>FTPPassword</key>
|
||||
<string />
|
||||
<key>SOCKSEnable</key>
|
||||
<false />
|
||||
<key>SOCKSPort</key>
|
||||
<integer>1080</integer>
|
||||
<key>SOCKSProxy</key>
|
||||
<string />
|
||||
<key>SOCKSRequiresPassword</key>
|
||||
<false />
|
||||
<key>SOCKSUsername</key>
|
||||
<string />
|
||||
<key>SOCKSPassword</key>
|
||||
<string />
|
||||
<key>RTSPEnable</key>
|
||||
<false />
|
||||
<key>RTSPPort</key>
|
||||
<integer>554</integer>
|
||||
<key>RTSPProxy</key>
|
||||
<string />
|
||||
<key>RTSPRequiresPassword</key>
|
||||
<false />
|
||||
<key>RTSPUsername</key>
|
||||
<string />
|
||||
<key>RTSPPassword</key>
|
||||
<string />
|
||||
</dict>
|
||||
<key>sebServicePolicy</key>
|
||||
<integer>1</integer>
|
||||
<key>allowVirtualMachine</key>
|
||||
<false />
|
||||
<key>allowScreenSharing</key>
|
||||
<false />
|
||||
<key>enablePrivateClipboard</key>
|
||||
<true />
|
||||
<key>createNewDesktop</key>
|
||||
<true />
|
||||
<key>killExplorerShell</key>
|
||||
<false />
|
||||
<key>enableLogging</key>
|
||||
<true />
|
||||
<key>logDirectoryOSX</key>
|
||||
<string>~/Documents</string>
|
||||
<key>logDirectoryWin</key>
|
||||
<string />
|
||||
<key>allowWlan</key>
|
||||
<false />
|
||||
<key>lockOnMessageSocketClose</key>
|
||||
<true />
|
||||
<key>minMacOSVersion</key>
|
||||
<integer>4</integer>
|
||||
<key>enableAppSwitcherCheck</key>
|
||||
<true />
|
||||
<key>forceAppFolderInstall</key>
|
||||
<true />
|
||||
<key>allowUserAppFolderInstall</key>
|
||||
<false />
|
||||
<key>allowSiri</key>
|
||||
<false />
|
||||
<key>allowDictation</key>
|
||||
<false />
|
||||
<key>detectStoppedProcess</key>
|
||||
<true />
|
||||
<key>allowDisplayMirroring</key>
|
||||
<false />
|
||||
<key>allowedDisplaysMaxNumber</key>
|
||||
<integer>1</integer>
|
||||
<key>allowedDisplayBuiltin</key>
|
||||
<true />
|
||||
<key>insideSebEnableSwitchUser</key>
|
||||
<false />
|
||||
<key>insideSebEnableLockThisComputer</key>
|
||||
<false />
|
||||
<key>insideSebEnableChangeAPassword</key>
|
||||
<false />
|
||||
<key>insideSebEnableStartTaskManager</key>
|
||||
<false />
|
||||
<key>insideSebEnableLogOff</key>
|
||||
<false />
|
||||
<key>insideSebEnableShutDown</key>
|
||||
<false />
|
||||
<key>insideSebEnableEaseOfAccess</key>
|
||||
<false />
|
||||
<key>insideSebEnableVmWareClientShade</key>
|
||||
<false />
|
||||
<key>insideSebEnableEnableNetworkConnectionSelector</key>
|
||||
<false />
|
||||
<key>hookKeys</key>
|
||||
<true />
|
||||
<key>enableEsc</key>
|
||||
<true />
|
||||
<key>enableCtrlEsc</key>
|
||||
<false />
|
||||
<key>enableAltEsc</key>
|
||||
<false />
|
||||
<key>enableAltTab</key>
|
||||
<true />
|
||||
<key>enableAltF4</key>
|
||||
<false />
|
||||
<key>enableStartMenu</key>
|
||||
<false />
|
||||
<key>enableRightMouse</key>
|
||||
<true />
|
||||
<key>enablePrintScreen</key>
|
||||
<false />
|
||||
<key>enableAltMouseWheel</key>
|
||||
<false />
|
||||
<key>enableF1</key>
|
||||
<true />
|
||||
<key>enableF2</key>
|
||||
<true />
|
||||
<key>enableF3</key>
|
||||
<true />
|
||||
<key>enableF4</key>
|
||||
<true />
|
||||
<key>enableF5</key>
|
||||
<true />
|
||||
<key>enableF6</key>
|
||||
<true />
|
||||
<key>enableF7</key>
|
||||
<true />
|
||||
<key>enableF8</key>
|
||||
<true />
|
||||
<key>enableF9</key>
|
||||
<true />
|
||||
<key>enableF10</key>
|
||||
<true />
|
||||
<key>enableF11</key>
|
||||
<true />
|
||||
<key>enableF12</key>
|
||||
<true />
|
||||
</dict>
|
||||
</plist>
|
Reference in New Issue
Block a user