aboutsummaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/authng/diff/authng-guiconfig.inc.diff15
-rw-r--r--packages/authng/pkg/authng.inc245
-rw-r--r--packages/authng/pkg/authng_classdefs.inc34
-rw-r--r--packages/authng/pkg/authng_peers.inc64
-rw-r--r--packages/authng/pkg/authng_usermanager.inc247
-rw-r--r--packages/authng/www/php/head.inc22
-rw-r--r--packages/authng/www/php/system_usermanager.php458
-rw-r--r--packages/authng/www/php/system_usermanager_admin.inc92
-rw-r--r--packages/authng/www/php/system_usermanager_admin_index.inc108
-rw-r--r--packages/authng/www/php/system_usermanager_admin_newedit.inc167
-rw-r--r--packages/authng/www/php/system_usermanager_user.inc66
-rw-r--r--packages/authng/www/wizards/authng_wizard.xml496
12 files changed, 1522 insertions, 492 deletions
diff --git a/packages/authng/diff/authng-guiconfig.inc.diff b/packages/authng/diff/authng-guiconfig.inc.diff
index 35b4f3aa..e65ae8b8 100644
--- a/packages/authng/diff/authng-guiconfig.inc.diff
+++ b/packages/authng/diff/authng-guiconfig.inc.diff
@@ -6,11 +6,22 @@ diff -u -r1.90.2.31.2.3 guiconfig.inc
--- guiconfig.inc 10 May 2007 20:49:41 -0000 1.90.2.31.2.3
+++ guiconfig.inc 9 Sep 2007 19:43:31 -0000
@@ -41,7 +41,7 @@
-
+
/* Include authentication routines */
/* THIS MUST BE ABOVE ALL OTHER CODE */
-require_once("auth.inc");
+require_once("authng_authgui.inc");
-
+
/* parse the configuration and include all configuration functions */
require_once("config.inc");
+@@ -574,10 +574,6 @@
+
+ usort($config['shaper']['rule'], "rqpcmp");
+ }
+-function gentitle($pgname) {
+- global $config;
+- return $config['system']['hostname'] . "." . $config['system']['domain'] . " - " . $pgname;
+-}
+
+ /* update the changedesc and changecount(er) variables */
+ function update_changedesc($update) {
diff --git a/packages/authng/pkg/authng.inc b/packages/authng/pkg/authng.inc
index 509f5a18..06774acd 100644
--- a/packages/authng/pkg/authng.inc
+++ b/packages/authng/pkg/authng.inc
@@ -36,8 +36,13 @@
*/
/* ========================================================================== */
+/* PHP classes like factories users, and groups */
+require_once("authng_classdefs.inc");
+/* PHP classes representing specific auth methods */
require_once("authng_authmethods.inc");
+/* PHP classes representing specific backends */
require_once("authng_backends.inc");
+/* PHP peer classes that are providing a persistence layer */
require_once("authng_peers.inc");
// TODO: Define user- and groupindex array
@@ -61,9 +66,242 @@ $authMethod =& $authMethodFactory->getAuthMethodByName($config['system']['webgui
// get the actual backend
$backend =& $backendFactory->getBackendByName($config['system']['webgui']['backing_method']);
-function syncPackageAuthNG() {
+function getUsermanagerPagetitle() {
+ global $userPeer;
+
+ $result = "";
+
+ if ($userPeer->isSystemAdmin($HTTP_SERVER_VARS['AUTH_USER'])) {
+ // Page title for admins
+ $result = array(gettext("System"), gettext("User manager"));
+ } else {
+ // Page title for non-admins
+ $result = array(gettext("System"), gettext("User password"));
+ }
+
+ return $result;
+}
+
+function processUserManagerPostVars() {
+ global $input_errors, $savemsg, $config;
+
+ if (isset($_POST['save'])) {
+ unset($input_errors);
+
+ /* input validation */
+ $reqdfields = explode(" ", "passwordfld1");
+ $reqdfieldsn = explode(",", "Password");
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
+
+ if ($_POST['passwordfld1'] != $_POST['passwordfld2'])
+ $input_errors[] = "The passwords do not match.";
+
+ if (!$input_errors) {
+ // all values are okay --> saving changes
+ $config['system']['user'][$userindex[$HTTP_SERVER_VARS['AUTH_USER']]]['password'] = crypt(trim($_POST['passwordfld1']));
+
+ write_config();
+
+ sync_webgui_passwords();
+
+ $retval = system_password_configure();
+ $savemsg = get_std_save_message($retval);
+ $savemsg = "Password successfully changed<br />";
+ }
+ }
+}
+
+function processUserManagerAdminPostVars() {
+ global $config;
+
+ $id = $_GET['id'];
+ if (isset($_POST['id']))
+ $id = $_POST['id'];
+
+ if (!is_array($config['system']['user'])) {
+ $config['system']['user'] = array();
+ }
+
+ admin_users_sort();
+ $a_user = &$config['system']['user'];
+ $t_privs = $a_user[$id]['priv'];
+
+ if ($_GET['act'] == "del" && $_GET['what'] == "user") {
+ if ($a_user[$_GET['id']]) {
+ $userdeleted = $a_user[$_GET['id']]['name'];
+ unset($a_user[$_GET['id']]);
+ write_config();
+ $retval = system_password_configure();
+ $savemsg = get_std_save_message($retval);
+ $savemsg = gettext("User") . " " . $userdeleted . " " . gettext("successfully deleted") . "<br />";
+ }
+ } else if ($_GET['act'] == "del" && $_GET['what'] == "priv") {
+ if ($t_privs[$_GET['privid']]) {
+ $privdeleted = $t_privs[$_GET['privid']]['id'];
+ unset($t_privs[$_GET['privid']]);
+ write_config();
+ $_GET['act'] = "edit";
+ $retval = 0;
+ $savemsg = get_std_save_message($retval);
+ $savemsg = gettext("Privilege") . " " . $privdeleted . " " . gettext("of user") . " " . $a_user[$_GET['id']]['name'] . " " . gettext("successfully deleted") . "<br />";
+ }
+ }
+
+ if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if (isset($id) && ($a_user[$id])) {
+ $reqdfields = explode(" ", "usernamefld");
+ $reqdfieldsn = explode(",", "Username");
+ } else {
+ $reqdfields = explode(" ", "usernamefld passwordfld1");
+ $reqdfieldsn = explode(",", "Username,Password");
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
+
+ if (hasShellAccess($_POST['usernamefld'])) {
+ if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['usernamefld']))
+ $input_errors[] = gettext("The username contains invalid characters.");
+ } else {
+ if (preg_match("/[^a-zA-Z0-9\@\.\-_]/", $_POST['usernamefld']))
+ $input_errors[] = gettext("The username contains invalid characters.");
+ }
+
+ if (($_POST['passwordfld1']) && ($_POST['passwordfld1'] != $_POST['passwordfld2']))
+ $input_errors[] = gettext("The passwords do not match.");
+
+ if (!$input_errors && !(isset($id) && $a_user[$id])) {
+ /* make sure there are no dupes */
+ foreach ($a_user as $userent) {
+ if ($userent['name'] == $_POST['usernamefld']) {
+ $input_errors[] = gettext("Another entry with the same username already exists.");
+ break;
+ }
+ }
+ }
+
+ if ($pconfig['utype'] <> "system" && !isset($groupindex[$_POST['groupname']])) {
+ $input_errors[] = gettext("group does not exist, please define the group before assigning users.");
+ }
+
+ if (isset($config['system']['ssh']['sshdkeyonly']) &&
+ empty($_POST['authorizedkeys'])) {
+ $input_errors[] = gettext("You must provide an authorized key otherwise you won't be able to login into this system.");
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+ if (isset($id) && $a_user[$id])
+ $userent = $a_user[$id];
+
+ /* the user did change his username */
+ if ($_POST['usernamefld'] <> $_POST['oldusername']) {
+ $_SERVER['REMOTE_USER'] = $_POST['usernamefld'];
+ }
+
+ $userent['name'] = $_POST['usernamefld'];
+ $userent['fullname'] = $_POST['fullname'];
+ if ($pconfig['utype'] <> "system") {
+ $userent['groupname'] = $_POST['groupname'];
+ }
+ isset($_POST['utype']) ? $userent['scope'] = $_POST['utype'] : $userent['scope'] = "system";
+
+ if ($_POST['passwordfld1'])
+ $userent['password'] = crypt($_POST['passwordfld1']);
+
+ if(isset($config['system']['ssh']['sshdkeyonly'])) {
+ $userent['authorizedkeys'] = base64_encode($_POST['authorizedkeys']);
+ }
+
+ if (isset($id) && $a_user[$id])
+ $a_user[$id] = $userent;
+ else
+ $a_user[] = $userent;
+
+ write_config();
+ $retval = system_password_configure();
+ sync_webgui_passwords();
+
+ pfSenseHeader("system_usermanager.php");
+ }
+ }
+}
+
+/**
+ * getWindowJSScriptRefs()
+ *
+ * @return
+ */
+function getWindowJSScriptRefs(){
+ $result = array('<script type="text/javascript" src="/javascript/windows-js/javascript/window.js"></script>',
+ '<script type="text/javascript" src="/javascript/windows-js/javascript/window_effects.js"></script>',
+ '<script type="text/javascript" src="/javascript/windows-js/javascript/debug.js"></script>');
+
+ return $result;
+}
+
+function gotNoUsers() {
+ global $config;
+ return empty($config['installedpackages']['authng']['config']);
+}
+
+/**
+ * openNoUserDefsDialog()
+ *
+ * @param mixed $effectClass
+ * @return
+ */
+function openNoUserDefsDialog($effectClass) {
+ if (gotNoUsers()) {
+ $alertMessage = gettext("No users or groups found. You will be forwarded to the AuthNG wizard to be able to define users and groups.");
+ $dialogScript = "
+ <script type='text/javascript'>
+ var anchor = document.getElementById('popupanchor');
+
+ function forwardToWizard() {
+ window.location.href = '/wizard.php?xml=authng_wizard.xml';
+ }
+
+ function openNoUserDefsDialog(html) {
+ var effect = new PopupEffect(html, {className: '${effectClass}'});
+ Dialog.alert('${alertMessage}',{className:'alphacube', top:150, width:400, height:null, showEffect:effect.show.bind(effect), hideEffect:effect.hide.bind(effect), onOk:forwardToWizard});
+ }
+
+ openNoUserDefsDialog(anchor);
+ </script>
+ ";
+
+ return $dialogScript;
+ }
+}
+
+/**
+ * getWindowJSStyleRefs()
+ *
+ * @return
+ */
+function getWindowJSStyleRefs(){
+ $result = array('<link href="/javascript/windows-js/themes/default.css" rel="stylesheet" type="text/css" />',
+ '<link href="/javascript/windows-js/themes/alert.css" rel="stylesheet" type="text/css" />',
+ '<link href="/javascript/windows-js/themes/alphacube.css" rel="stylesheet" type="text/css" />');
+
+ return $result;
}
+/**
+ * installPackageAuthNG()
+ *
+ * @return
+ */
function installPackageAuthNG() {
mwexec("cd / && /usr/bin/patch < /usr/local/pkg/authng-pfSenseHead.diff");
mwexec("cd / && /usr/bin/patch < /usr/local/pkg/authng-fbegin.inc.diff");
@@ -71,6 +309,11 @@ function installPackageAuthNG() {
mwexec("cd / && /usr/bin/patch < /usr/local/pkg/authng-globals.inc.diff");
}
+/**
+ * deinstallPackageAuthNG()
+ *
+ * @return
+ */
function deinstallPackageAuthNG() {
mwexec("cd / && /usr/bin/patch -R < /usr/local/pkg/authng-pfSenseHead.diff");
mwexec("cd / && /usr/bin/patch -R < /usr/local/pkg/authng-fbegin.inc.diff");
diff --git a/packages/authng/pkg/authng_classdefs.inc b/packages/authng/pkg/authng_classdefs.inc
index 7315bb6f..64f0ff14 100644
--- a/packages/authng/pkg/authng_classdefs.inc
+++ b/packages/authng/pkg/authng_classdefs.inc
@@ -67,19 +67,19 @@ class SingletonInterface extends Object {
}
}
-class AuthMethodFactory extends SingletonInterface {
+class BackendFactory extends SingletonInterface {
function __construct() {
// Perform object initialization here.
parent::__construct();
}
function &getInstance() {
- return parent::__getInstanceImp('AuthMethodFactory');
+ return parent::__getInstanceImp('BackendFactory');
}
-
- function &getAuthMethodByName($name) {
+
+ function &getBackendByName($name) {
$result = null;
-
+
/* Each name links to an entry in config.xml
* Example: <auth_method>session</auth_method>
*/
@@ -101,24 +101,24 @@ class AuthMethodFactory extends SingletonInterface {
break;
default:
}
-
+
return $result;
}
}
-class BackendFactory extends SingletonInterface {
+class AuthMethodFactory extends SingletonInterface {
function __construct() {
// Perform object initialization here.
parent::__construct();
}
function &getInstance() {
- return parent::__getInstanceImp('BackendFactory');
+ return parent::__getInstanceImp('AuthMethodFactory');
}
-
- function &getBackendByName($name) {
+
+ function &getAuthMethodByName($name) {
$result = null;
-
+
/* Each name links to an entry in config.xml
* Example: <backing_method>htpasswd</backing_method>
*/
@@ -131,7 +131,7 @@ class BackendFactory extends SingletonInterface {
break;
default:
}
-
+
return $result;
}
}
@@ -154,7 +154,7 @@ class AuthngAuxiliary {
return $adminUsers;
} // end function
-
+
function assignUID($username = "") {
global $userindex, $config, $g;
@@ -323,19 +323,19 @@ class AuthngUser {
/* ========================================================================== */
/* == Accessors == */
/* ========================================================================== */
-
+
function isSystemAdmin() {
return $this->systemAdmin;
}
-
+
function setIsSystemAdmin($flag = false) {
$this->systemAdmin = $flag;
}
-
+
function isUNIXRoot() {
return $this->unixRoot;
}
-
+
function setIsUNIXRoot($flag = false) {
$this->unixRoot = $flag;
}
diff --git a/packages/authng/pkg/authng_peers.inc b/packages/authng/pkg/authng_peers.inc
index e1640edc..bce3c494 100644
--- a/packages/authng/pkg/authng_peers.inc
+++ b/packages/authng/pkg/authng_peers.inc
@@ -36,8 +36,6 @@
*/
/* ========================================================================== */
-require_once("authng_classdefs.inc");
-
class PeerFactory extends SingletonInterface {
function __construct() {
// Perform object initialization here.
@@ -47,10 +45,10 @@ class PeerFactory extends SingletonInterface {
function &getInstance() {
return parent::__getInstanceImp('PeerFactory');
}
-
+
function &getGroupPeerByPrincipalStore($store) {
$result = null;
-
+
/* Each name links to an entry in config.xml
* Example: <principal_store>xml</principal_store>
*/
@@ -66,13 +64,13 @@ class PeerFactory extends SingletonInterface {
break;
default:
}
-
+
return $result;
}
-
+
function &getUserPeerByPrincipalStore($store) {
$result = null;
-
+
/* Each name links to an entry in config.xml
* Example: <principal_store>xml</principal_store>
*/
@@ -88,7 +86,7 @@ class PeerFactory extends SingletonInterface {
break;
default:
}
-
+
return $result;
}
}
@@ -116,11 +114,11 @@ class AbstractPrivilegePeer {
/* ========================================================================== */
/* == Accessors == */
/* ========================================================================== */
-
+
function setUserPeer($peer) {
$this->userPeer = $peer;
}
-
+
function getUserPeer() {
return $this->userPeer;
}
@@ -194,19 +192,19 @@ class AbstractUserPeer {
function getUserByIndex($index) {
return $this->users[$index];
}
-
+
function getUserByName($username) {
return $this->users[$username];
}
-
+
function isSystemAdmin($username) {
$result = false;
$user = $this->getUserByName($username);
-
+
if ($user) {
$result = $user->isSystemAdmin();
}
-
+
return $result;
}
}
@@ -245,19 +243,19 @@ class AbstractGroupPeer {
function getGroupByIndex($index) {
return $this->groups[$index];
}
-
+
function getGroupByName($groupname) {
return $this->groups[$groupname];
}
-
+
function getGroupHomePage($groupname) {
$result = false;
$group = $this->getGroupByName($groupname);
-
+
if ($group) {
$result = $group->getHome();
}
-
+
return $result;
}
}
@@ -276,11 +274,11 @@ class XMLPrivilegePeer extends AbstractPrivilegePeer {
function XMLPrivilegePeer($userPeer) {
global $g, $config;
-
+
parent::AbstractPrivilegePeer();
-
+
$this->setUserPeer($peer);
-
+
foreach ($peer->users as $userent) {
foreach ($userent->getPrivileges() as $privent) {
$this->privileges[$userent->getName()] = $privent;
@@ -311,22 +309,22 @@ class XMLPrivilegePeer extends AbstractPrivilegePeer {
$userid = getPrivilegeIndexByName($username);
$user = $config['system']['user'][$userid];
}
-
+
function setFullName($id, $name) {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['fullname'] = $name;
}
-
+
function setGroupName($id, $name) {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['groupname'] = $name;
}
-
+
function setPassword($id, $pwd) {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['password'] = $pwd;
}
-
+
function setUid($id, $uid) {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['uid'] = $uid;
@@ -347,7 +345,7 @@ class XMLUserPeer extends AbstractUserPeer {
function XMLUserPeer() {
global $g, $config;
-
+
parent::AbstractUserPeer();
if (isset($config['system']['user'])) {
@@ -358,7 +356,7 @@ class XMLUserPeer extends AbstractUserPeer {
$this->addUserFromEnt($userent);
$i++;
}
- }
+ }
}
/* ========================================================================== */
@@ -384,7 +382,7 @@ class XMLUserPeer extends AbstractUserPeer {
$newPrivilege->setId($privent['id']);
$newPrivilege->setName($privent['name']);
$newPrivilege->setDescription($privent['description']);
-
+
$newUser->addPrivilege($newPrivilege);
}
}
@@ -396,22 +394,22 @@ class XMLUserPeer extends AbstractUserPeer {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['name'] = $name;
}
-
+
function setFullName($id, $name) {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['fullname'] = $name;
}
-
+
function setGroupName($id, $name) {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['groupname'] = $name;
}
-
+
function setPassword($id, $pwd) {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['password'] = $pwd;
}
-
+
function setUid($id, $uid) {
$userid = getUserIndexByName($id);
$config['system']['user'][$userid]['uid'] = $uid;
@@ -432,7 +430,7 @@ class XMLGroupPeer extends AbstractGroupPeer {
function XMLGroupPeer() {
global $g, $config;
-
+
parent::AbstractGroupPeer();
if (isset($config['system']['group'])) {
diff --git a/packages/authng/pkg/authng_usermanager.inc b/packages/authng/pkg/authng_usermanager.inc
new file mode 100644
index 00000000..f96759fb
--- /dev/null
+++ b/packages/authng/pkg/authng_usermanager.inc
@@ -0,0 +1,247 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ authng_usermanager.inc
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2007 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Based on m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+
+function initUserFromGetVars() {
+ if ($_GET['act'] == "edit") {
+ if (isset($id) && $a_user[$id]) {
+ $pconfig['usernamefld'] = $a_user[$id]['name'];
+ $pconfig['fullname'] = $a_user[$id]['fullname'];
+ $pconfig['groupname'] = $a_user[$id]['groupname'];
+ $pconfig['utype'] = $a_user[$id]['scope'];
+ $pconfig['authorizedkeys'] = base64_decode($a_user[$id]['authorizedkeys']);
+ }
+ } else if ($_GET['act'] == "new") {
+ /* set this value cause the text field is read only
+ * and the user should not be able to mess with this
+ * setting.
+ */
+ $pconfig['utype'] = "user";
+ }
+}
+function processUserManagerPostVarsUser() {
+ if (isset($_POST['save'])) {
+ unset($input_errors);
+
+ /* input validation */
+ $reqdfields = explode(" ", "passwordfld1");
+ $reqdfieldsn = explode(",", "Password");
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
+
+ if ($_POST['passwordfld1'] != $_POST['passwordfld2'])
+ $input_errors[] = "The passwords do not match.";
+
+ if (!$input_errors) {
+ // all values are okay --> saving changes
+ $config['system']['user'][$userindex[$HTTP_SERVER_VARS['AUTH_USER']]]['password'] = crypt(trim($_POST['passwordfld1']));
+
+ write_config();
+
+ sync_webgui_passwords();
+
+ $retval = system_password_configure();
+ $savemsg = get_std_save_message($retval);
+ $savemsg = "Password successfully changed<br />";
+ }
+ }
+}
+
+function processUserManagerPostVarsAdmin() {
+ $id = $_GET['id'];
+ if (isset($_POST['id']))
+ $id = $_POST['id'];
+
+ if (!is_array($config['system']['user'])) {
+ $config['system']['user'] = array();
+ }
+
+ admin_users_sort();
+ $a_user = &$config['system']['user'];
+ $t_privs = $a_user[$id]['priv'];
+
+ if ($_GET['act'] == "del" && $_GET['what'] == "user") {
+ if ($a_user[$_GET['id']]) {
+ $userdeleted = $a_user[$_GET['id']]['name'];
+ unset($a_user[$_GET['id']]);
+ write_config();
+ $retval = system_password_configure();
+ $savemsg = get_std_save_message($retval);
+ $savemsg = gettext("User") . " " . $userdeleted . " " . gettext("successfully deleted") . "<br />";
+ }
+ } else if ($_GET['act'] == "del" && $_GET['what'] == "priv") {
+ if ($t_privs[$_GET['privid']]) {
+ $privdeleted = $t_privs[$_GET['privid']]['id'];
+ unset($t_privs[$_GET['privid']]);
+ write_config();
+ $_GET['act'] = "edit";
+ $retval = 0;
+ $savemsg = get_std_save_message($retval);
+ $savemsg = gettext("Privilege") . " " . $privdeleted . " " . gettext("of user") . " " . $a_user[$_GET['id']]['name'] . " " . gettext("successfully deleted") . "<br />";
+ }
+ }
+
+ if ($_POST) {
+ unset($input_errors);
+ $pconfig = $_POST;
+
+ /* input validation */
+ if (isset($id) && ($a_user[$id])) {
+ $reqdfields = explode(" ", "usernamefld");
+ $reqdfieldsn = explode(",", "Username");
+ } else {
+ $reqdfields = explode(" ", "usernamefld passwordfld1");
+ $reqdfieldsn = explode(",", "Username,Password");
+ }
+
+ do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
+
+ if (hasShellAccess($_POST['usernamefld'])) {
+ if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['usernamefld']))
+ $input_errors[] = gettext("The username contains invalid characters.");
+ } else {
+ if (preg_match("/[^a-zA-Z0-9\@\.\-_]/", $_POST['usernamefld']))
+ $input_errors[] = gettext("The username contains invalid characters.");
+ }
+
+ if (($_POST['passwordfld1']) && ($_POST['passwordfld1'] != $_POST['passwordfld2']))
+ $input_errors[] = gettext("The passwords do not match.");
+
+ if (!$input_errors && !(isset($id) && $a_user[$id])) {
+ /* make sure there are no dupes */
+ foreach ($a_user as $userent) {
+ if ($userent['name'] == $_POST['usernamefld']) {
+ $input_errors[] = gettext("Another entry with the same username already exists.");
+ break;
+ }
+ }
+ }
+
+ if ($pconfig['utype'] <> "system" && !isset($groupindex[$_POST['groupname']])) {
+ $input_errors[] = gettext("group does not exist, please define the group before assigning users.");
+ }
+
+ if (isset($config['system']['ssh']['sshdkeyonly']) &&
+ empty($_POST['authorizedkeys'])) {
+ $input_errors[] = gettext("You must provide an authorized key otherwise you won't be able to login into this system.");
+ }
+
+ /* if this is an AJAX caller then handle via JSON */
+ if (isAjax() && is_array($input_errors)) {
+ input_errors2Ajax($input_errors);
+ exit;
+ }
+
+ if (!$input_errors) {
+ if (isset($id) && $a_user[$id])
+ $userent = $a_user[$id];
+
+ /* the user did change his username */
+ if ($_POST['usernamefld'] <> $_POST['oldusername']) {
+ $_SERVER['REMOTE_USER'] = $_POST['usernamefld'];
+ }
+
+ $userent['name'] = $_POST['usernamefld'];
+ $userent['fullname'] = $_POST['fullname'];
+ if ($pconfig['utype'] <> "system") {
+ $userent['groupname'] = $_POST['groupname'];
+ }
+ isset($_POST['utype']) ? $userent['scope'] = $_POST['utype'] : $userent['scope'] = "system";
+
+ if ($_POST['passwordfld1'])
+ $userent['password'] = crypt($_POST['passwordfld1']);
+
+ if(isset($config['system']['ssh']['sshdkeyonly'])) {
+ $userent['authorizedkeys'] = base64_encode($_POST['authorizedkeys']);
+ }
+
+ if (isset($id) && $a_user[$id])
+ $a_user[$id] = $userent;
+ else
+ $a_user[] = $userent;
+
+ write_config();
+ $retval = system_password_configure();
+ sync_webgui_passwords();
+
+ pfSenseHeader("system_usermanager.php");
+ }
+ }
+}
+
+/**
+ * getWindowJSScriptRefs()
+ *
+ * @return
+ */
+function getWindowJSScriptRefs(){
+ $result = array('<script type="text/javascript" src="/javascripts/windows-js/javascript/effects.js"></script>',
+ '<script type="text/javascript" src="/javascripts/windows-js/javascript/window.js"></script>',
+ '<script type="text/javascript" src="/javascripts/windows-js/javascript/window_effects.js"></script>',
+ '<script type="text/javascript" src="/javascripts/windows-js/javascript/window_effects.js"></script>',
+ '<script type="text/javascript" src="/javascripts/windows-js/javascript/debug.js"></script>');
+
+ return $result;
+}
+
+/**
+ * openNoUserDefsDialog()
+ *
+ * @param mixed $effectClass
+ * @return
+ */
+function openNoUserDefsDialog($effectClass) {
+ if (empty($config['installedpackages']['authng']['config'])) {
+ $alertMessage = gettext("No users or group found. You will be forwarded to the AuthNG wizard to be able to define users and groups.");
+ $dialogScript = "
+ <script type='text/javascript'>
+ function forwardToWizard() {
+ window.location.href = '/wizard.php?xml=authng_wizard.xml';
+ }
+
+ function openNoUserDefsDialog(html) {
+ var effect = new PopupEffect(html, {className: '${effectClass}'});
+ Dialog.alert('${alertMessage},{className:'alphacube', width: 400, height:null, showEffect:effect.show.bind(effect), hideEffect:effect.hide.bind(effect), onOk:forwardToWizard});
+ }
+ </script>
+ ";
+
+ return $dialogScript;
+ }
+}
+
+?> \ No newline at end of file
diff --git a/packages/authng/www/php/head.inc b/packages/authng/www/php/head.inc
index dbbf7a49..5365c715 100644
--- a/packages/authng/www/php/head.inc
+++ b/packages/authng/www/php/head.inc
@@ -49,15 +49,15 @@ if($config['theme'] <> "") {
// navigation level separator string
$navlevelsep = ": ";
-//function gentitle($title) {
-// global $navlevelsep;
-//
-// if(!is_array($title)) {
-// return $title;
-// }
-//
-// return join($navlevelsep, $title);
-//}
+function gentitle($title) {
+ global $navlevelsep;
+
+ if(!is_array($title)) {
+ return $title;
+ }
+
+ return join($navlevelsep, $title);
+}
function genhtmltitle($title) {
global $config;
@@ -228,7 +228,7 @@ class pfSenseHTMLHead
var $link = array();
var $script = array();
var $style = array();
- var $html = "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"%LANG%\" lang=\"%LANG%\">\n<head>\n<title>%TITLE%</title>\n%META%\n%STYLE%\n%LINK%\n%SCRIPT%";
+ var $html = "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n<head>\n<title>%TITLE%</title>\n%META%\n%STYLE%\n%LINK%\n%SCRIPT%";
var $closehead = true;
var $returnedHTML = false;
var $allCSSID = "NOT-SET";
@@ -639,7 +639,7 @@ class pfSenseHTMLHead
$this->html = str_replace("%STYLE%", $stylestr, $this->html);
$this->html = str_replace("%LINK%", $linkstr, $this->html);
$this->html = str_replace("%SCRIPT%", $scriptstr, $this->html);
- $this->html = str_replace("%LANG%", $language, $this->html);
+ //$this->html = str_replace("%LANG%", $language, $this->html);
$this->html = $this->xmlHead . $this->docType . $this->html;
$this->returnedHTML = true;
diff --git a/packages/authng/www/php/system_usermanager.php b/packages/authng/www/php/system_usermanager.php
index 1af4bdc3..0a13be95 100644
--- a/packages/authng/www/php/system_usermanager.php
+++ b/packages/authng/www/php/system_usermanager.php
@@ -38,445 +38,47 @@
require("guiconfig.inc");
// The page title for non-admins
-$pgtitle = array(gettext("System"), gettext("User password"));
+$pgtitle = getUsermanagerPagetitle();
-if ($userPeer->isSystemAdmin($HTTP_SERVER_VARS['AUTH_USER'])) {
- // Page title for main admin
- $pgtitle = array(gettext("System"), gettext("User manager"));
+include("head.inc");
- $id = $_GET['id'];
- if (isset($_POST['id']))
- $id = $_POST['id'];
-
- if (!is_array($config['system']['user'])) {
- $config['system']['user'] = array();
- }
-
- admin_users_sort();
- $a_user = &$config['system']['user'];
- $t_privs = $a_user[$id]['priv'];
-
- if ($_GET['act'] == "del" && $_GET['what'] == "user") {
- if ($a_user[$_GET['id']]) {
- $userdeleted = $a_user[$_GET['id']]['name'];
- unset($a_user[$_GET['id']]);
- write_config();
- $retval = system_password_configure();
- $savemsg = get_std_save_message($retval);
- $savemsg = gettext("User") . " " . $userdeleted . " " . gettext("successfully deleted") . "<br />";
- }
- } else if ($_GET['act'] == "del" && $_GET['what'] == "priv") {
- if ($t_privs[$_GET['privid']]) {
- $privdeleted = $t_privs[$_GET['privid']]['id'];
- unset($t_privs[$_GET['privid']]);
- write_config();
- $_GET['act'] = "edit";
- $retval = 0;
- $savemsg = get_std_save_message($retval);
- $savemsg = gettext("Privilege") . " " . $privdeleted . " " . gettext("of user") . " " . $a_user[$_GET['id']]['name'] . " " . gettext("successfully deleted") . "<br />";
- }
- }
-
- if ($_POST) {
- unset($input_errors);
- $pconfig = $_POST;
-
- /* input validation */
- if (isset($id) && ($a_user[$id])) {
- $reqdfields = explode(" ", "usernamefld");
- $reqdfieldsn = explode(",", "Username");
- } else {
- $reqdfields = explode(" ", "usernamefld passwordfld1");
- $reqdfieldsn = explode(",", "Username,Password");
- }
-
- do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
-
- if (hasShellAccess($_POST['usernamefld'])) {
- if (preg_match("/[^a-zA-Z0-9\.\-_]/", $_POST['usernamefld']))
- $input_errors[] = gettext("The username contains invalid characters.");
- } else {
- if (preg_match("/[^a-zA-Z0-9\@\.\-_]/", $_POST['usernamefld']))
- $input_errors[] = gettext("The username contains invalid characters.");
- }
-
- if (($_POST['passwordfld1']) && ($_POST['passwordfld1'] != $_POST['passwordfld2']))
- $input_errors[] = gettext("The passwords do not match.");
-
- if (!$input_errors && !(isset($id) && $a_user[$id])) {
- /* make sure there are no dupes */
- foreach ($a_user as $userent) {
- if ($userent['name'] == $_POST['usernamefld']) {
- $input_errors[] = gettext("Another entry with the same username already exists.");
- break;
- }
- }
+$effectStyle = '
+ <style type="text/css">
+ .popup_nousers {
+ background: #000000;
+ opacity: 0.2;
}
-
- if ($pconfig['utype'] <> "system" && !isset($groupindex[$_POST['groupname']])) {
- $input_errors[] = gettext("group does not exist, please define the group before assigning users.");
- }
-
- if (isset($config['system']['ssh']['sshdkeyonly']) &&
- empty($_POST['authorizedkeys'])) {
- $input_errors[] = gettext("You must provide an authorized key otherwise you won't be able to login into this system.");
- }
-
- /* if this is an AJAX caller then handle via JSON */
- if (isAjax() && is_array($input_errors)) {
- input_errors2Ajax($input_errors);
- exit;
- }
-
- if (!$input_errors) {
- if (isset($id) && $a_user[$id])
- $userent = $a_user[$id];
-
- /* the user did change his username */
- if ($_POST['usernamefld'] <> $_POST['oldusername']) {
- $_SERVER['REMOTE_USER'] = $_POST['usernamefld'];
- }
-
- $userent['name'] = $_POST['usernamefld'];
- $userent['fullname'] = $_POST['fullname'];
- if ($pconfig['utype'] <> "system") {
- $userent['groupname'] = $_POST['groupname'];
- }
- isset($_POST['utype']) ? $userent['scope'] = $_POST['utype'] : $userent['scope'] = "system";
-
- if ($_POST['passwordfld1'])
- $userent['password'] = crypt($_POST['passwordfld1']);
-
- if(isset($config['system']['ssh']['sshdkeyonly'])) {
- $userent['authorizedkeys'] = base64_encode($_POST['authorizedkeys']);
- }
-
- if (isset($id) && $a_user[$id])
- $a_user[$id] = $userent;
- else
- $a_user[] = $userent;
-
- write_config();
- $retval = system_password_configure();
- sync_webgui_passwords();
-
- pfSenseHeader("system_usermanager.php");
- }
- }
-
- include("head.inc");
- echo $pfSenseHead->getHTML();
+ </style>
+';
+foreach(getWindowJSScriptRefs() as $jscript){
+ $pfSenseHead->addScript($jscript);
+}
+foreach(getWindowJSStyleRefs() as $style){
+ $pfSenseHead->addStyle($style);
+}
+$pfSenseHead->addStyle($effectStyle);
+echo $pfSenseHead->getHTML();
?>
-
-<body link="#000000" vlink="#000000" alink="#000000" onload="<?= $jsevents["body"]["onload"] ?>">
+<body link="#000000" vlink="#000000" alink="#000000">
<?php include("fbegin.inc");?>
+<p class="pgtitle"><?= gentitle($pgtitle); ?></p>
+<form action="system_usermanager.php" method="post" name="iform" id="iform">
<?php if ($input_errors) print_input_errors($input_errors);?>
<?php if ($savemsg) print_info_box($savemsg);?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td class="tabnavtbl">
-<?php
- $tab_array = array();
- $tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
- $tab_array[] = array(gettext("Group"), false, "system_groupmanager.php");
- $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
- display_top_tabs($tab_array);
-?>
- </td>
- </tr>
- <tr>
- <td class="tabcont">
-<?php
- if ($_GET['act'] == "new" || $_GET['act'] == "edit" || $input_errors) {
- if ($_GET['act'] == "edit") {
- if (isset($id) && $a_user[$id]) {
- $pconfig['usernamefld'] = $a_user[$id]['name'];
- $pconfig['fullname'] = $a_user[$id]['fullname'];
- $pconfig['groupname'] = $a_user[$id]['groupname'];
- $pconfig['utype'] = $a_user[$id]['scope'];
- $pconfig['authorizedkeys'] = base64_decode($a_user[$id]['authorizedkeys']);
- }
- } else if ($_GET['act'] == "new") {
- /* set this value cause the text field is read only
- * and the user should not be able to mess with this
- * setting.
- */
- $pconfig['utype'] = "user";
- }
-?>
- <form action="system_usermanager.php" method="post" name="iform" id="iform">
- <div id="inputerrors"></div>
- <table width="100%" border="0" cellpadding="6" cellspacing="0">
- <tr>
- <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
- <td width="78%" class="vtable">
- <input name="usernamefld" type="text" class="formfld user" id="usernamefld" size="20" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" <?php if ($pconfig['utype'] == "system") { echo "readonly=\"readonly\" "; }?>/>
- <input name="oldusername" type="hidden" id="oldusername" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" />
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncellreq" rowspan="2"><?=gettext("Password");?></td>
- <td width="78%" class="vtable">
- <input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" value="" />
- </td>
- </tr>
- <tr>
- <td width="78%" class="vtable">
- <input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" value="" />&nbsp;<?= gettext("(confirmation)"); ?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Full name");?></td>
- <td width="78%" class="vtable">
- <input name="fullname" type="text" class="formfld unknown" id="fullname" size="20" value="<?=htmlspecialchars($pconfig['fullname']);?>" <?php if ($pconfig['utype'] == "system") { echo "readonly=\"readonly\" "; }?>/>
- <br />
- <?=gettext("User's full name, for your own information only");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("User type");?></td>
- <td width="78%" class="vtable">
- <input name="utype" type="text" class="formfld unknown" id="utype" size="20" value="<?=htmlspecialchars($pconfig['utype']);?>" readonly="readonly" />
- <br />
- <?=gettext("Indicates whether this is a system (aka non-deletable) user or a user created by a particular user.");?>
- </td>
- </tr>
- <?php if (isSystemAdmin($HTTP_SERVER_VARS['AUTH_USER'])): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("User Privileges");?></td>
- <td width="78%" class="vtable">
- <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td width="5%" class="listhdrr"><?=gettext("ID");?></td>
- <td width="30%" class="listhdrr"><?=gettext("Name");?></td>
- <td width="40%" class="listhdrr"><?=gettext("Description");?></td>
- <td width="5%" class="list"></td>
- </tr>
-
- <?php if(is_array($t_privs)): ?>
- <?php $i = 0; foreach ($t_privs as $priv): ?>
- <?php if($priv['id'] <> ""): ?>
- <tr>
- <td class="listlr" <?php if($a_user[$id]['scope'] == "user") echo "ondblclick=\"document.location='system_usermanager_edit.php?id={$i}&userid={$id}&useract={$_GET['act']}';\""; ?>>
- <?=htmlspecialchars($priv['id']);?>
- </td>
- <td class="listlr" <?php if($a_user[$id]['scope'] == "user") echo "ondblclick=\"document.location='system_usermanager_edit.php?id={$i}&userid={$id}&useract={$_GET['act']}';\""; ?>>
- <?=htmlspecialchars($priv['name']);?>
- </td>
- <td class="listbg" <?php if($a_user[$id]['scope'] == "user") echo "ondblclick=\"document.location='system_usermanager_edit?id={$i}&userid={$id}&useract={$_GET['act']}';\""; ?>>
- <font color="#FFFFFF"><?=htmlspecialchars($priv['descr']);?>&nbsp;</font>
- </td>
- <td valign="middle" nowrap class="list">
- <?php if($a_user[$id]['scope'] == "user"): ?>
- <table border="0" cellspacing="0" cellpadding="1">
- <tr>
- <td valign="middle"><a href="system_usermanager_edit.php?id=<?=$i;?>&userid=<?= $id ?>&useract=<?= $_GET['act'] ?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="" /></a></td>
- <td valign="middle"><a href="system_usermanager.php?act=del&privid=<?=$i;?>&what=priv&id=<?= $id ?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="" /></a></td>
- </tr>
- </table>
- <?php endif; ?>
- </td>
- </tr>
- <?php endif; ?>
- <?php $i++; endforeach; ?>
- <?php endif; ?>
-
- <?php if($a_user[$id]['scope'] == "user"): ?>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <table border="0" cellspacing="0" cellpadding="1">
- <tr>
- <td valign="middle"><a href="system_usermanager_edit.php?userid=<?= $id ?>&useract=<?= $_GET['act'] ?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="" /></a></td>
- </tr>
- </table>
- </td>
- </tr>
- <?php endif; ?>
- </table>
- </td>
- </tr>
- <?php endif; ?>
- <?php if (isset($config['system']['ssh']['sshdkeyonly'])): ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Authorized keys");?></td>
- <td width="78%" class="vtable">
- <textarea name="authorizedkeys" cols="65" rows="7" id="authorizedkeys" class="formfld_cert" wrap="off"><?=htmlspecialchars($pconfig['authorizedkeys']);?></textarea>
- <br />
- <?=gettext("Paste an authorized keys file here.");?>
- </td>
- </tr>
- <?php endif; ?>
- <tr>
- <td width="22%" valign="top" class="vncell"><?=gettext("Group Name");?></td>
- <td width="78%" class="vtable">
- <select name="groupname" class="formselect" id="groupname" <?php if ($pconfig['utype'] == "system") { echo "disabled=\"disabled\" "; } ?>>
- <?php foreach ($config['system']['group'] as $group): ?>
- <option value="<?=$group['name'];?>" <?php if ($group['name'] == $pconfig['groupname']) { echo "selected"; } ?>>
- <?=htmlspecialchars($group['name']);?>
- </option>
- <?php endforeach;?>
- </select>
- <br />
- <?=gettext("The admin group to which this user is assigned.");?>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input id="submit" name="save" type="submit" class="formbtn" value="Save" />
- <?php if (isset($id) && $a_user[$id]): ?>
- <input name="id" type="hidden" value="<?=$id;?>" />
- <?php endif;?>
- </td>
- </tr>
- </table>
- </form>
-<?php
- } else {
-?>
- <table width="100%" border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td width="35%" class="listhdrr">Username</td>
- <td width="20%" class="listhdrr">Full name</td>
- <td width="20%" class="listhdrr">Group</td>
- <td width="10%" class="list"></td>
- </tr>
-<?php
- $i = 0;
- foreach($a_user as $userent):
-?>
- <tr ondblclick="document.location='system_usermanager.php?act=edit&id=<?=$i;?>'">
- <td class="listlr">
- <table border="0" cellpadding="0" cellspacing="0">
- <tr>
- <td align="left" valign="middle">
- <?php if($userent['scope'] == "user"): ?>
- <img src="/themes/<?=$g['theme'];?>/images/icons/icon_system-user.png" alt="User" title="User" border="0" height="20" width="20" />
- <?php else: ?>
- <img src="/themes/<?=$g['theme'];?>/images/icons/icon_system-user-grey.png" alt="User" title="User" border="0" height="20" width="20" />
- <?php endif; ?>
- &nbsp;
- </td>
- <td align="left" valign="middle">
- <?=htmlspecialchars($userent['name']);?>
- </td>
- </tr>
- </table>
- </td>
- <td class="listr"><?=htmlspecialchars($userent['fullname']);?>&nbsp;</td>
- <td class="listbg">
- <font color="white"><?=htmlspecialchars($userent['groupname']);?></font>&nbsp;
- </td>
- <td valign="middle" nowrap class="list">
- <a href="system_usermanager.php?act=edit&id=<?=$i;?>">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="edit user" alt="edit user" width="17" height="17" border="0" />
- </a>
- <?php if($userent['scope'] == "user"): ?>
- &nbsp;
- <a href="system_usermanager.php?act=del&what=user&id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this User?");?>')">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="delete user" alt="delete user" width="17" height="17" border="0" />
- </a>
- <?php endif; ?>
- </td>
- </tr>
-<?php
- $i++;
- endforeach;
-?>
- <tr>
- <td class="list" colspan="3"></td>
- <td class="list">
- <a href="system_usermanager.php?act=new">
- <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="add user" alt="add user" width="17" height="17" border="0" />
- </a>
- </td>
- </tr>
- <tr>
- <td colspan="3">
- <p>
- <?=gettext("Additional webConfigurator users can be added here. User permissions are determined by the admin group they are a member of.");?>
- </p>
- <p>
- <?=gettext("An user icon that appears grey indicates that it is a system user and thus it's only possible to modified a subset of the regular user data. Additionally such an user can't be deleted.");?>
- </p>
- </td>
- </tr>
- </table>
-<?php
- }
-?>
- </td>
- </tr>
-</table>
<?php
-} else { // end of admin user code, start of normal user code
- if (isset($_POST['save'])) {
- unset($input_errors);
-
- /* input validation */
- $reqdfields = explode(" ", "passwordfld1");
- $reqdfieldsn = explode(",", "Password");
-
- do_input_validation($_POST, $reqdfields, $reqdfieldsn, &$input_errors);
-
- if ($_POST['passwordfld1'] != $_POST['passwordfld2'])
- $input_errors[] = "The passwords do not match.";
-
- if (!$input_errors) {
- // all values are okay --> saving changes
- $config['system']['user'][$userindex[$HTTP_SERVER_VARS['AUTH_USER']]]['password'] = crypt(trim($_POST['passwordfld1']));
-
- write_config();
-
- sync_webgui_passwords();
-
- $retval = system_password_configure();
- $savemsg = get_std_save_message($retval);
- $savemsg = "Password successfully changed<br />";
+ if (! gotNoUsers()) {
+ if ($userPeer->isSystemAdmin($HTTP_SERVER_VARS['AUTH_USER'])) {
+ processUserManagerAdminPostVars();
+ require_once("system_usermanager_admin.inc");
+ } else {
+ processUserManagerPostVars();
+ require_once("system_usermanager_user.inc");
}
}
?>
-
-<?php
- include("head.inc");
- echo $pfSenseHead->getHTML();
-?>
-<?php include("fbegin.inc");?>
-<?php if ($input_errors) print_input_errors($input_errors);?>
-<?php if ($savemsg) print_info_box($savemsg);?>
- <body link="#000000" vlink="#000000" alink="#000000" onload="<?= $jsevents["body"]["onload"] ?>">
- <form action="system_usermanager.php" method="post" name="iform" id="iform">
- <table width="100%" border="0" cellpadding="6" cellspacing="0">
- <tr>
- <td colspan="2" valign="top" class="listtopic"><?=$HTTP_SERVER_VARS['AUTH_USER']?>'s Password</td>
- </tr>
- <tr>
- <td width="22%" valign="top" class="vncell" rowspan="2">Password</td>
- <td width="78%" class="vtable">
- <input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" />
- </td>
- </tr>
- <tr>
- <td width="78%" class="vtable">
- <input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" />
- &nbsp;<?=gettext("(confirmation)");?>
- <br />
- <span class="vexpl"><?=gettext("Select a new password");?></span>
- </td>
- </tr>
- <tr>
- <td width="22%" valign="top">&nbsp;</td>
- <td width="78%">
- <input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
- </td>
- </tr>
- </table>
- </form>
-<?php
-} // end of normal user code
-?>
-
+</form>
+<div id="popupanchor">&#160;</div>
+<?= openNoUserDefsDialog("popup_nousers"); ?>
<?php include("fend.inc");?>
</body>
</html>
diff --git a/packages/authng/www/php/system_usermanager_admin.inc b/packages/authng/www/php/system_usermanager_admin.inc
new file mode 100644
index 00000000..73cda74f
--- /dev/null
+++ b/packages/authng/www/php/system_usermanager_admin.inc
@@ -0,0 +1,92 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ system_usermanager_admin.inc
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2007 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Based on m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+/* ======================= P A G E F R A G M E N T ======================== */
+/* ========================================================================== */
+?>
+ <table width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td>
+<?php
+ $tab_array = array();
+ $tab_array[] = array(gettext("Users"), true, "system_usermanager.php");
+ $tab_array[] = array(gettext("Group"), false, "system_groupmanager.php");
+ $tab_array[] = array(gettext("Settings"), false, "system_usermanager_settings.php");
+ display_top_tabs($tab_array);
+?>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <div id="mainarea">
+ <table class="tabcont" width="100%" border="0" cellpadding="6" cellspacing="0">
+ <tr>
+ <td>
+ <?php
+ if ($_GET['act'] == "new" || $_GET['act'] == "edit" || $input_errors) {
+ if ($_GET['act'] == "edit") {
+ if (isset($id) && $a_user[$id]) {
+ $pconfig['usernamefld'] = $a_user[$id]['name'];
+ $pconfig['fullname'] = $a_user[$id]['fullname'];
+ $pconfig['groupname'] = $a_user[$id]['groupname'];
+ $pconfig['utype'] = $a_user[$id]['scope'];
+ $pconfig['authorizedkeys'] = base64_decode($a_user[$id]['authorizedkeys']);
+ }
+ } else if ($_GET['act'] == "new") {
+ /* set this value cause the text field is read only
+ * and the user should not be able to mess with this
+ * setting.
+ */
+ $pconfig['utype'] = "user";
+ }
+
+ // finally pull in the php file containing the appropriate markup
+ require_once("system_usermanager_admin_newedit.inc");
+ ?>
+ <?php
+ } else {
+ // finally pull in the php file containing the appropriate markup
+ require_once("system_usermanager_admin_index.inc");
+ ?>
+ <?php } ?>
+ </td>
+ </tr>
+ </table>
+ </div> <!-- MAINAREA DIV -->
+ </td>
+ </tr>
+ </table>
diff --git a/packages/authng/www/php/system_usermanager_admin_index.inc b/packages/authng/www/php/system_usermanager_admin_index.inc
new file mode 100644
index 00000000..807c7e53
--- /dev/null
+++ b/packages/authng/www/php/system_usermanager_admin_index.inc
@@ -0,0 +1,108 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ system_usermanager_admin_edituser.php
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2007 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Based on m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+/* ======================= P A G E F R A G M E N T ======================== */
+/* ========================================================================== */
+?>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<tr>
+ <td width="35%" class="listhdrr">Username</td>
+ <td width="20%" class="listhdrr">Full name</td>
+ <td width="20%" class="listhdrr">Group</td>
+ <td width="10%" class="list"></td>
+</tr>
+<?php
+ $i = 0;
+ foreach($a_user as $userent):
+?>
+<tr ondblclick="document.location.herf = 'system_usermanager.php?act=edit&id=<?=$i;?>';">
+ <td class="listlr">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td align="left" valign="middle">
+ <?php if($userent['scope'] == "user"): ?>
+ <img src="/themes/<?=$g['theme'];?>/images/icons/icon_system-user.png" alt="User" title="User" border="0" height="20" width="20" />
+ <?php else: ?>
+ <img src="/themes/<?=$g['theme'];?>/images/icons/icon_system-user-grey.png" alt="User" title="User" border="0" height="20" width="20" />
+ <?php endif; ?>
+ &nbsp;
+ </td>
+ <td align="left" valign="middle">
+ <?=htmlspecialchars($userent['name']);?>
+ </td>
+ </tr>
+ </table>
+ </td>
+ <td class="listr"><?=htmlspecialchars($userent['fullname']);?>&nbsp;</td>
+ <td class="listbg">
+ <font color="white"><?=htmlspecialchars($userent['groupname']);?></font>&nbsp;
+ </td>
+ <td valign="middle" nowrap class="list">
+ <a href="system_usermanager.php?act=edit&id=<?=$i;?>">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_e.gif" title="edit user" alt="edit user" width="17" height="17" border="0" />
+ </a>
+ <?php if($userent['scope'] == "user"): ?>
+ &nbsp;
+ <a href="system_usermanager.php?act=del&what=user&id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this User?");?>')">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_x.gif" title="delete user" alt="delete user" width="17" height="17" border="0" />
+ </a>
+ <?php endif; ?>
+ </td>
+</tr>
+<?php
+ $i++;
+ endforeach;
+?>
+<tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <a href="system_usermanager.php?act=new">
+ <img src="/themes/<?= $g['theme'];?>/images/icons/icon_plus.gif" title="add user" alt="add user" width="17" height="17" border="0" />
+ </a>
+ </td>
+</tr>
+<tr>
+ <td colspan="3">
+ <p>
+ <?=gettext("Additional webConfigurator users can be added here. User permissions are determined by the admin group they are a member of.");?>
+ </p>
+ <p>
+ <?=gettext("An user icon that appears grey indicates that it is a system user and thus it's only possible to modified a subset of the regular user data. Additionally such an user can't be deleted.");?>
+ </p>
+ </td>
+</tr>
+</table> \ No newline at end of file
diff --git a/packages/authng/www/php/system_usermanager_admin_newedit.inc b/packages/authng/www/php/system_usermanager_admin_newedit.inc
new file mode 100644
index 00000000..d5b7126d
--- /dev/null
+++ b/packages/authng/www/php/system_usermanager_admin_newedit.inc
@@ -0,0 +1,167 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ system_usermanager_admin_newuser.inc
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2007 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Based on m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+/* ======================= P A G E F R A G M E N T ======================== */
+/* ========================================================================== */
+?>
+
+<div id="inputerrors"></div>
+<table width="100%" border="0" cellpadding="6" cellspacing="0">
+ <tr>
+ <td width="22%" valign="top" class="vncellreq"><?=gettext("Username");?></td>
+ <td width="78%" class="vtable">
+ <input name="usernamefld" type="text" class="formfld user" id="usernamefld" size="20" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" <?php if ($pconfig['utype'] == "system") { echo "readonly=\"readonly\" "; }?>/>
+ <input name="oldusername" type="hidden" id="oldusername" value="<?=htmlspecialchars($pconfig['usernamefld']);?>" />
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncellreq" rowspan="2"><?=gettext("Password");?></td>
+ <td width="78%" class="vtable">
+ <input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" value="" />
+ </td>
+ </tr>
+ <tr>
+ <td width="78%" class="vtable">
+ <input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" value="" />&nbsp;<?= gettext("(confirmation)"); ?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Full name");?></td>
+ <td width="78%" class="vtable">
+ <input name="fullname" type="text" class="formfld unknown" id="fullname" size="20" value="<?=htmlspecialchars($pconfig['fullname']);?>" <?php if ($pconfig['utype'] == "system") { echo "readonly=\"readonly\" "; }?>/>
+ <br />
+ <?=gettext("User's full name, for your own information only");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("User type");?></td>
+ <td width="78%" class="vtable">
+ <input name="utype" type="text" class="formfld unknown" id="utype" size="20" value="<?=htmlspecialchars($pconfig['utype']);?>" readonly="readonly" />
+ <br />
+ <?=gettext("Indicates whether this is a system (aka non-deletable) user or a user created by a particular user.");?>
+ </td>
+ </tr>
+ <?php if (isSystemAdmin($HTTP_SERVER_VARS['AUTH_USER'])): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("User Privileges");?></td>
+ <td width="78%" class="vtable">
+ <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="5%" class="listhdrr"><?=gettext("ID");?></td>
+ <td width="30%" class="listhdrr"><?=gettext("Name");?></td>
+ <td width="40%" class="listhdrr"><?=gettext("Description");?></td>
+ <td width="5%" class="list"></td>
+ </tr>
+
+ <?php if(is_array($t_privs)): ?>
+ <?php $i = 0; foreach ($t_privs as $priv): ?>
+ <?php if($priv['id'] <> ""): ?>
+ <tr>
+ <td class="listlr" <?php if($a_user[$id]['scope'] == "user") echo "ondblclick=\"document.location='system_usermanager_edit.php?id={$i}&userid={$id}&useract={$_GET['act']}';\""; ?>>
+ <?=htmlspecialchars($priv['id']);?>
+ </td>
+ <td class="listlr" <?php if($a_user[$id]['scope'] == "user") echo "ondblclick=\"document.location='system_usermanager_edit.php?id={$i}&userid={$id}&useract={$_GET['act']}';\""; ?>>
+ <?=htmlspecialchars($priv['name']);?>
+ </td>
+ <td class="listbg" <?php if($a_user[$id]['scope'] == "user") echo "ondblclick=\"document.location='system_usermanager_edit?id={$i}&userid={$id}&useract={$_GET['act']}';\""; ?>>
+ <font color="#FFFFFF"><?=htmlspecialchars($priv['descr']);?>&nbsp;</font>
+ </td>
+ <td valign="middle" nowrap class="list">
+ <?php if($a_user[$id]['scope'] == "user"): ?>
+ <table border="0" cellspacing="0" cellpadding="1">
+ <tr>
+ <td valign="middle"><a href="system_usermanager_edit.php?id=<?=$i;?>&userid=<?= $id ?>&useract=<?= $_GET['act'] ?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" alt="" /></a></td>
+ <td valign="middle"><a href="system_usermanager.php?act=del&privid=<?=$i;?>&what=priv&id=<?= $id ?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" alt="" /></a></td>
+ </tr>
+ </table>
+ <?php endif; ?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php $i++; endforeach; ?>
+ <?php endif; ?>
+
+ <?php if($a_user[$id]['scope'] == "user"): ?>
+ <tr>
+ <td class="list" colspan="3"></td>
+ <td class="list">
+ <table border="0" cellspacing="0" cellpadding="1">
+ <tr>
+ <td valign="middle"><a href="system_usermanager_edit.php?userid=<?= $id ?>&useract=<?= $_GET['act'] ?>"><img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" alt="" /></a></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <?php endif; ?>
+ </table>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <?php if (isset($config['system']['ssh']['sshdkeyonly'])): ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Authorized keys");?></td>
+ <td width="78%" class="vtable">
+ <textarea name="authorizedkeys" cols="65" rows="7" id="authorizedkeys" class="formfld_cert" wrap="off"><?=htmlspecialchars($pconfig['authorizedkeys']);?></textarea>
+ <br />
+ <?=gettext("Paste an authorized keys file here.");?>
+ </td>
+ </tr>
+ <?php endif; ?>
+ <tr>
+ <td width="22%" valign="top" class="vncell"><?=gettext("Group Name");?></td>
+ <td width="78%" class="vtable">
+ <select name="groupname" class="formselect" id="groupname" <?php if ($pconfig['utype'] == "system") { echo "disabled=\"disabled\" "; } ?>>
+ <?php foreach ($config['system']['group'] as $group): ?>
+ <option value="<?=$group['name'];?>" <?php if ($group['name'] == $pconfig['groupname']) { echo "selected"; } ?>>
+ <?=htmlspecialchars($group['name']);?>
+ </option>
+ <?php endforeach;?>
+ </select>
+ <br />
+ <?=gettext("The admin group to which this user is assigned.");?>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input id="submit" name="save" type="submit" class="formbtn" value="Save" />
+ <?php if (isset($id) && $a_user[$id]): ?>
+ <input name="id" type="hidden" value="<?=$id;?>" />
+ <?php endif;?>
+ </td>
+ </tr>
+</table>
diff --git a/packages/authng/www/php/system_usermanager_user.inc b/packages/authng/www/php/system_usermanager_user.inc
new file mode 100644
index 00000000..25d2e210
--- /dev/null
+++ b/packages/authng/www/php/system_usermanager_user.inc
@@ -0,0 +1,66 @@
+<?php
+/* $Id$ */
+/* ========================================================================== */
+/*
+ system_usermanager_user.inc
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2007 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Based on m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+/* ======================= P A G E F R A G M E N T ======================== */
+/* ========================================================================== */
+?>
+ <div id="inputerrors"></div>
+ <table width="100%" border="0" cellpadding="6" cellspacing="0">
+ <tr>
+ <td colspan="2" valign="top" class="listtopic"><?=$HTTP_SERVER_VARS['AUTH_USER']?>'s Password</td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top" class="vncell" rowspan="2">Password</td>
+ <td width="78%" class="vtable">
+ <input name="passwordfld1" type="password" class="formfld pwd" id="passwordfld1" size="20" />
+ </td>
+ </tr>
+ <tr>
+ <td width="78%" class="vtable">
+ <input name="passwordfld2" type="password" class="formfld pwd" id="passwordfld2" size="20" />
+ &nbsp;<?=gettext("(confirmation)");?>
+ <br />
+ <span class="vexpl"><?=gettext("Select a new password");?></span>
+ </td>
+ </tr>
+ <tr>
+ <td width="22%" valign="top">&nbsp;</td>
+ <td width="78%">
+ <input name="save" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
+ </td>
+ </tr>
+ </table>
diff --git a/packages/authng/www/wizards/authng_wizard.xml b/packages/authng/www/wizards/authng_wizard.xml
new file mode 100644
index 00000000..94796e2f
--- /dev/null
+++ b/packages/authng/www/wizards/authng_wizard.xml
@@ -0,0 +1,496 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<pfsensewizard>
+<copyright>
+/* $Id$ */
+/* ========================================================================== */
+/*
+ authng_wizard.xml
+ part of pfSense (http://www.pfSense.com)
+ Copyright (C) 2007 Daniel S. Haischt <me@daniel.stefan.haischt.name>
+ All rights reserved.
+
+ Based on m0n0wall (http://m0n0.ch/wall)
+ Copyright (C) 2003-2006 Manuel Kasper <mk@neon1.net>.
+ All rights reserved.
+ */
+/* ========================================================================== */
+/*
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+ */
+/* ========================================================================== */
+</copyright>
+<totalsteps>8</totalsteps>
+<step>
+ <id>1</id>
+ <title>pfSense AuthNG Wizard</title>
+ <disableheader>true</disableheader>
+ <description>
+ This wizard will guide you through the initial configuration of
+ the pfSense authentication system.
+ </description>
+ <fields>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+</step>
+<step>
+ <id>2</id>
+ <title>pfSense Backend settings</title>
+ <description>
+ On this screen you will define where to define pfSense users and groups
+ </description>
+ <fields>
+ <field>
+ <name>PrincipalStore</name>
+ <type>select</type>
+ <donotdisable>true</donotdisable>
+ <bindstofield>installedpackages->authng->config->principal_store</bindstofield>
+ <options>
+ <option>
+ <name>XML</name>
+ <value>xml</value>
+ </option>
+ <option>
+ <name>LDAP</name>
+ <value>ldap</value>
+ </option>
+ <option>
+ <name>DB</name>
+ <value>db</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <name>Backend</name>
+ <type>select</type>
+ <donotdisable>true</donotdisable>
+ <bindstofield>installedpackages->authng->config->backend</bindstofield>
+ <options>
+ <option>
+ <name>htpasswd</name>
+ <value>htpasswd</value>
+ </option>
+ <option>
+ <name>PAM</name>
+ <value>pam</value>
+ </option>
+ <option>
+ <name>Radius</name>
+ <value>radius</value>
+ </option>
+ <option>
+ <name>passwd</name>
+ <value>passwd</value>
+ </option>
+ <option>
+ <name>LDAP</name>
+ <value>ldap</value>
+ </option>
+ </options>
+ </field>
+ <field>
+ <name>AuthenticationMethod</name>
+ <type>select</type>
+ <donotdisable>true</donotdisable>
+ <bindstofield>installedpackages->authng->config->auth_method</bindstofield>
+ <options>
+ <option>
+ <name>Session</name>
+ <value>session</value>
+ </option>
+ <option>
+ <name>Basic</name>
+ <value>basic</value>
+ </option>
+ </options>
+ </field>
+ </fields
+</step>
+<step>
+ <id>3</id>
+ <title>Time Server Information</title>
+ <description>Please enter the time, date and time zone.</description>
+ <fields>
+ <field>
+ <name>Time server dns name</name>
+ <description>Enter the name of the time server.</description>
+ <type>input</type>
+ <bindstofield>system->timeservers</bindstofield>
+ </field>
+ <field>
+ <name>Timezone</name>
+ <type>timezone_select</type>
+ <bindstofield>system->timezone</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+</step>
+<step>
+ <id>4</id>
+ <disableallfieldsbydefault>true</disableallfieldsbydefault>
+ <title>Configure WAN Interface</title>
+ <description>On this screen we will configure the Wide Area Network information.</description>
+ <javascriptafterformdisplay>
+ var selectedItem = 0;
+ if(document.forms[0].ipaddress.value == 'dhcp') {
+ selectedItem = 1;
+ document.forms[0].ipaddress.value = '';
+ } else if(document.forms[0].ipaddress.value == 'PPPoE') {
+ selectedItem = 2;
+ document.forms[0].ipaddress.value = '';
+ } else if(document.forms[0].ipaddress.value == 'PPTP') {
+ selectedItem = 3;
+ document.forms[0].ipaddress.value = '';
+ } else if(document.forms[0].ipaddress.value == 'BigPond') {
+ selectedItem = 4;
+ document.forms[0].ipaddress.value = '';
+ } else {
+ selectedItem = 0;
+ }
+ document.forms[0].selectedtype.selectedIndex = selectedItem;
+ enableitems(selectedItem);
+ </javascriptafterformdisplay>
+ <fields>
+ <field>
+ <name>SelectedType</name>
+ <type>select</type>
+ <donotdisable>true</donotdisable>
+ <options>
+ <option>
+ <name>Static</name>
+ <value>Static</value>
+ <enablefields>ipaddress,subnetmask,gateway</enablefields>
+ </option>
+ <option>
+ <name>DHCP</name>
+ <value>dhcp</value>
+ <enablefields>dhcphostname</enablefields>
+ </option>
+ <option>
+ <name>PPPoE</name>
+ <value>pppoe</value>
+ <enablefields>pppoeusername,pppoepassword,pppoeservicename,pppoedialondemand,pppoeidletimeout</enablefields>
+ </option>
+ <option>
+ <name>PPTP</name>
+ <value>pptp</value>
+ <enablefields>pptpusername,pptppassword,pptplocalipaddress,pptplocalsubnet,pptpremoteipaddress,pptpdialondemand,pptpidletimeout
+ </enablefields>
+ </option>
+ <option>
+ <name>BigPond</name>
+ <value>bigpond</value>
+ <enablefields>bigpondusername,bigpondpassword,bigpondauthenticationserver,bigpondauthenticationdomain,bigpondminheartbeatinterval</enablefields>
+ </option>
+ </options>
+ </field>
+ <field>
+ <name>General configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>MAC Address</name>
+ <bindstofield>interfaces->wan->spoofmac</bindstofield>
+ <type>input</type>
+ <description> This field can be used to modify ("spoof") the MAC address of the WAN interface (may be required with some cable connections) Enter a MAC address in the following format: xx:xx:xx:xx:xx:xx or leave blank</description>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>MTU</name>
+ <type>input</type>
+ <bindstofield>interfaces->wan->mtu</bindstofield>
+ <description> If you enter a value in this field, then MSS clamping for TCP connections to the value entered above minus 40 (TCP/IP header size) will be in effect. If you leave this field blank, an MTU of 1492 bytes for PPPoE and 1500 bytes for all other connection types will be assumed.</description>
+ </field>
+ <field>
+ <name>Static IP Configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>IP Address</name>
+ <bindstofield>interfaces->wan->ipaddr</bindstofield>
+ <type>input</type>
+ <typehint> / </typehint>
+ <combinefieldsbegin>true</combinefieldsbegin>
+ </field>
+ <field>
+ <combinefieldsend>true</combinefieldsend>
+ <dontdisplayname>true</dontdisplayname>
+ <dontcombinecells>true</dontcombinecells>
+ <name>Subnet Mask</name>
+ <bindstofield>interfaces->wan->subnet</bindstofield>
+ <type>subnet_select</type>
+ </field>
+ <field>
+ <name>Gateway</name>
+ <bindstofield>interfaces->wan->gateway</bindstofield>
+ <type>input</type>
+ </field>
+ <field>
+ <name>DHCP client configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>DHCP Hostname</name>
+ <type>input</type>
+ <bindstofield>interfaces->wan->dhcphostname</bindstofield>
+ <description> The value in this field is sent as the DHCP client identifier and hostname when requesting a DHCP lease. Some ISPs may require this (for client identification).</description>
+ </field>
+ <field>
+ <name>PPPoE configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>PPPoE Username</name>
+ <type>input</type>
+ <bindstofield>pppoe->username</bindstofield>
+ </field>
+ <field>
+ <name>PPPoE Password</name>
+ <type>input</type>
+ <bindstofield>pppoe->password</bindstofield>
+ </field>
+ <field>
+ <name>PPPoE Service name</name>
+ <type>input</type>
+ <description>Hint: this field can usually be left empty</description>
+ </field>
+ <field>
+ <name>PPPoE Dial on demand</name>
+ <typehint>Enable Dial-On-Demand mode</typehint>
+ <type>checkbox</type>
+ <description>This option causes the interface to operate in dial-on-demand mode, allowing you to have a virtual full time connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected.</description>
+ </field>
+ <field>
+ <name>PPPoE Idle timeout</name>
+ <type>input</type>
+ <description>If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature.</description>
+ </field>
+ <field>
+ <name>PPTP configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>PPTP Username</name>
+ <type>input</type>
+ <bindstofield>pptp->username</bindstofield>
+ </field>
+ <field>
+ <name>PPTP Password</name>
+ <type>input</type>
+ <bindstofield>pptp->password</bindstofield>
+ </field>
+ <field>
+ <combinefieldsbegin>true</combinefieldsbegin>
+ <name>PPTP Local IP Address</name>
+ <type>input</type>
+ <typehint> / </typehint>
+ <bindstofield>pptp->local</bindstofield>
+ </field>
+ <field>
+ <combinefieldsend>true</combinefieldsend>
+ <dontdisplayname>true</dontdisplayname>
+ <dontcombinecells>true</dontcombinecells>
+ <name>pptplocalsubnet</name>
+ <bindstofield>pptp->subnet</bindstofield>
+ <type>subnet_select</type>
+ </field>
+ <field>
+ <name>PPTP Remote IP Address</name>
+ <bindstofield>pptp->remote</bindstofield>
+ <type>input</type>
+ </field>
+ <field>
+ <name>PPTP Dial on demand</name>
+ <typehint>Enable Dial-On-Demand mode</typehint>
+ <type>checkbox</type>
+ <description>This option causes the interface to operate in dial-on-demand mode, allowing you to have a virtual full time connection. The interface is configured, but the actual connection of the link is delayed until qualifying outgoing traffic is detected.</description>
+ </field>
+ <field>
+ <name>PPTP Idle timeout</name>
+ <type>input</type>
+ <description>If no qualifying outgoing packets are transmitted for the specified number of seconds, the connection is brought down. An idle timeout of zero disables this feature.</description>
+ </field>
+ <field>
+ <name>BigPond configuration</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <name>BigPond Username</name>
+ <type>input</type>
+ <bindstofield>bigpond->username</bindstofield>
+ </field>
+ <field>
+ <name>BigPond Password</name>
+ <type>input</type>
+ <bindstofield>bigpond->password</bindstofield>
+ </field>
+ <field>
+ <name>BigPond Authentication server</name>
+ <type>input</type>
+ <bindstofield>bigpond->authserver</bindstofield>
+ <description>If this field is left empty, the default ("dce-server") is used.</description>
+ </field>
+ <field>
+ <name>BigPond Authentication domain</name>
+ <type>input</type>
+ <bindstofield>bigpond->authdomain</bindstofield>
+ <description>If this field is left empty, the domain name assigned via DHCP will be used. Note: the BigPond client implicitly sets the "Allow DNS server list to be overridden by DHCP/PPP on WAN" on the System: General setup page.</description>
+ </field>
+ <field>
+ <name>BigPond min heartbeat interval</name>
+ <type>input</type>
+ <typehint>seconds</typehint>
+ <bindstofield>bigpond->minheartbeatinterval</bindstofield>
+ <description> Setting this to a sensible value (e.g. 60 seconds) can protect against DoS attacks.</description>
+ </field>
+ <field>
+ <name>RFC1918 Networks</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>Block RFC1918 Private Networks</name>
+ <description> When set, this option blocks traffic from IP addresses that are reserved for private networks as per RFC 1918 (10/8, 172.16/12, 192.168/16) as well as loopback addresses (127/8). You should generally leave this option turned on, unless your WAN network lies in such a private address space, too.</description>
+ <type>checkbox</type>
+ <bindstofield>interfaces->wan->blockpriv</bindstofield>
+ <typehint>Block private networks from entering via WAN</typehint>
+ </field>
+ <field>
+ <name>Block bogon networks</name>
+ <type>listtopic</type>
+ </field>
+ <field>
+ <donotdisable>true</donotdisable>
+ <name>Block bogon networks</name>
+ <description>Block bogon networks when set, this option blocks traffic from IP addresses that are reserved (but not RFC 1918) or not yet assigned by IANA. Bogons are prefixes that should never appear in the Internet routing table, and obviously should not appear as the source address in any packets you receive.</description>
+ <type>checkbox</type>
+ <bindstofield>interfaces->wan->blockbogons</bindstofield>
+ <typehint>Block non-Internet routed networks from entering via WAN</typehint>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitbeforesave>
+ if($_POST['selectedtype'] == "Static") { } else {
+ $_POST['ipaddress'] = $_POST['selectedtype'];
+ $config['interfaces']['wan']['ipaddr'] = $_POST['selectedtype'];
+ write_config();
+ }
+ </stepsubmitbeforesave>
+</step>
+<step>
+ <id>5</id>
+ <title>Configure LAN Interface</title>
+ <description>On this screen we will configure the Local Area Network information.</description>
+ <fields>
+ <field>
+ <name>LAN IP Address</name>
+ <type>input</type>
+ <bindstofield>interfaces->lan->ipaddr</bindstofield>
+ <description>Type dhcp if this interface uses dhcp to obtain its ip address.</description>
+ </field>
+ <field>
+ <name>Subnet Mask</name>
+ <type>subnet_select</type>
+ <bindstofield>interfaces->lan->subnet</bindstofield>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>
+ $ft = split("\.", $_POST['lanipaddress']);
+ $ft_ip = $ft[0] . "." . $ft[1] . "." . $ft[2] . ".";
+ $config['dhcpd']['lan']['range']['from'] = $ft_ip . "10";
+ $highestip = gen_subnet_max($_POST['lanipaddress'], $config['interfaces']['lan']['subnet']);
+ $hi = split("\.", $highestip);
+ $highestip = $hi[3]-10;
+ $config['dhcpd']['lan']['range']['to'] = $ft_ip . $highestip;
+ </stepsubmitphpaction>
+</step>
+<step>
+ <id>6</id>
+ <title>Set Admin WebGUI Password</title>
+ <description>On this screen we will set the Admin password which is used to access the WebGUI and also SSH services if you wish to enable.</description>
+ <fields>
+ <field>
+ <name>Admin Password</name>
+ <type>password</type>
+ </field>
+ <field>
+ <name>Admin Password AGAIN</name>
+ <type>password</type>
+ </field>
+ <field>
+ <name>Next</name>
+ <type>submit</type>
+ </field>
+ </fields>
+ <stepsubmitphpaction>
+ if($_POST['adminpassword'] != "") {
+ if($_POST['adminpassword'] == $_POST['adminpasswordagain']) {
+ $fd = popen("/usr/sbin/pw usermod -n root -H 0", "w");
+ $salt = md5(time());
+ $crypted_pw = crypt($_POST['adminpassword'],$salt);
+ fwrite($fd, $crypted_pw);
+ pclose($fd);
+ $config['system']['password'] = crypt($_POST['adminpassword']);
+ write_config();
+ system_password_configure();
+ } else {
+ print_info_box_np("Passwords do not match! Please press back in your browser window and correct.");
+ die;
+ }
+ }
+ </stepsubmitphpaction>
+</step>
+<step>
+ <id>7</id>
+ <title>Reload configuration</title>
+ <disableheader>true</disableheader>
+ <description>Click 'Reload' to reload pfSense with new changes. If you changed the password, pfSense will ask you to log in again.</description>
+ <fields>
+ <field>
+ <name>Reload</name>
+ <type>submit</type>
+ </field>
+ </fields>
+</step>
+<step>
+ <id>8</id>
+ <title>Reload in progress</title>
+ <description>A reload is now in progress. Please wait. &lt;p&gt; The system will automatically try to access $myurl in 120 seconds. &lt;p&gt; You can click on the icon above to access the site more quickly.
+ &lt;meta http-equiv="refresh" content="60; url=$myurl" &gt;</description>
+ <stepafterformdisplay>
+ reload_all();
+ </stepafterformdisplay>
+</step>
+</pfsensewizard>