<?php
###################################################################
# smbwebclient.php
# This script is a web interface to a Windows Network.
#
# Installation:
# 1. You will need smbclient (from SAMBA package) and PHP 4.1+.
# 2. Change your settings (editing this file) -- see below
# 3. Copy it to your web server path as smbwebclient.php and run it
# from your web browser. That's all.
#
# Putting settings in another file:
#
# 1) /var/www/smbwebclient.php
#
# (?php
# $SMBWEBCLIENT_CLASS = 'smbwebclient_config';
# include '/usr/share/samba/smbwebclient.php';
# include '/etc/samba/smbwebclient.conf';
# $swc = new smbwebclient_config;
# $swc->Run();
# ?)
#
# 2) /etc/samba/smbwebclient.conf:
#
# (?php
# class smbwebclient_config extends smbwebclient {
# var $cfgSambaRoot = 'MYDOMAIN/MYSERVER';
# var $cfgDefaultLanguage = 'es';
# // all your settings ...
# }
# ?)
#
# 3) /usr/share/samba/smbwebclient.php (this file)
#
# Homepage: http://smbwebclient.sourceforge.net
#
# Copyright (C) 2003-2005 Victor M. Varela <vmvarela@gmail.com>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
$SMBWEBCLIENT_VERSION = '2.9.1b';
###################################################################
class smbwebclient extends samba {
###################################################################
# CONFIGURATION SECTION - Change for your needs
###################################################################
###################################################################
# You can set this constant to see a single domain (or workgroup),
# a domain and a server, a domain/server/shared resource
# and (even) a path into a domain/server/shared.
# For example to see only folder Bilbo in 'Bolson' shared resource
# at 'HOBBIT' server in 'TIERRAMEDIA' domain would be:
# var $cfgSambaRoot = 'TIERRAMEDIA/HOBBIT/Bolson/Bilbo';
# Note: Do not put any slash at beginning/end.
# Tip: To share only their home directory in your SAMBA server to
# users (auth req.) you must set cfgSambaRoot to
# 'DOMAIN/SERVER/homes'
var $cfgSambaRoot = '';
###################################################################
# Anonymoys login is disallowed by default.
# If you have public shares in your network, turn on this flag
# i.e. var $cfgAnonymous = true;
var $cfgAnonymous = false;
###################################################################
# Path at web server to store downloaded files. This script will
# check when it need to update the cached file. This path must be
# writable to the user that runs your web server.
# If you set this value to '' cache will be disabled.
# Note: this feature is a security risk.
var $cfgCachePath = false;
###################################################################
# This script try to set language from web browser. If browser
# language is not supported you can set a default language.
var $cfgDefaultLanguage = 'en';
###################################################################
# Default charset (as suggested by Norbert Malecki)
var $cfgDefaultCharset = 'ISO-8859-1';
###################################################################
# Default browse server for your network. A browse server is where
# you run smbclient -L subcommand to read available domains and/or
# workgroups. Set to 'localhost' if you are running SAMBA server
# in your web server. Maybe you will need cfgDefaultUser and
# cfgDefaultPassword if no anonymous browsing is allowed.
var $cfgDefaultServer = 'localhost';
###################################################################
# Path to smbclient program.
# i.e. var $cfgSmbClient = '/usr/bin/smbclient';
var $cfgSmbClient = 'smbclient';
###################################################################
# Authentication method with smbclient
# 'SMB_AUTH_ENV' USER environment variable (more secure)
# 'SMB_AUTH_ARG' smbclient -U param
var $cfgAuthMode = 'SMB_AUTH_ARG';
###################################################################
# If you have Apache mod_rewrite installed you can put this
# .htaccess file in same path of smbwebclient.php:
#
# <IfModule mod_rewrite.c>
# RewriteEngine on
# RewriteCond %{REQUEST_FILENAME} -d
# RewriteRule ^(.*/[^\./]*[^/])$ $1/
# RewriteRule ^(.*)$ smbwebclient.php?path=$1 [QSA,L]
# </IfModule>
#
# Then you will be able to access to use "pretty" URLs
# i.e: http://server/windows-network/DOMAIN/SERVER/SHARE/PATH
#
# To do this, all you have to set is cfgBaseUrl and set
# cfgModRewrite = true
# (i.e. http://server/windows-network/)
#
# Note - Change this if you want to use mod_rewrite
var $cfgModRewrite = false;
var $cfgBaseUrl = '';
###################################################################
# Do not show dot files (like .cshrc)
#
var $cfgHideDotFiles = true;
###################################################################
# Do not show system shared resources (like admin$ or C$)
#
var $cfgHideSystemShares = true;
###################################################################
# Do not show printer resources
#
var $cfgHidePrinterShares = false;
###################################################################
# Log level
# -1 = no messages
# 0 = log actions performed
# 1 = smbclient calls
# >1 = smbclient output
#
var $cfgLogLevel = 0;
###################################################################
# Log facility (User authentication: BasicAuth or FormAuth)
#
var $cfgFacility = LOG_DAEMON;
###################################################################
# User authentication (BasicAuth or FormAuth)
#
var $cfgUserAuth = 'BasicAuth';
###################################################################
# Change PHP session name ('' to use default session name)
#
var $cfgSessionName = 'SMBWebClientID';
###################################################################
# Virus scanner to upload files -- suggested by Bill R <wjries@hotmail.com>
# Only ClamAV is available in this revision, set to false to
# disable virus scanning.
#
# var $cfgAntivirus = 'ClamAV';
var $cfgAntivirus = false;
###################################################################
# Format to upload compressed folders: tar, tgz or zip
#
# var $cfgArchiver = 'tgz';
var $cfgArchiver = 'zip';
var $archiverPlugins = array(
'tar' => '',
'tgz' => '| gzip -q -c - ',
'zip' => '| ( cat - > @f.tar; mkdir @f.zip.$$; cd @f.zip.$$; tar xf @f.tar; zip -r -q @f.zip *; cd ..; rm -rf @f.tar @f.zip.$$; cat @f.zip; rm @f.zip )'
);
###################################################################
# INTERFACE CLASS
###################################################################
# inline files (included using base64_encode PHP function)
var $cfgInlineFiles = true;
var $inlineFiles = array (
'data/languages.csv' => 'YWY7YWZ8YWZyaWthYW5zCmFyO2FyKFstX11bWzphbHBoYTpdXXsyfSk/fGFyYWJpYwphejthenxhemVyYmFpamFuaQpiZztiZ3xidWxnYXJpYW4KYnM7YnN8Ym9zbmlhbgpjYTtjYXxjYXRhbGFuCmNzO2NzfGN6ZWNoCmRhO2RhfGRhbmlzaApkZTtkZShbLV9dW1s6YWxwaGE6XV17Mn0pP3xnZXJtYW4KZWw7ZWx8Z3JlZWsKZW47ZW4oWy1fXVtbOmFscGhhOl1dezJ9KT98ZW5nbGlzaAplbztlb3xlc3BlcmFudG8KZXM7ZXMoWy1fXVtbOmFscGhhOl1dezJ9KT98c3BhbmlzaApldDtldHxlc3RvbmlhbgpldTtldXxiYXNxdWUKZmE7ZmF8cGVyc2lhbgpmaTtmaXxmaW5uaXNoCmZyO2ZyKFstX11bWzphbHBoYTpdXXsyfSk/fGZyZW5jaApnbDtnbHxnYWxpY2lhbgpoZTtoZXxoZWJyZXcKaGk7aGl8aGluZGkKaHI7aHJ8Y3JvYXRpYW4KaHU7aHV8aHVuZ2FyaWFuCmlkO2lkfGluZG9uZXNpYW4KaXQ7aXR8aXRhbGlhbgpqYTtqYXxqYXBhbmVzZQprbztrb3xrb3JlYW4Ka2E7a2F8Z2VvcmdpYW4KbHQ7bHR8bGl0aHVhbmlhbgpsdjtsdnxsYXR2aWFuCm1zO21zfG1hbGF5Cm5sO25sKFstX11bWzphbHBoYTpdXXsyfSk/fGR1dGNoCm5vO25vfG5vcndlZ2lhbgpwbDtwbHxwb2xpc2gKcHQtYnI7cHRbLV9dYnJ8YnJhemlsaWFuIHBvcnR1Z3Vlc2UKcHQ7cHQoWy1fXVtbOmFscGhhOl1dezJ9KT98cG9ydHVndWVzZQpybztyb3xyb21hbmlhbgpydTtydXxydXNzaWFuCnNrO3NrfHNsb3ZhawpzbDtzbHxzbG92ZW5pYW4Kc3E7c3F8YWxiYW5pYW4Kc3I7c3J8c2VyYmlhbgpzdjtzdnxzd2VkaXNoCnRoO3RofHRoYWkKdHI7dHJ8dHVya2lzaAp1azt1a3x1a3JhaW5pYW4KemgtdHc7emhbLV9ddHd8Y2hpbmVzZSB0cmFkaXRpb25hbAp6aDt6aHxjaGluZXNlIHNpbXBsaWZpZWQ=',
'data/mime.types' => 'bWRiIGFwcGxpY2F0aW9uL21zYWNjZXNzCmRvYyBhcHBsaWNhdGlvbi9tc3dvcmQKZG90IGFwcGxpY2F0aW9uL21zd29yZApiaW4gYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCnBkZiBhcHBsaWNhdGlvbi9wZGYKcGdwIGFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUKcHMgYXBwbGljYXRpb24vcG9zdHNjcmlwdApydGYgdGV4dC9ydGYKeGxzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbApwcHQgYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQKcHBzIGFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50CnBvdCBhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludAp6aXAgYXBwbGljYXRpb24vemlwCmRlYiBhcHBsaWNhdGlvbi94LWRlYmlhbi1wYWNrYWdlCmR2aSBhcHBsaWNhdGlvbi94LWR2aQpndGFyIGFwcGxpY2F0aW9uL3gtZ3Rhcgp0Z3ogYXBwbGljYXRpb24veC1ndGFyCnRheiBhcHBsaWNhdGlvbi94LWd0YXIKaWNhIGFwcGxpY2F0aW9uL3gtaWNhCmpzIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdApsaGEgYXBwbGljYXRpb24veC1saGEKbHpoIGFwcGxpY2F0aW9uL3gtbHpoCmx6eCBhcHBsaWNhdGlvbi94LWx6eApjb20gYXBwbGljYXRpb24veC1tc2Rvcy1wcm9ncmFtCmV4ZSBhcHBsaWNhdGlvbi94LW1zZG9zLXByb2dyYW0KYmF0IGFwcGxpY2F0aW9uL3gtbXNkb3MtcHJvZ3JhbQpkbGwgYXBwbGljYXRpb24veC1tc2Rvcy1wcm9ncmFtCm1zaSBhcHBsaWNhdGlvbi94LW1zaQpwYWMgYXBwbGljYXRpb24veC1ucy1wcm94eS1hdXRvY29uZmlnCm9nZyBhcHBsaWNhdGlvbi94LW9nZwpzd2YgYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gKc3dmbCBhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaAp0YXIgYXBwbGljYXRpb24veC10YXIKdGV4IHRleHQveC10ZXgKbWFuIGFwcGxpY2F0aW9uL3gtdHJvZmYtbWFuCmNydCBhcHBsaWNhdGlvbi94LXg1MDktY2EtY2VydAphdSBhdWRpby9iYXNpYwpzbmQgYXVkaW8vYmFzaWMKbWlkIGF1ZGlvL21pZGkKbWlkaSBhdWRpby9taWRpCmthciBhdWRpby9taWRpCm1wZ2EgYXVkaW8vbXBlZwptcGVnYSBhdWRpby9tcGVnCm1wMiBhdWRpby9tcGVnCm1wMyBhdWRpby9tcGVnCm0zdSBhdWRpby94LW1wZWd1cmwKcmEgYXVkaW8veC1yZWFsYXVkaW8Kcm0gYXVkaW8veC1wbi1yZWFsYXVkaW8KcmFtIGF1ZGlvL3gtcG4tcmVhbGF1ZGlvCnBscyBhdWRpby94LXNjcGxzCndhdiBhdWRpby94LXdhdgpibXAgaW1hZ2UveC1tcy1ibXAKZ2lmIGltYWdlL2dpZgppY28gaW1hZ2UvaWNvCmllZiBpbWFnZS9pZWYKanBlZyBpbWFnZS9qcGVnCmpwZyBpbWFnZS9qcGVnCmpwZSBpbWFnZS9qcGVnCnBjeCBpbWFnZS9wY3gKcG5nIGltYWdlL3BuZwpzdmcgaW1hZ2Uvc3ZnK3htbApzdmd6IGltYWdlL3N2Zyt4bWwKdGlmZiBpbWFnZS90aWZmCnRpZiBpbWFnZS90aWZmCndibXAgaW1hZ2Uvdm5kLndhcC53Ym1wCnJhcyBpbWFnZS94LWNtdS1yYXN0ZXIKam5nIGltYWdlL3gtam5nCnBubSBpbWFnZS94LXBvcnRhYmxlLWFueW1hcApwYm0gaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAKcGdtIGltYWdlL3gtcG9ydGFibGUtZ3JheW1hcApwcG0gaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAKeGJtIGltYWdlL3gteGJpdG1hcAp4cG0gaW1hZ2UveC14cGl4bWFwCnh3ZCBpbWFnZS94LXh3aW5kb3dkdW1wCndybCB4LXdvcmxkL3gtdnJtbAp2cm1sIHgtd29ybGQveC12cm1sCmNzdiB0ZXh0L2NvbW1hLXNlcGFyYXRlZC12YWx1ZXMKY3NzIHRleHQvY3NzCmh0bSB0ZXh0L2h0bWwKaHRtbCB0ZXh0L2h0bWwKeGh0bWwgdGV4dC9odG1sCmFzYyB0ZXh0L3BsYWluCnR4dCB0ZXh0L3BsYWluCnRleHQgdGV4dC9wbGFpbgpkaWZmIHRleHQvcGxhaW4KcnR4IHRleHQvcmljaHRleHQKdHN2IHRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMKd21sIHRleHQvdm5kLndhcC53bWwKd21scyB0ZXh0L3ZuZC53YXAud21sc2NyaXB0CnhtbCB0ZXh0L3htbAp4c2wgdGV4dC94bWwKZmxpIHZpZGVvL2ZsaQpnbCB2aWRlby9nbAptcGVnIHZpZGVvL21wZWcKbXBnIHZpZGVvL21wZWcKbXBlIHZpZGVvL21wZWcKcXQgdmlkZW8vcXVpY2t0aW1lCm1vdiB2aWRlby9xdWlja3RpbWUKYXNmIHZpZGVvL3gtbXMtYXNmCmFzeCB2aWRlby94LW1zLWFzZgphdmkgdmlkZW8veC1tc3ZpZGVvCmljZSB4LWNvbmZlcmVuY2UveC1jb29sdGFsawp2cm0geC13b3JsZC94LXZybWw=',
'style/disk.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1AUHDgIvgzUxgQAAAjBJREFUeJytlM9rE1EQxz9NtLWSi6Ft1pZicbehiMRAD6JZUGiFhRwEQfAk6kUPXgo5+KMi/gW1Fg9e2kPRQ0SK2NIFjyaNFGvqraZ5EJpD06CkMTHFpPF5qI1Zt4sizmnel5nPm5k3PPhP1vK7sLYwInf9mu8mqqraYv4IWlsYkb2nrgJVALKJp7YEJ3hD+BgdkGr4Me6D6R1BdgFeaPkCfAKqZBMrvEpqGIZhg+1rPrjlFlQqP08ZIENq7onl5uFO2F6aQAghm2EWUH2zgPt7gdTbaENTz8/jbs0DdSjVAEiZ1zFN0wKzgCobH1gXs/gvzgMpYAtINEW0kjJHiUz3o+tlS6UW0LqY5fDxG1BfBD5jM9kKgKIoBINBHFsD2O89BqWkHQKkXk9x99kRBk8eRVVV54r8xuSOs/m1odW3vyHevQQgMt1PIBAgFAqhaZrzq1XziwBk3kebZSLT/SiKgq5rhEIhdF133iMhhNxeCjcSL1+5xuidW/j9foLBILquo2ma46ZbxHg8LmOxGEN9c3R0n0DWy6wkZsh3j2MYRsHn83n3ggC4dp3nL2Zkm7eTs+ELeLwqPfoj+s7szGxg8DQbxeKhe/cfSCGE3AvUmNHU1CS+nl6qNbgdXqCUvITLVUe6DzAxNkZ7GyTexFC6OmxbbQFNjD/ENE3S6TTJ+CrJ+GojqJjP0q4onBsecurMOiMhhCyXy+RyOZaXl8nlcsCvBVQUBY/H89dfyz/ZD84Fy8JJpTM+AAAAAElFTkSuQmCC',
'style/dotdot.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1AUHDyEuS1kcQQAAAlJJREFUeJy9kl9IU2EUwH+zbdd73fTOa+mCdOoqExcVFOSSLKWHwrCnHuqxIBN6XVK9hVQPEUTWWyBSvYigID0EFQqBf0DTyLLplmL+u013tznn5u2lBjZdENR5+77D+X2/c74D/zMa2xr0qntV+ujXYf2vId1DXXqmx6jbn1j1/CZFv9PdvCnM8CdQ8U2HvuYMUKBYkI0CU2NBhOBOHp9/iLvseLI+Ix2ksa1B1+QFChQL2yUJxSpRXeUg27FMTUstTe2epF2KkbfjcDLpfDlAVq4Z07YMDh204yzKxWQy0fV8hqBxHoDA7RUDgPF3SE75JWTHEbS4yheakrnT3kn2OfMRRZFC2y56PP4NEhtAAMru/WDoQzaDXH8XUIAwgVunEEURSZRYX1tMGUMKiNgkGGI/Dx8AmOhupXhdRxIlwuE1lCwlOYLSc/2prQEQDJCIzRFZniWk+liNRskpv4rkfYpZEPg8rnLCdZaSmkZ8vdeB/i2MlkPMeN9h3XsFe/kxIAio+MOfEKVCBgf9NF8oQ/vWiaAcBVo2ByVWY5C9H9lhADoB8KkqViWT98PTuDPzcFhiTA60U3KyY+s9+r44iuKsB80HmgaaRuubt0SjcYZfjXO/ro6IOoQ5tzb9sOPxGJIkQGglefegt4fqwiIe1VeSmBlhLjBLyZm+9N+PtQyCYxAJoS1NE1qa4kWFgJIYY2EkgpjvxlJ8DbiY3sgs7+Hjaw+R0DyCzYW0w42r8jKCzYViP2AAP/As5f0Ner92I6viBoKtotSW55xIqfjX8QPSvc+A1HHT7gAAAABJRU5ErkJggg==',
'style/favicon.ico' => 'AAABAAEAICAAAAAAAACoCAAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAgAQAAAAAAAAAAAAAAAEAAAAAAAAAAAAA4vTCAOvOhAB70H4A5a1KAEy3VADI46YAvo8MAN3d3ACfXwwAtbWwAAx5BACXkowAlHBTAMbGxgD6+vkAhl9BAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgOCgoKCggIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgODAwMDAwMDQwKAAAAAAAAAAAAAAAAAAAAAAAAAAAICgoOCAgPCA4KDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAoKCAgPDw8PDw8ODA0MAAAAAAAAAAAAAAAAAAAAAAAOCggPCA8PDw8PDw8ICg0OAAAAAAAAAAAAAAAAAAAAAAoICAgIDw8PDw8PDw8ODAwAAAAAAAAAAAAAAAAAAAAOCg8IDwgICAgIDw8PDwgMDAAAAAAAAAAAAAAAAAAADgwIDwgPCAgPCA8ICA8PDwoMCAAAAAAAAAAAAAAAAAoHDAgPDwgIDwgICAgIDw8ICg0OAAAAAAAAAAAAAAAKEAkMCA8PDw8IDwgPCAgIDwgKCQ0IAAAAAAAAAAAAChAJCQwPDw8PCA8IDwgPCAgPCAwQEAwAAAAAAAAAAAANCQkJDQ8PDw8PDwgPCAgIDw8ODRAQEAoAAAAAAAAICgkJCQkMDw8PDw8PDw8PCA8ICAwQEBAQDAAAAAAAAAACCQkJCQ0ODw8PDw8PDwgPCAgOEBAQEBAQCAAAAAAAAQ0JCQkJCg4ODg8PCAgIDwgPDgwJCRAQEBAKAAAAAAAGDQkJCQkEDw8IDgoNDQ4IDgoKEAkJEAsQEAwAAAAAAAIJCQkJCQwIDw8PDBANDggIBg0LCwkLEBAJDAAAAAAAAgkJCQcJBAoPDw8KDQwPDw4MCwsLCwkLEAkMAAAAAAAKBwkMDgoLBQwKCAoKCAEODAcLCwsLCQsQCQwAAAAAAAIHDQoMCgoFBQUKDgUCBAcHBwcLCwsJCQkJDAAAAAAABgcJBwwFCg4KDg8CBAIEBAcHBwcLCwsLCwkMAAAAAAABBAkHBQUFAwgBAwMDAgQEBAcHBwsLCwsLCQgAAAAAAAACBwcFBQUDAwMDAwMCAgQEBwcLBwsLCwsNCAAAAAAAAAEHBwUFAwMDBgMDBgYGBAQEBwcLCwsLCQwAAAAAAAAAAQMFBQMDAwYGBgEBBgMCBAcHBwcLCwsECAAAAAAAAAAAAQUFAwMDBgYBAQEGAwUFBQcHBwkLBwoAAAAAAAAAAAAAAQUDAwMGAQEGBgMDAwUHBwkHCQcKAAAAAAAAAAAAAAAABgUDAwYDBgYGAwMFBQcHBwcHBAAAAAAAAAAAAAAAAAAAAQYDAwYGBgMDAwUFBAcHBwIAAAAAAAAAAAAAAAAAAAAAAQYDAgMGAwMDBQUHBwQIAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgIDBAQFAgIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEAAAAAAAAAAAAAAAAAAP/4B///4AP//8AA///AAP//gAB//4AAf/8AAH/+AAA//AAAP/gAAB/wAAAf8AAAD8AAAA/gAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfAAAAHwAAAB8AAAAfgAAAH4AAAD+AAAA/wAAAf+AAAP/wAAH/+AAD//wAB///AB////D//',
'style/file.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1AUHDh0ZgdWqhgAAAPZJREFUeJyt0jESgjAQBdAfh8KextbSnoPYJL2NuYONkgJmOIJHgE6OkFYmnR5BbkC5NojGEIyOW2122DebJcCfgj2SLMsopCGOY0gp2Xs9ej1sNuuP0OmkwTmnqqoszIIWi1XATBplWUIIYWGzgE4nhBAAAM75sI7o/aM8zz9CdV1Da42iKIaaAwHAbheDzkewZDsKzedAkiRWzXs1H+KL0YmI/EjbXrFcuvWJZTOk7PmHmfNyAqGUAftXhKYxL7QnQtrnRL188EujO2rbKwBA3i5DfpMX/zhjkFIKSqnJpiCo67qvEQdqmuYnxIKMMTDG/Az9Le5YqEcLs1eIzgAAAABJRU5ErkJggg==',
'style/folder.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1AUHDhwE+8j3HgAAAY1JREFUeJzNkz9IW1EUxn+XCo9AB6dUx5fBQQQpShMcOhQyubZroYubi+AYh64OQoeCrnX0YbFjoEMRfaWZHDp0yIOACJlj8vLnnNPhmWcSY4yL+MEdLufe7/7u4Tvw3OQGN5X9VTMzVBVVZW79O77vu/suj9WNyZB+7S1aGIY2NVFlf9VWNv4AByPlDX7uLiAiiEhCaoqIsPzpfIh2BsDMIP4CIiNGe7zb/nfn9ePSK4IgoFqtWi6XcynR76+v7c2H99DtcXZ0NBa92+3S6/XSZSQ/Xvp4iu/7bgZAVeG6ydnJCWubFw835OozzO9wuPWSIAhuv6aq0Gjged6YPt1VO4rw5g8QEWq12q2RiEAcJ70CiOOJRq1WC+8GwJyNEAGdTic52Wg8aDTbv/eCEaJBo+vmRKNmM6nfa9Rut6cmgiQ2ziVRcgBRFNnfb2/TsKlqGsLBfX90VBUz48flOvl8nlKp5NJkhmFo5XKZer0+kWZQ2WyWYrFIoVBwQwMZRZH1sadRJpN5/FA/mf4DyGb4kNXbm0QAAAAASUVORK5CYII=',
'style/logout.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsQAAALEAGtI711AAADd0lEQVR42j2TTWucVRiGr+ecM1+ZfEzTjzSC0baiNEq1tWCroEJx5UJE0KUL8R90J+jO7gXRtYJId26KiFQs2rpwUbXQNtXW0MSQkEkymczM+77nPOdxMdE/cMN9Xfct33x4xs6+8DI62ianETmVoBVZI4JhGGTFLEFOWFbIiqaCWI4owhHWdhLh7LlXqE09Qv3A42jRQ8seliosRywnyIpvTuObHcCh5Taxt0IaboLvs9frAjOEXPRws8fBeVyoY6lOtgwYIp7m/NNMLJwntI8gvo4WW5TdP+ndukyq7uB8jb3uCiGnEi37iAvkOCKnghxLTEta82eYXnwTTOnf+5a0t07j0FNMnriAr08Sr3+C7N7F+UDIcYgWPcQ5cizI5ZAcC3xzmvbCi1gcsvbdB6ThJuIDg+WfGPz9I0df+5jpJ19na30ZcZ5gWpHjABE/ZqNjPvXOArXOAt1fPiX2V6lNzXH4pYtYrlj/4SP27n9Pc26R2tQcyAbBNGKpBPHYvhXLCUMQcVS9ZUDJVY/h6g3AsNSn3LpHe+ZxXKgjQDCL5FggLoCNVbMPG8A1JhHJ5HKT3dtfYblEnFHvPIppgeUCJOMsllgqMN3XTcY3p2kdPYWEJq5WQzxIANhDZEjj0HHaj71KtbOEDlcRU4LliGkJIoDDt2boPPMOrfnn2Pr1M8rNW7Tmn8W1JtDhP7TmTjN98j3i7l/s3b+M5R4iiWBa/s8otA/RWXyL1tFT9G59zfDhNVpzpzh47uJ4Y1mxuEPZvUHv9ufE3d9xLiMoIWtJ1pL65BwzJ99gYuE82799yeDBVUwLpk++jfM1+ktfoKNltFon9m6iRRfxGVCwSEArTAsmFs7TPn6B/tIVBg+uUp89QZg6jPgAQCpWGa1dQaQCCnAJJO0Hpf92VOAbU6TBBv2lKzQOLzL7/Pv41iziPKPVq5Qb1xExkIxIRnICqv1DKyFrhcQRWROhdYADp9+lcfAJ4u4KZfcOpgO2b14C2UV8RCRiJCwlLCmWEjkZoaoqghvSX76OZkNEGKz9weDhNeL2XfCKq0WcrxBX7dcZh8SREisjqiE/X1o0HWzgQhNXa4yHiY3f7zLiMr6WcJLARcwSYhG0oiqVnR1jW48RNkdNNB2hv7GC8wFxHjMQwDlDnCEkglMgo3msWyyTkkH7GBMTHf4FzZoY5K8MTx4AAAAASUVORK5CYII=',
'style/page.thtml' => 'PD94bWwgdmVyc2lvbj0iMS4wIj8+CjwhRE9DVFlQRSBodG1sCglQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMS8vRU4iIAoJImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4KPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgo8aGVhZD4KCTx0aXRsZT57dGl0bGV9PC90aXRsZT4KCTxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXtjaGFyc2V0fSIgLz4KCTxsaW5rIHJlbD0iaWNvbiIgaHJlZj0ie2Zhdmljb259IiB0eXBlPSJpbWFnZS9pY28iIC8+Cgk8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9IntmYXZpY29ufSIgLz4KCTxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgk8IS0tCgkJYm9keSwgdGFibGUgeyBjb2xvcjogYmxhY2s7IGJhY2tncm91bmQ6IHdoaXRlOyBmb250LXNpemU6IDhwdDsgZm9udC1mYW1pbHk6IFRhaG9tYSwgQXJpYWwsIEhlbHZldGljYTsgbWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tbGVmdDogMHB4OyBtYXJnaW4tcmlnaHQ6IDBweDsgd2lkdGg6IDEwMCU7IH0KCQlpbnB1dCwgc2VsZWN0IHsgZm9udC1zaXplOiA4cHQ7IH0KCQlhIHsgY29sb3I6IGJsYWNrOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHBhZGRpbmctbGVmdDogM3B4OyBwYWRkaW5nLXJpZ2h0OiAzcHg7IH0KCQlhOmhvdmVyIHsgYmFja2dyb3VuZC1jb2xvcjogIzMxNmFjNTsgY29sb3I6IHdoaXRlOyBwYWRkaW5nLXRvcDogM3B4OyBwYWRkaW5nLWJvdHRvbTogM3B4OyB9CgkJdGggeyB0ZXh0LWFsaWduOiBsZWZ0OyB3aGl0ZS1zcGFjZTogbm93cmFwOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlYWQ4OyBib3JkZXItYm90dG9tOiAzcHggc29saWQgI2Q2ZDJjMjsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZTsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2Q2ZDJjMjsgcGFkZGluZy1sZWZ0OiAxMHB4OyBwYWRkaW5nLXJpZ2h0OiAzcHg7IHBhZGRpbmctdG9wOiAzcHg7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KCQl0aDpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNmYWY4ZjM7IGJvcmRlci1ib3R0b206IDNweCBzb2xpZCAjZmNjMjQ3OyB9CgkJdGggYTpob3ZlciB7IGJhY2tncm91bmQtY29sb3I6ICNmYWY4ZjM7IGNvbG9yOiBibGFjazsgfQoJCXRoLmxhbmd1YWdlIHsgYmFja2dyb3VuZC1jb2xvcjogIzIyNWFkOTsgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkICMzODg4ZTk7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzM4ODhlOTsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IGNvbG9yOiB3aGl0ZTsgfQoJCXRoLmxhbmd1YWdlIGEgeyBjb2xvcjogd2hpdGUgfQoJCXRoLmxhbmd1YWdlIGE6aG92ZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMjI1YWQ5OyB9CgkJdGgudG9vbGJhciB7IGJhY2tncm91bmQtY29sb3I6ICMxMjhiZTY7IGJvcmRlci1ib3R0b206IDNweCBzb2xpZCAjMTliOGYyOyBib3JkZXItbGVmdDogMXB4IHNvbGlkICMxOWI4ZjI7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nLXJpZ2h0OiAxMHB4OyBjb2xvcjogd2hpdGU7IH0KCQl0aC50b29sYmFyIGEgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMTI4YmU2IH0KCQl0ZCB7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHBhZGRpbmctcmlnaHQ6IDEwcHg7IHBhZGRpbmctbGVmdDogNXB4OyBwYWRkaW5nLXRvcDogMHB4OyBwYWRkaW5nLWJvdHRvbTogMHB4OyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB9CgkJdGQub3JkZXItYnkgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OyB9CgkJdGQuY2hlY2tib3gsIHRoLmNoZWNrYm94IHsgd2lkdGg6IDIwcHg7IHRleHQtYWxpZ246IHJpZ2h0OyBwYWRkaW5nLWxlZnQ6IDBweDsgcGFkZGluZy1yaWdodDogMHB4OyB9CgktLT4KCTwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+Cgp7Y29udGVudH0KCjwvYm9keT4KPC9odG1sPg==',
'style/view.thtml' => 'PHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CmZ1bmN0aW9uIHNlbF9hbGwobWFzdGVyX3NlbGVjdCkgewoJd2l0aCAoZG9jdW1lbnQuZF9mb3JtKSB7CgkJZm9yIChpPTA7IGk8ZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKCQkJZWxlID0gZWxlbWVudHNbaV07CgkJCQlpZiAoZWxlLnR5cGU9PSJjaGVja2JveCIpCgkJCQkJZWxlLmNoZWNrZWQgPSBtYXN0ZXJfc2VsZWN0LmNoZWNrZWQ7CgkJfQoJfQp9Cjwvc2NyaXB0PgoKPGZvcm0gZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgYWN0aW9uPSJ7YWN0aW9ufSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJkX2Zvcm0iPgo8dGFibGUgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBib3JkZXI9IjAiPgo8dHI+PHRoIGNsYXNzPSJjaGVja2JveCI+PGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJjaGthbGwiIG9uY2xpY2s9ImphdmFzY3JpcHQ6c2VsX2FsbCh0aGlzKSIgLz48L3RoPgp7aGVhZGVyfQp7bGluZXN9CjwvdGFibGU+CjwvZm9ybT4K',
'style/printer.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1AUHDhQANHy5DwAAArlJREFUeJytkU1PE2EUhZ+ZMtOiZbSNpCQCBaVBClOREhI0GglBGtcmGiM7o3sX/gJW7k1kK5su2LiSSMAQ+Yg1tZI0RokUaaDNtM2MmgklHafjglhBysZ4d/fc+z5vzrnwn0o42Lycfe+4T3nJb2m4RJFTykm8ygk+fv3Gw7tDwnEQgIaDze7uLhevXKKnLwSAKOx/9c3aJJ3+6vT1dRwLOzJ4MbvmuM5FaBD3e6sCP6tQ+fSG27euHQtq+FuwzB1OlyPIAriln7hlkxPSLp4rIWZmZpzu7m5UVT0CPCQsLCw4kiTR09PDysoKHo8H0zTxeDy43e6afa/Xy8jIiFAXFI/Hnd7eXnRdR9M0LMsiHA7T2dmJbdvYto1hGORyORzHwbZtxsbGau9r1nZ2dhgeHkaSJHw+H+VyGVmWyWQymKZJtVrF6/XS3NzM3t4eqVSqfkaFQoHl5WWi0SiyLCPLMgB+vx9BEDAMg7W1NUqlEpq1iZ/W+qDBwUHC4TCrq6tYlkUkEiGbzZLNZjFNE1EUaW1tZWhoiHfFH1TWj7maoih0dXXR1tZGLpdjfn6eQqFAS0sLoVAI0zTRdZ1UKoVjKYiiXf9qc3NzTrFYJBaL4XK5KJfLLC0tkc/nSSaTKIpCe3s7/f39qKpKOp1mdHRUOASamppyfguZTIZoNMr4+DiLi4t8/lzCsjyo6mkGBi6yvr5OMpmkqakJgFgsZgSDQX/N2o07D2rkopbn2ZN7VKQurl5W2cxkKG7ofDl7no6B63QMXAdg8tF9tre3fbWMEokEiUTikOfHN9/iP7OJWX5F+EKV5dcbPH/6nb/LMIw/YU9OTp6Px+Mbuq7XFj4kSlSsEgBSg0Cl4tDY2IjP5zsCOxT21taWfnCgaZpvenoaTdNqWiAQYGJigkAgYBzcDQaD/rr0f6lfbq8VahbV+oAAAAAASUVORK5CYII=',
'style/server.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1AUHCyMCTL66/AAAAnJJREFUeJytlE1PE1EUhp9OP2lL27FtQGwA+QoQxEaIGIMLNyYujNGFP8Ef6MqFRIzRBEwwUA0oFFBKgDLSaad3mJnOzHWBJjSk3ejZ3Nx7c56c8543B/5TBDp9VCpH0jp38aWCXrOoN2wqFZ25OwPM3h6+ktf2UCqVZCAQolYTQJhqtU7T8fGTCfy0imEp1N994OmzeYrzU225ocsX15Usr39HuT6E2neNQnGSQjyC7cGpCXYT6q/ecqbpVzpoA3legMTsffRMDjcOugemCS0PDBvMFshQDKMuuoPCoSi9rsdPG5QAOB6EFHB9EC1oWCBzAwhhdAclEnGSWouzc3A9EA4oCvg+WC40bHCVHs60CnrNGMmovbt/c5XLoLHxQqB1dIImoCrguAnHxsVZFaCZINI3MBoCpBzpWBFAqjcBWo2TtEokCEEFPP9Pm7ZDrinQzxq4nvcSeNMRFIuF6dEcykGIBC+0uhsR9GsaYmOTo/1NEoV4d40AVDVO7IdPWEoe9VpMaMesvC6ztHXEUH6fmVuDLCwWyeXVF11BEslks8qTjEn9QNBoWGxtXWgaTRUYnxrh3oPiFWe3gXZ3T2UmE+T542FUNUitplMqGQwNJdG0Jvn+Psp7gr2dirw5VmiDtU3NNE1arRaqGsRxHDzPI5VSmJ7OE49fWOHc8vj0ceOKRm2geE+Mw8Nf6LqOYTSxLBfXdVHVMNlsjGQyxkH5G3XdQK8Zncc/MtoXWF76LNdWt8n3ZwmGwti2j+NAXzbKzvoq6VSE0YlBLpsROqyRtZUvcuX9Bl9L2xgNgZSSaDTM5MwoC4tFFh/OdVw//xy/AbreHTutN5hZAAAAAElFTkSuQmCC',
'style/workgroup.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1AUHCyo0UsaULAAAAgJJREFUeJytlDtvUlEAgD/uBQryCGITgokoOQNpJC2LGEUmXzHpYDTqYOJQp7r3H7gZJ2P0B+jSwbi03ri4dKCaakxzF700ggYItxSlF8ujcB1IC+VlGj3bOec7X3LOlxz4T8MybnNped3sna/pR7h7AYQQA+ekcSJDksidDlNLRCmdj1KfcKAoCul02uxnreNETdlJbtdFtQyGBPXtBpqmYRjGADtWVGu1SRXBZwdr28RXqIw8MFa0kW3jthSQ7RLHmjuU028JnXBjs9kOJ7p/USaT2WB+fo5IJIIQgpmZBH6/f7RoWKHetwgEAly6PNfZ+6iztLxu9lbcFxmSRGXqJH6fi6oJdSXHyorC1FQMALfbPZRRlNdAT/69Qt/LkK10Cplmg0DpAa8eOjjq9QxlNE07eLVhhZ68eI732lcAXr6psXDu3siK+6L+Qr++vSMej/NZnkWSZB49niU1ouIB0SlXg6i9QqlYJZ/doVBNkUgkiMVieDweivrPAabY+IQQV7qiZ08XzZtXj7Nt1NG+/MZi1vD4bhAKTZBMJi17zO07033Mdfx+R1d05uw07z9k2dysdBatu+h6hq2tSfL5vBkMBi2jmFJpsltNiICQpBJOZwPTrLG6qtBq/cDr9SLL8trfGOj5RnRdX1RV9ZaqqjSbTYQQRKNRwuHwoZh/Hn8AelUdaSkrxgYAAAAASUVORK5CYII=',
'style/down.png' => 'iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAABmJLR0QA6wDqANsTMxObAAAACXBIWXMAAAsQAAALEAGtI711AAAAB3RJTUUH1AUHCyYmDcqqaAAAADhJREFUeJxjYKAUrFkx8z82cUZ8CkMi0hlxKsZmIrIGRnwK0TUwElKIrAHZZHwKEc7ApxBdwyAAAB3iGPP2uU9fAAAAAElFTkSuQmCC',
'style/up.png' => 'iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAYAAACprHcmAAAABmJLR0QA6wDqANsTMxObAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAAB3RJTUUH1AUHCyYQwnA/8QAAAEhJREFUeJxjYCABMDIwMDCsWTHzPyGFIRHpjIwwDj4NIRHpjMgmw8SxaWCEamBANhmbBrhCOAeHBhSFGIrRNKAoxAmQNQxCAABCrxj04y1lDgAAAABJRU5ErkJggg==',
'style/rename.png' => 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH1QEcDB4AdNMgEAAAAe9JREFUOI2tk01IFHEYxn+zM7vKmvshuCghaVuHIPpYlHIPIZQQVAgRxOYWoplCW0JEx/DQJYIgMPTSB2i3KKKLuUF1SetUeIgObrGHwAppG2dlZ2bn32HZdaeYZRZ6jg8PP573ff9/+E+S3IQSZxJiR3QnkfYo3QcP8erFU0KhIJbUQGo86YoBwK2bN0QuVxCLix/F2NhFsbS0IrJZIQ73HxfljOIGFG7bw9nhEeI93UxOTnFpIsH3tQKBlo5KRgFIDo0LRwrwMv2cgm6gaTkymQyrP/N0bOvEI3ROJq+IJ3O3pUqj2QfTjiBdN1DXNe5OzWAYEAgGeHT/DqcSwxTlpn9Hkw88c4QV3w0AYBigyHIpL8sYlgWAp9ZIf8sSJZDHUzqUBJR3UhdICDDNKqPq8PWBLGEHVanuRoZh9ySpVMu27PJCnWSaRUwTNC1f8RRF2QTNPZyRfuv+mm8JoLO1CV2HL9lvDAxeRaKZQPMWe6PLqVRNyEZe5f2bBcBLe6SVvbt3sW9/jJZwmNnp65ugI/Htjp/vwvmU8DV20ds7gs8XJt5zjs8f5lGsdfqPnY7aGtXS2q8f9PWNsrz8mKJYxShsJRa7xkJ6An+obQWQXIGOnhhkPn0PS2rA6/Xib/zKp7evCUa6UFXVDcK9/gBonqZcTQIbiwAAAABJRU5ErkJggg==',
);
var $strings = array (
'es' => array(
'Red Windows',
'Nombre',
'Tamaño',
'Comentarios',
'Modificado',
'Tipo',
'd/m/Y H:i',
'Imprimir un archivo',
'Borrar elementos seleccionados',
'Nuevo archivo (subir)',
'Cancelar trabajos seleccionados',
'Carpeta',
'Archivo %s',
'Enviar un mensaje',
'Subir',
'Nueva carpeta',
'Descargar esta carpeta',
'Desconectar'
),
'no' => array('Windowsnettverk','Navn','Størrelse','Kommentar','Endret','','d-m-Y h:i','Utskrift','Slett valgte','Ny fil','Avbryt valgte','Filmappe','Fil %s','Send popup-melding','Opp','Ny mappe'),
'eu' => array('Windows Sarea','Izena','Tamaina','Komentarioak','Aldatua','','Y/m/d h:i','Inprimatu','Ezabatu aukeratuak','Fitxategi berria','Ezeztatu hautespena','','','','',''),
'fr' => array(
'Réseau Windows',
'Nom',
'Taille',
'Commentaire',
'Modifié',
'Type',
'd/m/Y h:i',
'Imprimer',
'Effacer la sélection',
'Nouveau fichier (envoi)',
'Annuler la sélection',
'Dossier',
'Fichier %s',
'Envoyer un message popup',
'Remonter',
'Nouveau dossier',
'Télécharger ce dossier',
'Déconnexion',
'Renommer la sélection'
),
'gl' => array('Rede Windows','Nome','Tamaño','Comentarios','Modificado','Tipo','d/m/Y h:i','Imprimir un arquivo','Borrar elementos seleccionados','Novo arquivo (subir)','Cancelar traballos seleccionados','Carpeta','Arquivo %s','Enviar unha mensaxe','Subir','Nova carpeta'),
'el' => array('Δίκτυο Windows','Όνομα','Μέγεθος','Σχόλια','Τροποποιήθηκε','Τύπος','m/d/Y h:i','Εκτύπωση','Διαγραφή Επιλεγμένων','Νέο Αρχείο','Ακύρωση Επιλεγμένων','Φάκελος Αρχείων','Αρχείο %s','Αποστολή μηνύματος','Επάνω','Νέος Φάκελος'),
'it' => array('Rete Windows','Nome','Dimensione','Commenti','Modificato','Tipo','d/m/Y h:i','Stampa un file','Rimuovi l\'oggetto selezionato','Nuovo file (upload)','Cancella l\'oggetto selezionato','Cartella','','Manda un messaggio popup','Su','Nuova cartella'),
'pl' => array(
'Sieć Windows',
'Nazwa',
'Rozmiar',
'Komentarz',
'Zmodyfikowany',
'Typ','d/m/Y h:i',
'Drukuj',
'Usuń zaznaczone',
'Nowy plik',
'Anuluj zaznaczone',
'Katalog',
'Plik %s',
'Wyślij wiadomość',
'Powrót',
'Nowy katalog',
'Sciagnij ten plik'
),
'ro' => array('Reteaua Windows','Nume','Marime','Comentarii','Modificat','Tip','m/d/Y h:i','Print','Sterge selectia','Fisier Nou','Renunta','Fisier Director','Fisier %s','Trimite mesaj popup','Sus','Director nou'),
'nl' => array('Windows Netwerk','Naam','Grootte','Commentaar','Gewijzigd','Soort','d/m/Y h:i','Afdrukken','Selectie verwijderen','Nieuw bestand','Selectie afbreken','Bestandsmap','Bestand %s','Stuur een popup bericht','Omhoog','Nieuwe map'),
'cs' => array('Síť Windows','Název','Velikost','Poznámka','Změněno','Typ','měsíc/den/rok hodina:minuta','Tisk','Smazat vybrané','Nový soubor (nahrát)','Zrušit výber','Nový adresář','Soubor %s','Poslat zprávu','Nahoru','Nový adresář'),
'da' => array('Windows Netværk','Navn','Størelse','Kommentar','Sidst ændret','Type','d.m.Y t:i','Print fil','Slet valgte emner','Ny fil (upload)','Afbryd valgte job','Fil mappe','File %s','Send popup besked','Up','Ny mappe'),
'sv' => array('Windows Nätverk','Namn','Storlek','Kommentar','Ändrad','Typ','Y/m/d H:i','Skriv ut','Ta bort markerad','Ny fil','Avbryt markerad','Filkatalog','Fil %s','Skicka ett popup-meddelande','Upp','Ny katalog'),
'de' => array(
'Windows Netzwerk',
'Name',
'Größe',
'Bemerkung',
'Geändert',
'Typ',
'd.m.Y H:i',
'Datei drucken',
'Markierte Datei(en) löschen',
'Neue Datei (hochladen)',
'Abbruch der ausgewählten Aktion',
'Dateiordner',
'Datei %s',
'Nachricht senden',
'Aufwärts',
'Neuer Ordner',
'Dieser Ordner herunterladen',
'Abmelden',
'Markierte Datei(en) umbenennen'
),
'ja' => array('ネットワーク','名前','サイズ','コメント','更新日時','タイプ','Y/m/d H:i','プリント','選択したものを削除','新規作成','選択したものをキャンセル','','','ポップアップメッセージの送信','','新規フォルダ'),
'tr' => array('Windows Ağı','İsim','Boyut','Yorumlar','Değiştirilme Tarihi','Tip','m/d/Y h:i','Yazdır','Seçimi sil','Yeni dosya','Seçim İptal','Dosya Dizini','Dosya boyu','Uyari iletisi gonder','Yukari','Yeni dizin'),
'ca' => array('Xarxa Windows','Nom','Tamany','Comentaris','Modificat','Tipus','','Imprimeix','Esborra els seleccionats','Nou arxiu','Cancel·la selecció','Carpeta','Fitxer %s','Enviar un missatge','Pujar','Nova carpeta'),
'eo' => array('Reto de Windows','Nomo','Grandeco','komentaroj','Modifii','','','Presi','','Nova dosiero','Nuligi','','','','',''),
'et' => array('Windowsi võrk','Nimi','Suurus','Kommentaarid','Muudetud','','d/m/Y h:i','Trüki','Kustuta valitud','Uus fail','Tühista valitud','Kataloog','Fail %s','Saada popup teade','Üles','Uus kataloog'),
'uk' => array('Мережа Віндовз','Ім\'я','Розмір','Коментарі','Змінений','','d.m.Y h:i','Друкувати','Видалити відмічене','Новий файл','Відмінити відмічене','','','','',''),
'bg' => array('Уиндоус мрежа','Име','Размер','Коментар','Промяна','Тип','м/д/г Ч:мин','Печат','Изтрий избраните','Нов файл','Откажи избор','Папка','Файл %','Изпрати съобщение','Нагоре','Нова папка'),
'sr' => array('Windows mreža','Ime','veličina','komentari','promenjen','tip','d/m/Y h:i','Odštampaj','Obriši selektovano','Nova datoteka','Odustajem od izabranog','Direktorijum','','Pošalji poruku','Nazad','Novi direktorijum'),
'hr' => array('Windows mreža','Naziv','Veličina','Komentar','Modificirano','','','Ispiši','Obriši selektirano','Nova datoteka','','','','','',''),
'lv' => array('Windows Tīkls','Nosaukums','Izmērs','Komentāri','Izmainīts','','m/d/g s:m','Drukāt','Dzēst izvēlētos','Jauns fails','Atcelt izvēlētos','','','','',''),
'fi' => array('Windows Verkko','Nimi','Koko','Kommentit','Muokattu','Tyyppi','p/k/v t:m','Tulosta','Poista valitut','Uusi tiedosto','Peruuta valinta','Tiedosto kansio','Tiedosto %s','Lähetä popup viesti','Ylös','Uusi kansio'),
'hu' => array('Windows hálózat','Név','Méret','Megjegyzés','Módosítva','Típus','h/n/É ó:p','Nyomtat','Kiválasztottak törlése','Új állomány','Kijelölés elvetése','Mappa','Fájl','Előugró üzenet küldése','Fel','Új mappa'),
'pt-br' => array('Rede Windows','Nome','Tamanho','Comentários','Modificado','Tipo','d/m/Y h:i','Imprimir','Apagar selecionados','Novo arquivo','Cancelar Seleção','Pasta de arquivo','Arquivo %s','Enviar Mensagem','Acima','Nova Pasta'),
'th' => array('Samba Server','ชื่อ','ขนาด','หมายเหตุ','ปรับปรุงล่าสุด','ชนิด','เดือน/วัน/ปี ชั่วโมง','พิมพ์ File','ลบสิ่งที่เลือกไว้','ส่ง File เข้าไปเก็บ','ยกเลิกสิ่งที่เลือกไว้','','','ส่งข้อความ Popup','กลับไปก่อนหน้า','สร้าง Folder ใหม่'),
'zh-tw' => array('視窗網路','名稱','大小','說明','修正','型式','','檔案列印','刪除選項','新檔案(上傳)','取消所選的工作','檔案資料夾','檔案%s','傳送訊息','上一頁','新資料夾'),
'sl' => array('Windows Omrežje','Ime','Velikost','Komentarji','Sprememba','Tip','m/d/y H:i','Natisni','Izbriši izbrano','Nova datoteka','Prekliči izbrano','Mapa','Datoteka %s','Pošlji sporočilo','Gor','Nova mapa'),
'id' => array('Jaringan Windows','Nama','Ukuran','Komentar','Terakhir diubah','Tipe','bulan/tanggal/tahun Jam:menit','Cetak file ini','Hapus item yang dipilih','File baru ( upload )','Batalkan pekerjaan yang dipilih','File dalam folder','','Kirim pesan popup','Naik','Folder baru'),
'lt' => array('Windows Tinklas','Vardas','Dydis','Komentarai','Pakeista','Tipas','m/d/Y H:i','Spausdinti bylą','Trinti parinktus','Įkelti bylą','Nutraukti parinktas užduotis','Katalogas','Byla %s','Siųsti žinutę','Aukštyn','Naujas katalogas'),
'pt' => array('rede windows','Nome','Tamanho','Comentario','Modificado','Tipo','d/m/Y h:i','Imprimir Ficheiro','Apagar a Selecção','Novo Ficheiro','Cancelar a Selecção','Ficheiro','Ficheiro %s','Enviar uma mensagem Instantanea','Para Cima','Nova Pasta'),
'sk' => array('Sieť Windows','Meno','Veľkosť','Poznámky','Zmenené','Typ','m/d/Y H:i','Vytlačiť súbor','Vymazať vybrané položky','Nový súbor (upload)','Zrušiť vybrané úlohy','Adresár','Súbor %s','Poslať popup správu','Hore','Nový adresár'),
'zh' => array('Windows 网络','姓名','大小','注释','修改','类型','月/日/年 时:分','打印一个文件','删除选择项目','新建文件(上传)','取消选择对象','文件夹','文件','发送一个弹出消息','向上','新建文件夹'),
'ru' => array('Сеть Windows','Название','Размер','Комментарии','Изменен','Тип','d/m/Y H:i','Печать','Удалить выделенные','Новый файл (поместить)','Отменить','Папка файла','Файл %s','Послать сообщение','Вверх','Новая папка'),
'en' => array(
'Windows Network',
'Name',
'Size',
'Comments',
'Modified',
'Type',
'm/d/Y H:i',
'Print a file',
'Delete selected items',
'New file (upload)',
'Cancel selected jobs',
'File Folder',
'File %s',
'Send a popup message',
'Up',
'New folder',
'Download this folder',
'Logout',
'Rename selected items'
),
);
# constructor
function smbwebclient ()
{
$this->InitSession ();
$this->InitLanguage();
if (isset($_GET['O'])) {
$_SESSION['swcOrder'] = $_GET['O'];
unset($_GET['O']);
}
$this->debug = $this->cfgLogLevel;
$this->order = @$_SESSION['swcOrder'];
# load MIME types
foreach (preg_split('/\n/',$this->GetInlineFile('data/mime.types')) as $line) {
$a = preg_split('/ /', $line);
$this->mimeTypes[$a[0]] = $a[1];
}
}
function Run ()
{
$this->where = $path = stripslashes(@$_REQUEST['path']);
if (isset($this->inlineFiles[$path])) {
$this->DumpInlineFile($path);
exit;
}
$this->Go(preg_replace('/\/$/','',preg_replace('/^\//','',$this->cfgSambaRoot.'/'.$path)));
$this->GetCachedAuth();
if (isset($_REQUEST['action'])) {
if (preg_match('/^UpAction([0-9]+)$/', $_REQUEST['action'], $regs)) {
$this->UpAction($regs[1]);
} elseif (method_exists($this, $_REQUEST['action'])) {
$action = $_REQUEST['action'];
$this->$action ();
}
}
$this->Debug($path);
switch ($this->Browse()) {
case '': break;
case 'ACCESS_DENIED':
case 'LOGON_FAILURE':
$this->CleanCachedAuth();
header('Location: '.$this->GetUrl($path, 'auth', '1'));
exit;
default:
$this->ErrorMessage($this->status);
header('Location: '.$this->FromPath('..'));
exit;
}
$this->View ();
}
function InitSession ()
{
set_time_limit(1200);
error_reporting(E_ALL ^ E_NOTICE);
openlog("smbwebclient", LOG_ODELAY | LOG_PID, $this->cfgFacility);
if ($this->cfgSessionName <> '') session_name($this->cfgSessionName);
session_start();
}
function InitLanguage ()
{
# load languages
foreach (preg_split('/\n/',$this->GetInlineFile('data/languages.csv')) as $line) {
$a = preg_split('/;/', $line);
$this->languages[$a[0]] = $a[1];
}
# default language
$this->lang = $this->cfgDefaultLanguage;
$langOK = false;
# param from GET
if (isset($_REQUEST['lang']) AND isset($this->strings[$_REQUEST['lang']])) {
$this->lang = $_REQUEST['lang'];
$langOK = true;
# current session
} elseif (isset($_SESSION['swcLanguage']) AND isset($this->strings[$_SESSION['swcLanguage']])) {
$this->lang = $_SESSION['swcLanguage'];
} else {
# take a look at HTTP_ACCEPT_LANGUAGE
foreach (preg_split('/,/', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang)
foreach ($this->languages as $key => $filter)
if (isset($this->strings[$key]) AND preg_match('/^('.$filter.')(;q=[0-9]\\.[0-9])?$/i', $lang)) {
$this->lang = $key;
$langOK = true;
}
# look at HTTP_USER_AGENT
if (! $langOK) {
reset($this->languages);
foreach ($this->languages as $key => $filter)
if (isset($this->strings[$key])
AND preg_match('/(\(|\[|;[[:space:]])(' . $filter . ')(;|\]|\))/i', $_SERVER['HTTP_USER_AGENT'])) {
$this->lang = $key;
$langOK = true;
}
}
}
if ($langOK) $_SESSION['swcLanguage'] = $this->lang;
}
# returns a string in a given language
function _($str)
{
# for english, all is done !
if ($this->lang == 'en') return $str;
# search string at english list (get position)
$pos = array_search ($str, $this->strings['en']);
if (($pos = array_search ($str, $this->strings['en'])) === FALSE)
return $str;
# found position at current language (ok!)
if ($this->strings[$this->lang][$pos] <> '')
return $this->strings[$this->lang][$pos];
# found position at default language (better than nothing!)
if ($this->strings[$this->cfgDefaultLanguage][$pos] <> '')
return $this->strings[$this->cfgDefaultLanguage][$pos];
# well, I cannot do anything better !
return $str;
}
function DumpFile($file='', $name='', $isAttachment=false, $isCacheable=false)
{
if ($name == '') $name = basename($file);
$pi = pathinfo(strtolower($name));
$mimeType = @$this->mimeTypes[@$pi['extension']];
if ($mimeType == '') $mimeType = 'application/octet-stream';
# dot bug with IE
if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) {
$name = preg_replace('/\./','%2e', $name, substr_count($name, '.') - 1);
}
header("Cache-control: ".($isCacheable ? "public" : "private"));
header("Pragma: public");
header('MIME-Version: 1.0');
header("Content-Type: $mimeType; name =\"".$name."\"");
if ($isAttachment)
header("Content-Disposition: attachment; filename=\"".$name."\"");
else
header("Content-Disposition: filename=\"".$name."\"");
if ($file <> '' AND is_readable($file)) {
$fp = fopen($file, "r");
while (! feof($fp)) {
print fread($fp,65536);
flush();
}
fclose($fp);
}
}
function GetInlineFile ($file)
{
if (! $this->cfgInlineFiles) {
# if does not exists, write from inline file ! (devel)
if (! is_readable($file)) {
$f = fopen($file, 'wb');
fwrite($f, base64_decode($this->inlineFiles[$file]));
fclose($f);
}
$f = fopen($file, 'r');
$data = fread ($f, filesize($file));
fclose ($f);
} else {
if (isset($_SESSION['swcUncodedInlineFiles'][$file])) {
$data = $_SESSION['swcUncodedInlineFiles'][$file];
} else {
$data = base64_decode($this->inlineFiles[$file]);
$_SESSION['swcUncodedInlineFiles'][$file] = $data;
}
}
return $data;
}
function DumpInlineFile ($file)
{
$this->DumpFile('',$file,false,true);
print $this->GetInlineFile ($file);
}
function GetIP()
{
foreach (array('HTTP_X_FORWARDED','HTTP_VIA','REMOTE_ADDR') as $var) {
if (isset($_SERVER[$var])) return $_SERVER[$var];
}
return 'unknown';
}
# debugging messages
function Debug ($message, $level=0)
{
if ($level <= $this->debug) {
foreach (preg_split('/\n/',$message) as $line) {
syslog(LOG_INFO, $this->user.'['.$this->GetIP().']: '.$line);
}
}
}
# HTML page
function Page ($title='', $content='')
{
if (@$_SESSION['swcErrorMessage'] <> '') {
$content .= "\n<script language=\"Javascript\">alert(\"{$_SESSION['swcErrorMessage']}\")</script>\n";
$_SESSION['swcErrorMessage'] = '';
}
return $this->Template('style/page.thtml', array(
'{title}' => $title,
'{charset}' => $this->cfgDefaultCharset,
'{content}' => $content,
'{style}' => $this->GetUrl('style/'),
'{favicon}' => $this->GetUrl('style/favicon.ico')
));
}
# loads an HTML template
function Template ($file, $vars=array())
{
return str_replace(array_keys($vars), array_values($vars), $this->GetInlineFile($file));
}
# HTML a href
function Link ($title, $url='', $name='')
{
if ($name <> '') $name = "name = \"{$name}\"";
return ($url == '') ? $title : "<a href=\"{$url}\" {$name}>{$title}</a>";
}
# HTML img
function Image ($url, $alt='', $extra='')
{
return ($url == '') ? $title : "<img src=\"{$url}\" alt=\"{$alt}\" border=\"0\" {$extra} />";
}
# HTML select (combo)
function Select ($name, $value, $options)
{
$html = "<select name=\"{$name}\">\n";
foreach ($options as $key => $description) {
$selected = ($key == $value) ? "selected" : "";
$html .= "<option value=\"{$key}\" $selected>{$description}</option>\n";
}
$html .= "</select>\n";
return $html;
}
# HTML check box
function CheckBox ($name, $value, $checked = false)
{
return $this->Input($name, $value, 'checkbox', $checked ? "checked" : "");
}
function Input ($name, $value = '', $type = 'text', $extra = '')
{
return "<input type=\"{$type}\" name=\"{$name}\" value=\"".htmlentities($value, ENT_COMPAT, $this->cfgDefaultCharset)."\" {$extra}/>";
}
# return an URL (adding a param)
function GetUrl ($path='', $arg='', $val='')
{
$get = $_GET;
$get['path'] = $path;
# delete switches from URL
$get['lang'] = $get['auth'] = '';
if ($arg <> '') {
if (! is_array($arg)) $get[$arg] = $val;
else foreach ($arg as $key=>$value) $get[$key] = $value;
}
# build query string
$query = array();
foreach ($get as $key=>$value) if ($value <> '') {
if ($this->cfgModRewrite <> true OR $key <> 'path') {
$query[] = urlencode($key).'='.urlencode($value);
}
}
if (($query = join('&',$query)) <> '') $query = '?'.$query;
if ($this->cfgModRewrite) {
return $this->cfgBaseUrl.str_replace('%2F','/',urlencode($get['path'])).$query;
} else {
return $_SERVER['PHP_SELF'].$query;
}
}
function ErrorMessage ($msg)
{
$_SESSION['swcErrorMessage'] = @$_SESSION['swcErrorMessage'] . $msg;
}
function CleanCachedAuth ()
{
$mode = $this->type;
@$_SESSION['swcCachedAuth'][$mode][$this->$mode] = '';
}
function GetAuth ($command)
{
$fn = $this->cfgUserAuth;
return $this->$fn($command);
}
# basic auth
function BasicAuth ($command = 'get')
{
switch ($command) {
case 'get':
if (@$_GET['auth'] == 1 OR ($this->cfgAnonymous <> true AND !isset($_SERVER['PHP_AUTH_USER']))) {
$_SESSION['swcAuthSubmit'] = true;
$time = date("h:i:s");
$path = $this->PrintablePath();
header("WWW-Authenticate: Basic realm=\"{$path} ($time)\"");
header("HTTP/1.0 401 Unauthorized");
print $this->Page('unauthorized');
exit;
}
$this->user = stripslashes(@$_SERVER['PHP_AUTH_USER']);
$this->pw = stripslashes(@$_SERVER['PHP_AUTH_PW']);
break;
case 'submit':
if (@$_SESSION['swcAuthSubmit']) {
$_SESSION['swcAuthSubmit'] = false;
$this->user = stripslashes(@$_SERVER['PHP_AUTH_USER']);
$this->pw = stripslashes(@$_SERVER['PHP_AUTH_PW']);
return true;
}
return false;
}
}
# form auth
function FormAuth ($command = 'get')
{
switch ($command) {
case 'get':
if (@$_GET['auth'] == 1 OR ($this->cfgAnonymous <> true AND !isset($_SESSION['swcUser']))) {
$time = date("h:i:s");
$path = $this->PrintablePath();
$action = $this->GetUrl($this->where);
$page = $this->Page('unauthorized',
"<p>{$path}</p><p class=\"authform\"><form name=\"authForm\" method=\"post\" action=\"{$action}\">".
$this->Input('swcUser', $_SESSION['swcUser']).'<br />'.
$this->Input('swcPw', '', 'password').'<br />'.
$this->Input('swcSubmit',$this->_('Ok'),'submit').
"</form></p>");
$page = str_replace("<body>", "<body onload=\"document.authForm.swcUser.focus()\">", $page);
print $page;
exit;
}
$this->user = @$_SESSION['swcUser'];
$this->pw = @$_SESSION['swcPw'];
break;
case 'submit':
if (isset($_POST['swcSubmit'])) {
$this->user = @$_POST['swcUser'];
$this->pw = @$_POST['swcPw'];
$_SESSION['swcUser'] = $this->user;
$_SESSION['swcPw'] = $this->pw;
return true;
}
return false;
}
}
function GetCachedAuth ()
{
$this->user = $this->pw = '';
$nextLevel = array('network'=>'','workgroup'=>'network','server'=>'workgroup','share'=>'server');
if ($this->GetAuth('submit')) {
# store auth in cache
$mode = $this->type;
$_SESSION['swcCachedAuth'][$mode][$this->$mode]['User'] = $this->user;
$_SESSION['swcCachedAuth'][$mode][$this->$mode]['Password'] = $this->pw;
for ($mode = $nextLevel[$mode]; $mode <> ''; $mode = $nextLevel[$mode]) {
if (! isset($_SESSION['swcCachedAuth'][$mode][$this->$mode])) {
$_SESSION['swcCachedAuth'][$mode][$this->$mode]['User'] = $this->user;
$_SESSION['swcCachedAuth'][$mode][$this->$mode]['Password'] = $this->pw;
}
}
} elseif (@$_GET['auth'] <> 1) {
# get auth from cache
for ($mode = $this->type; $mode <> ''; $mode = $nextLevel[$mode]) {
if (isset($_SESSION['swcCachedAuth'][$mode][$this->$mode])) {
$this->user = $_SESSION['swcCachedAuth'][$mode][$this->$mode]['User'];
$this->pw = $_SESSION['swcCachedAuth'][$mode][$this->$mode]['Password'];
break;
}
}
if ($this->user == '') $this->GetAuth('get');
} else $this->GetAuth('get');
}
function View ()
{
$selected = (is_array(@$_POST['selected'])) ? $_POST['selected'] : array();
switch ($this->type) {
case 'file': exit;
case 'network':
case 'workgroup':
case 'server':
$headers = array ('Name' => 'N', 'Comments' => 'C');
break;
case 'printer':
$headers = array ('Name' => 'N', 'Size' => 'S');
break;
default:
$headers = array ('Name' => 'N', 'Size' => 'S', 'Type' => 'T', 'Modified' => 'D');
}
$icons = array ('A' => 'up', 'D' => 'down');
foreach ($headers as $title => $order) {
if ($this->order[0] == $order) {
$ad = ($this->order[1] == 'A') ? 'D' : 'A';
$icon = $this->Icon($icons[$ad],'',11);
$style[$title] = 'class="order-by"';
} else {
$ad = 'A';
$icon = '';
$style[$title] = '';
}
$url = $this->GetUrl($this->where, 'O', $order.$ad);
$header .= "<th>".$this->Link($this->_($title), $url).' '.$icon."</th>";
}
$lang = $this->Link(strtoupper($this->lang),$this->GetUrl($this->where,'action','ChangeLanguageInput'));
$time = date("H:i");
$logout = $this->Icon('logout', $this->GetUrl($this->where, 'auth', '1'));
$header .= "<th width=\"100%\"> </th><th class=\"language\">{$lang}</th><th class=\"toolbar\"><nobr>{$logout} {$time}</nobr></th></tr>";
$lines = $this->ViewForm ($this->type, $style, $headers);
foreach ($this->results as $file => $data) {
if ($this->cfgHideDotFiles AND $file[0] == '.') continue;
if ($data['type']=='file' OR $data['type']=='printjob') {
$size = $this->PrintableBytes($data['size']);
$pi = pathinfo(strtolower($file));
if (@$this->mimeTypes[$pi['extension']] <> '') {
$type = sprintf($this->_("File %s"), strtoupper($pi['extension']));
} else {
$type = '';
}
} else {
$size = '';
$type = $this->_("File Folder");
}
$modified = date($this->_("m/d/Y h:i"), @$data['time']);
$check = $this->CheckBox("selected[]", ($data['type'] <> 'printjob') ? $file : $data['id'], in_array($file, $selected));
$icon = $this->Icon($data['type']);
$comment = @$data['comment'];
if ($data['type'] <> 'printjob') {
$filelink = $this->Link(htmlentities($file, ENT_COMPAT, $this->cfgDefaultCharset), $this->FromPath($file));
}
$lines .= "<tr>".
"<td class=\"checkbox\">{$check}</td>".
"<td {$style['Name']}><nobr>{$icon} {$filelink}</nobr></td>".
(isset($headers['Size']) ? "<td {$style['Size']} align=\"right\"><nobr>{$size}</nobr></td>" : "").
(isset($headers['Type']) ? "<td {$style['Type']}><nobr>{$type}</nobr></td>" : "").
(isset($headers['Comments']) ? "<td {$style['Comments']}><nobr>{$comment}</nobr></td>" : "").
(isset($headers['Modified']) ? "<td {$style['Modified']}><nobr>{$modified}</nobr></td>" : "").
"<td width=\"100%\" colspan=\"3\">{$renamelink}</td>".
"</tr>\n";
}
$macros['{action}'] = $this->GetUrl($this->where);
$macros['{ok}'] = $this->_("Ok");
$macros['{header}'] = $header;
$macros['{lines}'] = $lines;
print $this->Page($this->name, $this->Template("style/view.thtml", $macros));
}
function ViewForm ($type, $style, $headers)
{
$icon = $this->Icon('dotdot');
$amenu = array();
$html = $widget = '';
$where = $this->_DirectoryName($this->where);
$n = 0;
while ($where <> '') {
$amenu['UpAction'.$n] = $where;
$where = $this->_DirectoryName($where);
$n++;
}
if ($this->where <> '') {
$amenu['UpAction'.$n] = $this->_("Windows Network");
}
if (isset($amenu['UpAction0'])) {
$amenu['UpAction0'] .= ' ('.$this->_("Up").')';
}
switch ($type) {
case 'network':
case 'server': break;
case 'printer':
switch (@$_REQUEST['action']) {
case 'PrintFileInput':
$amenu = array();
$icon = $this->Icon('file');
$widget = $this->Input("action", "PrintFileAction", "hidden").
$this->Input("file","", "file").
$this->Input('ok', $this->_("Ok"), 'submit').
' (max. '.ini_get('post_max_size').')';
break;
default:
if (count($amenu) > 0) $amenu['--'] = '--';
$amenu['PrintFileInput'] = $this->_("Print a file");
$amenu['CancelSelectedAction'] = $this->_("Cancel selected jobs");
}
break;
case 'share':
switch (@$_REQUEST['action']) {
case 'NewFolderInput':
$amenu = array();
$icon = $this->Icon('folder');
$widget = $this->Input("action", "NewFolderAction", "hidden").
$this->Input("folder","").
$this->Input('ok', $this->_("Ok"), 'submit');
break;
case 'NewFileInput':
$amenu = array();
$icon = $this->Icon('file');
$widget = $this->Input("action", "NewFileAction", "hidden").
$this->Input("file","", "file").
$this->Input('ok', $this->_("Ok"), 'submit').
' (max. '.ini_get('post_max_size').')';
break;
case 'RenameSelectedInput':
if (is_array(@$_POST['selected'])) {
$amenu = array();
$icon = $this->Icon('rename');
$widget = '';
$i = 0;
foreach ($_POST['selected'] as $file) {
$widgets[] .= $icon.' '.$this->Input("oldname[{$i}]", $file, "hidden").
$this->Input("renameto[{$i}]",$file);
$i++;
}
$widget .= join("<br />", $widgets).$this->Input('ok', $this->_("Ok"), 'submit');
$widget .= $this->Input("action", "RenameSelectedAction", "hidden");
$icon = '';
break;
}
default:
if (count($amenu) > 0) $amenu['--'] = '--';
$amenu['NewFolderInput'] = $this->_("New folder");
$amenu['NewFileInput'] = $this->_("New file (upload)");
$amenu['DeleteSelectedAction'] = $this->_("Delete selected items");
$amenu['RenameSelectedInput'] = $this->_("Rename selected items");
$amenu['DownloadFolderAction'] = $this->_("Download this folder")." (".$this->cfgArchiver.")";
}
break;
case 'workgroup':
if (@$_REQUEST['action'] == 'SendMessageInput') {
$amenu = array();
$icon = $this->Icon('file');
$widget = $this->Input("action", "SendMessageAction", "hidden").
$this->Input("message","").
$this->Input('ok', $this->_("Ok"), 'submit');
} else {
if (count($amenu) > 0) $amenu['--'] = '--';
$amenu['SendMessageInput'] = $this->_("Send a popup message");
}
break;
default: print $type;
}
if (@$_REQUEST['action'] == 'ChangeLanguageInput') {
$amenu = array();
foreach (array_keys($this->strings) as $lang) $amenu[$lang] = strtoupper($lang);
$widget = $this->Select("lang", "", $amenu) . $this->Input('ok', $this->_("Ok"), 'submit');
$_GET['action'] = '';
} elseif (count($amenu)) {
$amenu['---'] = '--';
$amenu['LogoutAction'] = $this->_("Logout");
$widget = $this->Select("action", "", $amenu) . $this->Input('ok', $this->_("Ok"), 'submit');
}
if ($widget <> '') {
$html = "<tr>".
"<td> </td>".
"<td {$style['Name']}><nobr>{$icon} {$widget}</nobr></td>".
(isset($headers['Size']) ? "<td {$style['Size']} align=\"right\"> </td>" : "").
(isset($headers['Type']) ? "<td {$style['Type']}> </td>" : "").
(isset($headers['Comments']) ? "<td {$style['Comments']}> </td>" : "").
(isset($headers['Modified']) ? "<td {$style['Modified']}> </td>" : "").
"<td width=\"100%\" colspan=\"3\"> </td>".
"</tr>\n";
}
return $html;
}
function UpAction ($level=0)
{
$times = $level+1;
for ($i=0, $where = $this->where; $i < $times; $i++) {
$where = $this->_DirectoryName($where);
}
header('Location: '.$this->GetUrl($where));
exit;
}
function LogoutAction ()
{
header('Location: '.$this->GetUrl($this->where, 'auth', '1'));
exit;
}
function SendMessageAction ()
{
if (trim($_POST['message']) <> '' AND is_array($_POST['selected'])) {
foreach ($_POST['selected'] as $server) {
$this->SendMessage($server, $_POST['message']);
$this->Debug('message to "'.$server);
}
}
if ($this->status <> '') $this->ErrorMessage($this->status);
header('Location: '.$this->FromPath('.'));
exit;
}
function NewFolderAction ()
{
if (trim($_POST['folder']) <> '') {
$this->parent = $this->path;
$this->name = $_POST['folder'];
$this->MakeDirectory();
$this->Debug('new folder "'.$this->name.'"');
}
if ($this->status <> '') $this->ErrorMessage($this->status);
header('Location: '.$this->FromPath('.'));
exit;
}
function NewFileAction ()
{
if ($_FILES['file']['tmp_name'] <> '') {
$this->parent = $this->path;
$this->name = $_FILES['file']['name'];
if ($this->cfgAntivirus) {
$fn = $this->cfgAntivirus;
$infected = $this->$fn($_FILES['file']['tmp_name']);
}
if (! $infected) {
$this->UploadFile($_FILES['file']['tmp_name']);
$this->Debug('new file "'.$this->name);
}
}
if ($this->status <> '') $this->ErrorMessage($this->status);
header('Location: '.$this->FromPath('.'));
exit;
}
function ClamAV ($file)
{
$out = preg_split("\n",`clamscan $file`);
if (preg_match('/^'.$file.': (.*) FOUND$/', $out[0], $regs)) {
$this->status = 'VIRUS: '.$regs[1];
return true;
} else {
return false;
}
}
function DeleteSelectedAction ()
{
$status = '';
if (is_array(@$_POST['selected'])) {
$base = $this->fullPath;
foreach ($_POST['selected'] as $file) {
$this->Go($base.'/'.$file);
$this->Remove();
$this->Debug('delete '.$base.'/'.$file);
if ($this->status <> '') $status = $this->status;
}
$this->Go($base);
if ($status <> '') $this->ErrorMessage($status);
}
header('Location: '.$this->FromPath('.'));
exit;
}
function PrintFileAction ()
{
if ($_FILES['file']['tmp_name'] <> '') {
$this->PrintFile($_FILES['file']['tmp_name']);
$this->Debug('print');
}
if ($this->status <> '') $this->ErrorMessage($this->status);
header('Location: '.$this->FromPath('.'));
exit;
}
function CancelSelectedAction ()
{
$status = '';
if (is_array($_POST['selected'])) {
foreach ($_POST['selected'] as $job) {
$this->CancelPrintJob($job);
$this->Debug('cancel print job #'.$job);
if ($this->status <> '') $status = $this->status;
}
}
if ($status <> '') $this->ErrorMessage($status);
header('Location: '.$this->FromPath('.'));
exit;
}
function DownloadFolderAction ()
{
$this->Debug('compress');
$this->DumpFile('', $this->name.'.'.$this->cfgArchiver);
$this->_SmbClient('compress', $this->path, '', true);
exit;
}
function RenameSelectedAction ()
{
$status = '';
$this->parent = $this->path;
if (is_array(@$_POST['renameto'])) {
$base = $this->fullPath;
for ($i=0; $i < count($_POST['renameto']); $i++) {
if ($_POST['oldname'][$i] <> $_POST['renameto'][$i]) {
$this->Debug('rename "'.$_POST['oldname'][$i].'" to "'.$_POST['renameto'][$i].'"');
$this->RenameFile($_POST['oldname'][$i], $_POST['renameto'][$i]);
if ($this->status <> '') $status = $this->status;
}
}
}
$_GET['action'] = '';
if ($status <> '') $this->ErrorMessage($status);
header('Location: '.$this->FromPath('.'));
exit;
}
# print KB
function PrintableBytes ($bytes)
{
if ($bytes < 1024) return "0 KB";
elseif ($bytes < 10*1024*1024) return number_format($bytes / 1024,0) . " KB";
elseif ($bytes < 1024*1024*1024) return number_format($bytes / (1024 * 1024),0) . " MB";
else return number_format($bytes / (1024*1024*1024),0) . " GB";
}
function PrintablePath ()
{
switch ($this->type) {
case 'network': return $this->_("Windows Network");
case 'workgroup': return $this->workgroup;
case 'server': return '\\\\'.$this->server;
case 'share':
$pp = '\\\\'.$this->server.'\\'.$this->share;
if ($this->where <> '') {
$pp .= '\\'.str_replace('/','\\',$this->where);
}
return $pp;
}
}
function Icon ($icon, $url='', $size=18)
{
$image = $this->Image($this->GetUrl("style/{$icon}.png"),'#',"align=\"absmiddle\" width=\"$size\" height=\"$size\"");
return ($url <> '') ? $this->Link($image, $url) : $image;
}
# builds a new path from current and a relative path
function FromPath ($relative='')
{
switch ($relative) {
case '.':
case '': $path = $this->where; break;
case '..': $path = $this->_DirectoryName($this->where); break;
default: $path = preg_replace('/^\//', '', $this->where.'/'.$relative);
}
return $this->GetUrl($path);
}
}
###################################################################
# SAMBA CLASS - calling smbclient
###################################################################
class samba {
var $cfgSmbClient = 'smbclient';
var $user='', $pw='', $cfgAuthMode='';
var $cfgDefaultServer='localhost', $cfgDefaultUser='', $cfgDefaultPassword='';
var $types = array ('network', 'workgroup', 'server', 'share');
var $type = 'network';
var $network = 'Windows Network';
var $workgroup='', $server='', $share='', $path='';
var $name = '';
var $workgroups=array(), $servers=array(), $shares=array(), $files=array();
var $cfgCachePath = false;
var $tempFile = '';
var $debug = 0;
var $socketOptions = 'TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=8192 SO_SNDBUF=8192';
var $blockSize = 1200;
var $order = 'NA';
var $status = '';
var $parser = array(
"^added interface ip=([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) bcast=([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) nmask=([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\$" => 'SKIP',
"Anonymous login successful" => 'SKIP',
"^Domain=\[(.*)\] OS=\[(.*)\] Server=\[(.*)\]\$" => 'SKIP',
"^\tSharename[ ]+Type[ ]+Comment\$" => 'SHARES_MODE',
"^\t---------[ ]+----[ ]+-------\$" => 'SKIP',
"^\tServer [ ]+Comment\$" => 'SERVERS_MODE',
"^\t---------[ ]+-------\$" => 'SKIP',
"^\tWorkgroup[ ]+Master\$" => 'WORKGROUPS_MODE',
"^\t(.*)[ ]+(Disk|IPC)[ ]+IPC.*\$" => 'SKIP',
"^\tIPC\\\$(.*)[ ]+IPC" => 'SKIP',
"^\t(.*)[ ]+(Disk|Printer)[ ]+(.*)\$" => 'SHARES',
'([0-9]+) blocks of size ([0-9]+)\. ([0-9]+) blocks available' => 'SIZE',
"Got a positive name query response from ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})" => 'SKIP',
"^session setup failed: (.*)\$" => 'LOGON_FAILURE',
'^tree connect failed: ERRSRV - ERRbadpw' => 'LOGON_FAILURE',
"^Error returning browse list: (.*)\$" => 'ERROR',
"^tree connect failed: (.*)\$" => 'ERROR',
"^Connection to .* failed\$" => 'CONNECTION_FAILED',
'^NT_STATUS_INVALID_PARAMETER' => 'INVALID_PARAMETER',
'^NT_STATUS_DIRECTORY_NOT_EMPTY removing' => 'DIRECTORY_NOT_EMPTY',
'ERRDOS - ERRbadpath \(Directory invalid.\)' => 'NOT_A_DIRECTORY',
'NT_STATUS_NOT_A_DIRECTORY' => 'NOT_A_DIRECTORY',
'cd (.*): not a directory' => 'NOT_A_DIRECTORY',
'^NT_STATUS_NO_SUCH_FILE listing ' => 'NO_SUCH_FILE',
'^NT_STATUS_ACCESS_DENIED' => 'ACCESS_DENIED',
'^cd (.*): NT_STATUS_OBJECT_PATH_NOT_FOUND' => 'OBJECT_PATH_NOT_FOUND',
'^cd (.*): NT_STATUS_OBJECT_NAME_NOT_FOUND' => 'OBJECT_NAME_NOT_FOUND',
"^\t(.*)\$" => 'SERVERS_OR_WORKGROUPS',
"^([0-9]+)[ ]+([0-9]+)[ ]+(.*)\$" => 'PRINT_JOBS',
"^Job ([0-9]+) cancelled" => 'JOB_CANCELLED',
'^[ ]+(.*)[ ]+([0-9]+)[ ]+(Mon|Tue|Wed|Thu|Fri|Sat|Sun)[ ](Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ]+([0-9]+)[ ]+([0-9]{2}:[0-9]{2}:[0-9]{2})[ ]([0-9]{4})$' => 'FILES',
"^message start: ERRSRV - ERRmsgoff" => 'NOT_RECEIVING_MESSAGES',
"^NT_STATUS_CANNOT_DELETE" => 'CANNOT_DELETE'
);
function samba ($path='')
{
if ($path <> '') $this->Go ($path);
print $path;
}
# path: WORKGROUP/SERVER/SHARE/PATH
function Go ($path = '')
{
$a = ($path <> '') ? preg_split('/\//',$path) : array();
for ($i=0, $ap=array(); $i<count($a); $i++)
switch ($i) {
case 0: $this->workgroup = $a[$i]; break;
case 1: $this->server = $a[$i]; break;
case 2: $this->share = $a[$i]; break;
default: $ap[] = $a[$i];
}
$this->path = join('/', $ap);
$this->type = $this->types[(count($a) > 3) ? 3 : count($a)];
$this->name = basename($path);
$this->parent = $this->_DirectoryName($this->path);
$this->fullPath = $path;
}
function Browse ($order='NA')
{
$this->results = array();
$this->shares = $this->servers = $this->workgroups = $this->files = $this->printjobs = array();
$server = ($this->server == '') ? $this->cfgDefaultServer : $this->server;
# smbclient call
switch ($this->type) {
case 'share':
$this->_SmbClient('dir', $this->path);
switch ($this->status) {
case 'NO_SUCH_FILE':
$this->_SmbClient('queue', $this->path);
$this->type = 'printer';
break;
case 'OBJECT_PATH_NOT_FOUND':
case 'NOT_A_DIRECTORY':
$this->_Get ();
}
break;
case 'workgroup':
if (($server = $this->_MasterOf($this->workgroup)) == $this->cfgDefaultServer) break;
default:
$this->_SmbClient('', $server);
}
# fix a smbclient bug (i think)
if (! isset($this->servers[$server]))
$this->servers[$server] = array ('name'=>$server, 'type'=>'server', 'comment'=>'');
# sort and select results
$results = array (
'network' => 'workgroups', 'workgroup' => 'servers',
'server' => 'shares', 'share' => 'files', 'folder' => 'files',
'printer' => 'printjobs'
);
if (isset($results[$this->type])) {
$this->results = $this->$results[$this->type];
# we need a global var for the compare function
$GLOBALS['SMBWEBCLIENT_SORT_BY'] = ($this->order <> '') ? $this->order : 'NA';
uasort($this->results, array('samba', '_GreaterThan'));
}
return $this->status;
}
function Remove ()
{
$this->_SmbClient('del "'.$this->name.'"', $this->parent);
if ($this->status == 'NO_SUCH_FILE') {
# it is a folder or not exists
$this->_SmbClient('dir', $this->parent);
# OK : if it is a folder, delete recursively
if (@$this->files[$this->name]['type'] == 'folder') $this->_DeleteFolder ();
}
}
# recursive deletion of SMB folders
function _DeleteFolder ()
{
$this->_SmbClient('del *', $this->path);
$this->_SmbClient('rmdir "'.basename($this->path).'"', $this->_DirectoryName($this->path));
if ($this->status == 'DIRECTORY_NOT_EMPTY') {
$this->files = array();
$savedPath = $this->path;
$this->_SmbClient('dir', $this->path);
$files = $this->files;
foreach ($files as $name => $info) {
switch ($info['type']) {
case 'folder':
$this->path = $savedPath.'/'.$name;
$this->_DeleteFolder();
break;
case 'file':
$this->_SmbClient('del "'.$name.'"', $this->path);
}
}
$this->path = $savedPath;
$this->_SmbClient('rmdir "'.basename($this->path).'"', $this->_DirectoryName($this->path));
}
}
function MakeDirectory ()
{
$this->_SmbClient('mkdir "'.$this->name.'"', $this->parent);
}
function UploadFile ($file)
{
$this->_SmbClient('put "'.$file.'" "'.$this->name.'"', $this->parent);
}
function PrintFile ($file)
{
$this->_SmbClient('print '.$file);
}
function RenameFile ($file, $newname)
{
$this->_SmbClient('rename "'.$file.'" "'.$newname.'"', $this->parent);
}
function CancelPrintJob ($job)
{
$this->_SmbClient('cancel '.$job);
}
function _GreaterThan ($a, $b)
{
global $SMBWEBCLIENT_SORT_BY;
list ($yes, $no) = ($SMBWEBCLIENT_SORT_BY[1] == 'D') ? array(-1,1) : array (1,-1);
if ($a['type'] <> $b['type']) {
return ($a['type'] == 'file') ? $yes : $no;
} else {
switch ($SMBWEBCLIENT_SORT_BY[0]) {
case 'N': return (strtolower($a['name']) > strtolower($b['name'])) ? $yes : $no;
case 'D': return (@$a['time'] > @$b['time']) ? $yes : $no;
case 'S': return (@$a['size'] > @$b['size']) ? $yes : $no;
case 'C': return (strtolower(@$a['comment']) > strtolower(@$b['comment'])) ? $yes : $no;
case 'T':
$pia = pathinfo(strtolower($a['name']));
$pib = pathinfo(strtolower($b['name']));
return (@$pia['extension'] > @$pib['extension']) ? $yes : $no;
}
}
}
function _MasterOf ($workgroup)
{
$saved = array ($this->type, $this->user, $this->pw);
if ($this->cfgDefaultUser <> '') {
list ($this->user, $this->pw) = array ($this->cfgDefaultUser, $this->cfgDefaultPassword);
}
$this->type = 'network';
$this->_SmbClient('', $this->cfgDefaultServer);
list ($this->type, $this->user, $this->pw) = $saved;
return $this->workgroups[$this->workgroup]['comment'];
}
# get a file (including a cache)
function _Get ()
{
$this->_SmbClient('dir "'.$this->name.'"', $this->parent);
if ($this->status == '') {
$this->type = 'file';
$this->size = $this->files[$this->name]['size'];
$this->time = $this->files[$this->name]['time'];
if (! $this->cfgCachePath) {
$this->DumpFile('', $this->name);
$this->_SmbClient('get "'.$this->name.'" \"-\" "', $this->parent, '', true);
} else {
$this->tempFile = $this->cfgCachePath . $this->fullPath;
if (@filemtime($this->tempFile) < $this->time OR !file_exists($this->tempFile)) {
if (! is_dir($this->_DirectoryName($this->tempFile))) {
$this->_MakeDirectoryRecursively($this->_DirectoryName($this->tempFile));
}
$this->_SmbClient('get "'.$this->name.'" "'.$this->tempFile.'"', $this->parent);
}
$this->DumpFile ($this->tempFile, $this->name);
}
}
}
function SendMessage ($server, $message)
{
$this->_SmbClient ('message', $server, $message);
}
function _SmbClient ($command='', $path='', $message='', $dumpFile=false)
{
$this->status = '';
if ($command == '') {
$smbcmd = "-L ".escapeshellarg($path);
} elseif ($command == 'message') {
$smbcmd = "-M ".escapeshellarg($path);
} elseif ($command == 'compress') {
$smbcmd = escapeshellarg("//{$this->server}/{$this->share}").
" -Tqc - ".escapeshellarg($path);
} else {
$smbcmd = escapeshellarg("//{$this->server}/{$this->share}").
" -c ".escapeshellarg($command);
if ($path <> '') $smbcmd .= ' -D '.escapeshellarg($path);
}
$options = ' -d 0 ';
if ($command <> '') {
if ($this->workgroup <> '') $options .= ' -W '.escapeshellarg($this->workgroup);
if ($this->socketOptions <> '') $options .= ' -O '.escapeshellarg($this->socketOptions);
if ($this->blockSize <> '') $options .= ' -b '.$this->blockSize;
}
if ($this->user <> '') {
# not anonymous
switch ($this->cfgAuthMode) {
case 'SMB_AUTH_ENV': putenv('USER='.$this->user.'%'.$this->pw); break;
case 'SMB_AUTH_ARG': $smbcmd .= ' -N -U '.escapeshellarg($this->user.'%'.$this->pw);
}
}
$cmdline = $this->cfgSmbClient.' '.$smbcmd.' '.$options;
if ($message <> '') $cmdline = "echo ".escapeshellarg($message).' | '.$cmdline;
$cmdline .= ($dumpFile) ? ' 2>/dev/null' : ' 2>&1';
if ($command == 'compress') {
$tmpfname = tempnam("/tmp", "swcZ");
$archiver = str_replace("@f", $tmpfname, $this->archiverPlugins[$this->cfgArchiver]);
@unlink($tmpfname);
$cmdline .= $archiver;
$dumpFile = true;
}
return $this->_ParseSmbClient ($cmdline, $dumpFile);
}
function _ParseSmbClient ($cmdline, $dumpFile=false)
{
$sec_cmdline = str_replace($this->pw, '****', $cmdline);
if (! $dumpFile) {
$output = shell_exec($cmdline);
$debug_command = ($this->debug > 1) ? "\n[smbclient]\n{$output}\n[/smbclient]" : "";
} else {
# output a file
passthru($cmdline);
}
$this->Debug("{$sec_cmdline}{$debug_command}",1);
$lineType = $mode = '';
foreach (preg_split('/\n/', $output) as $line) if ($line <> '') {
$regs = array();
reset ($this->parser);
$linetype = 'skip';
$regs = array();
foreach ($this->parser as $regexp => $type) {
# preg_match is much faster than ereg (Bram Daams)
if (preg_match('/'.$regexp.'/', $line, $regs)) {
$lineType = $type;
break;
}
}
switch ($lineType) {
case 'SKIP': continue;
case 'SHARES_MODE': $mode = 'shares'; break;
case 'SERVERS_MODE': $mode = 'servers'; break;
case 'WORKGROUPS_MODE': $mode = 'workgroups'; break;
case 'SHARES':
$name = trim($regs[1]);
$type = strtolower($regs[2]);
if ($this->cfgHideSystemShares == true AND $name[strlen($name)-1] == '$') break;
if ($this->cfgHidePrinterShares == true AND $type == 'printer') break;
$this->shares[$name] = array (
'name' => $name,
'type' => $type,
'comment' => $regs[3]
);
break;
case 'SERVERS_OR_WORKGROUPS':
$name = trim(substr($line,1,21));
$comment = trim(substr($line, 22));
if ($mode == 'servers') {
$this->servers[$name] = array ('name' => $name, 'type' => 'server', 'comment' => $comment);
} else {
$this->workgroups[$name] = array ('name' => $name, 'type' => 'workgroup', 'comment' => $comment);
}
break;
case 'FILES':
# with attribute ?
if (preg_match("/^(.*)[ ]+([D|A|H|S|R]+)$/", trim($regs[1]), $regs2)) {
$attr = trim($regs2[2]);
$name = trim($regs2[1]);
} else {
$attr = '';
$name = trim($regs[1]);
}
if ($name <> '.' AND $name <> '..') {
$type = (strpos($attr,'D') === false) ? 'file' : 'folder';
$this->files[$name] = array (
'name' => $name,
'attr' => $attr,
'size' => $regs[2],
'time' => $this->_ParseTime($regs[4],$regs[5],$regs[7],$regs[6]),
'type' => $type
);
}
break;
case 'PRINT_JOBS':
$name = $regs[1].' '.$regs[3];
$this->printjobs[$name] = array(
'name'=>$name,
'type'=>'printjob',
'id'=>$regs[1],
'size'=>$regs[2]
);
break;
case 'SIZE':
$this->size = $regs[1] * $regs[2];
$this->available = $regs[3] * $regs[2];
break;
case 'ERROR': $this->status = $regs[1]; break;
default: $this->status = $lineType;
}
}
}
# returns unix time from smbclient output
function _ParseTime ($m, $d, $y, $hhiiss)
{
$his= preg_split('/:/', $hhiiss);
$im = 1 + strpos("JanFebMarAprMayJunJulAugSepOctNovDec", $m) / 3;
return mktime($his[0], $his[1], $his[2], $im, $d, $y);
}
# make a directory recursively
function _MakeDirectoryRecursively ($path, $mode = 0777)
{
if (strlen($path) == 0) return 0;
if (is_dir($path)) return 1;
elseif ($this->_DirectoryName($path) == $path) return 1;
return ($this->_MakeDirectoryRecursively($this->_DirectoryName($path), $mode)
and mkdir($path, $mode));
}
# I do not like PHP dirname
function _DirectoryName ($path='')
{
$a = preg_split('/\//', $path);
$n = (trim($a[count($a)-1]) == '') ? (count($a)-2) : (count($a)-1);
for ($dir=array(),$i=0; $i<$n; $i++) $dir[] = $a[$i];
return join('/',$dir);
}
}
###################################################################
# MAIN SECTION - come on !
###################################################################
if (! isset($SMBWEBCLIENT_CLASS)) {
$swc = new smbwebclient;
$swc->Run();
}
?>
|