aboutsummaryrefslogtreecommitdiff
path: root/ShareGuard.Web/Components/Pages
diff options
context:
space:
mode:
Diffstat (limited to 'ShareGuard.Web/Components/Pages')
-rw-r--r--ShareGuard.Web/Components/Pages/Admin.razor119
1 files changed, 119 insertions, 0 deletions
diff --git a/ShareGuard.Web/Components/Pages/Admin.razor b/ShareGuard.Web/Components/Pages/Admin.razor
new file mode 100644
index 0000000..3884630
--- /dev/null
+++ b/ShareGuard.Web/Components/Pages/Admin.razor
@@ -0,0 +1,119 @@
+@page "/admin/"
+@using ShareGuard.Web.DbModels
+@rendermode InteractiveServer
+
+<PageTitle>ShareGuard Admin</PageTitle>
+
+<h2>ShareGuard Admin</h2>
+
+<h5>Generate Share-Link</h5>
+<div class="field label round border">
+ <input type="text" placeholder=" " @onchange="args => _newName = args.Value!.ToString()!">
+ <label>Name</label>
+</div>
+<div class="field label round border">
+ <input type="text" placeholder=" " @onchange="args => _newIpAddress = args.Value!.ToString()!">
+ <label>IP Address(es)</label>
+</div>
+<button class="border small-round large small-elevate" style="margin-top: 1em;" @onclick="GenerateNewLink">
+ <i>add_link</i>
+ <span>Generate</span>
+</button>
+
+<h5>WG-Quick Template</h5>
+<p>You can use the following placeholders:
+ <br/><code>{ip}</code> for the peer's ip address(es)
+ <br/><code>{publicKey}</code> for the peer's public key
+ <br/><code>{privateKey}</code> for the peer's private key</p>
+<div class="field extra border">
+ <textarea @onchange="args => _template = args.Value!.ToString()!">@_template</textarea>
+ <output>This template will be generated for your users.</output>
+</div>
+<button class="border small-round large small-elevate" style="margin-top: 1em;" @onclick="SaveTemplate">
+ <i>save</i>
+ <span>Save</span>
+</button>
+
+@if (_links != null)
+{
+ <h5>History</h5>
+ <table class="border medium-space">
+ <thead>
+ <tr>
+ <th>Name</th>
+ <th>Token</th>
+ <th>Client Public Key</th>
+ <th>IP Address(es)</th>
+ <th>Actions</th>
+ </tr>
+ </thead>
+ <tbody>
+ @foreach (var link in _links)
+ {
+ <tr>
+ <td>@link.Name</td>
+ <td>@link.Token</td>
+ @if (link.PeerPublicKey == null)
+ {
+ <td>Pending</td>
+ }
+ else
+ {
+ <td><code>@link.PeerPublicKey</code></td>
+ }
+ <td>@link.IpAddress</td>
+ <td>
+ <button class="small-round tertiary small" @onclick="() => DeleteLink(link)">Delete link</button>
+ </td>
+ </tr>
+ }
+ </tbody>
+ </table>
+}
+
+@code
+{
+ private const string TemplateFilePath = "./wg-quick-template.txt";
+ private string? _template;
+
+ private void SaveTemplate()
+ {
+ if (_template != null)
+ {
+ File.WriteAllText(TemplateFilePath, _template);
+ }
+ }
+
+ private List<Link>? _links;
+
+ protected override void OnInitialized()
+ {
+ if (File.Exists(TemplateFilePath)) _template = File.ReadAllText(TemplateFilePath);
+ using var db = new Database();
+ _links = db.Links.ToList();
+ }
+
+ private string _newName = "";
+ private string _newIpAddress = "";
+
+ private void GenerateNewLink()
+ {
+ using var db = new Database();
+ db.Links.Add(new Link
+ {
+ Name = _newName,
+ IpAddress = _newIpAddress,
+ Token = Link.GenerateToken(db)
+ });
+ db.SaveChanges();
+ OnInitialized();
+ }
+
+ private void DeleteLink(Link link)
+ {
+ using var db = new Database();
+ db.Remove(link);
+ db.SaveChanges();
+ OnInitialized();
+ }
+}