aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorIgor Wiedler <igor@wiedler.ch>2011-07-13 19:20:16 +0200
committerIgor Wiedler <igor@wiedler.ch>2011-07-15 22:34:24 +0200
commit0bf6966c5228d446c4f0d3862619db0f619c7369 (patch)
tree3f8adfb570262a9296e7a4fdb191804bfde7a4c0 /tests
parent09e0460e5b53f83f4c06703c8bd8f1cb0f22eb48 (diff)
downloadforums-0bf6966c5228d446c4f0d3862619db0f619c7369.tar
forums-0bf6966c5228d446c4f0d3862619db0f619c7369.tar.gz
forums-0bf6966c5228d446c4f0d3862619db0f619c7369.tar.bz2
forums-0bf6966c5228d446c4f0d3862619db0f619c7369.tar.xz
forums-0bf6966c5228d446c4f0d3862619db0f619c7369.zip
[feature/request-class] Add server(), header() and is_ajax() to request
Extend the request class with helpers for reading server vars (server()) and HTTP request headers (header()). Refactor the existing code base to make use of these helpers, make $_SERVER a deactivated super global. Also introduce an is_ajax() method, which checks the X-Requested-With header for the value 'XMLHttpRequest', which is sent by JavaScript libraries, such as jQuery. PHPBB3-9716
Diffstat (limited to 'tests')
-rw-r--r--tests/bbcode/url_bbcode_test.php4
-rw-r--r--tests/download/http_byte_range_test.php12
-rw-r--r--tests/mock/request.php35
-rw-r--r--tests/request/request_test.php15
-rw-r--r--tests/request/type_cast_helper_test.php10
-rw-r--r--tests/security/base.php36
-rw-r--r--tests/security/extract_current_page_test.php16
7 files changed, 100 insertions, 28 deletions
diff --git a/tests/bbcode/url_bbcode_test.php b/tests/bbcode/url_bbcode_test.php
index cd85dbd0d9..68c97ede50 100644
--- a/tests/bbcode/url_bbcode_test.php
+++ b/tests/bbcode/url_bbcode_test.php
@@ -12,6 +12,7 @@ require_once dirname(__FILE__) . '/../../phpBB/includes/functions_content.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/bbcode.php';
require_once dirname(__FILE__) . '/../../phpBB/includes/message_parser.php';
require_once dirname(__FILE__) . '/../mock_user.php';
+require_once dirname(__FILE__) . '/../mock/request.php';
class phpbb_url_bbcode_test extends phpbb_test_case
{
@@ -51,8 +52,9 @@ class phpbb_url_bbcode_test extends phpbb_test_case
*/
public function test_url($description, $message, $expected)
{
- global $user;
+ global $user, $request;
$user = new phpbb_mock_user;
+ $request = new phpbb_mock_request;
$bbcode = new bbcode_firstpass();
$bbcode->message = $message;
diff --git a/tests/download/http_byte_range_test.php b/tests/download/http_byte_range_test.php
index ba2caee192..36cbcab0b0 100644
--- a/tests/download/http_byte_range_test.php
+++ b/tests/download/http_byte_range_test.php
@@ -8,23 +8,27 @@
*/
require_once dirname(__FILE__) . '/../../phpBB/includes/functions_download.php';
+require_once dirname(__FILE__) . '/../mock/request.php';
class phpbb_download_http_byte_range_test extends phpbb_test_case
{
public function test_find_range_request()
{
// Missing 'bytes=' prefix
- $_SERVER['HTTP_RANGE'] = 'bztes=';
+ $GLOBALS['request'] = new phpbb_mock_request();
+ $GLOBALS['request']->set_header('Range', 'bztes=');
$this->assertEquals(false, phpbb_find_range_request());
- unset($_SERVER['HTTP_RANGE']);
+ unset($GLOBALS['request']);
+ $GLOBALS['request'] = new phpbb_mock_request();
$_ENV['HTTP_RANGE'] = 'bztes=';
$this->assertEquals(false, phpbb_find_range_request());
unset($_ENV['HTTP_RANGE']);
- $_SERVER['HTTP_RANGE'] = 'bytes=0-0,123-125';
+ $GLOBALS['request'] = new phpbb_mock_request();
+ $GLOBALS['request']->set_header('Range', 'bytes=0-0,123-125');
$this->assertEquals(array('0-0', '123-125'), phpbb_find_range_request());
- unset($_SERVER['HTTP_RANGE']);
+ unset($GLOBALS['request']);
}
/**
diff --git a/tests/mock/request.php b/tests/mock/request.php
index da4015e78b..63f3f820ba 100644
--- a/tests/mock/request.php
+++ b/tests/mock/request.php
@@ -11,12 +11,13 @@ class phpbb_mock_request implements phpbb_request_interface
{
protected $data;
- public function __construct($get = array(), $post = array(), $cookie = array(), $request = false)
+ public function __construct($get = array(), $post = array(), $cookie = array(), $server = array(), $request = false)
{
$this->data[phpbb_request_interface::GET] = $get;
$this->data[phpbb_request_interface::POST] = $post;
$this->data[phpbb_request_interface::COOKIE] = $cookie;
$this->data[phpbb_request_interface::REQUEST] = ($request === false) ? $post + $get : $request;
+ $this->data[phpbb_request_interface::SERVER] = $server;
}
public function overwrite($var_name, $value, $super_global = phpbb_request_interface::REQUEST)
@@ -24,11 +25,23 @@ class phpbb_mock_request implements phpbb_request_interface
$this->data[$super_global][$var_name] = $value;
}
- public function variable($var_name, $default, $multibyte = false, $super_global = phpbb_request_interface::REQUEST)
+ public function variable($var_name, $default, $multibyte = false, $super_global = phpbb_request_interface::REQUEST, $html_encode = true)
{
return isset($this->data[$super_global][$var_name]) ? $this->data[$super_global][$var_name] : $default;
}
+ public function server($var_name, $default = '', $html_encode = false)
+ {
+ $super_global = phpbb_request_interface::SERVER;
+ return isset($this->data[$super_global][$var_name]) ? $this->data[$super_global][$var_name] : $default;
+ }
+
+ public function header($header_name, $default = '', $html_encode = false)
+ {
+ $var_name = 'HTTP_'.str_replace('-', '_', strtoupper($header_name));
+ return $this->server($var_name, $default, $html_encode);
+ }
+
public function is_set_post($name)
{
return $this->is_set($name, phpbb_request_interface::POST);
@@ -39,8 +52,26 @@ class phpbb_mock_request implements phpbb_request_interface
return isset($this->data[$super_global][$var]);
}
+ public function is_ajax()
+ {
+ return false;
+ }
+
public function variable_names($super_global = phpbb_request_interface::REQUEST)
{
return array_keys($this->data[$super_global]);
}
+
+ /* custom methods */
+
+ public function set_header($header_name, $value)
+ {
+ $var_name = 'HTTP_'.str_replace('-', '_', strtoupper($header_name));
+ $this->data[phpbb_request_interface::SERVER][$var_name] = $value;
+ }
+
+ public function merge($super_global = phpbb_request_interface::REQUEST, $values)
+ {
+ $this->data[$super_global] = array_merge($this->data[$super_global], $values);
+ }
}
diff --git a/tests/request/request_test.php b/tests/request/request_test.php
index 203c9fd880..9999e88121 100644
--- a/tests/request/request_test.php
+++ b/tests/request/request_test.php
@@ -23,7 +23,6 @@ class phpbb_request_test extends phpbb_test_case
$_GET['unset'] = '';
$this->type_cast_helper = $this->getMock('phpbb_request_type_cast_helper_interface');
-
$this->request = new phpbb_request($this->type_cast_helper);
}
@@ -60,6 +59,20 @@ class phpbb_request_test extends phpbb_test_case
$this->assertFalse($this->request->is_set_post('unset'));
}
+ public function test_is_ajax_without_ajax()
+ {
+ $this->assertFalse($this->request->is_ajax());
+ }
+
+ public function test_is_ajax_with_ajax()
+ {
+ $this->request->enable_super_globals();
+ $_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
+ $this->request = new phpbb_request($this->type_cast_helper);
+
+ $this->assertTrue($this->request->is_ajax());
+ }
+
public function test_variable_names()
{
$expected = array('test', 'unset');
diff --git a/tests/request/type_cast_helper_test.php b/tests/request/type_cast_helper_test.php
index 06cf2e1bf6..0103c51561 100644
--- a/tests/request/type_cast_helper_test.php
+++ b/tests/request/type_cast_helper_test.php
@@ -48,4 +48,14 @@ class phpbb_type_cast_helper_test extends phpbb_test_case
$this->assertEquals($expected, $data);
}
+
+ public function test_simple_set_var_without_html_encoding()
+ {
+ $data = 'eviL<3';
+ $expected = 'eviL<3';
+
+ $this->type_cast_helper->recursive_set_var($data, '', true, false);
+
+ $this->assertEquals($expected, $data);
+ }
}
diff --git a/tests/security/base.php b/tests/security/base.php
index db9c884cf4..4b259a2aac 100644
--- a/tests/security/base.php
+++ b/tests/security/base.php
@@ -7,6 +7,8 @@
*
*/
+require_once dirname(__FILE__) . '/../mock/request.php';
+
abstract class phpbb_security_test_base extends phpbb_test_case
{
/**
@@ -14,20 +16,20 @@ abstract class phpbb_security_test_base extends phpbb_test_case
*/
protected function setUp()
{
- global $user, $phpbb_root_path;
+ global $user, $phpbb_root_path, $request;
// Put this into a global function being run by every test to init a proper user session
- $_SERVER['HTTP_HOST'] = 'localhost';
- $_SERVER['SERVER_NAME'] = 'localhost';
- $_SERVER['SERVER_ADDR'] = '127.0.0.1';
- $_SERVER['SERVER_PORT'] = 80;
- $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
- $_SERVER['QUERY_STRING'] = '';
- $_SERVER['REQUEST_URI'] = '/tests/';
- $_SERVER['SCRIPT_NAME'] = '/tests/index.php';
- $_SERVER['PHP_SELF'] = '/tests/index.php';
- $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14';
- $_SERVER['HTTP_ACCEPT_LANGUAGE'] = 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
+ $server['HTTP_HOST'] = 'localhost';
+ $server['SERVER_NAME'] = 'localhost';
+ $server['SERVER_ADDR'] = '127.0.0.1';
+ $server['SERVER_PORT'] = 80;
+ $server['REMOTE_ADDR'] = '127.0.0.1';
+ $server['QUERY_STRING'] = '';
+ $server['REQUEST_URI'] = '/tests/';
+ $server['SCRIPT_NAME'] = '/tests/index.php';
+ $server['PHP_SELF'] = '/tests/index.php';
+ $server['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14';
+ $server['HTTP_ACCEPT_LANGUAGE'] = 'de-de,de;q=0.8,en-us;q=0.5,en;q=0.3';
/*
[HTTP_ACCEPT_ENCODING] => gzip,deflate
@@ -36,13 +38,15 @@ abstract class phpbb_security_test_base extends phpbb_test_case
[SCRIPT_FILENAME] => /var/www/tests/index.php
*/
+ $request = new phpbb_mock_request(array(), array(), array(), $server);
+
// Set no user and trick a bit to circumvent errors
$user = new user();
$user->lang = true;
- $user->browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : '';
- $user->referer = (!empty($_SERVER['HTTP_REFERER'])) ? htmlspecialchars((string) $_SERVER['HTTP_REFERER']) : '';
- $user->forwarded_for = (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) ? (string) $_SERVER['HTTP_X_FORWARDED_FOR'] : '';
- $user->host = (!empty($_SERVER['HTTP_HOST'])) ? (string) strtolower($_SERVER['HTTP_HOST']) : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
+ $user->browser = $server['HTTP_USER_AGENT'];
+ $user->referer = '';
+ $user->forwarded_for = '';
+ $user->host = $server['HTTP_HOST'];
$user->page = session::extract_current_page($phpbb_root_path);
}
diff --git a/tests/security/extract_current_page_test.php b/tests/security/extract_current_page_test.php
index 71c7a3a397..34c7b52f49 100644
--- a/tests/security/extract_current_page_test.php
+++ b/tests/security/extract_current_page_test.php
@@ -27,8 +27,12 @@ class phpbb_security_extract_current_page_test extends phpbb_security_test_base
*/
public function test_query_string_php_self($url, $query_string, $expected)
{
- $_SERVER['PHP_SELF'] = $url;
- $_SERVER['QUERY_STRING'] = $query_string;
+ global $request;
+
+ $request->merge(phpbb_request_interface::SERVER, array(
+ 'PHP_SELF' => $url,
+ 'QUERY_STRING' => $query_string,
+ ));
$result = session::extract_current_page('./');
@@ -41,8 +45,12 @@ class phpbb_security_extract_current_page_test extends phpbb_security_test_base
*/
public function test_query_string_request_uri($url, $query_string, $expected)
{
- $_SERVER['REQUEST_URI'] = $url . '?' . $query_string;
- $_SERVER['QUERY_STRING'] = $query_string;
+ global $request;
+
+ $request->merge(phpbb_request_interface::SERVER, array(
+ 'PHP_SELF' => $url,
+ 'QUERY_STRING' => $query_string,
+ ));
$result = session::extract_current_page('./');
"hl str">"Generic 3 Button Mouse") ], [ 5, 'ms3', 'IntelliMouse', __("Microsoft IntelliMouse") ], [ 3, 'MouseMan', 'MouseMan', __("Logitech MouseMan") ], [ 2, 'MouseSystems', 'MouseSystems', __("Mouse Systems") ], '', [ 3, 'logim', 'MouseMan', __("Logitech CC Series") ], [ 5, 'pnp', 'IntelliMouse', __("Logitech MouseMan+/FirstMouse+") ], [ 5, 'ms3', 'IntelliMouse', __("Genius NetMouse") ], [ 2, 'MMSeries', 'MMSeries', __("MM Series") ], [ 2, 'MMHitTab', 'MMHittab', __("MM HitTablet") ], [ 3, 'Logitech', 'Logitech', __("Logitech Mouse (serial, old C7 type)") ], [ 3, 'Microsoft', 'ThinkingMouse', __("Kensington Thinking Mouse") ], ]], __("busmouse") => [ [ arch() eq 'ppc' ? 'adbmouse' : ('atibm', 'inportbm', 'logibm') ], [ if_(arch() eq 'ppc', [ 1, 'Busmouse', 'BusMouse', __("1 button") ]), [ 2, 'Busmouse', 'BusMouse', __("2 buttons") ], [ 3, 'Busmouse', 'BusMouse', __("3 buttons") ], ]], __("none") => [ [ 'none' ], [ [ 0, 'none', 'Microsoft', __("No mouse") ], ]], ); sub xmouse2xId { #- xmousetypes must be sorted as found in /usr/include/X11/extensions/xf86misc.h #- so that first mean "0", etc my @xmousetypes = ( "Microsoft", "MouseSystems", "MMSeries", "Logitech", "BusMouse", #MouseMan, "Logitech", "PS/2", "MMHittab", "GlidePoint", "IntelliMouse", "ThinkingMouse", "IMPS/2", "ThinkingMousePS/2", "MouseManPlusPS/2", "GlidePointPS/2", "NetMousePS/2", "NetScrollPS/2", "SysMouse", "Auto", "AceCad", "WSMouse", "USB", ); my ($id) = @_; $id = 'BusMouse' if $id eq 'MouseMan'; my $i; map_index { $_ eq $id and $i = $::i } @xmousetypes; $i; } my %mouse_btn_keymap = ( 0 => "NONE", 67 => "F9", 68 => "F10", 87 => "F11", 88 => "F12", 85 => "F13", 89 => "F14", 90 => "F15", 56 => "L-Option/Alt", 125 => "L-Command", 98 => "Num: /", 55 => "Num: *", 117 => "Num: =", ); sub ppc_one_button_keys { keys %mouse_btn_keymap } sub ppc_one_button_key2text { $mouse_btn_keymap{$_[0]} } sub raw2mouse { my ($type, $raw) = @_; $raw or return; my %l; @l{@mouses_fields} = @$raw; +{ %l, type => $type }; } sub update_type_name { my ($mouse) = @_; while (my ($k, $v) = each %mice) { $mouse->{device} =~ /usb/ && $k ne 'USB' and next; #- avoid mixing USB and PS/2 mice. foreach (@{$v->[1]}) { if ($_->[0] == $mouse->{nbuttons} && $_->[2] eq $mouse->{XMOUSETYPE}) { add2hash($mouse, { MOUSETYPE => $_->[1], type => $k, name => $_->[3], }); return $mouse; } } } } sub fullnames { map_each { my $type = $::a; grep {$_} map { if ($_) { my $l = raw2mouse($type, $_); "$type|$l->{name}"; } else { $type .= "|[" . _("Other") . "]"; ''; } } @{$::b->[1]} } %mice; } sub fullname2mouse { my ($fname, %opts) = @_; my ($type, @l) = split '\|', $fname; my ($name) = pop @l; $opts{device} ||= $mice{$type}[0][0]; foreach (@{$mice{$type}[1]}) { my $l = raw2mouse($type, $_); $name eq $l->{name} and return { %$l, %opts }; } die "$fname not found ($type, $name)"; } sub serial_ports() { map { "ttyS$_" } 0..7 } sub serial_port2text { $_[0] =~ /ttyS(\d+)/ ? "$_[0] / COM" . ($1 + 1) : $_[0]; } sub read { my ($prefix) = @_; my %mouse = getVarsFromSh "$prefix/etc/sysconfig/mouse"; eval { add2hash_(\%mouse, fullname2mouse($mouse{FULLNAME})) }; $mouse{device} = readlink "$prefix/dev/mouse" or log::l("reading $prefix/dev/mouse symlink failed"); $mouse{nbuttons} = $mouse{XEMU3} eq "yes" ? 2 : $mouse{WHEEL} eq "yes" ? 5 : 3; \%mouse; } sub write { my ($prefix, $mouse) = @_; local $mouse->{FULLNAME} = qq("$mouse->{type}|$mouse->{name}"); #-" local $mouse->{XEMU3} = bool2yesno($mouse->{nbuttons} < 3); local $mouse->{WHEEL} = bool2yesno($mouse->{nbuttons} > 3); setVarsInSh("$prefix/etc/sysconfig/mouse", $mouse, qw(MOUSETYPE XMOUSETYPE FULLNAME XEMU3 WHEEL device)); any::devfssymlinkf ($mouse->{device}, 'mouse', $prefix) or log::l("creating $prefix/dev/mouse symlink failed"); $mouse->{auxmouse} and any::devfssymlinkf ($mouse->{auxmouse}{device}, 'mouse1', $prefix) or log::l("creating $prefix/dev/mouse1 symlink failed"); if (arch() =~ /ppc/) { my $s = join('', "dev.mac_hid.mouse_button_emulation = " . to_bool($mouse->{button2_key} || $mouse->{button3_key}) . "\n", if_($mouse->{button2_key}, "dev.mac_hid.mouse_button2_keycode = $mouse->{button2_key}\n"), if_($mouse->{button3_key}, "dev.mac_hid.mouse_button3_keycode = $mouse->{button3_key}\n"), ); substInFile { $_ = '' if /^\Qdev.mac_hid.mouse_button/; $_ .= $s if eof; } "$prefix/etc/sysctl.conf"; #- hack - dev RPM symlinks to mouse0 - lands on mouse1 with new input layer on PPC input/mice will get both ADB and USB symlinkf "/dev/input/mice", "$prefix/dev/usbmouse" if ($mouse->{device} eq "usbmouse"); } } sub mouseconfig { my ($t, $mouse, @wacom); #- Whouah! probing all devices from ttyS0 to ttyS3 once a time! detect_devices::probeSerialDevices(); #- check new probing methods keep everything used here intact! foreach (0..3) { $t = detect_devices::probeSerial("/dev/ttyS$_"); if ($t->{CLASS} eq 'MOUSE') { $t->{MFG} ||= $t->{MANUFACTURER}; $mouse = fullname2mouse("serial|Microsoft IntelliMouse") if $t->{MFG} eq 'MSH' && $t->{MODEL} eq '0001'; $mouse = fullname2mouse("serial|Logitech MouseMan") if $t->{MFG} eq 'LGI' && $t->{MODEL} =~ /^80/; $mouse = fullname2mouse("serial|Genius NetMouse") if $t->{MFG} eq 'KYE' && $t->{MODEL} eq '0003'; $mouse ||= fullname2mouse("serial|Generic 2 Button Mouse"); #- generic by default. $mouse->{device} = "ttyS$_"; last; } elsif ($t->{CLASS} eq "PEN" || $t->{MANUFACTURER} eq "WAC") { push @wacom, "ttyS$_"; } } $mouse, @wacom; } sub detect() { if (arch() =~ /^sparc/) { return fullname2mouse("sunmouse|Sun - Mouse"); } if (arch() eq "ppc") { return fullname2mouse(detect_devices::hasMousePS2("usbmouse") ? "USB|1 button" : # No need to search for an ADB mouse. If I did, the PPC kernel would # find one whether or not I had one installed! So.. default to it. "busmouse|1 button"); } my @wacom; my $fast_mouse_probe = sub { my $auxmouse = detect_devices::hasMousePS2("psaux") && fullname2mouse("PS/2|Standard", unsafe => 1); if (modules::get_alias("usb-interface")) { if (my (@l) = detect_devices::usbMice()) { log::l("found usb mouse $_->{driver} $_->{description} ($_->{type})") foreach @l; eval { modules::load("usbmouse"); modules::load("mousedev"); }; if (!$@ && detect_devices::tryOpen("usbmouse")) { my $mouse = fullname2mouse($l[0]{driver} =~ /Mouse:(.*)/ ? $1 : "USB|Generic"); $auxmouse and $mouse->{auxmouse} = $auxmouse; #- for laptop, we kept the PS/2 as secondary (symbolic). return $mouse; } eval { modules::unload("mousedev"); modules::unload("usbmouse"); }; } } $auxmouse; }; if (modules::get_alias("usb-interface")) { my $keep_mouse; if (my (@l) = detect_devices::usbWacom()) { log::l("found usb wacom $_->{driver} $_->{description} ($_->{type})") foreach @l; eval { modules::load("wacom"); modules::load("evdev"); }; unless ($@) { foreach (0..$#l) { detect_devices::tryOpen("input/event$_") and $keep_mouse = 1, push @wacom, "input/event$_"; } } $keep_mouse or eval { modules::unload("evdev"); modules::unload("wacom"); }; } } #- at this level, not all possible mice are detected so avoid invoking serial_probe #- which takes a while for its probe. if ($::isStandalone) { my $mouse = $fast_mouse_probe->(); $mouse and return ($mouse, @wacom); } #- probe serial device to make sure a wacom has been detected. eval { modules::load("serial") }; my ($r, @serial_wacom) = mouseconfig(); push @wacom, @serial_wacom; if (!$::isStandalone) { my $mouse = $fast_mouse_probe->(); $r && $mouse and $r->{auxmouse} = $mouse; #- we kept the auxilliary mouse as PS/2. $r and return ($r, @wacom); $mouse and return ($mouse, @wacom); } else { $r and return ($r, @wacom); } #- in case only a wacom has been found, assume an inexistant mouse (necessary). @wacom and return { CLASS => 'MOUSE', nbuttons => 2, device => "nothing", MOUSETYPE => "Microsoft", XMOUSETYPE => "Microsoft"}, @wacom; #- defaults to generic serial mouse on ttyS0. #- Oops? using return let return a hash ref, if not using it, it return a list directly :-) return fullname2mouse("serial|Generic 2 Button Mouse", unsafe => 1); } #- write_conf : write the mouse infos into the Xconfig files. #- input : #- $mouse : the hashtable containing the informations #- $mouse input #- $mouse->{nbuttons} : number of buttons : integer #- $mouse->{device} : device of the mouse : string : ex 'psaux' #- $mouse->{XMOUSETYPE} : type of the mouse for gpm : string : ex 'PS/2' #- $mouse->{type} : type (generic ?) of the mouse : string : ex 'PS/2' #- $mouse->{name} : name of the mouse : string : ex 'Standard' #- $mouse->{MOUSETYPE} : type of the mouse : string : ex "ps/2" #- $mouse->{XEMU3} : emulate 3rd button : string : 'yes' or 'no' sub write_conf { my ($mouse) = @_; &write('', $mouse); modules::write_conf('') if $mouse->{device} eq "usbmouse" && !$::testing; my $f = "/etc/X11/XF86Config"; my $g = "/etc/X11/XF86Config-4"; my $update_mouse = sub { my ($mouse) = @_; my ($zaxis, $zaxis_aux) = map { [ $_->{nbuttons} > 3 ? [ "ZAxisMapping", "4 5" ] : (), $_->{nbuttons} > 5 ? [ "ZAxisMapping", "6 7" ] : (), $_->{nbuttons} < 3 ? ([ "Emulate3Buttons" ], [ "Emulate3Timeout", "50" ]) : () ] } grep { $_ } ($mouse, $mouse->{auxmouse}); my ($str_zaxis, $str_zaxis_aux) = map { join('', map { qq(\n $_->[0]) . ($_->[1] && qq( $_->[1])) } @$_) } grep { $_ } ($zaxis, $zaxis_aux); my $found_auxmouse = 0; substInFile { if (/^Section\s+"Pointer"/ .. /^EndSection/) { $_ = '' if /(ZAxisMapping|Emulate3)/; #- remove existing line s|^(\s*Protocol\s+).*|$1"$mouse->{XMOUSETYPE}"|; s|^(\s*Device\s+).*|$1"/dev/$mouse->{device}"$str_zaxis|; } if ($mouse->{auxmouse}) { if (/DeviceName\s+"Mouse2"/ .. /^EndSection/) { $found_auxmouse = 1; $_ = '' if /(ZAxisMapping|Emulate3)/; #- remove existing line s|^(\s*Protocol\s+).*|$1"$mouse->{auxmouse}{XMOUSETYPE}"|; s|^(\s*Device\s+).*|$1"/dev/$mouse->{auxmouse}{device}"$str_zaxis_aux|; } } } $f if -e $f && !$::testing; substInFile { if (my $l = /^Section\s+"Pointer"/ .. /^EndSection/) { $l =~ /E/ and $_ .= qq( Section "XInput" SubSection "Mouse" DeviceName "Mouse2" Protocol "$mouse->{auxmouse}{XMOUSETYPE}" Device "/dev/$mouse->{auxmouse}{device}"$str_zaxis_aux EndSubSection EndSection ); } } $f if !$found_auxmouse && $mouse->{auxmouse} && -e $f && !$::testing; ($str_zaxis, $str_zaxis_aux) = map { join('', map { qq(\n Option "$_->[0]") . ($_->[1] && qq( "$_->[1]")) } @$_) } grep { $_ } ($zaxis, $zaxis_aux); $found_auxmouse = 0; substInFile { if (/Identifier\s+"Mouse1"/ .. /^EndSection/) { $_ = '' if /(ZAxisMapping|Emulate3)/; #- remove existing line s|^(\s*Option\s+"Protocol"\s+).*|$1"$mouse->{XMOUSETYPE}"|; #" s|^(\s*Option\s+"Device"\s+).*|$1"/dev/mouse"$str_zaxis|; } if ($mouse->{auxmouse}) { if (/Identifier\s+"Mouse2"/ .. /^EndSection/) { $found_auxmouse = 1; $_ = '' if /(ZAxisMapping|Emulate3)/; #- remove existing line s|^(\s*Option\s+"Protocol"\s+).*|$1"$mouse->{auxmouse}{XMOUSETYPE}"|; #" s|^(\s*Option\s+"Device"\s+).*|$1"/dev/$mouse->{auxmouse}{device}"$str_zaxis_aux|; #" } } } $g if -e $g && !$::testing; substInFile { if (my $l = /Identifier\s+"Mouse1"/ .. /^EndSection/) { $l =~ /E/ and $_ .= qq( Section "InputDevice" Identifier "Mouse2" Option "Protocol" "$mouse->{auxmouse}{XMOUSETYPE}" Option "Device" "/dev/$mouse->{auxmouse}{XMOUSETYPE}"$str_zaxis_aux EndSection ); } } $g if !$found_auxmouse && $mouse->{auxmouse} && -e $g && !$::testing; }; $update_mouse->($mouse); }