Problemi Docebo in locale

Domande sulle funzionalità di backend: amministrazione utenti e corsi, certificati, iscrizioni, report, ...
marcello
FormaLms User
Posts: 51
Joined: Tue Apr 10, 2012 9:41 am

Re: Problemi Docebo in locale

Post by marcello »

Sì, tutto provato.
Utilizzati Internet explorer, Chrome e Firefox.
Ripeto, per il momento mi arrendo, alzo bandiera bianca.
Grazie per aver combattuto al mio fianco ;-)
luca

Re: Problemi Docebo in locale

Post by luca »

Buongiorno
vorrei contribuire a questa discussione, in quanto mi sto battendo con lo stesso problema. Anch'io ho installato Docebo 4.05 in locale, con Apache 2.2.16, PHP 5.2.14 e MySQL 5.1.57 (niente EasyPHP, XAMPP o simili). Il mio pc è un Win7 32bit, e la cartella HTDOCS di Apache si trova sul disco D. Ho fatto tutte le prove possibili, anche cercando di analizzare il codice per vedere dove si genera l'errore.

Non ho possibilità di capire il perché non funziona l'upload con modalità "FS", mentre ho qualche informazione in più per quanto riguarda l'upload "FTP".

Con la console del server FTP aperta, quando lancio l'upload di un file e/o di un oggetto scorm, vedo che Docebo fa correttamente il login sul server con i parametri impostati, ma si disconnette subito dopo, senza neanche TENTARE un qualsiasi upload, non vedo né PUT Né STORE né niente di simile nel log della sessione.

Ho naturalmente provato anche il server da un client normale, e tutto funziona regolarmente.

Io credo il problema risieda nella lib.upload.php, ma non ho sufficiente dimestichezza con il pattern MVC di Docebo per fare un debug efficace.

Spero questo possa aiutare VOI ad aiutare NOI. :D
luca

Re: Problemi Docebo in locale

Post by luca »

Buongiorno.

Sono riuscito a scoprire dove falliva il caricameno. Nella funzione "sl_upload" della libreria lib.upload.php, subito prima di richiamare le funzioni che fanno l'upload vero e proprio (sl_upload_ftp, sl_upload_fs e sl_upload_cgi) c'è un controllo sul mimetype del file che si sta caricando. Quel controllo, almeno sul mio ambiente, fallisce SEMPRE, quindi l'upload effettivo non viene neanche scatenato, e la procedura non funziona. Commentato quel controllo, l'upload funziona regolarmente in modalità FS. Per far funzionare la modalità FTP, ho dovuto prima mettere un comando "ftp_pasv($ftpConn, true)" per forzare la modalità passiva sul server, e poi commentare i comandi CHMOD che mi falliscono. Credo che i comandi CHMOD falliscano perché mi trovo su di un ambiente Windows, e l'impostazione standard del firewall mi costringa ad usare la modalità passiva.

Per quanto riguarda il controllo sul mimetype, vi posso dire che durante le mie prove è venuto fuori che Docebo tenta di usare la funzione mime_content_type, però questa non restituisce nessun valore. Di più non so dirvi.

Se volete, posso inviarvi il file da me "pasticciato", in modo che possiate testarlo meglio di quanto possa fare io.

Hope this help :)
User avatar
alberto
FormaLms Guru
Posts: 1136
Joined: Fri Mar 02, 2012 9:18 am
Contact:

Re: Problemi Docebo in locale

Post by alberto »

luca wrote: ...

Se volete, posso inviarvi il file da me "pasticciato", in modo che possiate testarlo meglio di quanto possa fare io.

Hope this help :)
Passa passa che ci diamo un'occhiata ;)
luca

Re: Problemi Docebo in locale

Post by luca »

alberto wrote:Passa passa che ci diamo un'occhiata ;)
Non vedo modi per fare attach di file, vi copio tutto il contenuto del file <root>\docebo40\lib\lib.upload.php da me "pasticciato" :D

Code: Select all

<?php defined("IN_DOCEBO") or die('Direct access is forbidden.');

/* ======================================================================== \
| 	DOCEBO - The E-Learning Suite											|
| 																			|
| 	Copyright (c) 2008 (Docebo)												|
| 	http://www.docebo.com													|
|   License 	http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt		|
\ ======================================================================== */

/**
 * @package 	admin-library
 * @category 	File managment
 * @author 		Emanuele Sandri <esandri@tiscali.it>
 * @version 	$Id: lib.upload.php 193 2006-03-31 07:31:01Z fabio $
 */

$ftpConn = NULL;	// Chache for the last connection

function sl_open_fileoperations() {
	$uploadType = Get::cfg('uploadType');
	if( $uploadType == "ftp" ) {
		return sl_open_fileoperations_ftp();
	} elseif( $uploadType == "cgi" ) {
		return TRUE;
	} else {
		return TRUE;
	}
}

function sl_close_fileoperations() {
	$uploadType = Get::cfg('uploadType');
	if( $uploadType == "ftp" ) {
		return sl_close_fileoperations_ftp();
	} elseif( $uploadType == "cgi" ) {
		return TRUE;
	} else {
		return TRUE;
	}
}

function sl_mkdir( $path, $mode ) {
	$uploadType = Get::cfg('uploadType');

	if( $uploadType == "ftp" ) {
		return sl_mkdir_ftp( $path, $mode );
	} elseif( $uploadType == "cgi" ) {
		return FALSE;
	} else {
		$result = mkdir( $GLOBALS['where_files_relative'].$path, $mode );
		return $result;
	}
}

function sl_fopen( $filename, $mode ) {
	$uploadType = Get::cfg('uploadType');

	$mfirst = $mode{0};
	if( $uploadType == "ftp" && $mfirst != 'r' ) {
		return sl_fopen_ftp( $filename, $mode );
	} elseif( $uploadType == "cgi" ) {
		return FALSE;
	} else {
		return fopen( $GLOBALS['where_files_relative'].$filename, $mode);
	}
}

function sl_upload( $srcFile, $dstFile ) {
	$uploadType = Get::cfg('uploadType');

	// check if the mime type is allowed by the whitelist
	// if the whitelist is empty all types are accepted
	require_once(_lib_.'/lib.mimetype.php');
	$upload_whitelist =Get::sett('file_upload_whitelist', 'zip,doc,xls,ppt,jpg,gif,png,txt,docx,pptx,xlsx,pdf');
	$upload_whitelist_arr =explode(',', trim($upload_whitelist, ','));
	
	
	if (!empty($upload_whitelist_arr)) {
	
		$valid_ext = false;
		
		$file_ext =strtolower(substr(strrchr($dstFile, "."), 1));
		foreach ($upload_whitelist_arr as $k=>$v) { // remove extra spaces and set lower case
			$ext =trim(strtolower($v));
			$mt =mimetype($ext);
			if ($mt) { $mimetype_arr[]=$mt; }
			if ($ext == $file_ext) { $valid_ext =true; }
		}
		
		if (method_exists('finfo', 'file')) {
			$finfo =new finfo(FILEINFO_MIME_TYPE);
			$file_mime_type =$finfo->file($srcFile);
			
		}
		else {
			$file_mime_type =mime_content_type($srcFile);
		}
		
		/*
		if (!$valid_ext || !in_array($file_mime_type, $mimetype_arr)) {
			
			ftp_exec ( $GLOBALS['ftpConn'], "STORISPONDENDOFALSE!!!!!!" );
			return false;
		}
		*/
	}
	

	$dstFile =stripslashes($dstFile);
	if( $uploadType == "ftp" ) {
		return sl_upload_ftp( $srcFile, $dstFile );
	} elseif( $uploadType == "cgi" ) {
		return sl_upload_cgi( $srcFile, $dstFile );
	} else {
		return sl_upload_fs( $srcFile, $dstFile );
	}
}

function sl_touch( $filename, $time ) {
	$uploadType = Get::cfg('uploadType');
	if( $uploadType == "ftp" ) {
		return TRUE;
	} elseif( $uploadType == "cgi" ) {
		return TRUE;
	} else {
		return touch( $GLOBALS['where_files_relative'].$filename, $time );
	}
}

function sl_is_file( $filename ) {
	return @is_file($GLOBALS['where_files_relative'].$filename);
}

function sl_is_dir( $path ) {
	return @is_dir($GLOBALS['where_files_relative'].$path);
}

function sl_is_readable( $filename ) {
	return is_readable( $GLOBALS['where_files_relative'].$filename );
}

function sl_is_writeable( $filename ) {
	return is_writeable( $GLOBALS['where_files_relative'].$filename );
}

function sl_filesize( $filename ) {
	return filesize( $GLOBALS['where_files_relative'].$filename );
}

function sl_filemtime($filename ) {
	return filemtime( $GLOBALS['where_files_relative'].$filename );
}

function sl_file_exists( $filename ) {
	return file_exists( $GLOBALS['where_files_relative'].$filename );
}

function sl_chmod( $filename, $mode ) {
	return chmod( $GLOBALS['where_files_relative'].$filename, $mode );
}

function sl_copy( $srcFile, $dstFile ) {
	$uploadType = Get::cfg('uploadType');
	if( $uploadType == "ftp" ) {
		return sl_upload_ftp( $GLOBALS['where_files_relative'].$srcFile, $dstFile );
	} elseif( $uploadType == "cgi" ) {
		return sl_upload_cgi( $srcFile, $dstFile );
	} else {
		return copy($GLOBALS['where_files_relative'].$srcFile, $GLOBALS['where_files_relative'].$dstFile);
	}
}

/** file system implementation **/

function sl_upload_fs( $srcFile, $dstFile ) {

	$re = move_uploaded_file($srcFile, $GLOBALS['where_files_relative'].$dstFile);
	if(!$re) die("Error on move_uploaded_file from: $srcFile to $dstFile");
	return $re;
}

/**
 * Copy a file, or recursively copy a folder and its contents
 *
 * @author      Aidan Lister <aidan@php.net>
 * @version     1.0.1
 * @param       string   $source    Source path
 * @param       string   $dest      Destination path
 * @return      bool     Returns TRUE on success, FALSE on failure
 */
function sl_copyr($source, $dest)
{
    // Simple copy for a file
    if (is_file($GLOBALS['where_files_relative'].$source)) {
        return sl_copy($source, $dest);
    }

    // Make destination directory
    if (!is_dir($GLOBALS['where_files_relative'].$dest)) {
        sl_mkdir($dest);
    }

    // Loop through the folder
    $dir = dir($GLOBALS['where_files_relative'].$source);
    while (false !== $entry = $dir->read()) {
        // Skip pointers
        if ($entry == '.' || $entry == '..') {
            continue;
        }

        // Deep copy directories
        if ($dest !== "$source/$entry") {
            sl_copyr("$source/$entry", "$dest/$entry");
        }
    }

    // Clean up
    $dir->close();
    return true;
}


/** Ftp implementation **/

function sl_open_fileoperations_ftp() {
	$ftpuser = Get::cfg('ftpuser');
	$ftppass = Get::cfg('ftppass');
	$ftphost = Get::cfg('ftphost');
	$ftpport = Get::cfg('ftpport');

	$result = FALSE;

	$timeout = Get::cfg('ftptimeout', 0);
	if( $timeout == 0 ) {
		$timeout = ini_get('max_execution_time');
		if( $timeout == 0 ) {
			$timeout = 20;
		} elseif( $timeout > 60 ) {
			$timeout = 50;
		} else {
			$timeout = round(($timeout*8)/10);
		}
	}

	$GLOBALS['ftpConn'] = @ftp_connect( $ftphost, $ftpport, $timeout );
	if( $GLOBALS['ftpConn'] === FALSE ) {
		return FALSE;
	}
	if( @ftp_login($GLOBALS['ftpConn'], $ftpuser, $ftppass) )
		return TRUE;
	else
		return FALSE;
}

function sl_close_fileoperations_ftp() {
	if($GLOBALS['ftpConn'] !== false) ftp_close($GLOBALS['ftpConn']);
}

function sl_upload_ftp( $srcFile, $dstFile ) {
	$ftppath = Get::cfg('ftppath')._folder_files_;
	$ftpConn = $GLOBALS['ftpConn'];
	
	//ftp_exec ( $ftpConn, 'CWD' );
	ftp_pasv ( $ftpConn, true );
	
	if( !ftp_put( $ftpConn, $ftppath.$dstFile, $srcFile, FTP_BINARY) ) {
		
		return FALSE;
	} /*
	if( ftp_site( $ftpConn, "CHMOD 0666 $ftppath"."$dstFile" ) === FALSE ) {
		return FALSE;
	}	else {
		return TRUE;
	}	*/
	return TRUE;
}

function sl_mkdir_ftp( $path, $mode = FALSE) {
	$ftppath = Get::cfg('ftppath')._folder_files_;
	$ftpConn = $GLOBALS['ftpConn'];
	if( !@ftp_mkdir($ftpConn, $ftppath.$path) )
		return FALSE;
	/*
	if( $mode !== FALSE ) {
		if( ftp_site( $ftpConn, "CHMOD 0777 $ftppath"."$path"  ) === FALSE ) {
			return FALSE;
		}	else {
			return TRUE;
		}
	}	else {
		return TRUE;
	}
	*/
	return TRUE;
}

function sl_fopen_ftp( $file, $mode ) {
 	// only create file then open it with fopen
	$ftppath = Get::cfg('ftppath')._folder_files_;
	$ftpConn = $GLOBALS['ftpConn'];
	if( !file_exists( $GLOBALS['where_files_relative'].$file ) ) {
   		if( !ftp_put( $ftpConn, $ftppath.$file, dirname(__FILE__)."/nullfile", FTP_BINARY ) ) {
  			return FALSE;
  		} else {
      		/*
			if( ftp_site( $ftpConn, "CHMOD 0666 $ftppath"."$file" ) === FALSE )
      			return FALSE;
			*/
	 	}
  	}
	$ret = @fopen( $GLOBALS['where_files_relative'].$file, $mode );
	return $ret;
}

/** CGI Implementation **/

function sl_upload_cgi( $srcFile, $dstFile ) {
	global $url;
	$ch = curl_init();

	curl_setopt($ch, CURLOPT_URL, $url."testcgi.sh?fname=".$dstFile);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_exec($ch);
	curl_close($ch);

	$hfileSrc = fopen( $srcFile, "rb" );
	$hfileDst = fopen( $dstFile, "wb" );

	while (!feof($hfileSrc)) {
	$buffer = fread($hfileSrc, 8192);
	fwrite( $hfileDst, $buffer );
	}

	fclose( $hfileSrc );
	fclose( $hfileDst );
	return TRUE;
}

/**
 * @param $path pathname for file retriving
 * @return bool
 **/

 function sl_unlink( $path ) {

	 if( !file_exists($GLOBALS['where_files_relative'].$path) ) return true;
	 return @unlink($GLOBALS['where_files_relative'].$path);
 }

?>
Post Reply