# UBB New Reply Routines : Perl Code

&RequireCode("$vars_config{CGIPath}/ubb_lib_posting.cgi");
&RequireCode("$vars_config{CGIPath}/ubb_lib_2.cgi");
&RequireVars("$vars_config{VariablesPath}/vars_mods.cgi");

unless ($in{f}) {
	&StandardHTML($vars_wordlets_err{no_forum_selected});
	exit(0);
}


# which forum number is this?
my $this_forum = ("forum_" . "$in{f}");

# get assigned style template!
%vars_style = &LoadStyleTemplate($template_match{$this_forum});

$direct_to = qq!
<base href="$vars_config{NonCGIURL}/" />
!;
&set_page_elements;

sub reply_page {
	local (@this_forum, @this_topic, $ubb_images, $post_permiss, $reply_restrict, $j, $is_html, $is_ubb, $html_allowed, $ubb_allowed, $ubb_images_wording, $icon_field, $show_sig, $disable_smilies, @reply_to, @stat_line, $clean_reply_to_message, $reply_to_message, $reply_to_author, $insert_reply_to, $i_frame, $i_frame_alt, @post_line, $go_to, $close_option, @user_profile, $ubb_code_buttons);

	# validate replyto=> reply with quote
	if ($in{replyto}) {
		unless ($in{replyto} >= 0) {
			&StandardHTML("$vars_wordlets_err{reply_to}");
		}
	}

	# get forum details
	@this_forum   = &GetForumRecord($in{f});
	unless(@this_forum) {
		&StandardHTML("$vars_wordlets_err{no_such_forum}");
	}
	$post_permiss = $this_forum[6];
	chomp($post_permiss);

	# check forum posting rules
	if ($post_permiss eq 'private') {
		$reply_restrict = 'restrict';
	} else {
		($j, $reply_restrict) = split (/\&/, $post_permiss);
	}

	if ($reply_restrict eq 'none') {
		&StandardHTML("$vars_wordlets_err{no_one_can_post}");
	}

	if((($reply_restrict eq 'allreg') || ($reply_restrict eq 'restrict')) && ($vars_registration{DisplayRegistration} eq "NO")) {
		&StandardHTML("$vars_wordlets_err{forum_misconfigured}");
	}

	# make sure we have someone logged in - unless unreg users allowed
	if ((!$username) && ($reply_restrict ne 'all') && ($vars_display{RequireLoginPosts} eq "YES")) {
		&StandardHTML(qq!$vars_wordlets_err{not_logged_in}<p> <a href="$vars_config{CGIURL}/ultimatebb.cgi?ubb=login">$vars_wordlets{login_now}</a> $vars_wordlets{or} <a href="$vars_config{CGIURL}/ultimatebb.cgi?ubb=agree">$vars_wordlets{register_title}</a>!);
	}

	# check to make sure user has access/permission to post!
	if (($post_permiss eq 'private') || ($reply_restrict eq 'restrict')) {
		&check_private_access($in{f}, $this_forum[12]);
	}

	# grab topic
	@this_topic = &OpenTopic($in{t}, $in{f});

	# grab topic stat line
	@stat_line = split (/\|\|/, $this_topic[0]);

	# is topic closed?
	if ($stat_line[1] =~ /X/i) {
		&StandardHTML("$vars_wordlets_err{topic_closed}");
	}

	# don't display if this forum status is off and forum is private
	if (($post_permiss eq 'private') && ($this_forum[3] ne 'On')) {
		&StandardHTML("$vars_wordlets_err{private_forum_off}");
	}

	# if unreg users not permitted to post, check to make user has write permissions
	if (($reply_restrict ne 'all') && ($vars_display{RequireLoginPosts} eq "YES")) {
		my @profile = &verify_id_num($username, $password, $user_number);
		chomp($profile[4]);
		if ($profile[4] !~ /Write/i) {
			&StandardHTML("$vars_wordlets_err{user_not_approved}");
		}
	}

	&CheckCoding("$this_forum[4]", "$this_forum[5]", "$this_forum[10]");

	# WOL (4.1.0a)
	my $whos_online_subject = "";
	if ($post_permiss eq 'private') {
		$whos_online_subject = $vars_wordlets_mods{whos_online_private_topic};
	} else {
		$whos_online_subject = $stat_line[4];
	}
	&RequireCode("$vars_config{CGIPath}/ubb_whos_online.cgi");
		&WriteUserSession("$vars_wordlets_mods{whos_online_replying} \"<A HREF=\"$vars_config{CGIURL}/ultimatebb.cgi?ubb=get_topic;f=$in{f};t=$in{t}\">$whos_online_subject</a>\" $vars_wordlets_mods{whos_online_in} \"<A HREF=\"$vars_config{CGIURL}/ultimatebb.cgi?ubb=forum;f=$in{f}\">$this_forum[1]</a>\"", $user_number, $invisible_pref);
	# WOL (4.1.0a)

	# -> is_html, is_ubb, ubb_images_wording, html_allowed, ubb_allowed

	if ($this_forum[5] eq 'is') {
		$ubb_code_buttons = &instant_ubb_code;
	} else {
		$ubb_code_buttons = "$is_ubb";
	}

	if ($vars_display{AllowIcons} eq 'TRUE') {
		$icon_field = &create_icon_field("1");
	}

	# show signature?
	if (($vars_display{AllowSignature} eq 'YES') && ($username ne '')) {
		$show_sig = qq(<br /><input type="CHECKBOX" name="Signature" id="Signature" value="yes" checked="checked" /> $vars_wordlets{show_signature});
	}

	# disable smilies?
	$disable_smilies = qq(<br /><input type="CHECKBOX" id="disable_smilies" name="disable_smilies" value="yes" /> $vars_wordlets{disable_smilies});

	# allow closing of topic?
	# only admins or mods can close topics
	if ($username ne "") {
		@user_profile = &verify_id_num($username, $password, $user_number);
		my $is_one = &is_admin_or_mod($in{f}, @user_profile);
		if ($is_one eq 'true') {
			$close_option = qq(<br><input type="CHECKBOX" id="close_topic" name="close_topic" value="yes" /> <b>$vars_wordlets{close_topic}</b>);
		}
	}

	# reply with quote?
	$insert_reply_to = '';
	if ($in{replyto}) {

		# find particular post within topic
		@post_line = grep(/^Z\|\|$in{replyto}/, @this_topic);
		@reply_to = split (/\|\|/, $post_line[0]);

		$reply_to_message = $reply_to[6];

		if ($reply_to[10] ne '') {
			$reply_to_author = $reply_to[10];
		} else {
			$reply_to_author = $reply_to[2];
		}

		# prepare replyto post for form
		$clean_reply_to_message = &prep_for_edit("$reply_to_message", "$this_forum[5]", "$this_forum[10]");
		$clean_reply_to_message =~ s/(\[QUOTE\])(.*)(\[\/QUOTE\])//isg;

		# strip off sig (if old UBB5 message)
		chomp($reply_to[12]);
		if ($reply_to[12] eq '') {
			$clean_reply_to_message =~ s/------------------(.*)//isg;
		}
		chomp($clean_reply_to_message);

		$insert_reply_to = "\[QUOTE\]$vars_wordlets{reply_to_lead} $reply_to_author:\n\[QB\]$clean_reply_to_message\[/QB\]\[/QUOTE\]" . "\n\n";

	}    # end replyto get

	# set topic viewer:
	$go_to = "$vars_config{CGIURL}/ultimatebb.cgi?ubb=get_topic;f=$in{f};t=$in{t};inline=1";


	$i_frame_alt = &build_topic_review;

	if ($vars_display{InlineFrame} eq 'TRUE') {
		$i_frame = qq(<iframe frameborder="1" align="center" width="$vars_style{TableWidth}" height="200" scrolling="YES" src="$go_to">
$i_frame_alt
</iframe>);
	} else {
		$i_frame = $i_frame_alt;
	}

	# pull in instant smilie/ubb code javascript
	$direct_to .= $instant_jscript;
	&set_page_elements;

	&LoadTemplate("public_new_reply_form");

}    # end new_reply_page

sub submit_new_reply {
	local (@this_forum, $ip_number, $permission, $reply_restrict, $j, $lc_your_name, $reg_name, $lc_reg_name, $lc_it, $status, $total_post_count, $last_topic_number, $total_topic_count, @user_profile, $post_email, $message_ascii, @stat_line, $post_number, @ip_banlist, @this_topic, $total_replies, @rev_this_topic, @last_post, $last_post_num, @get_email, $notify_email, $notify_user_number, $get_profile, $get_un, @notify_profile, $message, $mess_truncated, $this_subject, $this_subject_also, $email_message, $html_message);
	local (*FILE);

	&RequireCode("$vars_config{CGIPath}/ubb_lib_2.cgi");
	@this_forum = &GetForumRecord($in{f});
	unless(@this_forum) {
		&StandardHTML("$vars_wordlets_err{no_such_forum}");
	}
	$permission = $this_forum[6];

	#set proper path if forum is private
	if ($permission eq 'private') {
		$exact_path     = "Forum$in{f}/private-$this_forum[7]";
		$reply_restrict = 'restrict';
	} else {
		$exact_path = "Forum$in{f}";
		($j, $reply_restrict) = split ("&", $permission);
	}

	# if we got a post from a person who is posting without being logged in, fake the login
	my $cookie4;
	if (($in{your_name} ne "") && ($in{your_password} ne "") && ($vars_display{RequireLoginPosts} eq "NO")) {

		my @user_info = &verify_id("$in{your_name}", "$in{your_password}");    #validate their un/pw combo
		$username    = $in{your_name};
		$password    = $in{your_password};
		$pubname     = $user_info[0];
		$user_number = &GetUserNumber($username);

		my @this_profile = &verify_id_num_2($username, $password, $user_number);
		chomp($this_profile[1]);
		chomp($this_profile[0]);
		chomp($this_profile[21]);
		chomp($this_profile[15]);

		if ($this_profile[15] eq '') {
			$this_profile[15] = "$this_profile[0]";
		}

		$username = $this_profile[0];
		$password = $this_profile[1];

		$cookie4 = cookie(
			-name    => "ubber$vars_config{Cookie_Number}",
			-value   => [$this_profile[0], $this_profile[1], $this_profile[15], $this_profile[21], $user_number],
			-path    => '/',
			-expires => '+2y'
		);

	}    #endif


	if ($cookie4) {
		print header(
			-cookie  => [$cookie4],
			-charset => "$masterCharset"
		);

	} else {
		print header(-charset => "$masterCharset");

	}



	# make sure hiddens are cool
	unless (($in{t} =~ /^\d{6}$/) && ($in{f} > 0)) {
		&StandardHTML("$vars_wordlets_err{invalid_input}");
	}

	# is user banned?
	$ip_number = $ENV{'REMOTE_ADDR'};
	&check_ip_bans;

	#validate
	my @ValidateArray = ("message");

	if ($reply_restrict eq 'none') {
		&StandardHTML("$vars_wordlets_err{no_one_can_post}");
	}


	# in case this is an unreg user
	if (!$username) {
		push (@ValidateArray, "your_name");
	}
	if (($vars_display{RequireLoginPosts} eq "NO") && ($reply_restrict ne "all") && ($reply_restrict ne "restrict") && ($in{your_name} ne '')) {
		push (@ValidateArray, "your_password");
	}

	&Validate(@ValidateArray);

	# make sure we have someone logged in - unless unreg users allowed
	if (($username eq '') && ($reply_restrict ne 'all')) {
		&StandardHTML(qq!$vars_wordlets_err{not_logged_in}<p> <a href="$vars_config{CGIURL}/ultimatebb.cgi?ubb=login">$vars_wordlets{login_now}</A></p>!);
	}

	# check to make sure user has access/permission to post!
	if (($permission eq 'private') || ($reply_restrict eq 'restrict')) {
		&check_private_access($in{f}, $this_forum[12]);
	}


	# we will need to timestamp this baby
	&GetDateTime;

	if (($reply_restrict eq 'all') && ($in{your_name} ne '') && ($in{your_password} eq "")) {

		# user is not registered, so...
		&CheckLengthOrDie("your_name", 25);
		my $tempuser = $in{your_name};

		&illegal_name_check($tempuser);

		#&CheckForExistingNames(lc $tempuser);

		$username = "&lt;$tempuser&gt;";
		$pubname  = "&lt;$tempuser&gt;";

		# brackets differentiate from registered members
	} else {

		# user is saying he is registered so...
		#verify cookie id
		@user_profile = &verify_id_num($username, $password, $user_number);
		chomp($user_number);

		# does this person have permission to write?
		if ($user_profile[4] !~ /Write/i) {
			&StandardHTML("$vars_wordlets_err{user_not_approved}");
		}

	}    # if/else unregistered name

	if ($vars_misc{FloodCheck} eq 'ON') {

		# floodcheck courtesy of Michael Farris
		chomp($user_profile[8]);
		&floodcheck unless (($user_profile[8] eq 'Administrator') || ($user_profile[8] eq 'Moderator'));
	}

	# get forum post count
	if (-e "$vars_config{NonCGIPath}/$exact_path/lastnumber.file") {
		my @forumcounter = &OpenFileAsArray("$vars_config{NonCGIPath}/$exact_path/lastnumber.file");
		$last_topic_number = 0 + $forumcounter[0];
		chomp($last_topic_number);
		$total_topic_count = 0 + $forumcounter[1];
		chomp($total_topic_count);
		$total_post_count = 0 + $forumcounter[2];
		chomp($total_post_count);

		#yes, yes, I know...
	} else {
		$total_post_count  = 0;
		$last_topic_number = 0;
		$total_topic_count = 0;
	}

	# update post count
	$total_post_count++;

	# grab topic
	@this_topic = &OpenTopic($in{t}, $in{f});

	# grab topic stat line
	@stat_line = split (/\|\|/, $this_topic[0]);

	# is topic closed?
	if ($stat_line[1] =~ /X/i) {
		&StandardHTML("$vars_wordlets_err{topic_closed}");
	}

	# need to update total replies
	$stat_line[2] = scalar(@this_topic) - 1;  #1, not 2 - yet to add

	# close topic?
	# only admins or mods can close topics
	if (!($in{your_name}) && ($in{close_topic}) && ($in{close_topic} eq 'yes')) {
		my $is_one = &is_admin_or_mod($in{f}, @user_profile);
		if ($is_one eq 'true') { $stat_line[1] .= 'X'; }
	}

	# grab subject
	$this_subject      = $stat_line[4];
	$this_subject_also = $this_subject;

	# reassemble stat_line for @this_topic
	$this_topic[0] = join ("||", @stat_line);

	# grab last post
	@rev_this_topic = reverse(@this_topic);
	@last_post      = split (/\|\|/, $rev_this_topic[0]);
	$last_post_num  = $last_post[1];
	$last_post_num++;

	# format new post number
	$post_number = &Do6Digit($last_post_num);

	# now we have to add the post to the topic
	$message = $in{message};

	## if HTML is not allowed, render HTML useless
	if ($this_forum[4] eq 'is not') {
		$message =~ s/</&lt;/g;
		$message =~ s/>/&gt;/g;
	}

	$message = &CensorCheck("$message");
	$message = &Truncate("$message");

	$message_ascii = $message;

	# do graemlins--
	$in{disable_smilies} = "no" unless $in{disable_smilies};
	if ($in{disable_smilies} ne "yes") {
		$message = &Smilies("$message");
	}

	# UBB Code-ify (if allowed)
	if ($this_forum[5] eq 'is') {
		$message = &UBBCode("$message", "$this_forum[10]");
	}    #end if UBB Code allowed

	# convert newlines/carriage returns to <br> and <p> html tags
	$message = &ConvertReturns("$message");
	$message = &PipeCleaner("$message");

	# check for excess images-
	&excess_smilies_check($message);

	# security checks:
	&check_html($message);

	## if email should not be displayed, don't
	chomp($user_profile[11]);
	chomp($user_profile[2]);
	if (($vars_display{EmailBlock} eq 'ON') || ($user_profile[11] eq 'no') || (!$in{your_name})) {
		$post_email = '';
	} else {
		$post_email = "$user_profile[2]";
	}

	# we have IP, need to erase if we are not supposed to be keeping
	if ($vars_misc{IP} eq 'OFF') {
		$ip_number = '';
	}

	# post icons idea provided by KOMBAT03...
	unless ($in{msg_icon} =~ m/^\d+?$/) { $in{msg_icon} = '1'; }
	unless(-e "$vars_config{NonCGIPath}/icons/icon$in{msg_icon}.gif") {
		$in{msg_icon} = '1';
	}

	#create topic post line
	my $reg_status = 'reg';
	if (($in{your_name}) && (!$in{your_password}) && (!$user_number)) {
		$reg_status = 'unreg';
	}

	if (!$in{Signature}) {
		$in{Signature} = 'no';
	}

	my $topic_line = "Z||$post_number||$username||$GotTime{HyphenDate}||$GotTime{Time}||$post_email||$message||$ip_number||$reg_status||$in{msg_icon}||$pubname||$user_number||$in{Signature}\n";

	# append new reply to @this_topic
	push (@this_topic, $topic_line);

	# test to make sure member file is writeable!
	if ($reg_status eq 'reg') {
		unless (-w "$vars_config{MembersPath}/$user_number.cgi") {
			chmod(0777, "$vars_config{MembersPath}/$user_number.cgi") or die "Can't reset permissions on profile $user_number: $!";
		}
	}

	#update threads summary file
	if (-e "$vars_config{NonCGIPath}/$exact_path/forum_$in{f}.threads") {
		&update_forum_summary($in{f}, $in{t}, $this_subject);
	} else {
		my $thistopics = &NiceForumThreadsRebuild($in{f});
		&UpdateForumTopics($in{f}, $thistopics, 1);	#1 == nowrite
		&update_forum_summary($in{f}, $in{t}, $this_subject);
	}

	&UpdateForumThreadDataForSingleThreadAndWrite($in{f}, $in{t}, \@this_topic);

	# make sure that threads file was created:
	# this is in case disk quota is exceeded, to limit damage--
	if (-z "$vars_config{NonCGIPath}/$exact_path/forum_$in{f}.threads") {

		# alert admin!
		if ($vars_email{UseEmail} eq 'ON') {

			&RequireVars("$vars_config{VariablesPath}/vars_wordlets_email.cgi");
			my $this_message = qq!$vars_wordlets_email{post_alert_cant_write}!;

			&RequireCode("$vars_config{CGIPath}/ubb_lib_mail.cgi");
			&ubb_mail("$vars_registration{RegsAdminEmail}", "$vars_registration{RegsAdminEmail}", "$vars_registration{RegsAdminEmail}", "", "$vars_wordlets_err{post_no_write_subject} : $vars_config{BBName}", "$this_message", "", "$vars_display{BBEmail}");
		}

		&StandardHTML("$vars_wordlets_err{post_no_write2}");
	}    # unless threads file is blank

	# no problem, so proceed
	&WriteTopic($in{f}, $in{t}, @this_topic);

	# update member file?
	if ($reg_status eq 'reg') {
		$user_profile[7]++;

		# bump user up to Member if total posts reaches MemberMinimum
		if ($user_profile[8] !~ m/^(Administrator|Moderator)$/) {
			if ($user_profile[7] < $vars_misc{MemberMinimum}) {
				$user_profile[8] = 'Junior Member';
			} else {
				$user_profile[8] = 'Member';
			}
		}

		# update user_posts file
		if ($permission ne 'private') {
			&AppendFileAsString("$vars_config{MembersPath}/user_posts/$user_number.cgi", "$GotTime{YMDRunonDate}|$in{f}|$in{t}|$post_number\n");
		}

		#last post in profile
		$user_profile[30] = qq%$GotTime{YMDRunonDate}|$in{f}|$in{t}|$post_number%;

		&WriteMemberProfile($user_number, @user_profile);
	}    # end update user profile

	#update last time file
	&WriteFileAsString("$vars_config{NonCGIPath}/$exact_path/lasttime.file", "$GotTime{HyphenDate}\n$GotTime{Time}\n");

	&WriteFileAsString("$vars_config{NonCGIPath}/$exact_path/lastnumber.file", "$last_topic_number\n$total_topic_count\n$total_post_count\n$this_subject\n$pubname\n$in{msg_icon}\n$in{t}\n");

	# index---
	$in{topic_subject} = $this_subject;

	# create promo edition of message
	$mess_truncated = &promo($message);
	&append_index($in{f}, $in{t}, $this_forum[6], $post_number);

	# create promo edition of message
	$mess_truncated = &promo($message);

	# unlink old topic page
	#unlink("$vars_config{NonCGIPath}/cache-$cache_cookie/ubb_files/forums/$exact_path/$in{t}.cgi");
	my $thispath = qq($vars_config{NonCGIPath}/cache-$cache_cookie/ubb_files/forums/$exact_path);
	&DoThatClearCacheThing($thispath, $in{t});

	# lc the logged in user-- for comparisons below
	my $lc_un = lc($username);

	# take viewer back to topic
	%vars_style = &LoadStyleTemplate($template_match{transition});
	&set_page_elements;

	&Transition("$vars_config{CGIURL}/ultimatebb.cgi?ubb=get_topic&f=$in{f}&t=$in{t}", "$vars_wordlets{thanks_for_posting}", "$this_subject");

	# set email template
	if(($vars_email{UseEmail} eq 'ON') || (($this_forum[11] eq 'yes') || ($stat_line[1] =~ /N/i))) {
		%vars_style = &LoadStyleTemplate($template_match{email});
		&set_page_elements;
	}

	# notify moderator?
	if (($this_forum[11] eq 'yes') && ($vars_email{UseEmail} eq 'ON')) {

		local ($Moderator);

		# $Moderator contains list of email addresses for modderators, separated by commas
		$Moderator = &build_mod_emails($in{f});

		if ($Moderator ne '') {

			if ($vars_email{email_format} ne 'html') {
				&RequireVars("$vars_config{VariablesPath}/vars_wordlets_email.cgi");
				$email_message = qq!$vars_wordlets_email{mod_notify_post}!;
			} else {
				$email_message = '';
			}

			if ($vars_email{email_format} ne 'ascii') {
				$message = ConvertReturns($message_ascii);
				&RequireVars("$vars_config{VariablesPath}/vars_wordlets_email.cgi");
				my $html_body = qq!<font face="$vars_style{FontFace}" size="$vars_style{TextSize}">! . "$vars_wordlets_email{mod_notify_post_html}" . qq!</font>!;
				$html_message = "$EmailHeader $html_body $Footer";
			} else {
				$html_message = '';
			}

			&RequireCode("$vars_config{CGIPath}/ubb_lib_mail.cgi");
			&ubb_mail("$Moderator", "$vars_display{BBEmail}", "$vars_display{BBEmail}", "", "$vars_wordlets_email{mod_notify_subject} : $this_forum[1]", "$email_message", "$html_message", "");
		}

	}    #end mod notify block

	# notify topic starter?
	my $lc_topic_starter = lc($stat_line[3]);

	if (($stat_line[1] =~ /N/i) && ($vars_email{UseEmail} eq 'ON') && ($lc_un ne "$lc_topic_starter")) {

		&RequireCode("$vars_config{CGIPath}/ubb_lib_mail.cgi");

		# get topic writer email:
		chomp($stat_line[9]);
		if ($stat_line[9] ne '') {
			@get_profile = &OpenProfile($stat_line[9]);
		} else {
			$get_un      = &GetUserNumber($stat_line[3]);
			@get_profile = &OpenProfile($get_un);
		}

		$notify_email = $get_profile[2];
		chomp($notify_email);

		if ($vars_email{email_format} ne 'html') {
			&RequireVars("$vars_config{VariablesPath}/vars_wordlets_email.cgi");
			$email_message = qq!$vars_wordlets_email{topic_notify}!;
		} else {
			$email_message = '';
		}

		if ($vars_email{email_format} ne 'ascii') {
			$message = &ConvertReturns($message_ascii);
			&RequireVars("$vars_config{VariablesPath}/vars_wordlets_email.cgi");
			my $html_body = qq!<font face="$vars_style{FontFace}" size="$vars_style{TextSize}">! . "$vars_wordlets_email{topic_notify_html}" . qq!</font>!;
			$html_message = "$EmailHeader $html_body $Footer";
		} else {
			$html_message = '';
		}

		&ubb_mail("$notify_email", "$vars_display{BBEmail}", "$vars_display{BBEmail}", "", "$vars_wordlets_email{topic_notify_subject}", "$email_message", "$html_message", "");

	}    #end topic starter notify block

	# clear cache- we have new data!
	&ClearSummaryCache;
	&ClearSingleForumPageCache($exact_path, $in{f});

}    # end submit new reply


# DANGER: Do not remove the next line!
1;