Example #1
0
 /**
  * Wipes automatically registered superglobals.
  *
  * Protects the server from global registering
  * and overwriting attempts.
  *
  * @throws Textpattern_Security_Exception
  * @return Textpattern_Security_Filter
  */
 public function registerGlobals()
 {
     if (Txp::get('Textpattern_Server_Config')->getRegisterGlobals()) {
         if (array_key_exists('GLOBALS', $_REQUEST) || array_key_exists('GLOBALS', $_FILES)) {
             throw new Textpattern_Security_Exception('GLOBALS overwrite attempt detected. Please consider turning register_globals off.');
         }
         $variables = array_merge(isset($_SESSION) ? (array) $_SESSION : array(), (array) $_ENV, (array) $_GET, (array) $_POST, (array) $_COOKIE, (array) $_FILES, (array) $_SERVER);
         foreach ($variables as $variable => $value) {
             if (!in_array($variable, $this->protectedGlobals, true)) {
                 unset($GLOBALS[$variable]);
             }
         }
     }
     return $this;
 }
/**
 * Parse a tag for attributes and hand over to the tag handler function.
 *
 * @param  string      $tag   The tag name
 * @param  string      $atts  The attribute string
 * @param  string|null $thing The tag's content in case of container tags
 * @return string Parsed tag result
 * @package TagParser
 */
function processTags($tag, $atts, $thing = null)
{
    global $production_status, $txp_current_tag, $txp_current_form;
    static $registry = null;
    if ($production_status !== 'live') {
        $old_tag = $txp_current_tag;
        $txp_current_tag = '<txp:' . $tag . $atts . (isset($thing) ? '>' : '/>');
        trace_add($txp_current_tag, 1, "Form='{$txp_current_form}', Tag='{$txp_current_tag}'");
    }
    if ($registry === null) {
        $registry = Txp::get('\\Textpattern\\Tag\\Registry');
    }
    if ($registry->isRegistered($tag)) {
        $out = $registry->process($tag, splat($atts), $thing);
    } elseif (maybe_tag($tag)) {
        $out = $tag(splat($atts), $thing);
        trigger_error(gTxt('unregistered_tag'), E_USER_NOTICE);
    } elseif (isset($GLOBALS['pretext'][$tag])) {
        $out = txpspecialchars($pretext[$tag]);
        trigger_error(gTxt('deprecated_tag'), E_USER_NOTICE);
    } else {
        $out = '';
        trigger_error(gTxt('unknown_tag'), E_USER_WARNING);
    }
    if ($production_status !== 'live') {
        trace_add('', -1);
        if (isset($thing)) {
            trace_add("</txp:{$tag}>");
        }
        $txp_current_tag = $old_tag;
    }
    return $out;
}
Example #3
0
/**
 * Outputs a diagnostics report.
 *
 * This is the main panel.
 */
function doDiagnostics()
{
    global $prefs, $files, $txpcfg, $event, $step, $theme, $DB;
    extract(get_prefs());
    $urlparts = parse_url(hu);
    $mydomain = $urlparts['host'];
    $is_apache = stristr(serverSet('SERVER_SOFTWARE'), 'Apache') || is_callable('apache_get_version');
    $real_doc_root = isset($_SERVER['DOCUMENT_ROOT']) ? realpath($_SERVER['DOCUMENT_ROOT']) : '';
    // ini_get() returns string values passed via php_value as a string, not boolean.
    $is_register_globals = (strcasecmp(ini_get('register_globals'), 'on') === 0 or ini_get('register_globals') === '1');
    // Check for Textpattern updates, at most once every 24 hours.
    $now = time();
    $updateInfo = unserialize(get_pref('last_update_check', ''));
    if (!$updateInfo || $now > $updateInfo['when'] + 60 * 60 * 24) {
        $updates = checkUpdates();
        $updateInfo['msg'] = $updates ? gTxt($updates['msg'], array('{version}' => $updates['version'])) : '';
        $updateInfo['when'] = $now;
        set_pref('last_update_check', serialize($updateInfo), 'publish', PREF_HIDDEN, 'text_input');
    }
    $fail = array();
    if (!empty($updateInfo['msg'])) {
        $fail['textpattern_version_update'] = diag_msg_wrap($updateInfo['msg'], 'information');
    }
    if (!is_callable('version_compare') || version_compare(PHP_VERSION, REQUIRED_PHP_VERSION, '<')) {
        $fail['php_version_required'] = diag_msg_wrap(gTxt('php_version_required', array('{version}' => REQUIRED_PHP_VERSION)));
    }
    if (!isset($path_to_site)) {
        $fail['path_to_site_missing'] = diag_msg_wrap(gTxt('path_to_site_missing'), 'warning');
    }
    if (@gethostbyname($mydomain) === $mydomain) {
        $fail['dns_lookup_fails'] = diag_msg_wrap(gTxt('dns_lookup_fails') . cs . $mydomain, 'warning');
    }
    if (!@is_dir($path_to_site)) {
        $fail['path_to_site_inacc'] = diag_msg_wrap(gTxt('path_to_site_inacc') . cs . $path_to_site);
    }
    if (rtrim($siteurl, '/') != $siteurl) {
        $fail['site_trailing_slash'] = diag_msg_wrap(gTxt('site_trailing_slash') . cs . $path_to_site, 'warning');
    }
    if (!@is_file($path_to_site . "/index.php") || !@is_readable($path_to_site . "/index.php")) {
        $fail['index_inaccessible'] = diag_msg_wrap("{$path_to_site}/index.php " . gTxt('is_inaccessible'));
    }
    $not_readable = array();
    if (!@is_writable($path_to_site . '/' . $img_dir)) {
        $not_readable[] = diag_msg_wrap(str_replace('{dirtype}', gTxt('img_dir'), gTxt('dir_not_writable')) . ": {$path_to_site}/{$img_dir}", 'warning');
    }
    if (!@is_writable($file_base_path)) {
        $not_readable[] = diag_msg_wrap(str_replace('{dirtype}', gTxt('file_base_path'), gTxt('dir_not_writable')) . ": {$file_base_path}", 'warning');
    }
    if (!@is_writable($tempdir)) {
        $not_readable[] = diag_msg_wrap(str_replace('{dirtype}', gTxt('tempdir'), gTxt('dir_not_writable')) . ": {$tempdir}", 'warning');
    }
    if ($not_readable) {
        $fail['dir_not_writable'] = join(n, $not_readable);
    }
    if ($permlink_mode != 'messy' && !$is_apache) {
        $fail['cleanurl_only_apache'] = diag_msg_wrap(gTxt('cleanurl_only_apache'), 'information');
    }
    if ($permlink_mode != 'messy' and !@is_readable($path_to_site . '/.htaccess')) {
        $fail['htaccess_missing'] = diag_msg_wrap(gTxt('htaccess_missing'));
    }
    if ($permlink_mode != 'messy' and is_callable('apache_get_modules') and !apache_module('mod_rewrite')) {
        $fail['mod_rewrite_missing'] = diag_msg_wrap(gTxt('mod_rewrite_missing'));
    }
    if (!ini_get('file_uploads')) {
        $fail['file_uploads_disabled'] = diag_msg_wrap(gTxt('file_uploads_disabled'), 'information');
    }
    if (@is_dir(txpath . DS . 'setup')) {
        $fail['setup_still_exists'] = diag_msg_wrap(txpath . DS . "setup" . DS . ' ' . gTxt('still_exists'), 'warning');
    }
    if (empty($tempdir)) {
        $fail['no_temp_dir'] = diag_msg_wrap(gTxt('no_temp_dir'), 'warning');
    }
    if (is_disabled('mail')) {
        $fail['warn_mail_unavailable'] = diag_msg_wrap(gTxt('warn_mail_unavailable'), 'warning');
    }
    if ($is_register_globals) {
        $fail['warn_register_globals_or_update'] = diag_msg_wrap(gTxt('warn_register_globals_or_update'), 'warning');
    }
    if ($permlink_mode != 'messy') {
        $rs = safe_column("name", "txp_section", "1");
        foreach ($rs as $name) {
            if ($name and @file_exists($path_to_site . '/' . $name)) {
                $fail['old_placeholder_exists'] = diag_msg_wrap(gTxt('old_placeholder') . ": {$path_to_site}/{$name}");
            }
        }
    }
    $cs = check_file_integrity(INTEGRITY_REALPATH);
    if (!$cs) {
        $cs = array();
    }
    // Files that don't match their checksums.
    if ($modified_files = array_keys($cs, INTEGRITY_MODIFIED)) {
        $fail['modified_files'] = diag_msg_wrap(gTxt('modified_files') . cs . n . t . join(', ' . n . t, $modified_files), 'warning');
    }
    // Running development code in live mode is not recommended.
    if (preg_match('/-dev$/', txp_version) and $production_status == 'live') {
        $fail['dev_version_live'] = diag_msg_wrap(gTxt('dev_version_live'), 'warning');
    }
    // Missing files.
    if ($missing = array_merge(array_keys($cs, INTEGRITY_MISSING), array_keys($cs, INTEGRITY_NOT_FILE), array_keys($cs, INTEGRITY_NOT_READABLE))) {
        $fail['missing_files'] = diag_msg_wrap(gTxt('missing_files') . cs . n . t . join(', ' . n . t, $missing));
    }
    // Anything might break if arbitrary functions are disabled.
    if (ini_get('disable_functions')) {
        $disabled_funcs = array_map('trim', explode(',', ini_get('disable_functions')));
        // Commonly disabled functions that we don't need.
        $disabled_funcs = array_diff($disabled_funcs, array('imagefilltoborder', 'escapeshellarg', 'escapeshellcmd', 'exec', 'passthru', 'proc_close', 'proc_get_status', 'proc_nice', 'proc_open', 'proc_terminate', 'shell_exec', 'system', 'popen', 'dl', 'chown'));
        if ($disabled_funcs) {
            $fail['some_php_functions_disabled'] = diag_msg_wrap(gTxt('some_php_functions_disabled') . cs . join(', ', $disabled_funcs), 'warning');
        }
    }
    // Not sure about this one.
    //    if (strncmp(php_sapi_name(), 'cgi', 3) == 0 and ini_get('cgi.rfc2616_headers'))
    //    $fail['cgi_header_config'] = gTxt('cgi_header_config');
    $guess_site_url = $_SERVER['HTTP_HOST'] . preg_replace('#[/\\\\]$#', '', dirname(dirname($_SERVER['SCRIPT_NAME'])));
    if ($siteurl and strip_prefix($siteurl, 'www.') != strip_prefix($guess_site_url, 'www.')) {
        $fail['site_url_mismatch'] = diag_msg_wrap(gTxt('site_url_mismatch') . cs . $guess_site_url, 'warning');
    }
    // Test clean URL server vars.
    if (hu) {
        if (ini_get('allow_url_fopen') and $permlink_mode != 'messy') {
            $s = md5(uniqid(rand(), true));
            ini_set('default_socket_timeout', 10);
            $pretext_data = @file(hu . $s . '/?txpcleantest=1');
            if ($pretext_data) {
                $pretext_req = trim(@$pretext_data[0]);
                if ($pretext_req != md5('/' . $s . '/?txpcleantest=1')) {
                    $fail['clean_url_data_failed'] = diag_msg_wrap(gTxt('clean_url_data_failed') . cs . txpspecialchars($pretext_req), 'warning');
                }
            } else {
                $fail['clean_url_test_failed'] = diag_msg_wrap(gTxt('clean_url_test_failed'), 'warning');
            }
        }
    }
    if ($tables = list_txp_tables()) {
        $table_errors = check_tables($tables);
        if ($table_errors) {
            $fail['mysql_table_errors'] = diag_msg_wrap(gTxt('mysql_table_errors') . cs . n . t . join(', ' . n . t, $table_errors));
        }
    }
    $active_plugins = array();
    if ($rows = safe_rows('name, version, code_md5, md5(code) as md5', 'txp_plugin', 'status > 0')) {
        foreach ($rows as $row) {
            $n = $row['name'] . '-' . $row['version'];
            if (strtolower($row['md5']) != strtolower($row['code_md5'])) {
                $n .= 'm';
            }
            $active_plugins[] = $n;
        }
    }
    $theme_manifest = $theme->manifest();
    // Check GD info.
    if (function_exists('gd_info')) {
        $gd_info = gd_info();
        $gd_support = array();
        if ($gd_info['GIF Create Support']) {
            $gd_support[] = 'GIF';
        }
        // Aside: In PHP 5.3, they chose to add a previously unemployed capital "E" to the array key.
        if (!empty($gd_info['JPEG Support']) || !empty($gd_info['JPG Support'])) {
            $gd_support[] = 'JPG';
        }
        if ($gd_info['PNG Support']) {
            $gd_support[] = 'PNG';
        }
        if ($gd_support) {
            $gd_support = join(', ', $gd_support);
        } else {
            $gd_support = gTxt('none');
        }
        $gd = gTxt('gd_info', array('{version}' => $gd_info['GD Version'], '{supported}' => $gd_support));
    } else {
        $gd = gTxt('gd_unavailable');
    }
    if (realpath($prefs['tempdir']) === realpath($prefs['plugin_cache_dir'])) {
        $fail['tmp_plugin_paths_match'] = diag_msg_wrap(gTxt('tmp_plugin_paths_match'));
    }
    // Database server time.
    extract(doSpecial(getRow('select @@global.time_zone as db_global_timezone, @@session.time_zone as db_session_timezone, now() as db_server_time, unix_timestamp(now()) as db_server_timestamp')));
    $db_server_timeoffset = $db_server_timestamp - $now;
    echo pagetop(gTxt('tab_diagnostics'), '');
    echo hed(gTxt('tab_diagnostics'), 1, array('class' => 'txp-heading'));
    echo n . '<div id="' . $event . '_container" class="txp-container">' . n . '<div id="pre_flight_check">' . hed(gTxt('preflight_check'), 2);
    if ($fail) {
        foreach ($fail as $help => $message) {
            echo graf(nl2br($message) . popHelp($help));
        }
    } else {
        echo graf(diag_msg_wrap(gTxt('all_checks_passed'), 'success'));
    }
    echo '</div>';
    echo '<div id="diagnostics">', hed(gTxt('diagnostic_info'), 2);
    $fmt_date = '%Y-%m-%d %H:%M:%S';
    $out = array('<p><textarea class="code" id="diagnostics-detail" cols="' . INPUT_LARGE . '" rows="' . TEXTAREA_HEIGHT_LARGE . '" dir="ltr" readonly>', gTxt('txp_version') . cs . txp_version . ' (' . check_file_integrity(INTEGRITY_DIGEST) . ')' . n, gTxt('last_update') . cs . gmstrftime($fmt_date, $dbupdatetime) . '/' . gmstrftime($fmt_date, @filemtime(txpath . '/update/_update.php')) . n, gTxt('document_root') . cs . @$_SERVER['DOCUMENT_ROOT'] . ($real_doc_root != @$_SERVER['DOCUMENT_ROOT'] ? ' (' . $real_doc_root . ')' : '') . n, '$path_to_site' . cs . $path_to_site . n, gTxt('txp_path') . cs . txpath . n, gTxt('permlink_mode') . cs . $permlink_mode . n, ini_get('open_basedir') ? 'open_basedir: ' . ini_get('open_basedir') . n : '', ini_get('upload_tmp_dir') ? 'upload_tmp_dir: ' . ini_get('upload_tmp_dir') . n : '', gTxt('tempdir') . cs . $tempdir . n, gTxt('web_domain') . cs . $siteurl . n, gTxt('php_version') . cs . phpversion() . n, $is_register_globals ? gTxt('register_globals') . cs . $is_register_globals . n : '', gTxt('gd_library') . cs . $gd . n, gTxt('server') . ' TZ: ' . Txp::get('Textpattern_Date_Timezone')->getTimeZone() . n, gTxt('server_time') . cs . strftime('%Y-%m-%d %H:%M:%S') . n, strip_tags(gTxt('is_dst')) . cs . $is_dst . n, strip_tags(gTxt('auto_dst')) . cs . $auto_dst . n, strip_tags(gTxt('gmtoffset')) . cs . $timezone_key . sp . "({$gmtoffset})" . n, 'MySQL' . cs . mysql_get_server_info() . n, gTxt('db_server_time') . cs . $db_server_time . n, gTxt('db_server_timeoffset') . cs . $db_server_timeoffset . ' s' . n, gTxt('db_global_timezone') . cs . $db_global_timezone . n, gTxt('db_session_timezone') . cs . $db_session_timezone . n, gTxt('locale') . cs . $locale . n, isset($_SERVER['SERVER_SOFTWARE']) ? gTxt('server') . cs . $_SERVER['SERVER_SOFTWARE'] . n : '', is_callable('apache_get_version') ? gTxt('apache_version') . cs . @apache_get_version() . n : '', gTxt('php_sapi_mode') . cs . PHP_SAPI . n, gTxt('rfc2616_headers') . cs . ini_get('cgi.rfc2616_headers') . n, gTxt('os_version') . cs . php_uname('s') . ' ' . php_uname('r') . n, $active_plugins ? gTxt('active_plugins') . cs . join(', ', $active_plugins) . n : '', gTxt('theme_name') . cs . $theme_name . sp . $theme_manifest['version'] . n, $fail ? n . gTxt('preflight_check') . cs . n . ln . join("\n", doStripTags($fail)) . n . ln : '', is_readable($path_to_site . '/.htaccess') ? n . gTxt('htaccess_contents') . cs . n . ln . txpspecialchars(join('', file($path_to_site . '/.htaccess'))) . n . ln : '');
    if ($step == 'high') {
        $out[] = n . 'Charset (default/config)' . cs . $DB->default_charset . '/' . $DB->charset . n;
        $result = safe_query("SHOW variables like 'character_se%'");
        while ($row = mysql_fetch_row($result)) {
            $out[] = $row[0] . cs . $row[1] . n;
            if ($row[0] == 'character_set_connection') {
                $conn_char = $row[1];
            }
        }
        $table_names = array(PFX . 'textpattern');
        $result = safe_query("SHOW TABLES LIKE '" . PFX . "txp\\_%'");
        while ($row = mysql_fetch_row($result)) {
            $table_names[] = $row[0];
        }
        $table_msg = array();
        foreach ($table_names as $table) {
            $ctr = safe_query("SHOW CREATE TABLE " . $table . "");
            if (!$ctr) {
                unset($table_names[$table]);
                continue;
            }
            $ctcharset = preg_replace('#^CREATE TABLE.*SET=([^ ]+)[^)]*$#is', '\\1', mysql_result($ctr, 0, 'Create Table'));
            if (isset($conn_char) && !stristr($ctcharset, 'CREATE') && $conn_char != $ctcharset) {
                $table_msg[] = "{$table} is {$ctcharset}";
            }
            $ctr = safe_query("CHECK TABLE " . $table);
            if (in_array(mysql_result($ctr, 0, 'Msg_type'), array('error', 'warning'))) {
                $table_msg[] = $table . cs . mysql_result($ctr, 0, 'Msg_Text');
            }
        }
        if ($table_msg == array()) {
            $table_msg = count($table_names) < 17 ? array('-') : array('OK');
        }
        $out[] = count($table_names) . ' Tables' . cs . implode(', ', $table_msg) . n;
        $cf = preg_grep('/^custom_\\d+/', getThings('describe `' . PFX . 'textpattern`'));
        $out[] = n . get_pref('max_custom_fields', 10) . sp . gTxt('custom') . cs . implode(', ', $cf) . sp . '(' . count($cf) . ')' . n;
        $extns = get_loaded_extensions();
        $extv = array();
        foreach ($extns as $e) {
            $extv[] = $e . (phpversion($e) ? '/' . phpversion($e) : '');
        }
        $out[] = n . gTxt('php_extensions') . cs . join(', ', $extv) . n;
        if (is_callable('apache_get_modules')) {
            $out[] = n . gTxt('apache_modules') . cs . join(', ', apache_get_modules()) . n;
        }
        if (@is_array($pretext_data) and count($pretext_data) > 1) {
            $out[] = n . gTxt('pretext_data') . cs . txpspecialchars(join('', array_slice($pretext_data, 1, 20))) . n;
        }
        $out[] = n;
        if ($md5s = check_file_integrity(INTEGRITY_MD5)) {
            foreach ($md5s as $f => $checksum) {
                $out[] = $f . cs . n . t . (!$checksum ? gTxt('unknown') : $checksum) . n;
            }
        }
        $out[] = n . ln;
    }
    $out[] = callback_event('diag_results', $step) . n;
    $out[] = '</textarea></p>';
    $dets = array('low' => gTxt('low'), 'high' => gTxt('high'));
    $out[] = form(graf(eInput('diag') . n . '<label>' . gTxt('detail') . '</label>' . selectInput('step', $dets, $step, 0, 1)));
    echo join('', $out), '</div>', '</div>';
}
Example #4
0
/**
 * Renders article formatting tips.
 *
 * The rendered widget can be customised via the 'article_ui > sidehelp'
 * pluggable UI callback event.
 *
 * @param array $rs Article data
 */
function article_partial_sidehelp($rs)
{
    // Show markup help for both body and excerpt if they are different.
    $help = Txp::get('\\Textpattern\\Textfilter\\Registry')->getHelp($rs['textile_body']);
    if ($rs['textile_body'] != $rs['textile_excerpt']) {
        $help .= Txp::get('\\Textpattern\\Textfilter\\Registry')->getHelp($rs['textile_excerpt']);
    }
    $out = wrapRegion('txp-textfilter-group', $help, 'txp-textfilter-group-content', 'textfilter_help', 'article_textfilter_help');
    return pluggable_ui('article_ui', 'sidehelp', $out, $rs);
}
<?php

# --- BEGIN PLUGIN CODE ---
if (class_exists('\\Textpattern\\Tag\\Registry')) {
    // Register Textpattern tags for TXP 4.6+.
    Txp::get('\\Textpattern\\Tag\\Registry')->register('oui_dailymotion')->register('oui_if_dailymotion');
}
function oui_dailymotion($atts, $thing)
{
    global $thisarticle;
    extract(lAtts(array('video' => '', 'custom' => 'dailymotion ID', 'width' => '0', 'height' => '0', 'ratio' => '4:3', 'api' => '', 'autoplay' => '0', 'chromeless' => '0', 'highlight' => 'ffcc33', 'html' => '0', 'playerid' => '', 'info' => '1', 'logo' => '1', 'network' => '', 'origin' => '', 'quality' => '', 'related' => '1', 'start' => '0', 'startscreen' => '', 'syndication' => '', 'wmode' => 'transparent', 'label' => '', 'labeltag' => '', 'wraptag' => '', 'class' => __FUNCTION__), $atts));
    $custom = strtolower($custom);
    if (!$video && isset($thisarticle[$custom])) {
        $video = $thisarticle[$custom];
    }
    /*
     * Check for dailymotion video ID or dailymotion URL to extract ID from
     */
    $match = _oui_dailymotion($video);
    if ($match) {
        $video = $match;
    } elseif (empty($video)) {
        return '';
    }
    $src = '//www.dailymotion.com/embed/video/' . $video;
    /*
     * Attributes.
     */
    $qAtts = array('highlight' => $highlight, 'id' => $playerid, 'origin' => $origin, 'start' => $start, 'syndication' => $syndication, 'autoplay' => array($autoplay => '0, 1'), 'chromeless' => array($chromeless => '0, 1'), 'html' => array($html => '0, 1'), 'info' => array($info => '0, 1'), 'logo' => array($logo => '0, 1'), 'related' => array($related => '0, 1'), 'api' => array($api => 'postMessage, fragment, location'), 'network' => array($network => 'dsl, cellular'), 'quality' => array($quality => '240, 380, 480, 720, 1080, 1440, 2160'), 'startscreen' => array($startscreen => 'flash, html'), 'wmode' => array($wmode => 'transparent, opaque'));
    $qString = array();
    foreach ($qAtts as $att => $value) {
Example #6
0
/**
 * Creates a new user.
 */
function author_save_new()
{
    require_privs('admin.edit');
    extract(psa(array('privs', 'name', 'email', 'RealName')));
    $privs = assert_int($privs);
    if (is_valid_username($name) && is_valid_email($email)) {
        if (user_exists($name)) {
            author_edit(array(gTxt('author_already_exists', array('{name}' => $name)), E_ERROR));
            return;
        }
        $password = Txp::get('\\Textpattern\\Password\\Random')->generate(PASSWORD_LENGTH);
        $rs = create_user($name, $email, $password, $RealName, $privs);
        if ($rs) {
            $message = send_account_activation($name);
            author_list($message);
            return;
        }
    }
    author_edit(array(gTxt('error_adding_new_author'), E_ERROR));
}
Example #7
0
 /**
  * Is DST in effect?
  *
  * @param  int    $timestamp    When?
  * @param  string $timezone_key Where?
  * @return bool
  * @deprecated in 4.6.0
  * @see        Textpattern_Date_Timezone::isDst()
  */
 public static function is_dst($timestamp, $timezone_key)
 {
     return Txp::get('Textpattern_Date_Timezone')->isDst($timestamp, $timezone_key);
 }
Example #8
0
 /**
  * {@inheritdoc}
  */
 public function __construct($filename)
 {
     $this->parser = Txp::get('Textpattern_Textpack_Parser');
     parent::__construct($filename);
 }
Example #9
0
 /**
  * Validates filter selection.
  *
  * @return bool
  */
 public function validate()
 {
     return array_key_exists($this->value, Txp::get('Textpattern_Textfilter_Registry')->getMap());
 }
Example #10
0
/**
 * Resets the given user's password and emails it.
 *
 * The old password is replaced with a new random-generated one.
 *
 * Should NEVER be used as sending plaintext passwords is wrong.
 * Will be removed in future, in lieu of sending reset request tokens.
 *
 * @param  string $name The login name
 * @return string A localized message string
 * @deprecated in 4.6.0
 * @see    PASSWORD_LENGTH
 * @see    generate_password()
 * @example
 * echo reset_author_pass('username');
 */
function reset_author_pass($name)
{
    $email = safe_field("email", 'txp_users', "name = '" . doSlash($name) . "'");
    $new_pass = Txp::get('\\Textpattern\\Password\\Random')->generate(PASSWORD_LENGTH);
    $rs = change_user_password($name, $new_pass);
    if ($rs) {
        if (send_new_password($new_pass, $email, $name)) {
            return gTxt('password_sent_to') . ' ' . $email;
        } else {
            return gTxt('could_not_mail') . ' ' . $email;
        }
    } else {
        return gTxt('could_not_update_author') . ' ' . txpspecialchars($name);
    }
}
Example #11
0
 /**
  * {@inheritdoc}
  */
 public function __construct($filename)
 {
     $this->parser = \Txp::get('\\Textpattern\\Textpack\\Parser');
     parent::__construct($filename);
 }
Example #12
0
<head>
    <meta charset="utf-8">
    <title><?php 
echo gTxt('build');
?>
 &#124; Textpattern CMS</title><?php 
echo script_js('vendors/jquery/jquery/jquery.js', TEXTPATTERN_SCRIPT_URL) . script_js('vendors/jquery/jquery-ui/jquery-ui.js', TEXTPATTERN_SCRIPT_URL) . script_js('var textpattern = ' . json_encode(array('event' => $event, 'step' => $step, '_txp_token' => form_token(), 'textarray' => (object) null)) . ';') . script_js('textpattern.js', TEXTPATTERN_SCRIPT_URL) . n;
// Mandatory un-themable Textpattern core styles
?>
    <?php 
echo $theme->html_head();
?>
</head>
<body id="tag-event">
<?php 
echo \Txp::get('\\Textpattern\\Tag\\BuilderTags')->renderTagHelp(gps('tag_name'));
?>
</body>
</html>
<?php 
/**
 * Collection of tag builder functions.
 *
 * @package Admin\Tag
 */
class BuilderTags
{
    /**
     * HTML block for the header portion of the form tag.
     *
     * @var string
Example #13
0
 * as published by the Free Software Foundation, version 2.
 *
 * Textpattern is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Textpattern. If not, see <http://www.gnu.org/licenses/>.
 */
/**
 * Collection of tag functions.
 *
 * @package Tag
 */
Txp::get('Textpattern_Tag_Registry')->register('page_title')->register('css')->register('image')->register('thumbnail')->register('output_form')->register(array('Textpattern_Tag_Syntax_Partial', 'renderYield'), 'yield')->register(array('Textpattern_Tag_Syntax_Partial', 'renderIfYield'), 'if_yield')->register('feed_link')->register('link_feed_link')->register('linklist')->register('tpt_link', 'link')->register('linkdesctitle')->register('link_name')->register('link_url')->register('link_author')->register('link_description')->register('link_date')->register('link_category')->register('link_id')->register(array('Textpattern_Tag_Syntax_Link', 'renderIfFirstLink'), 'if_first_link')->register(array('Textpattern_Tag_Syntax_Link', 'renderIfLastLink'), 'if_last_link')->register('email')->register('password_protect')->register('recent_articles')->register('recent_comments')->register('related_articles')->register('popup')->register('category_list')->register('section_list')->register('search_input')->register('search_term')->register('link_to_next')->register('link_to_prev')->register('next_title')->register('prev_title')->register('site_name')->register('site_slogan')->register('link_to_home')->register('newer')->register('older')->register('text')->register('article_id')->register('article_url_title')->register('if_article_id')->register('posted')->register('expires')->register('if_expires')->register('if_expired')->register('modified')->register('comments_count')->register('comments_invite')->register('comments_form')->register('comments_error')->register('if_comments_error')->register('comments')->register('comments_preview')->register('if_comments_preview')->register('comment_permlink')->register('comment_id')->register('comment_name')->register('comment_email')->register('comment_web')->register('comment_time')->register('comment_message')->register('comment_anchor')->register(array('Textpattern_Tag_Syntax_Authors', 'renderAuthors'), 'authors')->register('author')->register('author_email')->register('if_author')->register('if_article_author')->register('body')->register('title')->register('excerpt')->register('category1')->register('category2')->register('category')->register('section')->register('keywords')->register('if_keywords')->register('if_article_image')->register('article_image')->register('search_result_title')->register('search_result_excerpt')->register('search_result_url')->register('search_result_date')->register('search_result_count')->register('image_index')->register('image_display')->register('images')->register('image_info')->register('image_url')->register('image_author')->register('image_date')->register(array('Textpattern_Tag_Syntax_Image', 'renderIfFirstImage'), 'if_first_image')->register(array('Textpattern_Tag_Syntax_Image', 'renderIfLastImage'), 'if_last_image')->register('if_thumbnail')->register('if_comments')->register('if_comments_allowed')->register('if_comments_disallowed')->register('if_individual_article')->register('if_article_list')->register('meta_keywords')->register('meta_author')->register('permlink')->register('lang')->register('breadcrumb')->register('if_excerpt')->register('if_search')->register('if_search_results')->register('if_category')->register('if_article_category')->register('if_first_category')->register('if_last_category')->register('if_section')->register('if_article_section')->register('if_first_section')->register('if_last_section')->register('php')->register('custom_field')->register('if_custom_field')->register('site_url')->register('error_message')->register('error_status')->register('if_status')->register('page_url')->register('if_different')->register('if_first_article')->register('if_last_article')->register('if_plugin')->register('file_download_list')->register('file_download')->register('file_download_link')->register('file_download_size')->register('file_download_created')->register('file_download_modified')->register('file_download_id')->register('file_download_name')->register('file_download_category')->register('file_download_author')->register('file_download_downloads')->register('file_download_description')->register(array('Textpattern_Tag_Syntax_File', 'renderIfFirstFile'), 'if_first_file')->register(array('Textpattern_Tag_Syntax_File', 'renderIfLastFile'), 'if_last_file')->register('hide')->register('rsd')->register('variable')->register('if_variable')->register('article')->register('article_custom')->register('txp_die')->register('comments_help')->register('comment_name_input')->register('comment_email_input')->register('comment_web_input')->register('comment_message_input')->register('comment_remember')->register('comment_preview')->register('comment_submit');
// -------------------------------------------------------------
function page_title($atts)
{
    global $parentid, $thisarticle, $id, $q, $c, $author, $context, $s, $pg, $sitename;
    extract(lAtts(array('separator' => ': '), $atts));
    $out = txpspecialchars($sitename . $separator);
    $parent_id = (int) $parentid;
    if ($parent_id) {
        $out .= gTxt('comments_on') . ' ' . escape_title(safe_field('Title', 'textpattern', "ID = {$parent_id}"));
    } elseif ($thisarticle['title']) {
        $out .= escape_title($thisarticle['title']);
    } elseif ($q) {
        $out .= gTxt('search_results') . txpspecialchars($separator . $q);
    } elseif ($c) {
        $out .= txpspecialchars(fetch_category_title($c, $context));
Example #14
0
/**
 * Renders a HTML &lt;select&gt; list of cities for timezone selection.
 *
 * Can be altered by plugins via the 'prefs_ui > gmtoffset'
 * pluggable UI callback event.
 *
 * @param  string $name HTML name of the list
 * @param  string $val  Initial (or current) selected option
 * @return string HTML
 */
function gmtoffset_select($name, $val)
{
    // Fetch *hidden* pref
    $key = get_pref('timezone_key', '', true);
    if ($key === '') {
        $key = (string) Txp::get('Textpattern_Date_Timezone')->getTimezone();
    }
    $tz = new timezone();
    $ui = $tz->selectInput('timezone_key', $key, false, '', 'gmtoffset');
    return pluggable_ui('prefs_ui', 'gmtoffset', $ui, $name, $val);
}
Example #15
0
?>
">
<head>
<meta charset="utf-8">
<title><?php 
echo gTxt('build');
?>
 &#124; Textpattern CMS</title><?php 
echo script_js('vendors/jquery/jquery/jquery.js', TEXTPATTERN_SCRIPT_URL) . script_js('vendors/jquery/ui/js/jquery-ui.js', TEXTPATTERN_SCRIPT_URL) . script_js('//code.jquery.com/jquery-migrate-1.2.1.js', TEXTPATTERN_SCRIPT_URL) . script_js('var textpattern = ' . json_encode(array('event' => $event, 'step' => $step, '_txp_token' => form_token(), 'textarray' => (object) null)) . ';') . script_js('textpattern.js', TEXTPATTERN_SCRIPT_URL) . n;
// Mandatory un-themable Textpattern core styles
echo $theme->html_head();
?>
</head>
<body id="tag-event">
<?php 
echo Txp::get('Textpattern_Tag_BuilderTags')->renderTagHelp(gps('tag_name'));
?>
</body>
</html>
<?php 
/**
 * Collection of tag builder functions.
 *
 * @package Admin\Tag
 */
class Textpattern_Tag_BuilderTags
{
    /**
     * HTML block for the header portion of the form tag.
     *
     * @var string
Example #16
0
 /**
  * Gets accepted language.
  *
  * If $languages is NULL, returns client's favoured language. If
  * string, checks whether the language is supported and
  * if an array, returns the language that the client favours the most.
  *
  * <code>
  * echo Txp::get('\Textpattern\Http\Request')->getAcceptedLanguage('fi-FI');
  * </code>
  *
  * The above will return 'fi-FI' as long as the Accept-Language header
  * contains an indentifier that matches Finnish, such as 'fi-fi', 'fi-Fi'
  * or 'fi'.
  *
  * @param  string|array $languages Languages to check
  * @param  float        $threshold Quality threshold
  * @return string|bool Accepted language, or FALSE
  */
 public function getAcceptedLanguage($languages = null, $threshold = 0.1)
 {
     $accepts = $this->getAcceptsMap($this->request->getVariable('HTTP_ACCEPT_LANGUAGE'));
     if ($languages === null) {
         $accepts = array_keys($accepts);
         return array_shift($accepts);
     }
     $top = 0;
     $acceptedLanguage = false;
     foreach ((array) $languages as $language) {
         $search = array($language);
         if ($identifiers = \Txp::get('\\Textpattern\\L10n\\Locale')->getLocaleIdentifiers($language)) {
             $search = array_map('strtolower', array_merge($search, $identifiers));
         }
         foreach ($accepts as $accept => $params) {
             if (in_array(strtolower($accept), $search, true) && $params['q'] >= $threshold && $params['q'] >= $top) {
                 $top = $quality;
                 // FIXME: $quality is made out of thin air.
                 $acceptedLanguage = $language;
             }
         }
     }
     return $acceptedLanguage;
 }
Example #17
0
/**
 * Renders a dropdown for selecting Textfilter method preferences.
 *
 * @param  string $name Element name
 * @param  string $val  Current value
 * @param  string $id   HTML id attribute for the select input element
 * @return string HTML
 */
function pref_text($name, $val, $id = '')
{
    $id = $id ? $id : $name;
    $vals = Txp::get('Textpattern_Textfilter_Registry')->getMap();
    return selectInput($name, $vals, $val, '', '', $id);
}
Example #18
0
/**
 * Saves the active language.
 */
function save_language()
{
    global $textarray, $locale;
    extract(psa(array('language')));
    if (safe_field("lang", 'txp_lang', "lang = '" . doSlash($language) . "' LIMIT 1")) {
        $locale = $prefs['locale'] = Txp::get('\\Textpattern\\L10n\\Locale')->getLanguageLocale($language);
        Txp::get('\\Textpattern\\L10n\\Locale')->setLocale(LC_ALL, $language);
        set_pref('locale', $locale);
        set_pref('language', $language);
        $textarray = load_lang($language);
        list_languages(gTxt('preferences_saved'));
        return;
    }
    list_languages(array(gTxt('language_not_installed', array('{name}' => $language)), E_ERROR));
}
Example #19
0
abc_one_more => Noch einer
EOT;
**/
// End of textpack
if (!defined('txpinterface')) {
    @(include_once 'zem_tpl.php');
}
# --- BEGIN PLUGIN CODE ---
/**
 * This is pax_grep: A plugin for Textpattern
 * version 0.2.1
 * by John Stephens, adapted from rah_replace by Jukka Svahn
 * https://designop.us/
 */
if (class_exists('\\Textpattern\\Tag\\Registry')) {
    Txp::get('\\Textpattern\\Tag\\Registry')->register('pax_grep');
}
function pax_grep($atts, $thing)
{
    global $pretext;
    extract(lAtts(array('from' => '', 'to' => '', 'delimiter' => ','), $atts));
    $from = explode($delimiter, $from);
    $to = explode($delimiter, $to);
    $count = count($to);
    if ($count == 1) {
        $to = implode('', $to);
    }
    if ($count == 0) {
        $to = '';
    }
    return preg_replace($from, $to, parse($thing));