Remotely/Agent.Installer.Win/Services/EmbeddedServerDataReader.cs
Jared Goodwin 3f8d63c2c0
Azure Pipelines, Docker, and embedded server data. (#543)
* Add Azure Pipelines yml.

* Remove Server Installer.

* Update Release Build.yml for Azure Pipelines

* Update Release Build.yml

* Update Release Build.yml for Azure Pipelines

* Update Release Build.yml for Azure Pipelines

* Update Release Build.yml for Azure Pipelines

* Update Release Build.yml for Azure Pipelines

* Update signtool.exe

* Update Release Build.yml

* Update Publish.ps1

* Update pipeline and Dockerfile.

* Move docker files.

* Update Dockerfile

* Update Dockerfile

* Update Dockerfile

* Update Dockerfile

* Move files.

* Update Dockerfile

* Update Dockerfile

* Create RewritableStream.

* Finish implementation of rewritable stream and embedded data searcher.

* Remove RelayCode.

* Get branding from default org if orgId is missing.

* Update README.md

* Remove AppConstants.ServerUrl.  Fix main module file path.

* Update submodule.

* Extract embedded data in Program.cs.

* Add logging.  Update submodule.

* Remove size block.  BinaryWriter prefixes size.

* Remove unused async

* Update Immense.RemoteControl

* Update Release Build.yml for Azure Pipelines

* Update Release Build.yml for Azure Pipelines

* Use UpgradeService for determining out of date clients.
2022-12-31 19:10:40 -08:00

77 lines
2.4 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using Remotely.Agent.Installer.Models;
using Remotely.Agent.Installer.Win.Utilities;
using Remotely.Shared;
namespace Remotely.Agent.Installer.Win.Services
{
internal class EmbeddedServerDataReader
{
private readonly JavaScriptSerializer _serializer = new JavaScriptSerializer();
public Task<EmbeddedServerData> TryGetEmbeddedData(string filePath)
{
try
{
if (!File.Exists(filePath))
{
throw new Exception($"File path does not exist: {filePath}");
}
using (var fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
var result = SearchBuffer(fs, AppConstants.EmbeddedImmySignature);
if (result == -1)
{
throw new Exception("Signature not found in file buffer.");
}
fs.Seek(result + AppConstants.EmbeddedImmySignature.Length, SeekOrigin.Begin);
using (var reader = new BinaryReader(fs))
{
var serializedData = reader.ReadString();
return Task.FromResult(_serializer.Deserialize<EmbeddedServerData>(serializedData));
}
}
}
catch (Exception ex)
{
Logger.Write(ex);
return Task.FromResult(EmbeddedServerData.Empty);
}
}
private long SearchBuffer(FileStream fileStream, byte[] matchPattern)
{
var matchSize = matchPattern.Length;
var limit = fileStream.Length - matchSize;
for (var i = 0; i <= limit; i++)
{
var k = 0;
for (; k < matchSize; k++)
{
if (matchPattern[k] != fileStream.ReadByte())
{
break;
}
}
if (k == matchSize)
{
return fileStream.Position - matchSize;
}
}
return -1;
}
}
}