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(); }