<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://htyp.org/mw/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%2Farchive%2Fextensions%2FSpecial%2FSiteSubscribe%2Fcode</id>
	<title>MediaWiki/archive/extensions/Special/SiteSubscribe/code - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://htyp.org/mw/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%2Farchive%2Fextensions%2FSpecial%2FSiteSubscribe%2Fcode"/>
	<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=MediaWiki/archive/extensions/Special/SiteSubscribe/code&amp;action=history"/>
	<updated>2026-07-01T21:18:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://htyp.org/mw/index.php?title=MediaWiki/archive/extensions/Special/SiteSubscribe/code&amp;diff=23411&amp;oldid=prev</id>
		<title>Woozle: Woozle moved page MediaWiki/Special/SiteSubscribe/code to MediaWiki/archive/extensions/Special/SiteSubscribe/code without leaving a redirect: obsolete, but may contain useful bits</title>
		<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=MediaWiki/archive/extensions/Special/SiteSubscribe/code&amp;diff=23411&amp;oldid=prev"/>
		<updated>2017-12-15T00:23:01Z</updated>

		<summary type="html">&lt;p&gt;Woozle moved page &lt;a href=&quot;/mw/index.php?title=MediaWiki/Special/SiteSubscribe/code&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;MediaWiki/Special/SiteSubscribe/code (page does not exist)&quot;&gt;MediaWiki/Special/SiteSubscribe/code&lt;/a&gt; to &lt;a href=&quot;/MediaWiki/archive/extensions/Special/SiteSubscribe/code&quot; title=&quot;MediaWiki/archive/extensions/Special/SiteSubscribe/code&quot;&gt;MediaWiki/archive/extensions/Special/SiteSubscribe/code&lt;/a&gt; without leaving a redirect: obsolete, but may contain useful bits&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:23, 15 December 2017&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Woozle</name></author>
	</entry>
	<entry>
		<id>https://htyp.org/mw/index.php?title=MediaWiki/archive/extensions/Special/SiteSubscribe/code&amp;diff=11590&amp;oldid=prev</id>
		<title>Woozle: finally, the code</title>
		<link rel="alternate" type="text/html" href="https://htyp.org/mw/index.php?title=MediaWiki/archive/extensions/Special/SiteSubscribe/code&amp;diff=11590&amp;oldid=prev"/>
		<updated>2009-04-03T11:47:50Z</updated>

		<summary type="html">&lt;p&gt;finally, the code&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==About==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTES&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* The reference to &amp;quot;researchwikis.com&amp;quot; &amp;#039;&amp;#039;&amp;#039;must be replaced&amp;#039;&amp;#039;&amp;#039; with a variable which refers to the current site. This is probably easy, but I don&amp;#039;t have time just at the moment to look this up and test it. --[[User:Woozle|Woozle]] 07:47, 3 April 2009 (EDT)&lt;br /&gt;
* There is a lot of logging code in the IPN handler which should either be removed or made so it can be turned on/off with a single flag.&lt;br /&gt;
==Code==&lt;br /&gt;
&amp;lt;php&amp;gt;&amp;lt;?php&lt;br /&gt;
/*&lt;br /&gt;
 NAME: Special:SiteSubscribe&lt;br /&gt;
 PURPOSE: Special page for managing site-access subscriptions activated in real-time&lt;br /&gt;
AUTHOR: Woozle (Nick) Staddon&lt;br /&gt;
 VERSION:&lt;br /&gt;
	2009-01-17 0.0 (Wzl) Writing started (again, after UPS failure)&lt;br /&gt;
	2009-02-12 0.0 (Wzl) changed name from Special:PayPal to Special:SiteSubscribe&lt;br /&gt;
	2009-02-28 0.1 (Wzl) everything working? payments logged, test status logged, user status checked on non-cached pages&lt;br /&gt;
	2009-03-04 0.2 (Wzl) swap out $wgParser so specialpage can be transcluded&lt;br /&gt;
	2009-04-03 0.3 (Wzl) additional fields in subscriber display: real name, email&lt;br /&gt;
*/&lt;br /&gt;
$wgSpecialPages[&amp;#039;SiteSubscribe&amp;#039;] = &amp;#039;SpecialSiteSubscribe&amp;#039;;	# Let MediaWiki know about the special page.&lt;br /&gt;
$wgHooks[&amp;#039;ArticleFromTitle&amp;#039;][] = &amp;#039;wfSubscriberCheck&amp;#039;;&lt;br /&gt;
$wgExtensionCredits[&amp;#039;other&amp;#039;][] = array(&lt;br /&gt;
        &amp;#039;name&amp;#039; =&amp;gt; &amp;#039;Special:SiteSubscribe&amp;#039;,&lt;br /&gt;
	&amp;#039;url&amp;#039; =&amp;gt; &amp;#039;http://htyp.org/MediaWiki/Special/SiteSubscribe&amp;#039;,&lt;br /&gt;
        &amp;#039;description&amp;#039; =&amp;gt; &amp;#039;special page for site subscription management&amp;#039;,&lt;br /&gt;
        &amp;#039;author&amp;#039; =&amp;gt; &amp;#039;Woozle (Nick) Staddon&amp;#039;,&lt;br /&gt;
	&amp;#039;version&amp;#039; =&amp;gt; &amp;#039;0.3 2009-04-03 alpha&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
// add a logging type&lt;br /&gt;
define(&amp;#039;ksSSLogType&amp;#039;,&amp;#039;subscribe&amp;#039;);&lt;br /&gt;
// table names&lt;br /&gt;
define(&amp;#039;ksTbl_Subscr&amp;#039;,&amp;#039;ssub_subscrs&amp;#039;);&lt;br /&gt;
define(&amp;#039;ksTbl_Paymts&amp;#039;,&amp;#039;ssub_paymts&amp;#039;);&lt;br /&gt;
define(&amp;#039;ksTbl_Posting&amp;#039;,&amp;#039;ssub_post&amp;#039;);&lt;br /&gt;
define(&amp;#039;ksTbl_PostLine&amp;#039;,&amp;#039;ssub_post_line&amp;#039;);&lt;br /&gt;
// formats&lt;br /&gt;
define(&amp;#039;ksFmt_DateSQL&amp;#039;,&amp;#039;Y-m-d&amp;#039;);&lt;br /&gt;
define(&amp;#039;ksFmt_DateShow&amp;#039;,&amp;#039;Y-m-d&amp;#039;);&lt;br /&gt;
define(&amp;#039;ksFmt_TimeSQL&amp;#039;,&amp;#039;Y-m-d G:i:s&amp;#039;);		// date format for SQL&lt;br /&gt;
// group strings&lt;br /&gt;
define(&amp;#039;ksPerm_SubscrUser&amp;#039;,&amp;#039;viewpremium&amp;#039;);	// the permission subscribers have&lt;br /&gt;
define(&amp;#039;ksPerm_SubscrEdit&amp;#039;,&amp;#039;editpremium&amp;#039;);	// the permission premium-page editors have&lt;br /&gt;
define(&amp;#039;ksPerm_SubscrAdmin&amp;#039;,&amp;#039;editsubscriptions&amp;#039;);	// the permission subscription editors have&lt;br /&gt;
define(&amp;#039;ksGrp_SubscrUser&amp;#039;,&amp;#039;subscriber&amp;#039;);	// the name for the group subscribers belong to&lt;br /&gt;
// options&lt;br /&gt;
define(&amp;#039;kfDoSubscribeSandbox&amp;#039;,FALSE);		// set to TRUE to subscribe from sandbox IPNs&lt;br /&gt;
$wgGroupPermissions[ksGrp_SubscrUser]	[ksPerm_SubscrUser]	= true;		// a new default permission&lt;br /&gt;
&lt;br /&gt;
function wfSpecialSiteSubscribe() {&lt;br /&gt;
// This registers the page&amp;#039;s class. I think.&lt;br /&gt;
	global $wgRequest;&lt;br /&gt;
&lt;br /&gt;
	$app = new SpecialSiteSubscribe($wgRequest);&lt;br /&gt;
&lt;br /&gt;
//	$app-&amp;gt;doMain();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function wfSubscriberCheck(&amp;amp;$title, &amp;amp;$article) {&lt;br /&gt;
	global $wgUser;&lt;br /&gt;
&lt;br /&gt;
	//LogSession();&lt;br /&gt;
	//LogText(&amp;quot;\n== Checking subscriber status - user &amp;quot;.$wgUser-&amp;gt;getName().&amp;#039; (&amp;#039;.$wgUser-&amp;gt;getID().&amp;#039;) page &amp;#039;.$title-&amp;gt;getFullText());&lt;br /&gt;
&lt;br /&gt;
	$objUser = new SiteSubscriber;&lt;br /&gt;
	$objUser-&amp;gt;Init_fromMWObj($wgUser);&lt;br /&gt;
	$objUser-&amp;gt;SynchStatus();&lt;br /&gt;
	//LogText(&amp;quot;\n== Status synch complete&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
require_once( $wgScriptPath.&amp;#039;includes/SpecialPage.php&amp;#039; );&lt;br /&gt;
class SpecialSiteSubscribe extends SpecialPage {&lt;br /&gt;
//require_once( $wgScriptPath.&amp;#039;includes/QueryPage.php&amp;#039; );&lt;br /&gt;
//class SpecialSiteSubscribe extends QueryPage {&lt;br /&gt;
/*==========&lt;br /&gt;
 STATIC&lt;br /&gt;
*/&lt;br /&gt;
	private static $vDB;&lt;br /&gt;
	private static $vLog;&lt;br /&gt;
&lt;br /&gt;
  public static function DB() {&lt;br /&gt;
	if (!is_object(self::$vDB)) {&lt;br /&gt;
		self::$vDB = wfGetDB( DB_MASTER );&lt;br /&gt;
	}&lt;br /&gt;
	return self::$vDB;&lt;br /&gt;
  }&lt;br /&gt;
  public static function Logger() {&lt;br /&gt;
	if (!is_object(self::$vLog)) {&lt;br /&gt;
		self::$vLog = new LogPage(ksSSLogType,FALSE);&lt;br /&gt;
	}&lt;br /&gt;
	return self::$vLog;&lt;br /&gt;
  }&lt;br /&gt;
  public static function DoLog($iAction,$iNotes,$iParams=array()) {&lt;br /&gt;
	global $wgTitle;&lt;br /&gt;
&lt;br /&gt;
	self::Logger()-&amp;gt;addEntry( $iAction, $wgTitle, $iNotes, $iParams);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
/*==========&lt;br /&gt;
 DYNAMIC&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
  public function __construct() {&lt;br /&gt;
	global $wgMessageCache;&lt;br /&gt;
	global $wgLogTypes, $wgLogNames;&lt;br /&gt;
&lt;br /&gt;
	parent::__construct( &amp;#039;SiteSubscribe&amp;#039; );&lt;br /&gt;
        $wgMessageCache-&amp;gt;addMessage(&amp;#039;sitesubscribe&amp;#039;, &amp;#039;Site subscriptions&amp;#039;);	// sets description on Special:SpecialPages&lt;br /&gt;
	$this-&amp;gt;includable( false );&lt;br /&gt;
&lt;br /&gt;
// logging&lt;br /&gt;
	$wgLogTypes[] = ksSSLogType;&lt;br /&gt;
	$wgLogNames[ksSSLogType] = &amp;#039;subscribe-log-page&amp;#039;;&lt;br /&gt;
	//$messages[&amp;#039;en&amp;#039;] = array(&amp;#039;subscribe-log-page&amp;#039; =&amp;gt; &amp;#039;Subscriber log&amp;#039;);&lt;br /&gt;
	$wgMessageCache-&amp;gt;addMessage(&amp;#039;subscribe-log-page&amp;#039;,&amp;#039;Subscriber log&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
//        $wgMessageCache-&amp;gt;addMessage(&amp;#039;logpost&amp;#039;, &amp;#039;Log POSTed data&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
  public function execute( $par ) {&lt;br /&gt;
	$this-&amp;gt;doMain($par);&lt;br /&gt;
  }&lt;br /&gt;
  public function includable( $x = NULL ) { return TRUE; }&lt;br /&gt;
  private function HandleLoginForm($iRtnPage) {&lt;br /&gt;
	global $wgParser, $wgRequest, $wgTitle;&lt;br /&gt;
&lt;br /&gt;
	$objTitleRtn = $this-&amp;gt;getTitle(&amp;#039;pay/&amp;#039;.$iRtnPage);	// return to payment form with return to original page&lt;br /&gt;
	$strPage = $objTitleRtn-&amp;gt;getPrefixedText();&lt;br /&gt;
&lt;br /&gt;
	$objParserMain = $wgParser;&lt;br /&gt;
	$wgParser = new Parser();&lt;br /&gt;
&lt;br /&gt;
//*&lt;br /&gt;
	$objLogin = new LoginForm($wgRequest);&lt;br /&gt;
	$objLogin-&amp;gt;mType = &amp;#039;signup&amp;#039;;&lt;br /&gt;
	// set return page for account-creation form&lt;br /&gt;
	// return page must be purged so that it will change according to user&amp;#039;s new status&lt;br /&gt;
	$objLogin-&amp;gt;action = $wgTitle-&amp;gt;getFullURL();&lt;br /&gt;
	if ($strPage != &amp;#039;&amp;#039;) {&lt;br /&gt;
	    $objLogin-&amp;gt;mReturnTo = $strPage;&lt;br /&gt;
	}&lt;br /&gt;
	$objLogin-&amp;gt;execute();&lt;br /&gt;
/**/&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
	$strDoCreate = $wgRequest-&amp;gt;getVal(&amp;#039;wpCreateaccount&amp;#039;);&lt;br /&gt;
	if ($strDoCreate != &amp;#039;&amp;#039;) {&lt;br /&gt;
	    $wgOut-&amp;gt;addWikiText(&amp;#039;[&amp;#039;.$strDoCreate.&amp;#039;] Creating account...&amp;#039;);&lt;br /&gt;
	    $objLogin = new LoginForm($wgRequest);&lt;br /&gt;
	    $strMsg = $objLogin-&amp;gt;addNewAccount();&lt;br /&gt;
	    $wgOut-&amp;gt;addWikiText($strMsg,TRUE);&lt;br /&gt;
	} else {&lt;br /&gt;
	    $template = new UsercreateTemplate();&lt;br /&gt;
&lt;br /&gt;
	    //$q = &amp;#039;action=submitlogin&amp;amp;type=signup&amp;#039;;&lt;br /&gt;
	    //$linkq = &amp;#039;type=login&amp;#039;;&lt;br /&gt;
	    $q = &amp;#039;&amp;#039;;&lt;br /&gt;
	    $linkq = &amp;#039;&amp;#039;;&lt;br /&gt;
	    $linkmsg = &amp;#039;gotaccount&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	    if (!is_object($objTitle)) {&lt;br /&gt;
		$objTitle = Title::newFromText($strPage);&lt;br /&gt;
	    }&lt;br /&gt;
&lt;br /&gt;
	    $link = &amp;#039;&amp;lt;a href=&amp;quot;&amp;#039; . htmlspecialchars ( $objTitle-&amp;gt;getLocalUrl( $linkq ) ) . &amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	    $link .= wfMsgHtml( $linkmsg . &amp;#039;link&amp;#039; );&lt;br /&gt;
	    $link .= &amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;link&amp;#039;, wfMsgHtml( $linkmsg, $link ) );&lt;br /&gt;
&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;header&amp;#039;, &amp;#039;&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;name&amp;#039;, $wgRequest-&amp;gt;getVal(&amp;#039;wpName&amp;#039;) );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;password&amp;#039;, $wgRequest-&amp;gt;getVal(&amp;#039;wpPassword&amp;#039;) );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;retype&amp;#039;, $wgRequest-&amp;gt;getVal(&amp;#039;wpRetype&amp;#039;) );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;email&amp;#039;, $wgRequest-&amp;gt;getVal(&amp;#039;wpEmail&amp;#039;) );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;realname&amp;#039;, $wgRequest-&amp;gt;getVal(&amp;#039;wpRealName&amp;#039;) );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;domain&amp;#039;, $wgRequest-&amp;gt;getVal(&amp;#039;domain&amp;#039;) );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;usedomain&amp;#039;, FALSE );&lt;br /&gt;
&lt;br /&gt;
	    $msg = &amp;#039;&amp;#039;;&lt;br /&gt;
	    $msgtype = &amp;#039;error&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;action&amp;#039;, $objTitle-&amp;gt;getLocalUrl( $q ) );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;message&amp;#039;, $msg );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;messagetype&amp;#039;, $msgtype );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;createemail&amp;#039;, $wgEnableEmail &amp;amp;&amp;amp; $wgUser-&amp;gt;isLoggedIn() );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;userealname&amp;#039;, $wgAllowRealName );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;useemail&amp;#039;, $wgEnableEmail );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;canreset&amp;#039;, $wgAuth-&amp;gt;allowPasswordChange() );&lt;br /&gt;
	    $template-&amp;gt;set( &amp;#039;remember&amp;#039;, $wgUser-&amp;gt;getOption( &amp;#039;rememberpassword&amp;#039; ) or $wgRequest-&amp;gt;getVal(&amp;#039;wpRemember&amp;#039;)  );&lt;br /&gt;
&lt;br /&gt;
	    $wgOut-&amp;gt;addTemplate( $template );&lt;br /&gt;
&lt;br /&gt;
	    $wgParser = $objParserMain;&lt;br /&gt;
	}&lt;br /&gt;
*/&lt;br /&gt;
  }&lt;br /&gt;
  private function HandlePayButton($iRtnPage) {&lt;br /&gt;
	global $wgSS_PayPalButtonID;&lt;br /&gt;
	global $wgUser, $wgOut;&lt;br /&gt;
&lt;br /&gt;
	$idUser = $wgUser-&amp;gt;getID();&lt;br /&gt;
&lt;br /&gt;
	$strBtn = &amp;#039;&amp;lt;form action=&amp;quot;https://www.paypal.com/cgi-bin/webscr&amp;quot; method=&amp;quot;post&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$strBtn .= &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;cmd&amp;quot; value=&amp;quot;_s-xclick&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$strBtn .= &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;hosted_button_id&amp;quot; value=&amp;quot;&amp;#039;.$wgSS_PayPalButtonID.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	// this would be a better way to pass parameters back, but I don&amp;#039;t think it&amp;#039;s currently being used:&lt;br /&gt;
	$strBtn .= &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;custom&amp;quot; value=&amp;quot;|userid=&amp;#039;.$idUser.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$strBtn .= &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;notify_url&amp;quot; value=&amp;quot;http://researchwikis.com/Special:SiteSubscribe?userid=&amp;#039;.$idUser.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$strBtn .= &amp;#039;&amp;lt;input type=&amp;quot;hidden&amp;quot; name=&amp;quot;return&amp;quot; value=&amp;quot;&amp;#039;.$iRtnPage.&amp;#039;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$strBtn .= &amp;#039;&amp;lt;input type=&amp;quot;image&amp;quot; src=&amp;quot;https://www.paypal.com/en_US/i/btn/btn_subscribeCC_LG.gif&amp;quot; border=&amp;quot;0&amp;quot; name=&amp;quot;submit&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$strBtn .= &amp;#039;&amp;lt;img alt=&amp;quot;&amp;quot; border=&amp;quot;0&amp;quot; src=&amp;quot;https://www.paypal.com/en_US/i/scr/pixel.gif&amp;quot; width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
	$strBtn .= &amp;#039;&amp;lt;/form&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	$wgOut-&amp;gt;addHTML($strBtn);&lt;br /&gt;
  }&lt;br /&gt;
  public function doMain( $par ) {&lt;br /&gt;
	global $wgOut, $wgUser;&lt;br /&gt;
&lt;br /&gt;
	$intPos = strpos($par, &amp;#039;/&amp;#039;);&lt;br /&gt;
	if ($intPos === FALSE) {&lt;br /&gt;
	    $strType = $par;&lt;br /&gt;
	    $strPage = NULL;&lt;br /&gt;
	} else {&lt;br /&gt;
	    $strType = substr($par,0,$intPos);&lt;br /&gt;
	    $strPage = substr($par,$intPos+1);&lt;br /&gt;
	}&lt;br /&gt;
	switch ($strType) {&lt;br /&gt;
	case &amp;#039;login&amp;#039;:&lt;br /&gt;
	    $this-&amp;gt;HandleLoginForm($strPage);&lt;br /&gt;
	    break;&lt;br /&gt;
	case &amp;#039;pay&amp;#039;:&lt;br /&gt;
	    $this-&amp;gt;HandlePayButton($strPage);&lt;br /&gt;
	    break;&lt;br /&gt;
	default:&lt;br /&gt;
	    $this-&amp;gt;setHeaders();&lt;br /&gt;
&lt;br /&gt;
// OLD CODE -- chop out later&lt;br /&gt;
// Log POSTing&lt;br /&gt;
	    if ($_SERVER[&amp;#039;REQUEST_METHOD&amp;#039;] == &amp;#039;POST&amp;#039;) {&lt;br /&gt;
		LogSession();&lt;br /&gt;
		$out = &amp;quot;\n== ENV:&amp;quot;;&lt;br /&gt;
		foreach ($_ENV AS $key =&amp;gt; $value) {&lt;br /&gt;
			$out .= &amp;quot;\n\t\t$key\t$value&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
    /*&lt;br /&gt;
		$out .= $this-&amp;gt;EnvLine(&amp;#039;REQUEST_METHOD&amp;#039;);&lt;br /&gt;
		$out .= $this-&amp;gt;EnvLine(&amp;#039;HTTP_USER_AGENT&amp;#039;);&lt;br /&gt;
		$out .= $this-&amp;gt;EnvLine(&amp;#039;REMOTE_ADDR&amp;#039;);&lt;br /&gt;
    */&lt;br /&gt;
		$out .= &amp;quot;\n== SERVER:&amp;quot;;&lt;br /&gt;
		foreach ($_SERVER AS $key =&amp;gt; $value) {&lt;br /&gt;
    //		    $wgOut-&amp;gt;AddWikiText(&amp;quot;* &amp;#039;&amp;#039;&amp;#039;$key&amp;#039;&amp;#039;&amp;#039;: $value&amp;quot;);&lt;br /&gt;
			$out .= &amp;quot;\n\t\t$key\t$value&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
		$out .= &amp;quot;\n== POST:&amp;quot;;&lt;br /&gt;
		foreach ($_POST AS $key =&amp;gt; $value) {&lt;br /&gt;
    //		    $wgOut-&amp;gt;AddWikiText(&amp;quot;* &amp;#039;&amp;#039;&amp;#039;$key&amp;#039;&amp;#039;&amp;#039;: $value&amp;quot;);&lt;br /&gt;
			$out .= &amp;quot;\n\t\t$key\t$value&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
    // write more complete data to log file:&lt;br /&gt;
		$out .= &amp;quot;\n== checking for PayPal post&amp;quot;;&lt;br /&gt;
		LogText($out);&lt;br /&gt;
		if (isset($_POST[&amp;#039;txn_type&amp;#039;])) {&lt;br /&gt;
	    // process POST data from PayPal&lt;br /&gt;
		    LogText(&amp;quot;\n== PayPal post detected&amp;quot;);&lt;br /&gt;
		    $this-&amp;gt;ProcessPayPalPost();&lt;br /&gt;
		    LogText(&amp;quot;\n== PayPal post processed&amp;quot;);&lt;br /&gt;
		} else {&lt;br /&gt;
		    LogText(&amp;quot;\n== NOT PayPal&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	    if ($wgUser-&amp;gt;isAllowed(ksPerm_SubscrAdmin)) {&lt;br /&gt;
		    //$this-&amp;gt;ProcessPayPalPost();&lt;br /&gt;
		    $this-&amp;gt;doAdmin();&lt;br /&gt;
	    } else {&lt;br /&gt;
		    $this-&amp;gt;doUser();&lt;br /&gt;
	    }&lt;br /&gt;
	    $out = &amp;#039;&amp;amp;rarr;[ [{{fullurl:{{FULLPAGENAME}}}} refresh] ]&amp;amp;larr;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
	    $wgOut-&amp;gt;AddWikiText($out);&lt;br /&gt;
	}&lt;br /&gt;
  }&lt;br /&gt;
  private function EnvLine($iName) {&lt;br /&gt;
	return &amp;quot;\t&amp;quot;.$iName.&amp;quot;\t&amp;quot;.$_ENV[$iName].&amp;quot;\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  public function doAdmin() {&lt;br /&gt;
	global $wgRequest, $wgOut, $wgTitle;&lt;br /&gt;
/*&lt;br /&gt;
	PURPOSE: do stuff that only admins are allowed to do&lt;br /&gt;
*/&lt;br /&gt;
	$out = &amp;#039;==Subscription Admin==&amp;#039;;&lt;br /&gt;
// ** check for submitted changes&lt;br /&gt;
// *** added subscribers?&lt;br /&gt;
	if (isset($_GET[&amp;#039;btn_add&amp;#039;])) {&lt;br /&gt;
		$strUserAdd = $_GET[&amp;#039;username&amp;#039;];&lt;br /&gt;
		if ($strUserAdd) {&lt;br /&gt;
			$out .= SiteSubscriber::doAddName($strUserAdd);&lt;br /&gt;
		} else {&lt;br /&gt;
			$out .= &amp;quot;\nPlease enter name of user you wish to add.&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (isset($_GET[&amp;#039;do&amp;#039;])) {&lt;br /&gt;
		$strAct = $_GET[&amp;#039;do&amp;#039;];&lt;br /&gt;
		if ($strAct == &amp;#039;remove&amp;#039;) {&lt;br /&gt;
			$idUser = $_GET[&amp;#039;user&amp;#039;];&lt;br /&gt;
			SiteSubscriber::doDelID($idUser);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
// ** Show list of subscribers&lt;br /&gt;
	$dbr = self::DB();&lt;br /&gt;
	$ppq = $dbr-&amp;gt;query( &amp;#039;SELECT * FROM &amp;#039;.ksTbl_Subscr);&lt;br /&gt;
//	$ppg = $dbr-&amp;gt;query( &amp;#039;SELECT * FROM &amp;#039;.ksTbl_Subscr.&amp;#039; AS ss LEFT JOIN user AS u ON ss.ID_User=u.user_id&amp;#039; );&lt;br /&gt;
		// ultimately uses mysql_query() or similar&lt;br /&gt;
	$out .= &amp;quot;\n===subscribers===\n{| border=1\n|-\n! username || real name || email || expiration || actions&amp;quot;;&lt;br /&gt;
	$intRows = 0;&lt;br /&gt;
	while ($row = mysql_fetch_assoc($ppq)) {&lt;br /&gt;
		$intRows++;&lt;br /&gt;
		$idUser = $row[&amp;#039;ID_User&amp;#039;];&lt;br /&gt;
		$objUser = User::newFromId($idUser);&lt;br /&gt;
		if (is_object($objUser)) {&lt;br /&gt;
			$strUser = $objUser-&amp;gt;getName();&lt;br /&gt;
			$strName = $objUser-&amp;gt;getRealName();&lt;br /&gt;
			$strEmail = $objUser-&amp;gt;getEmail();&lt;br /&gt;
			$wtUser = &amp;#039;[[User:&amp;#039;.$strUser.&amp;#039;|&amp;#039;.$strUser.&amp;#039;]]&amp;#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$wtUser = &amp;#039;Unknown ID &amp;#039;.$idUser;&lt;br /&gt;
		}&lt;br /&gt;
//		$objExp = new Timestamp(strtotime($row[&amp;#039;WhenExp&amp;#039;]));&lt;br /&gt;
		$objExp = new Timestamp($row[&amp;#039;WhenExp&amp;#039;]);&lt;br /&gt;
		$strExp = $objExp-&amp;gt;Format(ksFmt_DateShow);&lt;br /&gt;
		$out .= &amp;quot;\n|-\n| &amp;quot;.$wtUser.&amp;#039; || &amp;#039;.$strName.&amp;#039; || &amp;#039;.$strEmail.&amp;#039; || &amp;#039;.$strExp.&amp;#039; || [{{fullurl:{{FULLPAGENAME}}|do=remove&amp;amp;user=&amp;#039;.$idUser.&amp;#039;}} remove]&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	if ($intRows == 0) {&lt;br /&gt;
		$out .= &amp;quot;\n|-\n| colspan=2 | &amp;#039;&amp;#039;No subscribers yet&amp;#039;&amp;#039;&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	$out .= &amp;quot;\n|}&amp;quot;;&lt;br /&gt;
	$wgOut-&amp;gt;AddWikiText($out);&lt;br /&gt;
// *** allow users to be subscribed manually&lt;br /&gt;
&lt;br /&gt;
	$out = &amp;#039;&amp;lt;form method=GET action=&amp;quot;&amp;#039;.$wgTitle-&amp;gt;getFullURL().&amp;#039;&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Subscribe a user&amp;lt;/b&amp;gt;:&amp;lt;input name=username&amp;gt; &amp;lt;input type=submit name=btn_add value=&amp;quot;Add&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&amp;#039;;&lt;br /&gt;
	$wgOut-&amp;gt;addHTML($out);&lt;br /&gt;
  }&lt;br /&gt;
  public function doUser() {&lt;br /&gt;
	global $wgOut;&lt;br /&gt;
/*&lt;br /&gt;
	PURPOSE: do only stuff that regular users are allowed to do&lt;br /&gt;
*/&lt;br /&gt;
	$wgOut-&amp;gt;AddWikiText(&amp;#039;Hello boring regular user!&amp;#039;);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  public function ProcessPayPalPost() {&lt;br /&gt;
// Adapted from https://www.paypal.com/us/cgi-bin/webscr?cmd=p/pdn/ipn-codesamples-pop-outside#php&lt;br /&gt;
// read the post from PayPal system and add &amp;#039;cmd&amp;#039;&lt;br /&gt;
	$req = &amp;#039;cmd=_notify-validate&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// record that a post has been received&lt;br /&gt;
	LogText(&amp;quot;\n== RUNNING ProcessPayPalPost()&amp;quot;);&lt;br /&gt;
	$objPost = new Posting();&lt;br /&gt;
	$idUser = $objPost-&amp;gt;ID_User();&lt;br /&gt;
	LogText(&amp;quot;\n== USER ID = $idUser&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	foreach ($_POST as $key =&amp;gt; $value) {&lt;br /&gt;
		$valRtn = urlencode(stripslashes($value));&lt;br /&gt;
		$req .= &amp;quot;&amp;amp;$key=$valRtn&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// record each piece of data in the post&lt;br /&gt;
		$objPost-&amp;gt;AddLine($key,$value);&lt;br /&gt;
	}&lt;br /&gt;
	$objPost-&amp;gt;PaymtRecd();&lt;br /&gt;
	// post back to PayPal system to validate&lt;br /&gt;
	$header = NULL;&lt;br /&gt;
	$header .= &amp;quot;POST /cgi-bin/webscr HTTP/1.0\r\n&amp;quot;;&lt;br /&gt;
	$header .= &amp;quot;Content-Type: application/x-www-form-urlencoded\r\n&amp;quot;;&lt;br /&gt;
	$header .= &amp;quot;Content-Length: &amp;quot; . strlen($req) . &amp;quot;\r\n\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	if ($objPost-&amp;gt;isTest) {&lt;br /&gt;
	    $urlAuth = &amp;#039;ssl://www.sandbox.paypal.com&amp;#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
	    $urlAuth = &amp;#039;ssl://www.paypal.com&amp;#039;;&lt;br /&gt;
	}&lt;br /&gt;
	LogText(&amp;quot;\n== AUTH URL=&amp;quot;.$urlAuth);&lt;br /&gt;
	$fp = fsockopen ($urlAuth, 443, $errno, $errstr, 30);&lt;br /&gt;
&lt;br /&gt;
	// assign posted variables to local variables&lt;br /&gt;
	$item_name = $_POST[&amp;#039;item_name&amp;#039;];&lt;br /&gt;
	$item_number = $_POST[&amp;#039;item_number&amp;#039;];&lt;br /&gt;
	$payment_status = $_POST[&amp;#039;payment_status&amp;#039;];&lt;br /&gt;
	$payment_amount = $_POST[&amp;#039;mc_gross&amp;#039;];&lt;br /&gt;
	$payment_currency = $_POST[&amp;#039;mc_currency&amp;#039;];&lt;br /&gt;
	$txn_id = $_POST[&amp;#039;txn_id&amp;#039;];&lt;br /&gt;
	$receiver_email = $_POST[&amp;#039;receiver_email&amp;#039;];&lt;br /&gt;
	$payer_email = $_POST[&amp;#039;payer_email&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
	if (!$fp) {&lt;br /&gt;
	// HTTP ERROR&lt;br /&gt;
		LogText(&amp;quot;\n== ERROR: Could not contact confirmation server!&amp;quot;);&lt;br /&gt;
		$objPost-&amp;gt;ConfirmRecd(FALSE, $errstr);&lt;br /&gt;
	} else {&lt;br /&gt;
		$objPost-&amp;gt;ConfirmSent();&lt;br /&gt;
&lt;br /&gt;
		fputs ($fp, $header . $req);&lt;br /&gt;
		$isDone = FALSE;&lt;br /&gt;
		while (!feof($fp) &amp;amp;&amp;amp; !$isDone) {&lt;br /&gt;
			$res = fgets ($fp, 1024);&lt;br /&gt;
&lt;br /&gt;
			if (strcmp ($res, &amp;quot;VERIFIED&amp;quot;) == 0) {&lt;br /&gt;
				LogText(&amp;quot;\n== PayPal says VERIFIED&amp;quot;);&lt;br /&gt;
				$strStat = &amp;#039;OKAY&amp;#039;;&lt;br /&gt;
				$objPost-&amp;gt;ConfirmRecd(TRUE, $res);&lt;br /&gt;
				LogText(&amp;quot;\n== CONFIRM logged&amp;quot;);&lt;br /&gt;
				$isOk = TRUE;&lt;br /&gt;
				// check the payment_status is Completed&lt;br /&gt;
				$isOk = $isOk &amp;amp;&amp;amp; ($payment_status == &amp;#039;Completed&amp;#039;);&lt;br /&gt;
				// check that txn_id has not been previously processed&lt;br /&gt;
				    // TO DO&lt;br /&gt;
				// check that receiver_email is your Primary PayPal email&lt;br /&gt;
				    // TO DO&lt;br /&gt;
				// check that payment_amount/payment_currency are correct&lt;br /&gt;
				$isOk = $isOk &amp;amp;&amp;amp; ($payment_amount &amp;gt;= 19.95);&lt;br /&gt;
				$isOk = $isOk &amp;amp;&amp;amp; ($payment_currency == &amp;#039;USD&amp;#039;);	// US Dollars&lt;br /&gt;
				// process payment&lt;br /&gt;
				if ($isOk) {&lt;br /&gt;
					if ($idUser) {&lt;br /&gt;
					    LogText(&amp;quot;\n== ADDING SUBSCRIBER ID=&amp;quot;.$idUser);&lt;br /&gt;
					    $arrParams[&amp;#039;user id&amp;#039;] = $idUser;&lt;br /&gt;
					    $arrParams[&amp;#039;post id&amp;#039;] = $objPost-&amp;gt;ID();&lt;br /&gt;
&lt;br /&gt;
					    if (!$objPost-&amp;gt;isTest || kfDoSubscribeSandbox) {&lt;br /&gt;
						SiteSubscriber::doAddID($idUser);&lt;br /&gt;
						LogText(&amp;quot;\n== SUBSCRIBER ADDED=&amp;quot;.$idUser);&lt;br /&gt;
					    } else {&lt;br /&gt;
						LogText(&amp;quot;\n== SANDBOX SUBSCRIPTION IGNORED&amp;quot;);&lt;br /&gt;
					    }&lt;br /&gt;
					} else {&lt;br /&gt;
					    LogText(&amp;quot;\n== NO SUBSCRIBER ID RECEIVED&amp;quot;);&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			} else if (strcmp ($res, &amp;quot;INVALID&amp;quot;) == 0) {&lt;br /&gt;
				$strStat = &amp;#039;FAIL&amp;#039;;&lt;br /&gt;
				$objPost-&amp;gt;ConfirmRecd(FALSE, $res);&lt;br /&gt;
				LogText(&amp;quot;\n== NOT a valid payment&amp;quot;);&lt;br /&gt;
			} else {&lt;br /&gt;
				// log for manual investigation&lt;br /&gt;
				$strStat = &amp;#039;----&amp;#039;;&lt;br /&gt;
			}&lt;br /&gt;
			$strLine = trim($res);&lt;br /&gt;
			LogText(&amp;quot;\n== [&amp;quot;.$strStat.&amp;#039;] POST ID=&amp;#039;.$objPost-&amp;gt;ID().&amp;#039; - PayPal says: [&amp;#039;.$strLine.&amp;#039;]&amp;#039;);&lt;br /&gt;
		}&lt;br /&gt;
		fclose ($fp);&lt;br /&gt;
		LogText(&amp;quot;\n== PayPal Processing complete&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
/**/&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class SiteSubscriber {&lt;br /&gt;
/*==========&lt;br /&gt;
 DYNAMIC SECTION&lt;br /&gt;
*/&lt;br /&gt;
	private $vmwObj;	// MediaWiki User object (if known)&lt;br /&gt;
	private $vID;	// ID_User&lt;br /&gt;
	private $vExp;	// WhenExp&lt;br /&gt;
	public $Status;	// status message&lt;br /&gt;
&lt;br /&gt;
	public function Init_fromMWObj($imwObj) {&lt;br /&gt;
// INPUT: MediaWiki User object&lt;br /&gt;
		$this-&amp;gt;vmwObj = $imwObj;&lt;br /&gt;
		$this-&amp;gt;vID = $imwObj-&amp;gt;getID();&lt;br /&gt;
		$dbr = self::DB();&lt;br /&gt;
		$ppq = $dbr-&amp;gt;query( &amp;#039;SELECT * FROM `&amp;#039;.ksTbl_Subscr.&amp;#039;` WHERE ID_User=&amp;#039;.$this-&amp;gt;vID);&lt;br /&gt;
		if (mysql_num_rows($ppq) == 0) {&lt;br /&gt;
			$this-&amp;gt;Exp = NULL;&lt;br /&gt;
		} else {&lt;br /&gt;
			$row = mysql_fetch_assoc($ppq);&lt;br /&gt;
			$this-&amp;gt;Exp = $row[&amp;#039;WhenExp&amp;#039;];&lt;br /&gt;
		}		&lt;br /&gt;
	}&lt;br /&gt;
	public function IsSubscriber() {&lt;br /&gt;
	/*&lt;br /&gt;
	RETURNS: SiteSubscriber if user is one, otherwise FALSE&lt;br /&gt;
	*/&lt;br /&gt;
		if (is_null($this-&amp;gt;Exp)) {&lt;br /&gt;
			return FALSE;	// no subscriber record, so no - not a subscriber&lt;br /&gt;
		} else {&lt;br /&gt;
			$dtExp = new Timestamp($this-&amp;gt;Exp);&lt;br /&gt;
			return  $dtExp-&amp;gt;IsLater();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	public function SetGroup($iOn,$iLogMsg) {&lt;br /&gt;
		global $wgUser;&lt;br /&gt;
&lt;br /&gt;
		$msg = &amp;#039;User:&amp;#039;.$this-&amp;gt;vmwObj-&amp;gt;getName();&lt;br /&gt;
		$arrParams[&amp;#039;user id&amp;#039;] = $this-&amp;gt;vID;&lt;br /&gt;
		if ($iOn) {&lt;br /&gt;
			$this-&amp;gt;vmwObj-&amp;gt;addGroup(ksGrp_SubscrUser);&lt;br /&gt;
			$msg .= &amp;#039; added to subscriber group&amp;#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			$this-&amp;gt;vmwObj-&amp;gt;removeGroup(ksGrp_SubscrUser);&lt;br /&gt;
			$msg .= &amp;#039; removed from subscriber group&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		$msg .= $iLogMsg;&lt;br /&gt;
		SpecialSiteSubscribe::DoLog(&amp;#039;rights&amp;#039;,$msg,$arrParams);&lt;br /&gt;
		$wgUser-&amp;gt;invalidateCache();	// clear cached pages so new permissions will take effect&lt;br /&gt;
	}&lt;br /&gt;
	public function SynchStatus() {&lt;br /&gt;
	/*&lt;br /&gt;
	ACTION: Update the user&amp;#039;s &amp;quot;subscribers&amp;quot; group membership according to their subscription status&lt;br /&gt;
	*/&lt;br /&gt;
		if ($this-&amp;gt;vmwObj-&amp;gt;isAllowed(ksPerm_SubscrUser) != $this-&amp;gt;IsSubscriber()) {&lt;br /&gt;
			if ($this-&amp;gt;IsSubscriber()) {&lt;br /&gt;
				$this-&amp;gt;SetGroup(TRUE,&amp;#039; due to active subscription&amp;#039;);&lt;br /&gt;
			} else {&lt;br /&gt;
				$this-&amp;gt;SetGroup(FALSE,&amp;#039; due to expired subscription&amp;#039;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
/*==========&lt;br /&gt;
 STATIC SECTION&lt;br /&gt;
*/&lt;br /&gt;
	private static $vDB;&lt;br /&gt;
&lt;br /&gt;
	public static function DB() {&lt;br /&gt;
		if (!is_object(self::$vDB)) {&lt;br /&gt;
			self::$vDB = SpecialSiteSubscribe::DB();&lt;br /&gt;
		}&lt;br /&gt;
		return self::$vDB;&lt;br /&gt;
	}&lt;br /&gt;
	public static function NewFromName($iName) {&lt;br /&gt;
		$objNew = new Self;&lt;br /&gt;
&lt;br /&gt;
		$objNew-&amp;gt;Init_fromMWObj(User::newFromName($iName));&lt;br /&gt;
		return $objNew;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
// TO DO: convert doAddName and doAddID to non-static functions which act on the current object&lt;br /&gt;
&lt;br /&gt;
	public static function doAddName($iName) {&lt;br /&gt;
		$out = &amp;#039;&amp;#039;;&lt;br /&gt;
		$out .= &amp;quot;\n&amp;#039;&amp;#039;&amp;#039;Subscribing&amp;#039;&amp;#039;&amp;#039; user [[User:$iName|$iName]]...&amp;quot;;&lt;br /&gt;
		$objUserAdd = User::newFromName($iName);&lt;br /&gt;
		if (is_object($objUserAdd)) {&lt;br /&gt;
			if ($objUserAdd-&amp;gt;isLoggedIn()) {&lt;br /&gt;
				$out .= &amp;#039; found...&amp;#039;;&lt;br /&gt;
				$out .= self::doAddID($objUserAdd-&amp;gt;getID());&lt;br /&gt;
				&lt;br /&gt;
			} else {&lt;br /&gt;
				$out .= &amp;quot; user not found, can&amp;#039;t add&amp;quot;;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			$out .= &amp;#039; ERROR: user object would not load.&amp;#039;;&lt;br /&gt;
		}&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
	public static function doAddID($iID) {&lt;br /&gt;
		//$log = new LogPage( &amp;#039;subscribe&amp;#039; );&lt;br /&gt;
		$dbw = self::DB();&lt;br /&gt;
		$ppq = $dbw-&amp;gt;query( &amp;#039;SELECT * FROM `&amp;#039;.ksTbl_Subscr.&amp;#039;` WHERE ID_User=&amp;#039;.$iID);&lt;br /&gt;
		$dtExp = self::figExpiration();&lt;br /&gt;
		$strExp = $dtExp-&amp;gt;Format(ksFmt_DateShow);&lt;br /&gt;
		$sqlExp = $dtExp-&amp;gt;Format(ksFmt_DateSQL);&lt;br /&gt;
&lt;br /&gt;
// setup for logging&lt;br /&gt;
		$msg = &amp;#039;User ID &amp;#039;.$iID;&lt;br /&gt;
		$arrParams[&amp;#039;user id&amp;#039;] = $iID;&lt;br /&gt;
		$arrParams[&amp;#039;expiration new&amp;#039;] = $strExp;&lt;br /&gt;
&lt;br /&gt;
		if (mysql_num_rows($ppq) == 0) {&lt;br /&gt;
			$out = &amp;#039; subscription active until &amp;#039;.$strExp;&lt;br /&gt;
			$sql = &amp;#039;INSERT INTO &amp;#039;.ksTbl_Subscr.&amp;#039; (ID_User, WhenExp) VALUES(&amp;#039;.$iID.&amp;#039;, &amp;quot;&amp;#039;.$sqlExp.&amp;#039;&amp;quot;);&amp;#039;;&lt;br /&gt;
			// logging&lt;br /&gt;
			$msg .= &amp;#039; subscription record created - expires &amp;#039;.$strExp;&lt;br /&gt;
		} else {&lt;br /&gt;
			$row = mysql_fetch_assoc($ppq);&lt;br /&gt;
			$strExpOld = $row[&amp;#039;WhenExp&amp;#039;];&lt;br /&gt;
			$out = &amp;#039; updating expiration from &amp;#039;.$row[&amp;#039;WhenExp&amp;#039;].&amp;#039; to &amp;#039;.$strExp;&lt;br /&gt;
			$sql = &amp;#039;UPDATE &amp;#039;.ksTbl_Subscr.&amp;#039; SET WhenExp=&amp;quot;&amp;#039;.$sqlExp.&amp;#039;&amp;quot; WHERE ID_User=&amp;#039;.$iID.&amp;#039;;&amp;#039;;&lt;br /&gt;
			// logging&lt;br /&gt;
			$msg .= &amp;#039; subscription record updated - expires &amp;#039;.$strExp.&amp;#039;(was: &amp;#039;.$strExpOld.&amp;#039;)&amp;#039;;&lt;br /&gt;
			$arrParams[&amp;#039;expiration old&amp;#039;] = $strExpOld;&lt;br /&gt;
		}&lt;br /&gt;
		$dbw-&amp;gt;query($sql);&lt;br /&gt;
		SpecialSiteSubscribe::DoLog(&amp;#039;&amp;#039;,$msg,$arrParams);&lt;br /&gt;
&lt;br /&gt;
		return $out;&lt;br /&gt;
	}&lt;br /&gt;
	public static function doDelID($iID) {&lt;br /&gt;
		$msg = &amp;#039;User ID &amp;#039;.$iID;&lt;br /&gt;
		$arrParams[&amp;#039;user id&amp;#039;] = $iID;&lt;br /&gt;
		$msg .= &amp;#039; subscription record deleted&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
		// delete user subscription record&lt;br /&gt;
		$sql = &amp;#039;DELETE FROM &amp;#039;.ksTbl_Subscr.&amp;#039; WHERE ID_User=&amp;#039;.$iID.&amp;#039;;&amp;#039;;&lt;br /&gt;
		$dbw = self::DB();&lt;br /&gt;
		$dbw-&amp;gt;query($sql);&lt;br /&gt;
		SpecialSiteSubscribe::DoLog(&amp;#039;&amp;#039;,$msg,$arrParams);&lt;br /&gt;
&lt;br /&gt;
		// remove user from group&lt;br /&gt;
		$objUser = User::newFromId($iID);&lt;br /&gt;
		$objUser-&amp;gt;removeGroup(ksGrp_SubscrUser);&lt;br /&gt;
		$arrParams[&amp;#039;user id&amp;#039;] = $iID;&lt;br /&gt;
		$arrParams[&amp;#039;user name&amp;#039;] = $objUser-&amp;gt;getName();&lt;br /&gt;
		$msg = &amp;#039;User:&amp;#039;.$objUser-&amp;gt;getName().&amp;#039; manually removed from subscriber group by admin&amp;#039;;&lt;br /&gt;
		SpecialSiteSubscribe::DoLog(&amp;#039;rights&amp;#039;,$msg,$arrParams);&lt;br /&gt;
	}&lt;br /&gt;
	private static function figExpiration() {&lt;br /&gt;
		$dtNow = new Timestamp();&lt;br /&gt;
		return $dtExp = $dtNow-&amp;gt;PlusDays(366);	// add one year -- later, this should be a config setting&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Posting {&lt;br /&gt;
&lt;br /&gt;
/*==========&lt;br /&gt;
 STATIC SECTION&lt;br /&gt;
*/&lt;br /&gt;
	private static $vDB;&lt;br /&gt;
&lt;br /&gt;
	public static function DB() {&lt;br /&gt;
		if (!is_object(self::$vDB)) {&lt;br /&gt;
			self::$vDB = SpecialSiteSubscribe::DB();&lt;br /&gt;
		}&lt;br /&gt;
		return self::$vDB;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
/*==========&lt;br /&gt;
 DYNAMIC SECTION&lt;br /&gt;
*/&lt;br /&gt;
	private $vID;&lt;br /&gt;
	private $vRmtAddr;&lt;br /&gt;
	private $isPaymt;&lt;br /&gt;
	private $vPayAmt;&lt;br /&gt;
	private $vTxnID;&lt;br /&gt;
	private $vIDUser;&lt;br /&gt;
&lt;br /&gt;
	public $isTest;&lt;br /&gt;
&lt;br /&gt;
	public function __construct() {&lt;br /&gt;
		$this-&amp;gt;vIDUser = $_GET[userid];&lt;br /&gt;
&lt;br /&gt;
		if (isset($_SERVER[&amp;#039;REMOTE_ADDR&amp;#039;])) {&lt;br /&gt;
		    $this-&amp;gt;vRmtAddr = $_SERVER[&amp;#039;REMOTE_ADDR&amp;#039;];&lt;br /&gt;
		    $strAddr = $this-&amp;gt;vRmtAddr;&lt;br /&gt;
		} else {&lt;br /&gt;
		    $this-&amp;gt;vRmtAddr = NULL;&lt;br /&gt;
		    $strAddr = NULL;&lt;br /&gt;
		}&lt;br /&gt;
		$this-&amp;gt;isTest = FALSE;&lt;br /&gt;
&lt;br /&gt;
		$dbw = self::DB();&lt;br /&gt;
		//$sql = &amp;#039;INSERT INTO &amp;#039;.ksTbl_Posting.&amp;#039; (RmtAddr, WhenRecd) VALUES(&amp;#039;.$iRmtAddr.&amp;#039;, NOW());&amp;#039;;&lt;br /&gt;
		//$dbw-&amp;gt;query($sql);&lt;br /&gt;
		$dbw-&amp;gt;insert(ksTbl_Posting,array(&lt;br /&gt;
			&amp;#039;RmtAddr&amp;#039; =&amp;gt; $strAddr,&lt;br /&gt;
			&amp;#039;WhenRecd&amp;#039; =&amp;gt; date(ksFmt_TimeSQL)&lt;br /&gt;
			));&lt;br /&gt;
		$this-&amp;gt;vID = $dbw-&amp;gt;insertId();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public function ID() {&lt;br /&gt;
		return $this-&amp;gt;vID;&lt;br /&gt;
	}&lt;br /&gt;
	public function ID_User() {&lt;br /&gt;
		return $this-&amp;gt;vIDUser;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	public function AddLine($iKey, $iVal) {&lt;br /&gt;
		$dbw = self::DB();&lt;br /&gt;
		$dbw-&amp;gt;insert(ksTbl_PostLine,array(&lt;br /&gt;
			&amp;#039;ID_Post&amp;#039; =&amp;gt; $this-&amp;gt;vID,&lt;br /&gt;
			&amp;#039;DataKey&amp;#039; =&amp;gt; $iKey,&lt;br /&gt;
			&amp;#039;DataVal&amp;#039; =&amp;gt; $iVal&lt;br /&gt;
			));&lt;br /&gt;
		switch ($iKey) {&lt;br /&gt;
		case &amp;#039;test_ipn&amp;#039;:&lt;br /&gt;
		    if ($iVal == &amp;#039;1&amp;#039;) {&lt;br /&gt;
			$this-&amp;gt;isTest = TRUE;&lt;br /&gt;
		    }&lt;br /&gt;
		    break;&lt;br /&gt;
		case &amp;#039;txn_type&amp;#039;:&lt;br /&gt;
		    $this-&amp;gt;isPaymt = ($iVal == &amp;#039;&amp;#039;);&lt;br /&gt;
		    break;&lt;br /&gt;
		case &amp;#039;txn_id&amp;#039;:&lt;br /&gt;
		    $this-&amp;gt;vTxnID = $iVal;&lt;br /&gt;
		    break;&lt;br /&gt;
		case &amp;#039;mc_gross&amp;#039;:&lt;br /&gt;
		    $this-&amp;gt;vPayAmt = $iVal;&lt;br /&gt;
		    break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	public function PaymtRecd() {&lt;br /&gt;
		$dbw = self::DB();&lt;br /&gt;
&lt;br /&gt;
// set test flag appropriately, now that we know whether this is a sandbox payment or not:&lt;br /&gt;
		$sqlTest = $this-&amp;gt;isTestSQL();&lt;br /&gt;
		$sql = &amp;#039;UPDATE &amp;#039;.ksTbl_Posting.&amp;#039; SET isTest=&amp;#039;.$sqlTest.&amp;#039; WHERE ID=&amp;#039;.$this-&amp;gt;ID();&lt;br /&gt;
		$dbw-&amp;gt;query($sql);&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
	private function isTestSQL() {&lt;br /&gt;
		return $this-&amp;gt;isTest?-1:0;&lt;br /&gt;
	}&lt;br /&gt;
	public function ConfirmSent() {&lt;br /&gt;
		$dbw = self::DB();&lt;br /&gt;
/*&lt;br /&gt;
 Using update() doesn&amp;#039;t seem to work; this was the code:&lt;br /&gt;
		$arrChg = array(&lt;br /&gt;
			&amp;#039;WhenConf&amp;#039; =&amp;gt; date(ksFmt_TimeSQL));&lt;br /&gt;
		$dbw-&amp;gt;ignoreErrors(TRUE);&lt;br /&gt;
		$dbw-&amp;gt;update( ksTbl_Posting, $arrChg, &amp;#039;ID=&amp;#039;.$this-&amp;gt;vID);&lt;br /&gt;
/*/&lt;br /&gt;
		$sql = &amp;#039;UPDATE &amp;#039;.ksTbl_Posting.&amp;#039; SET WhenConf=NOW() WHERE ID=&amp;#039;.$this-&amp;gt;ID();&lt;br /&gt;
		$dbw-&amp;gt;query($sql);&lt;br /&gt;
/**/&lt;br /&gt;
	}&lt;br /&gt;
	public function ConfirmRecd($iOK, $iText) {&lt;br /&gt;
		$dbw = self::DB();&lt;br /&gt;
/*&lt;br /&gt;
 Using update() doesn&amp;#039;t seem to work; this was the code:&lt;br /&gt;
		$dbw-&amp;gt;update( ksTbl_Posting, array(&lt;br /&gt;
			&amp;#039;WhenRepl&amp;#039; =&amp;gt; date(ksFmt_TimeSQL),&lt;br /&gt;
			&amp;#039;ConfText&amp;#039; =&amp;gt; $iText,&lt;br /&gt;
			&amp;#039;isOkay&amp;#039; =&amp;gt; $iOK),&lt;br /&gt;
				&amp;#039;ID=&amp;#039;.$this-&amp;gt;vID);&lt;br /&gt;
/*/&lt;br /&gt;
		LogText(&amp;quot;\n== running ConfirmRecd()&amp;quot;);&lt;br /&gt;
		$sqlConfText = $dbw-&amp;gt;strencode($iText);&lt;br /&gt;
		LogText(&amp;quot;\n== text=[$sqlConfText]&amp;quot;);&lt;br /&gt;
		$sqlIsOkay = $iOK?-1:0;&lt;br /&gt;
		$sql = &amp;#039;UPDATE &amp;#039;.ksTbl_Posting.&amp;#039; SET&amp;#039;.&lt;br /&gt;
		    &amp;#039; WhenRepl=NOW(),&amp;#039;.&lt;br /&gt;
		    &amp;#039; ConfText=&amp;quot;&amp;#039;.$sqlConfText.&amp;#039;&amp;quot;,&amp;#039;.&lt;br /&gt;
		    &amp;#039; isOkay=&amp;#039;.$sqlIsOkay.&lt;br /&gt;
		    &amp;#039; WHERE ID=&amp;#039;.$this-&amp;gt;ID();&lt;br /&gt;
		LogText(&amp;quot;\n== SQL=[$sql]&amp;quot;);&lt;br /&gt;
		$dbw-&amp;gt;query($sql);&lt;br /&gt;
		LogText(&amp;quot;\n== posting updated&amp;quot;);&lt;br /&gt;
/**/&lt;br /&gt;
&lt;br /&gt;
		if ($iOK) {&lt;br /&gt;
// we now know a valid payment has been received, so log it in the payments table:&lt;br /&gt;
// log the payment in the payments table:&lt;br /&gt;
&lt;br /&gt;
			$sqlIsTest = $this-&amp;gt;isTest?-1:0;&lt;br /&gt;
			$sql = &amp;#039;INSERT INTO &amp;#039;.ksTbl_Paymts.&lt;br /&gt;
			    &amp;#039; (ID_User, WhenRecd, AmtRecd, IDS_Trx, isTest) &amp;#039;.&lt;br /&gt;
			    &amp;#039; VALUES(&amp;#039;.$this-&amp;gt;vIDUser.&amp;#039;,NOW(),&amp;#039;.$this-&amp;gt;vPayAmt.&amp;#039;,&amp;quot;&amp;#039;.$this-&amp;gt;vTxnID.&amp;#039;&amp;quot;,&amp;#039;.$sqlIsTest.&amp;#039;);&amp;#039;;&lt;br /&gt;
			LogText(&amp;quot;\n== SQL=[$sql]&amp;quot;);&lt;br /&gt;
			$dbw-&amp;gt;query($sql);&lt;br /&gt;
			LogText(&amp;quot;\n== payment logged&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
class Timestamp {&lt;br /&gt;
	private $vWhen;&lt;br /&gt;
&lt;br /&gt;
	public function __construct($iWhen = -1) {&lt;br /&gt;
		if ($iWhen == -1) {&lt;br /&gt;
			// use NOW&lt;br /&gt;
			$this-&amp;gt;vWhen = time();&lt;br /&gt;
		} else {&lt;br /&gt;
			if (is_numeric($iWhen)) {&lt;br /&gt;
				$this-&amp;gt;vWhen = $iWhen;&lt;br /&gt;
			} else if (is_string($iWhen)) {&lt;br /&gt;
				$this-&amp;gt;vWhen = strtotime($iWhen);&lt;br /&gt;
			} else {&lt;br /&gt;
				$this-&amp;gt;vWhen = NULL;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	public function PlusDays($iDays) {&lt;br /&gt;
		$dtOut = new Timestamp($this-&amp;gt;vWhen + ($iDays * 60*60*24));&lt;br /&gt;
		return $dtOut;&lt;br /&gt;
	}&lt;br /&gt;
	public function Format($iFmt) {&lt;br /&gt;
		return date($iFmt,$this-&amp;gt;vWhen);&lt;br /&gt;
	}&lt;br /&gt;
	public function IsLater() {&lt;br /&gt;
		return $this-&amp;gt;vWhen &amp;gt; time();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
function LogText($iText) {&lt;br /&gt;
	global $wgfpLogs;&lt;br /&gt;
&lt;br /&gt;
	$fh = fopen($wgfpLogs.&amp;#039;SiteSubscribe.log&amp;#039;, &amp;#039;a&amp;#039;);&lt;br /&gt;
	$qb = fwrite($fh, $iText);&lt;br /&gt;
	fclose($fh);&lt;br /&gt;
}&lt;br /&gt;
function LogSession() {&lt;br /&gt;
	LogText(&amp;quot;\n=====\n&amp;quot;.date(&amp;#039;Y-m-d H:i:s&amp;#039;));&lt;br /&gt;
}&amp;lt;/php&amp;gt;&lt;/div&gt;</summary>
		<author><name>Woozle</name></author>
	</entry>
</feed>