123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618 |
- <?php
- /* For licensing terms, see /license.txt */
- /**
- * Build the comunication with the SOAP server Compilatio.net
- * call severals methods for the file management in Compilatio.net.
- *
- * @version: 2.0
- */
- class Compilatio
- {
- /** Identification key for the Compilatio account*/
- public $key;
- /** Webservice connection*/
- public $soapcli;
- private $transportMode;
- private $maxFileSize;
- private $wgetUri;
- private $wgetLogin;
- private $wgetPassword;
- private $proxyHost;
- private $proxyPort;
- /**
- * Compilatio constructor.
- */
- public function __construct()
- {
- if (empty(api_get_configuration_value('allow_compilatio_tool')) ||
- empty(api_get_configuration_value('compilatio_tool'))
- ) {
- throw new Exception('Compilatio not available');
- }
- $settings = api_get_configuration_value('compilatio_tool');
- if (isset($settings['settings'])) {
- $settings = $settings['settings'];
- } else {
- throw new Exception('Compilatio config available');
- }
- $key = $this->key = $settings['key'];
- $urlsoap = $settings['soap_url'];
- $proxyHost = $this->proxyHost = $settings['proxy_host'];
- $proxyPort = $this->proxyPort = $settings['proxy_port'];
- $this->transportMode = $settings['transport_mode'];
- $this->maxFileSize = $settings['max_filesize'];
- $this->wgetUri = $settings['wget_uri'];
- $this->wgetLogin = $settings['wget_login'];
- $this->wgetPassword = $settings['wget_password'];
- $soapVersion = 2;
- try {
- if (!empty($key)) {
- $this->key = $key;
- if (!empty($urlsoap)) {
- if (!empty($proxyHost)) {
- $param = [
- 'trace' => false,
- 'soap_version' => $soapVersion,
- 'exceptions' => true,
- 'proxy_host' => '"'.$proxyHost.'"',
- 'proxy_port' => $proxyPort,
- ];
- } else {
- $param = [
- 'trace' => false,
- 'soap_version' => $soapVersion,
- 'exceptions' => true,
- ];
- }
- $this->soapcli = new SoapClient($urlsoap, $param);
- } else {
- throw new Exception('WS urlsoap not available');
- }
- } else {
- throw new Exception('API key not available');
- }
- } catch (SoapFault $fault) {
- $this->soapcli = "Error constructor compilatio $fault->faultcode $fault->faultstring ";
- } catch (Exception $e) {
- $this->soapcli = "Error constructor compilatio with urlsoap $urlsoap ".$e->getMessage();
- }
- }
- /**
- * @return string
- */
- public function getKey()
- {
- return $this->key;
- }
- /**
- * @param mixed $key
- *
- * @return Compilatio
- */
- public function setKey($key)
- {
- $this->key = $key;
- return $this;
- }
- /**
- * @return mixed
- */
- public function getTransportMode()
- {
- return $this->transportMode;
- }
- /**
- * @param mixed $transportMode
- *
- * @return Compilatio
- */
- public function setTransportMode($transportMode)
- {
- $this->transportMode = $transportMode;
- return $this;
- }
- /**
- * @return mixed
- */
- public function getMaxFileSize()
- {
- return $this->maxFileSize;
- }
- /**
- * @param mixed $maxFileSize
- *
- * @return Compilatio
- */
- public function setMaxFileSize($maxFileSize)
- {
- $this->maxFileSize = $maxFileSize;
- return $this;
- }
- /**
- * @return mixed
- */
- public function getWgetUri()
- {
- return $this->wgetUri;
- }
- /**
- * @param mixed $wgetUri
- *
- * @return Compilatio
- */
- public function setWgetUri($wgetUri)
- {
- $this->wgetUri = $wgetUri;
- return $this;
- }
- /**
- * @return mixed
- */
- public function getWgetLogin()
- {
- return $this->wgetLogin;
- }
- /**
- * @param mixed $wgetLogin
- *
- * @return Compilatio
- */
- public function setWgetLogin($wgetLogin)
- {
- $this->wgetLogin = $wgetLogin;
- return $this;
- }
- /**
- * @return mixed
- */
- public function getWgetPassword()
- {
- return $this->wgetPassword;
- }
- /**
- * @param mixed $wgetPassword
- *
- * @return Compilatio
- */
- public function setWgetPassword($wgetPassword)
- {
- $this->wgetPassword = $wgetPassword;
- return $this;
- }
- /**
- * @return mixed
- */
- public function getProxyHost()
- {
- return $this->proxyHost;
- }
- /**
- * @param mixed $proxyHost
- *
- * @return Compilatio
- */
- public function setProxyHost($proxyHost)
- {
- $this->proxyHost = $proxyHost;
- return $this;
- }
- /**
- * @return mixed
- */
- public function getProxyPort()
- {
- return $this->proxyPort;
- }
- /**
- * @param mixed $proxyPort
- *
- * @return Compilatio
- */
- public function setProxyPort($proxyPort)
- {
- $this->proxyPort = $proxyPort;
- return $this;
- }
- /**
- * Method for the file load.
- *
- * @param $title
- * @param $description
- * @param $filename
- * @param $mimeType
- * @param $content
- *
- * @return string
- */
- public function sendDoc($title, $description, $filename, $mimeType, $content)
- {
- try {
- if (!is_object($this->soapcli)) {
- return "Error in constructor compilatio() $this->soapcli";
- }
- $idDocument = $this->soapcli->__call(
- 'addDocumentBase64',
- [
- $this->key,
- utf8_encode(urlencode($title)),
- utf8_encode(urlencode($description)),
- utf8_encode(urlencode($filename)),
- utf8_encode($mimeType),
- base64_encode($content),
- ]
- );
- return $idDocument;
- } catch (SoapFault $fault) {
- return "Erreur sendDoc()".$fault->faultcode." ".$fault->faultstring;
- }
- }
- /**
- * Method for recover a document's information.
- *
- * @param $compiHash
- *
- * @return string
- */
- public function getDoc($compiHash)
- {
- try {
- if (!is_object($this->soapcli)) {
- return "Error in constructor compilatio() ".$this->soapcli;
- }
- $param = [$this->key, $compiHash];
- $idDocument = $this->soapcli->__call('getDocument', $param);
- return $idDocument;
- } catch (SoapFault $fault) {
- return "Erreur getDoc()".$fault->faultcode." ".$fault->faultstring;
- }
- }
- /**
- * method for recover an url document's report.
- *
- * @param $compiHash
- *
- * @return string
- */
- public function getReportUrl($compiHash)
- {
- try {
- if (!is_object($this->soapcli)) {
- return "Error in constructor compilatio() ".$this->soapcli;
- }
- $param = [$this->key, $compiHash];
- $idDocument = $this->soapcli->__call('getDocumentReportUrl', $param);
- return $idDocument;
- } catch (SoapFault $fault) {
- return "Erreur getReportUrl()".$fault->faultcode." ".$fault->faultstring;
- }
- }
- /**
- * Method for deleting a Compialtio's account document.
- *
- * @param $compiHash
- *
- * @return string
- */
- public function deldoc($compiHash)
- {
- try {
- if (!is_object($this->soapcli)) {
- return "Error in constructor compilatio() ".$this->soapcli;
- }
- $param = [$this->key, $compiHash];
- $this->soapcli->__call('deleteDocument', $param);
- } catch (SoapFault $fault) {
- return "Erreur deldoc()".$fault->faultcode." ".$fault->faultstring;
- }
- }
- /**
- * Method for start the analysis for a document.
- *
- * @param $compiHash
- *
- * @return string
- */
- public function startAnalyse($compiHash)
- {
- try {
- if (!is_object($this->soapcli)) {
- return "Error in constructor compilatio() ".$this->soapcli;
- }
- $param = [$this->key, $compiHash];
- $this->soapcli->__call('startDocumentAnalyse', $param);
- } catch (SoapFault $fault) {
- return "Erreur startAnalyse()".$fault->faultcode." ".$fault->faultstring;
- }
- }
- /**
- * Method for recover the account's quota.
- *
- * @return string
- */
- public function getQuotas()
- {
- try {
- if (!is_object($this->soapcli)) {
- return "Error in constructor compilatio() ".$this->soapcli;
- }
- $param = [$this->key];
- $resultat = $this->soapcli->__call('getAccountQuotas', $param);
- return $resultat;
- } catch (SoapFault $fault) {
- return "Erreur getQuotas()".$fault->faultcode." ".$fault->faultstring;
- }
- }
- /**
- * Method for identify a file extension and the possibility that the document can be managed by Compilatio.
- *
- * @param $filename
- *
- * @return bool
- */
- public static function verifiFileType($filename)
- {
- $types = ['doc', 'docx', 'rtf', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'pdf', 'txt', 'htm', 'html'];
- $extension = substr($filename, strrpos($filename, '.') + 1);
- $extension = strtolower($extension);
- return in_array($extension, $types);
- }
- /**
- * Fonction affichage de la barre de progression d'analyse version 3.1.
- *
- * @param string $status From the document
- * @param int $pour
- * @param array $text Array includes the extract from the text
- *
- * @return string
- */
- public static function getProgressionAnalyseDocv31($status, $pour = 0, $text = [])
- {
- $loading = Display::returnFontAwesomeIcon('spinner', null, true, 'fa-spin');
- $loading .= ' ';
- //$refreshReturn = Display::url('javascript:window.location.reload(false);', $loading);
- switch ($status) {
- case 'ANALYSE_IN_QUEUE':
- $content = $loading.$text['analysisinqueue'];
- break;
- case 'ANALYSE_PROCESSING':
- $content = $loading.$text['analysisinfinalization'];
- break;
- default:
- $content = Display::bar_progress($pour, true);
- break;
- }
- return $content;
- }
- /**
- * Method for display the PomprseuilmankBar (% de plagiat).
- *
- * @param $index
- * @param $weakThreshold
- * @param $highThreshold
- *
- * @return string
- */
- public static function getPomprankBarv31(
- $index,
- $weakThreshold,
- $highThreshold
- ) {
- $index = round($index);
- $pour = round((50 * $index) / 100);
- $return = '';
- $class = 'error';
- if ($index < $weakThreshold) {
- $class = 'success';
- } else {
- if ($index >= $weakThreshold && $index < $highThreshold) {
- $class = 'warning';
- }
- }
- $return .= Display::bar_progress($index, true, null, $class);
- return $return;
- }
- /**
- * Method for validation of hash.
- *
- * @param string $hash
- *
- * @return bool
- */
- public static function isMd5($hash)
- {
- return preg_match('`^[a-f0-9]{32}$`', $hash);
- }
- /**
- * function for delete a document of the compilatio table if plagiarismTool is Compilatio.
- *
- * @param int $courseId
- * @param int $itemId
- *
- * @return bool
- */
- public static function plagiarismDeleteDoc($courseId, $itemId)
- {
- if (api_get_configuration_value('allow_compilatio_tool') === false) {
- return false;
- }
- $table = Database:: get_course_table(TABLE_PLAGIARISM);
- $params = [$courseId, $itemId];
- Database::delete($table, ['c_id = ? AND document_id = ?' => $params]);
- return true;
- }
- /**
- * @param int $courseId
- * @param int $documentId
- * @param int $compilatioId
- */
- public function saveDocument($courseId, $documentId, $compilatioId)
- {
- $documentId = (int) $documentId;
- $courseId = (int) $courseId;
- $table = Database::get_course_table(TABLE_PLAGIARISM);
- $params = [
- 'c_id' => $courseId,
- 'document_id' => $documentId,
- 'compilatio_id' => $compilatioId,
- ];
- Database::insert($table, $params);
- }
- /**
- * @param int $documentId
- * @param int $courseId
- *
- * @return string md5 value
- */
- public function getCompilatioId($documentId, $courseId)
- {
- $documentId = (int) $documentId;
- $courseId = (int) $courseId;
- $table = Database::get_course_table(TABLE_PLAGIARISM);
- $sql = "SELECT compilatio_id FROM $table
- WHERE document_id = $documentId AND c_id= $courseId";
- $result = Database::query($sql);
- $result = Database::fetch_object($result);
- if ($result) {
- return (string) $result->compilatio_id;
- }
- return 0;
- }
- /**
- * @param int $workId
- *
- * @return string
- */
- public function giveWorkIdState($workId)
- {
- $compilatioImgFolder = api_get_path(WEB_CODE_PATH).'plagiarism/compilatio/img/';
- $courseId = api_get_course_int_id();
- $compilatioId = $this->getCompilatioId($workId, $courseId);
- $actionCompilatio = '';
- $status = '';
- if (!empty($compilatioId)) {
- if (self::isMd5($compilatioId)) {
- // if compilatio_id is a hash md5, we call the function of the compilatio's
- // webservice who return the document's status
- $soapRes = $this->getDoc($compilatioId);
- if (isset($soapRes->documentStatus)) {
- $status = $soapRes->documentStatus->status;
- }
- } else {
- // if the compilatio's hash is not a valide hash md5,
- // we return à specific status (cf : IsInCompilatio() )
- $status = 'NOT_IN_COMPILATIO';
- $actionCompilatio = get_lang('Verify that it contains text (and not only images)').'<br/>'.
- get_lang('and that it is not corrupted');
- }
- switch ($status) {
- case 'ANALYSE_COMPLETE':
- $urlRapport = $this->getReportUrl($compilatioId);
- $actionCompilatio .= self::getPomprankBarv31(
- $soapRes->documentStatus->indice,
- 10,
- 35
- )
- .Display::url(
- get_lang('Analyse'),
- $urlRapport,
- ['class' => 'btn btn-primary btn-xs', 'target' => '_blank']
- );
- break;
- case 'ANALYSE_PROCESSING':
- $actionCompilatio .= "<div style='font-weight:bold;text-align:left'>"
- .get_lang('AnalyseInProgress')
- ."</div>";
- $actionCompilatio .= "<div style='font-size:80%;font-style:italic;margin-bottom:5px;'>"
- .get_lang('AnalysePercentage')
- ."</div>";
- $text = [];
- $text['analysisinqueue'] = get_lang('Pending Analysis');
- $text['analysisinfinalization'] = get_lang('AnalyseEnding');
- $text['refresh'] = get_lang('Refresh');
- $actionCompilatio .= self::getProgressionAnalyseDocv31(
- $status,
- $soapRes->documentStatus->progression,
- $text
- );
- break;
- case 'ANALYSE_IN_QUEUE':
- $loading = Display::returnFontAwesomeIcon('spinner', null, true, 'fa-spin');
- $actionCompilatio .= $loading.' '.get_lang('Waiting for analysis');
- break;
- case 'BAD_FILETYPE':
- $actionCompilatio .= get_lang('File format not supported')
- .'<br/>'
- .get_lang('If the file is in pdf format, check that it is not protected by modification.');
- break;
- case 'BAD_FILESIZE':
- $actionCompilatio .= get_lang('The file is too big to upload.');
- break;
- }
- }
- $result = $workId.'|'.$actionCompilatio.'|'.$status.'|';
- return $result;
- }
- }
|