Join codes need no passkey touch and carry only public values (genesis fingerprint, owner credentials, installer hashes). Nodes pin the genesis and owners at enrollment and only follow passkey-signed operator set versions. The panel's server key is listed in the set; pinned nodes require its signature and run the control link under AES-256-GCM. Password sessions carry no capabilities. The updater adopts a next_key from a signed manifest. Bump version to 0.2.0. [CI SKIP]
33 lines
1.6 KiB
C#
33 lines
1.6 KiB
C#
using System.Reflection;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
|
|
namespace MoShiro.Backend.Api;
|
|
|
|
/// <summary>
|
|
/// 一行安装脚本:<c>packaging/install/</c> 下的 <c>install.sh</c> 和 <c>install.ps1</c> 作为嵌入资源打进 Backend,<b>原样返回,不替换任何值</b>。
|
|
/// 静态,所以它的 SHA-256 在一个版本内固定:CI 构建时算出来写进签名的发布清单,面板给的命令先核对哈希再执行(docs/access.md 第 15 节)。
|
|
/// 角色、面板地址、代码都走命令里的环境变量。
|
|
/// </summary>
|
|
public static class InstallScripts
|
|
{
|
|
public const string Sh = "install.sh";
|
|
public const string Ps1 = "install.ps1";
|
|
|
|
/// <summary>CI 的发布公钥(<c>packaging/update/release-key.pub.pem</c>):脚本里内置的就是这一把,测试核对两边一致。</summary>
|
|
public static string ReleaseKey() => Read("release-key.pub.pem").Trim();
|
|
|
|
public static string Script(string resource) => Read(resource);
|
|
|
|
/// <summary>脚本内容的 SHA-256(小写十六进制,按 UTF-8 字节)。</summary>
|
|
public static string Sha256(string resource) => Convert.ToHexStringLower(SHA256.HashData(Encoding.UTF8.GetBytes(Read(resource))));
|
|
|
|
private static string Read(string resource)
|
|
{
|
|
using Stream stream = typeof(InstallScripts).Assembly.GetManifestResourceStream(resource)
|
|
?? throw new InvalidOperationException($"the embedded resource {resource} is missing");
|
|
using var reader = new StreamReader(stream);
|
|
return reader.ReadToEnd();
|
|
}
|
|
}
|