mirror of
https://github.com/UNITRONIX/BetterDesk.git
synced 2026-10-25 22:10:49 +00:00
30585a8bc7
Panel runs as betterdesk and cannot rewrite /etc/systemd/system/*.service. Write ALLOW_SHARED_NAT_INITIATOR and related flags through the fixed root broker into a service.d drop-in so Settings no longer fails with EACCES. Thanks: INSOLVE (Honorary); Marco Jakobs (@jacotec); MyNameisStitch (@MyNameisStitch); Redspin (@playerumpknow)
118 lines
4.4 KiB
JavaScript
118 lines
4.4 KiB
JavaScript
'use strict';
|
|
|
|
const svc = require('../services/serverConnectionConfigService');
|
|
|
|
describe('serverConnectionConfigService', () => {
|
|
const sampleSystemd = `[Unit]
|
|
Description=BetterDesk Server
|
|
|
|
[Service]
|
|
Type=simple
|
|
ExecStart=/opt/betterdesk/betterdesk-server -mode all
|
|
Environment=P2P_FIRST=Y
|
|
Environment=ALWAYS_USE_RELAY=N
|
|
Restart=always
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
`;
|
|
|
|
const sampleCompose = `services:
|
|
server:
|
|
image: betterdesk-server:local
|
|
environment:
|
|
- ENCRYPTED_ONLY=1
|
|
- DB_URL=/opt/rustdesk/db_v2.sqlite3
|
|
- P2P_FIRST=Y
|
|
console:
|
|
environment:
|
|
- NODE_ENV=production
|
|
`;
|
|
|
|
it('derives connection mode from env vars', () => {
|
|
expect(svc.modeFromEnvVars({ P2P_FIRST: 'Y', ALWAYS_USE_RELAY: 'N' })).toBe('p2p_first');
|
|
expect(svc.modeFromEnvVars({ P2P_FIRST: 'N', ALWAYS_USE_RELAY: 'Y' })).toBe('relay_only');
|
|
expect(svc.modeFromEnvVars({ ALWAYS_USE_RELAY: 'Y' })).toBe('relay_only');
|
|
});
|
|
|
|
it('builds env vars from settings', () => {
|
|
const relayVars = svc.envVarsFromSettings({
|
|
mode: 'relay_only',
|
|
p2p_fallback_ms: 3000,
|
|
same_nat_relay: false,
|
|
allow_shared_nat_initiator: true,
|
|
logged_in_only_initiator: true,
|
|
operator_only_outbound: true
|
|
});
|
|
expect(relayVars.P2P_FIRST).toBe('N');
|
|
expect(relayVars.ALWAYS_USE_RELAY).toBe('Y');
|
|
expect(relayVars.P2P_FALLBACK_MS).toBe('3000');
|
|
expect(relayVars.SAME_NAT_RELAY).toBe('N');
|
|
expect(relayVars.ALLOW_SHARED_NAT_INITIATOR).toBe('Y');
|
|
expect(relayVars.LOGGED_IN_ONLY_INITIATOR).toBe('Y');
|
|
expect(relayVars.OPERATOR_ONLY_OUTBOUND).toBe('Y');
|
|
});
|
|
|
|
it('parses and patches systemd environment blocks', () => {
|
|
const systemdEnv = svc.parseSystemdEnvironment(sampleSystemd);
|
|
expect(systemdEnv.P2P_FIRST).toBe('Y');
|
|
expect(systemdEnv.ALWAYS_USE_RELAY).toBe('N');
|
|
|
|
const relayVars = svc.envVarsFromSettings({
|
|
mode: 'relay_only',
|
|
p2p_fallback_ms: 3000,
|
|
same_nat_relay: false,
|
|
logged_in_only_initiator: true,
|
|
operator_only_outbound: true
|
|
});
|
|
const patchedSystemd = svc.patchSystemdEnvironment(sampleSystemd, relayVars);
|
|
expect(patchedSystemd).toContain('Environment=P2P_FIRST=N');
|
|
expect(patchedSystemd).toContain('Environment=ALWAYS_USE_RELAY=Y');
|
|
expect(patchedSystemd).toContain('Environment=LOGGED_IN_ONLY_INITIATOR=Y');
|
|
expect(patchedSystemd).toContain('Environment=OPERATOR_ONLY_OUTBOUND=Y');
|
|
expect(patchedSystemd.match(/Environment=P2P_FIRST=Y/m)).toBeNull();
|
|
});
|
|
|
|
it('parses and patches docker-compose server environment only', () => {
|
|
const composeEnv = svc.parseDockerComposeEnvironment(sampleCompose);
|
|
expect(composeEnv.P2P_FIRST).toBe('Y');
|
|
expect(composeEnv.ALWAYS_USE_RELAY).toBeUndefined();
|
|
|
|
const relayVars = svc.envVarsFromSettings({
|
|
mode: 'relay_only',
|
|
p2p_fallback_ms: 3000,
|
|
same_nat_relay: false,
|
|
logged_in_only_initiator: true,
|
|
operator_only_outbound: true
|
|
});
|
|
const patchedCompose = svc.patchDockerComposeEnvironment(sampleCompose, relayVars);
|
|
expect(patchedCompose).toContain('- P2P_FIRST=N');
|
|
expect(patchedCompose).toContain('- ALWAYS_USE_RELAY=Y');
|
|
expect(patchedCompose).toContain('- LOGGED_IN_ONLY_INITIATOR=Y');
|
|
expect(patchedCompose).toContain('- OPERATOR_ONLY_OUTBOUND=Y');
|
|
expect(patchedCompose).toContain('- ENCRYPTED_ONLY=1');
|
|
expect(patchedCompose).not.toMatch(/console:\n environment:\n - P2P_FIRST/);
|
|
});
|
|
|
|
it('parses login-only initiator setting', () => {
|
|
const settings = svc.settingsFromEnv(
|
|
{ P2P_FIRST: 'Y', LOGGED_IN_ONLY_INITIATOR: 'Y' },
|
|
'systemd'
|
|
);
|
|
expect(settings.logged_in_only_initiator).toBe(true);
|
|
});
|
|
|
|
it('parses operator-only outbound setting', () => {
|
|
const settings = svc.settingsFromEnv(
|
|
{ P2P_FIRST: 'Y', OPERATOR_ONLY_OUTBOUND: 'Y' },
|
|
'systemd'
|
|
);
|
|
expect(settings.operator_only_outbound).toBe(true);
|
|
});
|
|
|
|
it('exports systemd connection drop-in path', () => {
|
|
expect(svc.SYSTEMD_CONNECTION_DROPIN).toContain('betterdesk-server.service.d');
|
|
expect(svc.SYSTEMD_CONNECTION_DROPIN).toContain('50-betterdesk-connection.conf');
|
|
});
|
|
});
|