You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			298 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			298 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
import os
 | 
						|
import re
 | 
						|
import shutil
 | 
						|
from os.path import expanduser
 | 
						|
from mamba import description, context, fcontext, it, fit, before, after
 | 
						|
from expects import expect, equal, contain, match
 | 
						|
 | 
						|
from helper.spec_helper import start_xvnc, kill_xvnc, run_cmd, clean_env, \
 | 
						|
    add_kasmvnc_user_docker, clean_kasm_users, start_xvnc_pexpect, \
 | 
						|
    write_config, config_filename
 | 
						|
 | 
						|
home_dir = expanduser("~")
 | 
						|
vnc_dir = f'{home_dir}/.vnc'
 | 
						|
user_config = f'{vnc_dir}/kasmvnc.yaml'
 | 
						|
 | 
						|
 | 
						|
def run_vncserver():
 | 
						|
    return run_cmd(f'vncserver -dry-run -config {config_filename}')
 | 
						|
 | 
						|
 | 
						|
def pick_cli_option(cli_option, xvnc_cmd):
 | 
						|
    cli_option_regex = re.compile(f'\'?-{cli_option}\'?(?:\s+[^-][^\s]*|$)')
 | 
						|
    results = cli_option_regex.findall(xvnc_cmd)
 | 
						|
    if len(results) == 0:
 | 
						|
        return None
 | 
						|
 | 
						|
    return ' '.join(results)
 | 
						|
 | 
						|
 | 
						|
def prepare_env():
 | 
						|
    os.makedirs(vnc_dir, exist_ok=True)
 | 
						|
    shutil.copyfile('spec/kasmvnc.yaml', user_config)
 | 
						|
 | 
						|
 | 
						|
with description('YAML to CLI') as self:
 | 
						|
    with before.all:
 | 
						|
        prepare_env()
 | 
						|
 | 
						|
    with context("convert a boolean key"):
 | 
						|
        with it("convert true to 1"):
 | 
						|
            write_config('''
 | 
						|
            desktop:
 | 
						|
                allow_resize: true
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('AcceptSetDesktopSize',
 | 
						|
                                         completed_process.stdout)
 | 
						|
            expect(cli_option).to(equal("-AcceptSetDesktopSize '1'"))
 | 
						|
 | 
						|
        with it("convert false to 0"):
 | 
						|
            write_config('''
 | 
						|
            desktop:
 | 
						|
                allow_resize: false
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('AcceptSetDesktopSize',
 | 
						|
                                         completed_process.stdout)
 | 
						|
            expect(cli_option).to(equal("-AcceptSetDesktopSize '0'"))
 | 
						|
 | 
						|
    with it("converts a numeric key to a CLI arg"):
 | 
						|
        write_config('''
 | 
						|
        security:
 | 
						|
            brute_force_protection:
 | 
						|
                blacklist_threshold: 2
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('BlacklistThreshold',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-BlacklistThreshold '2'"))
 | 
						|
 | 
						|
    with it("converts an ANY key to a CLI arg"):
 | 
						|
        write_config('''
 | 
						|
        network:
 | 
						|
            ssl:
 | 
						|
               pem_certificate: /etc/ssl/certs/ssl-cert-snakeoil.pem
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('cert',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(
 | 
						|
            equal("-cert '/etc/ssl/certs/ssl-cert-snakeoil.pem'"))
 | 
						|
 | 
						|
    with it("converts an array key to a CLI arg"):
 | 
						|
        write_config('''
 | 
						|
        keyboard:
 | 
						|
            remap_keys:
 | 
						|
                - 0x22->0x40
 | 
						|
                - 0x24->0x40
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('RemapKeys',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(
 | 
						|
            equal("-RemapKeys '0x22->0x40,0x24->0x40'"))
 | 
						|
 | 
						|
    with it("converts a constant value to the corresponding numeric value"):
 | 
						|
        write_config('''
 | 
						|
        data_loss_prevention:
 | 
						|
            clipboard:
 | 
						|
                server_to_client:
 | 
						|
                    size: 20
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('DLP_ClipSendMax',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-DLP_ClipSendMax '20'"))
 | 
						|
 | 
						|
    with context("websocketPort"):
 | 
						|
        with it("converts 'auto' value to calculated value"):
 | 
						|
            write_config('''
 | 
						|
            network:
 | 
						|
                websocket_port: auto
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('websocketPort',
 | 
						|
                                         completed_process.stdout)
 | 
						|
            expect(["-websocketPort '8444'", "-websocketPort '8445'"]). \
 | 
						|
                to(contain(cli_option))
 | 
						|
 | 
						|
        with it("passes numeric value to CLI option"):
 | 
						|
            write_config('''
 | 
						|
            network:
 | 
						|
                websocket_port: 8555
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('websocketPort',
 | 
						|
                                         completed_process.stdout)
 | 
						|
            expect(cli_option).to(equal("-websocketPort '8555'"))
 | 
						|
 | 
						|
        with it("no key - no CLI option"):
 | 
						|
            write_config('''
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('websocketPort',
 | 
						|
                                         completed_process.stdout)
 | 
						|
            expect(cli_option).to(equal(None))
 | 
						|
 | 
						|
    with context("option that can yield nothing"):
 | 
						|
        with it("converts a config value that yields nothing"):
 | 
						|
            write_config('''
 | 
						|
            network:
 | 
						|
                protocol: http
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('noWebsocket',
 | 
						|
                                         completed_process.stdout)
 | 
						|
            expect(cli_option).to(equal(None))
 | 
						|
 | 
						|
        with it("converts a config value that yields CLI option"):
 | 
						|
            write_config('''
 | 
						|
            network:
 | 
						|
                protocol: vnc
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('noWebsocket',
 | 
						|
                                         completed_process.stdout)
 | 
						|
            expect(cli_option).to(equal("-noWebsocket '1'"))
 | 
						|
 | 
						|
    with it("interpolates env variable"):
 | 
						|
        write_config('''
 | 
						|
        server:
 | 
						|
            advanced:
 | 
						|
                kasm_password_file: ${HOME}/.kasmpasswd
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('KasmPasswordFile',
 | 
						|
                                        completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-KasmPasswordFile '/home/docker/.kasmpasswd'"))
 | 
						|
 | 
						|
    with it("converts logging options into one -Log"):
 | 
						|
        write_config('''
 | 
						|
        logging:
 | 
						|
            log_writer_name: all
 | 
						|
            log_dest: logfile
 | 
						|
            level: 40
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('Log',
 | 
						|
                                        completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-Log '*:stdout:40'"))
 | 
						|
 | 
						|
    with it("converts DLP region options into one -DLP_Region"):
 | 
						|
        write_config('''
 | 
						|
        data_loss_prevention:
 | 
						|
            visible_region:
 | 
						|
                top: -10
 | 
						|
                left: 10
 | 
						|
                right: 40%
 | 
						|
                bottom: 40
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('DLP_Region',
 | 
						|
                                        completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-DLP_Region '10,-10,40%,40'"))
 | 
						|
 | 
						|
    with context("converts x_font_path"):
 | 
						|
        with it("auto"):
 | 
						|
            write_config('''
 | 
						|
            server:
 | 
						|
                advanced:
 | 
						|
                    x_font_path: auto
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('fp',
 | 
						|
                                        completed_process.stdout)
 | 
						|
            expect(cli_option).to(match(r'/usr/share/fonts'))
 | 
						|
 | 
						|
        with it("none specified"):
 | 
						|
            write_config('''
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('fp',
 | 
						|
                                        completed_process.stdout)
 | 
						|
            expect(cli_option).to(match(r'/usr/share/fonts'))
 | 
						|
 | 
						|
        with it("path specified"):
 | 
						|
            write_config('''
 | 
						|
            server:
 | 
						|
                advanced:
 | 
						|
                    x_font_path: /src
 | 
						|
            ''')
 | 
						|
            completed_process = run_vncserver()
 | 
						|
            cli_option = pick_cli_option('fp', completed_process.stdout)
 | 
						|
            expect(cli_option).to(equal("-fp '/src'"))
 | 
						|
 | 
						|
        with it("CLI override"):
 | 
						|
            write_config('''
 | 
						|
            server:
 | 
						|
                advanced:
 | 
						|
                    x_font_path: /src
 | 
						|
            ''')
 | 
						|
            completed_process = \
 | 
						|
                run_cmd(f'vncserver -dry-run -fp /override -config {config_filename}')
 | 
						|
            cli_option = pick_cli_option('fp', completed_process.stdout)
 | 
						|
            expect(cli_option).to(equal("-fp '/override'"))
 | 
						|
 | 
						|
    with it("converts network.interface to -interface"):
 | 
						|
        write_config('''
 | 
						|
        network:
 | 
						|
            interface: 0.0.0.0
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('interface',
 | 
						|
                                    completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-interface '0.0.0.0'"))
 | 
						|
 | 
						|
    with it("CLI option directly passed, overrides config"):
 | 
						|
        write_config('''
 | 
						|
        encoding:
 | 
						|
            video_encoding_mode:
 | 
						|
                jpeg_quality: -1
 | 
						|
        ''')
 | 
						|
        completed_process = \
 | 
						|
            run_cmd(f'vncserver -dry-run -JpegVideoQuality 8 -config {config_filename}')
 | 
						|
        cli_option = pick_cli_option("JpegVideoQuality",
 | 
						|
                                    completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("'-JpegVideoQuality' '8'"))
 | 
						|
 | 
						|
    with it("converts 2 keys into a single CLI option"):
 | 
						|
        write_config('''
 | 
						|
        desktop:
 | 
						|
            resolution:
 | 
						|
                width: 1024
 | 
						|
                height: 768
 | 
						|
        ''')
 | 
						|
        completed_process = run_vncserver()
 | 
						|
        cli_option = pick_cli_option('geometry',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-geometry '1024x768'"))
 | 
						|
 | 
						|
    with it("ignores empty section override"):
 | 
						|
        write_config('''
 | 
						|
        security:
 | 
						|
        ''')
 | 
						|
        completed_process = \
 | 
						|
            run_cmd(f'vncserver -dry-run -config spec/fixtures/global_config.yaml,{config_filename}')
 | 
						|
        cli_option = pick_cli_option('BlacklistThreshold',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-BlacklistThreshold '6'"))
 | 
						|
 | 
						|
    with it("overrides default config value with global config value"):
 | 
						|
        completed_process = run_cmd("vncserver -dry-run -config spec/fixtures/defaults_config.yaml,spec/fixtures/global_config.yaml")
 | 
						|
        cli_option = pick_cli_option('BlacklistThreshold',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-BlacklistThreshold '6'"))
 | 
						|
 | 
						|
    with it("uses default config value even if section was overriden"):
 | 
						|
        completed_process = run_cmd("vncserver -dry-run -config spec/fixtures/defaults_config.yaml,spec/fixtures/global_config.yaml")
 | 
						|
        cli_option = pick_cli_option('BlacklistTimeout',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-BlacklistTimeout '10'"))
 | 
						|
 | 
						|
    with it("overrides global config with user config value"):
 | 
						|
        completed_process = run_cmd("vncserver -dry-run -config spec/fixtures/defaults_config.yaml,spec/fixtures/global_config.yaml,spec/fixtures/user_config.yaml")
 | 
						|
        cli_option = pick_cli_option('BlacklistThreshold',
 | 
						|
                                     completed_process.stdout)
 | 
						|
        expect(cli_option).to(equal("-BlacklistThreshold '7'"))
 |