Commit 7a34b5c2 authored by Leigh Stoller's avatar Leigh Stoller

This commit switches the Emulab Classic frontpage to the Portal.

See issue #400. Closes issue #448.
parent 4f28fc77
#
# Copyright (c) 2000-2016 University of Utah and the Flux Group.
# Copyright (c) 2000-2018 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
......@@ -147,7 +147,8 @@ JSFILES += $(wildcard $(SRCDIR)/js/*.js)
BLOBFILES += $(wildcard blob/*.php3)
APTUIFILES = $(wildcard $(SRCDIR)/aptui/*.php)
APTUIFILES = $(wildcard $(SRCDIR)/aptui/*.html)
APTUIFILES += $(wildcard $(SRCDIR)/aptui/*.php)
APTUIFILES += $(wildcard $(SRCDIR)/aptui/*.ajax)
APTUIFILES += $(wildcard $(SRCDIR)/aptui/*.png)
APTUIFILES += $(wildcard $(SRCDIR)/aptui/*.ico)
......
<div class='navbar portal-navbar' role='navigation' style="margin-bottom: 0px">
<div class='navbar-header'>
<button type='button' class='navbar-toggle collapsed'
data-toggle='collapse' data-target='.navbar-collapse'
aria-expanded='false'>
<span class='sr-only'>Toggle navigation</span>
<span class='icon-bar'></span>
<span class='icon-bar'></span>
<span class='icon-bar'></span>
</button>
<a class='navbar-brand' href='landing.php'>
<img src='images/emulab-logo.svg'/></a>
<span class="navbar-brand">{$whoarewe}</span>
</div>
<a class="btn btn-quickvm-home btn-success navbar-btn pull-right"
style="margin-right: 20px; margin-left: 10px; padding: 5px 5px;"
href="landing.php?login=1">Log In</a>
<div class="navbar-collapse collapse navbar-left">
<ul class="nav navbar-nav">
</ul>
</div>
<div class="navbar-collapse collapse navbar-right">
<ul class="nav navbar-nav">
<li><a href="http://docs.emulab.net/"
class="btn btn-quickvm-home navbar-btn">Docs</a></li>
</ul>
</div>
</div>
<div class="jumbotron" style="padding-top: 15px; padding-bottom: 10px">
<div class="container">
<div class="row">
<div class="col-md-7 col-sm-12">
<img class="header-logo center-block" style="width: 60%; margin-bottom: 20px;" src="images/emulab-name-only.svg" alt="Emulab">
<p id="jumbo-text">
<a style="margin: 0px 0px 10px 10px" class="btn btn-success pull-right" href="signup.php">Request an Account</a>
A time- and space-shared platform
for research, education, and development in distributed systems and
networks. Emulab's primary goals are ease of use, control, and
realism, achieved through consistent use of virtualization
and abstraction.
</p>
</div>
<div class="col-md-5 col-sm-12">
<img class="center-block" style="width: 60%" src="images/emulab-logo-only.svg" alt="Emulab">
</div>
</div> <!-- /row -->
</div> <!-- /container -->
</div>
<div class="container">
<div class="row">
<div class="col-md-6 col-sm-12">
<em>Emulab</em> is a network testbed, giving researchers a wide range of
environments in which to develop, debug, and evaluate their systems.
The name Emulab refers both to a <strong>facility</strong> and to a
<strong>software system</strong>.
The <a href="http://www.emulab.net">primary Emulab installation</a> is run
by the
<a href="http://www.flux.utah.edu">Flux Group</a>, part of the
<a href="http://www.cs.utah.edu">School of Computing</a> at the
<a href="http://www.utah.edu">University of Utah</a>.
There are also installations of the Emulab software at more than
<a href="http://users.emulab.net/trac/emulab/wiki/OtherEmulabs">two
dozen sites</a> around the world, ranging from testbeds with a handful
of nodes up to testbeds with hundreds of nodes.
Emulab is <a href="http://www.emulab.net/expubs.php">widely used</a>
by computer science researchers in the fields of networking and
distributed systems.
It is also designed to support
<a href="http://users.emulab.net/trac/emulab/wiki/Education">
education</a>, and has been used to
<a href="http://users.emulab.net/trac/emulab/wiki/Classes">teach
classes</a> in those fields.
<div style="margin-top: 10px;">
<ul>
<li><a href="https://gitlab.flux.utah.edu/emulab/emulab-devel/wikis/home">Emulab Wiki</a></li>
<li><a href="https://gitlab.flux.utah.edu/emulab/emulab-devel/wikis/How%20to%20Get%20Started">How to Get Started</a></li>
<li><a href="https://gitlab.flux.utah.edu/emulab/emulab-devel/wikis/Acceptable%20Use%20Policy">Acceptable Use Policy</a></li>
<li><a href="https://gitlab.flux.utah.edu/emulab/emulab-devel/wikis/Administrative%20Policies">Administrative Policies</a></li>
<li><a href="https://gitlab.flux.utah.edu/emulab/emulab-devel/wikis/Security%20Policies">Security Policies</a></li>
<li><a href="https://gitlab.flux.utah.edu/emulab/emulab-devel/wikis/Utah%20Cluster">Hardware Overview of the Utah cluster</a></li>
<li><a href="https://gitlab.flux.utah.edu/emulab/emulab-devel/wikis/faq/Using%20the%20Testbed/Emulab%20Classic">What happened to the old Emulab?</a></li>
</ul>
</div>
</div>
<div class="col-md-6 col-sm-12" id="frontpage-facility">
<div class="panel panel-primary" style="margin-bottom: 10px">
<div class="panel-body">
<div class="col-sm-7 col-xs-12 cluster-status">
<table class="table table-hover table-condensed"
style="margin-bottom: 0px">
<thead>
<tr><th colspan="3">Cluster Status</th></tr>
</thead>
<tbody>
<tr>
<td colspan="3">Active Experiments:
<span class="pull-right badge badge-info"
style="min-width: 4em"
id="facility-experiments">{$active}</span>
</td>
</tr>
{$nodecounts}
</tbody>
</table>
</div>
<div class="col-sm-5 col-xs-12">
<table class="table table-hover table-condensed"
style="margin-bottom: 0px">
<thead>
<tr>
<th colspan="2">Activity</th>
</tr>
</thead>
<tbody>
<tr>
<td>Projects</td>
<td class="text-right"
id="facility-total-projects">{$projects}</td>
</tr>
<tr>
<td>Users</td>
<td class="text-right"
id="facility-total-users">{$users}</td>
</tr>
<tr>
<td>Profiles</td>
<td class="text-right"
id="facility-profiles">{$profiles}</td>
</tr>
<tr>
<td>Experiments</td>
<td class="text-right"
id="facility-total-experiments">{$experiments}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<center>
<a href="../classic.php">Looking for the old Emulab frontpage?</a>
</center>
</div>
</div>
</div>
......@@ -35,20 +35,46 @@ RedirectSecure();
$check_status = 0;
$this_user = CheckLogin($check_status);
SPITHEADER(1, 1);
SPITHEADER(1, true, true);
SPITREQUIRE("");
echo "<script type='text/javascript'>\n";
echo "</script>\n";
$matter = file_get_contents("frontpage.html");
$stats = json_decode(file_get_contents("$APTBASE/stats-ajax.php"), true);
$whoarewe = ($TBMAINSITE ? "" : $THISHOMEBASE);
$counts = "<tr><th>Type</th><th>Free</th><th>% Inuse</th></tr>";
# Place to hang the toplevel template.
echo "<div id='main-body'></div>\n";
foreach ($stats["typeinfo"] as $type => $totals) {
$total = $totals["total"];
$free = $totals["free"];
$pctfull = round(100.0 * ($total - $free) / $total);
if ($TBMAINSITE) {
$type = "<a href='https://gitlab.flux.utah.edu/emulab/emulab-devel/wikis/Utah%20Cluster#${type}s' target=_blank>$type</a>";
}
$counts .=
"<tr>
<td>$type</td>
<td><small>
<span class='badge badge-light'>$free</span></small></td>
<td style='width: 8em'>
<div class='progress' style='margin-bottom: 0px'>
<div class='progress-bar' style='width: ${pctfull}%;'
role='progressbar'>${pctfull}% inuse</div>
</div>
</td>
</tr>\n";
}
REQUIRE_UNDERSCORE();
REQUIRE_SUP();
REQUIRE_MOMENT();
SPITREQUIRE("js/frontpage.js");
$vars = array(
'{$active}' => $stats["active_experiments"],
'{$projects}' => $stats["projects"],
'{$users}' => $stats["distinct_users"],
'{$profiles}' => $stats["profiles"],
'{$experiments}' => $stats["total_experiments"],
'{$nodecounts}' => $counts,
'{$whoarewe}' => $whoarewe,
);
echo strtr($matter, $vars);
AddTemplateList(array("frontpage", "frontpage-facility", "frontpage-status",
"oops-modal", "waitwait-modal"));
SPITFOOTER(1);
?>
......@@ -34,17 +34,21 @@ include_once("profile_defs.php");
#
RedirectSecure();
$this_user = CheckLogin($check_status);
if (!$ISAPT) {
if (! ($CHECKLOGIN_STATUS & CHECKLOGIN_LOGGEDIN)) {
header("Location: login.php");
return;
}
}
#
# Verify page arguments.
#
$optargs = OptionalPageArguments("from", PAGEARG_STRING);
$optargs = OptionalPageArguments("login", PAGEARG_BOOLEAN);
if (! ($CHECKLOGIN_STATUS & CHECKLOGIN_LOGGEDIN)) {
if ($ISEMULAB && !$login) {
header("Location: frontpage.php");
}
else {
header("Location: login.php");
}
return;
}
#
# Redirect logged in user.
......
......@@ -78,14 +78,14 @@ $PAGEERROR_HANDLER = function($msg = null, $status_code = 0) {
die("");
};
$PAGEHEADER_FUNCTION = function($thinheader = 0, $ignore1 = NULL,
$ignore2 = NULL, $ignore3 = NULL)
$PAGEHEADER_FUNCTION = function($thinheader = 0, $nomenu = false,
$inline = false, $ignore3 = NULL)
{
global $PORTAL_MANUAL, $PORTAL_HELPFORUM;
global $TBMAINSITE, $APTTITLE, $FAVICON, $APTLOGO, $APTSTYLE, $ISAPT;
global $GOOGLEUA, $ISCLOUD, $TBBASE;
global $ISPNET, $ISPOWDER, $ISEMULAB;
global $login_user, $login_status, $SUPPORT;
global $login_user, $login_status, $SUPPORT, $FIRSTUSER;
global $disable_accounts, $page_title, $drewheader, $embedded;
$cleanmode = (isset($_COOKIE['cleanmode']) &&
$_COOKIE['cleanmode'] == 1 ? 1 : 0);
......@@ -126,17 +126,30 @@ $PAGEHEADER_FUNCTION = function($thinheader = 0, $ignore1 = NULL,
type='image/vnd.microsoft.icon'>
<link rel='stylesheet' href='css/bootstrap.css'>
<link rel='stylesheet' href='css/quickvm.css'>
<link rel='stylesheet' href='css/$APTSTYLE'>";
<link rel='stylesheet' href='css/$APTSTYLE'>\n";
if ($ISPOWDER) {
echo "<link href='https://www.powderwireless.net/powder/fonts/raleway/style.css' rel='stylesheet'>";
}
if ($TBMAINSITE) {
if ($ISEMULAB) {
# This might still be used by google.
echo "<meta name='description' ".
"content='emulab - network emulation testbed home'>\n";
}
}
echo "<script src='js/lib/jquery.min.js'></script>\n";
echo "<script>APT_CACHE_TOKEN='" . Instance::CacheToken() . "';</script>";
echo "<script src='js/common.js?nocache=asdfasdf'></script>
<link rel='stylesheet' href='css/jquery-steps.css'>
<script src='$TBBASE/emulab_sup.js'></script>
</head>
<body style='display: none;'>\n";
</head>\n";
if ($inline) {
echo "<body>\n";
}
else {
echo "<body style='display: none;'>\n";
}
echo "<script type='text/javascript'>\n";
echo " window.ISEMULAB = " . ($ISEMULAB ? "1" : "0") . ";\n";
......@@ -172,7 +185,7 @@ $PAGEHEADER_FUNCTION = function($thinheader = 0, $ignore1 = NULL,
if ($embedded) {
goto embed;
}
if ($ignore1) {
if ($nomenu) {
return;
}
......@@ -243,6 +256,18 @@ $PAGEHEADER_FUNCTION = function($thinheader = 0, $ignore1 = NULL,
!($login_status & CHECKLOGIN_WEBONLY)) {
# Always create empty div for announcements, for ajax update.
echo "<div id='portal-announcement-div'>\n";
#
# When a classic user hits the Portal interface for the first time,
# enter a announcement for the user to make sure they know what is
# going on and how to return to the Classic interface. I put a canned
# announcement in the announce script.
#
if (!$login_user->portal() && !$login_user->portal_interface_warned()) {
SUEXEC($FIRSTUSER, "nobody",
"webannounce -a -U $login_uid -p emulab -m 10 -P",
SUEXEC_ACTION_CONTINUE);
$login_user->SetPortalWarned();
}
$announcements = GET_ANNOUNCEMENTS($login_user);
for ($i = 0; $i < count($announcements); $i++) {
echo $announcements[$i];
......@@ -363,7 +388,7 @@ function SPITHEADER($thinheader = 0,
function SPITNAV($hiddenxs, $navbar_status, $navbar_right, $login_uid)
{
global $PORTAL_MANUAL, $APTLOGO, $login_status, $login_user, $TBMAINSITE;
global $THISHOMEBASE, $ISEMULAB, $ISPNET, $ISPOWDER;
global $THISHOMEBASE, $ISEMULAB, $ISPNET, $ISPOWDER, $TBBASE;
$hiddenxs = "";
echo "
......@@ -411,8 +436,12 @@ echo " <li class='divider'></li>
<li><a href='list-reservations.php'>
My Reservations</a></li>
<li><a href='activity.php?user=$login_uid&min=$then'>
My History</a></li>
";
My History</a></li>";
# Classic users, using the Portal, get a link back to it. SAD!
if (!$login_user->portal()) {
echo " <li class='divider'></li>";
echo " <li><a href='$TBBASE/classic.php'>Emulab Classic</a></li>";
}
echo "
</ul>
</li>
......
<!--
Copyright (c) 2000-2018 University of Utah and the Flux Group.
{{{EMULAB-LICENSE
This file is part of the Emulab network testbed software.
This file is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.
This file is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
License for more details.
You should have received a copy of the GNU Affero General Public License
along with this file. If not, see <http://www.gnu.org/licenses/>.
}}}
-->
<!--- This exists to redirect to the PHP script -->
<html>
<head>
<title>Emulab.Net</title>
<META HTTP-EQUIV="Refresh" Content= "0; URL=classic.php" ALT="Emulab home page">
</head>
</html>
<?php
#
# Copyright (c) 2000-2009 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
# This file is part of the Emulab network testbed software.
#
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
#
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this file. If not, see <http://www.gnu.org/licenses/>.
#
# }}}
#
require("defs.php3");
$optargs = OptionalPageArguments("stayhome", PAGEARG_BOOLEAN);
#
# The point of this is to redirect logged in users to their My Emulab
# page.
#
if (($this_user = CheckLogin($check_status))) {
$check_status = $check_status & CHECKLOGIN_STATUSMASK;
if ($check_status == CHECKLOGIN_MAYBEVALID) {
# Maybe the reason was because they where not using HTTPS ...
RedirectHTTPS();
}
if (($firstinitstate = TBGetFirstInitState())) {
unset($stayhome);
}
if (!isset($stayhome)) {
if ($check_status == CHECKLOGIN_LOGGEDIN) {
if ($firstinitstate == "createproject") {
# Zap to NewProject Page,
header("Location: $TBBASE/newproject.php3");
}
else {
# Zap to My Emulab page.
header("Location: $TBBASE/".
CreateURL("showuser", $this_user));
}
return;
}
}
# Fall through; display the page.
}
#
# Standard Testbed Header
#
PAGEHEADER("Emulab - Network Emulation Testbed Home",NULL,$RSS_HEADER_NEWS);
#
# Special banner message.
#
$message = TBGetSiteVar("web/banner");
if ($message != "") {
echo "<center><font color=Red size=+1>\n";
echo "$message\n";
echo "</font></center><br>\n";
}
if ($TBMAINSITE && !$ISALTDOMAIN) {
echo "<span class='picture'>
<center><font size=-1>In Memoriam</font></center><a href=jay.php>
<img width=80 height=85 src=jay.jpg></a><br clear=left>
<center><font size=-1>Jay Lepreau<br>03/52--09/08
</font></center></span><br>\n";
}
?>
<p>
<em>Emulab</em> is a network testbed, giving researchers a wide range of
environments in which to develop, debug, and evaluate their systems.
The name Emulab refers both to a <strong>facility</strong> and to a
<strong>software system</strong>.
The <a href="http://www.emulab.net">primary Emulab installation</a> is run
by the
<a href="http://www.flux.utah.edu">Flux Group</a>, part of the
<a href="http://www.cs.utah.edu">School of Computing</a> at the
<a href="http://www.utah.edu">University of Utah</a>.
There are also installations of the Emulab software at more than
<a href="http://users.emulab.net/trac/emulab/wiki/OtherEmulabs">two
dozen sites</a> around the world, ranging from testbeds with a handful
of nodes up to testbeds with hundreds of nodes.
Emulab is <a href="http://www.emulab.net/expubs.php">widely used</a>
by computer science researchers in the fields of networking and
distributed systems.
It is also designed to support <a href="http://users.emulab.net/trac/emulab/wiki/Education">education</a>, and has been used to <a href="http://users.emulab.net/trac/emulab/wiki/Classes">teach
classes</a> in those fields.
</p>
<?php
#
# Allow for a site specific front page
#
$sitefile = "index-" . strtolower($THISHOMEBASE) . ".html";
if (!file_exists($sitefile)) {
if ($TBMAINSITE && !$ISALTDOMAIN)
$sitefile = "index-mainsite.html";
else
$sitefile = "index-nonmain.html";
}
readfile("$sitefile");
#
# Standard Testbed Footer
#
PAGEFOOTER();
?>
<!--
Copyright (c) 2000-2004 University of Utah and the Flux Group.
Copyright (c) 2000-2018 University of Utah and the Flux Group.
{{{EMULAB-LICENSE
......@@ -24,7 +24,7 @@
<html>
<head>
<title>Emulab.Net</title>
<META HTTP-EQUIV="Refresh" Content= "0; URL=index.php3" ALT="Emulab home page">
<META HTTP-EQUIV="Refresh" Content= "0; URL=portal/frontpage.php" ALT="Emulab home page">
</head>
</html>
......
<?php
#
# Copyright (c) 2000-2009 University of Utah and the Flux Group.
# Copyright (c) 2000-2018 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
......@@ -21,102 +21,5 @@
#
# }}}
#
require("defs.php3");
$optargs = OptionalPageArguments("stayhome", PAGEARG_BOOLEAN);
#
# The point of this is to redirect logged in users to their My Emulab
# page.
#
if (($this_user = CheckLogin($check_status))) {
$check_status = $check_status & CHECKLOGIN_STATUSMASK;
if ($check_status == CHECKLOGIN_MAYBEVALID) {
# Maybe the reason was because they where not using HTTPS ...
RedirectHTTPS();
}
if (($firstinitstate = TBGetFirstInitState())) {
unset($stayhome);
}
if (!isset($stayhome)) {
if ($check_status == CHECKLOGIN_LOGGEDIN) {
if ($firstinitstate == "createproject") {
# Zap to NewProject Page,
header("Location: $TBBASE/newproject.php3");
}
else {
# Zap to My Emulab page.
header("Location: $TBBASE/".
CreateURL("showuser", $this_user));
}
return;
}
}
# Fall through; display the page.
}
#
# Standard Testbed Header
#
PAGEHEADER("Emulab - Network Emulation Testbed Home",NULL,$RSS_HEADER_NEWS);
#
# Special banner message.
#
$message = TBGetSiteVar("web/banner");
if ($message != "") {
echo "<center><font color=Red size=+1>\n";
echo "$message\n";
echo "</font></center><br>\n";
}
if ($TBMAINSITE && !$ISALTDOMAIN) {
echo "<span class='picture'>
<center><font size=-1>In Memoriam</font></center><a href=jay.php>
<img width=80 height=85 src=jay.jpg></a><br clear=left>
<center><font size=-1>Jay Lepreau<br>03/52--09/08
</font></center></span><br>\n";
}
?>
<p>
<em>Emulab</em> is a network testbed, giving researchers a wide range of
environments in which to develop, debug, and evaluate their systems.
The name Emulab refers both to a <strong>facility</strong> and to a
<strong>software system</strong>.
The <a href="http://www.emulab.net">primary Emulab installation</a> is run
by the
<a href="http://www.flux.utah.edu">Flux Group</a>, part of the
<a href="http://www.cs.utah.edu">School of Computing</a> at the
<a href="http://www.utah.edu">University of Utah</a>.
There are also installations of the Emulab software at more than
<a href="http://users.emulab.net/trac/emulab/wiki/OtherEmulabs">two
dozen sites</a> around the world, ranging from testbeds with a handful
of nodes up to testbeds with hundreds of nodes.
Emulab is <a href="http://www.emulab.net/expubs.php">widely used</a>
by computer science researchers in the fields of networking and
distributed systems.
It is also designed to support <a href="http://users.emulab.net/trac/emulab/wiki/Education">education</a>, and has been used to <a href="http://users.emulab.net/trac/emulab/wiki/Classes">teach
classes</a> in those fields.
</p>
<?php
#
# Allow for a site specific front page
#
$sitefile = "index-" . strtolower($THISHOMEBASE) . ".html";
if (!file_exists($sitefile)) {
if ($TBMAINSITE && !$ISALTDOMAIN)
$sitefile = "index-mainsite.html";
else
$sitefile = "index-nonmain.html";
}
readfile("$sitefile");
#
# Standard Testbed Footer
#
PAGEFOOTER();
header("Location: portal/frontpage.php");
?>
<?php
#
# Copyright (c) 2000-2014 University of Utah and the Flux Group.
# Copyright (c) 2000-2014, 2018 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
......@@ -69,10 +69,7 @@ if ($this_user) {
$returning = 1;
}
else {
#
# No uid, so must be new.
#
$returning = 0;
header("Location: portal/signup.php?joinproject=1");
}
if ($old_forwikionly == True) {
......
<?php
#
# Copyright (c) 2000-2014 University of Utah and the Flux Group.
# Copyright (c) 2000-2014, 2018 University of Utah and the Flux Group.
#
# {{{EMULAB-LICENSE
#
......@@ -61,12 +61,14 @@ if ($this_user && !$FirstInitState) {
$proj_head_uid = $this_user->uid();
$returning = 1;
}
else {
#
# No uid, so must be new.
#
elseif ($FirstInitState) {
# Initial setup of new site.
$returning = 0;
}
else {
header("Location: portal/signup.php");
}
unset($addpubkeyargs);
$ACCOUNTWARNING =
......
......@@ -370,6 +370,8 @@ class User
function weblogin_last() { return $this->stats("weblogin_last"); }
function portal() { return $this->field("portal"); }
function ga_userid() { return $this->field("ga_userid"); }
function portal_interface_warned() {
return $this->field("portal_interface_warned"); }
function isAPT() { return ($this->portal() &&
$this->portal() == "aptlab" ? 1 : 0); }
function isCloud() { return ($this->portal() &&
......@@ -1245,6 +1247,15 @@ class User
$this->user["stud"] = $onoff;
return 0;
}
function SetPortalWarned() {
$idx = $this->uid_idx();
DBQueryFatal("update users set ".
" portal_interface_warned='1' ".
"where uid_idx='$idx'");
$this->user["portal_interface_warned"] = 1;
return 0;
}
function UpdateWebLoginFail() {
$idx = $this->uid_idx();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment