Skip to content

Commit

Permalink
API
Browse files Browse the repository at this point in the history
  • Loading branch information
veniware committed Sep 25, 2024
1 parent 28eb340 commit f84b96a
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 82 deletions.
70 changes: 35 additions & 35 deletions Protest/Front/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ class Api extends List {
this.SetTitle("API links");
this.SetIcon("mono/carabiner.svg");

this.apiLinks = [];

this.InitializeComponents();
this.UpdateAuthorization();

Expand Down Expand Up @@ -77,7 +75,6 @@ class Api extends List {
graph.appendChild(this.canvas);

this.ctx = this.canvas.getContext("2d");

}

ListLinks() {
Expand Down Expand Up @@ -118,10 +115,21 @@ class Api extends List {
}

async SaveLinks() {
const array = [];
for (let key in this.link.data) {
array.push({
guid: this.link.data[key].guid.v,
name: this.link.data[key].name.v,
key: this.link.data[key].key.v,
readonly: true,
permissions: this.link.data[key].permissions.v,
});
}

try {
const response = await fetch("api/save", {
method: "POST",
body: JSON.stringify(this.apiLinks)
body: JSON.stringify(array)
});

if (response.status !== 200) LOADER.HttpErrorHandler(response.status);
Expand Down Expand Up @@ -273,11 +281,6 @@ class Api extends List {
keyInput.value = object.key.v;

const permissions = object.permissions.v & 0xff;

console.log(object.permissions.v);
console.log(permissions);
console.log(permissions & 0x01, permissions & 0x02, permissions & 0x04, permissions & 0x08);

usersInput.checked = permissions & 0x01;
devicesInput.checked = permissions & 0x02;
lifelineInput.checked = permissions & 0x04;
Expand All @@ -302,57 +305,54 @@ class Api extends List {

if (requiredFieldMissing) return;

let index = this.apiLinks.findIndex(link => link.guid === this.args.select);

let permissions = 0;
if (usersInput.checked) permissions |= 0x01;
if (devicesInput.checked) permissions |= 0x02;
if (lifelineInput.checked) permissions |= 0x04;
if (utilitiesInput.checked) permissions |= 0x80;

if (index < 0) {
this.apiLinks.push({
guid: "00000000-0000-0000-0000-000000000000",
name: nameInput.value,
key: keyInput.value,
readonly: true,
permissions: permissions
});

if (object === null) {
const guid = UI.GenerateUuid();
this.link.data[guid] ={
guid: {v:guid},
name: {v:nameInput.value},
key: {v:keyInput.value},
readonly: {v:true},
permissions: {v:permissions}
};
}
else {
this.apiLinks[index] = {
guid: "00000000-0000-0000-0000-000000000000",
name: nameInput.value,
key: keyInput.value,
readonly: true,
permissions: permissions
this.link.data[object.guid.v] = {
guid: {v:object.guid.v},
name: {v:nameInput.value},
key: {v:keyInput.value},
readonly: {v:true},
permissions: {v:permissions}
};
}

await this.SaveLinks();
dialog.Close();
this.ListLinks();
};
}

async Delete() {
if (this.args.select === null) return;

let index = this.apiLinks.findIndex(link => link.guid === this.args.select);
let index = this.link.findIndex(link => link.guid === this.args.select);
if (index < 0) return;

this.ConfirmBox("Are you sure you want delete this API link?").addEventListener("click", async()=> {
this.apiLinks.splice(index, 1);
this.link.splice(index, 1);
this.SaveLinks();
this.list.removeChild(this.list.childNodes[index]);
this.ListLinks();
});
}

InflateElement(element, entry) { //overrides
element.style.backgroundImage = "url(mono/carabiner.svg)";
element.style.backgroundSize = "24px 24px";
element.style.backgroundPosition = "4px 4px";
element.style.backgroundRepeat = "no-repeat";

for (let i = 0; i < this.columnsElements.length; i++) {
if (!(this.columnsElements[i].textContent in entry)) continue;

Expand All @@ -362,8 +362,8 @@ class Api extends List {

if (i === 0) {
newAttr.style.top = "5px";
newAttr.style.left = "36px";
newAttr.style.width = `calc(${this.columnsElements[0].style.width} - 36px)`;
newAttr.style.left = "4px";
newAttr.style.width = `calc(${this.columnsElements[0].style.width} - 4px)`;
newAttr.style.whiteSpace = "nowrap";
newAttr.style.overflow = "hidden";
newAttr.style.textOverflow = "ellipsis";
Expand All @@ -377,7 +377,7 @@ class Api extends List {
element.onclick = ()=> {
if (this.selected) this.selected.style.backgroundColor = "";

this.args.select = entry.name.v;
this.args.select = entry.guid.v;

this.selected = element;
element.style.backgroundColor = "var(--clr-select)";
Expand Down
1 change: 1 addition & 0 deletions Protest/Front/rbac.js
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,7 @@ class AccessControl extends Tabs {
for (let i=0; i<authorization.length; i++) {
let split = authorization[i].split(":");
let permission = this.permissionsList.find(o=>o.name.toLowerCase() === split[0]);
if (!permission) continue;

if (split[1] === "read") {
permission.read.checked = true;
Expand Down
38 changes: 14 additions & 24 deletions Protest/Tools/Api.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,31 +78,21 @@ internal static Link[] Load() {
internal static byte[] List() {
Link[] links = Load();

StringBuilder builder = new StringBuilder();
builder.Append("{\"data\":{");

bool first = true;

for (int i = 0; i < links.Length; i++) {
if (!first) { builder.Append(','); }

builder.Append($"\"{Data.EscapeJsonText(links[i].guid.ToString())}\":{{");
builder.Append($"\"name\":{{\"v\":\"{Data.EscapeJsonText(links[i].name)}\"}},");
builder.Append($"\"key\":{{\"v\":\"{Data.EscapeJsonText(links[i].apikey)}\"}},");
builder.Append($"\"readonly\":{{\"v\":{links[i].readOnly.ToString().ToLower()}}},");
builder.Append($"\"permissions\":{{\"v\":{links[i].permissions}}}");
builder.Append('}');

first = false;
}

builder.Append("},");

builder.Append($"\"length\":{links.Length}");

builder.Append('}');
var data = new {
data = links.ToDictionary(
link => link.guid.ToString(),
link => new {
guid = new { v = link.guid },
name = new { v = Data.EscapeJsonText(link.name) },
key = new { v = Data.EscapeJsonText(link.apikey) },
@readonly = new { v = link.readOnly },
permissions = new { v = link.permissions }
}
),
length = links.Length
};

return Encoding.UTF8.GetBytes(builder.ToString());
return JsonSerializer.SerializeToUtf8Bytes(data);
}

internal static byte[] Save(HttpListenerContext ctx, string origin) {
Expand Down
35 changes: 12 additions & 23 deletions Protest/Tools/Cert.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Runtime.Versioning;
using System.Text;
using System.Text.RegularExpressions;
using System.Text.Json;

namespace Protest.Tools;

Expand Down Expand Up @@ -177,29 +178,17 @@ public static byte[] List() {

FileInfo[] files = directory.GetFiles();

StringBuilder builder = new StringBuilder();
builder.Append("{\"data\":{");

bool first = true;
foreach (FileInfo file in files) {
if (!first) builder.Append(',');

builder.Append($"\"{Data.EscapeJsonText(file.Name)}\":{{");
builder.Append($"\"name\":{{\"v\":\"{Data.EscapeJsonText(file.Name)}\"}},");
builder.Append($"\"date\":{{\"v\":{file.CreationTimeUtc.Ticks}}},");
builder.Append($"\"size\":{{\"v\":{file.Length}}}");
builder.Append('}');

first = false;
}

builder.Append("},");

builder.Append($"\"length\":{files.Length}");

builder.Append('}');

return Encoding.UTF8.GetBytes(builder.ToString());
return JsonSerializer.SerializeToUtf8Bytes(new {
data = files.ToDictionary(
file => Data.EscapeJsonText(file.Name),
file => new {
name = new { v = Data.EscapeJsonText(file.Name) },
date = new { v = file.CreationTimeUtc.Ticks },
size = new { v = file.Length }
}
),
length = files.Length
});
}

internal static byte[] Delete(Dictionary<string, string> parameters, string origin) {
Expand Down

0 comments on commit f84b96a

Please sign in to comment.