<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>gehrcke.de &#187; PHP/HTML/CSS</title> <atom:link href="http://gehrcke.de/category/technical-stuff/php-html-css/feed/" rel="self" type="application/rss+xml" /><link>http://gehrcke.de</link> <description>Jan-Philip Gehrcke&#039;s website</description> <lastBuildDate>Sun, 13 May 2012 17:17:35 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.2</generator> <item><title>My first WordPress plugin: WP-GeSHi-Highlight</title><link>http://gehrcke.de/2010/11/my-first-wordpress-plugin-wp-geshi-highlight/</link> <comments>http://gehrcke.de/2010/11/my-first-wordpress-plugin-wp-geshi-highlight/#comments</comments> <pubDate>Sat, 20 Nov 2010 22:29:40 +0000</pubDate> <dc:creator>Jan-Philip Gehrcke</dc:creator> <category><![CDATA[PHP/HTML/CSS]]></category> <category><![CDATA[Technical Stuff]]></category> <category><![CDATA[Wordpress]]></category> <category><![CDATA[WP-GeSHi-Highlight]]></category> <guid
isPermaLink="false">http://gehrcke.de/?p=1360</guid> <description><![CDATA[<p>Due to several reasons, some days ago I started to write my own syntax highlighting plugin for WordPress. At this point, I&#8217;m quite content with the outcoming.</p><p>I call it WP-GeSHi-Highlight, as it is based on GeSHi. I&#8217;ve started to create a fixed website for it: http://gehrcke.de/wp-geshi-highlight And I&#8217;m about to release version 1.0.0. But [...]]]></description> <content:encoded><![CDATA[<p>Due to several reasons, some days ago I started to write my own syntax highlighting plugin for <a
href="http://wordpress.org/">WordPress</a>. At this point, I&#8217;m quite content with the outcoming.<span
id="more-1360"></span></p><p>I call it <strong>WP-GeSHi-Highlight</strong>, as it is based on <a
href="http://qbnz.com/highlighter">GeSHi</a>. I&#8217;ve started to create a fixed website for it: <a
href="http://gehrcke.de/wp-geshi-highlight">http://gehrcke.de/wp-geshi-highlight</a><br
/> And I&#8217;m about to release version 1.0.0. But before I do so, I test it on my own blog by presenting its own source code here. Technical details can be found in there.</p><div
class="wp-geshi-highlight-wrap5"><div
class="wp-geshi-highlight-wrap4"><div
class="wp-geshi-highlight-wrap3"><div
class="wp-geshi-highlight-wrap2"><div
class="wp-geshi-highlight-wrap"><div
class="wp-geshi-highlight"><div
class="php"><ol><li
class="li1"><pre class="de1"><span class="kw2">&lt;?php</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// This is the entry point of the plugin (Right after Wordpress is done</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// processing the user request, setting up `$wp_query` etc, and right before the</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// template renders the HTML output.</span></pre></li><li
class="li1"><pre class="de1">add_action<span class="br0">&#40;</span><span class="st_h">'template_redirect'</span><span class="sy0">,</span> <span class="st_h">'wp_geshi_main'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_main<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_codesnipmatch_arrays</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_run_token</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Generate unique token. Code snippets will be replaced by it (+snip ID)</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// temporarily during the action of this plugin.</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$wp_geshi_run_token</span> <span class="sy0">=</span> <span class="kw3">md5</span><span class="br0">&#40;</span><span class="kw3">uniqid</span><span class="br0">&#40;</span><span class="kw3">rand</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// from Ryan McGeary</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Filter all post/comment text and save and replace code snippets.</span></pre></li><li
class="li1"><pre class="de1">    wp_geshi_filter_and_replace_code_snippets<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// If we did not find any code snippets, it's time to leave...</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$wp_geshi_codesnipmatch_arrays</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">return</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// `$wp_geshi_codesnipmatch_arrays` is populated. Work on it: it's now</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// GeSHi's part: highlight the code an generate CSS code.</span></pre></li><li
class="li1"><pre class="de1">    wp_geshi_highlight_and_generate_css<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Now, `$wp_geshi_css_code` and `$wp_geshi_highlighted_matches` are set.</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Add action to add CSS code to HTML header.</span></pre></li><li
class="li1"><pre class="de1">    add_action<span class="br0">&#40;</span><span class="st_h">'wp_head'</span><span class="sy0">,</span> <span class="st_h">'wp_geshi_add_css_to_head'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Add low priority filter to replace unique identifiers with highlighted</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// code.</span></pre></li><li
class="li1"><pre class="de1">    add_filter<span class="br0">&#40;</span><span class="st_h">'the_content'</span><span class="sy0">,</span> <span class="st_h">'wp_geshi_insert_highlighted_code_filter'</span><span class="sy0">,</span> <span class="nu0">99</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    add_filter<span class="br0">&#40;</span><span class="st_h">'the_excerpt'</span><span class="sy0">,</span> <span class="st_h">'wp_geshi_insert_highlighted_code_filter'</span><span class="sy0">,</span> <span class="nu0">99</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    add_filter<span class="br0">&#40;</span><span class="st_h">'comment_text'</span><span class="sy0">,</span> <span class="st_h">'wp_geshi_insert_highlighted_code_filter'</span><span class="sy0">,</span> <span class="nu0">99</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="co1">// Parse all post texts and comment texts (the latter only in case of single</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// pages). While iterating over these texts, do the following:</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// - detect &lt;pre args&gt; code code code &lt;/ pre&gt; parts.</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// - save these parts in a global variable.</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// - modify post/comment texts: replace code parts by a unique token.</span></pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_filter_and_replace_code_snippets<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_query</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Iterate over all posts in this query.</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">posts</span> <span class="kw1">as</span> <span class="re0">$post</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">        <span class="co1">// Extract code snippets from the content. Replace them.</span></pre></li><li
class="li1"><pre class="de1">        <span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">post_content</span> <span class="sy0">=</span> wp_geshi_filter_replace_code<span class="br0">&#40;</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">post_content</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">        <span class="kw1">if</span> <span class="br0">&#40;</span>is_single<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$comments_array</span> <span class="sy0">=</span> get_approved_comments<span class="br0">&#40;</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">ID</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="co1">// Iterate over all approved comments belonging to this post.</span></pre></li><li
class="li1"><pre class="de1">            <span class="co1">// Filter them, too.</span></pre></li><li
class="li1"><pre class="de1">            <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$comments_array</span> <span class="kw1">as</span> <span class="re0">$comment</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">                <span class="re0">$comment</span><span class="sy0">-&gt;</span><span class="me1">comment_content</span> <span class="sy0">=</span> wp_geshi_filter_replace_code<span class="br0">&#40;</span></pre></li><li
class="li1"><pre class="de1">                    <span class="re0">$comment</span><span class="sy0">-&gt;</span><span class="me1">comment_content</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">                <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">            <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">        <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="co1">// Search for all &lt;pre args&gt;code&lt;/ pre&gt; occurrences. Save them in a global var.</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// Replace them with unambiguous identifiers.</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// `wp_geshi_substitute($match)` is called for each match.</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// A `$match` is an array, following the sub-pattern of the regex:</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// 0: all</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// 1: language</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// 2: line</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// 3: escaped</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// 4: cssfile</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// 5: code</span></pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_filter_replace_code<span class="br0">&#40;</span><span class="re0">$s</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">return</span> <span class="kw3">preg_replace_callback</span><span class="br0">&#40;</span></pre></li><li
class="li1"><pre class="de1">        <span class="st0">&quot;/\s*&lt;pre(?:lang=[<span class="es1">\&quot;</span>']([\w-]+)[<span class="es1">\&quot;</span>']|line=[<span class="es1">\&quot;</span>'](\d*)[<span class="es1">\&quot;</span>']&quot;</span></pre></li><li
class="li1"><pre class="de1">        <span class="sy0">.</span><span class="st0">&quot;|escaped=[<span class="es1">\&quot;</span>'](true|false)?[<span class="es1">\&quot;</span>']|cssfile=[<span class="es1">\&quot;</span>']([\S]+)[<span class="es1">\&quot;</span>']|\s)+&gt;&quot;</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">        <span class="st0">&quot;(.*)&lt;\/pre&gt;\s*/siU&quot;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="st0">&quot;wp_geshi_store_and_substitute&quot;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="re0">$s</span></pre></li><li
class="li1"><pre class="de1">        <span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="co1">// Store code snippet data. Return unambiguous identifier for this code snippet.</span></pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_store_and_substitute<span class="br0">&#40;</span><span class="re0">$match_array</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_run_token</span><span class="sy0">,</span> <span class="re0">$wp_geshi_codesnipmatch_arrays</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// count() returns 0 if the variable is not set already.</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// We need this index for the identifier of this code snippet.</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$match_index</span> <span class="sy0">=</span> <span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$wp_geshi_codesnipmatch_arrays</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Elements of $match_array are strings matching the sub-expressions in the</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// big regular expression searching &lt;pre args&gt;code&lt;/ pre&gt;. They contain</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// the arguments of &lt;pre&gt; tag and the code snippet itself.</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Store this array for later usage. Before, store the match index as last</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// array element to `$match_array`.</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$match_array</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$match_index</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$wp_geshi_codesnipmatch_arrays</span><span class="br0">&#91;</span><span class="re0">$match_index</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$match_array</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Return a string that is unambiguously to identify during another filter</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// run. This string replaces the &lt;pre args&gt;code&lt;/ pre&gt; code snippet for now.</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">return</span> <span class="st0">&quot;<span class="es1">\n</span>&lt;p&gt;&quot;</span><span class="sy0">.</span><span class="re0">$wp_geshi_run_token</span><span class="sy0">.</span><span class="st0">&quot;_&quot;</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">        <span class="kw3">sprintf</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es6">%06d</span>&quot;</span><span class="sy0">,</span><span class="re0">$match_index</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;&lt;/p&gt;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span> <span class="co1">// from Ryan McGeary</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="co1">// Iterate over all match arrays in `$wp_geshi_codesnipmatch_arrays`.</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// Perform syntax highlighting and store the resulting string back in e.g.</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// `$wp_geshi_highlighted_matches[$match_index]`.</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// Generate CSS code and append it to global `$wp_geshi_css_code`.</span></pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_highlight_and_generate_css<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_codesnipmatch_arrays</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_css_code</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_highlighted_matches</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_requested_css_files</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// When we're here, code was found.</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Time to get the highlight machine running...</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&quot;geshi/geshi.php&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$wp_geshi_css_code</span> <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$wp_geshi_codesnipmatch_arrays</span> <span class="kw1">as</span> <span class="re0">$match_index</span> <span class="sy0">=&gt;</span> <span class="re0">$match</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">            <span class="co1">// process the match details. the correspondence is explained at</span></pre></li><li
class="li1"><pre class="de1">            <span class="co1">// function `wp_geshi_filter_replace_code()`.</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$language</span> <span class="sy0">=</span> <span class="kw3">strtolower</span><span class="br0">&#40;</span><span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$match</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$line</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$match</span><span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$escaped</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$match</span><span class="br0">&#91;</span><span class="nu0">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$cssfile</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$match</span><span class="br0">&#91;</span><span class="nu0">4</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$code</span> <span class="sy0">=</span> wp_geshi_code_trim<span class="br0">&#40;</span><span class="re0">$match</span><span class="br0">&#91;</span><span class="nu0">5</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$escaped</span> <span class="sy0">==</span> <span class="st0">&quot;true&quot;</span><span class="br0">&#41;</span></pre></li><li
class="li1"><pre class="de1">                <span class="re0">$code</span> <span class="sy0">=</span> <span class="kw3">htmlspecialchars_decode</span><span class="br0">&#40;</span><span class="re0">$code</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// from Ryan McGeary</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">            <span class="co1">// set up GeSHi</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$geshi</span> <span class="sy0">=</span> <span class="kw2">new</span> GeSHi<span class="br0">&#40;</span><span class="re0">$code</span><span class="sy0">,</span> <span class="re0">$language</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_keyword_links</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_classes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$line</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">                <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">enable_line_numbers</span><span class="br0">&#40;</span>GESHI_NORMAL_LINE_NUMBERS<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">                <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">start_line_numbers_at</span><span class="br0">&#40;</span><span class="re0">$line</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">                <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">set_header_type</span><span class="br0">&#40;</span>GESHI_HEADER_PRE_VALID<span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$wp_geshi_css_code</span> <span class="sy0">.=</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">get_stylesheet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">            <span class="re0">$output</span> <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="co1">// cssfile &quot;none&quot; means no wrapping styling at all!</span></pre></li><li
class="li1"><pre class="de1">            <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$cssfile</span>&quot;</span> <span class="sy0">!=</span> <span class="st0">&quot;none&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">                <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$cssfile</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></li><li
class="li1"><pre class="de1">                    <span class="co1">// for this code snippet we need the default css file!</span></pre></li><li
class="li1"><pre class="de1">                    <span class="re0">$cssfile</span> <span class="sy0">=</span> <span class="st0">&quot;wp-geshi-highlight&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">                <span class="co1">// append &quot;the css file&quot; to the array..</span></pre></li><li
class="li1"><pre class="de1">                <span class="re0">$wp_geshi_requested_css_files</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$cssfile</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">                <span class="re0">$output</span> <span class="sy0">.=</span> <span class="st0">&quot;<span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="sy0">.</span><span class="st_h">'&lt;div class=&quot;'</span><span class="sy0">.</span><span class="re0">$cssfile</span><span class="sy0">.</span><span class="st_h">'-wrap5&quot;&gt;'</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">                           <span class="st_h">'&lt;div class=&quot;'</span><span class="sy0">.</span><span class="re0">$cssfile</span><span class="sy0">.</span><span class="st_h">'-wrap4&quot;&gt;'</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">                           <span class="st_h">'&lt;div class=&quot;'</span><span class="sy0">.</span><span class="re0">$cssfile</span><span class="sy0">.</span><span class="st_h">'-wrap3&quot;&gt;'</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">                           <span class="st_h">'&lt;div class=&quot;'</span><span class="sy0">.</span><span class="re0">$cssfile</span><span class="sy0">.</span><span class="st_h">'-wrap2&quot;&gt;'</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">                           <span class="st_h">'&lt;div class=&quot;'</span><span class="sy0">.</span><span class="re0">$cssfile</span><span class="sy0">.</span><span class="st_h">'-wrap&quot;&gt;'</span><span class="sy0">.</span>      </pre></li><li
class="li1"><pre class="de1">                           <span class="st_h">'&lt;div class=&quot;'</span><span class="sy0">.</span><span class="re0">$cssfile</span><span class="sy0">.</span><span class="st_h">'&quot;&gt;'</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">                <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$output</span> <span class="sy0">.=</span> <span class="re0">$geshi</span><span class="sy0">-&gt;</span><span class="me1">parse_code</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&quot;<span class="es4">$cssfile</span>&quot;</span> <span class="sy0">!=</span> <span class="st0">&quot;none&quot;</span><span class="br0">&#41;</span></pre></li><li
class="li1"><pre class="de1">                <span class="re0">$output</span> <span class="sy0">.=</span> <span class="st_h">'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;'</span><span class="sy0">.</span><span class="st0">&quot;<span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$wp_geshi_highlighted_matches</span><span class="br0">&#91;</span><span class="re0">$match_index</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$output</span><span class="sy0">;</span>  </pre></li><li
class="li1"><pre class="de1">        <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// At this point all code snippets are parsed. highlighted code is stored.</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// CSS code is generated. Delete what's not necessary anymore.</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw3">unset</span><span class="br0">&#40;</span><span class="re0">$wp_geshi_codesnipmatch_arrays</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_insert_highlighted_code_filter<span class="br0">&#40;</span><span class="re0">$content</span><span class="br0">&#41;</span><span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_run_token</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">return</span> <span class="kw3">preg_replace_callback</span><span class="br0">&#40;</span></pre></li><li
class="li1"><pre class="de1">        <span class="st0">&quot;/&lt;p&gt;\s*&quot;</span><span class="sy0">.</span><span class="re0">$wp_geshi_run_token</span><span class="sy0">.</span><span class="st0">&quot;_(\d{6})\s*&lt;\/p&gt;/si&quot;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="st0">&quot;wp_geshi_get_highlighted_code&quot;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="re0">$content</span></pre></li><li
class="li1"><pre class="de1">        <span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// from Ryan McGeary</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_get_highlighted_code<span class="br0">&#40;</span><span class="re0">$match</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_highlighted_matches</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Found a unique identifier. Extract code snippet match index.</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$match_index</span> <span class="sy0">=</span> <span class="kw3">intval</span><span class="br0">&#40;</span><span class="re0">$match</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Return corresponding highlighted code.</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">return</span> <span class="re0">$wp_geshi_highlighted_matches</span><span class="br0">&#91;</span><span class="re0">$match_index</span><span class="br0">&#93;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_code_trim<span class="br0">&#40;</span><span class="re0">$code</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// Special ltrim b/c leading whitespace matters on 1st line of content.</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$code</span> <span class="sy0">=</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="st0">&quot;/^\s*<span class="es1">\n</span>/siU&quot;</span><span class="sy0">,</span> <span class="st0">&quot;&quot;</span><span class="sy0">,</span> <span class="re0">$code</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// from Ryan McGeary</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$code</span> <span class="sy0">=</span> <span class="kw3">rtrim</span><span class="br0">&#40;</span><span class="re0">$code</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="co1">// from Ryan McGeary</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">return</span> <span class="re0">$code</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_add_css_to_head<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_css_code</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw2">global</span> <span class="re0">$wp_geshi_requested_css_files</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="kw1">echo</span> <span class="st0">&quot;<span class="es1">\n</span>&lt;!-- WP-GeSHi-Highlight plugin by &quot;</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">         <span class="st0">&quot;Jan-Philip Gehrcke: http://gehrcke.de --&gt;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// set up paths and names</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$csspathpre</span> <span class="sy0">=</span> WP_PLUGIN_DIR<span class="sy0">.</span><span class="st0">&quot;/wp-geshi-highlight/&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$cssurlpre</span> <span class="sy0">=</span> WP_PLUGIN_URL<span class="sy0">.</span><span class="st0">&quot;/wp-geshi-highlight/&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$csssfx</span> <span class="sy0">=</span> <span class="st0">&quot;.css&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">    <span class="co1">// echo all required CSS files</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// delete duplicates</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$wp_geshi_requested_css_files</span> <span class="sy0">=</span> <span class="kw3">array_unique</span><span class="br0">&#40;</span><span class="re0">$wp_geshi_requested_css_files</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">foreach</span><span class="br0">&#40;</span><span class="re0">$wp_geshi_requested_css_files</span> <span class="kw1">as</span> <span class="re0">$cssfile</span><span class="br0">&#41;</span></pre></li><li
class="li1"><pre class="de1">        wp_geshi_echo_cssfile<span class="br0">&#40;</span><span class="re0">$csspathpre</span><span class="sy0">.</span><span class="re0">$cssfile</span><span class="sy0">.</span><span class="re0">$csssfx</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$cssurlpre</span><span class="sy0">.</span><span class="re0">$cssfile</span><span class="sy0">.</span><span class="re0">$csssfx</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="co1">// echo GeSHi CSS code if given</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re0">$wp_geshi_css_code</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span></pre></li><li
class="li1"><pre class="de1">        <span class="kw1">echo</span> <span class="st_h">'&lt;style type=&quot;text/css&quot;&gt;&lt;!--'</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">            <span class="re0">$wp_geshi_css_code</span><span class="sy0">.</span><span class="st0">&quot;//--&gt;&lt;/style&gt;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="kw2">function</span> wp_geshi_echo_cssfile<span class="br0">&#40;</span><span class="re0">$path</span><span class="sy0">,</span> <span class="re0">$url</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="re0">$path</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">        <span class="kw1">echo</span> <span class="st_h">'&lt;link rel=&quot;stylesheet&quot; href=&quot;'</span><span class="sy0">.</span><span class="re0">$url</span><span class="sy0">.</span></pre></li><li
class="li1"><pre class="de1">             <span class="st_h">'&quot; type=&quot;text/css&quot; media=&quot;screen&quot; /&gt;'</span><span class="sy0">.</span><span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">        <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1">&nbsp;</pre></li><li
class="li1"><pre class="de1"><span class="co1">// Set allowed attributes for pre tags. For more info see wp-includes/kses.php</span></pre></li><li
class="li1"><pre class="de1"><span class="co1">// credits: wp-syntax (Ryan McGeary)</span></pre></li><li
class="li1"><pre class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>CUSTOM_TAGS<span class="br0">&#41;</span> <span class="br0">&#123;</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$allowedposttags</span><span class="br0">&#91;</span><span class="st_h">'pre'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span></pre></li><li
class="li1"><pre class="de1">        <span class="st_h">'lang'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="st_h">'line'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="st_h">'escaped'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="st_h">'cssfile'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1">  <span class="co1">//Allow plugin use in comments</span></pre></li><li
class="li1"><pre class="de1">    <span class="re0">$allowedtags</span><span class="br0">&#91;</span><span class="st_h">'pre'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span></pre></li><li
class="li1"><pre class="de1">        <span class="st_h">'lang'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="st_h">'line'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="st_h">'escaped'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span></pre></li><li
class="li1"><pre class="de1">        <span class="st_h">'cssfile'</span> <span class="sy0">=&gt;</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span></pre></li><li
class="li1"><pre class="de1">    <span class="br0">&#41;</span><span class="sy0">;</span></pre></li><li
class="li1"><pre class="de1"><span class="br0">&#125;</span></pre></li><li
class="li1"><pre class="de1"><span class="sy1">?&gt;</span></pre></li></ol></div></div></div></div></div></div></div><p>Note: I had to change the <code>&lt;/pre&gt;</code> occurrences within to code to <code>&lt; / pre&gt;</code>&#8230; looks like something to think about and to add for the future&#8230; <img
src='http://gehrcke.de/wp/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://gehrcke.de/2010/11/my-first-wordpress-plugin-wp-geshi-highlight/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>WordPress vulnerability: Remote admin password reset</title><link>http://gehrcke.de/2009/08/wordpress-vulnerability-remote-admin-password-reset/</link> <comments>http://gehrcke.de/2009/08/wordpress-vulnerability-remote-admin-password-reset/#comments</comments> <pubDate>Tue, 11 Aug 2009 14:22:55 +0000</pubDate> <dc:creator>Jan-Philip Gehrcke</dc:creator> <category><![CDATA[PHP/HTML/CSS]]></category> <category><![CDATA[Security]]></category> <category><![CDATA[Technical Stuff]]></category> <category><![CDATA[Wordpress]]></category> <guid
isPermaLink="false">http://gehrcke.de/?p=777</guid> <description><![CDATA[<p>Today, a way was presented how to reset an admin&#8217;s password of a WordPress installation, by just calling http://domain.dom/wp-login.php?action=rp&#038;key[]=</p><p>So please, as long as there is no official release fixing this problem, apply this changeset to your wp-login.php.</p><p>Simply change line 190 in wp-login.php to</p> if &#40; empty&#40; $key &#41; &#124;&#124; is_array&#40; $key &#41; [...]]]></description> <content:encoded><![CDATA[<p>Today, <a
href="http://lists.grok.org.uk/pipermail/full-disclosure/2009-August/070137.html">a way was presented</a> how to reset an admin&#8217;s password of a WordPress installation, by just calling http://domain.dom/wp-login.php?action=rp&#038;key[]=<br
/> <span
id="more-777"></span></p><p>So please, as long as there is no official release fixing this problem, apply <a
href="http://core.trac.wordpress.org/changeset/11798">this changeset</a> to your <code>wp-login.php</code>.</p><p>Simply change <strong>line 190</strong> in <strong>wp-login.php</strong> to</p><div
class="wp-geshi-highlight-wrap5"><div
class="wp-geshi-highlight-wrap4"><div
class="wp-geshi-highlight-wrap3"><div
class="wp-geshi-highlight-wrap2"><div
class="wp-geshi-highlight-wrap"><div
class="wp-geshi-highlight"><div
class="php"><pre class="de1">    <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="kw3">empty</span><span class="br0">&#40;</span> <span class="re0">$key</span> <span class="br0">&#41;</span> <span class="sy0">||</span> <span class="kw3">is_array</span><span class="br0">&#40;</span> <span class="re0">$key</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span></pre></div></div></div></div></div></div></div><p>Then the &#8220;arraytrick&#8221; does not work anymore. The trick was, that after bypassing <code>if (empty($key))</code>, the database is queried for all users having a blank <code>user_activation_key</code> field. This is true for all users by default (except for those, who have recently ordered an activation key for password reset). Hence, the database simply returns the first user, whose <code>user_activation_key</code> is empty. His password then is reset. This user is likely the admin, because he is the first user in the table.</p><h4>Update:</h4><p>The changeset named above is not the only change the WordPress developers made. As we can see from <a
href="http://core.trac.wordpress.org/changeset/11800">changeset 11800</a> and <a
href="http://core.trac.wordpress.org/changeset/11801">changeset 11801</a>, the password reset is only done when the key is actually <strong>a string</strong> and the user calling the &#8220;reset password URL&#8221; is <strong>logged in</strong>. Both modifications are already branched, so you can take <a
href="http://core.trac.wordpress.org/browser/branches/2.8/wp-login.php?rev=11804">this wp-login.php</a> or wait for the next official release.</p><h4>Update2:</h4><p>The official update to WordPress 2.8.4 <a
href="http://wordpress.org/development/2009/08/2-8-4-security-release/">is released</a>! Update now!</p> ]]></content:encoded> <wfw:commentRss>http://gehrcke.de/2009/08/wordpress-vulnerability-remote-admin-password-reset/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>Atahualpa Theme: remove header image outline on click</title><link>http://gehrcke.de/2009/06/atahualpa-theme-remove-header-image-outline-on-klick/</link> <comments>http://gehrcke.de/2009/06/atahualpa-theme-remove-header-image-outline-on-klick/#comments</comments> <pubDate>Sat, 13 Jun 2009 11:37:24 +0000</pubDate> <dc:creator>Jan-Philip Gehrcke</dc:creator> <category><![CDATA[PHP/HTML/CSS]]></category> <category><![CDATA[Technical Stuff]]></category> <category><![CDATA[Wordpress]]></category> <guid
isPermaLink="false">http://gehrcke.de/wp/?p=357</guid> <description><![CDATA[<p>I am using the Atahualpa Theme and I think it&#8217;s annoying to get an outline around the header image while clicking on it by default. The outline is the dashed line around the header image that appears when you press your mouse button down while hovering over the image (at least in Firefox 3). There [...]]]></description> <content:encoded><![CDATA[<p>I am using the <a
href="http://wordpress.bytesforall.com/?p=71">Atahualpa Theme</a> and I think it&#8217;s annoying to get an outline around the header image while clicking on it by default. The outline is the dashed line around the header image that appears when you press your mouse button down while hovering over the image (at least in Firefox 3). There is a very easy way to remove it:<span
id="more-357"></span></p><p>Add the following to your <code>Appearance -&gt; Athualpa Theme Options -&gt; HTML/CSS inserts</code>:</p><div
class="wp-geshi-highlight-wrap5"><div
class="wp-geshi-highlight-wrap4"><div
class="wp-geshi-highlight-wrap3"><div
class="wp-geshi-highlight-wrap2"><div
class="wp-geshi-highlight-wrap"><div
class="wp-geshi-highlight"><div
class="css"><pre class="de1">a<span class="re2">:active</span><span class="sy0">,</span> a<span class="re2">:focus</span><span class="br0">&#123;</span><span class="kw1">outline</span><span class="sy0">:</span> <span class="kw2">none</span><span class="br0">&#125;</span></pre></div></div></div></div></div></div></div><p>Works for me <img
src='http://gehrcke.de/wp/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://gehrcke.de/2009/06/atahualpa-theme-remove-header-image-outline-on-klick/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Bad looking Sabre registration form &#8211; let&#8217;s fix it!</title><link>http://gehrcke.de/2009/06/bad-looking-sabre-registration-form/</link> <comments>http://gehrcke.de/2009/06/bad-looking-sabre-registration-form/#comments</comments> <pubDate>Fri, 12 Jun 2009 21:11:47 +0000</pubDate> <dc:creator>Jan-Philip Gehrcke</dc:creator> <category><![CDATA[PHP/HTML/CSS]]></category> <category><![CDATA[Technical Stuff]]></category> <category><![CDATA[Wordpress]]></category> <guid
isPermaLink="false">http://gehrcke.de/wp/?p=310</guid> <description><![CDATA[<p>I just installed Sabre 0.9.0 to have a secure registration form for my WordPress pages. Basically it&#8217;s a really nice plugin (thank you for providing it!), but I think the registration form is really bad looking by default:</p><p
class="wp-caption-text">default registration from using Sabre 0.9.0</p><p>After some changes in the code it looks like this:</p> [...]]]></description> <content:encoded><![CDATA[<p>I just installed <a
href="http://didier.lorphelin.free.fr/blog/index.php/wordpress/sabre/">Sabre</a> 0.9.0 to have a secure registration form for my WordPress pages. Basically it&#8217;s a really nice plugin (thank you for providing it!), but I think the registration form is really <strong>bad looking</strong> by default:<span
id="more-310"></span></p><div
class="wp-caption aligncenter" style="width: 322px"><img
alt="default registration from using Sabre 0.9.0" src="http://gehrcke.de/wp/blog_content/sabre_registerform_bad.png" title="default registration from using Sabre 0.9.0" width="312" height="460" /><p
class="wp-caption-text">default registration from using Sabre 0.9.0</p></div><p><strong>After some changes in the code it looks like this</strong>:</p><div
class="wp-caption aligncenter" style="width: 322px"><img
alt="registration form after some modifications" src="http://gehrcke.de/wp/blog_content/sabre_registerform_good.png" title="registration form after some modifications" width="312" height="484" /><p
class="wp-caption-text">registration form after some modifications</p></div><p><strong>This is what I thought and did:</strong></p><ul><li>I want the user to be able to define his password at registration. So, &#8220;A password will be e-mailed to you&#8221; does not make any sense. Therefore I changed<br
/> <strong>wp-login.php</strong> line <strong>418</strong> to:</p><div
class="wp-geshi-highlight-wrap5"><div
class="wp-geshi-highlight-wrap4"><div
class="wp-geshi-highlight-wrap3"><div
class="wp-geshi-highlight-wrap2"><div
class="wp-geshi-highlight-wrap"><div
class="wp-geshi-highlight"><div
class="php"><pre class="de1">&lt;p id=&quot;reg_passmail&quot;&gt;<span class="kw2">&lt;?php</span> _e<span class="br0">&#40;</span><span class="st_h">'An email will be sent to you.'</span><span class="br0">&#41;</span> <span class="sy1">?&gt;</span>&lt;/p&gt;</pre></div></div></div></div></div></div></div></li><li>The password strengh calculator is nonsense in this case. In this case, nobody uses a personal password getting evaluated as &#8220;strong&#8221;. And, while the calculator switches from &#8220;Too Short&#8221; to &#8220;Bad&#8221; when you have at least 4 chars, the password is actually still too short, because Sabre wants a password of 6 chars at minimum. Additionally, the note that one should use special characters looks bad. I kicked the whole notice out and chose a minimum of 4 chars:<br
/> In <strong>wp-content/plugins/sabre/classes/sabre_class.php</strong> comment out the lines <strong>113/114</strong>:</p><div
class="wp-geshi-highlight-wrap5"><div
class="wp-geshi-highlight-wrap4"><div
class="wp-geshi-highlight-wrap3"><div
class="wp-geshi-highlight-wrap2"><div
class="wp-geshi-highlight-wrap"><div
class="wp-geshi-highlight"><div
class="php"><pre class="de1"><span class="co1">//echo '&lt;strong&gt;' . __('Strength indicator') . '&lt;/strong&gt;&lt;br /&gt;';</span>
<span class="co1">//echo '&lt;label id=&quot;pass-strength-result&quot;&gt;' . __('Too short', 'sabre') . '&lt;/label&gt;&lt;br /&gt;' . __('Hint: Your password should be at least seven characters long. To make it stronger, use upper and lower case letters, numbers and symbols like ! &quot; ? $ % ^ &amp;amp; ).');</span></pre></div></div></div></div></div></div></div><p>Go to lines <strong>326/327</strong> and modify it to your required number of characters (in this case 4):</p><div
class="wp-geshi-highlight-wrap5"><div
class="wp-geshi-highlight-wrap4"><div
class="wp-geshi-highlight-wrap3"><div
class="wp-geshi-highlight-wrap2"><div
class="wp-geshi-highlight-wrap"><div
class="wp-geshi-highlight"><div
class="php"><pre class="de1"><span class="br0">&#125;</span><span class="kw1">elseif</span><span class="br0">&#40;</span><span class="kw3">strlen</span><span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st_h">'user_pwd1'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">&lt;</span><span class="nu0">4</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="re0">$error_msg_text</span> <span class="sy0">=</span> __<span class="br0">&#40;</span><span class="st_h">'Password length is less than 4 characters.'</span><span class="sy0">,</span> <span class="st_h">'sabre'</span><span class="br0">&#41;</span><span class="sy0">;</span></pre></div></div></div></div></div></div></div></li><li>Okay, these logical things are fixed now, but the design is still bad. You need to adjust <strong>wp-admin/css/login.css</strong> line <strong>98</strong> by adding the id&#8217;s #user_pwd1, #user_pwd2 and #captcha. It then looks like:<div
class="wp-geshi-highlight-wrap5"><div
class="wp-geshi-highlight-wrap4"><div
class="wp-geshi-highlight-wrap3"><div
class="wp-geshi-highlight-wrap2"><div
class="wp-geshi-highlight-wrap"><div
class="wp-geshi-highlight"><div
class="css"><pre class="de1"><span class="re0">#user_pass</span><span class="sy0">,</span> <span class="re0">#user_login</span><span class="sy0">,</span> <span class="re0">#user_email</span><span class="sy0">,</span> <span class="re0">#user_pwd1</span><span class="sy0">,</span> <span class="re0">#user_pwd2</span><span class="sy0">,</span> <span class="re0">#captcha</span> <span class="br0">&#123;</span>
	<span class="kw1">font-size</span><span class="sy0">:</span> <span class="re3">24px</span><span class="sy0">;</span>
	<span class="kw1">width</span><span class="sy0">:</span> <span class="re3">97%</span><span class="sy0">;</span>
	<span class="kw1">padding</span><span class="sy0">:</span> <span class="re3">3px</span><span class="sy0">;</span>
        <span class="br0">&#91;</span>...<span class="br0">&#93;</span></pre></div></div></div></div></div></div></div></li></ul><p>That&#8217;s it. Your registration form should now look like in the picture above.</p> ]]></content:encoded> <wfw:commentRss>http://gehrcke.de/2009/06/bad-looking-sabre-registration-form/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> </channel> </rss>
