ip.php 7.23 KB
Newer Older
Scott committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
<?php
/*
	Question2Answer by Gideon Greenspan and contributors
	http://www.question2answer.org/

	File: qa-include/qa-page-ip.php
	Description: Controller for page showing recent activity for an IP address


	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	More about this license: http://www.question2answer.org/license.php
*/

Scott committed
23 24 25 26
if (!defined('QA_VERSION')) { // don't allow this page to be requested directly from browser
	header('Location: ../');
	exit;
}
Scott committed
27

Scott committed
28 29
require_once QA_INCLUDE_DIR . 'db/selects.php';
require_once QA_INCLUDE_DIR . 'app/format.php';
Scott committed
30 31


Scott committed
32 33 34
$ip = qa_request_part(1); // picked up from qa-page.php
if (filter_var($ip, FILTER_VALIDATE_IP) === false)
	return include QA_INCLUDE_DIR . 'qa-page-not-found.php';
Scott committed
35 36 37 38


//	Find recently (hidden, queued or not) questions, answers, comments and edits for this IP

Scott committed
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
$userid = qa_get_logged_in_userid();

list($qs, $qs_queued, $qs_hidden, $a_qs, $a_queued_qs, $a_hidden_qs, $c_qs, $c_queued_qs, $c_hidden_qs, $edit_qs) =
	qa_db_select_with_pending(
		qa_db_qs_selectspec($userid, 'created', 0, null, $ip, false),
		qa_db_qs_selectspec($userid, 'created', 0, null, $ip, 'Q_QUEUED'),
		qa_db_qs_selectspec($userid, 'created', 0, null, $ip, 'Q_HIDDEN', true),
		qa_db_recent_a_qs_selectspec($userid, 0, null, $ip, false),
		qa_db_recent_a_qs_selectspec($userid, 0, null, $ip, 'A_QUEUED'),
		qa_db_recent_a_qs_selectspec($userid, 0, null, $ip, 'A_HIDDEN', true),
		qa_db_recent_c_qs_selectspec($userid, 0, null, $ip, false),
		qa_db_recent_c_qs_selectspec($userid, 0, null, $ip, 'C_QUEUED'),
		qa_db_recent_c_qs_selectspec($userid, 0, null, $ip, 'C_HIDDEN', true),
		qa_db_recent_edit_qs_selectspec($userid, 0, null, $ip, false)
	);
Scott committed
54 55 56 57


//	Check we have permission to view this page, and whether we can block or unblock IPs

Scott committed
58 59 60 61 62
if (qa_user_maximum_permit_error('permit_anon_view_ips')) {
	$qa_content = qa_content_prepare();
	$qa_content['error'] = qa_lang_html('users/no_permission');
	return $qa_content;
}
Scott committed
63

Scott committed
64
$blockable = qa_user_level_maximum() >= QA_USER_LEVEL_MODERATOR; // allow moderator in one category to block across all categories
Scott committed
65 66 67 68


//	Perform blocking or unblocking operations as appropriate

Scott committed
69 70 71
if (qa_clicked('doblock') || qa_clicked('dounblock') || qa_clicked('dohideall')) {
	if (!qa_check_form_security_code('ip-' . $ip, qa_post_text('code')))
		$pageerror = qa_lang_html('misc/form_security_again');
Scott committed
72

Scott committed
73
	elseif ($blockable) {
Scott committed
74

Scott committed
75 76 77
		if (qa_clicked('doblock')) {
			$oldblocked = qa_opt('block_ips_write');
			qa_set_option('block_ips_write', (strlen($oldblocked) ? ($oldblocked . ' , ') : '') . $ip);
Scott committed
78

Scott committed
79 80 81
			qa_report_event('ip_block', $userid, qa_get_logged_in_handle(), qa_cookie_get(), array(
				'ip' => $ip,
			));
Scott committed
82

Scott committed
83 84
			qa_redirect(qa_request());
		}
Scott committed
85

Scott committed
86 87
		if (qa_clicked('dounblock')) {
			require_once QA_INCLUDE_DIR . 'app/limits.php';
Scott committed
88

Scott committed
89
			$blockipclauses = qa_block_ips_explode(qa_opt('block_ips_write'));
Scott committed
90

Scott committed
91 92 93 94
			foreach ($blockipclauses as $key => $blockipclause) {
				if (qa_block_ip_match($ip, $blockipclause))
					unset($blockipclauses[$key]);
			}
Scott committed
95

Scott committed
96
			qa_set_option('block_ips_write', implode(' , ', $blockipclauses));
Scott committed
97

Scott committed
98 99 100
			qa_report_event('ip_unblock', $userid, qa_get_logged_in_handle(), qa_cookie_get(), array(
				'ip' => $ip,
			));
Scott committed
101

Scott committed
102 103
			qa_redirect(qa_request());
		}
Scott committed
104

Scott committed
105 106
		if (qa_clicked('dohideall') && !qa_user_maximum_permit_error('permit_hide_show')) {
			// allow moderator in one category to hide posts across all categories if they are identified via IP page
Scott committed
107

Scott committed
108 109
			require_once QA_INCLUDE_DIR . 'db/admin.php';
			require_once QA_INCLUDE_DIR . 'app/posts.php';
Scott committed
110

Scott committed
111
			$postids = qa_db_get_ip_visible_postids($ip);
Scott committed
112

Scott committed
113 114
			foreach ($postids as $postid)
				qa_post_set_hidden($postid, true, $userid);
Scott committed
115

Scott committed
116
			qa_redirect(qa_request());
Scott committed
117 118
		}
	}
Scott committed
119
}
Scott committed
120 121 122 123


//	Combine sets of questions and get information for users

Scott committed
124
$questions = qa_any_sort_by_date(array_merge($qs, $qs_queued, $qs_hidden, $a_qs, $a_queued_qs, $a_hidden_qs, $c_qs, $c_queued_qs, $c_hidden_qs, $edit_qs));
Scott committed
125

Scott committed
126
$usershtml = qa_userids_handles_html(qa_any_get_userids_handles($questions));
Scott committed
127

Scott committed
128
$hostname = gethostbyaddr($ip);
Scott committed
129 130 131 132


//	Prepare content for theme

Scott committed
133
$qa_content = qa_content_prepare();
Scott committed
134

Scott committed
135 136
$qa_content['title'] = qa_lang_html_sub('main/ip_address_x', qa_html($ip));
$qa_content['error'] = @$pageerror;
Scott committed
137

Scott committed
138 139
$qa_content['form'] = array(
	'tags' => 'method="post" action="' . qa_self_html() . '"',
Scott committed
140

Scott committed
141
	'style' => 'wide',
Scott committed
142

Scott committed
143 144 145 146 147
	'fields' => array(
		'host' => array(
			'type' => 'static',
			'label' => qa_lang_html('misc/host_name'),
			'value' => qa_html($hostname),
Scott committed
148
		),
Scott committed
149
	),
Scott committed
150

Scott committed
151 152 153 154
	'hidden' => array(
		'code' => qa_get_form_security_code('ip-' . $ip),
	),
);
Scott committed
155 156


Scott committed
157 158
if ($blockable) {
	require_once QA_INCLUDE_DIR . 'app/limits.php';
Scott committed
159

Scott committed
160 161
	$blockipclauses = qa_block_ips_explode(qa_opt('block_ips_write'));
	$matchclauses = array();
Scott committed
162

Scott committed
163 164 165 166
	foreach ($blockipclauses as $blockipclause) {
		if (qa_block_ip_match($ip, $blockipclause))
			$matchclauses[] = $blockipclause;
	}
Scott committed
167

Scott committed
168 169 170 171 172 173
	if (count($matchclauses)) {
		$qa_content['form']['fields']['status'] = array(
			'type' => 'static',
			'label' => qa_lang_html('misc/matches_blocked_ips'),
			'value' => qa_html(implode("\n", $matchclauses), true),
		);
Scott committed
174

Scott committed
175 176 177 178
		$qa_content['form']['buttons']['unblock'] = array(
			'tags' => 'name="dounblock"',
			'label' => qa_lang_html('misc/unblock_ip_button'),
		);
Scott committed
179

Scott committed
180 181 182 183
		if (count($questions) && !qa_user_maximum_permit_error('permit_hide_show'))
			$qa_content['form']['buttons']['hideall'] = array(
				'tags' => 'name="dohideall" onclick="qa_show_waiting_after(this, false);"',
				'label' => qa_lang_html('misc/hide_all_ip_button'),
Scott committed
184
			);
Scott committed
185 186 187 188 189 190

	} else {
		$qa_content['form']['buttons']['block'] = array(
			'tags' => 'name="doblock"',
			'label' => qa_lang_html('misc/block_ip_button'),
		);
Scott committed
191
	}
Scott committed
192
}
Scott committed
193 194


Scott committed
195
$qa_content['q_list']['qs'] = array();
Scott committed
196

Scott committed
197 198
if (count($questions)) {
	$qa_content['q_list']['title'] = qa_lang_html_sub('misc/recent_activity_from_x', qa_html($ip));
Scott committed
199

Scott committed
200 201 202 203 204 205 206 207
	foreach ($questions as $question) {
		$htmloptions = qa_post_html_options($question);
		$htmloptions['tagsview'] = false;
		$htmloptions['voteview'] = false;
		$htmloptions['ipview'] = false;
		$htmloptions['answersview'] = false;
		$htmloptions['viewsview'] = false;
		$htmloptions['updateview'] = false;
Scott committed
208

Scott committed
209
		$htmlfields = qa_any_to_q_html_fields($question, $userid, qa_cookie_get(), $usershtml, null, $htmloptions);
Scott committed
210

Scott committed
211 212
		if (isset($htmlfields['what_url'])) // link directly to relevant content
			$htmlfields['url'] = $htmlfields['what_url'];
Scott committed
213

Scott committed
214
		$hasother = isset($question['opostid']);
Scott committed
215

Scott committed
216 217
		if ($question[$hasother ? 'ohidden' : 'hidden'] && !isset($question[$hasother ? 'oupdatetype' : 'updatetype'])) {
			$htmlfields['what_2'] = qa_lang_html('main/hidden');
Scott committed
218

Scott committed
219 220 221 222
			if (@$htmloptions['whenview']) {
				$updated = @$question[$hasother ? 'oupdated' : 'updated'];
				if (isset($updated))
					$htmlfields['when_2'] = qa_when_to_html($updated, @$htmloptions['fulldatedays']);
Scott committed
223 224 225
			}
		}

Scott committed
226 227
		$qa_content['q_list']['qs'][] = $htmlfields;
	}
Scott committed
228

Scott committed
229 230
} else
	$qa_content['q_list']['title'] = qa_lang_html_sub('misc/no_activity_from_x', qa_html($ip));
Scott committed
231 232


Scott committed
233
return $qa_content;