diff -Naur -x '*Settings.php' -x CVS wikipedia.cvs20031126/includes/SpecialUserlogin.php wikipedia.cvs20031126.with-post-cookie-check/includes/SpecialUserlogin.php
--- wikipedia.cvs20031126/includes/SpecialUserlogin.php	2003-11-24 16:49:18.000000000 +0000
+++ wikipedia.cvs20031126.with-post-cookie-check/includes/SpecialUserlogin.php	2003-11-26 19:21:10.000000000 +0000
@@ -4,13 +4,17 @@
 {
 	global $wpCreateaccount, $wpCreateaccountMail;
 	global $wpLoginattempt, $wpMailmypassword;
-	global $action;
+	global $action, $_REQUEST;
 
 	$fields = array( "wpName", "wpPassword", "wpName",
 	  "wpPassword", "wpRetype", "wpEmail" );
 	wfCleanFormFields( $fields );
 
-	if ( isset( $wpCreateaccount ) ) {
+        $wpCookieCheck = $_REQUEST[ "wpCookieCheck" ];
+
+	if ( isset( $wpCookieCheck ) ) {
+                onCookieRedirectCheck( $wpCookieCheck );
+        } else if ( isset( $wpCreateaccount ) ) {
 		addNewAccount();
 	} else if ( isset( $wpCreateaccountMail ) ) {
 		addNewAccountMailPassword();
@@ -68,18 +72,23 @@
 	}
 
 	$wgUser = $u;
-	successfulLogin( wfMsg( "welcomecreation", $wgUser->getName() ) );
+        $wgUser->setCookies();
+
+        $up = new UserUpdate();
+        array_push( $wgDeferredUpdateList, $up );
+  
+        if (hasSessionCookie()) {
+            return successfulLogin( wfMsg( "welcomecreation", $wgUser->getName() ) );
+        } else {
+            return cookieRedirectCheck("new");
+        }
 }
 
 
 /* private */ function addNewAccountInternal()
 {
 	global $wgUser, $wgOut, $wpPassword, $wpRetype, $wpName, $wpRemember;
-	global $wpEmail, $wgDeferredUpdateList;
-
-        if (!cookieCheck()) {
-                return;
-        }
+	global $wpEmail;
 
 	if (!$wgUser->isAllowedToCreateAccount()) {
 		userNotPrivilegedMessage();
@@ -124,12 +133,9 @@
 /* private */ function processLogin()
 {
 	global $wgUser, $wpName, $wpPassword, $wpRemember;
+        global $wgDeferredUpdateList;
 	global $returnto;
 
-        if (!cookieCheck()) {
-                return;
-        }
-
 	if ( "" == $wpName ) {
 		mainLoginForm( wfMsg( "noname" ) );
 		return;
@@ -161,7 +167,16 @@
 	$u->setOption( "rememberpassword", $r );
 
 	$wgUser = $u;
-	successfulLogin( wfMsg( "loginsuccess", $wgUser->getName() ) );
+        $wgUser->setCookies();
+
+        $up = new UserUpdate();
+        array_push( $wgDeferredUpdateList, $up );
+  
+        if (hasSessionCookie()) {
+	    return successfulLogin( wfMsg( "loginsuccess", $wgUser->getName() ) );
+        } else {
+            return cookieRedirectCheck( "login" );
+        }
 }
 
 /* private */ function mailPassword()
@@ -225,24 +240,17 @@
 
 /* private */ function successfulLogin( $msg )
 {
-	global $wgUser, $wgOut, $returnto;
-	global $wgDeferredUpdateList;
-
-	$wgUser->setCookies();
-	$up = new UserUpdate();
-	array_push( $wgDeferredUpdateList, $up );
-
-	$wgOut->setPageTitle( wfMsg( "loginsuccesstitle" ) );
-	$wgOut->setRobotpolicy( "noindex,nofollow" );
-	$wgOut->setArticleFlag( false );
-	$wgOut->addHTML( $msg . "\n<p>" );
-	$wgOut->returnToMain();
+  global $wgUser;
+  global $wgDeferredUpdateList;
+  global $wgOut, $returnto;
+
+  $wgOut->setPageTitle( wfMsg( "loginsuccesstitle" ) );
+  $wgOut->setRobotpolicy( "noindex,nofollow" );
+  $wgOut->setArticleFlag( false );
+  $wgOut->addHTML( $msg . "\n<p>" );
+  $wgOut->returnToMain();
 }
 
-
-
-
-
 function userNotPrivilegedMessage()
 {
 	global $wgOut, $wgUser, $wgLang;
@@ -255,9 +263,6 @@
 	$wgOut->returnToMain( false );
 }
 
-
-
-
 /* private */ function mainLoginForm( $err )
 {
 	global $wgUser, $wgOut, $wgLang, $returnto;
@@ -293,7 +298,8 @@
 	$wgOut->setArticleFlag( false );
 
 	if ( "" == $err ) {
-		$wgOut->addHTML( "<h2>$li:</h2>\n" );
+                $lp = wfMsg( "loginprompt" );
+		$wgOut->addHTML( "<h2>$li:</h2>\n<p>$lp</p>" );
 	} else {
 		$wgOut->addHTML( "<h2>$le:</h2>\n<font size='+1' 
 color='red'>$err</font>\n" );
@@ -365,30 +371,41 @@
 
 }
 
-/* private */ function cookieCheck() {
-
-	global $HTTP_COOKIE_VARS, $wgOut, $returnto;
-	global $wgDisableCookieCheck;
-
-	if ( $wgDisableCookieCheck ) {
-		return true;
-	}
-
-	# XXX: kind of crude check to see if cookies are enabled, but it works OK
+/* private */ function hasSessionCookie()
+{
+  global $HTTP_COOKIE_VARS;
+  global $wgDisableCookieCheck;
+  
+  return ( $wgDisableCookieCheck ) ? true : ( "" != $HTTP_COOKIE_VARS[session_name()]);
+}
+  
+/* private */ function cookieRedirectCheck( $type )
+{
+  global $wgOut, $wgLang;
 
-	if ( "" == $HTTP_COOKIE_VARS[session_name()])
-	{
-		# Don't go back to login page; they won't get time to
-		# enable cookies and send us one, so they'll get this msg again. Instead, 
-		# let them enable cookies on the error page, then go back to login page.
-		# XXX: wipes returnto, unfortunately.
+  $check = wfLocalUrl( $wgLang->specialPage( "Userlogin" ),
+                       "wpCookieCheck=$type" );
 
-		$returnto = "Special:Userlogin";                
-		$wgOut->errorpage( "nocookies", "nocookiestext" );
-		return false;
-	}
+  return $wgOut->redirect( $check );
+}
 
-	return true;
+/* private */ function onCookieRedirectCheck( $type ) {
+
+  global $wgUser;
+
+  if (!hasSessionCookie()) {
+    if ( $type == "new" ) {
+      return mainLoginForm( wfMsg( "nocookiesnew" ) );
+    } else if ( $type == "login" ) {
+      return mainLoginForm( wfMsg( "nocookieslogin" ) );
+    } else {
+# shouldn't happen
+      return mainLoginForm( wfMsg( "error" ) );
+    }
+  } else {
+    return successfulLogin( wfMsg( "loginsuccess", $wgUser->getName() ) );
+  }
 }
 
+
 ?>
diff -Naur -x '*Settings.php' -x CVS wikipedia.cvs20031126/languages/Language.php wikipedia.cvs20031126.with-post-cookie-check/languages/Language.php
--- wikipedia.cvs20031126/languages/Language.php	2003-11-26 18:33:33.000000000 +0000
+++ wikipedia.cvs20031126.with-post-cookie-check/languages/Language.php	2003-11-26 18:52:33.000000000 +0000
@@ -544,6 +544,7 @@
 that it be to the address you give.<br>\n",
 
 "login"			=> "Log in",
+"loginprompt"           => "You must have cookies enabled to log in to $wgSitename.",
 "userlogin"		=> "Log in",
 "logout"		=> "Log out",
 "userlogout"	=> "Log out",
@@ -559,8 +560,8 @@
 email address to them, and it also helps you if you forget your   
 password.",
 "loginerror"	=> "Login error",
-"nocookies"	=> "Cookies disabled",
-"nocookiestext"	=> "The wiki uses cookies to log in users. You have cookies disabled. Please enable them and try again.",
+"nocookiesnew"	=> "The user account was created, but you are not logged in. $wgSitename uses cookies to log in users. You have cookies disabled. Please enable them, then log in with your new username and password.",
+"nocookieslogin"	=> "$wgSitename uses cookies to log in users. You have cookies disabled. Please enable them and try again.",
 "noname"		=> "You have not specified a valid user name.",
 "loginsuccesstitle" => "Login successful",
 "loginsuccess"	=> "You are now logged in to $wgSitename as \"$1\".",
