1
0
mirror of https://github.com/Foltik/Shimapan synced 2024-12-03 10:59:13 -05:00
shimapan/app/public/panel/controllers/KeyCtrl.js
2021-11-28 19:27:49 -05:00

110 lines
3.9 KiB
JavaScript

var angular = require('angular');
angular.module('KeyCtrl', ['KeySvc', 'AuthSvc']).controller('KeyController', ['$scope', 'KeyService', 'AuthService', function($scope, KeyService, AuthService) {
// Transforms an array of period-separated properties ex. ["file.upload", "user.view", "user.ban"]
// to json ex. {"file": "upload", "user": ["view", "ban"]}
function scopeToObj(scope) {
const res = {};
for(const prop in scope) {
if (scope.hasOwnProperty(prop)) {
const perm = scope[prop];
const prefix = perm.substr(0, perm.indexOf('.'));
const postfix = perm.substr(perm.indexOf('.') + 1);
if (!res[prefix]) res[prefix] = [];
res[prefix].push({name: postfix});
}
}
return res;
}
$scope.init = () => {
AuthService.whoami(res => {
$scope.scope = scopeToObj(res.scope);
$scope.displayname = res.displayname;
});
$scope.getAllKeys();
$scope.newScope = [];
};
// ------------ Keys ------------ ///
class Key {
constructor(identifier, scope, key) {
this.identifier = identifier;
this.scope = scopeToObj(scope);
this.key = key;
}
}
$scope.getAllKeys = () =>
KeyService.getAllKeys((err, res) =>
$scope.keys = res.map(key => new Key(key.identifier, key.scope, key.key)));
$scope.createKey = () =>
KeyService.createKey($scope.newIdentifier, $scope.newScope, (err, res) => {
if (err) return;
$scope.hideNewKey();
$scope.getAllKeys();
});
$scope.deleteKey = key =>
KeyService.deleteKey(key.key, (err, res) => {
if (err) return;
$scope.keys.splice($scope.keys.indexOf(key), 1);
$scope.hideKeyInfo();
$scope.currKey = {};
});
// Triggered when a checkbox for a permission changes.
// Updates the currKeyScope object with the addition or removal.
$scope.updateNewScope = function(prefix, perm) {
// If the checkbox was checked
if ($scope.scope[prefix][$scope.scope[prefix].indexOf(perm)].isChecked) {
$scope.newScope.push(prefix + '.' + perm.name);
} else {
// Otherwise it was unchecked, remove it
$scope.newScope.splice($scope.newScope.indexOf(prefix + '.' + perm.name), 1);
}
};
// Hide/show new key modal dialog
$scope.hideNewKey = () => $scope.newModalStyle = {};
$scope.showNewKey = () => $scope.newModalStyle = {display: 'block'};
// Hide/show key info modal dialog
$scope.hideKeyInfo = () => $scope.infoModalStyle = {};
$scope.showKeyInfo = key => {
$scope.currKey = key;
$scope.infoModalStyle = {display: 'block'};
};
function downloadData(mime, filename, data) {
const dataStr = 'data:' + mime + ';charset=utf-8,' + encodeURIComponent(data);
const anchor = document.createElement('a');
anchor.setAttribute('href', dataStr);
anchor.setAttribute('download', filename);
document.body.appendChild(anchor);
anchor.click();
anchor.remove();
}
$scope.downloadBash = () => {
const data =
'#!/bin/bash\n' +
'curl \\\n' +
' -F key=' + $scope.currKey.key + ' \\\n' +
' -F "file=@$1" \\\n' +
' https://shrimpa.rocks/api/upload \\\n' +
' | grep -Po \'"\'"url"\'"\\s*:\\s*"\\K([^"]*)\'\n';
downloadData('text/x-shellscript', 'shrimpa.rocks.sh', data);
};
$scope.downloadSharex = () => {
const data = {
RequestURL: 'https://shrimpa.rocks/api/upload',
FileFormName: 'file',
Arguments: {
key: $scope.currKey.key
},
URL: '$json:url$'
};
downloadData('text/json', 'shrimpa.rocks.sxcu', JSON.stringify(data));
};
}]);