User:Sysy~metawiki/Scott Elcomb's RSS hack

From Meta, a Wikimedia project coordination wiki

Cached from http://www.gtalug.org/wiki/User:Dl33t

Please note that in order to authenticate, the users' name and password need to be sent to the script in plaintext... Using HTTPS (SSL, GET or POST) to access the feed generator is highly recommended.

Interrupted during Customizable MediaWiki/RSS Engine test - Temp Storage - Current time is 28minutes[edit]

#!/usr/bin/perl
                                                                                                                             
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use SAL::DBI;
                                                                                                                             
# // Configuration
my $mediawiki_name = 'MyWiki';
my $mediawiki_url = 'http://localhost/mediawiki/index.php';
my $mediawiki_description = 'This is MyWiki';
                                                                                                                             
# // Get parameters
my $q = new CGI;
my $self_url = $q->script_name();
my $user = $q->param('u');
my $pass = $q->param('p');
                                                                                                                             
# // Setup database interface
my $dbo_factory = new SAL::DBI;
my $dbo_data = $dbo_factory->spawn_mysql('localhost','wikidbuser','wikidbpass','wikidb');
my $dbo_data2 = $dbo_factory->spawn_mysql('localhost','wikidbuser','wikidbpass','wikidb');
                                                                                                                             
# // NOTE:  SAL stores SQL datasets as 2D arrays, accessible like so: $dbo_data->{data}->[$recordNum][$fieldNum]
                                                                                                                             
# // Authenticate the user and password
my $SQL_auth_query = qq[SELECT count(user_id) FROM user WHERE (user_name='$user') AND (user_password = md5(concat(user_id,'-',md5('$pass'))))];
                                                                                                                             
$dbo_data->execute($SQL_auth_query);
if ($dbo_data->{data}->[0][0] != 1) { die('Not Authorized!'); }
                                                                                                                             
# // Get the user's watchlist
my $SQL_watchlist_query = qq[SELECT a.wl_title, a.wl_namespace FROM watchlist AS a, user AS b WHERE (a.wl_user=b.user_id) AND (b.user_name='$user')];
                                                                                                                             
# // NOTE:  The SAL execute method returns the width and height of the dataset...
my ($w, $h) = $dbo_data->execute(qq[$SQL_watchlist_query]);
                                                                                                                             
 
# // Start the RSS document
my $canvas = qq[<rss version="0.91">
  <channel>
    <title>$mediawiki_name</title>
    <link>$mediawiki_url</link>
    <description>$mediawiki_description</description>
    <language>en-us</language>
];
 
# // Loop through the items
foreach my $i (0 .. $h) {
        my $mediawiki_item_title = $dbo_data->{data}->[$i][0];
        my $mediawiki_item_namespace = $dbo_data->{data}->[$i][1];
        my $SQL_item_query = '';
 
        if ($mediawiki_item_namespace == 0) {
                my $mediawiki_item_link = $mediawiki_url . '/' . $mediawiki_item_title;
 
                $SQL_item_query = qq[SELECT a.old_text FROM text AS a, page AS b WHERE (a.old_id = b.page_latest) AND (b.page_title='$mediawiki_item_title')];
 
                $dbo_data2->execute($SQL_item_query);
 
                my $mediawiki_item_description = $dbo_data2->{data}[0][0];
 
                $canvas .= qq[    <item>
      <title>$mediawiki_item_title</title>
      <link>$mediawiki_item_link</link>
      <description>$mediawiki_item_description</description>
    </item>
];
        }
}
 
# // Close the RSS document
$canvas .= qq[  </channel>
</rss>
];
 
# // And send it to the client
print "Content-type: text/xml\n\n" . $canvas;

Output:

<rss version="0.91">
  <channel>
    <title>MyWiki</title>
    <link>http://localhost/mediawiki/index.php</link>
    <description>This is MyWiki</description>
    <language>en-us</language>
    <item>
      <title>Main_Page</title>
      <link>http://localhost/mediawiki/index.php/Main_Page</link>
      <description>Wiki software successfully installed.
 
Please see [http://meta.wikipedia.org/wiki/MediaWiki_i18n documentation on customizing the interface]
and the [http://meta.wikipedia.org/wiki/MediaWiki_User%27s_Guide User's Guide] for usage and configuration help.
 
Yay!
 
Adding Edits</description>
    </item>
    <item>
      <title>Test_Page</title>
      <link>http://localhost/mediawiki/index.php/Test_Page</link>
      <description>This is a test
Now watching...</description>
    </item>
    <item>
      <title></title>
      <link>http://localhost/mediawiki/index.php/</link>
      <description></description>
    </item>
  </channel>
</rss>