<?php

$cookiefile = tempnam( "./", "CurlCookie-" );
$url = 'https://localhost/w/api.php';
$wikiUser = 'NormalUser';
$wikiPass = 'pass';
$file = './2x2.png';

loginApi( $wikiUser, $wikiPass );
$csrftoken = getCsrfToken();

for ( $n = 1; $n < 5; ++$n ) {
	$filename = rand() . '-' . basename( $file );
	uploadFileApi( $filename, $file, $csrftoken, true );
}

function uploadFileApi( $filename, $file, $csrftoken, $ignoreWarnings = false ) {
	global $cookiefile, $url;

	echo "Uploading: $filename, $file, $csrftoken\n";
	$params = array(
		'format'=>'json',
		'action'=>'upload',
		'token'=>$csrftoken,
		'filename'=>$filename,
		'file'=>"@$file",
	);

	if ( $ignoreWarnings ) {
		$params['ignorewarnings'] = 1;
	}

	$ch = curl_init();
	curl_setopt( $ch, CURLOPT_URL, $url );
	curl_setopt( $ch, CURLOPT_PORT , 443 );
	curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
	curl_setopt( $ch, CURLOPT_HEADER, 0 );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookiefile );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookiefile );
	curl_setopt( $ch, CURLOPT_POST, 1 );
	curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
	$data = curl_exec( $ch );

	if( !$data ) {
		'Curl error: ' . curl_error( $ch );
	}
	#print_r( $data );
	$response = json_decode( $data );
	#print_r( $response );

	if ( $response->upload->result !== 'Success' ) {
		die ("Error uploading file: " . print_r( $response ));
	}

	echo "Upload Successful\n";
	curl_close( $ch );
}


function loginApi( $username, $password ) {
	global $cookiefile, $url;

	// Get login token
	$params = array(
		'format'=>'json',
		'action'=>'login',
		'lgname'=>$username,
		'lgpassword'=>'',
	);
	$ch = curl_init();
	curl_setopt( $ch, CURLOPT_URL, $url );
	curl_setopt( $ch, CURLOPT_PORT , 443 );
	curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
	curl_setopt( $ch, CURLOPT_HEADER, 0 );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookiefile );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookiefile );
	curl_setopt( $ch, CURLOPT_POST, 1 );
	curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params ) );
	$data = curl_exec( $ch );

	if( !$data ) {
		'Curl error: ' . curl_error( $ch );
	}
	#print_r( $data );
	$response = json_decode( $data );
	#print_r( $response->login );
	echo "Login Token: {$response->login->token}\n";

	// Actual login, with csrf token
	$params = array(
		'format'=>'json',
		'action'=>'login',
		'lgname'=>$username,
		'lgpassword'=>$password,
		'lgtoken'=>$response->login->token,
	);
	curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params ) );
	$data = curl_exec( $ch );
	#print_r( $data );
	$response = json_decode( $data );

	if ( $response->login->result !== 'Success' ) {
		die( "Error logging in: " . print_r( $response, true ) );
	}

	curl_close( $ch );

	echo "Login successful!\n";
}

function getCsrfToken( ) {
	global $url, $cookiefile;

	$params = array(
		'format'=>'json',
		'action'=>'query',
		'meta'=>'tokens',
	);

	$ch = curl_init();
	curl_setopt( $ch, CURLOPT_URL, $url );
	curl_setopt( $ch, CURLOPT_PORT , 443 );
	curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
	curl_setopt( $ch, CURLOPT_HEADER, 0 );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookiefile );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, $cookiefile );
	curl_setopt( $ch, CURLOPT_POST, 1 );
	curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params ) );
	$data = curl_exec( $ch );

	if( !$data ) {
		'Curl error: ' . curl_error( $ch );
	}
	#print_r( $data );
	$response = json_decode( $data );
	#print_r( $response );
	echo "CSRF Token: {$response->query->tokens->csrftoken}\n";

	curl_close( $ch );

	return $response->query->tokens->csrftoken;
}


