Skip to content

Commit 88e89c1

Browse files
committed
consolidated validation and normalisation of of url to setconfig functions
1 parent 41e4eb4 commit 88e89c1

File tree

6 files changed

+62
-139
lines changed

6 files changed

+62
-139
lines changed

backend/classes/jellyfin-api.js

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -421,29 +421,52 @@ class JellyfinAPI {
421421
}
422422
}
423423

424+
#isValidUrl(string) {
425+
try {
426+
new URL(string);
427+
return true;
428+
} catch (err) {
429+
return false;
430+
}
431+
}
432+
424433
async validateSettings(url, apikey) {
434+
let result = { isValid: false, status: 400, errorMessage: "Invalid URL", url: url, cleanedUrl: "" };
425435
try {
426-
const response = await axios.get(url, {
436+
let _url = url.replace(/\/web\/index\.html#!\/home\.html$/, "");
437+
438+
_url = _url.replace(/\/$/, "");
439+
if (!/^https?:\/\//i.test(_url)) {
440+
_url = "http://" + _url;
441+
}
442+
443+
result.cleanedUrl = _url;
444+
445+
console.log(_url, this.#isValidUrl(_url));
446+
if (!this.#isValidUrl(_url)) {
447+
return result;
448+
}
449+
450+
const validation_url = _url.replace(/\/$/, "") + "/system/configuration";
451+
452+
const response = await axios.get(validation_url, {
427453
headers: {
428454
"X-MediaBrowser-Token": apikey,
429455
},
430456
});
431-
return {
432-
isValid: response.status === 200,
433-
errorMessage: "",
434-
};
457+
result.isValid = response.status == 200;
458+
return result;
435459
} catch (error) {
436460
this.#errorHandler(error);
437-
return {
438-
isValid: false,
439-
status: error?.response?.status ?? 0,
440-
errorMessage:
441-
error?.response != null
442-
? this.#httpErrorMessageHandler(error)
443-
: error.code == "ENOTFOUND"
444-
? "Unable to connect. Please check the URL and your network connection."
445-
: error.message,
446-
};
461+
result.isValid = false;
462+
result.status = error?.response?.status ?? 400;
463+
result.errorMessage =
464+
error?.response != null
465+
? this.#httpErrorMessageHandler(error)
466+
: error.code == "ENOTFOUND"
467+
? "Unable to connect. Please check the URL and your network connection."
468+
: error.message;
469+
return result;
447470
}
448471
}
449472
}

backend/routes/api.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,23 @@ router.post("/setconfig", async (req, res) => {
224224
return;
225225
}
226226

227+
var url = JF_HOST;
228+
229+
const validation = await Jellyfin.validateSettings(url, JF_API_KEY);
230+
if (validation.isValid === false) {
231+
res.status(validation.status);
232+
res.send(validation);
233+
return;
234+
}
235+
227236
const { rows: getConfig } = await db.query('SELECT * FROM app_config where "ID"=1');
228237

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

234-
const { rows } = await db.query(query, [JF_HOST, JF_API_KEY]);
243+
const { rows } = await db.query(query, [validation.cleanedUrl, JF_API_KEY]);
235244
res.send(rows);
236245
} catch (error) {
237246
console.log(error);

backend/routes/auth.js

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -96,29 +96,12 @@ router.post("/configSetup", async (req, res) => {
9696
return;
9797
}
9898

99-
var _url = JF_HOST;
100-
_url = _url.replace(/\/web\/index\.html#!\/home\.html$/, "");
101-
if (!/^https?:\/\//i.test(_url)) {
102-
_url = "http://" + _url;
103-
}
104-
console.log(_url, isValidUrl(_url));
105-
if (!isValidUrl(_url)) {
106-
res.status(400);
107-
108-
res.send({
109-
isValid: false,
110-
errorMessage: "Invalid URL",
111-
});
112-
return;
113-
}
114-
115-
const validation_url = _url.replace(/\/$/, "") + "/system/configuration";
116-
117-
const validation = await Jellyfin.validateSettings(_url, validation_url);
99+
var url = JF_HOST;
118100

101+
const validation = await Jellyfin.validateSettings(url, JF_API_KEY);
119102
if (validation.isValid === false) {
120-
res.status(400);
121-
res.send(validation.errorMessage);
103+
res.status(validation.status);
104+
res.send(validation);
122105
return;
123106
}
124107

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

133-
const { rows } = await db.query(query, [_url, JF_API_KEY]);
116+
const { rows } = await db.query(query, [validation.cleanedUrl, JF_API_KEY]);
134117
res.send(rows);
135118
} else {
136119
res.sendStatus(500);
@@ -140,13 +123,4 @@ router.post("/configSetup", async (req, res) => {
140123
}
141124
});
142125

143-
function isValidUrl(string) {
144-
try {
145-
new URL(string);
146-
return true;
147-
} catch (err) {
148-
return false;
149-
}
150-
}
151-
152126
module.exports = router;

backend/routes/proxy.js

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -174,36 +174,13 @@ router.post("/validateSettings", async (req, res) => {
174174
return;
175175
}
176176

177-
var _url = url;
178-
_url = _url.replace(/\/web\/index\.html#!\/home\.html$/, "");
179-
if (!/^https?:\/\//i.test(_url)) {
180-
_url = "http://" + _url;
177+
const validation = await Jellyfin.validateSettings(url, apikey);
178+
if (validation.isValid === false) {
179+
res.status(validation.status);
180+
res.send(validation.errorMessage);
181+
} else {
182+
res.send(validation);
181183
}
182-
console.log(_url, isValidUrl(_url));
183-
if (!isValidUrl(_url)) {
184-
res.status(400);
185-
186-
res.send({
187-
isValid: false,
188-
errorMessage: "Invalid URL",
189-
});
190-
return;
191-
}
192-
193-
_url = _url.replace(/\/$/, "") + "/system/configuration";
194-
195-
const validation = await Jellyfin.validateSettings(_url, apikey);
196-
197-
res.send(validation);
198184
});
199185

200-
function isValidUrl(string) {
201-
try {
202-
new URL(string);
203-
return true;
204-
} catch (err) {
205-
return false;
206-
}
207-
}
208-
209186
module.exports = router;

src/pages/components/settings/settingsConfig.jsx

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -72,41 +72,8 @@ export default function SettingsConfig() {
7272
fetchAdmins();
7373
}, [token]);
7474

75-
async function validateSettings(_url, _apikey) {
76-
let fallback = { isvalid: false, errorMessage: "" };
77-
const result = await axios
78-
.post(
79-
"/proxy/validateSettings",
80-
{
81-
url: _url,
82-
apikey: _apikey,
83-
},
84-
{
85-
headers: {
86-
Authorization: `Bearer ${token}`,
87-
"Content-Type": "application/json",
88-
},
89-
}
90-
)
91-
.catch((error) => {
92-
console.log("Error Validating config:", error.response.data);
93-
fallback.errorMessage = error.response.data?.errorMessage ?? error.response.data;
94-
});
95-
96-
let data = result?.data ?? fallback;
97-
return { isValid: data.isValid, errorMessage: data.errorMessage };
98-
}
99-
10075
async function handleFormSubmit(event) {
10176
event.preventDefault();
102-
let validation = await validateSettings(formValues.JF_HOST, formValues.JF_API_KEY);
103-
console.log(validation);
104-
105-
if (!validation.isValid) {
106-
setisSubmitted("Failed");
107-
setsubmissionMessage(validation.errorMessage);
108-
return;
109-
}
11077

11178
setisSubmitted("");
11279
axios
@@ -122,9 +89,10 @@ export default function SettingsConfig() {
12289
setsubmissionMessage("Successfully updated configuration");
12390
})
12491
.catch((error) => {
125-
console.log("Error updating config:", error);
92+
let errorMessage = error.response.data.errorMessage;
93+
console.log("Error updating config:", errorMessage);
12694
setisSubmitted("Failed");
127-
setsubmissionMessage("Error Updating Configuration: ", error);
95+
setsubmissionMessage(`Error Updating Configuration: ${errorMessage}`);
12896
});
12997
}
13098

src/pages/setup.jsx

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,38 +37,10 @@ function Setup() {
3737
});
3838
}
3939

40-
async function validateSettings(_url, _apikey) {
41-
const result = await axios
42-
.post("/proxy/validateSettings", {
43-
url: _url,
44-
apikey: _apikey,
45-
})
46-
.catch((error) => {
47-
return error.response;
48-
});
49-
50-
let data = result.data;
51-
console.log(result);
52-
console.log(data);
53-
return { isValid: data.isValid, errorMessage: data.errorMessage, status: data.status };
54-
}
55-
5640
async function handleFormSubmit(event) {
5741
setProcessing(true);
5842
event.preventDefault();
5943

60-
let validation = await validateSettings(formValues.JF_HOST, formValues.JF_API_KEY);
61-
62-
if (!validation.isValid) {
63-
setsubmitButtonText(
64-
validation.status == 401
65-
? i18next.t("ERROR_MESSAGES.UNAUTHORIZED").replace("{STATUS}", validation.status)
66-
: validation.errorMessage
67-
);
68-
setProcessing(false);
69-
return;
70-
}
71-
7244
// Send a POST request to /api/setconfig/ with the updated configuration
7345
axios
7446
.post("/auth/configSetup/", formValues)

0 commit comments

Comments
 (0)