]> git.nbdom.net Git - nb.git/commitdiff
www/dbq/dbq.php
authorNicolas Boisselier <nicolas.boisselier@gmail.com>
Wed, 31 Jan 2018 04:10:07 +0000 (04:10 +0000)
committerNicolas Boisselier <nicolas.boisselier@gmail.com>
Wed, 31 Jan 2018 04:10:07 +0000 (04:10 +0000)
lib/php/db/table.php
lib/php/ldap.php
lib/php/nb.php
lib/php/out/div.php
www/dbq/dbq.php
www/dbq/html/default.css
www/dbq/html/default.min.css

index 93f018b8e925956abfe02af101afb2a965324a1c..9740de95be7a0973c11b613480c2cc4a9b89b5bf 100644 (file)
@@ -1033,8 +1033,8 @@ Class Table extends nb {
                return $fields;
        }
 
-       public function rows(&$opt=[],$opt_by_val=null) {
-               if ($opt_by_val !== null) $opt = $opt_by_val;
+       public function rows(&$opt=[]) { # ,$opt_by_val=null) {
+# NB 30.01.18          if ($opt_by_val !== null) $opt = $opt_by_val;
 
 # NB 29.01.18          if ($fct = $this->db()->conf_type('_table_rows')) {
 # NB 29.01.18                  return $fct($opt);
index b6408a01ff0e0380b67ce45abcb4180cf692a6fa..222ff8cbcf6fa398190fa2078c83a364c3ff0718 100644 (file)
@@ -8,6 +8,8 @@ class Ldap {
        private $base;
        private $user;
        private $password;
+
+       private $fields;
        # NB 28.01.18: TODO 
        private $row_parse_pre;
        private $row_parse_post;
@@ -46,6 +48,11 @@ class Ldap {
                ldap_close($this->conn);
        }
 
+# NB 30.01.18  public function fields($set) {
+# NB 30.01.18          if (isset($set)) return $this->fields;
+# NB 30.01.18          if (isset($this->fields)) return $this->fields;
+# NB 30.01.18  }
+
        public function search($o=[]) {
 
                $conn = $this->connect();
@@ -74,6 +81,7 @@ class Ldap {
                                if (isset($values) and count($values) == 1) $values = $values[0];
                                $info[$i][$attributes[$j]] = $values;
                        }
+
                        if (!empty($o['dn']) and
                                in_array('dn',!empty($o['attrs']) ? $o['attrs'] : ['dn'])
                        ) $info[$i] = ['dn' => ldap_get_dn($conn,$entry)] + (empty($info[$i]) ? [] : $info[$i]);
index af9ed5be1d219a6fce0d8bba1d11525e310479d2..421a28aa6300980fb11f62c8f1c19d1daa5a7f20 100644 (file)
@@ -1082,7 +1082,22 @@ class NB {
        public static function is_binary($v) {
                #return is_binary($v);
                return (strpos($v, "\0") !== false);
-# NB 05.01.18          return (preg_match('~[^\x20-\x7E\t\r\n]~', $v) > 0 ? true : false);
+       }
+
+       public static function is_base64($string) {
+
+    // Check if there is no invalid character in string
+    if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $string)) return false;
+
+               $decoded = base64_decode($string, true);
+
+    // Decode the string in strict mode and send the response
+    if (!$decoded) return false;
+
+    // Encode and compare it to original one
+    if (base64_encode($decoded) != $string) return false;
+
+    return true;
        }
 
 } # < Class NB
index 363d94675e4190e586906a32e0d1d49cd1d2f35a..9682824d959c2288b73dcc439f9dd5c39d48f70c 100644 (file)
@@ -5,7 +5,8 @@ return [
   'tag_enclose' => 'div class="row"',
   'tag' => 'div',
   'tag_key' => 'label',
-# NB 06.01.18   'tag_val' => 'span',
+  'tag_val' => 'span',
+# NB 31.01.18   'tag_val' => 'p',
 # NB 06.01.18 div.row div span { text-align: right; }
   'row' => 'out_tag',
 # NB 06.01.18   'parse' => function(&$o,&$r) {
index ede626241b4e15e449c16b38af1c4c1703184e69..b336d6253c501238e63be5a4bfc50c788349e6b0 100644 (file)
@@ -253,6 +253,19 @@ class DbQ extends nb {
                if (empty($head)) $head = [];
                if (empty($this->default_limit)) $this->default_limit = $this->db->limits[0];
 
+               # NB 31.01.18: Move to out.php or ldap.php 
+               $exp = '^(jpegPhoto)$';
+               if ($fct === null and $this->is_html) $fct = function(&$r) use ($exp) {
+                       static $i; # to detect first header line
+                       if ($i) foreach ($r as $k => $v) {
+                               if ($v and preg_match("/$exp/",$k) and $this->is_base64($v)) {
+                                       $r[$k] = '<img src="data:image/jpeg;base64,'.$v.'" />';
+                                       #debug($r);
+                               }
+                       }
+                       $i++;
+               };
+
                // Write output
                if ($this->expires and !preg_match('/^(dump|insert|update|replace|rm|vi)$/',$this->params['action'])) $this->page->expires = $this->expires;
                if (empty($this->_nopage)) {
@@ -456,10 +469,7 @@ class DbQ extends nb {
                        return;
                }
 
-               $this->table->html_edit($values,
-# NB 14.12.17                  $this->table->base . '/' . ($add ? 'insert' : 'update' . '/' . urlencode($this->params['args'])) . '/'
-                       $this->table->base . '/' . ($add ? 'insert' : 'update') # NB 07.01.18 . '/'
-               ,$add);
+               $this->table->html_edit($values, $this->table->base . '/' . ($add ? 'insert' : 'update') ,$add);
        }
 
        public function table_rw() {
@@ -1086,7 +1096,6 @@ EOF;
                        $this->page($this->db,[
                                [ 'help', 'This help' ],
                                [ 'ls', 'List configured databases' ],
-                               [ 'ldap', 'Connect to domain ldap server [/FILTER/ATTRS' ],
                                [ 'databases', 'List others databases' ],
                                [ 'cryptkey', 'Generate a random encryption key' ],
                                [ 'ssha_password', 'Encrypt a password' ],
@@ -1098,6 +1107,7 @@ EOF;
                        ] + (
                                ($this->perm < self::ADMIN) ? [] :
                        [
+                               [ 'ldap', 'Connect to domain ldap server [/FILTER/ATTRS' ],
                                [ 'phpinfo', 'Phpinfo' ],
                                [ '_SERVER', 'Dump _SERVER' ],
                                [ '_REQUEST', 'Dump _REQUEST' ],
@@ -1134,6 +1144,10 @@ EOF;
                } elseif ($action == 'ldap') {
                        $table = $this->params['table'];
                        $attrs = ($this->params['action'] ? explode(',',$this->params['action']) : []);
+                       if (false and $this->params['format'] == $this->format_html) {
+                               $this->params['format'] = 'div';
+                               $this->run_init();
+                       }
                        $this->page($this->ldap($table,$attrs));
 
                } elseif ($action == 'phpinfo') {
index 6199767e282e18a529a19034c7c057e62a37a3c3..31d8a69e06a3b828e4d792687e2d056aa4d1133a 100644 (file)
@@ -221,6 +221,18 @@ div.row div {
        border-bottom: solid 1px #fff;
 }
 
+.rows .row img {
+       height: 1.2em;
+}
+
+div.row div.ZjpegPhoto span {
+       max-width: 5em;
+       max-height: 1,2em;
+       text-overflow: ellipsis;
+       overflow: hidden;
+       display: none;
+}
+
 div.row div.view .button { margin-bottom: 5px; }
 div.row div.delete .button { margin-top: 5px; }
 div.row div:last-child { border-bottom: none; padding-bottom: 0; }
index 90b00e518f46d115d8123280a963db5de2d2645f..655ae00d45374383952202738401a1e11b27cacd 100644 (file)
@@ -1 +1 @@
-html{font:90% 'Trebuchet MS',sans-serif;background-color:#eee}body{display:table;margin-left:auto;margin-right:auto;padding-left:1em;padding-right:1em;color:#444}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.loader{border:16px solid #fff;border-radius:50%;border-top:16px solid #000;padding:0;margin:0 auto 0 auto;width:8em;height:8em;animation:spin 2s linear infinite;display:block}body.loader{margin-top:8em}.loader *{display:none!important}h1{margin:0 0 .2em 0;font-size:180%;padding-bottom:.3em;margin-bottom:.5em;border-bottom:dashed 1px #444}h1 select{padding:0;border:none;background:inherit;font:inherit}a{color:inherit}div>a,li a,p a,td a{color:#3572b0}a,a:visited{text-decoration:none}.button:hover,a:hover{opacity:.8}ul{padding:0;margin:0}li{list-style:none;padding:0 0 0 .3em}table{border-collapse:collapse}td,th{padding:.2em .7em}th a.sort{float:left;margin-right:.1em}input:not([type]),input[type=''],input[type=date],input[type=email],input[type=password],input[type=text],input[type=url],select,textarea{border-radius:3px;border:solid 1px #ddd;padding:.3em .4em;box-shadow:0 1px 1px #eee}input[size]{max-width:70%}div.row div label:after,form label:after{content:':'}form input,form label,form select{vertical-align:middle;margin:.2em .4em .2em 0}.rows{padding:0}.rows form{display:inline-block}.block,.menu,div.row,form.edit,iframe,pre,table.rows,ul.row{border-radius:4px;border-spacing:0;padding:.5em .2em;margin-bottom:.5em;border:solid 1px #ddd;background-color:#fafafa;box-shadow:0 1px 2px #eee}table.rows{border-style:hidden;border-collapse:collapse;box-shadow:0 0 0 1px #ddd;table-layout:fixed}table.rows tr:nth-child(even) td{background-color:#fefefe}div.row div,table.rows td,table.rows th,ul.row li{border-bottom:solid 1px #ddd}div.row div,table.rows tr:last-child td,ul.row li{border-bottom:none}table.rows td,table.rows th{border-right:dashed 1px #ddd}.rows .count{text-align:right}table.rows th{text-align:left}table.rows td{padding:.3em .3em}table.rows.fixed{width:100%}div.row div label,table.rows.fixed td,table.rows.fixed th{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}table.rows.fixed th{white-space:normal}table.rows td.delete,table.rows td.view{width:1%;white-space:nowrap}table.rows.fixed th.view{width:2em}table.rows.fixed th.delete{width:2.7em}div.rows{clear:both}div.row{float:left;margin-right:4px;min-width:24%}.nofloat{float:none}div.row div{margin:0;padding:.1em .2em;border-bottom:solid 1px #fff}div.row div.view .button{margin-bottom:5px}div.row div.delete .button{margin-top:5px}div.row div:last-child{border-bottom:none;padding-bottom:0}div.row div.delete label,div.row div.view label{display:none}div.row div.delete,div.row div.view{text-align:center}div.row div label,ul.row li label{padding:.1em .5em .1em 0;min-width:20%;display:inline-block}.button{font:inherit;display:inline-block;text-decoration:none;line-height:1.6em;cursor:pointer;white-space:nowrap;box-sizing:border-box;margin:0 .1em 0 0;padding:0 .3em;border-radius:4px;border:none;color:#3572b0;background-color:#eee;background:linear-gradient(to bottom right,#eee,#ddd);box-shadow:0 1px 1px #bbb}.bottom,.center,.menu,.nav,.rows{clear:both;display:table}.bottom,.buttons,.center,.menu,.nav,.rows,td.button{margin-left:auto;margin-right:auto}div.buttons{text-align:center;margin-top:.5em}form.menu{padding:.5em;background-color:#fafafa;max-width:1024px}form.menu .button.add{float:right;margin-top:.2em}form.menu .criterias{border-top:dashed 1px #ddd;margin-top:.3em;padding-top:.3em;clear:both}form.menu .criterias span.label{border-right:solid 1px #fff;border-radius:3px;margin:0 .2em;white-space:nowrap;float:left}form.menu .criterias span.label:last-child{border-right:none}form.menu select:focus{max-width:auto}form.menu select{max-width:20%}form.menu .criterias input[type=text]{width:4em}div.row label,form.edit .fields label{width:25%;text-align:right;display:inline-block;margin-right:1em;vertical-align:top}div.row .label span,form.edit .fields .label span{width:54%;display:inline-block;text-align:left;vertical-align:middle;margin-top:.2em}form.edit .fields input[size],form.edit .fields select,form.edit .fields textarea{width:65%}
+html{font:90% 'Trebuchet MS',sans-serif;background-color:#eee}body{display:table;margin-left:auto;margin-right:auto;padding-left:1em;padding-right:1em;color:#444}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.loader{border:16px solid #fff;border-radius:50%;border-top:16px solid #000;padding:0;margin:0 auto 0 auto;width:8em;height:8em;animation:spin 2s linear infinite;display:block}body.loader{margin-top:8em}.loader *{display:none!important}h1{margin:0 0 .2em 0;font-size:180%;padding-bottom:.3em;margin-bottom:.5em;border-bottom:dashed 1px #444}h1 select{padding:0;border:none;background:inherit;font:inherit}a{color:inherit}div>a,li a,p a,td a{color:#3572b0}a,a:visited{text-decoration:none}.button:hover,a:hover{opacity:.8}ul{padding:0;margin:0}li{list-style:none;padding:0 0 0 .3em}table{border-collapse:collapse}td,th{padding:.2em .7em}th a.sort{float:left;margin-right:.1em}input:not([type]),input[type=''],input[type=date],input[type=email],input[type=password],input[type=text],input[type=url],select,textarea{border-radius:3px;border:solid 1px #ddd;padding:.3em .4em;box-shadow:0 1px 1px #eee}input[size]{max-width:70%}div.row div label:after,form label:after{content:':'}form input,form label,form select{vertical-align:middle;margin:.2em .4em .2em 0}.rows{padding:0}.rows form{display:inline-block}.block,.menu,div.row,form.edit,iframe,pre,table.rows,ul.row{border-radius:4px;border-spacing:0;padding:.5em .2em;margin-bottom:.5em;border:solid 1px #ddd;background-color:#fafafa;box-shadow:0 1px 2px #eee}table.rows{border-style:hidden;border-collapse:collapse;box-shadow:0 0 0 1px #ddd;table-layout:fixed}table.rows tr:nth-child(even) td{background-color:#fefefe}div.row div,table.rows td,table.rows th,ul.row li{border-bottom:solid 1px #ddd}div.row div,table.rows tr:last-child td,ul.row li{border-bottom:none}table.rows td,table.rows th{border-right:dashed 1px #ddd}.rows .count{text-align:right}table.rows th{text-align:left}table.rows td{padding:.3em .3em}table.rows.fixed{width:100%}div.row div label,table.rows.fixed td,table.rows.fixed th{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}table.rows.fixed th{white-space:normal}table.rows td.delete,table.rows td.view{width:1%;white-space:nowrap}table.rows.fixed th.view{width:2em}table.rows.fixed th.delete{width:2.7em}div.rows{clear:both}div.row{float:left;margin-right:4px;min-width:24%}.nofloat{float:none}div.row div{margin:0;padding:.1em .2em;border-bottom:solid 1px #fff}.rows .row img{height:1.2em}div.row div.ZjpegPhoto span{max-width:5em;max-height:1,2em;text-overflow:ellipsis;overflow:hidden;display:none}div.row div.view .button{margin-bottom:5px}div.row div.delete .button{margin-top:5px}div.row div:last-child{border-bottom:none;padding-bottom:0}div.row div.delete label,div.row div.view label{display:none}div.row div.delete,div.row div.view{text-align:center}div.row div label,ul.row li label{padding:.1em .5em .1em 0;min-width:20%;display:inline-block}.button{font:inherit;display:inline-block;text-decoration:none;line-height:1.6em;cursor:pointer;white-space:nowrap;box-sizing:border-box;margin:0 .1em 0 0;padding:0 .3em;border-radius:4px;border:none;color:#3572b0;background-color:#eee;background:linear-gradient(to bottom right,#eee,#ddd);box-shadow:0 1px 1px #bbb}.bottom,.center,.menu,.nav,.rows{clear:both;display:table}.bottom,.buttons,.center,.menu,.nav,.rows,td.button{margin-left:auto;margin-right:auto}div.buttons{text-align:center;margin-top:.5em}form.menu{padding:.5em;background-color:#fafafa;max-width:1024px}form.menu .button.add{float:right;margin-top:.2em}form.menu .criterias{border-top:dashed 1px #ddd;margin-top:.3em;padding-top:.3em;clear:both}form.menu .criterias span.label{border-right:solid 1px #fff;border-radius:3px;margin:0 .2em;white-space:nowrap;float:left}form.menu .criterias span.label:last-child{border-right:none}form.menu select:focus{max-width:auto}form.menu select{max-width:20%}form.menu .criterias input[type=text]{width:4em}div.row label,form.edit .fields label{width:25%;text-align:right;display:inline-block;margin-right:1em;vertical-align:top}div.row .label span,form.edit .fields .label span{width:54%;display:inline-block;text-align:left;vertical-align:middle;margin-top:.2em}form.edit .fields input[size],form.edit .fields select,form.edit .fields textarea{width:65%}