summaryrefslogtreecommitdiff
path: root/extensions/FunnyQuestion/FunnyQuestion.body.php
blob: 04d25f8dcfc9514762647465f4e3f3247052cc2e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php


class FunnyQuestion {

	private static function normalizeAnswer($answer) {
		return preg_replace('/[^a-z0-9]/', '', strtolower($answer));
	}

	private static function getLang() {
		global $wgLang;

		return (!empty($wgFunnyQuestions[$wgLang->getCode()]) ? $wgFunnyQuestions[$wgLang->getCode()] : 'en');
	}

	private static function getFunnyQuestion() {
		global $wgFunnyQuestionHash, $wgFunnyQuestions;

		$question = array_rand($wgFunnyQuestions[self::getLang()]);
		$time = time();
		# make sure the user is not able to tell us the question to answer
		$hash = sha1($time.$question.$wgFunnyQuestionHash);
	
		return array('question' => $question, 'time' => $time, 'hash' => $hash);
	}

	private static function checkFunnyQuestion() {
		global $wgFunnyQuestionHash, $wgFunnyQuestions, $wgFunnyQuestionTimeout, $wgFunnyQuestionWait;

		if (!empty($_POST['FunnyQuestionTime'])
		&& !empty($_POST['FunnyQuestionHash'])
		&& !empty($_POST['FunnyAnswer'])) {
			$now = time();
			$time = $_POST['FunnyQuestionTime'];
			$hash = $_POST['FunnyQuestionHash'];
			$userAnswer = self::normalizeAnswer($_POST['FunnyAnswer']);
		} else {
			return false;
		}

		if ($now - $time > $wgFunnyQuestionTimeout) {
			return false;
		} elseif ($now - $time < $wgFunnyQuestionWait) {
			return false;
		}

		foreach ($wgFunnyQuestions[self::getLang()] as $question => $answers) {
			if (!is_array($answers)) {
				$answers = array($answers);
			}
			foreach ($answers as $answer) {
				if (self::normalizeAnswer($answer) == $userAnswer
					&& $hash == sha1($time.$question.$wgFunnyQuestionHash)) {
					return true;
				}
			}
		}

		return false;
	}

	public static function addFunnyQuestionToEditPage($editpage, $output) {
		global $wgUser;

		if (!$wgUser->isLoggedIn()) {
			$funnyQuestion = self::getFunnyQuestion();
			$editpage->editFormTextAfterWarn .= 
				'<div class="editOptions">
					<label for="FunnyAnswerField"><strong>'
					.wfMsg('question-'.sha1($funnyQuestion['question'])).'</strong></label>
					<input id="FunnyAnswerField" type="text" name="FunnyAnswer" value="" />
					<input type="hidden" name="FunnyQuestionTime" value="'.$funnyQuestion['time'].'" />
					<input type="hidden" name="FunnyQuestionHash" value="'.$funnyQuestion['hash'].'" />
				</div>';
		}
		return true;
	}

	public static function checkFunnyQuestionOnEditPage($editpage, $text, $section, $error) {
		global $wgUser;

		if (!$wgUser->isLoggedIn() && !self::checkFunnyQuestion()) {
			$error = '<div class="errorbox">'.wfMsg('wrong-answer').'</div><br clear="all" />';
		}
		return true;
	}

	public static function addFunnyQuestionToUserCreateForm($template) {
		$funnyQuestion = self::getFunnyQuestion();
		$template->addInputItem('FunnyAnswer', '', 'text', 'question-label', 'question-'.sha1($funnyQuestion['question']));
		$template->addInputItem('FunnyQuestionTime', $funnyQuestion['time'], 'hidden', '');
		$template->addInputItem('FunnyQuestionHash', $funnyQuestion['hash'], 'hidden', '');
		return true;
	}

	public static function checkFunnyQuestionOnAbortNewAccount($user, $message) {
		if (!self::checkFunnyQuestion()) {
			$message = wfMsg('wrong-answer');
			return false;
		} else {
			return true;
		}
	}

}

?>