Skip to content

Commit

Permalink
consolidated validation and normalisation of of url to setconfig func…
Browse files Browse the repository at this point in the history
…tions
  • Loading branch information
CyferShepard committed Jun 13, 2024
1 parent 41e4eb4 commit 88e89c1
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 139 deletions.
53 changes: 38 additions & 15 deletions backend/classes/jellyfin-api.js
Original file line number Diff line number Diff line change
Expand Up @@ -421,29 +421,52 @@ class JellyfinAPI {
}
}

#isValidUrl(string) {
try {
new URL(string);
return true;
} catch (err) {
return false;
}
}

async validateSettings(url, apikey) {
let result = { isValid: false, status: 400, errorMessage: "Invalid URL", url: url, cleanedUrl: "" };
try {
const response = await axios.get(url, {
let _url = url.replace(/\/web\/index\.html#!\/home\.html$/, "");

_url = _url.replace(/\/$/, "");
if (!/^https?:\/\//i.test(_url)) {
_url = "http://" + _url;
}

result.cleanedUrl = _url;

console.log(_url, this.#isValidUrl(_url));
if (!this.#isValidUrl(_url)) {
return result;
}

const validation_url = _url.replace(/\/$/, "") + "/system/configuration";

const response = await axios.get(validation_url, {
headers: {
"X-MediaBrowser-Token": apikey,
},
});
return {
isValid: response.status === 200,
errorMessage: "",
};
result.isValid = response.status == 200;
return result;
} catch (error) {
this.#errorHandler(error);
return {
isValid: false,
status: error?.response?.status ?? 0,
errorMessage:
error?.response != null
? this.#httpErrorMessageHandler(error)
: error.code == "ENOTFOUND"
? "Unable to connect. Please check the URL and your network connection."
: error.message,
};
result.isValid = false;
result.status = error?.response?.status ?? 400;
result.errorMessage =
error?.response != null
? this.#httpErrorMessageHandler(error)
: error.code == "ENOTFOUND"
? "Unable to connect. Please check the URL and your network connection."
: error.message;
return result;
}
}
}
Expand Down
11 changes: 10 additions & 1 deletion backend/routes/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -224,14 +224,23 @@ router.post("/setconfig", async (req, res) => {
return;
}

var url = JF_HOST;

const validation = await Jellyfin.validateSettings(url, JF_API_KEY);
if (validation.isValid === false) {
res.status(validation.status);
res.send(validation);
return;
}

const { rows: getConfig } = await db.query('SELECT * FROM app_config where "ID"=1');

let query = 'UPDATE app_config SET "JF_HOST"=$1, "JF_API_KEY"=$2 where "ID"=1';
if (getConfig.length === 0) {
query = 'INSERT INTO app_config ("ID","JF_HOST","JF_API_KEY","APP_USER","APP_PASSWORD") VALUES (1,$1,$2,null,null)';
}

const { rows } = await db.query(query, [JF_HOST, JF_API_KEY]);
const { rows } = await db.query(query, [validation.cleanedUrl, JF_API_KEY]);
res.send(rows);
} catch (error) {
console.log(error);
Expand Down
36 changes: 5 additions & 31 deletions backend/routes/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,29 +96,12 @@ router.post("/configSetup", async (req, res) => {
return;
}

var _url = JF_HOST;
_url = _url.replace(/\/web\/index\.html#!\/home\.html$/, "");
if (!/^https?:\/\//i.test(_url)) {
_url = "http://" + _url;
}
console.log(_url, isValidUrl(_url));
if (!isValidUrl(_url)) {
res.status(400);

res.send({
isValid: false,
errorMessage: "Invalid URL",
});
return;
}

const validation_url = _url.replace(/\/$/, "") + "/system/configuration";

const validation = await Jellyfin.validateSettings(_url, validation_url);
var url = JF_HOST;

const validation = await Jellyfin.validateSettings(url, JF_API_KEY);
if (validation.isValid === false) {
res.status(400);
res.send(validation.errorMessage);
res.status(validation.status);
res.send(validation);
return;
}

Expand All @@ -130,7 +113,7 @@ router.post("/configSetup", async (req, res) => {
query = 'INSERT INTO app_config ("ID","JF_HOST","JF_API_KEY","APP_USER","APP_PASSWORD") VALUES (1,$1,$2,null,null)';
}

const { rows } = await db.query(query, [_url, JF_API_KEY]);
const { rows } = await db.query(query, [validation.cleanedUrl, JF_API_KEY]);
res.send(rows);
} else {
res.sendStatus(500);
Expand All @@ -140,13 +123,4 @@ router.post("/configSetup", async (req, res) => {
}
});

function isValidUrl(string) {
try {
new URL(string);
return true;
} catch (err) {
return false;
}
}

module.exports = router;
35 changes: 6 additions & 29 deletions backend/routes/proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,36 +174,13 @@ router.post("/validateSettings", async (req, res) => {
return;
}

var _url = url;
_url = _url.replace(/\/web\/index\.html#!\/home\.html$/, "");
if (!/^https?:\/\//i.test(_url)) {
_url = "http://" + _url;
const validation = await Jellyfin.validateSettings(url, apikey);
if (validation.isValid === false) {
res.status(validation.status);
res.send(validation.errorMessage);
} else {
res.send(validation);
}
console.log(_url, isValidUrl(_url));
if (!isValidUrl(_url)) {
res.status(400);

res.send({
isValid: false,
errorMessage: "Invalid URL",
});
return;
}

_url = _url.replace(/\/$/, "") + "/system/configuration";

const validation = await Jellyfin.validateSettings(_url, apikey);

res.send(validation);
});

function isValidUrl(string) {
try {
new URL(string);
return true;
} catch (err) {
return false;
}
}

module.exports = router;
38 changes: 3 additions & 35 deletions src/pages/components/settings/settingsConfig.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,41 +72,8 @@ export default function SettingsConfig() {
fetchAdmins();
}, [token]);

async function validateSettings(_url, _apikey) {
let fallback = { isvalid: false, errorMessage: "" };
const result = await axios
.post(
"/proxy/validateSettings",
{
url: _url,
apikey: _apikey,
},
{
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
}
)
.catch((error) => {
console.log("Error Validating config:", error.response.data);
fallback.errorMessage = error.response.data?.errorMessage ?? error.response.data;
});

let data = result?.data ?? fallback;
return { isValid: data.isValid, errorMessage: data.errorMessage };
}

async function handleFormSubmit(event) {
event.preventDefault();
let validation = await validateSettings(formValues.JF_HOST, formValues.JF_API_KEY);
console.log(validation);

if (!validation.isValid) {
setisSubmitted("Failed");
setsubmissionMessage(validation.errorMessage);
return;
}

setisSubmitted("");
axios
Expand All @@ -122,9 +89,10 @@ export default function SettingsConfig() {
setsubmissionMessage("Successfully updated configuration");
})
.catch((error) => {
console.log("Error updating config:", error);
let errorMessage = error.response.data.errorMessage;
console.log("Error updating config:", errorMessage);
setisSubmitted("Failed");
setsubmissionMessage("Error Updating Configuration: ", error);
setsubmissionMessage(`Error Updating Configuration: ${errorMessage}`);
});
}

Expand Down
28 changes: 0 additions & 28 deletions src/pages/setup.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,38 +37,10 @@ function Setup() {
});
}

async function validateSettings(_url, _apikey) {
const result = await axios
.post("/proxy/validateSettings", {
url: _url,
apikey: _apikey,
})
.catch((error) => {
return error.response;
});

let data = result.data;
console.log(result);
console.log(data);
return { isValid: data.isValid, errorMessage: data.errorMessage, status: data.status };
}

async function handleFormSubmit(event) {
setProcessing(true);
event.preventDefault();

let validation = await validateSettings(formValues.JF_HOST, formValues.JF_API_KEY);

if (!validation.isValid) {
setsubmitButtonText(
validation.status == 401
? i18next.t("ERROR_MESSAGES.UNAUTHORIZED").replace("{STATUS}", validation.status)
: validation.errorMessage
);
setProcessing(false);
return;
}

// Send a POST request to /api/setconfig/ with the updated configuration
axios
.post("/auth/configSetup/", formValues)
Expand Down

0 comments on commit 88e89c1

Please sign in to comment.