From e5d4e9cc1e76b3b7944abe6b20d7df9345e3bfb2 Mon Sep 17 00:00:00 2001 From: Tom Mortensen Date: Tue, 15 Aug 2017 20:11:40 -0700 Subject: [PATCH] Encyption support: most work by bergware --- plugins/dynamix/ArrayOperation.page | 2 +- plugins/dynamix/DashStats.page | 2 + plugins/dynamix/DeviceInfo.page | 124 ++++++++++-------- plugins/dynamix/DiskSettings.page | 9 +- plugins/dynamix/EncryptionSettings.page | 108 +++++++++++++++ plugins/dynamix/icons/encryptionsettings.png | Bin 0 -> 833 bytes .../dynamix/images/encryption-settings.png | Bin 0 -> 4736 bytes plugins/dynamix/include/CryptoBenchmark.php | 42 ++++++ plugins/dynamix/include/DashUpdate.php | 66 ++++++---- plugins/dynamix/include/DeviceList.php | 58 ++++---- plugins/dynamix/include/DiskList.php | 8 +- plugins/dynamix/include/KeyUpload.php | 27 ++++ plugins/dynamix/include/ShareList.php | 8 +- plugins/dynamix/include/update.crypto.php | 37 ++++++ plugins/dynamix/styles/default-azure.css | 11 +- plugins/dynamix/styles/default-black.css | 5 +- plugins/dynamix/styles/default-gray.css | 5 +- plugins/dynamix/styles/default-white.css | 5 +- 18 files changed, 393 insertions(+), 124 deletions(-) create mode 100644 plugins/dynamix/EncryptionSettings.page create mode 100644 plugins/dynamix/icons/encryptionsettings.png create mode 100644 plugins/dynamix/images/encryption-settings.png create mode 100644 plugins/dynamix/include/CryptoBenchmark.php create mode 100644 plugins/dynamix/include/KeyUpload.php create mode 100644 plugins/dynamix/include/update.crypto.php 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); 0):?> Unmountable disk present:
-".my_disk($disk['name'])." • ".my_id($disk['id'])." (".$disk['device'].")";?> +".my_disk($disk['name'])." • ".my_id($disk['id'])." (".$disk['device'].")";?> Format will create a file system in all Unmountable disks, discarding all data currently on those disks.
Yes I want to do this diff --git a/plugins/dynamix/DashStats.page b/plugins/dynamix/DashStats.page index f3f9fb9ca..c41a69b59 100644 --- a/plugins/dynamix/DashStats.page +++ b/plugins/dynamix/DashStats.page @@ -131,6 +131,7 @@ echo "Array Status".implode('',$row0); ?> + @@ -152,6 +153,7 @@ echo "Array Status".implode('',$row0); ?> + 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'; +} ?> +
+ + + +Encryption key: +:   + +> Shows the path and name of the current keyfile, if present. +> +> This keyfile is read upon array start and is used to encrypt/decrypt content of devices which have encryption enabled. + + +Delete +: + +> The keyfile can be deleted in order to create a new encryption key. This however will invalidate all existing encrypted content. +> Devices need to be reformatted and content is permanently lost when the encryption key is changed. +> +> For the really 'paranoid'. It is allowed to delete the keyfile *after* the array is started and re-enter the keyfile *while* the array is stopped. +> This ensures there is no *clear* encryption key present on the system when the array is online. + + +Encryption input: +: + +> Select manual input or file input of the encryption key. Note that the encryption key needs to be re-entered each time the system is rebooted. +> +> The array will **not** start automatically when encrypted volumes are present. + +
+Enter passphrase: +: >show passphrase + +> Enter a secure passphrase as encryption key. **Memorize** this passphrase, if lost device content can not be recovered. + +
+ + +: Array must be Stopped to change + +
diff --git a/plugins/dynamix/icons/encryptionsettings.png b/plugins/dynamix/icons/encryptionsettings.png new file mode 100644 index 0000000000000000000000000000000000000000..201b3b2d42743d0a3f6b61deebf2fafb9dcbb1b4 GIT binary patch literal 833 zcmV-H1HSx;P)G=qD6%fF}@I@Me2+i zk~PjWp)+@8?mhkYY7eLm_lNWPzyJHc?_74b?+HB5+n|)X;wi5k3V#mLS#x8Kq z2md@0lzdA{d8{$ki0UdEre%S^e&;fVLOzeow`_Ydl}waMrCtI#{_FhqgGXvz%X;{g zi2>9<7_cP<0h8g;A!wRl@YgiBU#)3XJ#0Gy&S@VWf&C7D%?ZJ-sz6h;J}BTZ4P_W8 zF$;oG(%Zx!*2Ei8Usr>WX%ZO~wBf_~pHnCz`+WiL21lW|juOJ?D4c~0K>&pAUrwfG zpi2X~VZfvaheF5~926V}PO${1>``Kfsz$Ike-1?!CMG@rmC!hc&@}3e2SFl{GYULd zOE9UUGIbqx`YD>F1xJ`vQoBjHr$lBx-Ji|mI_m0H1}>~17kq#qlm zwt?#gl(eEt@!Zz)d>-EhFBo^mpAgPE)iId}>F!Qz0Co<{uLrv2Zw=5YhxUDp9)M zgw-3{U`N*=J3Wq(fe{GOK_iX6Ns^4(tojMgv9U=lk!!6uoTQmAg2x z$}N_k@9r7vq3!qYt~KYC3{$HbxfMwG-w~&%UY=(tCjNElhX4Zrf%O%w1xg{!00000 LNkvXXu0mjf>ZE`N literal 0 HcmV?d00001 diff --git a/plugins/dynamix/images/encryption-settings.png b/plugins/dynamix/images/encryption-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3882f830966a42031c2c6ee524f411c05729d4 GIT binary patch literal 4736 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 + + + +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 @@
  */
 ?>
 '); 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_insert($row6[$n],"");
       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 .= ""; } else $out .= ""; - foreach ($devs as $dev) {$out .= "";} + if ($disk['type']=="Cache") + foreach ($devs as $dev) {$out .= "";} + else + foreach ($devs as $dev) if ($dev['tag']==0) {$out .= "";} 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 @@ + + 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 @@ + +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}