#!/usr/bin/perl --
# $Id: YaBB Main$
# $HeadURL: YaBB $
#
# $Source: /index.pl $
###############################################################################
# index.pl #
# $Date: 26.7.26 $ #
###############################################################################
# YaBBForum: Yet another Bulletin Board #
# Open-Source Community Software for Webmasters #
# Version: YaBBForum 3.0 #
# Packaged: July 26, 2026 #
# Distributed by: https://yabbforum.nz #
# =========================================================================== #
# Copyright (c) 2000-2026 YaBBForum (yabbforum.nz) - All Rights Reserved. #
# Software by: The YaBBForum Development Team #
# with assistance from the YaBBForum community. #
###############################################################################
#use strict;
no warnings qw(uninitialized once redefine);
use CGI::Carp qw(fatalsToBrowser);
use English qw(-no_match_vars);
our $VERSION = '3.0';
### Version Info ###
$YaBBversion = 'YaBBForum 3.0';
$yabbplver = 'YaBBForum 3.0';
if ( $action eq 'detailedversion' ) { return 1; }
BEGIN {
$script_root = $ENV{'SCRIPT_FILENAME'};
if ( !$script_root ) {
$script_root = $ENV{'PATH_TRANSLATED'};
}
$yyexec = 'index';
$script_root =~ s/\/$yyexec\.(pl|cgi)//igxsm;
push @INC, $script_root;
# Make sure the module path is present
require Paths;
push @INC, "$boarddir/Modules";
if ( $ENV{'SERVER_SOFTWARE'} =~ /IIS/sm ) {
$yyIIS = 1;
if ( $PROGRAM_NAME =~ m{(.*)(\\|/)}xsm ) {
$yypath = $1;
}
$yypath =~ s/\\/\//gxsm;
chdir $yypath;
push @INC, $yypath;
}
require Variables::Settings;
# Check for Time::HiRes if debugmodus is on
if ($debug) {
eval { require Time::HiRes; import Time::HiRes qw(time); };
}
$START_TIME = time;
require "$boarddir/Sources/Subs.pm";
require Sources::System;
require Sources::DateTime;
require Sources::Load;
require Sources::Guardian;
get_forum_master();
} # END of BEGIN block
# If enabled: check if hard drive has enough space to safely operate the board
if ($checkspace) {
require Sources::Freespace;
$hostchecked = freespace();
}
# Auto Maintenance Hook
if ( !$maintenance && -e "$vardir/maintenance.lock" ) { $maintenance = 2; }
LoadCookie(); # Load the user's cookie (or set to guest)
LoadUserSettings(); # Load user settings
WhatTemplate(); # Figure out which template to be using.
WhatLanguage(); # Figure out which language file we should be using! :D
# Do this now that language is available
$yyfreespace =
$hostchecked < 0
? $error_txt{'module_missing'}
: (
(
$yyfreespace && ( ( $debug == 1 && !$iamguest )
|| ( $debug == 2 && $iamgmod )
|| $iamadmin )
)
? q~
~
. (
$hostchecked > 0 ? $maintxt{'freeuserspace'} : $maintxt{'freediskspace'}
)
. qq~ $yyfreespace
~
: q{}
);
if ( -e "$vardir/gmodsettings.txt" && $iamgmod ) {
require "$vardir/gmodsettings.txt";
}
if ( !$masterkey ) {
if (
$iamadmin
|| ( $iamgmod
&& $allow_gmod_admin eq 'on'
&& $gmod_access{'newsettings;page=security'} eq 'on' )
)
{
$yyadmin_alert = $reg_txt{'no_masterkey'};
}
$masterkey = $mbname;
}
$formsession = cloak("$mbname$username");
# check for valid form sessionid in any POST request
if ( $ENV{REQUEST_METHOD} =~ /post/ism ) {
if ( $CGI_query && $CGI_query->cgi_error() ) {
fatal_error( 'denial_of_service', $CGI_query->cgi_error() );
}
if ( decloak( $FORM{'formsession'} ) ne "$mbname$username" ) {
if ( $action eq 'login2' && $username ne 'Guest' ) {
fatal_error( 'logged_in_already', $username );
}
fatal_error( 'form_spoofing', $user_ip );
}
}
if ( $is_perm && $accept_permalink ) {
if ( $permtopicfound == 0 ) {
fatal_error( 'no_topic_found',
"$permtitle|C:$permachecktime|T:$threadpermatime" );
}
if ( $permboardfound == 0 ) {
fatal_error( 'no_board_found',
"$permboard|C:$permachecktime|T:$threadpermatime" );
}
}
guard();
# Check if the action is allowed from an external domain
if ($referersecurity) { referer_check(); }
if ( $regtype == 1 || $regtype == 2 ) {
$inactive = -s "$memberdir/memberlist.inactive";
$approve = -s "$memberdir/memberlist.approve";
if ( $inactive > 2 ) {
RegApprovalCheck();
activation_check();
}
elsif ( $approve > 2 ) {
RegApprovalCheck();
}
}
require Sources::Security;
banning(); # Check for banned people
LoadIMs(); # Load IM's
WriteLog(); # write into the logfile
SearchAccess();
local $SIG{__WARN__} = sub { fatal_error( 'error_occurred', "@_" ); };
eval { yymain(); };
if ($@) { fatal_error( 'untrapped', ":
$@" ); }
sub yymain {
# Choose what to do based on the form action
if ($maintenance) {
#admin login issues with sessions and maintenance mode fix.
if ( $staff && $sessionvalid == 0 ) {
UpdateCookie('delete');
require Sources::LogInOut;
InMaintenance();
}
if ( $action eq 'login2' ) {
require Sources::LogInOut;
Login2();
}
if ( !$iamadmin ) { require Sources::LogInOut; InMaintenance(); }
}
# Guest can do the very few following actions
if ( $iamguest
&& !$guestaccess
&& $action !~
/^(login|register|reminder|validate|activate|resetpass|guestpm|checkavail|$randaction)2?$/xsm
)
{
KickGuest();
}
if ( $action ne q{} ) {
if ( $action eq $randaction ) {
require Sources::Decoder;
convert();
}
else {
require Sources::SubList;
if ( $director{$action} ) {
my @act = split /&/xsm, $director{$action};
require "$sourcedir/$act[0]";
&{ $act[1] };
}
else {
require Sources::BoardIndex;
BoardIndex();
}
}
}
elsif ( $INFO{'num'} ne q{} ) {
require Sources::Display;
Display();
}
elsif ( $currentboard eq q{} ) {
require Sources::BoardIndex;
BoardIndex();
}
else {
require Sources::MessageIndex;
MessageIndex();
}
return;
}
1;