Пример #1
0
 /**
  * Hent ut data fra RSS
  */
 public static function get_changes()
 {
     global $_base;
     $url = self::$url;
     // hent xml
     $data = @file_get_contents($url);
     if (!$data) {
         return false;
     }
     // les xml
     try {
         $xml = new SimpleXMLElement($data);
     } catch (Exception $e) {
         sysreport::exception($e);
         return false;
     }
     // hent ut det vi skal ha
     $result = array();
     foreach ($xml->channel->item as $item) {
         $time = $_base->date->parse($item->pubDate)->format("U");
         #$author = isset($item->author) ? (string)$item->author : '';
         $result[] = array("title" => (string) $item->title, "time" => $time, "link" => (string) $item->link, "description" => (string) $item->description, "category" => (string) $item->category);
     }
     return $result;
 }
Пример #2
0
 /**
  * Senk telleren for en oppgave
  * @param string $name
  * @param integer $count
  */
 public static function mark($name, $count = 1)
 {
     global $_base;
     $count = max(1, (int) $count);
     // forsøk å senke telleren
     $a = \Kofradia\DB::get()->exec("UPDATE tasks SET t_ant = t_ant - 1 WHERE t_name = " . \Kofradia\DB::quote($name));
     if ($a == 0) {
         sysreport::log("Fant ikke oppgaven {$name}", "tasks::mark()");
         return false;
     }
     // oppdater cache
     self::load(true);
     return true;
 }
Пример #3
0
 /** Les/parse XML-data */
 protected function read_xml($xml_data)
 {
     // har ikke noe data?
     if ($xml_data == "") {
         $this->xml = false;
         return false;
     }
     // forsøk å les XML data
     try {
         return @new SimpleXMLElement($xml_data);
     } catch (Exception $e) {
         // feilet
         sysreport::exception_caught($e);
         $this->xml = false;
     }
     return false;
 }
Пример #4
0
 /** Slette revisjonen */
 public function delete()
 {
     global $_base;
     // fjern filen
     if (!@unlink($this->get_path())) {
         sysreport::log("Kunne ikke slette " . $this->get_path() . ".", "Kofradia: crewfiles_revision->delete() err");
     }
     // er dette en aktiv revisjon?
     if ($this->get_file()->info['cff_cfr_id'] == $this->id) {
         // fjern som aktiv revisjon
         \Kofradia\DB::get()->exec("UPDATE crewfiles_files SET cff_cfr_id = NULL WHERE cff_id = {$this->info['cfr_cff_id']} AND cff_cfr_id = {$this->id}");
     }
     // slett fra databasen
     \Kofradia\DB::get()->exec("DELETE FROM crewfiles_revisions WHERE cfr_id = {$this->id}");
 }
Пример #5
0
 function check_timers()
 {
     global $_base;
     // kjøre timer?
     $time = microtime(true);
     if ($time > $this->next) {
         $this->debug(NULL, "Timertest..");
         $next = array();
         // sjekk hvilke timere som har delayed
         foreach ($this->timers as $id => $timer) {
             if ($time > $timer[2]) {
                 $this->timers[$id][2] = $time + $timer[1];
                 $this->debug(NULL, "Timer: {$timer[0]}");
                 // kjør timer
                 switch ($timer[0]) {
                     case "STATUS":
                         // har vi en aktiv kobling?
                         if (!$this->connected) {
                             $this->timers[$id][2] = $time + 0.5;
                         } else {
                             // hent antall pålogget
                             $time = 300;
                             $last = time() - $time;
                             $result = \Kofradia\DB::get()->query("SELECT COUNT(up_id) FROM users_players WHERE up_last_online >= {$last}");
                             $ant = game::format_number($result->fetchColumn(0));
                             unset($result);
                             $time = game::timespan($time, game::TIME_FULL | game::TIME_NOBOLD);
                             $this->msg($this->connected_cid, "#kofradia", "%c3php-cron: %bAntall pålogget siste {$time}%b: %u{$ant}%u");
                         }
                         break;
                     case "SOCKET_STATUS":
                         // skal vi koble til eller fra?
                         if ($this->connect) {
                             // sjekk hvilke tilkoblinger som ikke er koblet til
                             foreach (array_keys($this->clients) as $cid) {
                                 if (!isset($this->sockets[$cid])) {
                                     // ikke tilkoblet - forsøk å koble til
                                     $this->connect($cid);
                                     break;
                                 }
                             }
                         } else {
                             foreach (array_keys($this->sockets) as $cid) {
                                 // koble fra
                                 $this->disconnect($cid);
                                 break;
                             }
                         }
                         break;
                     case "CHECKLOG":
                         // ignorere?
                         if (!$this->connected) {
                             break;
                         }
                         $limit = $this->loglimit;
                         // hent meldinger
                         $network = $this->settings['name'] == "SMAFIA_BETA" ? '' : " AND li_network = " . \Kofradia\DB::quote($this->settings['name']);
                         try {
                             $result = \Kofradia\DB::get()->query("SELECT li_network, li_channel, li_time, li_message FROM log_irc WHERE 1{$network} ORDER BY li_time LIMIT {$limit}");
                         } catch (Exception $e) {
                             $this->debug(NULL, "Query failed: " . $e->getMessage() . "\n");
                             break;
                         }
                         if (!$result) {
                             // feilet
                             break;
                         }
                         if (($num = $result->rowCount()) == 0) {
                             // ingen rader
                             break;
                         }
                         // gå gjennom hver melding og legg til der dem skal
                         while ($row = $result->fetch()) {
                             $delay = time() - $row['li_time'];
                             $delay = $delay > 1 ? ' %c3(logdelay: ' . game::timespan($delay, game::TIME_NOBOLD) . ')' : '';
                             $prefix = $this->settings['name'] == "QuakeNet" || $this->settings['name'] == "SMAFIA" && $row['li_channel'] == "#opers" ? '%c3' : '';
                             if ($this->settings['name'] == "SMAFIA_BETA") {
                                 if ($row['li_network'] == "QuakeNet") {
                                     $row['li_channel'] = "#opers";
                                     $prefix = "BETAQ -%c3 ";
                                 } elseif ($row['li_channel'] == "#opers") {
                                     $prefix = "BETA -%c3 ";
                                 } elseif ($row['li_channel'] == "#SMAbuse") {
                                     $prefix = "BETA - ";
                                 } elseif ($row['li_channel'] != "#SMDF") {
                                     $row['li_channel'] = "#SMBeta";
                                 }
                             }
                             $this->msg($this->connected_cid, $row['li_channel'], "{$prefix}{$row['li_message']}{$delay}");
                         }
                         unset($result);
                         // slett meldingene
                         $limit = min($limit, $num);
                         #\Kofradia\DB::get()->exec("UPDATE log_irc SET li_deleted = 1, li_deleted_time = ".time()." WHERE li_network = ".\Kofradia\DB::quote($this->settings['name'])." AND li_deleted = 0 ORDER BY li_time LIMIT $limit");
                         // forsøk å slette meldingene 3 ganger
                         for ($i = 0; $i < 3; $i++) {
                             $val = $i == 2;
                             try {
                                 if (\Kofradia\DB::get()->exec("DELETE FROM log_irc WHERE 1{$network} ORDER BY li_time LIMIT {$limit}", $val)) {
                                     break;
                                 }
                             } catch (Exception $e) {
                                 sysreport::log("Feil ved sletting av log_irc rader: " . \Kofradia\DB::get()->errorInfo()[2]);
                             }
                         }
                         break;
                     default:
                         $this->debug(NULL, "Unknown timer handler: {$timer[0]}");
                 }
             }
             $next[] = $this->timers[$id][2];
         }
         $this->next = min($next);
     }
 }
Пример #6
0
<?php

/*
 * Dette scriptet setter ned wanted nivået til en spiller
 */
$i = 0;
while (true) {
    // for mange feil?
    if (++$i > 2) {
        sysreport::log("For mange feilforsøk. Kunne ikke fullføre schedule fengsel.", "Scheduler: Fengsel feilet");
        break;
    }
    try {
        // sett ned wanted level med 15 %
        \Kofradia\DB::get()->exec("UPDATE users_players SET up_wanted_level = IF(up_wanted_level <= 3, 0, LEAST(1000, up_wanted_level * 0.85)) WHERE up_wanted_level != 0");
        break;
    } catch (SQLQueryException $e) {
        sysreport::exception_caught($e, "Scheduler: Fengsel");
    }
}
Пример #7
0
    case "signature":
        // kontroller lås
        ajax::validate_lock(true);
        $result = rapportering::report_signature($ref, $note);
        // brukeren finnes ikke
        if ($result === "player_not_found") {
            ajax::html("<p>Spilleren du ønsket å rapportere ble ikke funnet.</p>", ajax::TYPE_INVALID);
        } elseif ($result[0] === "dupe") {
            ajax::html("<p>Du har allerede rapportert signaturen til denne brukeren.</p>", ajax::TYPE_INVALID);
        }
        break;
        // profiltekst
    // profiltekst
    case "profile":
        // kontroller lås
        ajax::validate_lock(true);
        $result = rapportering::report_profile($ref, $note);
        // brukeren finnes kke
        if ($result === "player_not_found") {
            ajax::html("<p>Spilleren du ønsket å rapportere ble ikke funnet.</p>", ajax::TYPE_INVALID);
        } elseif ($result[0] === "dupe") {
            ajax::html("<p>Du har allerede rapportert profilen til denne brukeren.</p>", ajax::TYPE_INVALID);
        }
        break;
        // fant ikke ønsket rapporteringsvalg
    // fant ikke ønsket rapporteringsvalg
    default:
        ajax::html("<p>Ukjent rapportering.</p>", ajax::TYPE_INVALID);
        sysreport::log("Rapportering ble ikke funnet: {$_POST['type']}\n\nReferanse: {$_POST['ref']}\n\nBegrunnelse for rapportering: {$_POST['note']}");
}
ajax::html('<p>Rapporteringen ble sendt inn og vil bli behandlet så fort som mulig.</p><p>Du vil normalt <b>ikke få svar</b> når saken er behandlet. Takk for din rapportering.</p><div class="p" style="border: 1px dotted #525252; padding: 5px; margin: 1em 1.5em">' . parse_html(game::bb_to_html($note)) . '</div>');
Пример #8
0
    /**
     * Crewside
     */
    protected static function page_crew()
    {
        global $__server, $_lang;
        ess::$b->page->add_title("Crew");
        $subpage2 = getval("b");
        redirect::store(page_min_side::addr(NULL, $subpage2 != "" ? "b=" . $subpage2 : ''));
        ess::$b->page->add_css('
.minside_crew_links .active { color: #CCFF00 }');
        $links = array();
        $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "", "player")) . '">Min spiller</a>';
        $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "")) . '"' . ($subpage2 == "" ? ' class="active"' : '') . '>Oversikt / logg</a>';
        if (access::has("forum_mod")) {
            $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=addlog")) . '"' . ($subpage2 == "addlog" ? ' class="active"' : '') . '>Nytt notat</a>';
        }
        $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=blokk")) . '"' . ($subpage2 == "blokk" ? ' class="active"' : '') . '>Blokkeringer</a>';
        if (access::has("mod")) {
            $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=banka")) . '"' . ($subpage2 == "banka" ? ' class="active"' : '') . '>Bankpassord</a>';
        }
        if (access::has("mod")) {
            $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=birth")) . '"' . ($subpage2 == "birth" ? ' class="active"' : '') . '>Fødselsdato</a>';
        }
        if (access::has("mod")) {
            $links[] = '<a href="' . htmlspecialchars(page_min_side::addr("set", "b=pass")) . '">Passord</a>';
        }
        if (access::has("admin")) {
            $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=level")) . '"' . ($subpage2 == "level" ? ' class="active"' : '') . '>Tilgangsnivå</a>';
        }
        $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=send_email")) . '"' . ($subpage2 == "send_email" ? ' class="active"' : '') . '>Send e-post</a>';
        $links[] = '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=warning")) . '"' . ($subpage2 == "warning" ? ' class="active"' : '') . '>Gi advarsel</a>';
        echo '
	<p class="c minside_crew_links">' . implode(" | ", $links) . '</p>';
        if ($subpage2 == "") {
            // javascript for rapporteringer
            ess::$b->page->add_js_domready('
	var w = $("minside_reports");
	var xhr = new Request({
		url: relative_path + "/ajax/minside_report",
		data: { u_id: ' . page_min_side::$active_user->id . ' },
		evalScripts: function(script)
		{
			ajax.js += script;
		}
	});
	xhr.addEvent("success", function(text)
	{
		w.set("html", text);
		w.getElements(".pagenumbers").each(function(elm)
		{
			elm.addEvent("set_page", function(s) { load(null, s, true); });
		});
		ajax.refresh();
	});
	xhr.addEvent("failure", function(x)
	{
		var p = new Element("p", {html: "Feil: " + x}).inject(w.empty());
	});
	function load(a, s, goto)
	{
		if (a !== null) xhr.options.data.a = a;
		if (s) xhr.options.data.s = s;
		if (goto) w.getParent().goto(-10);
		w.set("html", "<p>Laster inn data..</p>");
		xhr.send();
	}
	$("minside_reports_from").addEvent("click", function() { load("from", 1, true); });
	$("minside_reports_to").addEvent("click", function() { load("to", 1, true); });
	$("minside_reports_all").addEvent("click", function() { load("", 1, true); });
	load();');
            // css for rapporteringer
            ess::$b->page->add_css('
.rap_wrap {
	margin: 1em 0;
	background-color: #222222;
	position: relative;
	overflow: auto;
}
.rap_time {
	position: absolute;
	top: 8px;
	right: 5px;
	margin: 0;
	color: #777777;
}
.rap_time span {
	color: #EEEEEE;
}
.rap_w {
	margin: 0;
	padding: 5px;
	background-color: #282828;
}
.rap_u {
	font-size: 14px;
}

.rap_wrap .col2_w { margin: 0 }
.rap_wrap .col_w.left { width: 40% }
.rap_wrap .col_w.right { width: 60% }
.rap_wrap .col_w.left .col { margin: 0 0 0 5px }
.rap_wrap .col_w.right .col { margin: 5px 5px 5px 0 }

.rap_note {
	background-color: #1C1C1C;
	padding: 5px !important;
	overflow: auto;
	border: 1px dotted #525252
}
');
            // faner
            ess::$b->page->add_js_domready('
	$$(".minside_fane_link").addEvent("click", function(elm)
	{
		$$(".minside_fane").setStyle("display", "none");
		$$(".minside_fane_link").removeClass("minside_fane_active");
		this.addClass("minside_fane_active");
		$(this.get("rel")).setStyle("display", "");
	});
	$$(".minside_fane_active").fireEvent("click");');
            ess::$b->page->add_css('
.minside_fane_active, .minside_fane_active:hover {
	color: #CCFF00;
}');
            echo '
	<div class="col2_w">
		<div class="col_w left">
			<div class="col">
				<div class="bg1_c">
					<h1 class="bg1">Oversikt<span class="left2"></span><span class="right2"></span></h1>
					<div class="bg1">';
            // hent blokkeringer for brukeren
            $result = \Kofradia\DB::get()->query("SELECT ub_id, ub_type, ub_time_expire, ub_reason FROM users_ban WHERE ub_u_id = " . page_min_side::$active_user->id . " AND ub_time_expire > " . time());
            if ($result->rowCount() > 0) {
                while ($row = $result->fetch()) {
                    $access = access::has(blokkeringer::$types[$row['ub_type']]['access']);
                    echo '
						<p>Blokkert: ' . ($access ? '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=blokk&t={$row['ub_type']}")) . '">' : '') . htmlspecialchars(blokkeringer::$types[$row['ub_type']]['title']) . ($access ? '</a>' : '') . ' (til ' . ess::$b->date->get($row['ub_time_expire'])->format(date::FORMAT_SEC) . ', ' . game::counter($row['ub_time_expire'] - time()) . ')</p>';
                }
            }
            echo '
						<p>Trykk deg inn på de forskjellige spillerene til brukeren for å se informasjon knyttet opp mot dem.</p>
					</div>
				</div>
			</div>
		</div>
		<div class="col_w right">
			<div class="col">
				<div class="bg1_c">
					<h1 class="bg1">Crewnotat for brukeren<span class="left2"></span><span class="right2"></span></h1>
					<p class="h_right"><a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=enote")) . '">rediger</a></p>
					<div class="bg1">
						<p>Her kan hvem som helst i crewet legge til eller endre et notat for denne brukeren for å memorere ting som har med <u>brukeren</u> å gjøre.</p>' . (empty(page_min_side::$active_user->data['u_note_crew']) ? '
						<p>Ingen notat er registrert.</p>' : '
						<div class="p">' . game::bb_to_html(page_min_side::$active_user->data['u_note_crew']) . '</div>') . '
					</div>
				</div>
			</div>
		</div>
	</div>
	<p class="c"><a class="minside_fane_link minside_fane_active" rel="minside_fane2">Loggoppføringer</a> | <a class="minside_fane_link" rel="minside_fane1">Rapporteringer</a></p>
	<div id="minside_fane1" class="minside_fane">
		<p class="c">Filter: <a id="minside_reports_from">Brukerens egne rapporteringer</a> | <a id="minside_reports_to">Andres rapporteringer</a> | <a id="minside_reports_all">Alle</a></p>
		<div id="minside_reports">
			<p>Laster inn..</p>
		</div>
	</div>
	<div id="minside_fane2" class="minside_fane">
	<p class="c">Loggoppføringer for denne brukeren</p>';
            // hent loggene for denne brukeren
            $pagei = new pagei(pagei::ACTIVE_GET, "side", pagei::PER_PAGE, 50);
            $result = $pagei->query("SELECT lc_id, lc_up_id, lc_time, lc_lca_id, lc_a_up_id, lc_log FROM log_crew JOIN users_players ON up_u_id = " . page_min_side::$active_user->id . " WHERE lc_a_up_id = up_id ORDER BY lc_time DESC");
            // ingen handlinger?
            if ($result->rowCount() == 0) {
                echo '
	<p class="c">Ingen oppføringer eksisterer.</p>';
            } else {
                $rows = array();
                while ($row = $result->fetch()) {
                    $rows[$row['lc_id']] = $row;
                }
                $data = crewlog::load_summary_data($rows);
                $logs = array();
                foreach ($data as $row) {
                    // hent sammendrag
                    $summary = crewlog::make_summary($row, NULL, $row['lc_a_up_id'] != page_min_side::$active_player->id);
                    $day = ess::$b->date->get($row['lc_time'])->format(date::FORMAT_NOTIME);
                    $logs[$day][] = '<p><span class="time">' . ess::$b->date->get($row['lc_time'])->format("H:i") . ':</span> ' . $summary . '</p>';
                }
                ess::$b->page->add_css('.crewlog .time { color: #888888; padding-right: 5px }');
                foreach ($logs as $day => $items) {
                    echo '
	<div class="bg1_c">
		<h1 class="bg1">' . $day . '<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1 crewlog">
			' . implode('
			', $items) . '
		</div>
	</div>';
                }
                echo '
	<p class="c">' . $pagei->pagenumbers() . '</p>';
            }
            echo '
	</div>';
        } elseif ($subpage2 == "addlog" && access::has("forum_mod")) {
            // legge til?
            if (isset($_POST['notat'])) {
                $notat = trim(postval("notat"));
                $notat_bb = trim(game::bb_to_html($notat));
                if (empty($notat_bb)) {
                    ess::$b->page->add_message("Notatet kan ikke være tomt.", "error");
                } else {
                    // legg til i crewloggen
                    crewlog::log("user_add_note", page_min_side::$active_player->id, $notat);
                    ess::$b->page->add_message("Notatet ble registrert.");
                    redirect::handle(page_min_side::addr());
                }
            }
            ess::$b->page->add_title("Nytt notat");
            ess::$b->page->add_js_domready('$("notat_felt").focus();');
            echo '
	<div class="bg1_c">
		<h1 class="bg1">Legg til notat i crewloggen<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<p>Notat: (Vil bli lagt til som vanlig logg i <a href="' . htmlspecialchars(page_min_side::addr(NULL)) . '">Crewloggen</a>.)</p>
			<form action="" method="post">
				<p><textarea name="notat" id="notat_felt" rows="10" cols="30" style="width: 98%; overflow: auto">' . htmlspecialchars(postval("notat")) . '</textarea></p>
				<p>' . show_sbutton("Legg til notat") . '</p>
			</form>
		</div>
	</div>';
        } elseif ($subpage2 == "blokk") {
            ess::$b->page->add_title("Blokkeringer");
            $type = false;
            if (isset($_GET['t'])) {
                // kontroller type
                $type_id = intval($_GET['t']);
                // fant ikke?
                if (!isset(blokkeringer::$types[$type_id])) {
                    ess::$b->page->add_message("Ugyldig type '.{$type_id}.'.", "error");
                } else {
                    $type = blokkeringer::$types[$type_id];
                    // har vi tilgang til å gjøre noe med denne blokkeringen?
                    if (!access::has($type['access'])) {
                        ess::$b->page->add_message('Du har ikke tilgang til denne typen blokkering. (' . htmlspecialchars($type['title']) . ')', "error");
                        $type = false;
                    }
                }
            }
            // vise en type blokkering?
            if ($type) {
                redirect::store(page_min_side::addr(NULL, "b=blokk&t={$type_id}"));
                // sjekk om det er en aktiv blokkering for denne typen
                $active = blokkeringer::check($type_id, page_min_side::$active_user->id);
                if ($active) {
                    // hent informasjon om blokkeringen
                    $info = blokkeringer::get_info($active['ub_id']);
                }
                // handling: legg til blokkering
                if (isset($_POST['add']) && $active) {
                    ess::$b->page->add_message("Det er allerede en blokkering på brukeren som varer til " . ess::$b->date->get($active['ub_time_expire'])->format() . ".", "error");
                } elseif (isset($_POST['add'])) {
                    // kontroller verdier
                    $date_type = isset($_POST['date_type']) && $_POST['date_type'] == "abs" ? "abs" : "rel";
                    $rel_weeks = intval(postval("rel_weeks"));
                    $rel_days = intval(postval("rel_days"));
                    $rel_hours = intval(postval("rel_hours"));
                    $rel_mins = intval(postval("rel_mins"));
                    $abs_date = postval("abs_date");
                    $abs_time = postval("abs_time");
                    // sjekk type og verdiene
                    $expire = false;
                    // bestemt dato/tidspunkt
                    if ($date_type == "abs") {
                        // kontroller datoen
                        if (!($abs_date_m = check_date($abs_date, "%y-%m-%d"))) {
                            ess::$b->page->add_message('Datoen du skrev inn er ikke gyldig.', "error");
                        } elseif (!($abs_time_m = check_date($abs_time, "%h:%i:%s"))) {
                            ess::$b->page->add_message('Tidspunktet du skrev inn er ikke gyldig.', "error");
                        } else {
                            // ok
                            $date = ess::$b->date->get();
                            $date->setTime($abs_time_m[1], $abs_time_m[2], $abs_time_m[3]);
                            $date->setDate($abs_date_m[1], $abs_date_m[2], $abs_date_m[3]);
                            $expire = $date->format("U");
                        }
                    } else {
                        // sjekk uker
                        if ($rel_weeks < 0 || $rel_weeks > 9) {
                            ess::$b->page->add_message('Antall uker kan ikke være under 0 eller over 9.', "error");
                        } elseif ($rel_days < 0 || $rel_days > 6) {
                            ess::$b->page->add_message('Antall dager kan ikke være under 0 eller over 6.', "error");
                        } elseif ($rel_hours < 0 || $rel_hours > 23) {
                            ess::$b->page->add_message('Antall timer kan ikke være under 0 eller over 23.', "error");
                        } elseif ($rel_mins < 0 || $rel_mins > 59) {
                            ess::$b->page->add_message('Antall minutter kan ikke være under 0 eller over 59.', "error");
                        } else {
                            // ok
                            $expire = time() + $rel_weeks * 604800 + $rel_days * 86400 + $rel_hours * 3600 + $rel_mins * 60;
                        }
                    }
                    // sjekke videre?
                    if ($expire) {
                        // sjekk at datoen er minst 1 min fremover i tid
                        if ($expire < time() + 60) {
                            ess::$b->page->add_message('Du kan ikke legge til en blokkering for mindre enn 1 minutt.', "error");
                        } else {
                            // kontroller begrunnelse og intern informasjon
                            $log = trim(postval("log"));
                            $note = trim(postval("note"));
                            // mangler begrunnelse?
                            if ($log == "") {
                                ess::$b->page->add_message('Mangler begrunnelse.', "error");
                            } elseif ($note == "") {
                                ess::$b->page->add_message("Mangler intern informasjon", "error");
                            } else {
                                // forsøk å legg til blokkeringen
                                $add = blokkeringer::add(page_min_side::$active_user->id, $type_id, $expire, $log, $note);
                                if ($add !== true) {
                                    ess::$b->page->add_message("Det er allerede en blokkering på brukeren som varer til " . ess::$b->date->get($add['ub_time_expire'])->format() . ".", "error");
                                } else {
                                    // legg til crewlogg
                                    crewlog::log("user_ban_active", page_min_side::$active_player->id, $log, array("type" => $type_id, "time_end" => $expire, "note" => $note));
                                    ess::$b->page->add_message('Brukeren er nå blokkert til ' . ess::$b->date->get($expire)->format() . '. (' . htmlspecialchars($type['title']) . ')');
                                    redirect::handle();
                                }
                            }
                        }
                    }
                } elseif (isset($_POST['edit']) && !$active) {
                    // ingen blokkering å redigere?
                    ess::$b->page->add_message("Brukeren har ikke lengre denne blokkeringen.", "error");
                } elseif (isset($_POST['edit'])) {
                    // godkjent handling?
                    if (isset($_POST['log_change'])) {
                        // kontroller verdier
                        $date = postval("date");
                        $time = postval("time");
                        // kontroller datoen
                        if (!($date_m = check_date($date, "%y-%m-%d"))) {
                            ess::$b->page->add_message('Datoen du skrev inn er ikke gyldig.', "error");
                        } elseif (!($time_m = check_date($time, "%h:%i:%s"))) {
                            ess::$b->page->add_message('Tidspunktet du skrev inn er ikke gyldig.', "error");
                        } else {
                            $date = ess::$b->date->get();
                            $date->setTime($time_m[1], $time_m[2], $time_m[3]);
                            $date->setDate($date_m[1], $date_m[2], $date_m[3]);
                            $expire = $date->format("U");
                            // sjekk at datoen er minst 1 min fremover i tid
                            if ($expire < time() + 60) {
                                ess::$b->page->add_message('Du kan ikke legge til en blokkering for mindre enn 1 minutt.', "error");
                            } else {
                                // kontroller begrunnelse for utestengelse, begrunnelse for endring og intern informasjon
                                $log_ban = trim(postval("log_ban"));
                                $log_change = trim(postval("log_change"));
                                $note = trim(postval("note"));
                                // mangler begrunnelse for endring?
                                if ($log_change == "") {
                                    ess::$b->page->add_message('Mangler begrunnelse for endring.', "error");
                                } elseif ($log_ban == "") {
                                    ess::$b->page->add_message('Mangler begrunnelse for utestengelse.', "error");
                                } elseif ($note == "") {
                                    ess::$b->page->add_message('Mangler intern informasjon.', "error");
                                } elseif ($expire == $info['ub_time_expire'] && $log_ban == $info['ub_reason'] && $note == $info['ub_note']) {
                                    ess::$b->page->add_message('Ingen endringer ble utført.', "error");
                                } else {
                                    // oppdater blokkeringen
                                    $edit = blokkeringer::edit($active['ub_id'], $expire, $log_ban, $note);
                                    if ($edit == 0) {
                                        ess::$b->page->add_message("Blokkeringen kunne ikke bli oppdatert. Den er mest sannsynlig ikke lengre aktiv.", "error");
                                    } else {
                                        // legg til crewlogg
                                        $data = array("type" => $type_id, "time_end_old" => $info['ub_time_expire'], "log_old" => $info['ub_reason'], "note_old" => $info['ub_note']);
                                        if ($expire != $info['ub_time_expire']) {
                                            $data["time_end_new"] = $expire;
                                        }
                                        if ($log_ban != $info['ub_reason']) {
                                            $data["log_new"] = $log_ban;
                                        }
                                        if ($note != $info['ub_note']) {
                                            $data["note_new"] = $note;
                                        }
                                        crewlog::log("user_ban_change", page_min_side::$active_player->id, $log_change, $data);
                                        ess::$b->page->add_message('Du har oppdatert blokkeringen. Brukeren er nå blokkert til ' . ess::$b->date->get($expire)->format() . '. (' . htmlspecialchars($type['title']) . ')');
                                        redirect::handle();
                                    }
                                }
                            }
                        }
                    }
                } elseif (isset($_POST['delete']) && !$active) {
                    // ingen blokkering å slette?
                    ess::$b->page->add_message("Brukeren har ikke lengre denne blokkeringen.", "error");
                } elseif (isset($_POST['delete'])) {
                    // godkjent handling?
                    if (isset($_POST['log'])) {
                        $log = trim(postval("log"));
                        // mangler logg?
                        if ($log == "") {
                            ess::$b->page->add_message('Mangler begrunnelse.', "error");
                        } else {
                            // fjern blokkeringen
                            $delete = blokkeringer::delete($active['ub_id']);
                            if ($delete == 0) {
                                ess::$b->page->add_message("Blokkeringen kunne ikke bli oppdatert. Den er mest sannsynlig ikke lengre aktiv.", "error");
                            } else {
                                // legg til crewlogg
                                crewlog::log("user_ban_delete", page_min_side::$active_player->id, $log, array("type" => $type_id, "time_end" => $info['ub_time_expire'], "log" => $info['ub_reason'], "note" => $info['ub_note']));
                                ess::$b->page->add_message('Du har fjernet blokkeringen. (' . htmlspecialchars($type['title']) . ')');
                                redirect::handle();
                            }
                        }
                    }
                }
                echo '
	<div class="bg1_c" style="width: 350px">
		<h1 class="bg1">Blokkering: ' . htmlspecialchars($type['title']) . '<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<boxes />
			<p class="r">Tilgangsnivå: ' . access::name($type['access']) . '</p>
			<p><u>Hensikt:</u> ' . $type['description'] . '</p>';
                // blokkert?
                if ($active) {
                    echo '
			<p>Brukeren er blokkert.</p>
			<dl class="dd_right">
				<dt>Lagt til</dt>
				<dd>' . ess::$b->date->get($info['ub_time_added'])->format(date::FORMAT_SEC) . '<br />' . game::timespan($info['ub_time_added'], game::TIME_ABS | game::TIME_ALL, 5) . '</dd>
				<dt>Utestengt til</dt>
				<dd>' . ess::$b->date->get($info['ub_time_expire'])->format(date::FORMAT_SEC) . '<br />' . game::counter($info['ub_time_expire'] - time()) . '</dd>
			</dl>
			<div class="section">
				<h2>Begrunnelse</h2>
				<div class="p">' . (($reason = game::bb_to_html($info['ub_reason'])) == "" ? 'Ikke oppgitt.' : $reason) . '</div>
				<h2>Intern informasjon</h2>
				<div class="p">' . (($note = game::bb_to_html($info['ub_note'])) == "" ? 'Ikke oppgitt.' : $note) . '</div>
			</div>';
                    // handling: redigere blokkering
                    if (isset($_POST['edit'])) {
                        echo '
			<p>Du er i ferd med å endre blokkeringen til brukeren.</p>
			<form action="" method="post">
				<dl class="dd_right dl_2x">
					<dt>Til</dt>
					<dd>
						Dato:
						<input type="text" name="date" id="ban_date" value="' . htmlspecialchars(postval("date", ess::$b->date->get($info['ub_time_expire'])->format("Y-m-d"))) . '" class="styled w80" />
						<input type="text" name="time" id="ban_time" value="' . htmlspecialchars(postval("time", ess::$b->date->get($info['ub_time_expire'])->format("H:i:s"))) . '" class="styled w80" />
					</dd>
					<dt>Begrunnelse for endring</dt>
					<dd><textarea name="log_change" cols="30" rows="5">' . htmlspecialchars(postval("log_change")) . '</textarea></dd>
					<dt>Begrunnelse for blokkering</dt>
					<dd><textarea name="log_ban" cols="30" rows="5">' . htmlspecialchars(postval("log_ban", $info['ub_reason'])) . '</textarea></dd>
					<dt>Intern informasjon</dt>
					<dd><textarea name="note" cols="30" rows="5">' . htmlspecialchars(postval("note", $info['ub_note'])) . '</textarea></dd>
					<dd>
						' . show_sbutton("Lagre endringer", 'name="edit"') . '
						' . show_sbutton("Avbryt") . '
					</dd>
				</dl>
			</form>';
                    } elseif (isset($_POST['delete'])) {
                        echo '
			<p>Du er i ferd med å fjerne blokkeringen til brukeren.</p>
			<form action="" method="post">
				<dl class="dd_right dl_2x">
					<dt>Begrunnelse for fjerning</dt>
					<dd><textarea name="log" cols="30" rows="5">' . htmlspecialchars(postval("log")) . '</textarea></dd>
					<form action="" method="post">
						<dd>
							' . show_sbutton("Fjern", 'name="delete"') . '
							' . show_sbutton("Avbryt") . '
						</dd>
					</form>
				</dl>
			</form>';
                    } else {
                        echo '
			<form action="" method="post">
				<p>
					' . show_sbutton("Endre", 'name="edit"') . '
					' . show_sbutton("Fjern", 'name="delete"') . '
					<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=blokk")) . '" class="button">Tilbake</a>
				</p>
			</form>';
                    }
                } else {
                    $date_type = isset($_POST['type']) && $_POST['type'] == "abs" ? "abs" : "rel";
                    $hide_rel = $date_type == "rel" ? '' : ' hide';
                    $hide_abs = $date_type == "abs" ? '' : ' hide';
                    echo '
			<p>Brukeren har ingen aktiv blokkering.</p>
			<form action="" method="post">
				<input type="hidden" name="date_type" value="' . $date_type . '" />
				<dl class="dd_right dl_2x">
					<dt class="date_rel' . $hide_rel . '">Varighet (<a href="#" onclick="handleClass(\'.date_abs\', \'.date_rel\', event, this.parentNode.parentNode); $(\'date_type\').value=\'abs\'">velg dato</a>)</dt>
					<dd class="date_rel' . $hide_rel . '">
						<input type="text" name="rel_weeks" class="styled w30 r" style="width: 10px" value="' . intval(postval("rel_weeks")) . '" maxlength="1" /> uker
						<input type="text" name="rel_days" class="styled w30 r" style="width: 10px" value="' . intval(postval("rel_days")) . '" maxlength="1" /> dager
						<input type="text" name="rel_hours" class="styled w30 r" style="width: 17px" value="' . intval(postval("rel_hours")) . '" maxlength="2" /> timer
						<input type="text" name="rel_mins" class="styled w30 r" style="width: 17px" value="' . intval(postval("rel_mins")) . '" maxlength="2" /> minutter
					</dd>
					<dt class="date_abs' . $hide_abs . '">Til (<a href="#" onclick="handleClass(\'.date_rel\', \'.date_abs\', event, this.parentNode.parentNode); $(\'date_type\').value=\'rel\'">velg varighet</a>)</dt>
					<dd class="date_abs' . $hide_abs . '">
						Dato:
						<input type="text" name="abs_date" value="' . htmlspecialchars(postval("abs_date", ess::$b->date->get()->format("Y-m-d"))) . '" class="styled w80" />
						<input type="text" name="abs_time" value="' . htmlspecialchars(postval("abs_time", ess::$b->date->get()->format("H:i:s"))) . '" class="styled w60" />
					</dd>
					<dt>Begrunnelse</dt>
					<dd><textarea name="log" cols="30" rows="5">' . htmlspecialchars(postval("log")) . '</textarea></dd>
					<dt>Intern informasjon</dt>
					<dd><textarea name="note" cols="30" rows="5">' . htmlspecialchars(postval("note")) . '</textarea></dd>
					<dd>
						' . show_sbutton("Legg til blokkering", 'name="add"') . '
						<a href="' . htmlspecialchars(page_min_side::addr(NULL, "a=blokk")) . '" class="button">Tilbake</a>
					</dd>
				</dl>
			</form>';
                }
                echo '
		</div>
	</div>';
            } else {
                // filtrer ut de blokkeringene vi har tilgang til å sette
                $types = blokkeringer::$types;
                $links = array();
                foreach ($types as $id => $type) {
                    if (!access::has($type['access'])) {
                        continue;
                    }
                    $links[$type['title']] = '
				<li><a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=blokk&t={$id}")) . '" title="' . htmlspecialchars($type['description']) . '">' . htmlspecialchars($type['title']) . '</a></li>';
                }
                // sorter
                ksort($links);
                $links = implode('', $links);
                // vis oversikt
                echo '
	<div class="bg1_c" style="width: 350px">
		<h1 class="bg1">Blokkeringer<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<p>Velg type:</p>';
                if ($links == '') {
                    echo '
			<p>Du har ikke tilgang til noen blokkeringstyper.</p>';
                } else {
                    echo '
			<ul>' . $links . '
			</ul>';
                }
                echo '
		</div>
	</div>';
                // hent alle aktive blokkeringer
                $result = \Kofradia\DB::get()->query("SELECT ub_type, ub_time_expire, ub_reason FROM users_ban WHERE ub_u_id = " . page_min_side::$active_user->id . " AND ub_time_expire > " . time() . " ORDER BY ub_time_expire");
                if ($result->rowCount() > 0) {
                    echo '
	<div class="bg1_c" style="width: 350px">
		<h1 class="bg1">Aktive blokkeringer<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<table class="table tablem" style="width: 100%">
				<thead>
					<tr>
						<th>Type</th>
						<th>Dato</th>
						<th>Begrunnelse</th>
					</tr>
				</thead>
				<tbody>';
                    $i = 0;
                    while ($row = $result->fetch()) {
                        $type = blokkeringer::get_type($row['ub_type']);
                        $access = access::has($type['access']);
                        echo '
					<tr' . (++$i % 2 == 0 ? ' class="color"' : '') . '>
						<td>' . ($access ? '<a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=blokk&t={$row['ub_type']}")) . '">' : '') . htmlspecialchars($type['title']) . ($access ? '</a>' : '') . '</td>
						<td>
							' . ess::$b->date->get($row['ub_time_expire'])->format(date::FORMAT_SEC) . '<br />
							(' . game::timespan($row['ub_time_expire'], game::TIME_ABS | game::TIME_ALL, 5) . ')
						</td>
						<td>' . game::format_data($row['ub_reason'], "bb-opt", "Ingen begrunnelse gitt.") . '</td>
					</tr>';
                    }
                    echo '
				</tbody>
			</table>
		</div>
	</div>';
                }
            }
        } elseif ($subpage2 == "send_email") {
            ess::$b->page->add_title("Send e-post");
            // har tekst?
            $show_form = true;
            if (isset($_POST['text']) && !isset($_POST['edit'])) {
                $subject = trim(postval("subject"));
                $text = trim(postval("text"));
                // mangler emne?
                if (empty($subject)) {
                    ess::$b->page->add_message("Du må fylle ut emnefeltet.", "error");
                } elseif (empty($text)) {
                    ess::$b->page->add_message("Du må fylle ut innholdet.", "error");
                } else {
                    $email_subject = $subject;
                    $email_text = $text . "\n\n--\n" . login::$user->player->data['up_name'] . "\nwww.kofradia.no\n\nDenne meldingen ble sendt til " . page_min_side::$active_user->data['u_email'] . " som tilhører " . page_min_side::$active_player->data['up_name'];
                    // godkjent?
                    if (isset($_POST['send'])) {
                        // send e-posten
                        $email = new email();
                        $email->text = $email_text;
                        $email->headers['BCC'] = "*****@*****.**";
                        $email->headers['Reply-To'] = "*****@*****.**";
                        $email->send(page_min_side::$active_user->data['u_email'], $email_subject);
                        // legg til crewlogg
                        crewlog::log("user_send_email", page_min_side::$active_player->id, NULL, array("email" => page_min_side::$active_user->data['u_email'], "email_subject" => $email_subject, "email_content" => $email_text));
                        ess::$b->page->add_message("E-posten ble sendt til " . htmlspecialchars(page_min_side::$active_user->data['u_email']) . ".");
                        redirect::handle(page_min_side::addr(""));
                    }
                    echo '
	<div class="bg1_c" style="width: 400px">
		<h1 class="bg1">Send e-post<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<p><b>Mottaker:</b> ' . htmlspecialchars(page_min_side::$active_user->data['u_email']) . '</p>
			<p><b>Emne:</b> ' . htmlspecialchars($email_subject) . '</p>
			<p style="font-family: monospace">' . nl2br(htmlspecialchars($email_text)) . '</p>
			<form action="" method="post">
				<input type="hidden" id="email_subject" name="subject" value="' . htmlspecialchars($subject) . '" />
				<input type="hidden" id="email_text" name="text" value="' . htmlspecialchars($text) . '" />
				<p>' . show_sbutton("Send e-posten", 'name="send"') . ' ' . show_sbutton("Tilbake / endre", 'name="edit"') . '</p>
			</form>
		</div>
	</div>';
                    $show_form = false;
                }
            }
            if ($show_form) {
                ess::$b->page->add_js_domready('$("email_subject").focus();');
                echo '
	<div class="bg1_c" style="width: 400px">
		<h1 class="bg1">Send e-post<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<boxes />
			<p>Her sender du e-post til brukeren på vegne av Kofradia. Avsender vil være den normale avsendere all e-post fra Kofradia blir sendt fra.</p>
			<form action="" method="post">
				<dl class="dd_right dl_2x">
					<dt>Mottaker</dt>
					<dd>' . htmlspecialchars(page_min_side::$active_user->data['u_email']) . '</dd>
					<dt>Emne</dt>
					<dd><input type="text" value="' . htmlspecialchars(postval("subject")) . '" name="subject" id="email_subject" class="styled w200" /></dd>
					<dt>Innhold</dt>
					<dd><textarea name="text" id="email_text" cols="50" rows="10">' . htmlspecialchars(postval("text", "Hei,\n\n")) . '</textarea></dd>
					<dd>' . show_sbutton("Forhåndsvis / fortsett") . '</dd>
				</dl>
			</form>
		</div>
	</div>';
            }
        } elseif ($subpage2 == "warning") {
            ess::$b->page->add_title("Gi advarsel til brukeren");
            $types = crewlog::$user_warning_types;
            // legge til advarsel?
            if (isset($_POST['log'])) {
                $log = trim(postval("log"));
                $note = trim(postval("note"));
                $type = postval("type");
                $priority = (int) postval("priority");
                $notify = isset($_POST['notify']);
                if (empty($log) || empty($note)) {
                    ess::$b->page->add_message("Både begrunnelse og intern informasjon må fylles ut.", "error");
                } elseif (!isset($types[$type])) {
                    ess::$b->page->add_message("Ugyldig kategori.", "error");
                } elseif ($priority < 1 || $priority > 3) {
                    ess::$b->page->add_message("Ugylig alvorlighet.", "error");
                } else {
                    $data = array("type" => $types[$type], "note" => $note, "priority" => $priority);
                    // legge til spillerlogg?
                    if ($notify) {
                        $data['notified'] = 1;
                        $data['notified_id'] = player::add_log_static(gamelog::$items['advarsel'], urlencode($types[$type]) . ':' . urlencode($log), NULL, page_min_side::$active_player->id);
                        ess::$b->page->add_message("Advarselen ble lagret. Brukeren ble informert.");
                    } else {
                        ess::$b->page->add_message("Advarselen ble lagret. Du har ikke informert brukeren om denne advarselen.");
                    }
                    // legg til advarselen
                    crewlog::log("user_warning", page_min_side::$active_player->id, $log, $data);
                    redirect::handle();
                }
            }
            echo '
	<div class="bg1_c" style="width: 400px">
		<h1 class="bg1">Gi advarsel til brukeren<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<form action="" method="post">
				<boxes />
				<p>Dette kan benyttes som et verktøy for å gi advarsler til brukere. Det kan velges om brukeren skal motta advarselen eller ikke. Hvis man ikke velger å informere brukeren om noe, blir det alikevel søkbart i crewloggen for brukeren.</p>
				<p>Alvorligheten av advarselen blir benyttet for å automatisere en poengsum brukeren får avhengig av antall advarseler. En advarsel med høy alvorlighet varer lenger og teller mer enn en med lav alvorlighet.</p>
				<dl class="dd_right">
					<dt>Kategori</dt>
					<dd>
						<select name="type">';
            $type = isset($_POST['type']) && isset($types[$_POST['type']]) ? intval($_POST['type']) : false;
            if ($type === false) {
                echo '
							<option value="">Velg ..</option>';
            }
            foreach ($types as $key => $row) {
                echo '
							<option value="' . $key . '"' . ($key === $type ? ' selected="selected"' : '') . '>' . htmlspecialchars($row) . '</option>';
            }
            echo '
						</select>
					</dd>
					<dt>Alvorlighet/prioritet</dt>
					<dd>
						<select name="priority">';
            $priority = isset($_POST['priority']) && is_numeric($_POST['priority']) && $_POST['priority'] >= 1 && $_POST['priority'] <= 3 ? $_POST['priority'] : 2;
            echo '
							<option value="1"' . ($priority == 1 ? ' selected="selected"' : '') . '>Lav</option>
							<option value="2"' . ($priority == 2 ? ' selected="selected"' : '') . '>Moderat</option>
							<option value="3"' . ($priority == 3 ? ' selected="selected"' : '') . '>Høy</option>
						</select>
					</dd>
				</dl>
				<p>Begrunnelse:</p>
				<p><textarea name="log" rows="10" cols="30" style="width: 98%">' . htmlspecialchars(postval("log")) . '</textarea></p>
				<p>Intern informasjon:</p>
				<p><textarea name="note" rows="10" cols="30" style="width: 98%">' . htmlspecialchars(postval("note")) . '</textarea></p>
				<p><input type="checkbox" name="notify"' . ($_SERVER['REQUEST_METHOD'] == "POST" && !isset($_POST['notify']) ? '' : ' checked="checked"') . ' id="warning_notify" /><label for="warning_notify"> Gi brukeren informasjon om denne advarselen. Kun kategori og begrunnelse vil bli oppgitt til brukeren som en logg i hendelser.</label></p>
				<p class="c">' . show_sbutton("Lagre") . '</p>
			</form>
		</div>
	</div>';
            // analyser advarsler
            $lca_id = crewlog::$actions['user_warning'][0];
            $pagei = new pagei(pagei::ACTIVE_GET, "side", pagei::PER_PAGE, 15);
            $result = $pagei->query("\n\t\t\t\tSELECT lc_id, lc_up_id, lc_time, lc_log, lcd_data_int\n\t\t\t\tFROM log_crew\n\t\t\t\t\tJOIN users_players ON lc_a_up_id = up_id AND up_u_id = " . page_min_side::$active_user->id . "\n\t\t\t\t\tLEFT JOIN log_crew_data ON lcd_lc_id = lc_id AND lcd_lce_id = 5\n\t\t\t\tWHERE lc_lca_id = {$lca_id} AND (lcd_data_int IS NULL OR lcd_data_int = 0)\n\t\t\t\tORDER BY lc_time DESC");
            $data = array();
            while ($row = $result->fetch()) {
                $data[$row['lc_id']] = $row;
            }
            // sett opp data
            $data = crewlog::load_summary_data($data);
            echo '
	<div class="bg1_c ' . (count($data) == 0 ? 'xsmall' : 'medium') . '">
		<h1 class="bg1">Tidligere advarsler<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">';
            if (count($data) == 0) {
                echo '
			<p>Brukeren har ingen tidligere advarsler.</p>';
            } else {
                ess::$b->page->add_css('
.advarsel { border: 1px solid #292929; margin: 10px 0; padding: 0 10px }');
                foreach ($data as $row) {
                    $priority = $row['data']['priority'] == 1 ? "lav" : ($row['data']['priority'] == 2 ? "moderat" : "høy");
                    echo '
			<div class="advarsel">
				<p><b>' . ess::$b->date->get($row['lc_time'])->format() . '</b>: ' . $row['data']['type'] . ' (alvorlighet: <b>' . $priority . '</b>):</p>
				<ul>
					<li>' . game::format_data($row['lc_log']) . '</li>
					<li>Internt notat: ' . game::format_data($row['data']['note']) . '</li>
				</ul>
				<p>' . (empty($row['data']['notified']) ? 'Ble IKKE varslet.' : 'Ble varslet.') . ' Av <user id="' . $row['lc_up_id'] . '" /></p>
			</div>';
                }
                echo '
			<p class="c">' . $pagei->pagenumbers() . '</p>';
            }
            echo '
		</div>
	</div>';
        } elseif ($subpage2 == "enote") {
            ess::$b->page->add_title("Endre notat for bruker");
            // lagre endringer?
            if (isset($_POST['notat'])) {
                $notat = postval("notat");
                if ($notat == page_min_side::$active_user->data['u_note_crew']) {
                    ess::$b->page->add_message("Ingen endringer ble utført.", "error");
                } else {
                    \Kofradia\DB::get()->exec("UPDATE users SET u_note_crew = " . \Kofradia\DB::quote($notat) . " WHERE u_id = " . page_min_side::$active_user->id);
                    // legg til crewlogg
                    crewlog::log("user_note_crew", page_min_side::$active_player->id, NULL, array("note_old" => page_min_side::$active_user->data['u_note_crew'], "note_diff" => diff::make(page_min_side::$active_user->data['u_note_crew'], $notat)));
                    ess::$b->page->add_message("Notatet ble endret.");
                    redirect::handle();
                }
            }
            echo '
	<div class="bg1_c" style="width: 400px">
		<h1 class="bg1">Endre crewnotat for bruker<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<form action="" method="post">
				<p>Dette endrer notatet som er tilknyttet brukeren. Du kan også tilknytte <a href="' . htmlspecialchars(page_min_side::addr(NULL, "b=enote", "player")) . '">informasjon til spilleren</a>, hvis det heller er ønskelig.</p>
				<p>Notat:</p>
				<p><textarea name="notat" rows="10" cols="30" style="width: 98%">' . htmlspecialchars(page_min_side::$active_user->data['u_note_crew']) . '</textarea></p>
				<p class="c">' . show_sbutton("Lagre") . '</p>
			</form>
		</div>
	</div>';
        } elseif ($subpage2 == "level" && access::has("admin")) {
            // nivåer man kan bytte til
            static $levels = array(1 => "Vanlig bruker", 14 => "Skjult nostat (crewtilgang)", -4 => "Ressurs", 12 => "Ressurs (nostat)", 13 => "Utvikler", 4 => "Forummoderator", 6 => "Forummoderator (nostat)", 5 => "Moderator", 11 => "Seniormoderator");
            if (access::has("sadmin")) {
                $levels[7] = "Administrator";
            }
            if (access::has("sadmin")) {
                $levels[8] = "Superadministrator";
            }
            // kan vi ikke endre brukernivået til denne brukeren?
            if (!isset($levels[page_min_side::$active_user->data['u_access_level']])) {
                ess::$b->page->add_message("Du har ikke rettigheter til å endre tilgangsnivået til denne brukeren.", "error");
                redirect::handle(page_min_side::addr());
            }
            // endre brukernivå?
            if (isset($_POST['level'])) {
                $level = intval($_POST['level']);
                $log = trim(postval("log"));
                // samme brukernivå?
                if ($level == page_min_side::$active_user->data['u_access_level']) {
                    ess::$b->page->add_message("Du må velge et nytt tilgangsnivå.", "error");
                } elseif (!isset($levels[$level])) {
                    ess::$b->page->add_message("Ugyldig tilgangsnivå.");
                } elseif (empty($log)) {
                    ess::$b->page->add_message("Mangler begrunnelse.");
                } else {
                    // endre tilgangsnivå
                    $old = page_min_side::$active_user->data['u_access_level'];
                    if (page_min_side::$active_user->change_level($level, isset($_POST['no_update_up']))) {
                        // e-post logg
                        sysreport::log("Endring av tilgangsnivå: " . login::$user->player->data['up_name'] . " endret tilgangsnivået til " . page_min_side::$active_user->data['u_email'] . " (" . page_min_side::$active_player->data['up_name'] . ") fra {$levels[$old]} til {$levels[$level]} {$__server['path']}/min_side?u_id=" . page_min_side::$active_user->id . "\n\nBegrunnelse: " . strip_tags(game::format_data($log)), "Kofradia: Endring av tilgangsnivå for " . page_min_side::$active_user->data['u_email'] . " (" . page_min_side::$active_player->data['up_name'] . ")");
                        // finn totalt beløp spilleren har
                        $result = \Kofradia\DB::get()->query("SELECT up_cash + up_bank FROM users_players WHERE up_id = " . page_min_side::$active_player->id);
                        $money = $result->fetchColumn(0);
                        // crewlogg
                        $data = array("level_old" => $old, "level_old_text" => $levels[$old], "level_new" => $level, "level_new_text" => $levels[$level], "money" => $money, "points" => page_min_side::$active_player->data['up_points']);
                        if (page_min_side::$active_player->active && !isset($_POST['no_update_up'])) {
                            $data['up_id'] = page_min_side::$active_player->id;
                        }
                        crewlog::log("user_level", page_min_side::$active_player->id, $log, $data);
                        putlog("CREWCHAN", "%bEndring av tilgangsnivå%b: " . login::$user->player->data['up_name'] . " endret tilgangsnivået til " . page_min_side::$active_user->data['u_email'] . " (" . page_min_side::$active_player->data['up_name'] . ") fra {$levels[$old]} til {$levels[$level]} {$__server['path']}/min_side?u_id=" . page_min_side::$active_user->id);
                        ess::$b->page->add_message('Tilgangsnivået ble endret fra <b>' . htmlspecialchars($levels[$old]) . '</b> til <b>' . htmlspecialchars($levels[$level]) . '</b>.');
                    } else {
                        ess::$b->page->add_message("Tilgangsnivået kunne ikke endres.", "error");
                    }
                    redirect::handle();
                }
            }
            echo '
	<div class="bg1_c" style="width: 350px">
		<h1 class="bg1">Endre tilgangsnivå for bruker<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">' . (page_min_side::$active_player->active ? '
			<p>Dette vil automatisk berøre spilleren ' . page_min_side::$active_player->profile_link() . '.<p>' : '
			<p>Dette vil kun ha innvirkning på brukeren, siden det ikke er noen aktiv spiller.</p>') . '
			<form action="" method="post">
				<dl class="dd_right">
					<dt>Nåværende tilgangsnivå</dt>
					<dd>' . $levels[page_min_side::$active_user->data['u_access_level']] . '</dd>
					<dt>Nytt tilgangsnivå</dt>
					<dd>
						<select name="level">';
            $level = intval(postval("level", page_min_side::$active_user->data['u_access_level']));
            foreach ($levels as $id => $name) {
                echo '
							<option value="' . $id . '"' . ($level == $id ? ' selected="selected"' : '') . '>' . htmlspecialchars($name) . '</option>';
            }
            echo '
						</select>
					</dd>
					<dt>Begrunnelse</dt>
					<dd><textarea name="log" id="log" cols="30" rows="5">' . htmlspecialchars(postval("log")) . '</textarea></dd>
				</dl>' . (page_min_side::$active_player->active ? '
				<p><input type="checkbox" id="no_update_up" name="no_update_up"' . (isset($_POST['no_update_up']) ? ' checked="checked"' : '') . ' /><label for="no_update_up"> Ikke oppdater det visuelle tilgangsnivået til ' . page_min_side::$active_player->profile_link() . '</label></p>' : '') . '
				<p class="c">' . show_sbutton("Endre tilgangsnivå") . '</p>
			</form>
		</div>
	</div>';
        } elseif ($subpage2 == "banka" && access::has("mod")) {
            // lagre nytt passord
            if (isset($_POST['bank_auth'])) {
                $bank_auth = postval("bank_auth");
                $log = trim(postval("log"));
                // for kort?
                if (mb_strlen($bank_auth) < 6) {
                    ess::$b->page->add_message("Passordet må inneholde minst 6 tegn.", "error");
                } elseif (password::verify_hash($bank_auth, page_min_side::$active_user->data['u_bank_auth'], 'bank_auth')) {
                    ess::$b->page->add_message("Passordet er det samme som nåværende.", "error");
                } elseif ($log == "") {
                    ess::$b->page->add_message("Mangler begrunnelse.", "error");
                } else {
                    $newpass = password::hash($bank_auth, null, 'bank_auth');
                    \Kofradia\DB::get()->exec("UPDATE users SET u_bank_auth = " . \Kofradia\DB::quote($newpass) . " WHERE u_id = " . page_min_side::$active_user->id);
                    // crewlogg
                    crewlog::log("user_bank_auth", page_min_side::$active_player->id, $log, array("pass_old" => page_min_side::$active_user->data['u_bank_auth'], "pass_new" => $newpass));
                    ess::$b->page->add_message("Bankpassordet ble endret.");
                    redirect::handle();
                }
            }
            ess::$b->page->add_title("Endre bankpassord");
            echo '
	<div class="bg1_c" style="width: 350px">
		<h1 class="bg1">Endre bankpassord<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<form action="" method="post" autocomplete="off">
				<dl class="dd_right">
					<dt>Nytt bankpassord</dt>
					<dd><input type="password" id="bank_auth" class="styled w120" /></dd>
					<dt>Begrunnelse for endring</dt>
					<dd><textarea name="log" id="log" cols="30" rows="5">' . htmlspecialchars(postval("log")) . '</textarea></dd>
				</dl>
				<p class="c">' . show_sbutton("Lagre") . '</p>
			</form>
		</div>
	</div>';
        } elseif ($subpage2 == "phone" && access::has("mod")) {
            // lagre nytt nummer?
            if (isset($_POST['phone'])) {
                $phone = postval("phone");
                $log = trim(postval("log"));
                if (!preg_match("/^47\\d{8}\$/Du", $phone) && $phone != "") {
                    ess::$b->page->add_message("Ugyldig telefonnummer. Må bestå av 10 tall inkludert 47 først.", "error");
                } else {
                    // kontroller at nummeret ikke er lagt inn fra før
                    $result = \Kofradia\DB::get()->query("SELECT u_id, u_email, up_id, up_name, up_access_level FROM users, users_players WHERE u_phone = " . \Kofradia\DB::quote($phone) . " AND u_id != " . page_min_side::$active_user->id . " AND up_id = u_active_up_id LIMIT 1");
                    if ($result->rowCount() > 0) {
                        $row = $result->fetch();
                        ess::$b->page->add_message('Nummeret er allerede i bruk av <a href="min_side?u_id=' . $row['u_id'] . '">' . htmlspecialchars($row['u_email']) . '</a> (' . game::profile_link($row['up_id'], $row['up_name'], $row['up_access_level']) . ').', "error");
                    } elseif ($phone == page_min_side::$active_user->data['u_phone']) {
                        ess::$b->page->add_message("Nummeret er det samme som nåværende nummer.", "error");
                    } elseif ($log == "") {
                        ess::$b->page->add_message("Mangler logg melding.");
                    } else {
                        // lagre nytt nummer
                        \Kofradia\DB::get()->exec("UPDATE users SET u_phone = " . \Kofradia\DB::quote($phone) . " WHERE u_id = " . page_min_side::$active_user->id);
                        crewlog::log("user_phone", page_min_side::$active_player->id, $log, array("phone_old" => page_min_side::$active_user->data['u_phone'], "phone_new" => $phone));
                        ess::$b->page->add_message('Mobilnummeret ble endret fra <b>' . (empty(page_min_side::$active_user->data['u_phone']) ? 'tomt' : htmlspecialchars(page_min_side::$active_user->data['u_phone'])) . '</b> til <b>' . (empty($phone) ? 'tomt' : $phone) . '</b>.');
                    }
                }
            }
            ess::$b->page->add_title("Endre mobilnummer");
            echo '
	<div class="bg1_c" style="width: 350px">
		<h1 class="bg1">Endre mobilnummer<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<p>Her endrer du mobilnummeret til brukeren. Dette kan bli brukt til å sende ut forskjellig informasjon.</p>
			<form action="" method="post">
				<dl class="dd_right dl_2x">
					<dt>Nåværende nummer</dt>
					<dd>' . (empty(page_min_side::$active_user->data['u_phone']) ? 'Tomt' : htmlspecialchars(page_min_side::$active_user->data['u_phone'])) . '</dd>
					<dt>Nytt nummer</dt>
					<dd><input type="text" maxlength="10" value="' . htmlspecialchars(postval("phone", page_min_side::$active_user->data['u_phone'])) . '" name="phone" class="styled w80" /></dd>
					<dt>Begrunnelse for endring</dt>
					<dd><textarea name="log" cols="30" rows="5">' . htmlspecialchars(postval("log")) . '</textarea></dd>
				</dl>
				<p class="c">' . show_sbutton("Lagre") . '</p>
			</form>
		</div>
	</div>';
        } elseif ($subpage2 == "birth" && access::has("mod")) {
            // lagre ny fødselsdato?
            if (isset($_POST['birth_day']) && isset($_POST['birth_month']) && isset($_POST['birth_year'])) {
                $birth = postval("birth");
                // sjekk fødselsdato
                $birth_day = intval(postval("birth_day"));
                $birth_month = intval(postval("birth_month"));
                $birth_year = intval(postval("birth_year"));
                $date = ess::$b->date->get();
                $n_day = $date->format("j");
                $n_month = $date->format("n");
                $n_year = $date->format("Y");
                $age = $n_year - $birth_year - ($n_month < $birth_month || $birth_month == $n_month && $n_day < $birth_day ? 1 : 0);
                $birth = $birth_year . "-" . str_pad($birth_month, 2, "0", STR_PAD_LEFT) . "-" . str_pad($birth_day, 2, "0", STR_PAD_LEFT);
                // sjekk om fødselsdatoen er gyldig
                $birth_date = ess::$b->date->get();
                $birth_date->setDate($birth_year, $birth_month, $birth_day);
                $birth_valid = $birth_date->format("Y-m-d") == $birth;
                $log = trim(postval("log"));
                // ugyldig dag?
                if ($birth_day < 0 || $birth_day > 31) {
                    ess::$b->page->add_message("Du må velge en gyldig dag.", "error");
                } elseif ($birth_month < 0 || $birth_month > 12) {
                    ess::$b->page->add_message("Du må velge en gyldig måned.", "error");
                } elseif (($birth_year < 1900 || $birth_year > $n_year) && $birth_year !== 0) {
                    ess::$b->page->add_message("Du må velge et gyldig år.", "error");
                } elseif (!$birth_valid && $birth !== '0-00-00') {
                    ess::$b->page->add_message("Datoen du fylte inn for fødselsdatoen din eksisterer ikke.");
                } elseif ($birth == page_min_side::$active_user->data['u_birth']) {
                    ess::$b->page->add_message("Fødselsdatoen ble ikke endret.", "error");
                } elseif ($log == "") {
                    ess::$b->page->add_message("Mangler begrunnelse.", "error");
                } else {
                    // oppdater
                    \Kofradia\DB::get()->exec("UPDATE users SET u_birth = " . \Kofradia\DB::quote($birth) . " WHERE u_id = " . page_min_side::$active_user->id);
                    // legg til crewlogg
                    crewlog::log("user_birth", page_min_side::$active_player->id, $log, array("birth_old" => page_min_side::$active_user->data['u_birth'], "birth_new" => $birth));
                    // alder
                    if ($age < 13) {
                        ess::$b->page->add_message("Fødselsdatoen ble satt til <b>{$birth}</b> ({$age} år). Brukeren oppfyller <u>ikke</u> kravet om alder jf. betingelsene.");
                    } else {
                        ess::$b->page->add_message("Fødselsdatoen ble satt til <b>{$birth}</b> ({$age} år).");
                    }
                    redirect::handle();
                }
            }
            $birth = explode("-", page_min_side::$active_user->data['u_birth']);
            $birth_day = isset($birth[2]) ? intval($birth[2]) : 0;
            $birth_month = isset($birth[1]) ? intval($birth[1]) : 0;
            $birth_year = isset($birth[0]) ? intval($birth[0]) : 0;
            ess::$b->page->add_title("Endre fødselsdato");
            echo '
	<div class="bg1_c" style="width: 350px">
		<h1 class="bg1">Endre fødselsdato<span class="left2"></span><span class="right2"></span></h1>
		<div class="bg1">
			<form action="" method="post">
				<dl class="dd_right dl_2x">
					<dt>Nåværende fødselsdato</dt>
					<dd>' . (empty(page_min_side::$active_user->data['u_birth']) ? 'Ikke registrert' : htmlspecialchars(page_min_side::$active_user->data['u_birth'])) . '</dd>
					<dt>Ny fødselsdato</dt>
					<dd>
						<select name="birth_day">
							<option value="">Dag</option>
							<option value="0">0</option>';
            $active = postval("birth_day", $birth_day);
            for ($i = 1; $i <= 31; $i++) {
                echo '
							<option value="' . $i . '"' . ($i == $active ? ' selected="selected"' : '') . '>' . $i . '</option>';
            }
            echo '
						</select>
						<select name="birth_month">
							<option value="">Måned</option>
							<option value="0">Tom</option>';
            $active = postval("birth_month", $birth_month);
            for ($i = 1; $i <= 12; $i++) {
                echo '
							<option value="' . $i . '"' . ($i == $active ? ' selected="selected"' : '') . '>' . ucfirst($_lang['months'][$i]) . '</option>';
            }
            echo '
						</select>
						<select name="birth_year">
							<option value="">År</option>
							<option value="0">0000</option>';
            $active = postval("birth_year", $birth_year);
            for ($i = ess::$b->date->get()->format("Y"); $i >= 1900; $i--) {
                echo '
							<option value="' . $i . '"' . ($i == $active ? ' selected="selected"' : '') . '>' . $i . '</option>';
            }
            echo '
						</select>
					</dd>
					<dt>Begrunnelse for endring</dt>
					<dd><textarea name="log" id="log" cols="30" rows="5">' . htmlspecialchars(postval("log")) . '</textarea></dd>
				</dl>
				<p class="c">' . show_sbutton("Lagre") . '</p>
			</form>
		</div>
	</div>';
        }
    }
Пример #9
0
 /**
  * Sjekk om brukeren er logget inn
  * @param boolean $ajax bruk data fra $_SESSION ?
  */
 public static function check_status($ajax = false)
 {
     global $__server, $_base, $_game;
     // ajax?
     if ($ajax) {
         // er ikke session starta?
         if (!session_id()) {
             // har ikke session?
             if (!isset($_COOKIE[session_name()]) || !isset($_COOKIE[$__server['cookie_prefix'] . "s"])) {
                 return;
             }
             // start session
             sess_start();
         }
         // har vi ikke brukerinfo?
         if (!isset($_SESSION[$GLOBALS['__server']['session_prefix'] . 'logged_in'])) {
             return;
         }
         // kontroller at brukeren fremdeles kan være logget inn
         if ($_SESSION[$GLOBALS['__server']['session_prefix'] . 'login_info']['ses_expire_time'] <= time()) {
             self::logout();
             return;
         }
         self::$logged_in = $_SESSION[$GLOBALS['__server']['session_prefix'] . 'logged_in'];
         self::$info = $_SESSION[$GLOBALS['__server']['session_prefix'] . 'login_info'];
         self::$user = $_SESSION[$GLOBALS['__server']['session_prefix'] . 'user'];
         if (isset($_SESSION[$GLOBALS['__server']['session_prefix'] . 'extended_access'])) {
             self::$extended_access = $_SESSION[$GLOBALS['__server']['session_prefix'] . 'extended_access'];
         }
         if (isset($_SESSION[$GLOBALS['__server']['session_prefix'] . 'data'])) {
             self::$data =& $_SESSION[$GLOBALS['__server']['session_prefix'] . 'data'];
         }
         // if-test kan fjernes over tid grunnet overgangsfase
         // kontroller extended access
         if (isset(self::$extended_access['authed'])) {
             // vært inaktiv for lenge?
             $time = time();
             if (self::$extended_access['auth_check'] + 1800 <= $time) {
                 self::$extended_access = array("authed" => NULL, "auth_time" => 0, "auth_check" => 0, "passkey" => self::$extended_access);
                 $_SESSION[$GLOBALS['__server']['session_prefix'] . 'extended_access'] = self::$extended_access;
             }
         }
         // ajax sjekk fullført
         return;
     }
     // finnes cookies?
     if (isset($_COOKIE[$__server['cookie_prefix'] . "s"])) {
         $secure = $_COOKIE[$__server['cookie_prefix'] . "s"];
         if ($secure == 1) {
             defined("LOGIN_FORCE_SSL") || define("LOGIN_FORCE_SSL", true);
             force_https();
         }
         // sjekk at vi har alle cookies
         if (isset($_COOKIE[$__server['cookie_prefix'] . "id"]) && mb_substr_count($_COOKIE[$__server['cookie_prefix'] . "id"], ":") == 1 && isset($_COOKIE[$__server['cookie_prefix'] . "h"])) {
             // finn sid, uid og hash
             list($sid, $uid) = explode(":", $_COOKIE[$__server['cookie_prefix'] . "id"]);
             $hash = $_COOKIE[$__server['cookie_prefix'] . "h"];
             $sid = intval($sid);
             $uid = intval($uid);
             // finn ut om dette finnes i databasen
             $result = \Kofradia\DB::get()->query("\n\t\t\t\t\tSELECT\n\t\t\t\t\t\tses_id, ses_u_id, ses_hash, ses_expire_type, ses_expire_time, ses_browsers, ses_phpsessid, ses_last_ip, ses_last_time, ses_secure,\n\t\t\t\t\t\tu_online_time, u_online_ip, u_access_level, u_force_ssl\n\t\t\t\t\tFROM sessions, users WHERE sessions.ses_u_id = users.u_id AND sessions.ses_u_id = {$uid} AND sessions.ses_id = {$sid} AND sessions.ses_active = 1 AND sessions.ses_expire_time > " . time());
             // kontroller hash
             if ($row = $result->fetch()) {
                 if ($hash != $row['ses_hash'] && $hash != mb_substr(md5($row['ses_hash']), 0, 13)) {
                     $row = null;
                 }
             }
             unset($result);
             // har vi en rad?
             if ($row) {
                 self::$info = $row;
                 self::$info['ses_secure'] = self::$info['ses_secure'] == 1;
                 $extra = "";
                 // start session
                 sess_start(self::$info['ses_phpsessid']);
                 // deaktivert?
                 if (self::$info['u_access_level'] == 0) {
                     // logg ut alle øktene
                     self::logout(true);
                     // hent begrunnelse og info
                     $result = \Kofradia\DB::get()->query("SELECT u_id, u_email, u_deactivated_reason, u_deactivated_time, up_name FROM users LEFT JOIN users_players ON up_id = u_active_up_id WHERE u_id = {$uid}");
                     $_SESSION[$GLOBALS['__server']['session_prefix'] . 'login_error'] = array("deactivated", $result->fetch());
                     unset($result);
                     redirect::handle("", redirect::ROOT);
                 }
                 // ny IP-adresse?
                 if ($_SERVER['REMOTE_ADDR'] != self::$info['ses_last_ip'] && self::$info['ses_last_ip'] != "0.0.0.0" && !empty(self::$info['ses_last_ip'])) {
                     // hent IP-liste
                     $result = \Kofradia\DB::get()->query("\n\t\t\t\t\t\t\tSELECT ses_ip_list\n\t\t\t\t\t\t\tFROM sessions\n\t\t\t\t\t\t\tWHERE ses_id = {$sid}");
                     $ip_list = explode(";", $result->fetchColumn(0));
                     unset($result);
                     // er vi allerede verifisert?
                     $ok = false;
                     if (in_array($_SERVER['REMOTE_ADDR'], $ip_list)) {
                         $ok = true;
                     } elseif ($__server['https_support']) {
                         if ($row['ses_hash'] == $hash && $secure) {
                             $ok = true;
                         } elseif (mb_substr(md5($row['ses_hash']), 0, 13) == $hash) {
                             // må bruke HTTPS?
                             if (!HTTPS) {
                                 // _POST?
                                 if ($_SERVER['REQUEST_METHOD'] == "POST") {
                                     header("HTTP/1.1 406 Not Acceptable");
                                     die("Du forsøker å utføre en handling men må reautentisere deg på grunn av ny IP-adresse. Åpne siden i et nytt vindu og vend tilbake hit og oppdater siden for å fullføre handlingen.");
                                 }
                                 // videresend til sikker kobling
                                 redirect::handle("/?orign=" . urlencode($_SERVER['REQUEST_URI']), redirect::ROOT, true);
                             }
                             // kontroller reauth-cookie
                             if (isset($_COOKIE[$__server['cookie_prefix'] . "ra"]) && $_COOKIE[$__server['cookie_prefix'] . "ra"] == $row['ses_hash']) {
                                 $ok = true;
                             }
                         }
                         // verifisert?
                         if ($ok) {
                             // legg til i listen
                             $ip_list[] = $_SERVER['REMOTE_ADDR'];
                             $extra .= ", ses_ip_list = " . \Kofradia\DB::quote(implode(";", $ip_list));
                             putlog("ABUSE", "%c6%bAUTENTISERT-IP:%b%c #%u{$uid}%u har fått ny IP-adresse autentisert i økten (%u{$_SERVER['REMOTE_ADDR']}%u - forrige: " . self::$info['ses_last_ip'] . ") {$__server['path']}/min_side?u_id={$uid}");
                         }
                     }
                     if (!$ok) {
                         // logg ut økten
                         self::logout();
                         putlog("CREWCHAN", "%c6%bMISLYKKET-AUTENTISERT-IP:%b%c #%u{$uid}%u har fått ny IP-adresse i økten (%u{$_SERVER['REMOTE_ADDR']}%u - forrige: " . self::$info['ses_last_ip'] . ") - %c4KUNNE IKKE VERIFISERES%c - {$__server['path']}/min_side?u_id={$uid}");
                         // hent e-post
                         $result = \Kofradia\DB::get()->query("SELECT u_email FROM users WHERE u_id = {$uid}");
                         $email = $result->fetchColumn(0);
                         unset($result);
                         // lagre e-post i sessions slik at det kan hentes ut til logg inn skjemaet
                         $_SESSION[$GLOBALS['__server']['session_prefix'] . 'logginn_id'] = $email;
                         // info og redirect
                         $_base->page->add_message("Du har fått ny IP-adresse og har blitt automatisk logget ut av sikkerhetsmessige årsaker. Vi klarte ikke å verifisere din identitet. Du kan nå logge inn igjen.", "info");
                         redirect::handle("?orign=" . urlencode($_SERVER['REQUEST_URI']), redirect::ROOT);
                     }
                     // sett som siste IP
                     $extra .= ", ses_last_ip = " . \Kofradia\DB::quote($_SERVER['REMOTE_ADDR']);
                 }
                 // bruker ikke sikker tilkobling slik det skal?
                 if (!$secure && self::$info['ses_secure'] && $__server['https_support']) {
                     // endre secure cookie
                     $cookie_expire = self::$info['ses_expire_type'] == LOGIN_TYPE_BROWSER ? 0 : time() + 31536000;
                     setcookie($__server['cookie_prefix'] . "s", 1, $cookie_expire, $__server['cookie_path'], $__server['cookie_domain']);
                     defined("LOGIN_FORCE_SSL") || define("LOGIN_FORCE_SSL", true);
                     force_https();
                 }
                 // skal være tvunget til https?
                 if ($__server['https_support'] && !self::$info['ses_secure'] && (self::$info['u_access_level'] != 0 && self::$info['u_access_level'] != 1 || self::$info['u_force_ssl'] != 0 || defined("FORCE_HTTPS_ALWAYS"))) {
                     // endre secure cookie
                     $cookie_expire = self::$info['ses_expire_type'] == LOGIN_TYPE_BROWSER ? 0 : time() + 31536000;
                     setcookie($__server['cookie_prefix'] . "s", 1, $cookie_expire, $__server['cookie_path'], $__server['cookie_domain']);
                     // endre session
                     \Kofradia\DB::get()->exec("UPDATE sessions SET ses_secure = 1 WHERE ses_id = {$sid}");
                     // krev https
                     defined("LOGIN_FORCE_SSL") || define("LOGIN_FORCE_SSL", true);
                     force_https();
                     self::$info['ses_secure'] = true;
                 }
                 // sjekk for hyppige oppdateringer
                 if ($uid != 1) {
                     $perioder = array(5 => 10, 10 => 15, 60 => 80);
                     foreach ($perioder as $tid => $maks) {
                         $periode = ceil(time() / $tid);
                         $c_now = isset($_SESSION[$GLOBALS['__server']['session_prefix'] . 'user_hits_' . $tid][$periode]) ? $_SESSION[$GLOBALS['__server']['session_prefix'] . 'user_hits_' . $tid][$periode] + 1 : 1;
                         unset($_SESSION[$GLOBALS['__server']['session_prefix'] . 'user_hits_' . $tid]);
                         $_SESSION[$GLOBALS['__server']['session_prefix'] . 'user_hits_' . $tid][$periode] = $c_now;
                         // for mange visninger
                         if ($c_now > $maks) {
                             // finn info
                             $result = \Kofradia\DB::get()->query("SELECT up_name FROM users, users_players WHERE u_id = {$uid} AND up_id = u_active_up_id");
                             $name = $result->fetchColumn(0);
                             unset($result);
                             putlog("ABUSE", "%bHITS LIMIT%b (%u{$tid}%u-%u{$periode}%u) - %u{$name}%u ({$uid}) - COUNT: %u{$c_now}%u -- {$_SERVER['REQUEST_METHOD']} -- {$_SERVER['REQUEST_URI']} -- {$__server['path']}/min_side?u_id={$uid}");
                             header("HTTP/1.0 503 Service Unavailiable");
                             echo sysreport::html_template("For mange visninger", "<p>Du har hatt for mange visninger på siden i løpet av kort tid. Vent litt og prøv igjen.</p>");
                             die;
                         }
                     }
                 }
                 // oppdater brukeren
                 $expire = self::$info['ses_expire_type'] == LOGIN_TYPE_ALWAYS ? time() + 31536000 : (self::$info['ses_expire_type'] == LOGIN_TYPE_BROWSER ? time() + 86400 : time() + 900);
                 self::$info['ses_expire_time'] = $expire;
                 $time = time();
                 // nettlesere
                 $browsers = self::$info['ses_browsers'];
                 if (empty($browsers)) {
                     $browsers = array();
                 } else {
                     $browsers = explode("\n", $browsers);
                 }
                 // endre nettleser?
                 if (!in_array($_SERVER['HTTP_USER_AGENT'], $browsers)) {
                     $browsers[] = $_SERVER['HTTP_USER_AGENT'];
                     $extra .= ", ses_browsers = " . \Kofradia\DB::quote(implode("\n", $browsers));
                     $result = \Kofradia\DB::get()->query("SELECT u_email, up_name FROM users, users_players WHERE u_id = {$uid} AND u_active_up_id = up_id");
                     $row = $result->fetch();
                     unset($result);
                     putlog("ABUSE", "%b%c11NETTLESER OPPDAGET:%c%b (%c4%u" . count($browsers) . "%u%c) - {$row['up_name']} ({$row['u_email']}); UID: %u{$uid}%u - SID: {$sid} - IP: {$_SERVER['REMOTE_ADDR']} - NETTLESER: {$_SERVER['HTTP_USER_AGENT']}");
                 }
                 if (session_id() != self::$info['ses_phpsessid']) {
                     $phpsessid = \Kofradia\DB::quote(session_id());
                     $extra .= ", ses_phpsessid = {$phpsessid}";
                 }
                 \Kofradia\DB::get()->exec("UPDATE sessions SET ses_expire_time = {$expire}, ses_hits = ses_hits + 1, ses_last_time = {$time}{$extra} WHERE ses_u_id = {$uid} AND ses_id = {$sid}");
                 // hent inn brukeren
                 self::$logged_in = true;
                 self::load_user($uid);
                 // oppdater statisikk
                 $date = $_base->date->get();
                 self::$info['secs_hour'] = self::get_secs_hour();
                 \Kofradia\DB::get()->exec("\n\t\t\t\t\t\tINSERT INTO users_hits SET uhi_hits = 1, uhi_up_id = " . login::$user->player->id . ", uhi_secs_hour = " . self::$info['secs_hour'] . "\n\t\t\t\t\t\tON DUPLICATE KEY UPDATE uhi_hits = uhi_hits + 1");
                 $upd_u = array();
                 $upd_up = array();
                 if ($_SERVER['REMOTE_ADDR'] != self::$info['ses_last_ip']) {
                     $last_ip = \Kofradia\DB::quote($_SERVER['REMOTE_ADDR']);
                     $upd_u[] = "u_online_ip = {$last_ip}";
                     self::$user->data['u_online_ip'] = $_SERVER['REMOTE_ADDR'];
                     if (self::$info['u_online_time'] > time() - 300) {
                         $delay = time() - self::$info['u_online_time'];
                         putlog("ABUSE", "%c6%bSESSION-NY-IP:%b%c #%u{$uid}%u har ny IP (%u{$_SERVER['REMOTE_ADDR']}%u) i løpet av kort tid (%u{$delay}%u sekunder) (samme session) {$__server['path']}/min_side?u_id={$uid}");
                     }
                 } elseif ($_SERVER['REMOTE_ADDR'] != self::$info['u_online_ip']) {
                     $last_ip = \Kofradia\DB::quote($_SERVER['REMOTE_ADDR']);
                     $upd_u[] = "u_online_ip = {$last_ip}";
                     self::$user->data['u_online_ip'] = $_SERVER['REMOTE_ADDR'];
                     if (self::$info['u_online_time'] > time() - 300) {
                         $delay = time() - self::$info['u_online_time'];
                         putlog("ABUSE", "%c6%bNY-IP:%b%c #%u{$uid}%u har ny IP (%u{$_SERVER['REMOTE_ADDR']}%u) i løpet av kort tid (%u{$delay}%u sekunder) (egen session) {$__server['path']}/min_side?u_id={$uid}");
                     }
                 }
                 // oppdatere spilleren eller brukeren?
                 if (self::$user->player->data['up_access_level'] != 0) {
                     $upd_up[] = "up_hits = up_hits + 1";
                 } else {
                     $upd_u[] = "u_hits = u_hits + 1";
                 }
                 self::$user->data['u_online_time'] = $time;
                 $upd_u[] = "u_online_time = {$time}";
                 // vise pålogget status for spilleren?
                 if (self::$user->player->data['up_access_level'] != 0 && ($uid != SYSTEM_USER_ID || isset($_SESSION[$GLOBALS['__server']['session_prefix'] . 'show_online'])) && (!isset($_SESSION[$GLOBALS['__server']['session_prefix'] . 'hide_online']) || $uid != 1 && $uid != SYSTEM_USER_ID)) {
                     // oppdatere spilleren?
                     if (self::$user->player) {
                         self::$user->player->data['up_last_online'] = $time;
                     }
                     $upd_up[] = "up_last_online = {$time}";
                 }
                 if (count($upd_u) > 0) {
                     \Kofradia\DB::get()->exec("UPDATE users SET " . implode(",", $upd_u) . " WHERE u_id = " . self::$user->id);
                 }
                 if (count($upd_up) > 0) {
                     \Kofradia\DB::get()->exec("UPDATE users_players SET " . implode(",", $upd_up) . " WHERE up_id = " . self::$user->player->id);
                 }
             } else {
                 // fant ingen tilsvarende rad - slett session og cookies
                 self::logout();
             }
         } else {
             // mangler alle cookies
             self::logout();
         }
     } else {
         sess_start();
     }
 }
Пример #10
0
 /** Kjør rutine */
 private function run($row)
 {
     global $_base;
     // marker som opptatt
     $a = \Kofradia\DB::get()->exec("UPDATE scheduler SET s_count = s_count + 1, s_previous = {$this->start}, s_expire = " . ($this->start + 600) . " WHERE s_name = " . \Kofradia\DB::quote($row['s_name']) . " AND s_count = {$row['s_count']}");
     // ikke oppdater - hopp over (en annen holder mest sannsynlig på)
     if ($a == 0) {
         return;
     }
     ++$this->count;
     // finn ut når rutinen skal utføres neste gang
     $next = $this->next($row['s_hours'], $row['s_minutes'], $row['s_seconds']);
     // sjekk om filen finnes
     $path = PATH_APP . "/scheduler/" . $row['s_file'];
     if (!file_exists($path)) {
         // lagre logg
         putlog("NOTICE", "%bScheduler:%b ERROR: Scriptfil %u{$row['s_file']}%u for %u{$row['s_name']}%u finnes ikke!");
         sysreport::log("Scheduler - scriptfil mangler", "Scriptfil '{$row['s_file']}' for '{$row['s_name']}' finnes ikke!");
     } else {
         $start = microtime(true);
         // benytt egen funksjon for å hindre overskriving av variabler
         if ($this->load($path) == "skip_next") {
             $scheduler_skip_next = true;
         }
         $next_r = isset($scheduler_skip_next) ? '' : " - neste: " . $_base->date->get($next)->format(date::FORMAT_SEC) . " (" . game::timespan($next, game::TIME_ABS | game::TIME_NOBOLD) . ")";
         putlog("SPAM", "%bScheduler:%b Rutinen %u{$row['s_name']}%u ble utført (" . number_format(round(microtime(true) - $start, 6), 6, ",", ".") . " sekunder){$next_r}");
     }
     $s_next = isset($scheduler_skip_next) ? '' : ', s_next = ' . $next;
     \Kofradia\DB::get()->exec("UPDATE scheduler SET s_expire = 0{$s_next} WHERE s_name = " . \Kofradia\DB::quote($row['s_name']) . " AND s_count = " . ($row['s_count'] + 1));
 }