<?php
/**
* SmbWebClient: web frontend to smbclient (www.samba.org)
*
* by Victor M. Varela <[email protected]>
*
* {$Id: smbwebclient.php,v 1.10 2004/02/07 21:17:49 vmvarela Exp $}
*
* 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.
*
* ---
* You can download the latest version at:
* http://www.nivel0.net/SmbWebClient
*
* You can edit your translation at:
* http://www.nivel0.net/SmbWebClientTranslation
*
* Please send suggestions, bugs etc to: [email protected]
*
* Thanks to:
* French language: Sam Przysca/Christopher Zaragoza/Maria Iglesias
*
* Quick install:
*
* 1) To get SMB Web Client to work, make sure that you
* have Apache and PHP 4.1.x installed.
*
* 2) Download from http://www.nivel0.net/SmbWebClient
*
* 3) Untar compressed file
* $ tar xzf smbwebclient-XX.XX.tgz
* $ cp smbwebclient.php /var/www
*
* 4) Change your settings (editing smbwebclient.php) (see below)
*
* 5) go to http://your-server-url/smbwebclient.php and
* enter a valid Windows user and password
*/
// CONFIGURATION
define ('cfgSambaRoot', ''); // DOMAIN/SERVER/SHARE/path
define ('cfgCachePath', ''); // path to cache files ('' = disabled)
define ('cfgDefaultLanguage', 'en'); // en, es, fr
define ('cfgLogFile', ''); // path to log file ('' = disabled)
// ----> end of configuration, you don't need to edit after this line !!! <----
class SmbWebClient {
// VARIABLES
var $strings = array (
'en' => array ('Windows Network','Name','Size','Comments','Modified','Attributes','m/d/Y h:i','Print','Delete Selected','New File','Cancel Selected','User','Password','login'),
'es' => array ('Red Windows','Nombre','Tamaño','Comentarios','Modificado','Atributos','d/m/Y h:i','Imprimir','Borrar Marcados','Nuevo Archivo','Cancelar Marcados','Usuario','Contraseña','identificarse'),
'fr' => array ('Reseau Windows', 'Nom', 'Volume', 'Commentaires', 'Modifier', 'Attributs', 'm/d/Y h:i', 'Imprimer', 'L'effacement a choisi', 'Nouveau Fichier', 'L'annulation a choisi', 'Utilisateur', 'Mot de Passe', 'connexion')
);
var $mime_types = array (
'%'=>'application/x-trash','ai'=>'application/postscript','aif'=>'audio/x-aiff',
'aifc'=>'audio/x-aiff','aiff'=>'audio/x-aiff','asc'=>'text/plain','asf'=>'video/x-ms-asf',
'asx'=>'video/x-ms-asf','au'=>'audio/basic','avi'=>'video/x-msvideo',
'bak'=>'application/x-trash','bat'=>'application/x-msdos-program',
'bin'=>'application/octet-stream','bmp'=>'image/x-ms-bmp','com'=>'application/x-msdos-program',
'cpio'=>'application/x-cpio','css'=>'text/css','csv'=>'text/comma-separated-values',
'deb'=>'application/x-debian-package','diff'=>'text/plain','dl'=>'video/dl',
'dll'=>'application/x-msdos-program','doc'=>'application/msword','dot'=>'application/msword',
'dvi'=>'application/x-dvi','eps'=>'application/postscript','exe'=>'application/x-msdos-program',
'fli'=>'video/fli','gif'=>'image/gif','gl'=>'video/gl','gsm'=>'audio/x-gsm',
'gtar'=>'application/x-gtar','htm'=>'text/html','html'=>'text/html','ief'=>'image/ief',
'jpe'=>'image/jpeg','jpeg'=>'image/jpeg','jpg'=>'image/jpeg','js'=>'application/x-javascript',
'kar'=>'audio/midi','lha'=>'application/x-lha','m3u'=>'audio/x-mpegurl',
'mdb'=>'application/msaccess','mid'=>'audio/midi','midi'=>'audio/midi','mng'=>'video/x-mng',
'mov'=>'video/quicktime','mp2'=>'audio/mpeg','mp3'=>'audio/mpeg','mpe'=>'video/mpeg',
'mpeg'=>'video/mpeg','mpg'=>'video/mpeg','mpga'=>'audio/mpeg','msi'=>'application/x-msi',
'ogg'=>'application/x-ogg','old'=>'application/x-trash','pbm'=>'image/x-portable-bitmap',
'pcx'=>'image/pcx','pdf'=>'application/pdf','pgm'=>'image/x-portable-graymap',
'pgp'=>'application/pgp-signature','pls'=>'audio/x-scpls','png'=>'image/png',
'pnm'=>'image/x-portable-anymap','pot'=>'application/vnd.ms-powerpoint',
'ppm'=>'image/x-portable-pixmap','pps'=>'application/vnd.ms-powerpoint',
'ppt'=>'application/vnd.ms-powerpoint','ps'=>'application/postscript','qt'=>'video/quicktime',
'ra'=>'audio/x-realaudio','ram'=>'audio/x-pn-realaudio','rgb'=>'image/x-rgb',
'rm'=>'audio/x-pn-realaudio','rpm'=>'audio/x-pn-realaudio-plugin','rtf'=>'text/rtf',
'rtx'=>'text/richtext','sid'=>'audio/prs.sid','sik'=>'application/x-trash','snd'=>'audio/basic',
'svg'=>'image/svg+xml','svgz'=>'image/svg+xml','swf'=>'application/x-shockwave-flash',
'swfl'=>'application/x-shockwave-flash','tar'=>'application/x-tar','taz'=>'application/x-gtar',
'text'=>'text/plain','tgz'=>'application/x-gtar','tif'=>'image/tiff','tiff'=>'image/tiff',
'tsv'=>'text/tab-separated-values','txt'=>'text/plain','vcf'=>'text/x-vcard',
'vcs'=>'text/x-vcalendar','wav'=>'audio/x-wav','xbm'=>'image/x-xbitmap','xhtml'=>'text/html',
'xlb'=>'application/vnd.ms-excel','xls'=>'application/vnd.ms-excel','xml'=>'text/xml',
'xpm'=>'image/x-xpixmap','xsl'=>'text/xml','zip'=>'application/zip','~'=>'application/x-trash'
);
var $binary_files = array (
'style.css' => "
body { color: black; background: white; font-size: 12px; margin-top: 0px; margin-left: 0px; font-family: arial, helvetica, Verdana; }
pre { font-size: 12px; margin-top: 0px; margin-bottom: 0px; line-height: 12px; }
pre a { text-decoration: none; color: black; }
pre a:hover { color: white; background-color: #424691; }
pre a:visited { color: grey; }
pre em { font-style: normal; font-weight: normal; background-color: #f7f7f7; }
#columns { background-color: #d5d2c5; border-bottom: 1px solid black; width: 100%; margin-top: 0px; line-height: 20px }
#columns a { background-color: #d5d2c5; color: black; }
#columns a:hover { font-weight: bold; }
#directory { width: 100% }",
'images/a.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABcAAQEBAQAAAAAAAAAAAAAAAAAFAQf/xAAgEAACAQQBBQAAAAAAAAAAAAAAAQIDBBEhBRJRcYHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAID/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A6gDJdTg1BpSxptZSfgm2HG3dndVKtTkHXjVeZwlTxl91vXz1jNamAAAAAAAD/9k=',
'images/d.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABcAAQEBAQAAAAAAAAAAAAAAAAAFAQf/xAAhEAADAAEDBAMAAAAAAAAAAAAAAQIEAwUREhMhUSKB0f/EABYBAQEBAAAAAAAAAAAAAAAAAAACA//EABQRAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhEDEQA/AOoAypm4cXKqaXDTXKaJuBseJt+VqZGmnVU/h1ee2vS/fX3zmtTAAAAAAAB//9k=',
'images/directory.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABoAAQACAwEAAAAAAAAAAAAAAAADBgIEBQf/xAArEAACAQMDAQYHAQAAAAAAAAABAgMABBEFEiEGExQxMkFRIlRhcXKRkqH/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQQF/8QAGxEBAAICAwAAAAAAAAAAAAAAAQACAyEEMVH/2gAMAwEAAhEDEQA/APa7zU+ymlQXVtbLEwRmuF3bmKhuPiXHBHvnngY50n6utLaINdIOCAzQTxSL44yBv3kevlz9K52p6tBofU9xNeyGFJUJiYqSGysQ4x+Lfr7VDL17pDBR34+dCcRv4bhn09qxr8vNTJY335KzFVCXWGaO4hSaF1eNxuVlOQRSq/0GHXorTu0VlYhzhhg4MjEf5ilbFVQWSumWCSKOXHaRo+PDcucVh3S2+Xi/gUpTikoAUAAAAcAClKUQn//Z',
'images/disk.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABoAAQACAwEAAAAAAAAAAAAAAAAEBQIDBgf/xAAlEAABBAICAgAHAAAAAAAAAAABAgMEEQAFEiEGQSIxUWFxgvD/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQQF/8QAHhEAAgEDBQAAAAAAAAAAAAAAAAERAhJBAwQUkfD/2gAMAwEAAhEDEQA/APbJksMOtNKUUBxKlckiz0UigKNk8v68hS9pIgxVSlNlUZv4luPBLVJ9ntQN/qLyP5NObgLiPBUdUqnAw087w5KPEWD7qx19+s51+TJ2+2Op3ezhwoxdSgRmHeS5PRUAT6BFWPlYqzmXq8h7m2lwse7KKVRZLO9jSG5cZuQyrk24kKSaqwcZmhCW20oQKSkAAfQYzUJzRNgRNiyGZkdt5sGwlYujldE8S0UGQH2Na0HQQQtRUsj8WTWMYoUyE4LrGMYwP//Z',
'images/dotdot.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABkAAQACAwAAAAAAAAAAAAAAAAAGBwIDBP/EACIQAAIBBAICAwEAAAAAAAAAAAECAwAEEUEFIRITBjFRYf/EABYBAQEBAAAAAAAAAAAAAAAAAAIBBf/EAB8RAAICAQQDAAAAAAAAAAAAAAABAgMRBBIhcRMikf/aAAwDAQACEQMRAD8Auy+5GDj4JZJRK5jjaQpDGXYgfwfus1AeH+dcyLkvf2Ul3FPN4rb28BE0HRbAXGWAUZ7wd51U1uZWTl2USetTAjO28At9Z32KifHoOS+W30sZlCrcN65Hch2f1rGWGMdABzoHKgbrIu1dnn2J4w/ob6Z+jg++iwKUpWuI5p7C1uZhLPAsrAYHn2N6+tmt0cUcK+MUaov4owKUoqEU8pclbb4ZnSlKRD//2Q==',
'images/file.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAEBQYHAv/EACwQAAICAQMCAwcFAAAAAAAAAAECAwQRAAUSBiETMUEHFBUWNlFhdJWy0uH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EAB8RAAIBAgcAAAAAAAAAAAAAAAABEQISEyFBUWGR8P/aAAwDAQACEQMRAD8A61uu4pTvv71u0tCuEhROESvzkkaQAd1JyeIA/wB1m7XtB2eFqw2rqZd2tyzpClIImZSx4gDCrgliozk4znBxg2nVCV5LbrbpNcgKwho/h73VB4WeLNEgJZQ3E+np3HbWMi2yJr20rX6eiEqzbcWlh6amrPHMliIyv4ngqoUqJSSSoxxAVcMXujDh3zOm3ulyHkpOsUbce4bfWuxBljsRLKgcYIDAEZ/PfTUPpr6V2f8AQw/wGmoB7vbHR3GyLFhZ/FCBMxWZYsgEkZCMAfM6jfKu1fa7+4WP76aaAta1aKnUhqwJwhhRY41yThQMAZPfyGmmmgP/2Q==',
'images/printjob.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAAEBQYHAv/EACwQAAICAQMCAwcFAAAAAAAAAAECAwQRAAUSBiETMUEHFBUWNlFhdJWy0uH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EAB8RAAIBAgcAAAAAAAAAAAAAAAABEQISEyFBUWGR8P/aAAwDAQACEQMRAD8A61uu4pTvv71u0tCuEhROESvzkkaQAd1JyeIA/wB1m7XtB2eFqw2rqZd2tyzpClIImZSx4gDCrgliozk4znBxg2nVCV5LbrbpNcgKwho/h73VB4WeLNEgJZQ3E+np3HbWMi2yJr20rX6eiEqzbcWlh6amrPHMliIyv4ngqoUqJSSSoxxAVcMXujDh3zOm3ulyHkpOsUbce4bfWuxBljsRLKgcYIDAEZ/PfTUPpr6V2f8AQw/wGmoB7vbHR3GyLFhZ/FCBMxWZYsgEkZCMAfM6jfKu1fa7+4WP76aaAta1aKnUhqwJwhhRY41yThQMAZPfyGmmmgP/2Q==',
'images/printer.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABoAAQACAwEAAAAAAAAAAAAAAAAFBwEDBAb/xAAoEAABAwMDAgYDAAAAAAAAAAABAgMEAAUREiFBBhMUIzFRYXEiQpH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/EABwRAAMAAQUAAAAAAAAAAAAAAAABETECEiEiof/aAAwDAQACEQMRAD8AuW6TPClvEgt7ErCdOQODkg+xGOc/Fa41z0OaZKnO24R23Foxjb0JwBjnP3UTebnBbvjza5PZdQ2hpR7qDvuoeWTqUPz/AFGeBXmVyJElT6JtwajZSNIW6lpSweQCUjHBySfij1pdeL6I8lpUrlttxj3a3Mzoqiph0EpKhg7HB2+waUBiXa4E9YXLhsPLCdIU4gEge1Rsbo3p+I6XWrcgqIx5ri3B/FEilKm1WlrwTMeOzFYSzHaQ00nOlCBgDJz6UpSqQ//Z',
'images/server.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABgAAQEBAQEAAAAAAAAAAAAAAAAFBwEC/8QAJRAAAgEEAQMEAwAAAAAAAAAAAQIDAAQFESESEzEGFCJhUZGh/8QAFgEBAQEAAAAAAAAAAAAAAAAABAAB/8QAHREAAgEEAwAAAAAAAAAAAAAAAAECAwQTMRIyQf/aAAwDAQACEQMRAD8A2vJXclnad2JUZuoD571qoWQzd3Z26XK3cb6dOqPtAAqWAPO9+D9VbzEXuMZNbhgrSjpUsdAHyN/qszy8Nxb5mDGXU4WydQZZ05byBofjyKXbwpSi+Ww1XNkiodfTWgdjYpXFACgDka4pRBJ5mhjniaKVA8bDTKRwakJ6TwqXSXJtGeVD1L3Z5HAP0rMR/KUrU2tEWqUpWEf/2Q==',
'images/workgroup.jpg' => '/9j/4AAQSkZJRgABAQEASABIAAD//gAXQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q/9sAQwAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQkMCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy/8AAEQgAFAAUAwEiAAIRAQMRAf/EABkAAQADAQEAAAAAAAAAAAAAAAABBAYHBf/EACUQAAEEAgEDBAMAAAAAAAAAAAECAwQRAAUxBhIhIkFRgROR0f/EABcBAQEBAQAAAAAAAAAAAAAAAAADAQT/xAAbEQACAgMBAAAAAAAAAAAAAAAAAQIRIaHxUv/aAAwDAQACEQMRAD8A7vmMhdVPSOoImtQ6XXCopktqQAWxVg0BY9ufnJ6wmOR3HltNNuBLHYoKUAoK8nwD7UR5/mZ7XwdlqvzbGW3EceltNOOdqj6qSUg+omzQHgcVZu86IQWF610hOUrbSeN8Op4zxOkVuudLQXHzbigo83Q7zQ+hQ+sZBqmXLuw0+v2gSJsZL1VySP3XOTL1MGdFTGkRkrZSO0Jsih8ePbGMwFiNGZhx0R47aW2WxSUJ4AxjGAf/2Q=='
);
var $info = array();
// MAIN FUNCTION
function Run() {
$this->ParseUrl();
if (isset($this->binary_files[$this->path])) $this->InlineFile($this->path);
else {
$this->GetLanguage();
$this->UserAuth();
$this->GetTarget();
if ('ListViewAction' == $_POST['m']) $this->ListViewAction();
if ($this->Samba ('browse')) {
if ($this->type == 'File') {
if (! $_SESSION['SmbWebClient_Debug']) {
$this->GetMimeFile($this->cachefile,$this->name);
if (cfgCachePath == '') unlink ($this->cachefile);
}
} else {
$page = $this->Page($this->info['name'], $this->Block('directory', $this->ListView()));
if (! $_SESSION['SmbWebClient_Debug']) print $page;
else print_r($this->info);
}
$this->Log();
} else switch ($this->info['error']) {
case 'NT_STATUS_LOGON_FAILURE': header ("Location: ".$this->GetUrl()."?auth=1");
default: if (! $_SESSION['SmbWebClient_Debug'])
print $this->Page("ERROR", $this->Block('errormessage',
"<b>**error**</b> ".$this->info['error']
));
}
}
}
// URL
/**
* Parse current url
*/
function ParseUrl() {
ereg('^'.$_SERVER['SCRIPT_NAME'].'(.*)$', $_SERVER['REQUEST_URI'], $url);
$a = split ('?', ereg_replace('^/','',$url[1]));
$this->path = urldecode(ereg_replace('/$', '', $a[0]));
foreach (split('&',$a[1]) as $cmd) {
$a = split('=', $cmd);
$this->get[urldecode($a[0])] = urldecode($a[1]);
}
}
/**
* Return current url without any params
*/
function GetUrl() {
$a = split('?', $_SERVER['REQUEST_URI']);
return $a[0];
}
/**
* Set type and name of samba object
*/
function GetTarget() {
if ('' == $path = ($this->path == '') ? cfgSambaRoot : ereg_replace('^/', '', cfgSambaRoot.'/'.$this->path)) {
$this->type = 'Network';
$this->name = $this->GetString(0);
} else {
$a = split('/',$path);
$this->info = array('workgroup'=>$a[0],'server'=>$a[1],'share'=>$a[2]);
for ($i=3; $i<count($a)-1; $i++) $this->info['path'] .= $a[$i].'/';
$this->info['path'] .= $a[$i];
switch (count($a)) {
case 1: $this->type = 'Workgroup'; break;
case 2: $this->type = 'Server'; break;
default: $this->type = 'Share';
}
$this->name = basename($path);
}
}
// LANGUAGES
/**
* Set current language
*/
function GetLanguage() {
if (isset($this->get['lang']) AND is_array($this->strings[$this->get['lang']]))
$_SESSION['SmbWebClient_Lang'] = $this->get['lang'];
if (! isset($_SESSION['SmbWebClient_Lang'])) {
foreach (split('[,;]',$_SERVER['HTTP_ACCEPT_LANGUAGE']) as $lang)
if (is_array($this->strings[$lang])) { $_SESSION['SmbWebClient_Lang'] = $lang; break; }
if (! isset($_SESSION['SmbWebClient_Lang'])) $_SESSION['SmbWebClient_Lang'] = cfgDefaultLanguage;
}
$this->lang = $_SESSION['SmbWebClient_Lang'];
}
/**
* Get a string
*/
function GetString($i) {
return $this->strings[$this->lang][$i];
}
// SAMBA INTERFACE
/**
* Builds a samba command
*/
function SmbClient ($cmd, $path = '') {
if ($path <> '') $path = "-D "{$path}"";
return "smbclient "//{$this->info['server']}/{$this->info['share']}" {$path} -N -U {$this->auth} -c "{$cmd}"";
}
/**
* smbclient interface (commands: browse or download)
*/
function Samba ($command, $path='') {
$this->info['error'] = '';
switch ($command) {
case 'browse':
$this->info['shares'] = $this->info['servers'] = $this->info['workgroups'] = $this->info['files'] = array();
$server = ($this->info['server'] == '') ? 'localhost' : $this->info['server'];
if ($this->type <> 'Share')
$cmd = "smbclient -L {$server} -N -U {$this->auth}";
else {
if ($path == '') $path = $this->info['path'];
$cmd = $this->SmbClient("dir", $path);
}
break;
case 'spool':
$this->info['files'] = array();
$this->type = 'Printer';
$cmd = $this->SmbClient("queue");
break;
case 'get':
$cmd = $this->SmbClient("dir "".basename($this->info['path']).""", dirname($this->info['path']));
break;
case 'get2':
$this->type = 'File';
$this->size = $this->info['files'][$this->name]['size'];
$this->time = $this->info['files'][$this->name]['time'];
$this->cachefile = (cfgCachePath == '') ? tempnam("/tmp","swc") : cfgCachePath.'/'.$this->path;
if ($this->time <> '') {
if (cfgCachePath == '' OR (!file_exists($this->cachefile)) OR filemtime($this->cachefile) < $time) {
if (cfgCachePathcache <> '' AND !is_dir(dirname($this->cachefile))) $this->MakeDirectory(dirname($this->cachefile));
$path = str_replace('/','',$this->info['path']);
$cmd = $this->SmbClient("get "{$path}" "{$this->cachefile}"");
}
}
break;
case 'put':
$cmd = $this->SmbClient("put "{$_FILES['file']['tmp_name']}" "{$_FILES['file']['name']}"", $this->info['path']);
break;
case 'print':
$cmd = $this->SmbClient("print "{$_FILES['file']['tmp_name']}"");
break;
case 'cancel':
$cmd = $this->SmbClient("cancel {$path}");
break;
case 'delete':
$directory = $this->info['path'].'/'.dirname($path);
$cmd = $this->SmbClient("del "".basename($path).""", $directory);
break;
case 'deltree':
$this->Samba('browse',$path);
$files = $this->info['files'];
foreach ($files as $filename => $info) $this->Samba('delete', $path.'/'.$filename);
$cmd = $this->SmbClient("rmdir "{$path}"", $this->info['path']);
}
$this->Debug("n$ $cmdn",2);
$ocmd = `{$cmd}`;
$this->Debug($ocmd, 3);
$ipv4 = "([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})";
foreach (split("n",$ocmd) as $line) {
$regs = array();
if (ereg("^added interface ip={$ipv4} bcast={$ipv4} nmask={$ipv4}$",$line,$regs)) {
$this->info['interface'] = array($regs[1], $regs[2], $regs[3]);
} else if ($line == "Anonymous login successful") {
$this->info['anonymous'] = true;
} else if (ereg("^Domain=[(.*)] OS=[(.*)] Server=[(.*)]$",$line,$regs)) {
$this->info['description'] = array($regs[1], $regs[2], $regs[3]);
} else if (ereg("^tSharename[ ]+Type[ ]+Comment$",$line,$regs)) {
$mode = 'shares';
} else if (ereg("^t---------[ ]+----[ ]+-------$",$line,$regs)) {
continue;
} else if (ereg("^tServer [ ]+Comment$",$line,$regs)) {
$mode = 'servers';
} else if (ereg("^t---------[ ]+-------$",$line,$regs)) {
continue;
} else if (ereg("^tWorkgroup[ ]+Master$",$line,$regs)) {
$mode = 'workgroups';
} else if (ereg("^t(.*)[ ]+(Disk|IPC)[ ]+IPC.*$",$line,$regs)) {
continue;
} else if (ereg("^tIPC$(.*)[ ]+IPC",$line,$regs)) {
continue;
} else if (ereg("^t(.*)[ ]+(Disk|Printer)[ ]+(.*)$",$line,$regs)) {
if (trim($regs[1]) <> 'IPC$') $this->info['shares'][trim($regs[1])] = array ('type'=>$regs[2], 'comment'=>$regs[3]);
} else if (ereg('([0-9]+) blocks of size ([0-9]+). ([0-9]+) blocks available', $line, $regs)) {
$this->info['size'] = $regs[1] * $regs[2];
$this->info['available'] = $regs[3] * $regs[2];
} else if (ereg("Got a positive name query response from $ipv4",$line,$regs)) {
$this->info['ip'] = $regs[1];
} else if (ereg("^session setup failed: (.*)$", $line, $regs)) {
$this->info['error'] = $regs[1];
} else if ($line == 'session setup failed: NT_STATUS_LOGON_FAILURE' or ereg('^tree connect failed: ERRSRV - ERRbadpw', $line)) {
$this->info['error'] = 'NT_STATUS_LOGON_FAILURE';
} else if (ereg("^Error returning browse list: (.*)$", $line, $regs)) {
$this->info['error'] = $regs[1];
} else if (ereg("^tree connect failed: (.*)$", $line, $regs)) {
$this->info['error'] = $regs[1];
} else if (ereg("^Connection to .* failed$", $line, $regs)) {
$this->info['error'] = 'CONNECTION_FAILED';
} else if (ereg('^NT_STATUS_INVALID_PARAMETER', $line)) {
$this->info['error'] = 'NT_STATUS_INVALID_PARAMETER';
} else if (ereg('^NT_STATUS_DIRECTORY_NOT_EMPTY removing', $line)) {
$this->info['error'] = 'NT_STATUS_DIRECTORY_NOT_EMPTY';
} else if (ereg('ERRDOS - ERRbadpath (Directory invalid.)', $line) or ereg('NT_STATUS_NOT_A_DIRECTORY', $line)) {
if ($this->type <> 'File') return $this->Samba('get');
$this->info['error'] = 'NT_STATUS_NOT_A_DIRECTORY';
} else if (ereg('^NT_STATUS_NO_SUCH_FILE listing ', $line)) {
if ($command == 'delete') return $this->Samba('deltree', $path);
if ($this->type == 'Share' AND $this->info['path'] == '') return $this->Samba('spool');
$this->info['error'] = 'NT_STATUS_NO_SUCH_FILE';
} else if (ereg('^NT_STATUS_ACCESS_DENIED listing ', $line)) {
if ($this->type == 'Share' AND $this->info['path'] == '') return $this->Samba('spool');
$this->info['error'] = 'NT_STATUS_ACCESS_DENIED';
} else if (ereg('^cd (.*): NT_STATUS_OBJECT_PATH_NOT_FOUND$', $line)) {
if ($this->type <> 'File') return $this->Samba('get');
$this->info['error'] = 'NT_STATUS_OBJECT_PATH_NOT_FOUND';
} else if (ereg("^t(.*)$", $line, $regs)) {
$this->info[$mode][trim(substr($line,1,21))] = array (
'type'=>($mode == 'servers') ? 'Server' : 'Workgroup',
'comment' => trim(substr($line,22))
);
} else if ($command == 'spool' AND ereg("^([0-9]+)[ ]+([0-9]+)[ ]+(.*)$", $line, $regs)) {
$this->info['files'][$regs[1].' '.$regs[3]] = array('type'=>'PrintJob','id'=>$regs[1], 'size'=>$regs[2]);
} else if (ereg("^[ ]+(.*)[ ]+([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})$", $line, $regs)) {
if (ereg("^(.*)[ ]+([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 <> '..')
$this->info['files'][$name] = array (
'attr' => $attr,
'size' => $regs[2],
'time' => $this->ParseTime($regs[4],$regs[5],$regs[7],$regs[6]),
'type' => (strpos($attr,'D') === false) ? 'File' : 'Directory'
);
}
}
if ($command == 'get') return $this->Samba('get2');
return $this->info['error'] == '';
}
// MIME
/**
* Gets the mime type of a file (default: application/octet-stream)
*/
function GetMimeType($filename) {
$pi = pathinfo(strtolower($filename));
$mime_type = $this->mime_types[$pi['extension']];
return ($mime_type == '') ? 'application/octet-stream' : $mime_type;
}
/**
* Dumps a file with MIME headers
*/
function GetMimeFile($file='', $name='') {
if ($name == '') $name = basename($file);
$mime_type = $this->GetMimeType($name);
header('MIME-Version: 1.0');
header("Content-Type: $mime_type; name ="$name"");
header("Content-Disposition: filename="$name"");
if ($file <> '' AND is_readable($file)) {
header('Content-Length: '. filesize($file));
$fp = fopen($file, "r");
while (! feof($fp)) {
print fread($fp,1024*32);
flush();
}
fclose($fp);
}
}
/**
* Inline file
*/
function InlineFile($file) {
$this->GetMimeFile ('', basename($file));
print ($file <> 'style.css') ? base64_decode($this->binary_files[$file]) : $this->binary_files[$file];
}
// LIST VIEW
function ListView() {
switch ($this->type) {
case 'Network': $items = $this->info['workgroups']; break;
case 'Workgroup': $items = $this->info['servers']; break;
case 'Server': $items = $this->info['shares']; break;
default: $items = $this->info['files'];
$items_are_files = true;
break;
}
if (is_array($items)) {
$index = $this->SortItems($items);
$columns = $this->MakeColumns($items);
// print columns headers
if ($items_are_files) $headers .= $this->Checkbox('chkall','',false,'javascript:sel_all()');
$headers .= $this->Image($_SERVER['SCRIPT_NAME'].'/images/'.strtolower($_SESSION['order'][1]).".jpg", ' ', 'align="absmiddle"');
$headers .= $this->Link("?O=N",sprintf($columns[0],$this->GetString(1)));
if ($items_are_files) {
$headers .= $this->Link("?O=S",sprintf($columns[1], $this->GetString(2)));
if ($this->type <> 'Printer') {
$headers .= $this->Link("?O=M",sprintf($columns[3], $this->GetString(4)));
$headers .= $this->Link("?O=A",sprintf($columns[4], $this->GetString(5)));
}
} else {
$headers .= $this->Link("?O=M",sprintf($columns[2], $this->GetString(3)));
}
// back item
if ($this->path <> '') {
if ($items_are_files) $rows .= $this->Checkbox('back','1');
$rows .= $this->Image($_SERVER['SCRIPT_NAME'].'/images/dotdot.jpg', '[DIR]', 'align="absmiddle"');
$rows .= $this->Link($_SERVER['SCRIPT_NAME'].'/'.dirname($this->path), sprintf($columns[0], '..'))."n";
}
// print rows
foreach ($index as $file) {
if ($items_are_files) $rows .= $this->Checkbox('selected[]',($this->type == 'Printer') ? $file['info']['id'] : $file['name']);
$rows .= $this->Image($_SERVER['SCRIPT_NAME'].'/images/'.strtolower($file['info']['type']).".jpg", ($file['info']['type'] == 'File') ? '[ ]' :'[DIR]', 'align="absmiddle"');
$path = ($this->type == 'Printer') ? '' : ereg_replace('/$','', $this->GetUrl()).'/'.urlencode($file['name']);
$rows .= $this->Em($this->Link($path, sprintf($columns[0], $file['name'])),$_SESSION['order'][0] == 'N');
if ($items_are_files) {
$rows .= $this->Em(sprintf($columns[1], ($file['info']['type'] == 'File' OR $file['info']['type'] == 'PrintJob') ? $this->FormatBytes($file['info']['size']) : ''),$_SESSION['order'][0] == 'S');
if ($this->type <> 'Printer') {
$rows .= $this->Em(sprintf($columns[3], date($this->GetString(6),$file['info']['time'])),$_SESSION['order'][0] == 'M');
$rows .= $this->Em(sprintf($columns[4], str_replace(array('A','D'),'',$file['info']['attr'])),$_SESSION['order'][0] == 'A');
}
} else {
$rows .= $this->Em(sprintf($columns[2], $file['info']['comment']),$_SESSION['order'][0] == 'M');
}
$rows .= "n";
}
}
$this->javascript =
"<script language="JavaScript">n".
" function sel_all() {n".
" with (document.d_form) {n".
" for (i=0; i<elements.length; i++) {n".
" ele = elements[i];n".
" if (ele.type=="checkbox")n".
" ele.checked = ! ele.checked;n".
" }n".
" }n".
" }n".
"</script>n";
if ($items_are_files) {
$form .= $this->Input('m', 'ListViewAction', 'HIDDEN');
$form .= '<p>'.$this->Input('do', $this->GetString(($this->type == 'Printer')? 10 : 8), 'SUBMIT').' '.$this->Input('file','','FILE').$this->Input('do', $this->GetString(($this->type == 'Printer') ? 7 : 9), 'SUBMIT').'</p>';
}
return $this->Form($this->Block('columns',$this->Pre($headers)).$this->Pre($rows).$form,'POST',$this->GetUrl());
}
/**
* Form action
*/
function ListViewAction () {
if ($_POST['do'] == $this->GetString(9)) $this->Samba('put');
else if ($_POST['do'] == $this->GetString(7)) $this->Samba('print');
else if ($_POST['do'] == $this->GetString(8))
if (is_array($_POST['selected']))
foreach ($_POST['selected'] as $filename) $this->Samba('delete', $filename);
else if ($_POST['do'] == $this->GetString(10))
if (is_array($_POST['selected']))
foreach ($_POST['selected'] as $id) $this->Samba('cancel', $id);
if (! $_SESSION['SmbWebClient_Debug']) {
header("Location: ".$this->GetUrl());
exit;
}
}
/**
* Makes an index to show files
*/
function SortItems ($items) {
// storing order
if (! isset($_SESSION['order'])) {
$_SESSION['order'] = 'NA';
} elseif ($_GET['O']) {
if ($_GET['O'] <> $_SESSION['order'][0]) {
$_SESSION['order'] = $_GET['O'].'A';
} else {
if ($_SESSION['order'][1] == 'D')
$_SESSION['order'] = $_GET['O'].'A';
else
$_SESSION['order'] = $_GET['O'].'D';
}
}
$index = array();
foreach ($items as $name => $info) $this->InsertItem ($index, $name, $info);
return $index;
}
/**
* Insert a file in order
*/
function InsertItem(&$index, $name, $info) {
if (count($index) == 0) {
$index[] = array ('name' => $name, 'info' => $info);
} else {
$index2 = array();
$inserted = false;
for ($i = 0; $i < count($index); $i++) {
if ((! $inserted) AND $this->GreaterThan($index[$i]['name'], $index[$i]['info'], $name, $info)) {
$index2[] = array ('name' => $name, 'info' => $info);
$inserted = true;
}
$index2[] = $index[$i];
}
if (! $inserted) $index2[] = array ('name' => $name, 'info' => $info);
$index = $index2;
}
}
/**
* Compares two file records
*/
function GreaterThan($name1, $info1, $name2, $info2) {
switch ($_SESSION['order']) {
case 'SA': return ($info1['size'] > $info2['size'] OR ($info1['size'] == $info2['size'] AND strtolower($name1) > strtolower($name2)));
case 'SD': return ($info1['size'] < $info2['size'] OR ($info1['size'] == $info2['size'] AND strtolower($name1) < strtolower($name2)));
case 'MA': return ($info1['time'] > $info2['time'] OR $info1 ['comment'] > $info2['comment']);
case 'MD': return ($info1['time'] < $info2['time'] OR $info1 ['comment'] < $info2['comment']);
case 'AA': return ($info1['attr'] > $info2['attr']);
case 'AD': return ($info1['attr'] < $info2['attr']);
case 'NA': return (strtolower($name1) > strtolower($name2));
case 'ND':
default: return (strtolower($name1) < strtolower($name2));
}
}
/**
* Get columns width
*/
function MakeColumns ($items) {
$max = array (10,10,10,strlen(date($this->GetString(6),time())),strlen($this->GetString(5)));
foreach ($items as $name => $info) {
if (strlen($name) > $max[0]) $max[0] = strlen($name);
if (strlen($this->FormatBytes($info['size'])) > $max[1]) $max[1] = strlen($this->FormatBytes($info['size']));
if (strlen($info['comment']) > $max[2]) $max[2] = strlen($info['comment']);
}
$fmt[0] = " %-{$max[0]}.{$max[0]}s ";
$fmt[1] = " %{$max[1]}.{$max[1]}s ";
$fmt[2] = " %-{$max[2]}.{$max[2]}s ";
$fmt[3] = " %-{$max[3]}.{$max[3]}s ";
$fmt[4] = " %-{$max[4]}.{$max[4]}s ";
return $fmt;
}
/**
* Print KB
*/
function FormatBytes ($bytes) {
if ($bytes < 1024) return "1 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";
}
/**
* Time from smbclient output format
*/
function ParseTime ($m, $d, $y, $hhiiss) {
$his= split(':', $hhiiss);
$im = 1 + strpos("JanFebMarAprMayJunJulAgoSepOctNovDec", $m) / 3;
return mktime($his[0], $his[1], $his[2], $im, $d, $y);
}
// MISC.
/**
* Makes a directory recursively
*/
function MakeDirectory ($path, $mode = 0777) {
if (strlen($path) == 0) return 0;
if (is_dir($path)) return 1;
elseif (dirname($path) == $path) return 1;
return ($this->MakeDirectory(dirname($path), $mode) and mkdir($path, $mode));
}
/**
* Debugging
*/
function Debug ($message, $level = 1) {
if (isset($this->get['debug'])) {
$_SESSION['SmbWebClient_Debug'] = $this->get['debug'];
unset($this->get['debug']);
}
if ($level <= $_SESSION['SmbWebClient_Debug']) {
if (! isset($this->debug_header)) {
$this->GetMimeFile('', 'debug.txt');
$this->debug_header = 1;
}
print $message;
}
}
/**
* Logging
*/
function Log () {
if (cfgLogFile <> '' AND ($f = fopen(cfgLogFile, 'a'))) {
fputs ($f, "{$_SERVER['REMOTE_ADDR']} - {$_SESSION['SmbWebClient_Login']} [".date('d/M/Y:h:i:s O')."] "GET /{$this->path} HTTP/1.1" 200 ".intval($this->size)." "{$_SERVER['REQUEST_URI']}" "{$_SERVER['HTTP_USER_AGENT']}"n");
fclose ($f);
}
}
/**
* User authentification
*/
function UserAuth () {
if ($_POST['login']) {
// form action
$_SESSION['SmbWebClient_Login'] = $_POST['login'];
$_SESSION['SmbWebClient_Password'] = $_POST['password'];
} else if (isset($this->get['auth']) OR !isset($_SESSION['SmbWebClient_Login'])) {
// form
print $this->Page ("", $this->Block('authform',$this->Form(
$this->GetString(11).'<br />'.
$this->Input('login').'<br />'.
$this->GetString(12).'<br />'.
$this->Input('password', '', 'PASSWORD').'<br />'.
$this->Input('submit', $this->GetString(13), 'SUBMIT')
,'POST',$this->GetUrl())));
exit;
}
$this->auth = "{$_SESSION['SmbWebClient_Login']}%{$_SESSION['SmbWebClient_Password']}";
}
// HTML WIDGETS
function Page ($title, $content) {
return
"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">n".
"<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{$_SESSION['lang']}" lang="{$_SESSION['lang']}">n".
"<head>n".
" <title>{$title}</title>n".
" <link rel="stylesheet" type="text/css" href="".$_SERVER['SCRIPT_NAME']."/style.css" />n".
$this->javascript.
"</head>n".
"<body>n{$content}n</body>n</html>";
}
function Block ($id='', $content='') { return "n<div id="$id">".$content."</div>"; }
function Form ($content, $method="POST", $action=".", $name="d_form", $enctype="multipart/form-data") { return "<form name="$name" method="$method" action="$action" enctype="$enctype">$content</form>n"; }
function Input ($name, $value="", $type="text") { return "<input type="$type" name="$name" value="$value" />"; }
function CheckBox ($name, $value="", $checked=false, $onclick="") {
$checked = ($checked) ? "CHECKED" : "";
$onclick = (trim($onclick) <> '') ? "onclick="$onclick"" : "";
return "<input type="checkbox" name="$name" value="$value" $checked $onclick />";
}
function Image ($src, $alt="", $ext = '') { return "<img src="$src" alt="$alt" $ext />"; }
function Link ($url, $text, $onclick="") {
$onclick = (trim($onclick) <> '') ? "onclick="$onclick"" : "";
return ($url == '') ? $text : "<a href="$url" $onclick>$text</a>";
}
function Em ($text, $optional=true) { return ($optional) ? "<em>{$text}</em>" : $text; }
function Pre ($text) { return "<pre>{$text}</pre>n"; }
}
session_start();
set_time_limit(1200);
clearstatcache();
$smb = new SmbWebClient;
$smb->Run();
?>
SMB Web Client
Script PHP que permite acceder a redes Windows a traves del navegador.
Descargar adjuntos
COMPARTE ESTE TUTORIAL
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
Hola. Yo solo tengO un problema con esta aplicacion, no puedo descargar archivos con la opcion de descargar archivo en formato .zip, si crea el archivo pero con o bytes y sin ningun archivo dentro. como resuelvo esto?
No me está funcionando el programilla. Parece tener problemas con las comillas simples asi (barra invertida comilla) esto funciona bien tambien con un servidor windows verdad?