/** * Will select all fe_groups records that the current fe_user is member of - and which groups are also allowed in the current domain. * It also accumulates the TSconfig for the fe_user/fe_groups in ->TSdataArray * * @return integer Returns the number of usergroups for the frontend users (if the internal user record exists and the usergroup field contains a value) */ function fetchGroupData() { $this->TSdataArray = array(); $this->userTS = array(); $this->userTSUpdated = 0; $this->groupData = array('title' => array(), 'uid' => array(), 'pid' => array()); // Setting default configuration: $this->TSdataArray[] = $GLOBALS['TYPO3_CONF_VARS']['FE']['defaultUserTSconfig']; // get the info data for auth services $authInfo = $this->getAuthInfoArray(); if ($this->writeDevLog) { if (is_array($this->user)) { t3lib_div::devLog('Get usergroups for user: '******'tslib_feUserAuth'); } else { t3lib_div::devLog('Get usergroups for "anonymous" user', 'tslib_feUserAuth'); } } $groupDataArr = array(); // use 'auth' service to find the groups for the user $serviceChain = ''; $subType = 'getGroups' . $this->loginType; while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) { $serviceChain .= ',' . $serviceObj->getServiceKey(); $serviceObj->initAuth($subType, array(), $authInfo, $this); $groupData = $serviceObj->getGroups($this->user, $groupDataArr); if (is_array($groupData) && count($groupData)) { $groupDataArr = t3lib_div::array_merge($groupDataArr, $groupData); // Keys in $groupData should be unique ids of the groups (like "uid") so this function will override groups. } unset($serviceObj); } if ($this->writeDevLog and $serviceChain) { t3lib_div::devLog($subType . ' auth services called: ' . $serviceChain, 'tslib_feUserAuth'); } if ($this->writeDevLog and !count($groupDataArr)) { t3lib_div::devLog('No usergroups found by services', 'tslib_feUserAuth'); } if ($this->writeDevLog and count($groupDataArr)) { t3lib_div::devLog(count($groupDataArr) . ' usergroup records found by services', 'tslib_feUserAuth'); } // use 'auth' service to check the usergroups if they are really valid foreach ($groupDataArr as $groupData) { // by default a group is valid $validGroup = TRUE; $serviceChain = ''; $subType = 'authGroups' . $this->loginType; while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) { $serviceChain .= ',' . $serviceObj->getServiceKey(); $serviceObj->initAuth($subType, array(), $authInfo, $this); if (!$serviceObj->authGroup($this->user, $groupData)) { $validGroup = FALSE; if ($this->writeDevLog) { t3lib_div::devLog($subType . ' auth service did not auth group: ' . t3lib_div::arrayToLogString($groupData, 'uid,title'), 'tslib_feUserAuth', 2); } break; } unset($serviceObj); } unset($serviceObj); if ($validGroup) { $this->groupData['title'][$groupData['uid']] = $groupData['title']; $this->groupData['uid'][$groupData['uid']] = $groupData['uid']; $this->groupData['pid'][$groupData['uid']] = $groupData['pid']; $this->groupData['TSconfig'][$groupData['uid']] = $groupData['TSconfig']; } } if (count($this->groupData) && count($this->groupData['TSconfig'])) { // TSconfig: collect it in the order it was collected foreach ($this->groupData['TSconfig'] as $TSdata) { $this->TSdataArray[] = $TSdata; } $this->TSdataArray[] = $this->user['TSconfig']; // Sort information ksort($this->groupData['title']); ksort($this->groupData['uid']); ksort($this->groupData['pid']); } return count($this->groupData['uid']) ? count($this->groupData['uid']) : 0; }
/** * Find a user (eg. look up the user record in database when a login is sent) * * @return mixed user array or false */ function getUser() { $user = false; if ($this->login['status'] == 'login' && $this->login['uident']) { $user = $this->fetchUserRecord($this->login['uname']); if (!is_array($user)) { // Failed login attempt (no username found) $this->writelog(255, 3, 3, 2, "Login-attempt from %s (%s), username '%s' not found!!", array($this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname'])); // Logout written to log t3lib_div::sysLog(sprintf("Login-attempt from %s (%s), username '%s' not found!", $this->authInfo['REMOTE_ADDR'], $this->authInfo['REMOTE_HOST'], $this->login['uname']), 'Core', 0); } else { if ($this->writeDevLog) { t3lib_div::devLog('User found: ' . t3lib_div::arrayToLogString($user, array($this->db_user['userid_column'], $this->db_user['username_column'])), 'tx_sv_auth'); } } } return $user; }
/** * Start function * This class is able to generate a mail in formmail-style from the data in $V * Fields: * * [recipient]: email-adress of the one to receive the mail. If array, then all values are expected to be recipients * [attachment]: .... * * [subject]: The subject of the mail * [from_email]: Sender email. If not set, [email] is used * [from_name]: Sender name. If not set, [name] is used * [replyto_email]: Reply-to email. If not set [from_email] is used * [replyto_name]: Reply-to name. If not set [from_name] is used * [organisation]: Organization (header) * [priority]: Priority, 1-5, default 3 * [html_enabled]: If mail is sent as html * [use_base64]: If set, base64 encoding will be used instead of quoted-printable * * @param array Contains values for the field names listed above (with slashes removed if from POST input) * @param boolean Whether to base64 encode the mail content * @return void */ function start($V, $base64 = false) { $convCharset = FALSE; // do we need to convert form data? if ($GLOBALS['TSFE']->config['config']['formMailCharset']) { // Respect formMailCharset if it was set $this->charset = $GLOBALS['TSFE']->csConvObj->parse_charset($GLOBALS['TSFE']->config['config']['formMailCharset']); $convCharset = TRUE; } elseif ($GLOBALS['TSFE']->metaCharset != $GLOBALS['TSFE']->renderCharset) { // Use metaCharset for mail if different from renderCharset $this->charset = $GLOBALS['TSFE']->metaCharset; $convCharset = TRUE; } parent::start(); if ($base64 || $V['use_base64']) { $this->useBase64(); } if (isset($V['recipient'])) { // convert form data from renderCharset to mail charset $val = $V['subject'] ? $V['subject'] : 'Formmail on ' . t3lib_div::getIndpEnv('HTTP_HOST'); $this->subject = $convCharset && strlen($val) ? $GLOBALS['TSFE']->csConvObj->conv($val, $GLOBALS['TSFE']->renderCharset, $this->charset) : $val; $this->subject = $this->sanitizeHeaderString($this->subject); $val = $V['from_name'] ? $V['from_name'] : ($V['name'] ? $V['name'] : ''); // Be careful when changing $val! It is used again as the fallback value for replyto_name $this->from_name = $convCharset && strlen($val) ? $GLOBALS['TSFE']->csConvObj->conv($val, $GLOBALS['TSFE']->renderCharset, $this->charset) : $val; $this->from_name = $this->sanitizeHeaderString($this->from_name); $this->from_name = preg_match('/\\s|,/', $this->from_name) >= 1 ? '"' . $this->from_name . '"' : $this->from_name; $val = $V['replyto_name'] ? $V['replyto_name'] : $val; $this->replyto_name = $convCharset && strlen($val) ? $GLOBALS['TSFE']->csConvObj->conv($val, $GLOBALS['TSFE']->renderCharset, $this->charset) : $val; $this->replyto_name = $this->sanitizeHeaderString($this->replyto_name); $this->replyto_name = preg_match('/\\s|,/', $this->replyto_name) >= 1 ? '"' . $this->replyto_name . '"' : $this->replyto_name; $val = $V['organisation'] ? $V['organisation'] : ''; $this->organisation = $convCharset && strlen($val) ? $GLOBALS['TSFE']->csConvObj->conv($val, $GLOBALS['TSFE']->renderCharset, $this->charset) : $val; $this->organisation = $this->sanitizeHeaderString($this->organisation); $this->from_email = $V['from_email'] ? $V['from_email'] : ($V['email'] ? $V['email'] : ''); $this->from_email = t3lib_div::validEmail($this->from_email) ? $this->from_email : ''; $this->replyto_email = $V['replyto_email'] ? $V['replyto_email'] : $this->from_email; $this->replyto_email = t3lib_div::validEmail($this->replyto_email) ? $this->replyto_email : ''; $this->priority = $V['priority'] ? t3lib_div::intInRange($V['priority'], 1, 5) : 3; // Auto responder. $this->auto_respond_msg = trim($V['auto_respond_msg']) && $this->from_email ? trim($V['auto_respond_msg']) : ''; $this->auto_respond_msg = $this->sanitizeHeaderString($this->auto_respond_msg); $Plain_content = ''; $HTML_content = '<table border="0" cellpadding="2" cellspacing="2">'; // Runs through $V and generates the mail if (is_array($V)) { foreach ($V as $key => $val) { if (!t3lib_div::inList($this->reserved_names, $key)) { $space = strlen($val) > 60 ? LF : ''; $val = is_array($val) ? implode($val, LF) : $val; // convert form data from renderCharset to mail charset (HTML may use entities) $Plain_val = $convCharset && strlen($val) ? $GLOBALS['TSFE']->csConvObj->conv($val, $GLOBALS['TSFE']->renderCharset, $this->charset, 0) : $val; $HTML_val = $convCharset && strlen($val) ? $GLOBALS['TSFE']->csConvObj->conv(htmlspecialchars($val), $GLOBALS['TSFE']->renderCharset, $this->charset, 1) : htmlspecialchars($val); $Plain_content .= strtoupper($key) . ': ' . $space . $Plain_val . LF . $space; $HTML_content .= '<tr><td bgcolor="#eeeeee"><font face="Verdana" size="1"><strong>' . strtoupper($key) . '</strong></font></td><td bgcolor="#eeeeee"><font face="Verdana" size="1">' . nl2br($HTML_val) . ' </font></td></tr>'; } } } $HTML_content .= '</table>'; if ($V['html_enabled']) { $this->setHTML($this->encodeMsg($HTML_content)); } $this->addPlain($Plain_content); for ($a = 0; $a < 10; $a++) { $varname = 'attachment' . ($a ? $a : ''); if (!isset($_FILES[$varname])) { continue; } if (!is_uploaded_file($_FILES[$varname]['tmp_name'])) { t3lib_div::sysLog('Possible abuse of t3lib_formmail: temporary file "' . $_FILES[$varname]['tmp_name'] . '" ("' . $_FILES[$varname]['name'] . '") was not an uploaded file.', 'Core', 3); } if ($_FILES[$varname]['tmp_name']['error'] !== UPLOAD_ERR_OK) { t3lib_div::sysLog('Error in uploaded file in t3lib_formmail: temporary file "' . $_FILES[$varname]['tmp_name'] . '" ("' . $_FILES[$varname]['name'] . '") Error code: ' . $_FILES[$varname]['tmp_name']['error'], 'Core', 3); } $theFile = t3lib_div::upload_to_tempfile($_FILES[$varname]['tmp_name']); $theName = $_FILES[$varname]['name']; if ($theFile && file_exists($theFile)) { if (filesize($theFile) < $GLOBALS['TYPO3_CONF_VARS']['FE']['formmailMaxAttachmentSize']) { $this->addAttachment($theFile, $theName); } } t3lib_div::unlink_tempfile($theFile); } $this->setHeaders(); $this->setContent(); $this->setRecipient($V['recipient']); if ($V['recipient_copy']) { $this->recipient_copy = trim($V['recipient_copy']); } // log dirty header lines if ($this->dirtyHeaders) { t3lib_div::sysLog('Possible misuse of t3lib_formmail: see TYPO3 devLog', 'Core', 3); if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['enable_DLOG']) { t3lib_div::devLog('t3lib_formmail: ' . t3lib_div::arrayToLogString($this->dirtyHeaders, '', 200), 'Core', 3); } } } }
/** * Checks if a submission of username and password is present or use other authentication by auth services * * @return void * @internal */ function checkAuthentication() { // No user for now - will be searched by service below $tempuserArr = array(); $tempuser = FALSE; // User is not authenticated by default $authenticated = FALSE; // User want to login with passed login data (name/password) $activeLogin = FALSE; // Indicates if an active authentication failed (not auto login) $this->loginFailure = FALSE; if ($this->writeDevLog) { t3lib_div::devLog('Login type: ' . $this->loginType, 't3lib_userAuth'); } // The info array provide additional information for auth services $authInfo = $this->getAuthInfoArray(); // Get Login/Logout data submitted by a form or params $loginData = $this->getLoginFormData(); if ($this->writeDevLog) { t3lib_div::devLog('Login data: ' . t3lib_div::arrayToLogString($loginData), 't3lib_userAuth'); } // active logout (eg. with "logout" button) if ($loginData['status'] == 'logout') { if ($this->writeStdLog) { $this->writelog(255, 2, 0, 2, 'User %s logged out', array($this->user['username'])); } // Logout written to log if ($this->writeDevLog) { t3lib_div::devLog('User logged out. Id: ' . $this->id, 't3lib_userAuth', -1); } $this->logoff(); } // active login (eg. with login form) if ($loginData['status'] == 'login') { $activeLogin = TRUE; if ($this->writeDevLog) { t3lib_div::devLog('Active login (eg. with login form)', 't3lib_userAuth'); } // check referer for submitted login values if ($this->formfield_status && $loginData['uident'] && $loginData['uname']) { $httpHost = t3lib_div::getIndpEnv('TYPO3_HOST_ONLY'); if (!$this->getMethodEnabled && ($httpHost != $authInfo['refInfo']['host'] && !$GLOBALS['TYPO3_CONF_VARS']['SYS']['doNotCheckReferer'])) { throw new RuntimeException('TYPO3 Fatal Error: Error: This host address ("' . $httpHost . '") and the referer host ("' . $authInfo['refInfo']['host'] . '") mismatches!<br /> It\'s possible that the environment variable HTTP_REFERER is not passed to the script because of a proxy.<br /> The site administrator can disable this check in the "All Configuration" section of the Install Tool (flag: TYPO3_CONF_VARS[SYS][doNotCheckReferer]).', 1270853930); } // delete old user session if any $this->logoff(); } // Refuse login for _CLI users, if not processing a CLI request type // (although we shouldn't be here in case of a CLI request type) if (strtoupper(substr($loginData['uname'], 0, 5)) == '_CLI_' && !(TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_CLI)) { throw new RuntimeException('TYPO3 Fatal Error: You have tried to login using a CLI user. Access prohibited!', 1270853931); } } // the following code makes auto-login possible (if configured). No submitted data needed // determine whether we need to skip session update. // This is used mainly for checking session timeout without // refreshing the session itself while checking. if (t3lib_div::_GP('skipSessionUpdate')) { $skipSessionUpdate = true; } else { $skipSessionUpdate = false; } // re-read user session $authInfo['userSession'] = $this->fetchUserSession($skipSessionUpdate); $haveSession = is_array($authInfo['userSession']) ? TRUE : FALSE; if ($this->writeDevLog) { if ($haveSession) { t3lib_div::devLog('User session found: ' . t3lib_div::arrayToLogString($authInfo['userSession'], array($this->userid_column, $this->username_column)), 't3lib_userAuth', 0); } if (is_array($this->svConfig['setup'])) { t3lib_div::devLog('SV setup: ' . t3lib_div::arrayToLogString($this->svConfig['setup']), 't3lib_userAuth', 0); } } // fetch user if ... if ($activeLogin || !$haveSession && $this->svConfig['setup'][$this->loginType . '_fetchUserIfNoSession'] || $this->svConfig['setup'][$this->loginType . '_alwaysFetchUser']) { // use 'auth' service to find the user // first found user will be used $serviceChain = ''; $subType = 'getUser' . $this->loginType; while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) { $serviceChain .= ',' . $serviceObj->getServiceKey(); $serviceObj->initAuth($subType, $loginData, $authInfo, $this); if ($row = $serviceObj->getUser()) { $tempuserArr[] = $row; if ($this->writeDevLog) { t3lib_div::devLog('User found: ' . t3lib_div::arrayToLogString($row, array($this->userid_column, $this->username_column)), 't3lib_userAuth', 0); } // user found, just stop to search for more if not configured to go on if (!$this->svConfig['setup'][$this->loginType . '_fetchAllUsers']) { break; } } unset($serviceObj); } unset($serviceObj); if ($this->writeDevLog && $this->svConfig['setup'][$this->loginType . '_alwaysFetchUser']) { t3lib_div::devLog($this->loginType . '_alwaysFetchUser option is enabled', 't3lib_userAuth'); } if ($this->writeDevLog && $serviceChain) { t3lib_div::devLog($subType . ' auth services called: ' . $serviceChain, 't3lib_userAuth'); } if ($this->writeDevLog && !count($tempuserArr)) { t3lib_div::devLog('No user found by services', 't3lib_userAuth'); } if ($this->writeDevLog && count($tempuserArr)) { t3lib_div::devLog(count($tempuserArr) . ' user records found by services', 't3lib_userAuth'); } } // If no new user was set we use the already found user session if (!count($tempuserArr) && $haveSession) { $tempuserArr[] = $authInfo['userSession']; $tempuser = $authInfo['userSession']; // User is authenticated because we found a user session $authenticated = TRUE; if ($this->writeDevLog) { t3lib_div::devLog('User session used: ' . t3lib_div::arrayToLogString($authInfo['userSession'], array($this->userid_column, $this->username_column)), 't3lib_userAuth'); } } // Re-auth user when 'auth'-service option is set if ($this->svConfig['setup'][$this->loginType . '_alwaysAuthUser']) { $authenticated = FALSE; if ($this->writeDevLog) { t3lib_div::devLog('alwaysAuthUser option is enabled', 't3lib_userAuth'); } } // Authenticate the user if needed if (count($tempuserArr) && !$authenticated) { foreach ($tempuserArr as $tempuser) { // use 'auth' service to authenticate the user // if one service returns FALSE then authentication failed // a service might return 100 which means there's no reason to stop but the user can't be authenticated by that service if ($this->writeDevLog) { t3lib_div::devLog('Auth user: '******'t3lib_userAuth'); } $serviceChain = ''; $subType = 'authUser' . $this->loginType; while (is_object($serviceObj = t3lib_div::makeInstanceService('auth', $subType, $serviceChain))) { $serviceChain .= ',' . $serviceObj->getServiceKey(); $serviceObj->initAuth($subType, $loginData, $authInfo, $this); if (($ret = $serviceObj->authUser($tempuser)) > 0) { // if the service returns >=200 then no more checking is needed - useful for IP checking without password if (intval($ret) >= 200) { $authenticated = TRUE; break; } elseif (intval($ret) >= 100) { // Just go on. User is still not authenticated but there's no reason to stop now. } else { $authenticated = TRUE; } } else { $authenticated = FALSE; break; } unset($serviceObj); } unset($serviceObj); if ($this->writeDevLog && $serviceChain) { t3lib_div::devLog($subType . ' auth services called: ' . $serviceChain, 't3lib_userAuth'); } if ($authenticated) { // leave foreach() because a user is authenticated break; } } } // If user is authenticated a valid user is in $tempuser if ($authenticated) { // reset failure flag $this->loginFailure = FALSE; // Insert session record if needed: if (!($haveSession && ($tempuser['ses_id'] == $this->id || $tempuser['uid'] == $authInfo['userSession']['ses_userid']))) { $this->createUserSession($tempuser); // The login session is started. $this->loginSessionStarted = TRUE; } // User logged in - write that to the log! if ($this->writeStdLog && $activeLogin) { $this->writelog(255, 1, 0, 1, 'User %s logged in from %s (%s)', array($tempuser[$this->username_column], t3lib_div::getIndpEnv('REMOTE_ADDR'), t3lib_div::getIndpEnv('REMOTE_HOST')), '', '', '', -1, '', $tempuser['uid']); } if ($this->writeDevLog && $activeLogin) { t3lib_div::devLog('User ' . $tempuser[$this->username_column] . ' logged in from ' . t3lib_div::getIndpEnv('REMOTE_ADDR') . ' (' . t3lib_div::getIndpEnv('REMOTE_HOST') . ')', 't3lib_userAuth', -1); } if ($this->writeDevLog && !$activeLogin) { t3lib_div::devLog('User ' . $tempuser[$this->username_column] . ' authenticated from ' . t3lib_div::getIndpEnv('REMOTE_ADDR') . ' (' . t3lib_div::getIndpEnv('REMOTE_HOST') . ')', 't3lib_userAuth', -1); } if ($GLOBALS['TYPO3_CONF_VARS']['BE']['lockSSL'] == 3 && $this->user_table == 'be_users') { $requestStr = substr(t3lib_div::getIndpEnv('TYPO3_REQUEST_SCRIPT'), strlen(t3lib_div::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir)); $backendScript = t3lib_BEfunc::getBackendScript(); if ($requestStr == $backendScript && t3lib_div::getIndpEnv('TYPO3_SSL')) { list(, $url) = explode('://', t3lib_div::getIndpEnv('TYPO3_SITE_URL'), 2); list($server, $address) = explode('/', $url, 2); if (intval($TYPO3_CONF_VARS['BE']['lockSSLPort'])) { $sslPortSuffix = ':' . intval($TYPO3_CONF_VARS['BE']['lockSSLPort']); $server = str_replace($sslPortSuffix, '', $server); // strip port from server } t3lib_utility_Http::redirect('http://' . $server . '/' . $address . TYPO3_mainDir . $backendScript); } } } elseif ($activeLogin || count($tempuserArr)) { $this->loginFailure = TRUE; if ($this->writeDevLog && !count($tempuserArr) && $activeLogin) { t3lib_div::devLog('Login failed: ' . t3lib_div::arrayToLogString($loginData), 't3lib_userAuth', 2); } if ($this->writeDevLog && count($tempuserArr)) { t3lib_div::devLog('Login failed: ' . t3lib_div::arrayToLogString($tempuser, array($this->userid_column, $this->username_column)), 't3lib_userAuth', 2); } } // If there were a login failure, check to see if a warning email should be sent: if ($this->loginFailure && $activeLogin) { if ($this->writeDevLog) { t3lib_div::devLog('Call checkLogFailures: ' . t3lib_div::arrayToLogString(array('warningEmail' => $this->warningEmail, 'warningPeriod' => $this->warningPeriod, 'warningMax' => $this->warningMax)), 't3lib_userAuth', -1); } $this->checkLogFailures($this->warningEmail, $this->warningPeriod, $this->warningMax); } }
/** * Rendering the encode-cache content * * @param array The Page tree data * @return string HTML for the information table. */ function encodeView(t3lib_pageTree $tree) { // Delete entries: $cmd = t3lib_div::_GP('cmd'); $subcmd = ''; if ($cmd === 'deleteEC') { $subcmd = t3lib_div::_GP('entry'); $this->clearDEncodeCache($subcmd); } // Traverse tree: $cc = 0; $countDisplayed = 0; $output = ''; $duplicates = array(); foreach($tree->tree as $row) { // Select rows: $displayRows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('*','tx_realurl_urlencodecache','page_id='.intval($row['row']['uid']),'','content'); // Row title: $rowTitle = $row['HTML'].t3lib_BEfunc::getRecordTitle('pages',$row['row'],TRUE); // Add at least one empty element: if (!count($displayRows) || $subcmd==='displayed') { // Add title: $tCells = array(); $tCells[]='<td nowrap="nowrap">'.$rowTitle.'</td>'; $tCells[]='<td nowrap="nowrap"> </td>'; // Empty row: $tCells[]='<td colspan="7" align="center"> </td>'; // Compile Row: $output.= ' <tr class="bgColor'.($cc%2 ? '-20':'-10').'"> '.implode(' ',$tCells).' </tr>'; $cc++; if ($subcmd==='displayed') { foreach($displayRows as $c => $inf) { $this->clearDEncodeCache('urlhash_'.$inf['url_hash']); } } } else { foreach($displayRows as $c => $inf) { // Add icon/title and ID: $tCells = array(); if (!$c) { $tCells[]='<td nowrap="nowrap" rowspan="'.count($displayRows).'">'.$rowTitle.'</td>'; $tCells[]='<td nowrap="nowrap" rowspan="'.count($displayRows).'">'.$row['row']['uid'].'</td>'; $tCells[]='<td rowspan="'.count($displayRows).'">'. '<a href="'.$this->linkSelf('&cmd=deleteEC&entry=page_'.intval($row['row']['uid'])).'">'. '<img'.t3lib_iconWorks::skinImg($this->pObj->doc->backPath,'gfx/garbage.gif','width="11" height="12"').' title="Delete entries for page" alt="" />'. '</a>'. '</td>'; } // Get vars: $tCells[]='<td>'.htmlspecialchars(t3lib_div::fixed_lgd_cs($inf['origparams'], 100)).'</td>'; // Internal Extras: $tCells[]='<td>'.($inf['internalExtras'] ? t3lib_div::arrayToLogString(unserialize($inf['internalExtras'])) : ' ').'</td>'; // Path: $tCells[]='<td>'.htmlspecialchars(t3lib_div::fixed_lgd_cs($inf['content'],100)).'</td>'; // Delete: $tCells[]='<td>'. '<a href="'.$this->linkSelf('&cmd=deleteEC&entry=urlhash_'.intval($inf['url_hash'])).'">'. '<img'.t3lib_iconWorks::skinImg($this->pObj->doc->backPath,'gfx/garbage.gif','width="11" height="12"').' title="Delete entry" alt="" />'. '</a>'. '</td>'; // Error: $eMsg = ($duplicates[$inf['content']] && $duplicates[$inf['content']] !== $row['row']['uid'] ? $this->pObj->doc->icons(2).'Already used on page ID '.$duplicates[$inf['content']].'<br/>' : ''); if (count($GLOBALS['TYPO3_DB']->exec_SELECTgetRows('url_hash','tx_realurl_redirects','url_hash='.intval(t3lib_div::md5int($inf['content']))))) { $eMsg.= $this->pObj->doc->icons(3).'Also a redirect!'; } $tCells[]='<td>'.$eMsg.'</td>'; // Timestamp: $tCells[]='<td>'.htmlspecialchars(t3lib_BEfunc::datetime($inf['tstamp'])).' / '.htmlspecialchars(t3lib_BEfunc::calcAge(time()-$inf['tstamp'])).'</td>'; // Compile Row: $output.= ' <tr class="bgColor'.($cc%2 ? '-20':'-10').'"> '.implode(' ',$tCells).' </tr>'; $cc++; $countDisplayed++; if (!isset($duplicates[$inf['content']])) { $duplicates[$inf['content']] = $row['row']['uid']; } } } } list($count_allInTable) = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows('count(*) AS count','tx_realurl_urlencodecache',''); // Create header: $tCells = array(); $tCells[]='<td>Title:</td>'; $tCells[]='<td>ID:</td>'; $tCells[]='<td> </td>'; $tCells[]='<td>Host | GET variables:</td>'; $tCells[]='<td>Internal Extras:</td>'; $tCells[]='<td>Path:</td>'; $tCells[]='<td> </td>'; $tCells[]='<td>Errors:</td>'; $tCells[]='<td>Timestamp:</td>'; $output = ' <tr class="bgColor5 tableheader"> '.implode(' ',$tCells).' </tr>'.$output; // Compile final table and return: $output = ' <br/> <br/> Displayed entries: <b>'.$countDisplayed.'</b> '. '<a href="'.$this->linkSelf('&cmd=deleteEC&entry=displayed').'">'. '<img'.t3lib_iconWorks::skinImg($this->pObj->doc->backPath,'gfx/garbage.gif','width="11" height="12"').' title="Delete displayed entries" alt="" />'. '</a>'. '<br/> Total entries in encode cache: <b>'.$count_allInTable['count'].'</b> '. '<a href="'.$this->linkSelf('&cmd=deleteEC&entry=all').'">'. '<img'.t3lib_iconWorks::skinImg($this->pObj->doc->backPath,'gfx/garbage.gif','width="11" height="12"').' title="Delete WHOLE encode cache!" alt="" />'. '</a>'. '<br/> <table border="0" cellspacing="1" cellpadding="0" id="tx-realurl-pathcacheTable" class="lrPadding c-list">'.$output.' </table>'; return $output; }
/** * Converts a one dimensional array to a one line string which can be used for logging or debugging output * Example: "loginType: FE; refInfo: Array; HTTP_HOST: www.example.org; REMOTE_ADDR: 192.168.1.5; REMOTE_HOST:; security_level:; showHiddenRecords: 0;" * * @param array $arr Data array which should be outputted * @param mixed $valueList List of keys which should be listed in the output string. Pass a comma list or an array. An empty list outputs the whole array. * @param int $valueLength Long string values are shortened to this length. Default: 20 * @return string Output string with key names and their value as string */ public function arrayToLogString(array $arr, $valueList = array(), $valueLength = 20) { /** @noinspection PhpDeprecationInspection PhpUndefinedClassInspection */ return t3lib_div::arrayToLogString($arr, $valueLength, $valueLength); }
/** * Start function * This class is able to generate a mail in formmail-style from the data in $V * Fields: * * [recipient]: email-adress of the one to receive the mail. If array, then all values are expected to be recipients * [attachment]: .... * * [subject]: The subject of the mail * [from_email]: Sender email. If not set, [email] is used * [from_name]: Sender name. If not set, [name] is used * [replyto_email]: Reply-to email. If not set [from_email] is used * [replyto_name]: Reply-to name. If not set [from_name] is used * [organisation]: Organization (header) * [priority]: Priority, 1-5, default 3 * [html_enabled]: If mail is sent as html * [use_base64]: If set, base64 encoding will be used instead of quoted-printable * * @param array Contains values for the field names listed above (with slashes removed if from POST input) * @param boolean Whether to base64 encode the mail content * @return void */ function start($valueList, $base64 = false) { $this->mailMessage = t3lib_div::makeInstance('t3lib_mail_Message'); if ($GLOBALS['TSFE']->config['config']['formMailCharset']) { // Respect formMailCharset if it was set $this->characterSet = $GLOBALS['TSFE']->csConvObj->parse_charset($GLOBALS['TSFE']->config['config']['formMailCharset']); } elseif ($GLOBALS['TSFE']->metaCharset != $GLOBALS['TSFE']->renderCharset) { // Use metaCharset for mail if different from renderCharset $this->characterSet = $GLOBALS['TSFE']->metaCharset; } if ($base64 || $valueList['use_base64']) { $this->encoding = 'base64'; } if (isset($valueList['recipient'])) { // convert form data from renderCharset to mail charset $this->subject = $valueList['subject'] ? $valueList['subject'] : 'Formmail on ' . t3lib_div::getIndpEnv('HTTP_HOST'); $this->subject = $this->sanitizeHeaderString($this->subject); $this->fromName = $valueList['from_name'] ? $valueList['from_name'] : ($valueList['name'] ? $valueList['name'] : ''); $this->fromName = $this->sanitizeHeaderString($this->fromName); $this->replyToName = $valueList['replyto_name'] ? $valueList['replyto_name'] : $this->fromName; $this->replyToName = $this->sanitizeHeaderString($this->replyToName); $this->organisation = $valueList['organisation'] ? $valueList['organisation'] : ''; $this->organisation = $this->sanitizeHeaderString($this->organisation); $this->fromAddress = $valueList['from_email'] ? $valueList['from_email'] : ($valueList['email'] ? $valueList['email'] : ''); if (!t3lib_div::validEmail($this->fromAddress)) { $this->fromAddress = t3lib_utility_Mail::getSystemFromAddress(); $this->fromName = t3lib_utility_Mail::getSystemFromName(); } $this->replyToAddress = $valueList['replyto_email'] ? $valueList['replyto_email'] : $this->fromAddress; $this->priority = $valueList['priority'] ? t3lib_div::intInRange($valueList['priority'], 1, 5) : 3; // auto responder $this->autoRespondMessage = trim($valueList['auto_respond_msg']) && $this->fromAddress ? trim($valueList['auto_respond_msg']) : ''; if ($this->autoRespondMessage !== '') { // Check if the value of the auto responder message has been modified with evil intentions $autoRespondChecksum = $valueList['auto_respond_checksum']; $correctHmacChecksum = t3lib_div::hmac($this->autoRespondMessage); if ($autoRespondChecksum !== $correctHmacChecksum) { t3lib_div::sysLog('Possible misuse of t3lib_formmail auto respond method. Subject: ' . $valueList['subject'], 'Core', 3); return; } else { $this->autoRespondMessage = $this->sanitizeHeaderString($this->autoRespondMessage); } } $plainTextContent = ''; $htmlContent = '<table border="0" cellpadding="2" cellspacing="2">'; // Runs through $V and generates the mail if (is_array($valueList)) { foreach ($valueList as $key => $val) { if (!t3lib_div::inList($this->reserved_names, $key)) { $space = strlen($val) > 60 ? LF : ''; $val = is_array($val) ? implode($val, LF) : $val; // convert form data from renderCharset to mail charset (HTML may use entities) $plainTextValue = $val; $HtmlValue = htmlspecialchars($val); $plainTextContent .= strtoupper($key) . ': ' . $space . $plainTextValue . LF . $space; $htmlContent .= '<tr><td bgcolor="#eeeeee"><font face="Verdana" size="1"><strong>' . strtoupper($key) . '</strong></font></td><td bgcolor="#eeeeee"><font face="Verdana" size="1">' . nl2br($HtmlValue) . ' </font></td></tr>'; } } } $htmlContent .= '</table>'; $this->plainContent = $plainTextContent; if ($valueList['html_enabled']) { $this->mailMessage->setBody($htmlContent, 'text/html'); $this->mailMessage->addPart($plainTextContent, 'text/plain'); } else { $this->mailMessage->setBody($plainTextContent, 'text/plain'); } for ($a = 0; $a < 10; $a++) { $variableName = 'attachment' . ($a ? $a : ''); if (!isset($_FILES[$variableName])) { continue; } if (!is_uploaded_file($_FILES[$variableName]['tmp_name'])) { t3lib_div::sysLog('Possible abuse of t3lib_formmail: temporary file "' . $_FILES[$variableName]['tmp_name'] . '" ("' . $_FILES[$variableName]['name'] . '") was not an uploaded file.', 'Core', 3); } if ($_FILES[$variableName]['tmp_name']['error'] !== UPLOAD_ERR_OK) { t3lib_div::sysLog('Error in uploaded file in t3lib_formmail: temporary file "' . $_FILES[$variableName]['tmp_name'] . '" ("' . $_FILES[$variableName]['name'] . '") Error code: ' . $_FILES[$variableName]['tmp_name']['error'], 'Core', 3); } $theFile = t3lib_div::upload_to_tempfile($_FILES[$variableName]['tmp_name']); $theName = $_FILES[$variableName]['name']; if ($theFile && file_exists($theFile)) { if (filesize($theFile) < $GLOBALS['TYPO3_CONF_VARS']['FE']['formmailMaxAttachmentSize']) { $this->mailMessage->attach(Swift_Attachment::fromPath($theFile)->setFilename($theName)); } } $this->temporaryFiles[] = $theFile; } $from = $this->fromName ? array($this->fromAddress => $this->fromName) : array($this->fromAddress); $this->recipient = $this->parseAddresses($valueList['recipient']); $this->mailMessage->setSubject($this->subject)->setFrom($from)->setTo($this->recipient)->setPriority($this->priority); $replyTo = $this->replyToName ? array($this->replyToAddress => $this->replyToName) : array($this->replyToAddress); $this->mailMessage->addReplyTo($replyTo); $this->mailMessage->getHeaders()->addTextHeader('Organization', $this->organisation); if ($valueList['recipient_copy']) { $this->mailMessage->addCc($this->parseAddresses($valueList['recipient_copy'])); } if ($this->characterSet) { $this->mailMessage->setCharset($this->characterSet); } // Ignore target encoding. This is handled automatically by Swift Mailer and overriding the defaults // is not worth the trouble // log dirty header lines if ($this->dirtyHeaders) { t3lib_div::sysLog('Possible misuse of t3lib_formmail: see TYPO3 devLog', 'Core', 3); if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['enable_DLOG']) { t3lib_div::devLog('t3lib_formmail: ' . t3lib_div::arrayToLogString($this->dirtyHeaders, '', 200), 'Core', 3); } } } }
/** * Find syslog * * @return array */ function main() { global $TYPO3_DB; // Initialize result array: $resultArray = array('message' => $this->cli_help['name'] . LF . LF . $this->cli_help['description'], 'headers' => array('listing' => array('', '', 1), 'allDetails' => array('', '', 0)), 'listing' => array(), 'allDetails' => array()); $rows = $TYPO3_DB->exec_SELECTgetRows('*', 'sys_log', 'tstamp>' . ($GLOBALS['EXEC_TIME'] - 25 * 3600)); foreach ($rows as $r) { $l = unserialize($r['log_data']); $explained = '#' . $r['uid'] . ' ' . t3lib_BEfunc::datetime($r['tstamp']) . ' USER[' . $r['userid'] . ']: ' . sprintf($r['details'], $l[0], $l[1], $l[2], $l[3], $l[4], $l[5]); $resultArray['listing'][$r['uid']] = $explained; $resultArray['allDetails'][$r['uid']] = array($explained, t3lib_div::arrayToLogString($r, 'uid,userid,action,recuid,tablename,recpid,error,tstamp,type,details_nr,IP,event_pid,NEWid,workspace')); } return $resultArray; }
/** * Liefert die im Scheduler gesetzten Optionen. * * @param string $info * @return string Information to display */ public function getAdditionalInformation($info = '') { $info .= CRLF . ' Options: '; $info .= t3lib_div::arrayToLogString($this->getOptions(), array(), 64); return $info; }
/** * Submit incoming content as default language to database. Must match what is available in $accum. * * @param array $accum Translation configuration * @param array $inputArray Array with incoming translation. Must match what is found in $accum * @return mixed False if error - else flexFormDiffArray (if $inputArray was an array and processing was performed.) */ function _submitContentAsDefaultLanguageAndGetFlexFormDiff($accum, $inputArray) { if (is_array($inputArray)) { // Initialize: /** @var $flexToolObj t3lib_flexformtools */ $flexToolObj = t3lib_div::makeInstance('t3lib_flexformtools'); $TCEmain_data = array(); $_flexFormDiffArray = array(); // Traverse: foreach ($accum as $pId => $page) { foreach ($accum[$pId]['items'] as $table => $elements) { foreach ($elements as $elementUid => $data) { if (is_array($data['fields'])) { foreach ($data['fields'] as $key => $tData) { if (is_array($tData) && isset($inputArray[$table][$elementUid][$key])) { list($Ttable, $TuidString, $Tfield, $Tpath) = explode(':', $key); list($Tuid, $Tlang, $TdefRecord) = explode('/', $TuidString); if (!$this->createTranslationAlsoIfEmpty && $inputArray[$table][$elementUid][$key] == '' && $Tuid == 'NEW') { //if data is empty do not save it unset($inputArray[$table][$elementUid][$key]); continue; } #t3lib_div::debug($elementUid); // If FlexForm, we set value in special way: if ($Tpath) { if (!is_array($TCEmain_data[$Ttable][$elementUid][$Tfield])) { $TCEmain_data[$Ttable][$elementUid][$Tfield] = array(); } //TCEMAINDATA is passed as reference here: $flexToolObj->setArrayValueByPath($Tpath, $TCEmain_data[$Ttable][$elementUid][$Tfield], $inputArray[$table][$elementUid][$key]); $_flexFormDiffArray[$key] = array('translated' => $inputArray[$table][$elementUid][$key], 'default' => $tData['defaultValue']); } else { $TCEmain_data[$Ttable][$elementUid][$Tfield] = $inputArray[$table][$elementUid][$key]; } unset($inputArray[$table][$elementUid][$key]); // Unsetting so in the end we can see if $inputArray was fully processed. } else { //debug($tData,'fields not set for: '.$elementUid.'-'.$key); //debug($inputArray[$table],'inputarray'); } } if (is_array($inputArray[$table][$elementUid]) && !count($inputArray[$table][$elementUid])) { unset($inputArray[$table][$elementUid]); // Unsetting so in the end we can see if $inputArray was fully processed. } } } if (is_array($inputArray[$table]) && !count($inputArray[$table])) { unset($inputArray[$table]); // Unsetting so in the end we can see if $inputArray was fully processed. } } } if ($TCEmain_data['pages_language_overlay']) { $TCEmain_data['pages'] = $TCEmain_data['pages_language_overlay']; unset($TCEmain_data['pages_language_overlay']); } #t3lib_div::debug($TCEmain_data); //var_dump($TCEmain_data); $this->lastTCEMAINCommandsCount = 0; // Now, submitting translation data: $tce = t3lib_div::makeInstance('t3lib_TCEmain'); $tce->stripslashes_values = FALSE; $tce->dontProcessTransformations = TRUE; $tce->start($TCEmain_data, array()); // check has been done previously that there is a backend user which is Admin and also in live workspace $tce->process_datamap(); if (count($tce->errorLog)) { t3lib_div::sysLog(__FILE__ . ': ' . __LINE__ . ': TCEmain update errors: ' . t3lib_div::arrayToLogString($tce->errorLog), 'l10nmgr'); } if (count($tce->autoVersionIdMap) && count($_flexFormDiffArray)) { foreach ($_flexFormDiffArray as $key => $value) { list($Ttable, $Tuid, $Trest) = explode(':', $key, 3); if ($tce->autoVersionIdMap[$Ttable][$Tuid]) { $_flexFormDiffArray[$Ttable . ':' . $tce->autoVersionIdMap[$Ttable][$Tuid] . ':' . $Trest] = $_flexFormDiffArray[$key]; unset($_flexFormDiffArray[$key]); } } } // Should be empty now - or there were more information in the incoming array than there should be! if (count($inputArray)) { debug($inputArray, 'These fields were ignored since they were not in the configuration:'); } return $_flexFormDiffArray; } else { return FALSE; } }
/** * Processing of the storage command LOAD, SAVE, REMOVE * * @param string Name of the module to store the settings for. Default: $GLOBALS['SOBE']->MCONF['name'] (current module) * @return string Storage message. Also set in $this->msg */ function processStoreControl($mconfName = '') { $this->initStorage(); $storeControl = t3lib_div::_GP('storeControl'); $storeIndex = $storeControl['STORE']; $msg = ''; $saveSettings = FALSE; $writeArray = array(); if (is_array($storeControl)) { if ($this->writeDevLog) { t3lib_div::devLog('Store command: ' . t3lib_div::arrayToLogString($storeControl), 't3lib_modSettings', 0); } // // processing LOAD // if ($storeControl['LOAD'] and $storeIndex) { $writeArray = $this->getStoredData($storeIndex, $writeArray); $saveSettings = TRUE; $msg = "'" . $this->storedSettings[$storeIndex]['title'] . "' preset loaded!"; // // processing SAVE // } elseif ($storeControl['SAVE']) { if (trim($storeControl['title'])) { // get the data to store $newEntry = $this->compileEntry($storeControl); // create an index for the storage array if (!$storeIndex) { $storeIndex = t3lib_div::shortMD5($newEntry['title']); } // add data to the storage array $this->storedSettings[$storeIndex] = $newEntry; $saveSettings = TRUE; $msg = "'" . $newEntry['title'] . "' preset saved!"; } else { $msg = 'Please enter a name for the preset!'; } // // processing REMOVE // } elseif ($storeControl['REMOVE'] and $storeIndex) { // Removing entry $msg = "'" . $this->storedSettings[$storeIndex]['title'] . "' preset entry removed!"; unset($this->storedSettings[$storeIndex]); $saveSettings = TRUE; } $this->msg = $msg; if ($saveSettings) { $this->writeStoredSetting($writeArray, $mconfName); } } return $this->msg; }
/** * Render the module content in HTML * * @param array Translation data for configuration * @param integer Sys language uid * @param array Configuration record * @return string HTML content */ function renderOverview() { global $LANG; $sysLang = $this->sysLang; $accumObj = $this->l10ncfgObj->getL10nAccumulatedInformationsObjectForLanguage($sysLang); $accum = $accumObj->getInfoArray(); $l10ncfg = $this->l10ncfg; $output = ''; $showSingle = t3lib_div::_GET('showSingle'); if ($l10ncfg['displaymode'] > 0) { $showSingle = $showSingle ? $showSingle : 'NONE'; if ($l10ncfg['displaymode'] == 2) { $noAnalysis = TRUE; } } else { $noAnalysis = FALSE; } // Traverse the structure and generate HTML output: foreach ($accum as $pId => $page) { $output .= '<h3>' . $page['header']['icon'] . htmlspecialchars($page['header']['title']) . ' [' . $pId . ']</h3>'; $tableRows = array(); foreach ($accum[$pId]['items'] as $table => $elements) { foreach ($elements as $elementUid => $data) { if (is_array($data['fields'])) { $FtableRows = array(); $flags = array(); if (!$noAnalysis || $showSingle === $table . ':' . $elementUid) { foreach ($data['fields'] as $key => $tData) { if (is_array($tData)) { list(, $uidString, $fieldName) = explode(':', $key); list($uidValue) = explode('/', $uidString); $diff = ''; $edit = TRUE; $noChangeFlag = !strcmp(trim($tData['diffDefaultValue']), trim($tData['defaultValue'])); if ($uidValue === 'NEW') { $diff = '<em>' . $LANG->getLL('render_overview.new.message') . '</em>'; $flags['new']++; } elseif (!isset($tData['diffDefaultValue'])) { $diff = '<em>' . $LANG->getLL('render_overview.nodiff.message') . '</em>'; $flags['unknown']++; } elseif ($noChangeFlag) { $diff = $LANG->getLL('render_overview.nochange.message'); $edit = TRUE; $flags['noChange']++; } else { $diff = $this->diffCMP($tData['diffDefaultValue'], $tData['defaultValue']); $flags['update']++; } if (!$this->modeOnlyChanged || !$noChangeFlag) { $fieldCells = array(); $fieldCells[] = '<b>' . htmlspecialchars($fieldName) . '</b>' . ($tData['msg'] ? '<br/><em>' . htmlspecialchars($tData['msg']) . '</em>' : ''); $fieldCells[] = nl2br(htmlspecialchars($tData['defaultValue'])); $fieldCells[] = $edit && $this->modeWithInlineEdit ? $tData['fieldType'] === 'text' ? '<textarea name="' . htmlspecialchars('translation[' . $table . '][' . $elementUid . '][' . $key . ']') . '" cols="60" rows="5">' . t3lib_div::formatForTextarea($tData['translationValue']) . '</textarea>' : '<input name="' . htmlspecialchars('translation[' . $table . '][' . $elementUid . '][' . $key . ']') . '" value="' . htmlspecialchars($tData['translationValue']) . '" size="60" />' : nl2br(htmlspecialchars($tData['translationValue'])); $fieldCells[] = $diff; if ($page['header']['prevLang']) { reset($tData['previewLanguageValues']); $fieldCells[] = nl2br(htmlspecialchars(current($tData['previewLanguageValues']))); } $FtableRows[] = '<tr class="db_list_normal"><td>' . implode('</td><td>', $fieldCells) . '</td></tr>'; } } } } if (count($FtableRows) || $noAnalysis) { // Link: if ($this->modeShowEditLinks) { reset($data['fields']); list(, $uidString) = explode(':', key($data['fields'])); if (substr($uidString, 0, 3) !== 'NEW') { $editId = is_array($data['translationInfo']['translations'][$sysLang]) ? $data['translationInfo']['translations'][$sysLang]['uid'] : $data['translationInfo']['uid']; $editLink = ' - <a href="#" onclick="' . htmlspecialchars(t3lib_BEfunc::editOnClick('&edit[' . $data['translationInfo']['translation_table'] . '][' . $editId . ']=edit', $this->doc->backPath)) . '"><em>[' . $LANG->getLL('render_overview.clickedit.message') . ']</em></a>'; } else { $editLink = ' - <a href="' . htmlspecialchars($this->doc->issueCommand('&cmd[' . $table . '][' . $data['translationInfo']['uid'] . '][localize]=' . $sysLang)) . '"><em>[' . $LANG->getLL('render_overview.clicklocalize.message') . ']</em></a>'; } } else { $editLink = ''; } $tableRows[] = '<tr class="t3-row-header"> <td colspan="2" style="width:300px;"><a href="' . htmlspecialchars('index.php?id=' . t3lib_div::_GET('id') . '&showSingle=' . rawurlencode($table . ':' . $elementUid)) . '">' . htmlspecialchars($table . ':' . $elementUid) . '</a>' . $editLink . '</td> <td colspan="3" style="width:200px;">' . htmlspecialchars(t3lib_div::arrayToLogString($flags)) . '</td> </tr>'; if (!$showSingle || $showSingle === $table . ':' . $elementUid) { $tableRows[] = '<tr class="bgColor-20 tableheader"> <td>Fieldname:</td> <td width="25%">Default:</td> <td width="25%">Translation:</td> <td width="25%">Diff:</td> ' . ($page['header']['prevLang'] ? '<td width="25%">PrevLang:</td>' : '') . ' </tr>'; $tableRows = array_merge($tableRows, $FtableRows); } } } } } if (count($tableRows)) { $output .= '<table class="typo3-dblist" border="0" cellpadding="0" cellspacing="0">' . implode('', $tableRows) . '</table>'; } } return $output; }
/** * Processing of the storage command LOAD, SAVE, REMOVE * * @param string Name of the module to store the settings for. Default: $GLOBALS['SOBE']->MCONF['name'] (current module) * @return string Storage message. Also set in $this->msg */ function processStoreControl() { $this->initStorage(); $storeControl = t3lib_div::_GP('selStoreControl'); $storeIndex = $storeControl['STORE']; if ($this->writeDevLog) { t3lib_div::devLog('Store command: ' . (is_array($storeControl) ? t3lib_div::arrayToLogString($storeControl) : $storeControl), 'tx_dam_selStorage', 0); } $msg = ''; $saveSettings = FALSE; $writeArray = array(); if (is_array($storeControl)) { // // processing LOAD // if ($storeControl['LOAD'] and $storeIndex) { $GLOBALS['SOBE']->selection->sl->setFromSerialized($this->storedSettings[$storeIndex]['definition']); $msg = "'" . $this->storedSettings[$storeIndex]['title'] . "' preset loaded!"; // // processing SAVE // } elseif ($storeControl['SAVE']) { if (trim($storeControl['title'])) { // get the data to store $newEntry = $this->compileEntry($storeControl); $GLOBALS['TYPO3_DB']->exec_INSERTquery($this->table, $newEntry); $this->initStorage(); if ($this->writeDevLog) { t3lib_div::devLog('Settings stored:' . $this->msg, 'tx_dam_selStorage', 0); } $msg = "'" . $newEntry['title'] . "' preset saved!"; } else { $msg = 'Please enter a name for the preset!'; } // // processing REMOVE // } elseif ($storeControl['REMOVE'] and $storeIndex) { // Removing entry $msg = "'" . $this->storedSettings[$storeIndex]['title'] . "' preset entry removed!"; $GLOBALS['TYPO3_DB']->exec_DELETEquery($this->table, 'uid=' . $storeIndex); } $this->msg = $msg; } return $this->msg; }
/** * Submit incoming content to database. Must match what is available in $accum. * * @param array $accum Translation configuration * @param array $inputArray Array with incoming translation. Must match what is found in $accum * @return mixed False if error - else flexFormDiffArray (if $inputArray was an array and processing was performed.) */ function _submitContentAndGetFlexFormDiff($accum, $inputArray) { //CLI $accum and $inputArray OK! //print "<pre>"; //print_r($accum); //print_r($inputArray); //print "</pre>"; if (is_array($inputArray)) { // Initialize: /** @var $flexToolObj t3lib_flexformtools */ $flexToolObj = t3lib_div::makeInstance('t3lib_flexformtools'); $TCEmain_data = array(); $TCEmain_cmd = array(); $_flexFormDiffArray = array(); // Traverse: foreach ($accum as $pId => $page) { foreach ($accum[$pId]['items'] as $table => $elements) { foreach ($elements as $elementUid => $data) { if (is_array($data['fields'])) { foreach ($data['fields'] as $key => $tData) { if (is_array($tData) && isset($inputArray[$table][$elementUid][$key])) { list($Ttable, $TuidString, $Tfield, $Tpath) = explode(':', $key); list($Tuid, $Tlang, $TdefRecord) = explode('/', $TuidString); if (!$this->createTranslationAlsoIfEmpty && $inputArray[$table][$elementUid][$key] == '' && $Tuid == 'NEW') { //if data is empty do not save it unset($inputArray[$table][$elementUid][$key]); continue; } // If new element is required, we prepare for localization if ($Tuid === 'NEW') { //print "\nNEW\n"; $TCEmain_cmd[$table][$elementUid]['localize'] = $Tlang; } // If FlexForm, we set value in special way: if ($Tpath) { if (!is_array($TCEmain_data[$Ttable][$TuidString][$Tfield])) { $TCEmain_data[$Ttable][$TuidString][$Tfield] = array(); } //TCEMAINDATA is passed as reference here: $flexToolObj->setArrayValueByPath($Tpath, $TCEmain_data[$Ttable][$TuidString][$Tfield], $inputArray[$table][$elementUid][$key]); $_flexFormDiffArray[$key] = array('translated' => $inputArray[$table][$elementUid][$key], 'default' => $tData['defaultValue']); } else { $TCEmain_data[$Ttable][$TuidString][$Tfield] = $inputArray[$table][$elementUid][$key]; } unset($inputArray[$table][$elementUid][$key]); // Unsetting so in the end we can see if $inputArray was fully processed. } else { //debug($tData,'fields not set for: '.$elementUid.'-'.$key); //debug($inputArray[$table],'inputarray'); } } if (is_array($inputArray[$table][$elementUid]) && !count($inputArray[$table][$elementUid])) { unset($inputArray[$table][$elementUid]); // Unsetting so in the end we can see if $inputArray was fully processed. } } } if (is_array($inputArray[$table]) && !count($inputArray[$table])) { unset($inputArray[$table]); // Unsetting so in the end we can see if $inputArray was fully processed. } } } //debug($TCEmain_cmd,'$TCEmain_cmd'); //debug($TCEmain_data,'$TCEmain_data'); // Execute CMD array: Localizing records: /** @var $tce t3lib_TCEmain */ $tce = t3lib_div::makeInstance('t3lib_TCEmain'); if ($this->extensionConfiguration['enable_neverHideAtCopy'] == 1) { $tce->neverHideAtCopy = TRUE; } $tce->stripslashes_values = FALSE; if (count($TCEmain_cmd)) { $tce->start(array(), $TCEmain_cmd); $tce->process_cmdmap(); if (count($tce->errorLog)) { debug($tce->errorLog, 'TCEmain localization errors:'); } } // Before remapping if (TYPO3_DLOG) { t3lib_div::sysLog(__FILE__ . ': ' . __LINE__ . ': TCEmain_data before remapping: ' . t3lib_div::arrayToLogString($TCEmain_data), 'l10nmgr'); } // Remapping those elements which are new: $this->lastTCEMAINCommandsCount = 0; foreach ($TCEmain_data as $table => $items) { foreach ($TCEmain_data[$table] as $TuidString => $fields) { list($Tuid, $Tlang, $TdefRecord) = explode('/', $TuidString); $this->lastTCEMAINCommandsCount++; if ($Tuid === 'NEW') { if ($tce->copyMappingArray_merged[$table][$TdefRecord]) { $TCEmain_data[$table][t3lib_BEfunc::wsMapId($table, $tce->copyMappingArray_merged[$table][$TdefRecord])] = $fields; } else { t3lib_div::sysLog(__FILE__ . ': ' . __LINE__ . ': Record "' . $table . ':' . $TdefRecord . '" was NOT localized as it should have been!', 'l10nmgr'); } unset($TCEmain_data[$table][$TuidString]); } } } // After remapping if (TYPO3_DLOG) { t3lib_div::sysLog(__FILE__ . ': ' . __LINE__ . ': TCEmain_data after remapping: ' . t3lib_div::arrayToLogString($TCEmain_data), 'l10nmgr'); } // Now, submitting translation data: /** @var $tce t3lib_TCEmain */ $tce = t3lib_div::makeInstance('t3lib_TCEmain'); if ($this->extensionConfiguration['enable_neverHideAtCopy'] == 1) { $tce->neverHideAtCopy = TRUE; } $tce->stripslashes_values = FALSE; $tce->dontProcessTransformations = TRUE; //print_r($TCEmain_data); $tce->start($TCEmain_data, array()); // check has been done previously that there is a backend user which is Admin and also in live workspace $tce->process_datamap(); if (count($tce->errorLog)) { t3lib_div::sysLog(__FILE__ . ': ' . __LINE__ . ': TCEmain update errors: ' . t3lib_div::arrayToLogString($tce->errorLog), 'l10nmgr'); } if (count($tce->autoVersionIdMap) && count($_flexFormDiffArray)) { if (TYPO3_DLOG) { t3lib_div::sysLog(__FILE__ . ': ' . __LINE__ . ': flexFormDiffArry: ' . t3lib_div::arrayToLogString($this->flexFormDiffArray), 'l10nmgr'); } foreach ($_flexFormDiffArray as $key => $value) { list($Ttable, $Tuid, $Trest) = explode(':', $key, 3); if ($tce->autoVersionIdMap[$Ttable][$Tuid]) { $_flexFormDiffArray[$Ttable . ':' . $tce->autoVersionIdMap[$Ttable][$Tuid] . ':' . $Trest] = $_flexFormDiffArray[$key]; unset($_flexFormDiffArray[$key]); } } if (TYPO3_DLOG) { t3lib_div::sysLog(__FILE__ . ': ' . __LINE__ . ': autoVersionIdMap: ' . $tce->autoVersionIdMap, 'l10nmgr'); t3lib_div::sysLog(__FILE__ . ': ' . __LINE__ . ': _flexFormDiffArray: ' . t3lib_div::arrayToLogString($_flexFormDiffArray), 'l10nmgr'); } } // Should be empty now - or there were more information in the incoming array than there should be! if (count($inputArray)) { debug($inputArray, 'These fields were ignored since they were not in the configuration:'); } return $_flexFormDiffArray; } return false; }