summaryrefslogtreecommitdiffstats
path: root/ldap/admin/src/scripts/SetupDialogs.pm.in
diff options
context:
space:
mode:
authorRich Megginson <rmeggins@redhat.com>2007-06-19 18:24:58 +0000
committerRich Megginson <rmeggins@redhat.com>2007-06-19 18:24:58 +0000
commit72da2df3bae21741217e3175e020cdc3b83ac172 (patch)
tree4e12d324257ca8cfe4ba39ceb4337adfe0df588e /ldap/admin/src/scripts/SetupDialogs.pm.in
parent0046d389d23bd217e3109949064c33de07dbc017 (diff)
downloadds-72da2df3bae21741217e3175e020cdc3b83ac172.tar.gz
ds-72da2df3bae21741217e3175e020cdc3b83ac172.tar.xz
ds-72da2df3bae21741217e3175e020cdc3b83ac172.zip
Resolves: bug 237356
Description: Move DS Admin Code into Admin Server - ldif templates, pwdhash Reviewed by: nhosoi (Thanks!) Fix Description: These changes are primarily to allow the admin server setup to run completely in perl with no more setuputil code. 1) Added LDIF templates for DS config. template-dse.ldif is the core minimal directory server configuration. Values can be replaced with parameters in the same style as used with register_server.pl - %token%. For the plugin entries, the plugin shared library name is now just a name. There is no more full path. The code in dynalib.c handles this case by using the compiled in PLUGINDIR. The NSPR function PR_GetLibraryName knows the correct shared lib suffix for the platform. All of this allows us to do 2). 2) Added ability to run pwdhash with no server configuration. If no configuration is given, it uses the template-dse.ldif above. And instead of having to worry about where the plugins are installed and the shared lib suffix, it just depends on the above changes. This allows us to generate password hashes during setup before the directory server instance is created, and also to keep clear text password usage to a minimum. 3) Added defaultuser and defaultgroup. 4) Added support for continuation lines in Inf files. 5) All user visible messages during setup should be localizable Platforms tested: RHEL4 Flag Day: Yes, autotool file changes. Doc impact: Yes, along with the previous fixes for this bug.
Diffstat (limited to 'ldap/admin/src/scripts/SetupDialogs.pm.in')
-rw-r--r--ldap/admin/src/scripts/SetupDialogs.pm.in255
1 files changed, 255 insertions, 0 deletions
diff --git a/ldap/admin/src/scripts/SetupDialogs.pm.in b/ldap/admin/src/scripts/SetupDialogs.pm.in
new file mode 100644
index 00000000..86f9ebae
--- /dev/null
+++ b/ldap/admin/src/scripts/SetupDialogs.pm.in
@@ -0,0 +1,255 @@
+# BEGIN COPYRIGHT BLOCK
+# This Program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free Software
+# Foundation; version 2 of the License.
+#
+# This Program 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 General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this Program; if not, write to the Free Software Foundation, Inc., 59 Temple
+# Place, Suite 330, Boston, MA 02111-1307 USA.
+#
+# In addition, as a special exception, Red Hat, Inc. gives You the additional
+# right to link the code of this Program with code not covered under the GNU
+# General Public License ("Non-GPL Code") and to distribute linked combinations
+# including the two, subject to the limitations in this paragraph. Non-GPL Code
+# permitted under this exception must only link to the code of this Program
+# through those well defined interfaces identified in the file named EXCEPTION
+# found in the source code files (the "Approved Interfaces"). The files of
+# Non-GPL Code may instantiate templates or use macros or inline functions from
+# the Approved Interfaces without causing the resulting work to be covered by
+# the GNU General Public License. Only Red Hat, Inc. may make changes or
+# additions to the list of Approved Interfaces. You must obey the GNU General
+# Public License in all respects for all of the Program code and other code used
+# in conjunction with the Program except the Non-GPL Code covered by this
+# exception. If you modify this file, you may extend this exception to your
+# version of the file, but you are not obligated to do so. If you do not wish to
+# provide this exception without modification, you must delete this exception
+# statement from your version and license this file solely under the GPL without
+# exception.
+#
+#
+# Copyright (C) 2007 Red Hat, Inc.
+# All rights reserved.
+# END COPYRIGHT BLOCK
+#
+
+package SetupDialogs;
+
+use strict;
+
+use DialogManager;
+use Setup;
+use Dialog;
+use Net::Domain qw(hostfqdn);
+
+my $welcome = new DialogYesNo (
+ $EXPRESS,
+ ['dialog_welcome_text', 'brand', 'brand'],
+ 1,
+ sub {
+ my $self = shift;
+ my $ans = shift;
+ my $res = $self->handleResponse($ans);
+ if ($res == $DialogManager::NEXT) {
+ $res = $DialogManager::ERR if (!$self->isYes());
+ }
+ return $res;
+ },
+ ['dialog_welcome_prompt'],
+);
+
+my $license = new DialogYesNo (
+ $EXPRESS,
+ 'dialog_license_text',
+ 0,
+ sub {
+ my $self = shift;
+ my $ans = shift;
+ my $res = $self->handleResponse($ans);
+ if ($res == $DialogManager::NEXT) {
+ $res = $DialogManager::ERR if (!$self->isYes());
+ }
+ return $res;
+ },
+ ['dialog_license_prompt']
+);
+
+my $setuptype = new Dialog (
+ $EXPRESS,
+ 'dialog_setuptype_text',
+ sub {
+ my $self = shift;
+ return $self->{manager}->getType();
+ },
+ sub {
+ my $self = shift;
+ my $ans = shift;
+ my $res = $DialogManager::SAME;
+ if ($ans < $EXPRESS or $ans > $CUSTOM) {
+ $self->{manager}->alert("dialog_setuptype_error");
+ } else {
+ $res = $DialogManager::NEXT;
+ $self->{manager}->setType($ans);
+ }
+ return $res;
+ },
+ ['dialog_setuptype_prompt']
+);
+
+my $hostdlg = new Dialog (
+ $TYPICAL,
+ 'dialog_hostname_text',
+ sub {
+ my $self = shift;
+ return $self->{manager}->{inf}->{General}->{FullMachineName} ||
+ hostfqdn;
+ },
+ sub {
+ my $self = shift;
+ my $ans = shift;
+ my $res = $DialogManager::NEXT;
+ if ($ans !~ /\./) {
+ $self->{manager}->alert("dialog_hostname_warning", $ans);
+ }
+ $self->{manager}->{inf}->{General}->{FullMachineName} = $ans;
+ return $res;
+ },
+ ['dialog_hostname_prompt']
+);
+
+# must verify that the user or uid specified by the user to run the server as
+# is a valid uid
+sub verifyUserChoice {
+ my $self = shift;
+ my $ans = shift;
+ my $res = $DialogManager::NEXT;
+ # convert numeric uid to string
+ my $strans = $ans;
+ if ($ans =~ /^\d/) { # numeric - convert to string
+ $strans = getpwuid $ans;
+ if (!$strans) {
+ $self->{manager}->alert("dialog_ssuser_error", $ans);
+ return $DialogManager::SAME;
+ }
+ }
+ if ($> != 0) { # if not root, the user must be our uid
+ my $username = getlogin;
+ if ($strans ne $username) {
+ $self->{manager}->alert("dialog_ssuser_must_be_same", $username);
+ return $DialogManager::SAME;
+ }
+ } else { # user is root - verify id
+ my $nuid = getpwnam $strans;
+ if (!defined($nuid)) {
+ $self->{manager}->alert("dialog_ssuser_error", $ans);
+ return $DialogManager::SAME;
+ }
+ if (!$nuid) {
+ $self->{manager}->alert("dialog_ssuser_root_warning");
+ }
+ }
+ $self->{manager}->{inf}->{General}->{SuiteSpotUserID} = $ans;
+ return $res;
+}
+
+# must verify that the given group is one of the groups the given user
+# belongs to
+sub verifyGroupChoice {
+ my $self = shift;
+ my $ans = shift;
+ my $res = $DialogManager::NEXT;
+ my ($dummy, $memstr);
+ my $strgrp;
+ my $numgrp;
+ if ($ans =~ /^\d/) { # numeric
+ $numgrp = $ans;
+ ($strgrp, $dummy, $dummy, $memstr) = getgrgid $ans;
+ } else {
+ $strgrp = $ans;
+ ($dummy, $dummy, $numgrp, $memstr) = getgrnam $ans;
+ }
+
+ if (!defined($strgrp) or !defined($numgrp)) {
+ $self->{manager}->alert("dialog_ssgroup_error", $ans);
+ return $DialogManager::SAME;
+ }
+
+ # get the user id, and then get the user's default group id
+ my $uid = $self->{manager}->{inf}->{General}->{SuiteSpotUserID};
+ my $usergid;
+ if ($uid =~ /^\d/) { # numeric
+ ($uid, $dummy, $dummy, $usergid, $dummy) = getpwuid $uid;
+ } else { # string
+ ($uid, $dummy, $dummy, $usergid, $dummy) = getpwnam $uid;
+ }
+
+ if ($numgrp == $usergid) {
+ $self->{manager}->{inf}->{General}->{SuiteSpotGroup} = $ans;
+ } elsif ($memstr) { # see if the user is in the member list
+ if ($memstr =~ /\b$uid\b/) { # uid exactly matches one of the users in the member string
+ $self->{manager}->{inf}->{General}->{SuiteSpotGroup} = $ans;
+ } else { # no match
+ $self->{manager}->alert("dialog_ssgroup_no_match",
+ $self->{manager}->{inf}->{General}->{SuiteSpotUserID},
+ $ans, $memstr);
+ $res = $DialogManager::SAME;
+ }
+ } else { # user not in group
+ $self->{manager}->alert("dialog_ssgroup_no_user",
+ $self->{manager}->{inf}->{General}->{SuiteSpotUserID},
+ $ans);
+ $res = $DialogManager::SAME;
+ }
+ return $res;
+}
+
+my $usergroup = new Dialog (
+ $TYPICAL,
+ 'dialog_ssuser_text',
+ sub {
+ my $self = shift;
+ my $index = shift;
+ if ($index == 0) {
+ my $username = $self->{manager}->{inf}->{General}->{SuiteSpotUserID};
+ if (!$username) {
+ if ($> == 0) { # if root, use the default user
+ $username = "@defaultuser@";
+ } else { # if not root, use the user's uid
+ $username = getlogin;
+ }
+ }
+ return $username;
+ } else { # group
+ my $groupname = $self->{manager}->{inf}->{General}->{SuiteSpotGroup};
+ if (!$groupname) {
+ if ($> == 0) { # if root, use the default group
+ $groupname = "@defaultgroup@";
+ } else { # if not root, use the user's gid
+ $groupname = getgrgid $(;
+ }
+ }
+ return $groupname;
+ }
+ },
+ sub {
+ my $self = shift;
+ my $ans = shift;
+ my $index = shift;
+ if ($index == 0) {
+ return verifyUserChoice($self, $ans);
+ } else {
+ return verifyGroupChoice($self, $ans);
+ }
+ },
+ ['dialog_ssuser_prompt'], ['dialog_ssgroup_prompt']
+);
+
+
+sub getDialogs {
+ return ($welcome, $license, $setuptype, $hostdlg, $usergroup);
+}
+
+1;