public function generateInitialJSCode($datasource, $options, $dbspecification, $debug) { $q = '"'; $generatedPrivateKey = null; $passPhrase = null; $browserCompatibility = null; $scriptPathPrefix = null; $scriptPathSuffix = null; $oAuthProvider = null; $oAuthClientID = null; $oAuthRedirect = null; $dbClass = null; $params = IMUtil::getFromParamsPHPFile(array("generatedPrivateKey", "passPhrase", "browserCompatibility", "scriptPathPrefix", "scriptPathSuffix", "oAuthProvider", "oAuthClientID", "oAuthRedirect", "passwordPolicy", "documentRootPrefix", "dbClass", "nonSupportMessageId", "valuesForLocalContext"), true); $generatedPrivateKey = $params["generatedPrivateKey"]; $passPhrase = $params["passPhrase"]; $browserCompatibility = $params["browserCompatibility"]; $scriptPathPrefix = $params["scriptPathPrefix"]; $scriptPathSuffix = $params["scriptPathSuffix"]; $oAuthProvider = $params["oAuthProvider"]; $oAuthClientID = $params["oAuthClientID"]; $oAuthRedirect = $params["oAuthRedirect"]; $passwordPolicy = $params["passwordPolicy"]; $dbClass = $params["dbClass"]; $nonSupportMessageId = $params["nonSupportMessageId"]; $documentRootPrefix = is_null($params["documentRootPrefix"]) ? "" : $params["documentRootPrefix"]; $valuesForLocalContext = $params["valuesForLocalContext"]; /* * Read the JS programs regarding by the developing or deployed. */ $currentDir = dirname(__FILE__) . DIRECTORY_SEPARATOR; if (file_exists($currentDir . 'INTER-Mediator-Lib.js')) { echo $this->combineScripts($currentDir); } else { readfile($currentDir . 'INTER-Mediator.js'); } /* * Generate the link to the definition file editor */ $relativeToDefFile = ''; $editorPath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'INTER-Mediator-Support'; $defFilePath = $_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_NAME']; while (strpos($defFilePath, $editorPath) !== 0 && strlen($editorPath) > 1) { $editorPath = dirname($editorPath); $relativeToDefFile .= '..' . DIRECTORY_SEPARATOR; } $relativeToDefFile .= substr($defFilePath, strlen($editorPath) + 1); $editorPath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'INTER-Mediator-Support' . DIRECTORY_SEPARATOR . 'defedit.html'; if (file_exists($editorPath)) { $relativeToEditor = substr($editorPath, strlen($_SERVER['DOCUMENT_ROOT'])); $this->generateAssignJS("INTERMediatorOnPage.getEditorPath", "function(){return {$q}{$relativeToEditor}?target={$relativeToDefFile}{$q};}"); } else { $this->generateAssignJS("INTERMediatorOnPage.getEditorPath", "function(){return '';}"); } /* * from db-class, determine the default key field string */ $defaultKey = null; $dbClassName = 'DB_' . (isset($dbspecification['db-class']) ? $dbspecification['db-class'] : (!is_null($dbClass) ? $dbClass : '')); if ($dbClassName !== 'DB_DefEditor' && $dbClassName !== 'DB_PageEditor') { require_once "{$dbClassName}.php"; } else { require_once dirname(__FILE__) . "/INTER-Mediator-Support/{$dbClassName}.php"; } if ((double) phpversion() < 5.3) { $dbInstance = new $dbClassName(); if ($dbInstance != null) { $defaultKey = $dbInstance->getDefaultKey(); } } else { $defaultKey = call_user_func(array($dbClassName, 'defaultKey')); } if ($defaultKey !== null) { $items = array(); foreach ($datasource as $context) { if (!array_key_exists('key', $context)) { $context['key'] = $defaultKey; } $items[] = $context; } $datasource = $items; } /* * Determine the uri of myself */ if (isset($callURL)) { $pathToMySelf = $callURL; } else { if (isset($scriptPathPrefix) || isset($scriptPathSuffix)) { $pathToMySelf = (isset($scriptPathPrefix) ? $scriptPathPrefix : '') . filter_var($_SERVER['SCRIPT_NAME']) . (isset($scriptPathSufix) ? $scriptPathSuffix : ''); } else { $pathToMySelf = filter_var($_SERVER['SCRIPT_NAME']); } } $pathToIMRootDir = ''; if (function_exists('mb_ereg_replace')) { $pathToIMRootDir = mb_ereg_replace(mb_ereg_replace("\\x5c", "/", "^{$documentRootPrefix}" . filter_var($_SERVER['DOCUMENT_ROOT'])), "", mb_ereg_replace("\\x5c", "/", dirname(__FILE__))); } $this->generateAssignJS("INTERMediatorOnPage.getEntryPath", "function(){return {$q}{$pathToMySelf}{$q};}"); $this->generateAssignJS("INTERMediatorOnPage.getIMRootPath", "function(){return {$q}{$pathToIMRootDir}{$q};}"); $this->generateAssignJS("INTERMediatorOnPage.getDataSources", "function(){return ", arrayToJSExcluding($datasource, '', array('password')), ";}"); $this->generateAssignJS("INTERMediatorOnPage.getOptionsAliases", "function(){return ", arrayToJS(isset($options['aliases']) ? $options['aliases'] : array(), ''), ";}"); $this->generateAssignJS("INTERMediatorOnPage.getOptionsTransaction", "function(){return ", arrayToJS(isset($options['transaction']) ? $options['transaction'] : '', ''), ";}"); $this->generateAssignJS("INTERMediatorOnPage.getDBSpecification", "function(){return ", arrayToJSExcluding($dbspecification, '', array('dsn', 'option', 'database', 'user', 'password', 'server', 'port', 'protocol', 'datatype')), ";}"); $isEmailAsUsernae = isset($options['authentication']) && isset($options['authentication']['email-as-username']) && $options['authentication']['email-as-username'] === true; $this->generateAssignJS("INTERMediatorOnPage.isEmailAsUsername", $isEmailAsUsernae ? "true" : "false"); $messageClass = IMUtil::getMessageClassInstance(); $this->generateAssignJS("INTERMediatorOnPage.getMessages", "function(){return ", arrayToJS($messageClass->getMessages(), ''), ";}"); if (isset($options['browser-compatibility'])) { $browserCompatibility = $options['browser-compatibility']; } foreach ($browserCompatibility as $browser => $browserInfo) { if (strtolower($browser) !== $browser) { $browserCompatibility[strtolower($browser)] = $browserCompatibility[$browser]; unset($browserCompatibility[$browser]); } } $this->generateAssignJS("INTERMediatorOnPage.browserCompatibility", "function(){return ", arrayToJS($browserCompatibility, ''), ";}"); $remoteAddr = filter_var($_SERVER['REMOTE_ADDR']); if (is_null($remoteAddr) || $remoteAddr === FALSE) { $remoteAddr = '0.0.0.0'; } $clientIdSeed = time() + $remoteAddr + mt_rand(); $randomSecret = mt_rand(); $clientId = hash_hmac('sha256', $clientIdSeed, $randomSecret); $this->generateAssignJS("INTERMediatorOnPage.clientNotificationIdentifier", "function(){return ", arrayToJS($clientId, ''), ";}"); if ($nonSupportMessageId != "") { $this->generateAssignJS("INTERMediatorOnPage.nonSupportMessageId", "{$q}{$nonSupportMessageId}{$q}"); } $pusherParams = null; if (isset($pusherParameters)) { $pusherParams = $pusherParameters; } else { if (isset($options['pusher'])) { $pusherParams = $options['pusher']; } } if (!is_null($pusherParams)) { $appKey = isset($pusherParams['key']) ? $pusherParams['key'] : "_im_key_isnt_supplied"; $chName = isset($pusherParams['channel']) ? $pusherParams['channel'] : "_im_pusher_default_channel"; $this->generateAssignJS("INTERMediatorOnPage.clientNotificationKey", "function(){return ", arrayToJS($appKey, ''), ";}"); $this->generateAssignJS("INTERMediatorOnPage.clientNotificationChannel", "function(){return ", arrayToJS($chName, ''), ";}"); } $metadata = json_decode(file_get_contents(dirname(__FILE__) . DIRECTORY_SEPARATOR . "metadata.json")); $this->generateAssignJS("INTERMediatorOnPage.metadata", "{version:{$q}{$metadata->version}{$q},releasedate:{$q}{$metadata->releasedate}{$q}}"); if (isset($prohibitDebugMode) && $prohibitDebugMode) { $this->generateAssignJS("INTERMediator.debugMode", "false"); } else { $this->generateAssignJS("INTERMediator.debugMode", $debug === false ? "false" : $debug); } // Check Authentication $boolValue = "false"; $requireAuthenticationContext = array(); if (isset($options['authentication'])) { $boolValue = "true"; } foreach ($datasource as $aContext) { if (isset($aContext['authentication'])) { $boolValue = "true"; $requireAuthenticationContext[] = $aContext['name']; } } $this->generateAssignJS("INTERMediatorOnPage.requireAuthentication", $boolValue); $this->generateAssignJS("INTERMediatorOnPage.authRequiredContext", arrayToJS($requireAuthenticationContext, '')); $ldap = new LDAPAuth(); // for PHP 5.2, 5.3 $this->generateAssignJS("INTERMediatorOnPage.isLDAP", $ldap->isActive ? "true" : "false"); $this->generateAssignJS("INTERMediatorOnPage.isOAuthAvailable", isset($oAuthProvider) ? "true" : "false"); $authObj = new OAuthAuth(); if ($authObj->isActive) { $this->generateAssignJS("INTERMediatorOnPage.oAuthClientID", $q, $oAuthClientID, $q); $this->generateAssignJS("INTERMediatorOnPage.oAuthBaseURL", $q, $authObj->oAuthBaseURL(), $q); $this->generateAssignJS("INTERMediatorOnPage.oAuthRedirect", $q, $oAuthRedirect, $q); $this->generateAssignJS("INTERMediatorOnPage.oAuthScope", $q, implode(' ', $authObj->infoScope()), $q); } $this->generateAssignJS("INTERMediatorOnPage.isNativeAuth", isset($options['authentication']) && isset($options['authentication']['user']) && $options['authentication']['user'][0] === 'database_native' ? "true" : "false"); $this->generateAssignJS("INTERMediatorOnPage.authStoring", $q, isset($options['authentication']) && isset($options['authentication']['storing']) ? $options['authentication']['storing'] : 'cookie', $q); $this->generateAssignJS("INTERMediatorOnPage.authExpired", isset($options['authentication']) && isset($options['authentication']['authexpired']) ? $options['authentication']['authexpired'] : '3600'); $this->generateAssignJS("INTERMediatorOnPage.realm", $q, isset($options['authentication']) && isset($options['authentication']['realm']) ? $options['authentication']['realm'] : '', $q); if (isset($generatedPrivateKey)) { $rsa = new Crypt_RSA(); $rsa->setPassword($passPhrase); $rsa->loadKey($generatedPrivateKey); $rsa->setPassword(); $publickey = $rsa->getPublicKey(CRYPT_RSA_PUBLIC_FORMAT_RAW); $this->generateAssignJS("INTERMediatorOnPage.publickey", "new biRSAKeyPair('", $publickey['e']->toHex(), "','0','", $publickey['n']->toHex(), "')"); if (in_array(sha1($generatedPrivateKey), array('413351603fa756ecd8270147d1a84e9a2de2a3f9', '094f61a9db51e0159fb0bf7d02a321d37f29a715')) && isset($_SERVER['SERVER_ADDR']) && $_SERVER['SERVER_ADDR'] !== '192.168.56.101') { $this->generateDebugMessageJS('Please change the value of $generatedPrivateKey in params.php.'); } } if (isset($passwordPolicy)) { $this->generateAssignJS("INTERMediatorOnPage.passwordPolicy", $q, $passwordPolicy, $q); } else { if (isset($options["authentication"]) && isset($options["authentication"]["password-policy"])) { $this->generateAssignJS("INTERMediatorOnPage.passwordPolicy", $q, $options["authentication"]["password-policy"], $q); } } if (isset($options['credit-including'])) { $this->generateAssignJS("INTERMediatorOnPage.creditIncluding", $q, $options['credit-including'], $q); } // Initial values for local context if (!isset($valuesForLocalContext)) { $valuesForLocalContext = array(); } if (isset($options['local-context'])) { foreach ($options['local-context'] as $item) { $valuesForLocalContext[$item['key']] = $item['value']; } } if (isset($valuesForLocalContext) && is_array($valuesForLocalContext) && count($valuesForLocalContext) > 0) { $this->generateAssignJS("INTERMediatorOnPage.initLocalContext", arrayToJS($valuesForLocalContext)); } }
/** * @param $options * @param null $access * @param bool $bypassAuth */ function processingRequest($access = null, $bypassAuth = false) { $this->logger->setDebugMessage("[processingRequest]", 2); $options = $this->dbSettings->getAuthentication(); $this->outputOfProcessing = array(); $messageClass = IMUtil::getMessageClassInstance(); /* Aggregation Judgement */ $isSelect = $this->dbSettings->getAggregationSelect(); $isFrom = $this->dbSettings->getAggregationFrom(); $isGroupBy = $this->dbSettings->getAggregationGroupBy(); $isDBSupport = $this->dbClass->isSupportAggregation(); if (!$isDBSupport && ($isSelect || $isFrom || $isGroupBy)) { $this->logger->setErrorMessage($messageClass->getMessageAs(1042)); $access = "do nothing"; } else { if ($isDBSupport && ($isSelect && !$isFrom || !$isSelect && $isFrom)) { $this->logger->setErrorMessage($messageClass->getMessageAs(1043)); $access = "do nothing"; } else { if ($isDBSupport && $isSelect && $isFrom && in_array($access, array("update", "new", "create", "delete", "copy"))) { $this->logger->setErrorMessage($messageClass->getMessageAs(1044)); $access = "do nothing"; } } } // Authentication and Authorization $tableInfo = $this->dbSettings->getDataSourceTargetArray(); $access = is_null($access) ? $_POST['access'] : $access; $access = $access == "select" || $access == "load" ? "read" : $access; $this->dbSettings->setRequireAuthentication(false); $this->dbSettings->setRequireAuthorization(false); $this->dbSettings->setDBNative(false); if (!is_null($options) || $access == 'challenge' || $access == 'changepassword' || isset($tableInfo['authentication']) && (isset($tableInfo['authentication']['all']) || isset($tableInfo['authentication'][$access]))) { $this->dbSettings->setRequireAuthorization(true); $this->dbSettings->setDBNative(false); if (isset($options['user']) && $options['user'][0] == 'database_native') { $this->dbSettings->setDBNative(true); } } if (!$bypassAuth && $this->dbSettings->getRequireAuthorization()) { // Authentication required if (strlen($this->paramAuthUser) == 0 || strlen($this->paramResponse) == 0) { // No username or password $access = "do nothing"; $this->dbSettings->setRequireAuthentication(true); } // User and Password are suppried but... if ($access != 'challenge') { // Not accessing getting a challenge. if ($this->dbSettings->isDBNative()) { list($password, $challenge) = $this->decrypting($this->paramCryptResponse); if ($password !== false) { if (!$this->checkChallenge($challenge, $this->clientId)) { $access = "do nothing"; $this->dbSettings->setRequireAuthentication(true); } else { $this->dbSettings->setUserAndPasswordForAccess($this->paramAuthUser, $password); $this->logger->setDebugMessage("[checkChallenge] returns true.", 2); } } else { $this->logger->setDebugMessage("Can't decrypt."); $access = "do nothing"; $this->dbSettings->setRequireAuthentication(true); } } else { $noAuthorization = true; $authorizedGroups = $this->dbClass->getAuthorizedGroups($access); $authorizedUsers = $this->dbClass->getAuthorizedUsers($access); $this->logger->setDebugMessage(str_replace("\n", "", "contextName={$access}/access={$this->dbSettings->getDataSourceName()}/" . "authorizedUsers=" . var_export($authorizedUsers, true) . "/authorizedGroups=" . var_export($authorizedGroups, true)), 2); if (count($authorizedUsers) == 0 && count($authorizedGroups) == 0) { $noAuthorization = false; } else { $signedUser = $this->dbClass->authSupportUnifyUsernameAndEmail($this->dbSettings->getCurrentUser()); if (in_array($signedUser, $authorizedUsers)) { $noAuthorization = false; } else { if (count($authorizedGroups) > 0) { $belongGroups = $this->dbClass->authSupportGetGroupsOfUser($signedUser); $this->logger->setDebugMessage($signedUser . "=belongGroups=" . var_export($belongGroups, true), 2); if (count(array_intersect($belongGroups, $authorizedGroups)) != 0) { $noAuthorization = false; } } } } if ($noAuthorization) { $this->logger->setDebugMessage("Authorization doesn't meet the settings."); $access = "do nothing"; $this->dbSettings->setRequireAuthentication(true); } $signedUser = $this->dbClass->authSupportUnifyUsernameAndEmail($this->paramAuthUser); $authSucceed = false; if ($this->checkAuthorization($signedUser, $this->paramResponse, $this->clientId)) { $this->logger->setDebugMessage("IM-built-in Authentication succeed."); $authSucceed = true; } else { $ldap = new LDAPAuth(); $ldap->setLogger($this->logger); if ($ldap->isActive) { list($password, $challenge) = $this->decrypting($this->paramCryptResponse); if ($ldap->bindCheck($signedUser, $password)) { $this->logger->setDebugMessage("LDAP Authentication succeed."); $authSucceed = true; $this->addUser($signedUser, $password, true); } } } if (!$authSucceed) { $this->logger->setDebugMessage("Authentication doesn't meet valid.{$signedUser}/{$this->paramResponse}/{$this->clientId}"); // Not Authenticated! $access = "do nothing"; $this->dbSettings->setRequireAuthentication(true); } } } } // Come here access=challenge or authenticated access switch ($access) { case 'describe': $result = $this->dbClass->getSchema($this->dbSettings->getDataSourceName()); $this->outputOfProcessing['dbresult'] = $result; $this->outputOfProcessing['resultCount'] = 0; $this->outputOfProcessing['totalCount'] = 0; break; case 'read': case 'select': $result = $this->readFromDB(); if (isset($tableInfo['protect-reading']) && is_array($tableInfo['protect-reading'])) { $recordCount = count($result); for ($index = 0; $index < $recordCount; $index++) { foreach ($result[$index] as $field => $value) { if (in_array($field, $tableInfo['protect-reading'])) { $result[$index][$field] = "[protected]"; } } } } $this->outputOfProcessing['dbresult'] = $result; $this->outputOfProcessing['resultCount'] = $this->countQueryResult(); $this->outputOfProcessing['totalCount'] = $this->getTotalCount(); break; case 'update': if (isset($tableInfo['protect-writing']) && is_array($tableInfo['protect-writing'])) { $fieldArray = array(); $valueArray = array(); $counter = 0; $fieldValues = $this->dbSettings->getValue(); foreach ($this->dbSettings->getFieldsRequired() as $field) { if (!in_array($field, $tableInfo['protect-writing'])) { $fieldArray[] = $field; $valueArray[] = $fieldValues[$counter]; } $counter++; } $this->dbSettings->setFieldsRequired($fieldArray); $this->dbSettings->setValue($valueArray); } $this->updateDB(); break; case 'new': case 'create': $result = $this->createInDB($this->dbSettings->getDataSourceName(), $bypassAuth); $this->outputOfProcessing['newRecordKeyValue'] = $result; $this->outputOfProcessing['dbresult'] = $this->dbClass->updatedRecord(); break; case 'delete': $this->deleteFromDB($this->dbSettings->getDataSourceName()); break; case 'copy': $result = $this->copyInDB($this->dbSettings->getDataSourceName()); $this->outputOfProcessing['newRecordKeyValue'] = $result; $this->outputOfProcessing['dbresult'] = $this->dbClass->updatedRecord(); break; case 'challenge': break; case 'changepassword': if (isset($_POST['newpass'])) { $changeResult = $this->changePassword($this->paramAuthUser, $_POST['newpass']); $this->outputOfProcessing['changePasswordResult'] = $changeResult ? true : false; } else { $this->outputOfProcessing['changePasswordResult'] = false; } break; case 'unregister': if (!is_null($this->dbSettings->notifyServer) && $this->clientPusherAvailable) { $tableKeys = null; if (isset($_POST['pks'])) { $tableKeys = json_decode($_POST['pks'], true); } $this->dbSettings->notifyServer->unregister($_POST['notifyid'], $tableKeys); } break; } if ($this->logger->getDebugLevel() !== false) { $fInfo = $this->getFieldInfo($this->dbSettings->getDataSourceName()); if ($fInfo != null) { foreach ($this->dbSettings->getFieldsRequired() as $fieldName) { if (!$this->dbClass->isContainingFieldName($fieldName, $fInfo)) { $this->logger->setErrorMessage($messageClass->getMessageAs(1033, array($fieldName))); } } } } }
public function processing($datasource, $options, $dbspec, $debug) { $dbProxyInstance = new DB_Proxy(); $this->db = $dbProxyInstance; $dbProxyInstance->initialize($datasource, $options, $dbspec, $debug, $_POST["_im_contextname"]); $dbProxyInstance->logger->setDebugMessage("\$\$\$\$ processing start"); $useContainer = FALSE; $dbProxyContext = $dbProxyInstance->dbSettings->getDataSourceTargetArray(); if ($dbspec['db-class'] === 'FileMaker_FX' && isset($dbProxyContext['file-upload'])) { foreach ($dbProxyContext['file-upload'] as $item) { if (isset($item['container']) && (bool) $item['container'] === TRUE) { $useContainer = TRUE; } } } $url = NULL; if (isset($_POST['_im_redirect'])) { $url = $this->getRedirectUrl($_POST['_im_redirect']); if (is_null($url)) { header("HTTP/1.1 500 Internal Server Error"); $dbProxyInstance->logger->setErrorMessage('Header may not contain more than a single header, new line detected.'); $dbProxyInstance->processingRequest('noop'); $dbProxyInstance->finishCommunication(); $dbProxyInstance->exportOutputDataAsJSON(); return; } } if (!isset($options['media-root-dir']) && $useContainer === FALSE) { if (!is_null($url)) { header('Location: ' . $url); } else { $dbProxyInstance->logger->setErrorMessage("'media-root-dir' isn't specified"); $dbProxyInstance->processingRequest("noop"); $dbProxyInstance->finishCommunication(); $dbProxyInstance->exportOutputDataAsJSON(); } return; } if ($useContainer === FALSE) { // requires media-root-dir specification. $fileRoot = $options['media-root-dir']; if (substr($fileRoot, strlen($fileRoot) - 1, 1) !== '/') { $fileRoot .= '/'; } } if (count($_FILES) < 1) { if (!is_null($url)) { header('Location: ' . $url); } else { $messages = IMUtil::getMessageClassInstance(); $dbProxyInstance->logger->setErrorMessage($messages->getMessageAs(3202)); $dbProxyInstance->processingRequest("noop"); $dbProxyInstance->finishCommunication(); $dbProxyInstance->exportOutputDataAsJSON(); } return; } foreach ($_FILES as $fn => $fileInfo) { } if (is_array($fileInfo['name'])) { // JQuery File Upload Style $fileInfoName = $fileInfo['name'][0]; $fileInfoTemp = $fileInfo['tmp_name'][0]; } else { $fileInfoName = $fileInfo['name']; $fileInfoTemp = $fileInfo['tmp_name']; } $filePathInfo = pathinfo(IMUtil::removeNull(basename($fileInfoName))); if ($useContainer) { // for uploading to FileMaker's container field $fileName = $filePathInfo['filename'] . '.' . $filePathInfo['extension']; $tmpDir = ini_get('upload_tmp_dir'); if ($tmpDir === '') { $tmpDir = sys_get_temp_dir(); } if (mb_substr($tmpDir, 1) === DIRECTORY_SEPARATOR) { $filePath = $tmpDir . $fileName; } else { $filePath = $tmpDir . DIRECTORY_SEPARATOR . $fileName; } } else { $fileRoot = $options['media-root-dir']; if (substr($fileRoot, strlen($fileRoot) - 1, 1) != '/') { $fileRoot .= '/'; } $uploadFilePathMode = null; $params = IMUtil::getFromParamsPHPFile(array("uploadFilePathMode"), true); $uploadFilePathMode = $params["uploadFilePathMode"]; $dirPath = $this->justfyPathComponent($_POST["_im_contextname"], $uploadFilePathMode) . DIRECTORY_SEPARATOR . $this->justfyPathComponent($_POST["_im_keyfield"], $uploadFilePathMode) . "=" . $this->justfyPathComponent($_POST["_im_keyvalue"], $uploadFilePathMode) . DIRECTORY_SEPARATOR . $this->justfyPathComponent($_POST["_im_field"], $uploadFilePathMode); $rand4Digits = rand(1000, 9999); $filePartialPath = $dirPath . '/' . $filePathInfo['filename'] . '_' . $rand4Digits . '.' . $filePathInfo['extension']; $filePath = $fileRoot . $filePartialPath; if (strpos($filePath, $fileRoot) !== 0) { $dbProxyInstance->logger->setErrorMessage("Invalid Path Error."); $dbProxyInstance->processingRequest("noop"); $dbProxyInstance->finishCommunication(); $dbProxyInstance->exportOutputDataAsJSON(); return; } if (!file_exists($fileRoot . $dirPath)) { $result = mkdir($fileRoot . $dirPath, 0744, true); if (!$result) { $dbProxyInstance->logger->setErrorMessage("Can't make directory. [{$dirPath}]"); $dbProxyInstance->processingRequest("noop"); $dbProxyInstance->finishCommunication(); $dbProxyInstance->exportOutputDataAsJSON(); return; } } } $result = move_uploaded_file(IMUtil::removeNull($fileInfoTemp), $filePath); if (!$result) { if (!is_null($url)) { header('Location: ' . $url); } else { $dbProxyInstance->logger->setErrorMessage("Fail to move the uploaded file in the media folder."); $dbProxyInstance->processingRequest("noop"); $dbProxyInstance->finishCommunication(); $dbProxyInstance->exportOutputDataAsJSON(); } return; } $targetFieldName = $_POST["_im_field"]; if ($useContainer === FALSE) { $dbProxyContext = $dbProxyInstance->dbSettings->getDataSourceTargetArray(); if (isset($dbProxyContext['file-upload'])) { foreach ($dbProxyContext['file-upload'] as $item) { if (isset($item['field']) && !isset($item['context'])) { $targetFieldName = $item['field']; } } } } $dbKeyValue = $_POST["_im_keyvalue"]; $dbProxyInstance = new DB_Proxy(); $dbProxyInstance->initialize($datasource, $options, $dbspec, $debug, $_POST["_im_contextname"]); $dbProxyInstance->dbSettings->addExtraCriteria($_POST["_im_keyfield"], "=", $dbKeyValue); $dbProxyInstance->dbSettings->setFieldsRequired(array($targetFieldName)); $fileContent = file_get_contents($filePath, false, null, 0, 30); $headerTop = strpos($fileContent, "data:"); $endOfHeader = strpos($fileContent, ","); if ($headerTop === 0 && $endOfHeader > 0) { $tempFilePath = $filePath . ".temp"; rename($filePath, $tempFilePath); $step = 1024; if (strpos($fileContent, ";base64") !== false) { $fw = fopen($filePath, "w"); $fp = fopen($tempFilePath, "r"); fread($fp, $endOfHeader + 1); while ($str = fread($fp, $step)) { fwrite($fw, base64_decode($str)); } fclose($fp); fclose($fw); unlink($tempFilePath); } } if ($useContainer === FALSE) { $dbProxyInstance->dbSettings->setValue(array($filePath)); } else { $dbProxyInstance->dbSettings->setValue(array($fileName . "\n" . base64_encode(file_get_contents($filePath)))); } $dbProxyInstance->processingRequest("update"); $relatedContext = null; if ($useContainer === FALSE) { if (isset($dbProxyContext['file-upload'])) { foreach ($dbProxyContext['file-upload'] as $item) { if ($item['field'] == $_POST["_im_field"]) { $relatedContext = new DB_Proxy(); $relatedContext->initialize($datasource, $options, $dbspec, $debug, isset($item['context']) ? $item['context'] : null); $relatedContextInfo = $relatedContext->dbSettings->getDataSourceTargetArray(); $fields = array(); $values = array(); if (isset($relatedContextInfo["query"])) { foreach ($relatedContextInfo["query"] as $cItem) { if ($cItem['operator'] == "=" || $cItem['operator'] == "eq") { $fields[] = $cItem['field']; $values[] = $cItem['value']; } } } if (isset($relatedContextInfo["relation"])) { foreach ($relatedContextInfo["relation"] as $cItem) { if ($cItem['operator'] == "=" || $cItem['operator'] == "eq") { $fields[] = $cItem['foreign-key']; $values[] = $dbKeyValue; } } } $fields[] = "path"; $values[] = $filePartialPath; $relatedContext->dbSettings->setFieldsRequired($fields); $relatedContext->dbSettings->setValue($values); $relatedContext->processingRequest("create", true); // $relatedContext->finishCommunication(true); // $relatedContext->exportOutputDataAsJSON(); } } } } if ($useContainer === FALSE) { $dbProxyInstance->addOutputData('dbresult', $filePath); } else { $dbProxyInstance->addOutputData('dbresult', '/fmi/xml/cnt/' . $fileName . '?-db=' . urlencode($dbProxyInstance->dbSettings->getDbSpecDatabase()) . '&-lay=' . urlencode($datasource[0]['name']) . '&-recid=' . intval($_POST['_im_keyvalue']) . '&-field=' . urlencode($targetFieldName)); } $dbProxyInstance->finishCommunication(); if (!is_null($url)) { header('Location: ' . $url); } $dbProxyInstance->exportOutputDataAsJSON(); }