using System.Text;
using System.Text.RegularExpressions;
namespace SQLInsight.Core.Configuration;
///
/// db/permissions/grant-least-privilege.sql, ready to run for one login: what SQLInsight Web shows for a newly added
/// server. SQLInsight never runs it on the customer's server itself; a sysadmin runs it.
///
public static partial class GrantScript
{
/// The script with filled in. For a Windows login it starts by creating the login if it is missing.
public static string For(string login, bool windowsLogin)
{
ArgumentException.ThrowIfNullOrWhiteSpace(login);
var literal = "N'" + login.Trim().Replace("'", "''", StringComparison.Ordinal) + "'";
var script = LoginPlaceholder().Replace(Template(), _ => "SET @LoginName = " + literal + ";", 1);
var header = new StringBuilder();
header.Append("/* Kør som sysadmin på instansen. Giver SQLInsight-agentens login ").Append(InComment(login.Trim())).Append(" de rettigheder, den skal bruge. */\r\n");
if (windowsLogin)
{
header.Append("IF SUSER_ID(").Append(literal).Append(") IS NULL\r\n CREATE LOGIN ")
.Append(Quote(login.Trim())).Append(" FROM WINDOWS;\r\nGO\r\n");
}
else
{
header.Append("/* SQL-login: opret det først, hvis det mangler, fx\r\n CREATE LOGIN ").Append(InComment(Quote(login.Trim())))
.Append(" WITH PASSWORD = N'…', CHECK_POLICY = ON; */\r\n");
}
return header.Append(script).ToString();
}
/// The script as shipped, with the placeholder login.
public static string Template()
{
using var stream = typeof(GrantScript).Assembly.GetManifestResourceStream("SQLInsight.Core.grant-least-privilege.sql")
?? throw new InvalidOperationException("grant-least-privilege.sql mangler i programmet.");
using var reader = new StreamReader(stream);
return reader.ReadToEnd();
}
private static string InComment(string text) => text.Replace("*/", "* /", StringComparison.Ordinal).Replace("/*", "/ *", StringComparison.Ordinal);
private static string Quote(string name) => "[" + name.Replace("]", "]]", StringComparison.Ordinal) + "]";
[GeneratedRegex(@"SET @LoginName = N'[^']*';[^\r\n]*")]
private static partial Regex LoginPlaceholder();
}