diff --git a/plugins/dynamix/ArrayOperation.page b/plugins/dynamix/ArrayOperation.page
index 451377dcc..95900ed18 100644
--- a/plugins/dynamix/ArrayOperation.page
+++ b/plugins/dynamix/ArrayOperation.page
@@ -140,7 +140,7 @@ toggle_diskio(true);
if ($var['fsNumUnmountable']>0):?>
+
diff --git a/plugins/dynamix/DeviceInfo.page b/plugins/dynamix/DeviceInfo.page
index 089a94521..3389d56eb 100644
--- a/plugins/dynamix/DeviceInfo.page
+++ b/plugins/dynamix/DeviceInfo.page
@@ -23,6 +23,19 @@ function displayTemp($temp) {
global $display;
return $display['unit']=='F' ? round($temp*9/5)+32 : $temp;
}
+function luks_status($luksState) {
+ switch ($luksState) {
+ case 0: return 'Not encrypted'; break;
+ case 1: return 'Encrypted'; break;
+ case 2: return 'Missing encryption key'; break;
+ case 3: return 'Wrong encryption key'; break;
+ default: return 'Unknown error'; break;
+ }
+}
+function maintenance_mode() {
+ global $var;
+ return ($var['fsState']=="Started" && $var['startMode']=="Maintenance") ? '' : 'disabled';
+}
?>
+
diff --git a/plugins/dynamix/icons/encryptionsettings.png b/plugins/dynamix/icons/encryptionsettings.png
new file mode 100644
index 000000000..201b3b2d4
Binary files /dev/null and b/plugins/dynamix/icons/encryptionsettings.png differ
diff --git a/plugins/dynamix/images/encryption-settings.png b/plugins/dynamix/images/encryption-settings.png
new file mode 100644
index 000000000..6c3882f83
Binary files /dev/null and b/plugins/dynamix/images/encryption-settings.png differ
diff --git a/plugins/dynamix/include/CryptoBenchmark.php b/plugins/dynamix/include/CryptoBenchmark.php
new file mode 100644
index 000000000..84d108256
--- /dev/null
+++ b/plugins/dynamix/include/CryptoBenchmark.php
@@ -0,0 +1,42 @@
+
+
+
+
+Benchmark
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/plugins/dynamix/include/DashUpdate.php b/plugins/dynamix/include/DashUpdate.php
index a1ef5fb0d..eeac4c4bd 100644
--- a/plugins/dynamix/include/DashUpdate.php
+++ b/plugins/dynamix/include/DashUpdate.php
@@ -11,7 +11,7 @@
*/
?>
-$docroot = $docroot ?: @$_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
+$docroot = $docroot ?: $_SERVER['DOCUMENT_ROOT'] ?: '/usr/local/emhttp';
function normalize($type,$count) {
$words = explode('_',$type);
@@ -79,42 +79,53 @@ case 'disk':
require_once "$docroot/webGui/include/CustomMerge.php";
require_once "$docroot/webGui/include/Preselect.php";
$slots = $_POST['slots'];
- $row1 = array_fill(0,31,' '); my_insert($row1[0],'Active');
- $row2 = array_fill(0,31,' '); my_insert($row2[0],'Inactive');
- $row3 = array_fill(0,31,' '); my_insert($row3[0],'Unassigned');
- $row4 = array_fill(0,31,' '); my_insert($row4[0],'Faulty');
- $row5 = array_fill(0,31,' '); my_insert($row5[0],'Heat alarm');
- $row6 = array_fill(0,31,' '); my_insert($row6[0],'SMART status');
- $row7 = array_fill(0,31,' '); my_insert($row7[0],'Utilization');
- $funcRenderRow = function($n,$disk) use (&$row1,&$row2,&$row3,&$row4,&$row5,&$row6,&$row7,$path) {
+ $row1 = array_fill(0,31,' '); my_insert($row1[0],'Encrypted');
+ $row2 = array_fill(0,31,' '); my_insert($row2[0],'Active');
+ $row3 = array_fill(0,31,' '); my_insert($row3[0],'Inactive');
+ $row4 = array_fill(0,31,' '); my_insert($row4[0],'Unassigned');
+ $row5 = array_fill(0,31,' '); my_insert($row5[0],'Faulty');
+ $row6 = array_fill(0,31,' '); my_insert($row6[0],'Heat alarm');
+ $row7 = array_fill(0,31,' '); my_insert($row7[0],'SMART status');
+ $row8 = array_fill(0,31,' '); my_insert($row8[0],'Utilization');
+ $funcRenderRow = function($n,$disk) use (&$row1,&$row2,&$row3,&$row4,&$row5,&$row6,&$row7,&$row8,$path) {
if ($n>0) {
+ if (isset($disk['luksState'])) {
+ switch ($disk['luksState']) {
+ case 0: $luks = ""; break;
+ case 1: $luks = " "; break;
+ case 2: $luks = " "; break;
+ case 3: $luks = " "; break;
+ default: $luks = " "; break;
+ }
+ } else $luks = "";
+ my_insert($row1[$n],$luks);
$state = $disk['color'];
switch ($state) {
case 'grey-off':
break; //ignore
case 'green-on':
- my_insert($row1[$n]," ");
+ my_insert($row2[$n]," ");
break;
case 'green-blink':
- my_insert($row2[$n]," ");
+ my_insert($row3[$n]," ");
break;
case 'blue-on':
case 'blue-blink':
- my_insert($row3[$n]," ");
+ my_insert($row4[$n]," ");
break;
default:
- my_insert($row4[$n]," ");
+ my_insert($row5[$n]," ");
break;}
$temp = $disk['temp'];
$hot = strlen($disk['hotTemp']) ? $disk['hotTemp'] : $_POST['hot'];
$max = strlen($disk['maxTemp']) ? $disk['maxTemp'] : $_POST['max'];
$heat = $temp>=$max && $max>0 ? 'max' : ($temp>=$hot && $hot>0 ? 'hot' : '');
if ($heat)
- my_insert($row5[$n],"".my_temp($temp,$_POST['unit'])." ");
+ my_insert($row6[$n],"".my_temp($temp,$_POST['unit'])." ");
else
- if (!strpos($state,'blink') && $temp>0) my_insert($row5[$n],"".my_temp($temp,$_POST['unit'])." ");
- if ($disk['device'] && !strpos($state,'blink')) my_smart($row6[$n],$disk['name'],'Device');
- my_usage($row7[$n],($disk['type']!='Parity' && $disk['fsStatus']=='Mounted')?(round((1-$disk['fsFree']/$disk['fsSize'])*100).'%'):'');
+ if (!strpos($state,'blink') && $temp>0) my_insert($row6[$n],"".my_temp($temp,$_POST['unit'])." ");
+ if ($disk['device'] && !strpos($state,'blink')) my_smart($row7[$n],$disk['name'],'Device');
+ my_usage($row8[$n],($disk['type']!='Parity' && $disk['fsStatus']=='Mounted')?(round((1-$disk['fsFree']/$disk['fsSize'])*100).'%'):'');
}
};
foreach ($disks as $disk) if ($disk['type']=='Parity') $funcRenderRow($i++,$disk);
@@ -125,7 +136,7 @@ case 'disk':
$device = $dev['device'];
$state = exec("hdparm -C ".escapeshellarg("/dev/$device")."|grep -Po active") ? 'blue-on' : 'blue-blink';
if ($state=='blue-on') my_smart($row6[$i],$device,'New');
- my_insert($row3[$i++]," ");
+ my_insert($row4[$i++]," ");
}
}
echo "".implode('',$row1)." ";
@@ -135,21 +146,23 @@ case 'disk':
echo "".implode('',$row5)." ";
echo "".implode('',$row6)." ";
echo "".implode('',$row7)." ";
+ echo "".implode('',$row8)." ";
if ($slots > 30) {
echo '#'; $i = 1;
- $row1 = array_fill(0,31,' '); my_insert($row1[0],'Active');
- $row2 = array_fill(0,31,' '); my_insert($row2[0],'Inactive');
- $row3 = array_fill(0,31,' '); my_insert($row3[0],'Unassigned');
- $row4 = array_fill(0,31,' '); my_insert($row4[0],'Faulty');
- $row5 = array_fill(0,31,' '); my_insert($row5[0],'Heat alarm');
- $row6 = array_fill(0,31,' '); my_insert($row6[0],'SMART status');
- $row7 = array_fill(0,31,' '); my_insert($row7[0],'Utilization');
+ $row1 = array_fill(0,31,' '); my_insert($row1[0],'Encrypted');
+ $row2 = array_fill(0,31,' '); my_insert($row2[0],'Active');
+ $row3 = array_fill(0,31,' '); my_insert($row3[0],'Inactive');
+ $row4 = array_fill(0,31,' '); my_insert($row4[0],'Unassigned');
+ $row5 = array_fill(0,31,' '); my_insert($row5[0],'Faulty');
+ $row6 = array_fill(0,31,' '); my_insert($row6[0],'Heat alarm');
+ $row7 = array_fill(0,31,' '); my_insert($row7[0],'SMART status');
+ $row8 = array_fill(0,31,' '); my_insert($row8[0],'Utilization');
foreach ($disks as $disk) if ($disk['type']=='Cache') $funcRenderRow($i++,$disk);
foreach ($devs as $dev) {
$device = $dev['device'];
$state = exec("hdparm -C ".escapeshellarg("/dev/$device")."|grep -Po active") ? 'blue-on' : 'blue-blink';
if ($state=='blue-on') my_smart($row6[$i],$device,'New');
- my_insert($row3[$i++]," ");
+ my_insert($row4[$i++]," ");
}
echo "".implode('',$row1)." ";
echo "".implode('',$row2)." ";
@@ -158,6 +171,7 @@ case 'disk':
echo "".implode('',$row5)." ";
echo "".implode('',$row6)." ";
echo "".implode('',$row7)." ";
+ echo "".implode('',$row8)." ";
}
break;
case 'sys':
diff --git a/plugins/dynamix/include/DeviceList.php b/plugins/dynamix/include/DeviceList.php
index e5c8bd428..c1a7a3a78 100644
--- a/plugins/dynamix/include/DeviceList.php
+++ b/plugins/dynamix/include/DeviceList.php
@@ -34,7 +34,7 @@ function in_parity_log($log,$timestamp) {
}
return !empty($line);
}
-function device_info(&$disk) {
+function device_info(&$disk,$online) {
global $path, $var;
$name = $disk['name'];
$fancyname = $disk['type']=='New' ? $name : my_disk($name);
@@ -57,15 +57,20 @@ function device_info(&$disk) {
case 'grey-off': $help = 'Device not present'; break;
}
$status = "$ctrl$help ";
- $link = strpos($disk['status'], 'DISK_NP')===false ? "".$fancyname." " : $fancyname;
- return $status.$link;
+ $link = (strpos($disk['status'], 'DISK_NP')===false || $disk['name']=="cache") ? "".$fancyname." " : $fancyname;
+ switch ($disk['luksState']) {
+ case 0: $luks = ""; break;
+ case 1: $luks = " "; break;
+ case 2: $luks = " "; break;
+ case 3: $luks = " "; break;
+ default: $luks = " "; break;
+ }
+ return $status.$link.$luks;
}
function device_browse(&$disk) {
global $path;
- if ($disk['fsStatus']=='Mounted') {
- $dir = $disk['name']=='flash' ? "/boot" : "/mnt/{$disk['name']}";
- return " ";
- }
+ $dir = $disk['name']=='flash' ? "/boot" : "/mnt/{$disk['name']}";
+ return " ";
}
function device_desc(&$disk) {
global $var;
@@ -85,7 +90,10 @@ function assignment(&$disk) {
$out .= "$empty ";
} else
$out .= "$empty ";
- foreach ($devs as $dev) {$out .= "".device_desc($dev)." ";}
+ if ($disk['type']=="Cache")
+ foreach ($devs as $dev) {$out .= "".device_desc($dev)." ";}
+ else
+ foreach ($devs as $dev) if ($dev['tag']==0) {$out .= "".device_desc($dev)." ";}
return "$out";
}
function fs_info(&$disk) {
@@ -94,7 +102,7 @@ function fs_info(&$disk) {
echo " ";
return;
} elseif ($disk['fsStatus']=='Mounted') {
- echo "{$disk['fsType']} ";
+ echo "".str_replace('luks:','',$disk['fsType'])." ";
echo "".my_scale($disk['fsSize']*1024,$unit)." $unit ";
if ($display['text']%10==0) {
echo "".my_scale($disk['fsUsed']*1024,$unit)." $unit ";
@@ -108,9 +116,9 @@ function fs_info(&$disk) {
$free = $disk['fsSize'] ? round(100*$disk['fsFree']/$disk['fsSize']) : 0;
echo "".my_scale($disk['fsFree']*1024,$unit)." $unit
";
}
+ echo "".device_browse($disk)." ";
} else
- echo "{$disk['fsStatus']} ";
- echo "".device_browse($disk)." ";
+ echo "".str_replace('luks:','',$disk['fsType'])." {$disk['fsStatus']}";
}
function my_diskio($data) {
return my_scale($data,$unit,1)." $unit/s";
@@ -120,9 +128,8 @@ function array_offline(&$disk,$w) {
echo " ";
switch ($disk['status']) {
case 'DISK_NP':
- case 'DISK_OK_NP':
case 'DISK_NP_DSBL':
- echo "".device_info($disk)." ";
+ echo "".device_info($disk,false)." ";
echo "".assignment($disk)." ";
echo " ";
break;
@@ -132,18 +139,18 @@ function array_offline(&$disk,$w) {
case 'DISK_DSBL':
case 'DISK_DSBL_NEW':
case 'DISK_NEW':
- echo "".device_info($disk)." ";
+ echo "".device_info($disk,false)." ";
echo "".assignment($disk)." ";
echo "".my_temp($disk['temp'])." ";
echo "$warning ";
break;
case 'DISK_NP_MISSING':
- echo "".device_info($disk)."Missing ";
+ echo "".device_info($disk,false)."Missing ";
echo "".assignment($disk)."{$disk['idSb']} - ".my_scale($disk['sizeSb']*1024,$unit)." $unit ";
echo " ";
break;
case 'DISK_WRONG':
- echo "".device_info($disk)."Wrong ";
+ echo "".device_info($disk,false)."Wrong ";
echo "".assignment($disk)."{$disk['idSb']} - ".my_scale($disk['sizeSb']*1024,$unit)." $unit ";
echo "".my_temp($disk['temp'])." ";
echo "$warning ";
@@ -173,21 +180,22 @@ function array_online(&$disk) {
echo " ";
switch ($disk['status']) {
case 'DISK_NP':
-// Suppress empty slots to keep device list short (make this configurable?)
-// echo "".device_info($disk)." ";
-// echo "Not installed ";
-// echo " ";
+ if ($disk['name']=="cache") {
+ echo "".device_info($disk,true)." ";
+ echo "Not installed ";
+ echo " ";
+ fs_info($disk);
+ }
break;
- case 'DISK_OK_NP':
case 'DISK_NP_DSBL':
- echo "".device_info($disk)." ";
+ echo "".device_info($disk,true)." ";
echo "Not installed ";
echo " ";
fs_info($disk);
break;
case 'DISK_DSBL':
default:
- echo "".device_info($disk)." ";
+ echo "".device_info($disk,true)." ";
echo "".device_desc($disk)." ";
echo "".my_temp($disk['temp'])." ";
echo "".my_diskio($data[0])." ".my_number($disk['numReads'])." ";
@@ -295,7 +303,7 @@ case 'flash':
$data = $diskio ? explode(' ',$diskio[$disk['device']]) : [];
$disk['fsUsed'] = $disk['fsSize']-$disk['fsFree'];
echo " ";
- echo "".device_info($disk)." ";
+ echo "".device_info($disk,true)." ";
echo "".device_desc($disk)." ";
echo "* ";
echo "".my_diskio($data[0])." ".my_number($disk['numReads'])." ";
@@ -322,7 +330,7 @@ case 'open':
$disk['color'] = read_disk($dev,'color');
$disk['temp'] = read_disk($dev,'temp');
echo " ";
- echo "".device_info($disk)." ";
+ echo "".device_info($disk,true)." ";
echo "".device_desc($disk)." ";
echo "".my_temp($disk['temp'])." ";
echo "".my_diskio($data[0])." ".my_number($data[2])." ";
diff --git a/plugins/dynamix/include/DiskList.php b/plugins/dynamix/include/DiskList.php
index 15e0b4fc0..aaebd3e45 100644
--- a/plugins/dynamix/include/DiskList.php
+++ b/plugins/dynamix/include/DiskList.php
@@ -71,8 +71,14 @@ foreach ($disks as $name => $disk) {
case 'green-on': $help = 'All files protected'; break;
case 'yellow-on': $help = 'All files unprotected'; break;
}
+ switch ($disk['luksState']) {
+ case 0: $luks = ""; break;
+ case 1: $luks = " "; break;
+ case 2: $luks = " "; break;
+ default: $luks = ""; break;
+ }
echo " ";
- echo "$help $name ";
+ echo "$help $name $luks ";
echo "{$disk['comment']} ";
echo "".disk_share_settings($var['shareSMBEnabled'], $sec[$name])." ";
echo "".disk_share_settings($var['shareNFSEnabled'], $sec_nfs[$name])." ";
diff --git a/plugins/dynamix/include/KeyUpload.php b/plugins/dynamix/include/KeyUpload.php
new file mode 100644
index 000000000..c82fb4d50
--- /dev/null
+++ b/plugins/dynamix/include/KeyUpload.php
@@ -0,0 +1,27 @@
+
+
+$var = parse_ini_file('/var/local/emhttp/var.ini');
+$luks = $var['luksKeyfile'];
+$text = $_POST['text'] ?? '';
+$file = $_POST['file'] ?? '';
+
+if ($text) {
+ file_put_contents($luks, $text);
+} elseif ($file) {
+ file_put_contents($luks, $file);
+} else {
+ @unlink($luks);
+}
+$save = false;
+?>
diff --git a/plugins/dynamix/include/ShareList.php b/plugins/dynamix/include/ShareList.php
index cc4840423..93bcd60fc 100644
--- a/plugins/dynamix/include/ShareList.php
+++ b/plugins/dynamix/include/ShareList.php
@@ -75,8 +75,14 @@ foreach ($shares as $name => $share) {
case 'green-on': $help = 'All files protected'; break;
case 'yellow-on': $help = 'Some or all files unprotected'; break;
}
+ switch ($share['luksStatus']) {
+ case 0: $luks = ""; break;
+ case 1: $luks = " "; break;
+ case 2: $luks = " "; break;
+ default: $luks = ""; break;
+ }
echo " ";
- echo "$help $name ";
+ echo "$help $name $luks ";
echo "{$share['comment']} ";
echo "".user_share_settings($var['shareSMBEnabled'], $sec[$name])." ";
echo "".user_share_settings($var['shareNFSEnabled'], $sec_nfs[$name])." ";
diff --git a/plugins/dynamix/include/update.crypto.php b/plugins/dynamix/include/update.crypto.php
new file mode 100644
index 000000000..08883990e
--- /dev/null
+++ b/plugins/dynamix/include/update.crypto.php
@@ -0,0 +1,37 @@
+
+
+$index = $_GET['index'];
+$tests = explode(',',$_GET['test']);
+if ($index < count($tests)) {
+ $test = $tests[$index];
+ list($name,$size) = explode(':',$test);
+ if (!$size) {
+ if ($index>0) $test .= '|tail -1';
+ echo shell_exec("/usr/sbin/cryptsetup benchmark -h $test");
+ } else {
+ if ($index>5) $size .= '|tail -1';
+ echo preg_replace('/^# Tests.*\n/',"\n",shell_exec("/usr/sbin/cryptsetup benchmark -c $name -s $size"));
+ }
+} else {
+ $bm = popen('/usr/sbin/cryptsetup --help','r');
+ while (!feof($bm)) {
+ $text = fgets($bm);
+ if (strpos($text,'Default PBKDF2 iteration time for LUKS')!==false) echo "\n$text";
+ elseif (strpos($text,'Default compiled-in device cipher parameters')!==false) echo "\n$text";
+ elseif (strpos($text,'LUKS1:')!==false) echo str_replace("\t"," ",$text);
+ }
+ pclose($bm);
+ echo "
";
+}
+?>
diff --git a/plugins/dynamix/styles/default-azure.css b/plugins/dynamix/styles/default-azure.css
index 5591848f0..07fcb28c6 100644
--- a/plugins/dynamix/styles/default-azure.css
+++ b/plugins/dynamix/styles/default-azure.css
@@ -19,12 +19,12 @@ pre ul{margin:0;padding-top:0;padding-bottom:0;padding-left:28px}
pre li{margin:0;padding-top:0;padding-bottom:0;padding-left:18px}
big{font-size:15px;font-weight:bold;text-transform:uppercase}
hr{border-color:#EDEAEF}
-input[type=text],input[type=password],input[type=number],input[type=url],input[type=email],input[type=date],textarea,.textarea{font-family:arimo;font-size:13px;background:transparent;border:1px solid #606E7F;padding:5px 10px;min-height:20px;line-height:20px;outline:none;width:304px;margin:0 20px 0 0;box-shadow:none;color:#606E7F}
+input[type=text],input[type=password],input[type=number],input[type=url],input[type=email],input[type=date],input[type=file],textarea,.textarea{font-family:arimo;font-size:13px;background:transparent;border:1px solid #606E7F;padding:5px 10px;min-height:20px;line-height:20px;outline:none;width:304px;margin:0 20px 0 0;box-shadow:none;color:#606E7F}
input[type=button],input[type=reset],input[type=submit],button,a.button{font-family:arimo;font-size:13px;border:1px solid #9F9180;border-radius:5px;margin:10px 20px 10px 0;padding:8px 12px;cursor:pointer;outline:none;color:#9F9180;background:#EDEAEF}
input[type=checkbox]{vertical-align:middle;margin-right:6px}
input[type=number]::-webkit-outer-spin-button,input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none}
input[type=number]{-moz-appearance:textfield}
-input:focus[type=text],input:focus[type=password],input:focus[type=number],input:focus[type=url],input:focus[type=email],textarea:focus{background:#EDEAEF;border-color:#0072C6}
+input:focus[type=text],input:focus[type=password],input:focus[type=number],input:focus[type=url],input:focus[type=email],input:focus[type=file],textarea:focus{background:#EDEAEF;border-color:#0072C6}
input:hover[type=button],input:hover[type=reset],input:hover[type=submit],button:hover,a.button:hover{border-color:#0072C6;color:#4F4F4F}
input:active[type=button],input:active[type=reset],input:active[type=submit],button:active{border-color:#0072C6;box-shadow:none}
input[disabled],button[disabled],input:hover[type=button][disabled],input:hover[type=reset][disabled],input:hover[type=submit][disabled],button:hover[disabled],input:active[type=button][disabled],input:active[type=reset][disabled],input:active[type=submit][disabled],button:active[disabled],textarea[disabled]{color:#808080;border-color:#808080;background:#C7C5CB;opacity:0.5;cursor:default}
@@ -68,9 +68,9 @@ form+p{display:none}
#nav-item a[href='/Apps']:before{content:'\f0db'}
#nav-item a[href='/Stats']:before{content:'\f1fe'}
#nav-item a[href='/Tools']:before{content:'\f0ad'}
-#nav-item.active,#nav-item.active a{color:#5D6833;background:#ABC056;font-size:18px}
-#nav-item.HelpButton.active:hover{background:#ABC056;font-size:0}
-#nav-item.HelpButton.active{background:#121510}
+#nav-item.active,#nav-item.active a{color:#5D6833;background:#ABC056}
+#nav-item.HelpButton.active:hover{background:#ABC056;font-size:18px}
+#nav-item.HelpButton.active{background:#121510;font-size:0}
#nav-item.HelpButton a:before{content:'\f059'}
#nav-item.FeedbackButton a:before{content:'\f075'}
#nav-item.InfoButton a:before{content:'\f05a'}
@@ -230,6 +230,7 @@ span.three{margin-left:-20px}
span.tub{margin-right:8px;font-size:24px;cursor:pointer}
span.score{font-size:11px;color:#FFFFFF;position:absolute}
span#dropbox{background:none;line-height:60px;margin-right:20px}
+i.padlock{margin-left:8px;cursor:help}
img.icon{margin:-3px 4px 0 0}
img.list{width:auto;max-width:48px;height:48px}
div.content{position:absolute;top:0;left:0;width:100%;padding-bottom:30px;z-index:-1;clear:both}
diff --git a/plugins/dynamix/styles/default-black.css b/plugins/dynamix/styles/default-black.css
index 6695f1545..24e833732 100644
--- a/plugins/dynamix/styles/default-black.css
+++ b/plugins/dynamix/styles/default-black.css
@@ -16,12 +16,12 @@ a.nohand{cursor:default}
i.spacing{margin-left:-6px}
i.icon{margin-right:4px}
hr{border-color:rgba(255,255,255,0.25)}
-input[type=text],input[type=password],input[type=number],input[type=url],input[type=email],input[type=date],textarea,.textarea{font-family:arimo;font-size:12px;color:#808080;background-color:#000000;border:1px solid #404040;border-radius:4px;padding:2px 8px;min-height:20px;line-height:20px;outline:none;width:301px;margin:0 10px 0 0;box-shadow:inset 1px 1px 5px #404040}
+input[type=text],input[type=password],input[type=number],input[type=url],input[type=email],input[type=date],input[type=file],textarea,.textarea{font-family:arimo;font-size:12px;color:#808080;background-color:#000000;border:1px solid #404040;border-radius:4px;padding:2px 8px;min-height:20px;line-height:20px;outline:none;width:301px;margin:0 10px 0 0;box-shadow:inset 1px 1px 5px #404040}
input[type=button],input[type=reset],input[type=submit],button,a.button{font-family:arimo;font-size:12px;border:1px solid #303030;border-radius:6px;margin:7px 14px 0 0;padding:8px 12px;text-decoration:none;white-space:nowrap;cursor:pointer;outline:none;color:#808080;background:-webkit-radial-gradient(#505050,#181818);background:linear-gradient(#505050,#181818)}
input[type=checkbox]{vertical-align:middle;margin-right:6px}
input[type=number]::-webkit-outer-spin-button,input[type=number]::-webkit-inner-spin-button{-webkit-appearance: none}
input[type=number]{-moz-appearance:textfield}
-input:focus[type=text],input:focus[type=password],input:focus[type=number],input:focus[type=url],input:focus[type=email],textarea:focus{background:#101010}
+input:focus[type=text],input:focus[type=password],input:focus[type=number],input:focus[type=url],input:focus[type=email],input:focus[type=file],textarea:focus{background:#101010}
input:hover[type=button],input:hover[type=reset],input:hover[type=submit],button:hover,a.button:hover{border-color:#6AB034;color:#FFFFFF;background:-webkit-radial-gradient(#5E9E2E,#8FD956);background:linear-gradient(#5E9E2E,#8FD956)}
input:active[type=button],input:active[type=reset],input:active[type=submit],button:active{border-color:#6AB034;box-shadow:inset 0 0 8px 4px #548C29,0 1px 0 0 #101010}
input[disabled],button[disabled],input:hover[type=button][disabled],input:hover[type=reset][disabled],input:hover[type=submit][disabled],button:hover[disabled],input:active[type=button][disabled],input:active[type=reset][disabled],input:active[type=submit][disabled],button:active[disabled],textarea[disabled]{color:#505050;border-color:#181818;background:linear-gradient(#202020,#101010);background:-webkit-radial-gradient(#202020,#101010);cursor:default}
@@ -211,6 +211,7 @@ span.two{margin-left:-17px}
span.three{margin-left:-20px}
span.tub{margin-right:8px;font-size:24px;cursor:pointer}
span.score{font-size:11px;color:#F0F0F0;position:absolute}
+i.padlock{margin-left:8px;cursor:help}
img.icon{margin:-3px 4px 0 0}
img.list{width:auto;max-width:48px;height:48px}
div.content{position:absolute;top:45px;left:0;width:100%;padding-bottom:30px;z-index:-1;clear:both}
diff --git a/plugins/dynamix/styles/default-gray.css b/plugins/dynamix/styles/default-gray.css
index 535bd790d..c6b4a9b9e 100644
--- a/plugins/dynamix/styles/default-gray.css
+++ b/plugins/dynamix/styles/default-gray.css
@@ -19,12 +19,12 @@ pre ul{margin:0;padding-top:0;padding-bottom:0;padding-left:28px}
pre li{margin:0;padding-top:0;padding-bottom:0;padding-left:18px}
big{font-size:15px;font-weight:bold;text-transform:uppercase}
hr{border-color:#121510}
-input[type=text],input[type=password],input[type=number],input[type=url],input[type=email],input[type=date],textarea,.textarea{font-family:arimo;font-size:13px;background:transparent;border:1px solid #606E7F;padding:5px 10px;min-height:20px;line-height:20px;outline:none;width:304px;margin:0 20px 0 0;box-shadow:none;color:#606E7F}
+input[type=text],input[type=password],input[type=number],input[type=url],input[type=email],input[type=date],input[type=file],textarea,.textarea{font-family:arimo;font-size:13px;background:transparent;border:1px solid #606E7F;padding:5px 10px;min-height:20px;line-height:20px;outline:none;width:304px;margin:0 20px 0 0;box-shadow:none;color:#606E7F}
input[type=button],input[type=reset],input[type=submit],button,a.button{font-family:arimo;font-size:13px;border:1px solid #606E7F;border-radius:5px;margin:10px 20px 10px 0;padding:8px 12px;cursor:pointer;outline:none;color:#606E7F;background:#121510}
input[type=checkbox]{vertical-align:middle;margin-right:6px}
input[type=number]::-webkit-outer-spin-button,input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none}
input[type=number]{-moz-appearance:textfield}
-input:focus[type=text],input:focus[type=password],input:focus[type=number],input:focus[type=url],input:focus[type=email],textarea:focus{background:#121510;border-color:#0072C6}
+input:focus[type=text],input:focus[type=password],input:focus[type=number],input:focus[type=url],input:focus[type=file],input:focus[type=email],textarea:focus{background:#121510;border-color:#0072C6}
input:hover[type=button],input:hover[type=reset],input:hover[type=submit],button:hover,a.button:hover{border-color:#0072C6;color:#B0B0B0}
input:active[type=button],input:active[type=reset],input:active[type=submit],button:active{border-color:#0072C6;box-shadow:none}
input[disabled],button[disabled],input:hover[type=button][disabled],input:hover[type=reset][disabled],input:hover[type=submit][disabled],button:hover[disabled],input:active[type=button][disabled],input:active[type=reset][disabled],input:active[type=submit][disabled],button:active[disabled],textarea[disabled]{color:#808080;border-color:#808080;background:#383A34;opacity:0.3;cursor:default}
@@ -230,6 +230,7 @@ span.three{margin-left:-20px}
span.tub{margin-right:8px;font-size:24px;cursor:pointer}
span.score{font-size:11px;color:#FFFFFF;position:absolute}
span#dropbox{background:none;line-height:60px;margin-right:20px}
+i.padlock{margin-left:8px;cursor:help}
img.icon{margin:-3px 4px 0 0}
img.list{width:auto;max-width:48px;height:48px}
div.content{position:absolute;top:0;left:0;width:100%;padding-bottom:30px;z-index:-1;clear:both}
diff --git a/plugins/dynamix/styles/default-white.css b/plugins/dynamix/styles/default-white.css
index 889219058..4f3de22dd 100644
--- a/plugins/dynamix/styles/default-white.css
+++ b/plugins/dynamix/styles/default-white.css
@@ -16,12 +16,12 @@ a.nohand{cursor:default}
i.spacing{margin-left:-6px}
i.icon{margin-right:4px}
hr{border-color:rgba(255,255,255,0.25)}
-input[type=text],input[type=password],input[type=number],input[type=url],input[type=email],input[type=date],textarea,.textarea{font-family:arimo;font-size:12px;color:#303030;background-color:#FFFFFF;border:1px solid #E0E0E0;border-radius:4px;padding:2px 8px;min-height:20px;line-height:20px;outline:none;width:301px;margin:0 10px 0 0;box-shadow:inset 1px 1px 5px #F0F0F0}
+input[type=text],input[type=password],input[type=number],input[type=url],input[type=email],input[type=date],input[type=file],textarea,.textarea{font-family:arimo;font-size:12px;color:#303030;background-color:#FFFFFF;border:1px solid #E0E0E0;border-radius:4px;padding:2px 8px;min-height:20px;line-height:20px;outline:none;width:301px;margin:0 10px 0 0;box-shadow:inset 1px 1px 5px #F0F0F0}
input[type=button],input[type=reset],input[type=submit],button,a.button{font-family:arimo;font-size:12px;border:1px solid #E8E8E8;border-radius:6px;margin:7px 14px 0 0;padding:8px 12px;text-decoration:none;white-space:nowrap;cursor:pointer;outline:none;color:#303030;background:-webkit-radial-gradient(#F0F0F0,#C8C8C8);background:linear-gradient(#F0F0F0,#C8C8C8)}
input[type=checkbox]{vertical-align:middle;margin-right:6px}
input[type=number]::-webkit-outer-spin-button,input[type=number]::-webkit-inner-spin-button{-webkit-appearance: none}
input[type=number]{-moz-appearance:textfield}
-input:focus[type=text],input:focus[type=password],input:focus[type=number],input:focus[type=url],input:focus[type=email],textarea:focus{background:#F8F8F8}
+input:focus[type=text],input:focus[type=password],input:focus[type=number],input:focus[type=url],input:focus[type=email],input:focus[type=file],textarea:focus{background:#F8F8F8}
input:hover[type=button],input:hover[type=reset],input:hover[type=submit],button:hover,a.button:hover{border-color:#6AB034;color:#FFFFFF;background:-webkit-radial-gradient(#5E9E2E,#8FD956);background:linear-gradient(#5E9E2E,#8FD956)}
input:active[type=button],input:active[type=reset],input:active[type=submit],button:active{border-color:#6AB034;box-shadow:inset 0 0 8px 4px #548C29,0 1px 0 0 #E0E0E0}
input[disabled],button[disabled],input:hover[type=button][disabled],input:hover[type=reset][disabled],input:hover[type=submit][disabled],button:hover[disabled],input:active[type=button][disabled],input:active[type=reset][disabled],input:active[type=submit][disabled],button:active[disabled],textarea[disabled]{color:#808080;border-color:#F0F0F0;background:linear-gradient(#F0F0F0,#F8F8F8);background:-webkit-radial-gradient(#F0F0F0,#F8F8F8);cursor:default}
@@ -211,6 +211,7 @@ span.two{margin-left:-17px}
span.three{margin-left:-20px}
span.tub{margin-right:8px;font-size:24px;cursor:pointer}
span.score{font-size:11px;color:#F0F0F0;position:absolute}
+i.padlock{margin-left:8px;cursor:help}
img.icon{margin:-3px 4px 0 0}
img.list{width:auto;max-width:48px;height:48px}
div.content{position:absolute;top:45px;left:0;width:100%;padding-bottom:30px;z-index:-1;clear:both}