Skip to content

Commit dadfb45

Browse files
author
Florian Schaal
committed
2 parents 0deff13 + 1fa1bce commit dadfb45

35 files changed

+261
-52
lines changed

install/sql/incremental/upd_dev_collection.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ ALTER TABLE `directive_snippets` ADD `required_php_snippets` VARCHAR(255) NOT NU
144144
ALTER TABLE `dns_rr` CHANGE `ttl` `ttl` INT(11) UNSIGNED NOT NULL DEFAULT '3600';
145145
ALTER TABLE `dns_soa` CHANGE `minimum` `minimum` INT(11) UNSIGNED NOT NULL DEFAULT '3600', CHANGE `ttl` `ttl` INT(11) UNSIGNED NOT NULL DEFAULT '3600';
146146
ALTER TABLE `client` CHANGE `web_php_options` `web_php_options` VARCHAR(255) NOT NULL DEFAULT 'no,fast-cgi,cgi,mod,suphp,php-fpm,hhvm';
147-
ALTER TABLE `web_domain` ADD COLUMN `enable_pagespeed` ENUM('y','n') NULL DEFAULT 'n' AFTER `directive_snippets_id`;
147+
ALTER TABLE `web_domain` ADD COLUMN `enable_pagespeed` ENUM('y','n') NOT NULL DEFAULT 'n' AFTER `directive_snippets_id`;
148148

149149
ALTER TABLE openvz_template ADD COLUMN `features` varchar(255) DEFAULT NULL AFTER `capability`;
150150
ALTER TABLE openvz_vm ADD COLUMN `features` TEXT DEFAULT NULL AFTER `capability`;
@@ -165,3 +165,4 @@ CREATE TABLE `server_ip_map` (
165165
PRIMARY KEY (`server_ip_map_id`)
166166
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
167167

168+
ALTER TABLE `web_domain` ADD COLUMN `rewrite_to_https` ENUM('y','n') NOT NULL DEFAULT 'n' AFTER `seo_redirect`;

install/sql/ispconfig3.sql

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1884,6 +1884,7 @@ CREATE TABLE `web_domain` (
18841884
`redirect_type` varchar(255) default NULL,
18851885
`redirect_path` varchar(255) default NULL,
18861886
`seo_redirect` varchar(255) default NULL,
1887+
`rewrite_to_https` ENUM('y','n') NOT NULL DEFAULT 'n',
18871888
`ssl` enum('n','y') NOT NULL default 'n',
18881889
`ssl_state` varchar(255) NULL,
18891890
`ssl_locality` varchar(255) NULL,
@@ -1924,7 +1925,7 @@ CREATE TABLE `web_domain` (
19241925
`added_date` date NOT NULL DEFAULT '0000-00-00',
19251926
`added_by` varchar(255) DEFAULT NULL,
19261927
`directive_snippets_id` int(11) unsigned NOT NULL default '0',
1927-
`enable_pagespeed` ENUM('y','n') NULL DEFAULT 'n',
1928+
`enable_pagespeed` ENUM('y','n') NOT NULL DEFAULT 'n',
19281929
`http_port` int(11) unsigned NOT NULL DEFAULT '80',
19291930
`https_port` int(11) unsigned NOT NULL DEFAULT '443',
19301931
PRIMARY KEY (`domain_id`),

install/tpl/authmysqlrc.master

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ MYSQL_QUOTA_FIELD quota
1616
#MYSQL_QUOTA_FIELD concat(quota,'S')
1717
#MYSQL_WHERE_CLAUSE access='y'
1818
#MYSQL_AUXOPTIONS_FIELD concat('disableimap=',disableimap,',disablepop3=',disablepop3)
19-
MYSQL_AUXOPTIONS_FIELD concat('disableimap=',(replace(disableimap,'y',1)),',','disablepop3=',(replace(disablepop3,'y',1)))
19+
MYSQL_AUXOPTIONS_FIELD concat('disableimap=', if(disableimap = 'y', 1, 0), ',', 'disablepop3=', if(disablepop3 = 'y', 1, 0))

interface/lib/classes/auth.inc.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,56 @@ public function crypt_password($cleartext_password) {
222222
$salt.="$";
223223
return crypt($cleartext_password, $salt);
224224
}
225+
226+
public function csrf_token_get($form_name) {
227+
/* CSRF PROTECTION */
228+
// generate csrf protection id and key
229+
$_csrf_id = uniqid($form_name . '_'); // form id
230+
$_csrf_key = sha1(uniqid(microtime(true), true)); // the key
231+
if(!isset($_SESSION['_csrf'])) $_SESSION['_csrf'] = array();
232+
if(!isset($_SESSION['_csrf_timeout'])) $_SESSION['_csrf_timeout'] = array();
233+
$_SESSION['_csrf'][$_csrf_id] = $_csrf_key;
234+
$_SESSION['_csrf_timeout'][$_csrf_id] = time() + 3600; // timeout hash in 1 hour
235+
236+
return array('csrf_id' => $_csrf_id,'csrf_key' => $_csrf_key);
237+
}
238+
239+
public function csrf_token_check() {
240+
global $app;
241+
242+
if(isset($_POST) && is_array($_POST)) {
243+
$_csrf_valid = false;
244+
if(isset($_POST['_csrf_id']) && isset($_POST['_csrf_key'])) {
245+
$_csrf_id = trim($_POST['_csrf_id']);
246+
$_csrf_key = trim($_POST['_csrf_key']);
247+
if(isset($_SESSION['_csrf']) && isset($_SESSION['_csrf'][$_csrf_id]) && isset($_SESSION['_csrf_timeout']) && isset($_SESSION['_csrf_timeout'][$_csrf_id])) {
248+
if($_SESSION['_csrf'][$_csrf_id] === $_csrf_key && $_SESSION['_csrf_timeout'] >= time()) $_csrf_valid = true;
249+
}
250+
}
251+
if($_csrf_valid !== true) {
252+
$app->log('CSRF attempt blocked. Referer: ' . (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'unknown'), LOGLEVEL_WARN);
253+
$app->error($app->lng('err_csrf_attempt_blocked'));
254+
}
255+
$_SESSION['_csrf'][$_csrf_id] = null;
256+
$_SESSION['_csrf_timeout'][$_csrf_id] = null;
257+
unset($_SESSION['_csrf'][$_csrf_id]);
258+
unset($_SESSION['_csrf_timeout'][$_csrf_id]);
259+
260+
if(isset($_SESSION['_csrf_timeout']) && is_array($_SESSION['_csrf_timeout'])) {
261+
$to_unset = array();
262+
foreach($_SESSION['_csrf_timeout'] as $_csrf_id => $timeout) {
263+
if($timeout < time()) $to_unset[] = $_csrf_id;
264+
}
265+
foreach($to_unset as $_csrf_id) {
266+
$_SESSION['_csrf'][$_csrf_id] = null;
267+
$_SESSION['_csrf_timeout'][$_csrf_id] = null;
268+
unset($_SESSION['_csrf'][$_csrf_id]);
269+
unset($_SESSION['_csrf_timeout'][$_csrf_id]);
270+
}
271+
unset($to_unset);
272+
}
273+
}
274+
}
225275

226276
}
227277

interface/lib/classes/tform_base.inc.php

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -416,12 +416,10 @@ function getHTML($record, $tab, $action = 'NEW') {
416416

417417
/* CSRF PROTECTION */
418418
// generate csrf protection id and key
419-
$_csrf_id = uniqid($this->formDef['name'] . '_');
420-
$_csrf_value = sha1(uniqid(microtime(true), true));
421-
if(!isset($_SESSION['_csrf'])) $_SESSION['_csrf'] = array();
422-
if(!isset($_SESSION['_csrf_timeout'])) $_SESSION['_csrf_timeout'] = array();
423-
$_SESSION['_csrf'][$_csrf_id] = $_csrf_value;
424-
$_SESSION['_csrf_timeout'][$_csrf_id] = time() + 3600; // timeout hash in 1 hour
419+
$csrf_token = $app->auth->csrf_token_get($this->formDef['name']);
420+
$_csrf_id = $csrf_token['csrf_id'];
421+
$_csrf_value = $csrf_token['csrf_key'];
422+
425423
$this->formDef['tabs'][$tab]['fields']['_csrf_id'] = array(
426424
'datatype' => 'VARCHAR',
427425
'formtype' => 'TEXT',
@@ -714,10 +712,6 @@ protected function _encode($record, $tab, $dbencode = true, $api = false) {
714712
unset($_POST);
715713
unset($record);
716714
}
717-
$_SESSION['_csrf'][$_csrf_id] = null;
718-
$_SESSION['_csrf_timeout'][$_csrf_id] = null;
719-
unset($_SESSION['_csrf'][$_csrf_id]);
720-
unset($_SESSION['_csrf_timeout'][$_csrf_id]);
721715

722716
if(isset($_SESSION['_csrf_timeout']) && is_array($_SESSION['_csrf_timeout'])) {
723717
$to_unset = array();

interface/lib/lang/de.lng

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ $wb['top_menu_dashboard'] = 'Übersicht';
4343
$wb['latest_news_txt'] = 'Neuigkeiten';
4444
$wb['err_csrf_attempt_blocked'] = 'CSRF-Versuch blockiert.';
4545
$wb['top_menu_vm'] = 'vServer';
46+
$wb['err_csrf_attempt_blocked'] = 'CSRF-Versuch blockiert.';
4647
$wb['daynamesmin_su'] = 'So';
4748
$wb['daynamesmin_mo'] = 'Mo';
4849
$wb['daynamesmin_tu'] = 'Di';

interface/web/admin/language_add.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@
6565
$app->tpl->setVar('error', $error);
6666

6767
if(isset($_POST['lng_new']) && strlen($_POST['lng_new']) == 2 && $error == '') {
68+
69+
//* CSRF Check
70+
$app->auth->csrf_token_check();
71+
6872
$lng_new = $_POST['lng_new'];
6973
if(!preg_match("/^[a-z]{2}$/i", $lng_new)) die('unallowed characters in language name.');
7074

@@ -94,6 +98,11 @@
9498

9599
$app->tpl->setVar('msg', $msg);
96100

101+
//* SET csrf token
102+
$csrf_token = $app->auth->csrf_token_get('language_add');
103+
$app->tpl->setVar('_csrf_id',$csrf_token['csrf_id']);
104+
$app->tpl->setVar('_csrf_key',$csrf_token['csrf_key']);
105+
97106
//* load language file
98107
$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_add.lng';
99108
include $lng_file;

interface/web/admin/language_complete.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@
6767
// Export the language file
6868
if(isset($_POST['lng_select']) && $error == '') {
6969

70+
//* CSRF Check
71+
$app->auth->csrf_token_check();
72+
7073
// complete the global langauge file
7174
merge_langfile(ISPC_LIB_PATH."/lang/".$selected_language.".lng", ISPC_LIB_PATH."/lang/en.lng");
7275

@@ -157,6 +160,11 @@ function merge_langfile($langfile, $masterfile) {
157160

158161
$app->tpl->setVar('msg', $msg);
159162

163+
//* SET csrf token
164+
$csrf_token = $app->auth->csrf_token_get('language_merge');
165+
$app->tpl->setVar('_csrf_id',$csrf_token['csrf_id']);
166+
$app->tpl->setVar('_csrf_key',$csrf_token['csrf_key']);
167+
160168
//* load language file
161169
$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_complete.lng';
162170
include $lng_file;

interface/web/admin/language_edit.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@
5555

5656
//* Save data
5757
if(isset($_POST['records']) && is_array($_POST['records'])) {
58+
59+
//* CSRF Check
60+
$app->auth->csrf_token_check();
61+
5862
$file_content = "<?php\n";
5963
foreach($_POST['records'] as $key => $val) {
6064
$val = stripslashes($val);
@@ -93,6 +97,11 @@
9397
unset($wb);
9498
}
9599

100+
//* SET csrf token
101+
$csrf_token = $app->auth->csrf_token_get('language_edit');
102+
$app->tpl->setVar('_csrf_id',$csrf_token['csrf_id']);
103+
$app->tpl->setVar('_csrf_key',$csrf_token['csrf_key']);
104+
96105

97106
//* load language file
98107
$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_edit.lng';

interface/web/admin/language_import.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ function validate_line($line) {
129129

130130
// Export the language file
131131
if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
132+
133+
//* CSRF Check
134+
$app->auth->csrf_token_check();
135+
132136
$lines = file($_FILES['file']['tmp_name']);
133137
// initial check
134138
$parts = explode('|', $lines[0]);
@@ -183,6 +187,11 @@ function validate_line($line) {
183187
$app->tpl->setVar('msg', $msg);
184188
$app->tpl->setVar('error', $error);
185189

190+
//* SET csrf token
191+
$csrf_token = $app->auth->csrf_token_get('language_import');
192+
$app->tpl->setVar('_csrf_id',$csrf_token['csrf_id']);
193+
$app->tpl->setVar('_csrf_key',$csrf_token['csrf_key']);
194+
186195
//* load language file
187196
$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_import.lng';
188197
include $lng_file;

0 commit comments

Comments
 (0)