Merge branch 'seeddms-5.1.x' into seeddms-6.0.x

This commit is contained in:
Uwe Steinmann 2020-07-30 11:06:28 +02:00
commit 709d362b02
14 changed files with 151 additions and 49 deletions

View File

@ -1,3 +1,8 @@
--------------------------------------------------------------------------------
Changes in version 6.0.12
--------------------------------------------------------------------------------
- merge changes up to 5.1.19
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Changes in version 6.0.11 Changes in version 6.0.11
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
@ -157,6 +162,12 @@
- add document list which can be exported as an archive - add document list which can be exported as an archive
- search results can be exported - search results can be exported
--------------------------------------------------------------------------------
Changes in version 5.1.19
--------------------------------------------------------------------------------
- add hooks showDocumentAttribute and showDocumentContentAttribute in Search view
- fix layout problems of select2 menu, add option for adding an icon to each option
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Changes in version 5.1.18 Changes in version 5.1.18
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------

View File

@ -472,7 +472,7 @@ class SeedDMS_Core_DMS {
$this->lasterror = ''; $this->lasterror = '';
$this->version = '@package_version@'; $this->version = '@package_version@';
if($this->version[0] == '@') if($this->version[0] == '@')
$this->version = '6.0.11'; $this->version = '6.0.12';
} /* }}} */ } /* }}} */
/** /**
@ -824,7 +824,9 @@ class SeedDMS_Core_DMS {
* Returns a document by its name * Returns a document by its name
* *
* This function searches a document by its name and restricts the search * This function searches a document by its name and restricts the search
* to given folder if passed as the second parameter. * to the given folder if passed as the second parameter.
* If there are more than one document with that name, then only the first
* one will be returned.
* *
* @param string $name * @param string $name
* @param object $folder * @param object $folder

View File

@ -15,8 +15,8 @@
<date>2020-06-05</date> <date>2020-06-05</date>
<time>09:43:12</time> <time>09:43:12</time>
<version> <version>
<release>6.0.11</release> <release>6.0.12</release>
<api>6.0.11</api> <api>6.0.12</api>
</version> </version>
<stability> <stability>
<release>stable</release> <release>stable</release>
@ -24,7 +24,7 @@
</stability> </stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license> <license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes> <notes>
SeedDMS_Core_DMS::filterAccess() properly checks for documents - ???
</notes> </notes>
<contents> <contents>
<dir baseinstalldir="SeedDMS" name="/"> <dir baseinstalldir="SeedDMS" name="/">
@ -1802,6 +1802,21 @@ add method SeedDMS_Core_DatabaseAccess::setLogFp()
- fix SeedDMS_Core_DMS::getDocumentByOriginalFilename() - fix SeedDMS_Core_DMS::getDocumentByOriginalFilename()
</notes> </notes>
</release> </release>
<release>
<date>2020-07-30</date>
<time>09:43:12</time>
<version>
<release>5.1.19</release>
<api>5.1.19</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
</notes>
</release>
<release> <release>
<date>2017-02-28</date> <date>2017-02-28</date>
<time>06:34:50</time> <time>06:34:50</time>
@ -2036,5 +2051,21 @@ remove a user from all its process can also be used to set a new user
SeedDMS_Core_DocumentContent::delRevisor() returns -4 if user has already made a revision SeedDMS_Core_DocumentContent::delRevisor() returns -4 if user has already made a revision
</notes> </notes>
</release> </release>
<release>
<date>2020-06-05</date>
<time>09:43:12</time>
<version>
<release>6.0.11</release>
<api>6.0.11</api>
</version>
<stability>
<release>stable</release>
<api>stable</api>
</stability>
<license uri="http://opensource.org/licenses/gpl-license">GPL License</license>
<notes>
SeedDMS_Core_DMS::filterAccess() properly checks for documents
</notes>
</release>
</changelog> </changelog>
</package> </package>

View File

@ -33,12 +33,12 @@ class SeedDMS_Controller_UserListCsv extends SeedDMS_Controller_Common {
$m = max($m, count($u->getGroups())); $m = max($m, count($u->getGroups()));
} }
$fp = fopen("php://temp/maxmemory", 'r+'); $fp = fopen("php://temp/maxmemory", 'r+');
$header = array('login', 'name', 'email', 'comment', 'role', 'quota', 'homefolder'); $header = array('login', 'passenc', 'name', 'email', 'comment', 'role', 'quota', 'homefolder');
for($i=1; $i<=$m; $i++) for($i=1; $i<=$m; $i++)
$header[] = 'group_'.$i; $header[] = 'group_'.$i;
fputcsv($fp, $header, ';'); fputcsv($fp, $header, ';');
foreach($allUsers as $u) { foreach($allUsers as $u) {
$data = array($u->getLogin(), $u->getFullName(), $u->getEmail(), $u->getComment(), $u->isAdmin() ? 'admin' : ($u->isGuest() ? 'guest' : 'user'), $u->getQuota(), $u->getHomeFolder() ? $u->getHomeFolder() : ''); $data = array($u->getLogin(), $u->getPwd(), $u->getFullName(), $u->getEmail(), $u->getComment(), $u->isAdmin() ? 'admin' : ($u->isGuest() ? 'guest' : 'user'), $u->getQuota(), $u->getHomeFolder() ? $u->getHomeFolder() : '');
foreach($u->getGroups() as $g) foreach($u->getGroups() as $g)
$data[] = $g->getName(); $data[] = $g->getName();
fputcsv($fp, $data, ';'); fputcsv($fp, $data, ';');

View File

@ -58,7 +58,7 @@ class SeedDMS_DbAuthentication extends SeedDMS_Authentication {
// Check if password matches (if not a guest user) // Check if password matches (if not a guest user)
// Assume that the password has been sent via HTTP POST. It would be careless // Assume that the password has been sent via HTTP POST. It would be careless
// (and dangerous) for passwords to be sent via GET. // (and dangerous) for passwords to be sent via GET.
if (md5($password) != $user->getPwd()) { if (!seed_pass_verify($password, $user->getPwd())) {
/* if counting of login failures is turned on, then increment its value */ /* if counting of login failures is turned on, then increment its value */
if($settings->_loginFailure) { if($settings->_loginFailure) {
$failures = $user->addLoginFailure(); $failures = $user->addLoginFailure();

View File

@ -615,7 +615,7 @@ function getBaseUrl() { /* {{{ */
return "http".((isset($_SERVER['HTTPS']) && (strcmp($_SERVER['HTTPS'],'off')!=0)) ? "s" : "")."://".$_SERVER['HTTP_HOST']; return "http".((isset($_SERVER['HTTPS']) && (strcmp($_SERVER['HTTPS'],'off')!=0)) ? "s" : "")."://".$_SERVER['HTTP_HOST'];
} /* }}} */ } /* }}} */
function getToken($length){ function getToken($length){ /* {{{ */
$token = ""; $token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz"; $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
@ -627,7 +627,27 @@ function getToken($length){
} }
return $token; return $token;
} } /* }}} */
/**
* Hash a password
*
* @param string $password
* @return string hashed password
*/
function seed_pass_hash($password) { /* {{{ */
return md5($password);
} /* }}} */
/**
* Verify a password
*
* @param string $password
* @return string hashed password
*/
function seed_pass_verify($password, $hash) { /* {{{ */
return $hash == md5($password);
} /* }}} */
function resolveTask($task) { function resolveTask($task) {
global $dms, $user, $settings, $logger; global $dms, $user, $settings, $logger;
@ -642,19 +662,19 @@ function resolveTask($task) {
return $task; return $task;
} }
class SeedDMS_CSRF { class SeedDMS_CSRF { /* {{{ */
protected $secret; protected $secret;
public function __construct($secret) { public function __construct($secret) { /* {{{ */
$this->secret = $secret; $this->secret = $secret;
} } /* }}} */
public function create_api_key() { public function create_api_key() { /* {{{ */
return base64_encode($this->encrypt(time().'|'.$_SERVER['REMOTE_ADDR'])); // !change if you dont want IP check return base64_encode($this->encrypt(time().'|'.$_SERVER['REMOTE_ADDR'])); // !change if you dont want IP check
} } /* }}} */
public function check_api_key($key, $timeout = 5) { public function check_api_key($key, $timeout = 5) { /* {{{ */
if (empty($key)) exit('Invalid Key'); if (empty($key)) exit('Invalid Key');
$keys = explode('|', $this->decrypt(base64_decode($key))); $keys = explode('|', $this->decrypt(base64_decode($key)));
@ -664,9 +684,9 @@ class SeedDMS_CSRF {
$keys[0] >= (time() - $timeout) && $keys[0] >= (time() - $timeout) &&
$keys[1] == $_SERVER['REMOTE_ADDR'] // !change if you dont want IP check $keys[1] == $_SERVER['REMOTE_ADDR'] // !change if you dont want IP check
); );
} } /* }}} */
public function encrypt($string, $key = 'PrivateKey', $method = 'AES-256-CBC') { public function encrypt($string, $key = 'PrivateKey', $method = 'AES-256-CBC') { /* {{{ */
// hash // hash
$key = hash('sha256', $key); $key = hash('sha256', $key);
// create iv - encrypt method AES-256-CBC expects 16 bytes // create iv - encrypt method AES-256-CBC expects 16 bytes
@ -675,9 +695,9 @@ class SeedDMS_CSRF {
$output = openssl_encrypt($string, $method, $key, 0, $iv); $output = openssl_encrypt($string, $method, $key, 0, $iv);
// encode // encode
return base64_encode($output); return base64_encode($output);
} } /* }}} */
public function decrypt($string, $key = 'PrivateKey', $method = 'AES-256-CBC') { public function decrypt($string, $key = 'PrivateKey', $method = 'AES-256-CBC') { /* {{{ */
// hash // hash
$key = hash('sha256', $key); $key = hash('sha256', $key);
// create iv - encrypt method AES-256-CBC expects 16 bytes // create iv - encrypt method AES-256-CBC expects 16 bytes
@ -686,8 +706,8 @@ class SeedDMS_CSRF {
$string = base64_decode($string); $string = base64_decode($string);
// decrypt // decrypt
return openssl_decrypt($string, $method, $key, 0, $iv); return openssl_decrypt($string, $method, $key, 0, $iv);
} } /* }}} */
} } /* }}} */
//$CSRF = new SeedDMS_CSRF($settings->_encryptionKey); //$CSRF = new SeedDMS_CSRF($settings->_encryptionKey);
//$kkk = $CSRF->create_api_key(); //$kkk = $CSRF->create_api_key();

View File

@ -20,7 +20,7 @@
class SeedDMS_Version { /* {{{ */ class SeedDMS_Version { /* {{{ */
const _number = "6.0.11"; const _number = "6.0.12";
const _string = "SeedDMS"; const _string = "SeedDMS";
function __construct() { function __construct() {

View File

@ -54,7 +54,7 @@ if (empty($newpassword) || empty($newpasswordrepeat) || $newpassword != $newpass
$user = $dms->checkPasswordRequest($hash); $user = $dms->checkPasswordRequest($hash);
if($user) { if($user) {
$user->setPwd(md5($newpassword)); $user->setPwd(seed_pass_hash($newpassword));
$dms->deletePasswordRequest($hash); $dms->deletePasswordRequest($hash);
header('Location: ../out/out.Login.php'); header('Location: ../out/out.Login.php');
exit; exit;

View File

@ -46,7 +46,7 @@ if(isset($_POST["theme"]))
$mytheme = $_POST["theme"]; $mytheme = $_POST["theme"];
$current_pwd = $_POST["currentpwd"]; $current_pwd = $_POST["currentpwd"];
if($user->getPwd() != md5($current_pwd)) { if(!seed_pass_verify($current_pwd, $user->getPwd())) {
UI::exitError(getMLText("edit_user_details"),getMLText("password_wrong")); UI::exitError(getMLText("edit_user_details"),getMLText("password_wrong"));
} }
@ -61,14 +61,14 @@ if (isset($_POST["pwd"]) && ($_POST["pwd"] != "")) {
if ($current_pwd == $_POST["pwd"]) // history doesn't have the initial pw stored yet if ($current_pwd == $_POST["pwd"]) // history doesn't have the initial pw stored yet
UI::exitError(getMLText("set_password"),getMLText("password_already_used")); UI::exitError(getMLText("set_password"),getMLText("password_already_used"));
$phm = new SeedDMS_PasswordHistoryManager($db); $phm = new SeedDMS_PasswordHistoryManager($db);
$oldpwd = $phm->search($user, md5($_POST["pwd"])); $oldpwd = $phm->search($user, seed_pass_hash($_POST["pwd"]));
if($oldpwd) { if($oldpwd) {
UI::exitError(getMLText("set_password"),getMLText("password_already_used")); UI::exitError(getMLText("set_password"),getMLText("password_already_used"));
} else { } else {
$phm->add($user, md5($_POST["pwd"])); $phm->add($user, seed_pass_hash($_POST["pwd"]));
} }
} }
$user->setPwd(md5($_POST["pwd"])); $user->setPwd(seed_pass_hash($_POST["pwd"]));
$user->setPwdExpiration(date('Y-m-d H:i:s', time()+$settings->_passwordExpiration*86400)); $user->setPwdExpiration(date('Y-m-d H:i:s', time()+$settings->_passwordExpiration*86400));
} else { } else {
UI::exitError(getMLText("set_password"),getMLText("password_strength_insuffient")); UI::exitError(getMLText("set_password"),getMLText("password_strength_insuffient"));
@ -76,14 +76,14 @@ if (isset($_POST["pwd"]) && ($_POST["pwd"] != "")) {
} else { } else {
if($settings->_passwordHistory > 0) { if($settings->_passwordHistory > 0) {
$phm = new SeedDMS_PasswordHistoryManager($db); $phm = new SeedDMS_PasswordHistoryManager($db);
$oldpwd = $phm->search($user, md5($_POST["pwd"])); $oldpwd = $phm->search($user, seed_pass_hash($_POST["pwd"]));
if($oldpwd) { if($oldpwd) {
UI::exitError(getMLText("set_password"),getMLText("password_already_used")); UI::exitError(getMLText("set_password"),getMLText("password_already_used"));
} else { } else {
$phm->add($user, md5($_POST["pwd"])); $phm->add($user, seed_pass_hash($_POST["pwd"]));
} }
} }
$user->setPwd(md5($_POST["pwd"])); $user->setPwd(seed_pass_hash($_POST["pwd"]));
$user->setPwdExpiration(date('Y-m-d H:i:s', time()+$settings->_passwordExpiration*86400)); $user->setPwdExpiration(date('Y-m-d H:i:s', time()+$settings->_passwordExpiration*86400));
} }
} }

View File

@ -31,6 +31,11 @@ function getBaseData($colname, $coldata, $objdata) { /* {{{ */
return $objdata; return $objdata;
} /* }}} */ } /* }}} */
function getPasswordPlainData($colname, $coldata, $objdata) { /* {{{ */
$objdata['passenc'] = seed_pass_hash($coldata);
return $objdata;
} /* }}} */
function getQuotaData($colname, $coldata, $objdata) { /* {{{ */ function getQuotaData($colname, $coldata, $objdata) { /* {{{ */
$objdata[$colname] = SeedDMS_Core_File::parse_filesize($coldata); $objdata[$colname] = SeedDMS_Core_File::parse_filesize($coldata);
return $objdata; return $objdata;
@ -98,7 +103,9 @@ if (isset($_FILES['userdata']) && $_FILES['userdata']['error'] == 0) {
$colmap[$i] = array("getFolderData", $colname); $colmap[$i] = array("getFolderData", $colname);
} elseif(in_array($colname, array('quota'))) { } elseif(in_array($colname, array('quota'))) {
$colmap[$i] = array("getQuotaData", $colname); $colmap[$i] = array("getQuotaData", $colname);
} elseif(in_array($colname, array('login', 'name', 'email', 'comment', 'group'))) { } elseif(in_array($colname, array('password'))) {
$colmap[$i] = array("getPasswordPlainData", $colname);
} elseif(in_array($colname, array('login', 'name', 'passenc', 'email', 'comment', 'group'))) {
$colmap[$i] = array("getBaseData", $colname); $colmap[$i] = array("getBaseData", $colname);
} elseif(substr($colname, 0, 5) == 'attr:') { } elseif(substr($colname, 0, 5) == 'attr:') {
$kk = explode(':', $colname, 2); $kk = explode(':', $colname, 2);
@ -141,6 +148,11 @@ if (isset($_FILES['userdata']) && $_FILES['userdata']['error'] == 0) {
if($makeupdate) if($makeupdate)
$eu->setEmail($u['email']); $eu->setEmail($u['email']);
} }
if(isset($u['passenc']) && $u['passenc'] != $eu->getPwd()) {
$log[] = array('id'=>$eu->getLogin(), 'type'=>'success', 'msg'=> "Encrypted password of user updated. '".$u['passenc']."' != '".$eu->getPwd()."'");
if($makeupdate)
$eu->setPwd($u['passenc']);
}
if(isset($u['comment']) && $u['comment'] != $eu->getComment()) { if(isset($u['comment']) && $u['comment'] != $eu->getComment()) {
$log[] = array('id'=>$eu->getLogin(), 'type'=>'success', 'msg'=> "Comment of user updated. '".$u['comment']."' != '".$eu->getComment()."'"); $log[] = array('id'=>$eu->getLogin(), 'type'=>'success', 'msg'=> "Comment of user updated. '".$u['comment']."' != '".$eu->getComment()."'");
if($makeupdate) if($makeupdate)

View File

@ -68,7 +68,7 @@ if ($action == "adduser") {
UI::exitError(getMLText("admin_tools"),getMLText("user_exists")); UI::exitError(getMLText("admin_tools"),getMLText("user_exists"));
} }
$newUser = $dms->addUser($login, md5($pwd), $name, $email, $settings->_language, $settings->_theme, $comment, $role, $isHidden, $isDisabled, $pwdexpiration, $quota, $homefolder); $newUser = $dms->addUser($login, seed_pass_hash($pwd), $name, $email, $settings->_language, $settings->_theme, $comment, $role, $isHidden, $isDisabled, $pwdexpiration, $quota, $homefolder);
if ($newUser) { if ($newUser) {
/* Set user image if uploaded */ /* Set user image if uploaded */
@ -388,7 +388,7 @@ else if ($action == "edituser") {
$editedUser->setPwd(''); $editedUser->setPwd('');
} else { } else {
if (isset($pwd) && ($pwd != "")) { if (isset($pwd) && ($pwd != "")) {
$editedUser->setPwd(md5($pwd)); $editedUser->setPwd(seed_pass_hash($pwd));
} }
} }
if ($editedUser->getFullName() != $name) if ($editedUser->getFullName() != $name)

View File

@ -11,7 +11,10 @@ chzn_template_func = function (state) {
var warning = ''; var warning = '';
if($(state.element).data('warning')) if($(state.element).data('warning'))
warning = $(state.element).data('warning')+''; /* make sure it is a string */ warning = $(state.element).data('warning')+''; /* make sure it is a string */
var html = '<span>'+state.text.replace(/</g, '&lt;')+''; var html = '<span>';
if($(state.element).data('icon-before'))
html += '<i class="icon-'+$(state.element).data('icon-before')+'"></i> ';
html += state.text.replace(/</g, '&lt;')+'';
if(subtitle) if(subtitle)
html += '<br /><i>'+subtitle.replace(/</g, '&lt;')+'</i>'; html += '<br /><i>'+subtitle.replace(/</g, '&lt;')+'</i>';
if(warning) if(warning)
@ -58,8 +61,8 @@ $(document).ready( function() {
$(".chzn-select").select2({ $(".chzn-select").select2({
width: '100%', width: '100%',
templateResult: chzn_template_func, templateResult: chzn_template_func//,
templateSelection: chzn_template_func //templateSelection: chzn_template_func
}); });
/* change the color and length of the bar graph showing the password /* change the color and length of the bar graph showing the password
@ -377,8 +380,8 @@ $(document).ready( function() {
element.html(data); element.html(data);
$(".chzn-select").select2({ $(".chzn-select").select2({
width: '100%', width: '100%',
templateResult: chzn_template_func, templateResult: chzn_template_func//,
templateSelection: chzn_template_func //templateSelection: chzn_template_func
}); });
$(".pwd").passStrength({ /* {{{ */ $(".pwd").passStrength({ /* {{{ */
url: "../op/op.Ajax.php", url: "../op/op.Ajax.php",
@ -426,8 +429,8 @@ $(document).ready( function() {
element.html(data); element.html(data);
$(".chzn-select").select2({ $(".chzn-select").select2({
width: '100%', width: '100%',
templateResult: chzn_template_func, templateResult: chzn_template_func//,
templateSelection: chzn_template_func //templateSelection: chzn_template_func
}); });
$(".pwd").passStrength({ /* {{{ */ $(".pwd").passStrength({ /* {{{ */
url: "../op/op.Ajax.php", url: "../op/op.Ajax.php",

View File

@ -626,18 +626,40 @@ $(document).ready( function() {
$attrstr .= "<table class=\"table table-condensed\">\n"; $attrstr .= "<table class=\"table table-condensed\">\n";
$attrstr .= "<tr><th>".getMLText('name')."</th><th>".getMLText('attribute_value')."</th></tr>"; $attrstr .= "<tr><th>".getMLText('name')."</th><th>".getMLText('attribute_value')."</th></tr>";
foreach($lcattributes as $lcattribute) { foreach($lcattributes as $lcattribute) {
$arr = $this->callHook('showDocumentContentAttribute', $lc, $lcattribute);
if(is_array($arr)) {
$attrstr .= "<tr>";
$attrstr .= "<td>".$arr[0].":</td>";
$attrstr .= "<td>".$arr[1]."</td>";
$attrstr .= "</tr>";
} elseif(is_string($arr)) {
$attrstr .= $arr;
} else {
$attrdef = $lcattribute->getAttributeDefinition(); $attrdef = $lcattribute->getAttributeDefinition();
$attrstr .= "<tr><td>".htmlspecialchars($attrdef->getName())."</td><td>".htmlspecialchars(implode(', ', $lcattribute->getValueAsArray()))."</td></tr>\n"; $attrstr .= "<tr><td>".htmlspecialchars($attrdef->getName())."</td><td>".htmlspecialchars(implode(', ', $lcattribute->getValueAsArray()))."</td></tr>\n";
// TODO: better use printAttribute()
// $this->printAttribute($lcattribute);
}
} }
$attrstr .= "</table>\n"; $attrstr .= "</table>\n";
} }
$docttributes = $document->getAttributes(); $docattributes = $document->getAttributes();
if($docttributes) { if($docattributes) {
$attrstr .= "<table class=\"table table-condensed\">\n"; $attrstr .= "<table class=\"table table-condensed\">\n";
$attrstr .= "<tr><th>".getMLText('name')."</th><th>".getMLText('attribute_value')."</th></tr>"; $attrstr .= "<tr><th>".getMLText('name')."</th><th>".getMLText('attribute_value')."</th></tr>";
foreach($docttributes as $docttribute) { foreach($docattributes as $docattribute) {
$attrdef = $docttribute->getAttributeDefinition(); $arr = $this->callHook('showDocumentAttribute', $document, $docattribute);
$attrstr .= "<tr><td>".htmlspecialchars($attrdef->getName())."</td><td>".htmlspecialchars(implode(', ', $docttribute->getValueAsArray()))."</td></tr>\n"; if(is_array($arr)) {
$attrstr .= "<tr>";
$attrstr .= "<td>".$arr[0].":</td>";
$attrstr .= "<td>".$arr[1]."</td>";
$attrstr .= "</tr>";
} elseif(is_string($arr)) {
$attrstr .= $arr;
} else {
$attrdef = $docattribute->getAttributeDefinition();
$attrstr .= "<tr><td>".htmlspecialchars($attrdef->getName())."</td><td>".htmlspecialchars(implode(', ', $docattribute->getValueAsArray()))."</td></tr>\n";
}
} }
$attrstr .= "</table>\n"; $attrstr .= "</table>\n";
} }

View File

@ -613,10 +613,11 @@ $('body').on('click', '.order-btn', function(ev) {
echo "</div>"; echo "</div>";
} }
// $this->folderList(); echo $this->callHook('rightContentPre');
?> ?>
<div class="ajax" data-view="ViewFolder" data-action="folderList" <?php echo ($folder ? "data-query=\"folderid=".$folder->getID()."&orderby=".$orderby."\"" : "") ?>></div> <div class="ajax" data-view="ViewFolder" data-action="folderList" <?php echo ($folder ? "data-query=\"folderid=".$folder->getID()."&orderby=".$orderby."\"" : "") ?>></div>
<?php <?php
echo $this->callHook('rightContentPost');
echo "</div>\n"; // End of right column div echo "</div>\n"; // End of right column div
echo "</div>\n"; // End of div around left and right column echo "</div>\n"; // End of div around left and right column