mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-11-26 23:43:33 -06:00
1115 lines
104 KiB
JavaScript
1115 lines
104 KiB
JavaScript
|
|
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({11:[function(require,module,exports){
|
||
|
|
"use strict";
|
||
|
|
|
||
|
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
||
|
|
|
||
|
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
|
|
|
||
|
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||
|
|
|
||
|
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
||
|
|
|
||
|
|
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
||
|
|
|
||
|
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
||
|
|
|
||
|
|
var Promise = require("bluebird");
|
||
|
|
|
||
|
|
var React = require("react");
|
||
|
|
|
||
|
|
var ReactDom = require("react-dom");
|
||
|
|
|
||
|
|
var oauthLib = require("./oauth.js");
|
||
|
|
|
||
|
|
var Auth = require("./auth");
|
||
|
|
|
||
|
|
var Settings = require("./settings");
|
||
|
|
|
||
|
|
var Blocks = require("./blocks");
|
||
|
|
|
||
|
|
require("./style.css");
|
||
|
|
|
||
|
|
function App() {
|
||
|
|
var _React$useState = React.useState(),
|
||
|
|
_React$useState2 = _slicedToArray(_React$useState, 2),
|
||
|
|
oauth = _React$useState2[0],
|
||
|
|
setOauth = _React$useState2[1];
|
||
|
|
|
||
|
|
var _React$useState3 = React.useState(false),
|
||
|
|
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
||
|
|
hasAuth = _React$useState4[0],
|
||
|
|
setAuth = _React$useState4[1];
|
||
|
|
|
||
|
|
var _React$useState5 = React.useState(localStorage.getItem("oauth")),
|
||
|
|
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
||
|
|
oauthState = _React$useState6[0],
|
||
|
|
setOauthState = _React$useState6[1];
|
||
|
|
|
||
|
|
React.useEffect(function () {
|
||
|
|
var state = localStorage.getItem("oauth");
|
||
|
|
|
||
|
|
if (state != undefined) {
|
||
|
|
state = JSON.parse(state);
|
||
|
|
var restoredOauth = oauthLib(state.config, state);
|
||
|
|
Promise["try"](function () {
|
||
|
|
return restoredOauth.callback();
|
||
|
|
}).then(function () {
|
||
|
|
setAuth(true);
|
||
|
|
});
|
||
|
|
setOauth(restoredOauth);
|
||
|
|
}
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
if (!hasAuth && oauth && oauth.isAuthorized()) {
|
||
|
|
setAuth(true);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (oauth && oauth.isAuthorized()) {
|
||
|
|
return /*#__PURE__*/React.createElement(AdminPanel, {
|
||
|
|
oauth: oauth
|
||
|
|
});
|
||
|
|
} else if (oauthState != undefined) {
|
||
|
|
return "processing oauth...";
|
||
|
|
} else {
|
||
|
|
return /*#__PURE__*/React.createElement(Auth, {
|
||
|
|
setOauth: setOauth
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function AdminPanel(_ref) {
|
||
|
|
var oauth = _ref.oauth;
|
||
|
|
|
||
|
|
/*
|
||
|
|
Features: (issue #78)
|
||
|
|
- [ ] Instance information updating
|
||
|
|
GET /api/v1/instance PATCH /api/v1/instance
|
||
|
|
- [ ] Domain block creation, viewing, and deletion
|
||
|
|
GET /api/v1/admin/domain_blocks
|
||
|
|
POST /api/v1/admin/domain_blocks
|
||
|
|
GET /api/v1/admin/domain_blocks/DOMAIN_BLOCK_ID, DELETE /api/v1/admin/domain_blocks/DOMAIN_BLOCK_ID
|
||
|
|
- [ ] Blocklist import/export
|
||
|
|
GET /api/v1/admin/domain_blocks?export=true
|
||
|
|
POST json file as form field domains to /api/v1/admin/domain_blocks
|
||
|
|
*/
|
||
|
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Logout, {
|
||
|
|
oauth: oauth
|
||
|
|
}), /*#__PURE__*/React.createElement(Settings, {
|
||
|
|
oauth: oauth
|
||
|
|
}), /*#__PURE__*/React.createElement(Blocks, {
|
||
|
|
oauth: oauth
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
|
||
|
|
function Logout(_ref2) {
|
||
|
|
var oauth = _ref2.oauth;
|
||
|
|
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("button", {
|
||
|
|
onClick: oauth.logout
|
||
|
|
}, "Logout"));
|
||
|
|
}
|
||
|
|
|
||
|
|
ReactDom.render( /*#__PURE__*/React.createElement(App, null), document.getElementById("root"));
|
||
|
|
|
||
|
|
},{"./auth":9,"./blocks":10,"./oauth.js":12,"./settings":13,"./style.css":14,"bluebird":15,"react":23,"react-dom":20}],14:[function(require,module,exports){
|
||
|
|
require("../../node_modules/icssify/global-css-loader.js"); module.exports = {};
|
||
|
|
},{"../../node_modules/icssify/global-css-loader.js":5}],13:[function(require,module,exports){
|
||
|
|
"use strict";
|
||
|
|
|
||
|
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
||
|
|
|
||
|
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
||
|
|
|
||
|
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
|
|
|
||
|
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
||
|
|
|
||
|
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
||
|
|
|
||
|
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
|
|
|
||
|
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
||
|
|
|
||
|
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
|
|
|
||
|
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||
|
|
|
||
|
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
||
|
|
|
||
|
|
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
||
|
|
|
||
|
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
||
|
|
|
||
|
|
var Promise = require("bluebird");
|
||
|
|
|
||
|
|
var React = require("react");
|
||
|
|
|
||
|
|
module.exports = function Settings(_ref) {
|
||
|
|
var oauth = _ref.oauth;
|
||
|
|
|
||
|
|
var _React$useState = React.useState({}),
|
||
|
|
_React$useState2 = _slicedToArray(_React$useState, 2),
|
||
|
|
info = _React$useState2[0],
|
||
|
|
setInfo = _React$useState2[1];
|
||
|
|
|
||
|
|
var _React$useState3 = React.useState(""),
|
||
|
|
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
||
|
|
errorMsg = _React$useState4[0],
|
||
|
|
setError = _React$useState4[1];
|
||
|
|
|
||
|
|
var _React$useState5 = React.useState("Fetching instance info"),
|
||
|
|
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
||
|
|
statusMsg = _React$useState6[0],
|
||
|
|
setStatus = _React$useState6[1];
|
||
|
|
|
||
|
|
React.useEffect(function () {
|
||
|
|
Promise["try"](function () {
|
||
|
|
return oauth.apiRequest("/api/v1/instance", "GET");
|
||
|
|
}).then(function (json) {
|
||
|
|
setInfo(json);
|
||
|
|
})["catch"](function (e) {
|
||
|
|
setError(e.message);
|
||
|
|
setStatus("");
|
||
|
|
});
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
function submit() {
|
||
|
|
setStatus("PATCHing");
|
||
|
|
setError("");
|
||
|
|
return Promise["try"](function () {
|
||
|
|
var formDataInfo = new FormData();
|
||
|
|
Object.entries(info).forEach(function (_ref2) {
|
||
|
|
var _ref3 = _slicedToArray(_ref2, 2),
|
||
|
|
key = _ref3[0],
|
||
|
|
val = _ref3[1];
|
||
|
|
|
||
|
|
if (key == "contact_account") {
|
||
|
|
key = "contact_username";
|
||
|
|
val = val.username;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (key == "email") {
|
||
|
|
key = "contact_email";
|
||
|
|
}
|
||
|
|
|
||
|
|
if (_typeof(val) != "object") {
|
||
|
|
formDataInfo.append(key, val);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
return oauth.apiRequest("/api/v1/instance", "PATCH", formDataInfo, "form");
|
||
|
|
}).then(function (json) {
|
||
|
|
setStatus("Config saved");
|
||
|
|
console.log(json);
|
||
|
|
})["catch"](function (e) {
|
||
|
|
setError(e.message);
|
||
|
|
setStatus("");
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
return /*#__PURE__*/React.createElement("section", {
|
||
|
|
className: "info login"
|
||
|
|
}, /*#__PURE__*/React.createElement("h1", null, "Instance Information ", /*#__PURE__*/React.createElement("button", {
|
||
|
|
onClick: submit
|
||
|
|
}, "Save")), /*#__PURE__*/React.createElement("div", {
|
||
|
|
className: "error accent"
|
||
|
|
}, errorMsg), /*#__PURE__*/React.createElement("div", null, statusMsg), /*#__PURE__*/React.createElement("form", {
|
||
|
|
onSubmit: function onSubmit(e) {
|
||
|
|
return e.preventDefault();
|
||
|
|
}
|
||
|
|
}, editableObject(info)));
|
||
|
|
};
|
||
|
|
|
||
|
|
function editableObject(obj) {
|
||
|
|
var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
||
|
|
var readOnlyKeys = ["uri", "version", "urls_streaming_api", "stats"];
|
||
|
|
var hiddenKeys = ["contact_account_", "urls"];
|
||
|
|
var explicitShownKeys = ["contact_account_username"];
|
||
|
|
var implementedKeys = "title, contact_account_username, email, short_description, description, terms, avatar, header".split(", ");
|
||
|
|
var listing = Object.entries(obj).map(function (_ref4) {
|
||
|
|
var _ref5 = _slicedToArray(_ref4, 2),
|
||
|
|
key = _ref5[0],
|
||
|
|
val = _ref5[1];
|
||
|
|
|
||
|
|
var fullkey = [].concat(_toConsumableArray(path), [key]).join("_");
|
||
|
|
|
||
|
|
if (hiddenKeys.includes(fullkey) || hiddenKeys.includes(path.join("_") + "_") // also match just parent path
|
||
|
|
) {
|
||
|
|
if (!explicitShownKeys.includes(fullkey)) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (Array.isArray(val)) {// FIXME: handle this
|
||
|
|
} else if (_typeof(val) == "object") {
|
||
|
|
return /*#__PURE__*/React.createElement(React.Fragment, {
|
||
|
|
key: fullkey
|
||
|
|
}, editableObject(val, [].concat(_toConsumableArray(path), [key])));
|
||
|
|
}
|
||
|
|
|
||
|
|
var isImplemented = "";
|
||
|
|
|
||
|
|
if (!implementedKeys.includes(fullkey)) {
|
||
|
|
isImplemented = " notImplemented";
|
||
|
|
}
|
||
|
|
|
||
|
|
var isReadOnly = readOnlyKeys.includes(fullkey) || readOnlyKeys.includes(path.join("_")) || isImplemented != "";
|
||
|
|
var label = key.replace(/_/g, " ");
|
||
|
|
|
||
|
|
if (path.length > 0) {
|
||
|
|
label = "\xA0".repeat(4 * path.length) + label;
|
||
|
|
}
|
||
|
|
|
||
|
|
var inputProps;
|
||
|
|
var changeFunc;
|
||
|
|
|
||
|
|
if (val === true || val === false) {
|
||
|
|
inputProps = {
|
||
|
|
type: "checkbox",
|
||
|
|
defaultChecked: val,
|
||
|
|
disabled: isReadOnly
|
||
|
|
};
|
||
|
|
|
||
|
|
changeFunc = function changeFunc(e) {
|
||
|
|
return e.target.checked;
|
||
|
|
};
|
||
|
|
} else if (val.length != 0 && !isNaN(val)) {
|
||
|
|
inputProps = {
|
||
|
|
type: "number",
|
||
|
|
defaultValue: val,
|
||
|
|
readOnly: isReadOnly
|
||
|
|
};
|
||
|
|
|
||
|
|
changeFunc = function changeFunc(e) {
|
||
|
|
return e.target.value;
|
||
|
|
};
|
||
|
|
} else {
|
||
|
|
inputProps = {
|
||
|
|
type: "text",
|
||
|
|
defaultValue: val,
|
||
|
|
readOnly: isReadOnly
|
||
|
|
};
|
||
|
|
|
||
|
|
changeFunc = function changeFunc(e) {
|
||
|
|
return e.target.value;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
function setRef(element) {
|
||
|
|
if (element != null) {
|
||
|
|
element.addEventListener("change", function (e) {
|
||
|
|
obj[key] = changeFunc(e);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return /*#__PURE__*/React.createElement(React.Fragment, {
|
||
|
|
key: fullkey
|
||
|
|
}, /*#__PURE__*/React.createElement("label", {
|
||
|
|
htmlFor: key,
|
||
|
|
className: "capitalize"
|
||
|
|
}, label), /*#__PURE__*/React.createElement("div", {
|
||
|
|
className: isImplemented
|
||
|
|
}, /*#__PURE__*/React.createElement("input", _extends({
|
||
|
|
className: isImplemented,
|
||
|
|
ref: setRef
|
||
|
|
}, inputProps))));
|
||
|
|
});
|
||
|
|
return /*#__PURE__*/React.createElement(React.Fragment, null, path != "" && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("b", null, path, ":"), " ", /*#__PURE__*/React.createElement("span", {
|
||
|
|
id: "filler"
|
||
|
|
})), listing);
|
||
|
|
}
|
||
|
|
|
||
|
|
},{"bluebird":15,"react":23}],10:[function(require,module,exports){
|
||
|
|
"use strict";
|
||
|
|
|
||
|
|
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
|
|
|
||
|
|
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
||
|
|
|
||
|
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
|
|
|
||
|
|
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
||
|
|
|
||
|
|
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
||
|
|
|
||
|
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
||
|
|
|
||
|
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
|
|
|
||
|
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||
|
|
|
||
|
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
||
|
|
|
||
|
|
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
||
|
|
|
||
|
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
||
|
|
|
||
|
|
var Promise = require("bluebird");
|
||
|
|
|
||
|
|
var React = require("react");
|
||
|
|
|
||
|
|
var fileDownload = require("js-file-download");
|
||
|
|
|
||
|
|
function sortBlocks(blocks) {
|
||
|
|
return blocks.sort(function (a, b) {
|
||
|
|
// alphabetical sort
|
||
|
|
return a.domain.localeCompare(b.domain);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function deduplicateBlocks(blocks) {
|
||
|
|
var a = new Map();
|
||
|
|
blocks.forEach(function (block) {
|
||
|
|
a.set(block.id, block);
|
||
|
|
});
|
||
|
|
return Array.from(a.values());
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = function Blocks(_ref) {
|
||
|
|
var oauth = _ref.oauth;
|
||
|
|
|
||
|
|
var _React$useState = React.useState([]),
|
||
|
|
_React$useState2 = _slicedToArray(_React$useState, 2),
|
||
|
|
blocks = _React$useState2[0],
|
||
|
|
setBlocks = _React$useState2[1];
|
||
|
|
|
||
|
|
var _React$useState3 = React.useState("Fetching blocks"),
|
||
|
|
_React$useState4 = _slicedToArray(_React$useState3, 2),
|
||
|
|
info = _React$useState4[0],
|
||
|
|
setInfo = _React$useState4[1];
|
||
|
|
|
||
|
|
var _React$useState5 = React.useState(""),
|
||
|
|
_React$useState6 = _slicedToArray(_React$useState5, 2),
|
||
|
|
errorMsg = _React$useState6[0],
|
||
|
|
setError = _React$useState6[1];
|
||
|
|
|
||
|
|
var _React$useState7 = React.useState(new Set()),
|
||
|
|
_React$useState8 = _slicedToArray(_React$useState7, 2),
|
||
|
|
checked = _React$useState8[0],
|
||
|
|
setChecked = _React$useState8[1];
|
||
|
|
|
||
|
|
React.useEffect(function () {
|
||
|
|
Promise["try"](function () {
|
||
|
|
return oauth.apiRequest("/api/v1/admin/domain_blocks", undefined, undefined, "GET");
|
||
|
|
}).then(function (json) {
|
||
|
|
setInfo("");
|
||
|
|
setError("");
|
||
|
|
setBlocks(sortBlocks(json));
|
||
|
|
})["catch"](function (e) {
|
||
|
|
setError(e.message);
|
||
|
|
setInfo("");
|
||
|
|
});
|
||
|
|
}, []);
|
||
|
|
var blockList = blocks.map(function (block) {
|
||
|
|
function update(e) {
|
||
|
|
var newChecked = new Set(checked.values());
|
||
|
|
|
||
|
|
if (e.target.checked) {
|
||
|
|
newChecked.add(block.id);
|
||
|
|
} else {
|
||
|
|
newChecked["delete"](block.id);
|
||
|
|
}
|
||
|
|
|
||
|
|
setChecked(newChecked);
|
||
|
|
}
|
||
|
|
|
||
|
|
return /*#__PURE__*/React.createElement(React.Fragment, {
|
||
|
|
key: block.id
|
||
|
|
}, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("input", {
|
||
|
|
type: "checkbox",
|
||
|
|
onChange: update,
|
||
|
|
checked: checked.has(block.id)
|
||
|
|
})), /*#__PURE__*/React.createElement("div", null, block.domain), /*#__PURE__*/React.createElement("div", null, new Date(block.created_at).toLocaleString()));
|
||
|
|
});
|
||
|
|
|
||
|
|
function clearChecked() {
|
||
|
|
setChecked(new Set());
|
||
|
|
}
|
||
|
|
|
||
|
|
function undoChecked() {
|
||
|
|
var amount = checked.size;
|
||
|
|
|
||
|
|
if (confirm("Are you sure you want to remove ".concat(amount, " block(s)?"))) {
|
||
|
|
setInfo("");
|
||
|
|
Promise.map(Array.from(checked.values()), function (block) {
|
||
|
|
console.log("deleting", block);
|
||
|
|
return oauth.apiRequest("/api/v1/admin/domain_blocks/".concat(block), "DELETE");
|
||
|
|
}).then(function (res) {
|
||
|
|
console.log(res);
|
||
|
|
setInfo("Deleted ".concat(amount, " blocks: ").concat(res.map(function (a) {
|
||
|
|
return a.domain;
|
||
|
|
}).join(", ")));
|
||
|
|
})["catch"](function (e) {
|
||
|
|
setError(e);
|
||
|
|
});
|
||
|
|
var newBlocks = blocks.filter(function (block) {
|
||
|
|
if (checked.size > 0 && checked.has(block.id)) {
|
||
|
|
checked["delete"](block.id);
|
||
|
|
return false;
|
||
|
|
} else {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
setBlocks(newBlocks);
|
||
|
|
clearChecked();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return /*#__PURE__*/React.createElement("section", {
|
||
|
|
className: "blocks"
|
||
|
|
}, /*#__PURE__*/React.createElement("h1", null, "Blocks"), /*#__PURE__*/React.createElement("div", {
|
||
|
|
className: "error accent"
|
||
|
|
}, errorMsg), /*#__PURE__*/React.createElement("div", null, info), /*#__PURE__*/React.createElement(AddBlock, {
|
||
|
|
oauth: oauth,
|
||
|
|
blocks: blocks,
|
||
|
|
setBlocks: setBlocks
|
||
|
|
}), /*#__PURE__*/React.createElement("h3", null, "Blocks:"), /*#__PURE__*/React.createElement("div", {
|
||
|
|
style: {
|
||
|
|
display: "grid",
|
||
|
|
gridTemplateColumns: "1fr auto"
|
||
|
|
}
|
||
|
|
}, /*#__PURE__*/React.createElement("span", {
|
||
|
|
onClick: clearChecked,
|
||
|
|
className: "accent",
|
||
|
|
style: {
|
||
|
|
alignSelf: "end"
|
||
|
|
}
|
||
|
|
}, "uncheck all"), /*#__PURE__*/React.createElement("button", {
|
||
|
|
onClick: undoChecked
|
||
|
|
}, "Unblock selected")), /*#__PURE__*/React.createElement("div", {
|
||
|
|
className: "blocklist overflow"
|
||
|
|
}, blockList), /*#__PURE__*/React.createElement(BulkBlocking, {
|
||
|
|
oauth: oauth,
|
||
|
|
blocks: blocks,
|
||
|
|
setBlocks: setBlocks
|
||
|
|
}));
|
||
|
|
};
|
||
|
|
|
||
|
|
function BulkBlocking(_ref2) {
|
||
|
|
var oauth = _ref2.oauth,
|
||
|
|
blocks = _ref2.blocks,
|
||
|
|
setBlocks = _ref2.setBlocks;
|
||
|
|
|
||
|
|
var _React$useState9 = React.useState(""),
|
||
|
|
_React$useState10 = _slicedToArray(_React$useState9, 2),
|
||
|
|
bulk = _React$useState10[0],
|
||
|
|
setBulk = _React$useState10[1];
|
||
|
|
|
||
|
|
var _React$useState11 = React.useState(new Map()),
|
||
|
|
_React$useState12 = _slicedToArray(_React$useState11, 2),
|
||
|
|
blockMap = _React$useState12[0],
|
||
|
|
setBlockMap = _React$useState12[1];
|
||
|
|
|
||
|
|
var _React$useState13 = React.useState(),
|
||
|
|
_React$useState14 = _slicedToArray(_React$useState13, 2),
|
||
|
|
output = _React$useState14[0],
|
||
|
|
setOutput = _React$useState14[1];
|
||
|
|
|
||
|
|
React.useEffect(function () {
|
||
|
|
var newBlockMap = new Map();
|
||
|
|
blocks.forEach(function (block) {
|
||
|
|
newBlockMap.set(block.domain, block);
|
||
|
|
});
|
||
|
|
setBlockMap(newBlockMap);
|
||
|
|
}, [blocks]);
|
||
|
|
var fileRef = React.useRef();
|
||
|
|
|
||
|
|
function error(e) {
|
||
|
|
setOutput( /*#__PURE__*/React.createElement("div", {
|
||
|
|
className: "error accent"
|
||
|
|
}, e));
|
||
|
|
throw e;
|
||
|
|
}
|
||
|
|
|
||
|
|
function fileUpload() {
|
||
|
|
var reader = new FileReader();
|
||
|
|
reader.addEventListener("load", function (e) {
|
||
|
|
try {
|
||
|
|
// TODO: use validatem?
|
||
|
|
var json = JSON.parse(e.target.result);
|
||
|
|
json.forEach(function (block) {
|
||
|
|
console.log("block:", block);
|
||
|
|
});
|
||
|
|
} catch (e) {
|
||
|
|
error(e.message);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
reader.readAsText(fileRef.current.files[0]);
|
||
|
|
}
|
||
|
|
|
||
|
|
React.useEffect(function () {
|
||
|
|
if (fileRef && fileRef.current) {
|
||
|
|
fileRef.current.addEventListener("change", fileUpload);
|
||
|
|
}
|
||
|
|
|
||
|
|
return function cleanup() {
|
||
|
|
fileRef.current.removeEventListener("change", fileUpload);
|
||
|
|
};
|
||
|
|
});
|
||
|
|
|
||
|
|
function textImport() {
|
||
|
|
Promise["try"](function () {
|
||
|
|
if (bulk[0] == "[") {
|
||
|
|
// assume it's json
|
||
|
|
return JSON.parse(bulk);
|
||
|
|
} else {
|
||
|
|
return bulk.split("\n").map(function (val) {
|
||
|
|
return {
|
||
|
|
domain: val.trim()
|
||
|
|
};
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}).then(function (domains) {
|
||
|
|
console.log(domains);
|
||
|
|
var before = domains.length;
|
||
|
|
setOutput("Importing ".concat(before, " domain(s)"));
|
||
|
|
domains = domains.filter(function (_ref3) {
|
||
|
|
var domain = _ref3.domain;
|
||
|
|
return domain != "" && !blockMap.has(domain);
|
||
|
|
});
|
||
|
|
setOutput( /*#__PURE__*/React.createElement("span", null, output, /*#__PURE__*/React.createElement("br", null), "Deduplicated ".concat(before - domains.length, "/").concat(before, " with existing blocks, adding ").concat(domains.length, " block(s)")));
|
||
|
|
|
||
|
|
if (domains.length > 0) {
|
||
|
|
var data = new FormData();
|
||
|
|
data.append("domains", new Blob([JSON.stringify(domains)], {
|
||
|
|
type: "application/json"
|
||
|
|
}), "import.json");
|
||
|
|
return oauth.apiRequest("/api/v1/admin/domain_blocks?import=true", "POST", data, "form");
|
||
|
|
}
|
||
|
|
}).then(function (json) {
|
||
|
|
console.log("bulk import result:", json);
|
||
|
|
setBlocks(sortBlocks(deduplicateBlocks([].concat(_toConsumableArray(json), _toConsumableArray(blocks)))));
|
||
|
|
})["catch"](function (e) {
|
||
|
|
error(e.message);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function textExport() {
|
||
|
|
setBulk(blocks.reduce(function (str, val) {
|
||
|
|
if (_typeof(str) == "object") {
|
||
|
|
return str.domain;
|
||
|
|
} else {
|
||
|
|
return str + "\n" + val.domain;
|
||
|
|
}
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
|
||
|
|
function jsonExport() {
|
||
|
|
Promise["try"](function () {
|
||
|
|
return oauth.apiRequest("/api/v1/admin/domain_blocks?export=true", "GET");
|
||
|
|
}).then(function (json) {
|
||
|
|
fileDownload(JSON.stringify(json), "block-export.json");
|
||
|
|
})["catch"](function (e) {
|
||
|
|
error(e);
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function textAreaUpdate(e) {
|
||
|
|
setBulk(e.target.value);
|
||
|
|
}
|
||
|
|
|
||
|
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h3", null, "Bulk import/export"), /*#__PURE__*/React.createElement("label", {
|
||
|
|
htmlFor: "bulk"
|
||
|
|
}, "Domains, one per line:"), /*#__PURE__*/React.createElement("textarea", {
|
||
|
|
value: bulk,
|
||
|
|
rows: 20,
|
||
|
|
onChange: textAreaUpdate
|
||
|
|
}), /*#__PURE__*/React.createElement("div", {
|
||
|
|
className: "controls"
|
||
|
|
}, /*#__PURE__*/React.createElement("button", {
|
||
|
|
onClick: textImport
|
||
|
|
}, "Import All From Field"), /*#__PURE__*/React.createElement("button", {
|
||
|
|
onClick: textExport
|
||
|
|
}, "Export To Field"), /*#__PURE__*/React.createElement("label", {
|
||
|
|
className: "button",
|
||
|
|
htmlFor: "upload"
|
||
|
|
}, "Upload .json"), /*#__PURE__*/React.createElement("button", {
|
||
|
|
onClick: jsonExport
|
||
|
|
}, "Download .json")), output, /*#__PURE__*/React.createElement("input", {
|
||
|
|
type: "file",
|
||
|
|
id: "upload",
|
||
|
|
className: "hidden",
|
||
|
|
ref: fileRef
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
|
||
|
|
function AddBlock(_ref4) {
|
||
|
|
var oauth = _ref4.oauth,
|
||
|
|
blocks = _ref4.blocks,
|
||
|
|
setBlocks = _ref4.setBlocks;
|
||
|
|
|
||
|
|
var _React$useState15 = React.useState(""),
|
||
|
|
_React$useState16 = _slicedToArray(_React$useState15, 2),
|
||
|
|
domain = _React$useState16[0],
|
||
|
|
setDomain = _React$useState16[1];
|
||
|
|
|
||
|
|
var _React$useState17 = React.useState("suspend"),
|
||
|
|
_React$useState18 = _slicedToArray(_React$useState17, 2),
|
||
|
|
type = _React$useState18[0],
|
||
|
|
setType = _React$useState18[1];
|
||
|
|
|
||
|
|
var _React$useState19 = React.useState(false),
|
||
|
|
_React$useState20 = _slicedToArray(_React$useState19, 2),
|
||
|
|
obfuscated = _React$useState20[0],
|
||
|
|
setObfuscated = _React$useState20[1];
|
||
|
|
|
||
|
|
var _React$useState21 = React.useState(""),
|
||
|
|
_React$useState22 = _slicedToArray(_React$useState21, 2),
|
||
|
|
privateDescription = _React$useState22[0],
|
||
|
|
setPrivateDescription = _React$useState22[1];
|
||
|
|
|
||
|
|
var _React$useState23 = React.useState(""),
|
||
|
|
_React$useState24 = _slicedToArray(_React$useState23, 2),
|
||
|
|
publicDescription = _React$useState24[0],
|
||
|
|
setPublicDescription = _React$useState24[1];
|
||
|
|
|
||
|
|
function addBlock() {
|
||
|
|
console.log("".concat(type, "ing"), domain);
|
||
|
|
Promise["try"](function () {
|
||
|
|
return oauth.apiRequest("/api/v1/admin/domain_blocks", "POST", {
|
||
|
|
domain: domain,
|
||
|
|
obfuscate: obfuscated,
|
||
|
|
private_comment: privateDescription,
|
||
|
|
public_comment: publicDescription
|
||
|
|
}, "json");
|
||
|
|
}).then(function (json) {
|
||
|
|
setDomain("");
|
||
|
|
setPrivateDescription("");
|
||
|
|
setPublicDescription("");
|
||
|
|
setBlocks([json].concat(_toConsumableArray(blocks)));
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function onDomainChange(e) {
|
||
|
|
setDomain(e.target.value);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onTypeChange(e) {
|
||
|
|
setType(e.target.value);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onKeyDown(e) {
|
||
|
|
if (e.key == "Enter") {
|
||
|
|
addBlock();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h3", null, "Add Block:"), /*#__PURE__*/React.createElement("div", {
|
||
|
|
className: "addblock"
|
||
|
|
}, /*#__PURE__*/React.createElement("input", {
|
||
|
|
id: "domain",
|
||
|
|
placeholder: "instance",
|
||
|
|
onChange: onDomainChange,
|
||
|
|
value: domain,
|
||
|
|
onKeyDown: onKeyDown
|
||
|
|
}), /*#__PURE__*/React.createElement("select", {
|
||
|
|
value: type,
|
||
|
|
onChange: onTypeChange
|
||
|
|
}, /*#__PURE__*/React.createElement("option", {
|
||
|
|
id: "suspend"
|
||
|
|
}, "Suspend"), /*#__PURE__*/React.createElement("option", {
|
||
|
|
id: "silence"
|
||
|
|
}, "Silence")), /*#__PURE__*/React.createElement("button", {
|
||
|
|
onClick: addBlock
|
||
|
|
}, "Add"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
|
||
|
|
htmlFor: "private"
|
||
|
|
}, "Private description:"), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("textarea", {
|
||
|
|
id: "private",
|
||
|
|
value: privateDescription,
|
||
|
|
onChange: function onChange(e) {
|
||
|
|
return setPrivateDescription(e.target.value);
|
||
|
|
}
|
||
|
|
})), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("label", {
|
||
|
|
htmlFor: "public"
|
||
|
|
}, "Public description:"), /*#__PURE__*/React.createElement("br", null), /*#__PURE__*/React.createElement("textarea", {
|
||
|
|
id: "public",
|
||
|
|
value: publicDescription,
|
||
|
|
onChange: function onChange(e) {
|
||
|
|
return setPublicDescription(e.target.value);
|
||
|
|
}
|
||
|
|
})), /*#__PURE__*/React.createElement("div", {
|
||
|
|
className: "single"
|
||
|
|
}, /*#__PURE__*/React.createElement("label", {
|
||
|
|
htmlFor: "obfuscate"
|
||
|
|
}, "Obfuscate:"), /*#__PURE__*/React.createElement("input", {
|
||
|
|
id: "obfuscate",
|
||
|
|
type: "checkbox",
|
||
|
|
value: obfuscated,
|
||
|
|
onChange: function onChange(e) {
|
||
|
|
return setObfuscated(e.target.checked);
|
||
|
|
}
|
||
|
|
}))));
|
||
|
|
} // function Blocklist() {
|
||
|
|
// return (
|
||
|
|
// <section className="blocklists">
|
||
|
|
// <h1>Blocklists</h1>
|
||
|
|
// </section>
|
||
|
|
// );
|
||
|
|
// }
|
||
|
|
|
||
|
|
},{"bluebird":15,"js-file-download":16,"react":23}],16:[function(require,module,exports){
|
||
|
|
module.exports = function(data, filename, mime, bom) {
|
||
|
|
var blobData = (typeof bom !== 'undefined') ? [bom, data] : [data]
|
||
|
|
var blob = new Blob(blobData, {type: mime || 'application/octet-stream'});
|
||
|
|
if (typeof window.navigator.msSaveBlob !== 'undefined') {
|
||
|
|
// IE workaround for "HTML7007: One or more blob URLs were
|
||
|
|
// revoked by closing the blob for which they were created.
|
||
|
|
// These URLs will no longer resolve as the data backing
|
||
|
|
// the URL has been freed."
|
||
|
|
window.navigator.msSaveBlob(blob, filename);
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
var blobURL = (window.URL && window.URL.createObjectURL) ? window.URL.createObjectURL(blob) : window.webkitURL.createObjectURL(blob);
|
||
|
|
var tempLink = document.createElement('a');
|
||
|
|
tempLink.style.display = 'none';
|
||
|
|
tempLink.href = blobURL;
|
||
|
|
tempLink.setAttribute('download', filename);
|
||
|
|
|
||
|
|
// Safari thinks _blank anchor are pop ups. We only want to set _blank
|
||
|
|
// target if the browser does not support the HTML5 download attribute.
|
||
|
|
// This allows you to download files in desktop safari if pop up blocking
|
||
|
|
// is enabled.
|
||
|
|
if (typeof tempLink.download === 'undefined') {
|
||
|
|
tempLink.setAttribute('target', '_blank');
|
||
|
|
}
|
||
|
|
|
||
|
|
document.body.appendChild(tempLink);
|
||
|
|
tempLink.click();
|
||
|
|
|
||
|
|
// Fixes "webkit blob resource error 1"
|
||
|
|
setTimeout(function() {
|
||
|
|
document.body.removeChild(tempLink);
|
||
|
|
window.URL.revokeObjectURL(blobURL);
|
||
|
|
}, 200)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
},{}],9:[function(require,module,exports){
|
||
|
|
"use strict";
|
||
|
|
|
||
|
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
||
|
|
|
||
|
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
|
|
|
||
|
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||
|
|
|
||
|
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
||
|
|
|
||
|
|
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
||
|
|
|
||
|
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
||
|
|
|
||
|
|
var Promise = require("bluebird");
|
||
|
|
|
||
|
|
var React = require("react");
|
||
|
|
|
||
|
|
var oauthLib = require("./oauth");
|
||
|
|
|
||
|
|
module.exports = function Auth(_ref) {
|
||
|
|
var setOauth = _ref.setOauth;
|
||
|
|
|
||
|
|
var _React$useState = React.useState(""),
|
||
|
|
_React$useState2 = _slicedToArray(_React$useState, 2),
|
||
|
|
instance = _React$useState2[0],
|
||
|
|
setInstance = _React$useState2[1];
|
||
|
|
|
||
|
|
React.useEffect(function () {
|
||
|
|
var isStillMounted = true; // check if current domain runs an instance
|
||
|
|
|
||
|
|
var thisUrl = new URL(window.location.origin);
|
||
|
|
thisUrl.pathname = "/api/v1/instance";
|
||
|
|
fetch(thisUrl.href).then(function (res) {
|
||
|
|
return res.json();
|
||
|
|
}).then(function (json) {
|
||
|
|
if (json && json.uri) {
|
||
|
|
if (isStillMounted) {
|
||
|
|
setInstance(json.uri);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
})["catch"](function (e) {
|
||
|
|
console.error("caught", e); // no instance here
|
||
|
|
});
|
||
|
|
return function () {
|
||
|
|
// cleanup function
|
||
|
|
isStillMounted = false;
|
||
|
|
};
|
||
|
|
}, []);
|
||
|
|
|
||
|
|
function doAuth() {
|
||
|
|
var oauth = oauthLib({
|
||
|
|
instance: instance,
|
||
|
|
client_name: "GoToSocial Admin Panel",
|
||
|
|
scope: ["admin"],
|
||
|
|
website: window.location.href
|
||
|
|
});
|
||
|
|
setOauth(oauth);
|
||
|
|
return Promise["try"](function () {
|
||
|
|
return oauth.register();
|
||
|
|
}).then(function () {
|
||
|
|
return oauth.authorize();
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function updateInstance(e) {
|
||
|
|
if (e.key == "Enter") {
|
||
|
|
doAuth();
|
||
|
|
} else {
|
||
|
|
setInstance(e.target.value);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return /*#__PURE__*/React.createElement("section", {
|
||
|
|
className: "login"
|
||
|
|
}, /*#__PURE__*/React.createElement("h1", null, "OAUTH Login:"), /*#__PURE__*/React.createElement("form", {
|
||
|
|
onSubmit: function onSubmit(e) {
|
||
|
|
return e.preventDefault();
|
||
|
|
}
|
||
|
|
}, /*#__PURE__*/React.createElement("label", {
|
||
|
|
htmlFor: "instance"
|
||
|
|
}, "Instance: "), /*#__PURE__*/React.createElement("input", {
|
||
|
|
value: instance,
|
||
|
|
onChange: updateInstance,
|
||
|
|
id: "instance"
|
||
|
|
}), /*#__PURE__*/React.createElement("button", {
|
||
|
|
onClick: doAuth
|
||
|
|
}, "Authenticate")));
|
||
|
|
};
|
||
|
|
|
||
|
|
},{"./oauth":12,"bluebird":15,"react":23}],12:[function(require,module,exports){
|
||
|
|
"use strict";
|
||
|
|
|
||
|
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
||
|
|
|
||
|
|
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
||
|
|
|
||
|
|
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
||
|
|
|
||
|
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
||
|
|
|
||
|
|
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
||
|
|
|
||
|
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
||
|
|
|
||
|
|
var Promise = require("bluebird");
|
||
|
|
|
||
|
|
function getCurrentUrl() {
|
||
|
|
return window.location.origin + window.location.pathname; // strips ?query=string and #hash
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = function oauthClient(config, initState) {
|
||
|
|
/* config:
|
||
|
|
instance: instance domain (https://testingtesting123.xyz)
|
||
|
|
client_name: "GoToSocial Admin Panel"
|
||
|
|
scope: []
|
||
|
|
website:
|
||
|
|
*/
|
||
|
|
var state = initState;
|
||
|
|
|
||
|
|
if (initState == undefined) {
|
||
|
|
state = localStorage.getItem("oauth");
|
||
|
|
|
||
|
|
if (state == undefined) {
|
||
|
|
state = {
|
||
|
|
config: config
|
||
|
|
};
|
||
|
|
storeState();
|
||
|
|
} else {
|
||
|
|
state = JSON.parse(state);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function storeState() {
|
||
|
|
localStorage.setItem("oauth", JSON.stringify(state));
|
||
|
|
}
|
||
|
|
/* register app
|
||
|
|
/api/v1/apps
|
||
|
|
*/
|
||
|
|
|
||
|
|
|
||
|
|
function register() {
|
||
|
|
if (state.client_id != undefined) {
|
||
|
|
return true; // we already have a registration
|
||
|
|
}
|
||
|
|
|
||
|
|
var url = new URL(config.instance);
|
||
|
|
url.pathname = "/api/v1/apps";
|
||
|
|
return fetch(url.href, {
|
||
|
|
method: "POST",
|
||
|
|
headers: {
|
||
|
|
'Content-Type': 'application/json'
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
client_name: config.client_name,
|
||
|
|
redirect_uris: getCurrentUrl(),
|
||
|
|
scopes: config.scope.join(" "),
|
||
|
|
website: getCurrentUrl()
|
||
|
|
})
|
||
|
|
}).then(function (res) {
|
||
|
|
if (res.status != 200) {
|
||
|
|
throw res;
|
||
|
|
}
|
||
|
|
|
||
|
|
return res.json();
|
||
|
|
}).then(function (json) {
|
||
|
|
state.client_id = json.client_id;
|
||
|
|
state.client_secret = json.client_secret;
|
||
|
|
storeState();
|
||
|
|
});
|
||
|
|
}
|
||
|
|
/* authorize:
|
||
|
|
/oauth/authorize
|
||
|
|
?client_id=CLIENT_ID
|
||
|
|
&redirect_uri=window.location.href
|
||
|
|
&response_type=code
|
||
|
|
&scope=admin
|
||
|
|
*/
|
||
|
|
|
||
|
|
|
||
|
|
function authorize() {
|
||
|
|
var url = new URL(config.instance);
|
||
|
|
url.pathname = "/oauth/authorize";
|
||
|
|
url.searchParams.set("client_id", state.client_id);
|
||
|
|
url.searchParams.set("redirect_uri", getCurrentUrl());
|
||
|
|
url.searchParams.set("response_type", "code");
|
||
|
|
url.searchParams.set("scope", config.scope.join(" "));
|
||
|
|
window.location.assign(url.href);
|
||
|
|
}
|
||
|
|
|
||
|
|
function callback() {
|
||
|
|
if (state.access_token != undefined) {
|
||
|
|
return; // we're already done :)
|
||
|
|
}
|
||
|
|
|
||
|
|
var params = new URL(window.location).searchParams;
|
||
|
|
var token = params.get("code");
|
||
|
|
|
||
|
|
if (token != null) {
|
||
|
|
console.log("got token callback:", token);
|
||
|
|
}
|
||
|
|
|
||
|
|
return authorizeToken(token)["catch"](function (e) {
|
||
|
|
console.log("Error processing oauth callback:", e);
|
||
|
|
logout(); // just to be sure
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function authorizeToken(token) {
|
||
|
|
var url = new URL(config.instance);
|
||
|
|
url.pathname = "/oauth/token";
|
||
|
|
return fetch(url.href, {
|
||
|
|
method: "POST",
|
||
|
|
headers: {
|
||
|
|
"Content-Type": "application/json"
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
client_id: state.client_id,
|
||
|
|
client_secret: state.client_secret,
|
||
|
|
redirect_uri: getCurrentUrl(),
|
||
|
|
grant_type: "authorization_code",
|
||
|
|
code: token
|
||
|
|
})
|
||
|
|
}).then(function (res) {
|
||
|
|
if (res.status != 200) {
|
||
|
|
throw res;
|
||
|
|
}
|
||
|
|
|
||
|
|
return res.json();
|
||
|
|
}).then(function (json) {
|
||
|
|
state.access_token = json.access_token;
|
||
|
|
storeState();
|
||
|
|
window.location = getCurrentUrl(); // clear ?token=
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function isAuthorized() {
|
||
|
|
return state.access_token != undefined;
|
||
|
|
}
|
||
|
|
|
||
|
|
function apiRequest(path, method, data) {
|
||
|
|
var type = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : "json";
|
||
|
|
|
||
|
|
if (!isAuthorized()) {
|
||
|
|
throw new Error("Not Authenticated");
|
||
|
|
}
|
||
|
|
|
||
|
|
var url = new URL(config.instance);
|
||
|
|
|
||
|
|
var _path$split = path.split("?"),
|
||
|
|
_path$split2 = _slicedToArray(_path$split, 2),
|
||
|
|
p = _path$split2[0],
|
||
|
|
s = _path$split2[1];
|
||
|
|
|
||
|
|
url.pathname = p;
|
||
|
|
url.search = s;
|
||
|
|
var headers = {
|
||
|
|
"Authorization": "Bearer ".concat(state.access_token)
|
||
|
|
};
|
||
|
|
var body = data;
|
||
|
|
|
||
|
|
if (type == "json" && body != undefined) {
|
||
|
|
headers["Content-Type"] = "application/json";
|
||
|
|
body = JSON.stringify(data);
|
||
|
|
}
|
||
|
|
|
||
|
|
return fetch(url.href, {
|
||
|
|
method: method,
|
||
|
|
headers: headers,
|
||
|
|
body: body
|
||
|
|
}).then(function (res) {
|
||
|
|
return Promise.all([res.json(), res]);
|
||
|
|
}).then(function (_ref) {
|
||
|
|
var _ref2 = _slicedToArray(_ref, 2),
|
||
|
|
json = _ref2[0],
|
||
|
|
res = _ref2[1];
|
||
|
|
|
||
|
|
if (res.status != 200) {
|
||
|
|
if (json.error) {
|
||
|
|
throw new Error(json.error);
|
||
|
|
} else {
|
||
|
|
throw new Error("".concat(res.status, ": ").concat(res.statusText));
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
return json;
|
||
|
|
}
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
function logout() {
|
||
|
|
var url = new URL(config.instance);
|
||
|
|
url.pathname = "/oauth/revoke";
|
||
|
|
return fetch(url.href, {
|
||
|
|
method: "POST",
|
||
|
|
headers: {
|
||
|
|
"Content-Type": "application/json"
|
||
|
|
},
|
||
|
|
body: JSON.stringify({
|
||
|
|
client_id: state.client_id,
|
||
|
|
client_secret: state.client_secret,
|
||
|
|
token: state.access_token
|
||
|
|
})
|
||
|
|
}).then(function (res) {
|
||
|
|
if (res.status != 200) {
|
||
|
|
// GoToSocial doesn't actually implement this route yet,
|
||
|
|
// so error is to be expected
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
return res.json();
|
||
|
|
})["catch"](function () {// see above
|
||
|
|
}).then(function () {
|
||
|
|
localStorage.removeItem("oauth");
|
||
|
|
window.location = getCurrentUrl();
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
register: register,
|
||
|
|
authorize: authorize,
|
||
|
|
callback: callback,
|
||
|
|
isAuthorized: isAuthorized,
|
||
|
|
apiRequest: apiRequest,
|
||
|
|
logout: logout
|
||
|
|
};
|
||
|
|
};
|
||
|
|
|
||
|
|
},{"bluebird":15}]},{},[11])
|
||
|
|
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9mYWN0b3ItYnVuZGxlL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJwYW5lbHMvYWRtaW4vaW5kZXguanMiLCJwYW5lbHMvYWRtaW4vc3R5bGUuY3NzIiwicGFuZWxzL2FkbWluL3NldHRpbmdzLmpzIiwicGFuZWxzL2FkbWluL2Jsb2Nrcy5qcyIsInBhbmVscy9ub2RlX21vZHVsZXMvanMtZmlsZS1kb3dubG9hZC9maWxlLWRvd25sb2FkLmpzIiwicGFuZWxzL2FkbWluL2F1dGguanMiLCJwYW5lbHMvYWRtaW4vb2F1dGguanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTs7Ozs7Ozs7Ozs7Ozs7QUFFQSxJQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsVUFBRCxDQUF2Qjs7QUFDQSxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBRCxDQUFyQjs7QUFDQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBRCxDQUF4Qjs7QUFFQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFDQSxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBRCxDQUFwQjs7QUFDQSxJQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsWUFBRCxDQUF4Qjs7QUFDQSxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsVUFBRCxDQUF0Qjs7QUFFQSxPQUFPLENBQUMsYUFBRCxDQUFQOztBQUVBLFNBQVMsR0FBVCxHQUFlO0FBQ2Qsd0JBQTBCLEtBQUssQ0FBQyxRQUFOLEVBQTFCO0FBQUE7QUFBQSxNQUFPLEtBQVA7QUFBQSxNQUFjLFFBQWQ7O0FBQ0EseUJBQTJCLEtBQUssQ0FBQyxRQUFOLENBQWUsS0FBZixDQUEzQjtBQUFBO0FBQUEsTUFBTyxPQUFQO0FBQUEsTUFBZ0IsT0FBaEI7O0FBQ0EseUJBQW9DLEtBQUssQ0FBQyxRQUFOLENBQWUsWUFBWSxDQUFDLE9BQWIsQ0FBcUIsT0FBckIsQ0FBZixDQUFw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
|