@@ -75,6 +75,10 @@ const {
7575 validateTaskPlan,
7676 executeTaskPlan
7777} = require('./lib/task-orchestrator');
78+ const {
79+ getSvnInfo,
80+ getSvnLogs
81+ } = require('./lib/svn-webdav');
7882const {
7983 readAutomationConfig,
8084 matchAutomationRule,
@@ -9995,6 +9999,54 @@ function createWebServer({ htmlPath, assetsDir, webDir, host, port, openBrowser
99959999 }
999610000 }
999710001 break;
10002+ case 'svn-info':
10003+ {
10004+ const rawUrl = params && typeof params.url === 'string' ? params.url : '';
10005+ const remoteAddr = req && req.socket ? req.socket.remoteAddress : '';
10006+ const requesterIsLoopback = !remoteAddr
10007+ || remoteAddr === '127.0.0.1'
10008+ || remoteAddr === '::1'
10009+ || remoteAddr === '::ffff:127.0.0.1';
10010+ if (!requesterIsLoopback) {
10011+ try {
10012+ const parsedUrl = new URL(rawUrl);
10013+ if (isPrivateNetworkHost(parsedUrl.hostname || '')) {
10014+ result = { error: 'Refusing to access private network svn url from non-loopback request' };
10015+ break;
10016+ }
10017+ } catch (_) {}
10018+ }
10019+ try {
10020+ result = await getSvnInfo(params || {});
10021+ } catch (e) {
10022+ result = { error: e && e.message ? String(e.message) : 'svn info failed', status: e && e.status ? e.status : undefined };
10023+ }
10024+ }
10025+ break;
10026+ case 'svn-logs':
10027+ {
10028+ const rawUrl = params && typeof params.url === 'string' ? params.url : '';
10029+ const remoteAddr = req && req.socket ? req.socket.remoteAddress : '';
10030+ const requesterIsLoopback = !remoteAddr
10031+ || remoteAddr === '127.0.0.1'
10032+ || remoteAddr === '::1'
10033+ || remoteAddr === '::ffff:127.0.0.1';
10034+ if (!requesterIsLoopback) {
10035+ try {
10036+ const parsedUrl = new URL(rawUrl);
10037+ if (isPrivateNetworkHost(parsedUrl.hostname || '')) {
10038+ result = { error: 'Refusing to access private network svn url from non-loopback request' };
10039+ break;
10040+ }
10041+ } catch (_) {}
10042+ }
10043+ try {
10044+ result = await getSvnLogs(params || {});
10045+ } catch (e) {
10046+ result = { error: e && e.message ? String(e.message) : 'svn logs failed', status: e && e.status ? e.status : undefined };
10047+ }
10048+ }
10049+ break;
999810050 case 'get-config-template':
999910051 result = getConfigTemplate(params || {});
1000010052 break;
0 commit comments