aboutsummaryrefslogtreecommitdiffstats
path: root/lib/AdminPanel/Module/Users.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/AdminPanel/Module/Users.pm')
-rw-r--r--lib/AdminPanel/Module/Users.pm2637
1 files changed, 0 insertions, 2637 deletions
diff --git a/lib/AdminPanel/Module/Users.pm b/lib/AdminPanel/Module/Users.pm
deleted file mode 100644
index 2ef9066..0000000
--- a/lib/AdminPanel/Module/Users.pm
+++ /dev/null
@@ -1,2637 +0,0 @@
-# vim: set et ts=4 sw=4:
-
-package ManaTools::Module::Users;
-
-#============================================================= -*-perl-*-
-
-=head1 NAME
-
-ManaTools::Module::Users - This module aims to manage service
- with GUI
-
-=head1 SYNOPSIS
-
- my $userManager = ManaTools::Module::Users->new();
- $userManager->start();
-
-=head1 DESCRIPTION
-
- This module is a tool to manage users on the system.
-
- From the original code adduserdrake and userdrake.
-
-=head1 SUPPORT
-
- You can find documentation for this module with the perldoc command:
-
- perldoc ManaTools::Module::Users
-
-=head1 SEE ALSO
-
- ManaTools::Module
-
-=head1 AUTHOR
-
-Angelo Naselli <anaselli@linux.it>
-
-=head1 COPYRIGHT and LICENSE
-
-Copyright (C) 2013-2015, Angelo Naselli.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License version 2, as
-published by the Free Software Foundation.
-
-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
-
-=head1 VERSION
-
-Version 1.0.0
-
-=cut
-
-our $VERSION = '1.0.0';
-
-
-###############################################
-##
-## graphic related routines for managing user
-##
-###############################################
-
-use Moose;
-
-use POSIX qw(ceil);
-use Config::Auto;
-use File::ShareDir ':ALL';
-
-use utf8;
-use Sys::Syslog;
-use Glib;
-use English;
-use yui;
-use ManaTools::Shared;
-use ManaTools::Shared::GUI;
-use ManaTools::Shared::Locales;
-use ManaTools::Shared::Users;
-use MDK::Common::DataStructure qw(member);
-use feature 'state';
-
-extends qw( ManaTools::Module );
-
-has '+icon' => (
- default => "/usr/share/icons/userdrake.png",
-);
-
-
-# main dialog
-has 'dialog' => (
- is => 'rw',
- init_arg => undef,
-);
-
-has 'widgets' => (
- traits => ['Hash'],
- default => sub { {} },
- is => 'rw',
- isa => 'HashRef',
- handles => {
- set_widget => 'set',
- get_widget => 'get',
- widget_pairs => 'kv',
- },
- init_arg => undef,
-);
-
-has 'action_menu' => (
- traits => ['Hash'],
- default => sub { {} },
- is => 'rw',
- isa => 'HashRef',
- handles => {
- set_action_menu => 'set',
- get_action_menu => 'get',
- action_menu_pairs => 'kv',
- },
- init_arg => undef,
-);
-
-
-has 'edit_tab_widgets' => (
- traits => ['Hash'],
- default => sub { {} },
- is => 'rw',
- isa => 'HashRef',
- handles => {
- set_edit_tab_widget => 'set',
- get_edit_tab_widget => 'get',
- edit_tab_pairs => 'kv',
- },
- init_arg => undef,
-);
-
-has 'sh_users' => (
- is => 'rw',
- init_arg => undef,
- builder => '_SharedUsersInitialize'
-);
-
-sub _SharedUsersInitialize {
- my $self = shift();
-
- $self->sh_users(ManaTools::Shared::Users->new() );
-}
-
-has 'sh_gui' => (
- is => 'rw',
- init_arg => undef,
- builder => '_SharedUGUIInitialize'
-);
-
-sub _SharedUGUIInitialize {
- my $self = shift();
-
- $self->sh_gui(ManaTools::Shared::GUI->new() );
-}
-
-has 'loc' => (
- is => 'rw',
- init_arg => undef,
- builder => '_localeInitialize'
-);
-
-
-sub _localeInitialize {
- my $self = shift();
-
- # TODO fix domain binding for translation
- $self->loc(ManaTools::Shared::Locales->new(domain_name => 'userdrake') );
- # TODO if we want to give the opportunity to test locally add dir_name => 'path'
-}
-
-
-#=============================================================
-
-=head1 METHODS
-
-=cut
-
-=head2 new - additional parameters
-
-=head3 config_file
-
- optional parameter to set the configuration file name
-
-=cut
-
-has 'config_file' => (
- is => 'rw',
- isa => 'Str',
- default => '/etc/sysconfig/manauser',
-);
-
-
-
-#=============================================================
-
-=head2 start
-
-=head3 INPUT
-
- $self: this object
-
-=head3 DESCRIPTION
-
- This method extends Module::start and is invoked to
- start adminService
-
-=cut
-
-#=============================================================
-sub start {
- my $self = shift;
-
- $self->_manageUsersDialog();
-};
-
-# TODO move to Shared?
-sub _labeledFrameBox {
- my ($parent, $label) = @_;
-
- my $factory = yui::YUI::widgetFactory;
-
- my $frame = $factory->createFrame($parent, $label);
- $frame->setWeight( $yui::YD_HORIZ, 1);
- $frame->setWeight( $yui::YD_VERT, 2);
- $frame = $factory->createHVCenter( $frame );
- $frame = $factory->createVBox( $frame );
- return $frame;
-}
-
-# usefull local variable to avoid duplicating
-# translation point for user edit labels
-my %userEditLabel;
-# usefull local variable to avoid duplicating
-# translation point for group edit labels
-my %groupEditLabel;
-
-
-#=============================================================
-
-=head2 BUILD
-
-=head3 INPUT
-
- $self: this object
-
-=head3 DESCRIPTION
-
- The BUILD method is called after a Moose object is created,
- Into this method additional data are initialized.
-
-=cut
-
-#=============================================================
-sub BUILD {
- my $self = shift;
-
- if (! $self->name) {
- $self->name ($self->loc->N("manauser"));
- }
-
- %userEditLabel = (
- user_data => $self->loc->N("User Data"),
- account_info => $self->loc->N("Account Info"),
- password_info => $self->loc->N("Password Info"),
- groups => $self->loc->N("Groups"),
- );
- %groupEditLabel = (
- group_data => $self->loc->N("Group Data"),
- group_users => $self->loc->N("Group Users"),
- );
-}
-
-
-#=============================================================
-
-=head2 ChooseGroup
-
-=head3 INPUT
-
- $self: this object
-
-=head3 OUTPUT
-
- $choice: 0 or 1 (choice)
- -1 cancel or exit
-
-=head3 DESCRIPTION
-
-creates a popup dialog to ask if adding user to an existing
-group or to the 'users' group
-
-=cut
-
-#=============================================================
-sub ChooseGroup {
- my $self = shift;
-
- my $choice = -1;
-
- ## push application title
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($self->loc->N("Choose group"));
-
- my $factory = yui::YUI::widgetFactory;
-
- my $dlg = $factory->createPopupDialog();
- my $layout = $factory->createVBox($dlg);
-
-
- my $frame = _labeledFrameBox($layout, $self->loc->N("A group with this name already exists. What would you like to do?"));
-
- my $rbg = $factory->createRadioButtonGroup( $frame );
- $frame = $factory->createVBox( $rbg );
- my $align = $factory->createLeft($frame);
-
- my $rb1 = $factory->createRadioButton( $align, $self->loc->N("Add to the existing group"), 1);
- $rb1->setNotify(1);
- $rbg->addRadioButton( $rb1 );
- $align = $factory->createLeft($frame);
- my $rb2 = $factory->createRadioButton( $align, $self->loc->N("Add to the 'users' group"), 0);
- $rb2->setNotify(1);
- $rbg->addRadioButton( $rb2 );
-
- my $hbox = $factory->createHBox($layout);
- $align = $factory->createRight($hbox);
- my $cancelButton = $factory->createPushButton($align, $self->loc->N("Cancel"));
- my $okButton = $factory->createPushButton($hbox, $self->loc->N("Ok"));
- while(1) {
- my $event = $dlg->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- # widget selected
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- if ($widget == $okButton) {
- $choice = $rb1->value() ? 0 : 1 ;
- last;
- }
- }
- }
-
- destroy $dlg;
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle);
-
- return $choice;
-}
-
-#=============================================================
-
-=head2 _deleteGroupDialog
-
-=head3 INPUT
-
- $self: this object
-
-=head3 DESCRIPTION
-
- This method open a dialog to delete the selected group.
-
-=cut
-
-#=============================================================
-sub _deleteGroupDialog {
- my $self = shift;
-
- my $item = $self->get_widget('table')->selectedItem();
- if (! $item) {
- return;
- }
-
- my $groupname = $item->label();
- ## push application title
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($self->loc->N("Warning"));
-
- my $factory = yui::YUI::widgetFactory;
- my $dlg = $factory->createPopupDialog();
- my $layout = $factory->createVBox($dlg);
-
- my $align = $factory->createLeft($layout);
-
- $factory->createLabel($align, $self->loc->N("Do you really want to delete the group %s?",
- $groupname));
-
- $align = $factory->createRight($layout);
- my $hbox = $factory->createHBox($align);
- my $cancelButton = $factory->createPushButton($hbox, $self->loc->N("Cancel"));
- my $deleteButton = $factory->createPushButton($hbox, $self->loc->N("Delete"));
-
- while(1) {
- my $event = $dlg->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- # widget selected
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $deleteButton) {
- my $username = $self->sh_users->isPrimaryGroup($groupname);
- if (defined($username)) {
- $self->sh_gui->msgBox({
- text => $self->loc->N("%s is a primary group for user %s\n Remove the user first",
- $groupname, $username
- )
- });
- }
- else {
- if ($self->sh_users->deleteGroup($groupname)) {
- Sys::Syslog::syslog('info|local1', $self->loc->N("Removing group: %s", $groupname));
- }
- $self->_refresh();
- }
- last;
- }
- }
- }
-
- destroy $dlg;
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle);
-}
-
-#=============================================================
-
-=head2 _deleteUserDialog
-
-=head3 INPUT
-
- $self: this object
-
-=head3 DESCRIPTION
-
- This method open a dialog to delete the selected user.
- It also asks for additional information to be removed.
-
-=cut
-
-#=============================================================
-sub _deleteUserDialog {
- my $self = shift;
-
- my $item = $self->get_widget('table')->selectedItem();
- if (! $item) {
- return;
- }
- my $username = $item->label();
-
- my $homedir = $self->sh_users->getUserHome($username);
- return if !defined($homedir);
-
-
- ## push application title
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($self->loc->N("Delete files or not?"));
-
- my $factory = yui::YUI::widgetFactory;
- my $dlg = $factory->createPopupDialog();
- my $layout = $factory->createVBox($dlg);
-
- my $align = $factory->createLeft($layout);
- $factory->createLabel($align, $self->loc->N("Deleting user %s\nAlso perform the following actions\n",
- $username));
- $align = $factory->createLeft($layout);
- my $checkhome = $factory->createCheckBox($align, $self->loc->N("Delete Home Directory: %s", $homedir), 0);
- $align = $factory->createLeft($layout);
- my $checkspool = $factory->createCheckBox($align, $self->loc->N("Delete Mailbox: /var/spool/mail/%s",
- $username), 0);
- $align = $factory->createRight($layout);
- my $hbox = $factory->createHBox($align);
- my $cancelButton = $factory->createPushButton($hbox, $self->loc->N("Cancel"));
- my $deleteButton = $factory->createPushButton($hbox, $self->loc->N("Delete"));
-
- if ($homedir !~ m!(?:/home|/var/spool)!) {
- $checkhome->setDisabled();
- $checkspool->setDisabled();
- }
-
-
- while(1) {
- my $event = $dlg->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- # widget selected
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $deleteButton) {
- Sys::Syslog::syslog('info|local1', $self->loc->N("Removing user: %s", $username));
- my $option = undef;
- $option->{clean_home} = $checkhome->isChecked() if $checkhome->isChecked();
- $option->{clean_spool} = $checkspool->isChecked() if $checkspool->isChecked();
-
- my $err = $self->sh_users->deleteUser($username, $option);
- $self->sh_gui->msgBox({text => $err}) if (defined($err));
-
- #remove added icon
- $self->sh_users->removeKdmIcon($username);
- $self->_refresh();
- last;
- }
- }
- }
-
- destroy $dlg;
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle);
-
-}
-
-
-sub _addGroupDialog {
- my $self = shift;
-
- my $is_system = 0;
-
- ## push application title
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($self->loc->N("Create New Group"));
- my $factory = yui::YUI::widgetFactory;
- my $optional = yui::YUI::optionalWidgetFactory;
-
- my $dlg = $factory->createPopupDialog();
- my $layout = $factory->createVBox($dlg);
-
- ## 'group name'
- my $align = $factory->createRight($layout);
- my $hbox = $factory->createHBox($align);
- my $label = $factory->createLabel($hbox, $self->loc->N("Group Name:") );
- my $groupName = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $groupName->setWeight($yui::YD_HORIZ, 2);
-
- $factory->createVSpacing($layout, 1);
-
- # Specify group id manually
- $align = $factory->createLeft($layout);
- $hbox = $factory->createHBox($align);
- my $gidManually = $factory->createCheckBox($hbox, $self->loc->N("Specify group ID manually"), 0);
- $factory->createHSpacing($hbox, 2);
- my $GID = $factory->createIntField($hbox, $self->loc->N("GID"), 1, 65000, $self->sh_users->min_GID);
- $GID->setEnabled($gidManually->value());
- $gidManually->setNotify(1);
-
- $hbox = $factory->createHBox($layout);
- $align = $factory->createRight($hbox);
- my $cancelButton = $factory->createPushButton($align, $self->loc->N("Cancel"));
- my $okButton = $factory->createPushButton($hbox, $self->loc->N("Ok"));
- while(1) {
- my $event = $dlg->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- # widget selected
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $gidManually) {
- # GID inserction enabled?
- $GID->setEnabled($gidManually->value());
- }
- elsif ($widget == $okButton) {
- ## check data
- my $groupname = $groupName->value();
- my ($continue, $errorString) = $self->sh_users->valid_groupname($groupname);
- my $nm = $continue && $self->sh_users->groupNameExists($groupname);
- if ($nm) {
- $groupName->setValue("");
- $errorString = $self->loc->N("Group already exists, please choose another Group Name");
- $continue = 0;
- }
-
- my $gid = -1;
- if ($continue && $gidManually->value()) {
- if (($gid = $GID->value()) < $self->sh_users->min_GID) {
- $errorString = "";
- my $gidchoice = $self->sh_gui->ask_YesOrNo({ title => $self->loc->N(" Group Gid is < %n", $self->sh_users->min_GID),
- text => $self->loc->N("Creating a group with a GID less than %d is not recommended.\n Are you sure you want to do this?\n\n",
- $self->sh_users->min_GID
- )
- });
- $continue = $gidchoice;
- } else {
- if ($self->sh_users->groupIDExists($gid)) {
- $errorString = "";
- my $gidchoice = $self->sh_gui->ask_YesOrNo({title => $self->loc->N(" Group ID is already used "),
- text => $self->loc->N("Creating a group with a non unique GID?\n\n")});
- $continue = $gidchoice;
- }
- }
- }
-
-
- if (!$continue) {
- #--- raise error
- $self->sh_gui->msgBox({text => $errorString}) if ($errorString);
- }
- else {
- Sys::Syslog::syslog('info|local1', $self->loc->N("Adding group: %s ", $groupname));
- my $groupParams = {
- groupname => $groupname,
- is_system => $is_system,
- };
- $groupParams->{gid} = $gid if $gid != -1;
- $self->sh_users->addGroup($groupParams);
- $self->_refresh();
- last;
- }
- }
- }
- }
- destroy $dlg;
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle);
-}
-
-
-#=============================================================
-
-=head2 _buildUserData
-
-=head3 INPUT
-
- $self: this object
- $layout : layout in wich drawing graphic user data
-
-=head3 OUTPUT
-
- $userData: hash reference containing reference to graphical object
- such as:
- full_name, login_name, password, password1,
- login_shell
- full_name, login_name, password, password1,
- weakness (icon), login_shell
-
-=head3 DESCRIPTION
-
- This method is used by addUserDialog and _editUserDialog
- to create User Data dialog
-=cut
-
-#=============================================================
-sub _buildUserData {
- my ($self, $layout, $selected_shell) = @_;
-
-
- my @shells = @{$self->sh_users->getUserShells()};
-
- my $factory = yui::YUI::widgetFactory;
-
- ## user 'full name'
- my $align = $factory->createRight($layout);
- my $hbox = $factory->createHBox($align);
- my $label = $factory->createLabel($hbox, $self->loc->N("Full Name:") );
- $factory->createHSpacing($hbox, 2.0);
- my $fullName = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $fullName->setWeight($yui::YD_HORIZ, 2);
-
- ## user 'login name'
- $align = $factory->createRight($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Login:") );
- $factory->createHSpacing($hbox, 2.0);
- my $loginName = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $loginName->setWeight($yui::YD_HORIZ, 2);
- $loginName->setNotify(1);
-
- ## user 'Password'
- $align = $factory->createRight($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Password:") );
- my $weakness = undef;
- if (yui::YUI::app()->hasImageSupport()) {
- $factory->createHSpacing($hbox, 2.0);
- my $file = File::ShareDir::dist_file(ManaTools::Shared::distName(), 'images/Blank16x16.png');
- $weakness = $factory->createImage($hbox, $file);
- }
- else {
- $factory->createHSpacing($hbox, 1.0);
- $weakness = $factory->createLabel($hbox, " ");
- $factory->createHSpacing($hbox, 1.0);
- }
- my $password = $factory->createInputField($hbox, "", 1);
- $weakness->setWeight($yui::YD_HORIZ, 1);
- $label->setWeight($yui::YD_HORIZ, 1);
- $password->setWeight($yui::YD_HORIZ, 4);
- # notify input to check weakness
- $password->setNotify(1);
-
- ## user 'confirm Password'
- $align = $factory->createRight($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Confirm Password:") );
- $factory->createHSpacing($hbox, 2.0);
- my $password1 = $factory->createInputField($hbox, "", 1);
- $label->setWeight($yui::YD_HORIZ, 1);
- $password1->setWeight($yui::YD_HORIZ, 2);
-
- ## user 'Login Shell'
- $align = $factory->createRight($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Login Shell:") );
- $factory->createHSpacing($hbox, 2.0);
- my $loginShell = $factory->createComboBox($hbox, "", 0);
- my $itemColl = new yui::YItemCollection;
- foreach my $shell (@shells) {
- my $item = new yui::YItem ($shell, 0);
- $item->setSelected(1) if ($selected_shell && $selected_shell eq $shell);
- $itemColl->push($item);
- $item->DISOWN();
- }
- $loginShell->addItems($itemColl);
- $label->setWeight($yui::YD_HORIZ, 1);
- $loginShell->setWeight($yui::YD_HORIZ, 2);
-
- my %userData = (
- full_name => $fullName,
- login_name => $loginName,
- password => $password,
- password1 => $password1,
- weakness => $weakness,
- login_shell => $loginShell,
- );
-
- return ( \%userData );
-}
-
-# get/set icon button name
-# if $icon_name is present it sets as "&Icon icon_name", so the shortcut is always the same
-# if $icon_name is not present it returns the previous set $label
-sub _iconButtonLabel {
- my ($self, $icon_button, $icon_name) = @_;
-
- state $label = "";
-
- return if !$icon_button;
- return if ref $icon_button ne "yui::YPushButton";
-
- if ($icon_name) {
- #set
- $icon_button->setLabel($self->loc->N("&Icon (%s)", $icon_name));
- $label = $icon_name;
- }
-
- return $label;
-}
-
-
-#=============================================================
-
-=head2 addUserDialog
-
-=head3 INPUT
-
- $self: this object
- $standalone: if set the application title is set
- from the name set in costructor
-
-=head3 DESCRIPTION
-
- This method creates and manages the dialog to add a new
- user.
-
-=cut
-
-#=============================================================
-sub addUserDialog {
- my $self = shift;
- my $standalone = shift;
-
- if ($EUID != 0) {
- $self->sh_gui->warningMsgBox({
- title => $self->name,
- text => $self->loc->N("root privileges required"),
- });
- return;
- }
-
- my $dontcreatehomedir = 0;
- my $is_system = 0;
-
- ## push application title
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- if ($standalone) {
- yui::YUI::app()->setApplicationTitle($self->name);
- }
- else {
- yui::YUI::app()->setApplicationTitle($self->loc->N("Create New User"));
- }
-
- my $factory = yui::YUI::widgetFactory;
- my $optional = yui::YUI::optionalWidgetFactory;
-
- my $dlg = $factory->createPopupDialog();
- my $layout = $factory->createVBox($dlg);
-
- my $userData = $self->_buildUserData($layout);
-
- ##### add a separator
- ## Create Home directory
- my $align = $factory->createLeft($layout);
- my $hbox = $factory->createHBox($align);
- my $createHome = $factory->createCheckBox($hbox, $self->loc->N("Create Home Directory"), 1);
- ## Home directory
- $align = $factory->createLeft($layout);
- $hbox = $factory->createHBox($align);
- my $label = $factory->createLabel($hbox, $self->loc->N("Home Directory:") );
- $factory->createHSpacing($hbox, 2.0);
- my $homeDir = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $homeDir->setWeight($yui::YD_HORIZ, 2);
-
- # Create private group
- $align = $factory->createLeft($layout);
- $hbox = $factory->createHBox($align);
- my $createGroup = $factory->createCheckBox($hbox, $self->loc->N("Create a private group for the user"), 1);
-
- # Specify user id manually
- $align = $factory->createRight($layout);
- $hbox = $factory->createHBox($align);
- my $uidManually = $factory->createCheckBox($hbox, $self->loc->N("Specify user ID manually"), 0);
- $factory->createHSpacing($hbox, 2.0);
- my $UID = $factory->createIntField($hbox, $self->loc->N("UID"), 1, 65000, $self->sh_users->min_UID);
- $UID->setEnabled($uidManually->value());
- $uidManually->setNotify(1);
-# $uidManually->setWeight($yui::YD_HORIZ, 2);
- $UID->setWeight($yui::YD_HORIZ, 1);
-
- ## user 'icon'
- $hbox = $factory->createHBox($layout);
- $factory->createLabel($hbox, $self->loc->N("Click on icon to change it") );
- my $iconFace = $self->sh_users->GetFaceIcon();
- my $icon = $factory->createPushButton($hbox, "");
- $icon->setIcon($self->sh_users->face2png($iconFace));
- $self->_iconButtonLabel($icon, $iconFace);
-
- $hbox = $factory->createHBox($layout);
- $align = $factory->createRight($hbox);
- my $cancelButton = $factory->createPushButton($align, $self->loc->N("&Cancel"));
- my $okButton = $factory->createPushButton($hbox, $self->loc->N("&Ok"));
-
- while(1) {
- my $event = $dlg->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- # widget selected
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $icon) {
- #remove shortcut from label
- my $iconLabel = $self->_iconButtonLabel($icon);
- my $nextIcon = $self->sh_users->GetFaceIcon($iconLabel, 1);
- $self->_iconButtonLabel($icon, $nextIcon);
- $icon->setIcon($self->sh_users->face2png($nextIcon));
- }
- elsif ($widget == $uidManually) {
- # UID inserction enabled?
- $UID->setEnabled($uidManually->value());
- }
- elsif ($widget == $userData->{ login_name }) {
- my $username = $userData->{ login_name }->value();
- $homeDir->setValue("/home/$username");
- }
- elsif ($widget == $userData->{password}) {
- my $pass = $userData->{ password }->value();
- $self->_checkWeaknessPassword($pass, $userData->{ weakness });
- }
- elsif ($widget == $okButton) {
- ## check data
- my $username = $userData->{ login_name }->value();
- my ($continue, $errorString) = $self->sh_users->valid_username($username);
- my $nm = $continue && $self->sh_users->userNameExists($username);
- if ($nm) {
- $userData->{ login_name }->setValue("");
- $homeDir->setValue("");
- $errorString = $self->loc->N("User already exists, please choose another User Name");
- $continue = 0;
- }
- my $passwd = $continue && $userData->{ password }->value();
- if ($continue && $passwd ne $userData->{ password1 }->value()) {
- $errorString = $self->loc->N("Password Mismatch");
- $continue = 0;
- }
- if ($self->sh_users->weakPasswordForSecurityLevel($passwd)) {
- $errorString = $self->loc->N("This password is too simple. \n Good passwords should be > 6 characters");
- $continue = 0;
- }
- my $homedir;
- if ($continue && $createHome->value()) {
- $homedir = $homeDir->value();
- if ( -d $homedir) {
- $errorString = $self->loc->N("Home directory <%s> already exists.\nPlease uncheck the home creation option, or change the directory path name", $homedir);
- $continue = 0;
- }
- else {
- $dontcreatehomedir = 0;
- }
- } else {
- $dontcreatehomedir = 1;
- }
- my $uid = -1;
- if ($continue && $uidManually->value()) {
- if (($uid = $UID->value()) < $self->sh_users->min_UID) {
- $errorString = "";
- my $uidchoice = $self->sh_gui->ask_YesOrNo({title => $self->loc->N("User Uid is < %d", $self->sh_users->min_UID),
- text => $self->loc->N("Creating a user with a UID less than %d is not recommended.\nAre you sure you want to do this?\n\n", $self->sh_users->min_UID)});
- $continue = $uidchoice;
- }
- }
- my $gid = undef;
- if ($createGroup->value()) {
- if ($continue) {
- #Check if group exist
- if ($self->sh_users->groupNameExists($username)) {
- my $groupchoice = $self->ChooseGroup();
- if ($groupchoice == 0 ) {
- #You choose to put it in the existing group
- $gid = $self->sh_users->groupID($username);
- } elsif ($groupchoice == 1) {
- # Put it in 'users' group
- Sys::Syslog::syslog('info|local1', $self->loc->N("Putting %s to 'users' group",
- $username));
- $gid = $self->sh_users->Add2UsersGroup($username);
- }
- else {
- $errorString = "";
- $continue = 0;
- }
- } else {
- #it's a new group: Add it
- $gid = $self->sh_users->addGroup({
- groupname => $username,
- is_system => $is_system,
- });
- Sys::Syslog::syslog('info|local1', $self->loc->N("Creating new group: %s", $username));
- }
- }
- } else {
- $continue and $gid = $self->sh_users->Add2UsersGroup($username);
- }
-
- if (!$continue) {
- #---rasie error
- $self->sh_gui->msgBox({text => $errorString}) if ($errorString);
- }
- else {
- ## OK let's create the user
- print $self->loc->N("Adding user: ") . $username . " \n";
- Sys::Syslog::syslog('info|local1', $self->loc->N("Adding user: %s", $username));
- my $loginshell = $userData->{ login_shell }->value();
- my $fullname = $userData->{ full_name }->value();
- utf8::decode($fullname);
-
- my $userParams = {
- username => $username,
- is_system => $is_system,
- donotcreatehome => $dontcreatehomedir,
- shell => $loginshell,
- fullname => $fullname,
- gid => $gid,
- password => $passwd,
- };
- $userParams->{uid} = $uid if $uid != -1;
- $userParams->{homedir} = $homedir if !$dontcreatehomedir;
- $self->sh_users->addUser($userParams);
-
- defined $icon->label() and
- $self->sh_users->addKdmIcon($username, $icon->label());
-### TODO Migration wizard
-#
-# Refresh($sysfilter, $stringsearch);
-# transfugdrake::get_windows_disk()
-# and $in->ask_yesorno($self->loc->N("Migration wizard"),
-# $self->loc->N("Do you want to run the migration wizard in order to import Windows documents and settings in your Mageia distribution?"))
-# and run_program::raw({ detach => 1 }, 'transfugdrake');
-
-
- last;
- }
- }
- }
- }
-
- destroy $dlg;
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle;
-}
-
-#=============================================================
-
-=head2 _createUserTable
-
-=head3 INPUT
-
- $self: this object
-
-=head3 DESCRIPTION
-
-This function create the User table to be added to the replace
-point of the tab widget. Note this function is meant for internal
-use only
-
-=cut
-
-#=============================================================
-sub _createUserTable {
- my $self = shift;
-
- $self->dialog->startMultipleChanges();
- $self->get_widget('replace_pnt')->deleteChildren();
- my $parent = $self->get_widget('replace_pnt');
- my $factory = yui::YUI::widgetFactory;
- my $yTableHeader = new yui::YTableHeader();
- $yTableHeader->addColumn($self->loc->N("User Name"), $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("User ID"), $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("Primary Group"), $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("Full Name"), $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("Login Shell"), $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("Home Directory"), $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("Status"), $yui::YAlignBegin);
- $yTableHeader->DISOWN();
-
- $self->set_widget(table => $factory->createTable($parent, $yTableHeader));
-
- $self->get_widget('table')->setImmediateMode(1);
- $self->get_widget('table')->DISOWN();
- $self->get_widget('replace_pnt')->showChild();
- $self->dialog->recalcLayout();
- $self->dialog->doneMultipleChanges();
- $self->_refreshUsers();
-}
-
-#=============================================================
-
-=head2 _createGroupTable
-
-=head3 INPUT
-
- $self: this object
-
-=head3 DESCRIPTION
-
-This function create the Group table to be added to the replace
-point of the tab widget. Note this function is meant for internal
-use only
-
-
-=cut
-
-#=============================================================
-sub _createGroupTable {
- my $self = shift;
-
-
- $self->dialog->startMultipleChanges();
- $self->get_widget('replace_pnt')->deleteChildren();
- my $parent = $self->get_widget('replace_pnt');
- my $factory = yui::YUI::widgetFactory;
- my $yTableHeader = new yui::YTableHeader();
- $yTableHeader->addColumn($self->loc->N("Group Name"), $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("Group ID"), $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("Group Members"), $yui::YAlignBegin);
- $yTableHeader->DISOWN();
-
- $self->set_widget(table => $factory->createTable($parent, $yTableHeader));
-
- $self->get_widget('table')->setImmediateMode(1);
- $self->get_widget('table')->DISOWN();
- $self->get_widget('replace_pnt')->showChild();
- $self->dialog->recalcLayout();
- $self->dialog->doneMultipleChanges();
- $self->_refreshGroups();
-}
-
-
-
-
-#=============================================================
-
-=head2 _refreshUsers
-
-=head3 INPUT
-
- $self: this object
-
-=head3 DESCRIPTION
-
- This method refresh user info into User tab widget.
- Note this function is meant for internal use only
-
-=cut
-
-#=============================================================
-sub _refreshUsers {
- my $self = shift;
-
- my $strfilt = $self->get_widget('filter')->value();
- my $filterusers = $self->get_widget('filter_system')->isChecked();
-
- my $usersInfo = $self->sh_users->getUsersInfo({
- username_filter => $strfilt,
- filter_system => $filterusers,
- });
-
-
- $self->dialog->startMultipleChanges();
- #for some reasons QT send an event using table->selectItem()
- # WA remove notification immediate
- $self->get_widget('table')->setImmediateMode(0);
- $self->get_widget('table')->deleteAllItems();
-
- my $itemColl = new yui::YItemCollection;
- foreach my $username (keys %{$usersInfo}) {
- my $info = $usersInfo->{$username};
- my $item = new yui::YTableItem (
- "$username",
- "$info->{uid}",
- "$info->{group}",
- "$info->{fullname}",
- "$info->{shell}",
- "$info->{home}",
- "$info->{status}"
- );
-
- # TODO workaround to get first cell at least until we don't
- # a cast from YItem
- $item->setLabel( $username );
- $itemColl->push($item);
- $item->DISOWN();
- }
-
- $self->get_widget('table')->addItems($itemColl);
- my $item = $self->get_widget('table')->selectedItem();
- $self->get_widget('table')->selectItem($item, 0) if $item;
- $self->dialog->recalcLayout();
- $self->dialog->doneMultipleChanges();
- $self->_refreshActions();
- $self->get_widget('table')->setImmediateMode(1);
-}
-
-#=============================================================
-
-=head2 _refreshGroups
-
-=head3 INPUT
-
- $self: this object
-
-=head3 DESCRIPTION
-
- This method refresh group info into Group tab widget.
- Note this function is meant for internal use only
-
-=cut
-
-#=============================================================
-sub _refreshGroups {
- my $self = shift;
-
- my $strfilt = $self->get_widget('filter')->value();
- my $filtergroups = $self->get_widget('filter_system')->isChecked();
-
- $self->dialog->startMultipleChanges();
- #for some reasons QT send an event using table->selectItem()
- # WA remove notification immediate
- $self->get_widget('table')->setImmediateMode(0);
- $self->get_widget('table')->deleteAllItems();
-
- my $groupInfo = $self->sh_users->getGroupsInfo({
- groupname_filter => $strfilt,
- filter_system => $filtergroups,
- });
-
- my $itemColl = new yui::YItemCollection;
- foreach my $groupname (keys %{$groupInfo}) {
- my $info = $groupInfo->{$groupname};
- my $listUbyG = join(',', @{$info->{members}});
- my $item = new yui::YTableItem ("$groupname",
- "$info->{gid}",
- "$listUbyG");
- $item->setLabel( $groupname );
- $itemColl->push($item);
- $item->DISOWN();
- }
-
- $self->get_widget('table')->addItems($itemColl);
- my $item = $self->get_widget('table')->selectedItem();
- $self->get_widget('table')->selectItem($item, 0) if $item;
- $self->dialog->recalcLayout();
- $self->dialog->doneMultipleChanges();
- $self->_refreshActions();
- $self->get_widget('table')->setImmediateMode(1);
-}
-
-
-#=============================================================
-
-=head2 _getUserInfo
-
-=head3 INPUT
-
- $self: this object
-
-=head3 OUTPUT
-
- $userData: HASH reference containing:
- username: username
- full_name: full name of user
- shell: shell used
- homedir: home dir path
- UID: User identifier
- acc_check_exp: account expiration enabling
- acc_expy: account expiration year
- acc_expm: account expiration month
- acc_expd: account expiration day
- lockuser: account locked
- pwd_check_exp: password expiration enabling
- pwd_exp_min: days before changing password
- is allowed
- pwd_exp_max: days before changing password
- is required
- pwd_exp_warn: warning days before changing
- pwd_exp_inact: days before account becomes
- inact
- members: Array containing groups the user
- belongs to.
- primary_group: primary group ID for the user
-
-=head3 DESCRIPTION
-
- Retrieves the selected user info from the system
- Note that acc_expy, acc_expm and acc_expd are valid if
- acc_check_exp is enabled.
- Note that pwd_exp_min, pwd_exp_max, pwd_exp_warn,
- pwd_exp_inact are valid if pwd_check_exp is enabled.
-
-=cut
-
-#=============================================================
-
-sub _getUserInfo {
- my $self = shift;
-
- my $label = $self->_skipShortcut($self->get_widget('tabs')->selectedItem()->label());
- if ($label ne $self->loc->N("Users") ) {
- return undef;
- }
-
- my $item = $self->get_widget('table')->selectedItem();
- if (! $item) {
- return undef;
- }
-
- my %userData;
- $userData{old_username} = $item->label();
- $userData{username} = $item->label();
-
- my $userInfo = $self->sh_users->getUserInfo($userData{username});
-
- $userData{full_name} = $userInfo->{fullname};
- $userData{shell} = $userInfo->{shell};
- $userData{homedir} = $userInfo->{home};
- $userData{UID} = $userInfo->{uid};
-
- # default expiration time
- my ($day, $mo, $ye) = (localtime())[3, 4, 5];
- $userData{acc_expy} = $ye+1900;
- $userData{acc_expm} = $mo+1;
- $userData{acc_expd} = $day;
- $userData{acc_check_exp} = 0;
-
- my $expire = $userInfo->{expire};
- if ($expire && $expire != -1) {
- my $times = _TimeOfArray($expire, 1);
- $userData{acc_expy} = $times->{year};
- $userData{acc_expm} = $times->{month};
- $userData{acc_expd} = $times->{dayint};
- $userData{acc_check_exp} = 1;
- }
-
- # user password are not retrieved if admin wants
- # to change it has to insert a new one
- $userData{password} = undef;
- $userData{password1} = undef;
-
- $userData{lockuser} = $userInfo->{locked};
- $userData{icon_face} = $self->sh_users->GetFaceIcon($userData{username});
-
- $userData{pwd_check_exp} = 0;
- $userData{pwd_exp_min} = $userInfo->{exp_min};
- $userData{pwd_exp_max} = $userInfo->{exp_max};
- $userData{pwd_exp_warn} = $userInfo->{exp_warn};
- $userData{pwd_exp_inact} = $userInfo->{exp_inact};
- if ($userData{pwd_exp_min} && $userData{pwd_exp_min} != -1 ||
- $userData{pwd_exp_max} && $userData{pwd_exp_max} != 99999 ||
- $userData{pwd_exp_warn} && $userData{pwd_exp_warn} != 7 && $userData{pwd_exp_warn} != -1 ||
- $userData{pwd_exp_inact} && $userData{pwd_exp_inact} != -1) {
- $userData{pwd_check_exp} = 1;
- }
-
- $userData{members} = $userInfo->{members};
- $userData{primary_group} = $userInfo->{gid};
-
- return \%userData;
-}
-
-#=============================================================
-
-=head2 _getUserInfo
-
-=head3 INPUT
-
- $self: this object
-
-=head3 OUTPUT
-
- %groupData: selected group info as:
- $groupname: group name
- $members: users that are members of this group
-
-=head3 DESCRIPTION
-
- Retrieves the selected group info from the system
-
-=cut
-
-#=============================================================
-
-sub _getGroupInfo {
- my $self = shift;
-
- my $label = $self->_skipShortcut($self->get_widget('tabs')->selectedItem()->label());
- if ($label ne $self->loc->N("Groups") ) {
- return undef;
- }
-
- my $item = $self->get_widget('table')->selectedItem();
- if (! $item) {
- return undef;
- }
-
- my %groupData;
- $groupData{start_groupname} = $item->label();
- $groupData{groupname} = $item->label();
-
- $groupData{members} = $self->sh_users->groupMembers($groupData{groupname});
-
- return %groupData;
-
-}
-
-sub _storeDataFromGroupEditPreviousTab {
- my ($self, %groupData) = @_;
-
- my $previus_tab = $self->get_edit_tab_widget('edit_tab_label');
- if (!$previus_tab) {
- return %groupData;
- }
- elsif ($previus_tab eq $groupEditLabel{group_data}) {
- $groupData{groupname} = $self->get_edit_tab_widget('groupname')->value();
- }
- elsif ($previus_tab eq $groupEditLabel{group_users}) {
- my $tbl = $self->get_edit_tab_widget('members');
- $groupData{members} = undef;
- my @members;
- my $i;
- for($i=0;$i<$tbl->itemsCount();$i++) {
- push (@members, $tbl->item($i)->label()) if $tbl->toCBYTableItem($tbl->item($i))->checked();
- }
- $groupData{members} = [ @members ];
- }
-
- return %groupData;
-}
-
-
-sub _storeDataFromUserEditPreviousTab {
- my ($self, $userData) = @_;
-
- my $previus_tab = $self->get_edit_tab_widget('edit_tab_label');
- if (!$previus_tab) {
- return $userData;
- }
- elsif ($previus_tab eq $userEditLabel{user_data}) {
- $userData->{full_name} = $self->get_edit_tab_widget('full_name')->value();
- $userData->{username} = $self->get_edit_tab_widget('login_name')->value() ;
- $userData->{shell} = $self->get_edit_tab_widget('login_shell')->value();
- $userData->{homedir} = $self->get_edit_tab_widget('homedir')->value();
- my $passwd = $self->get_edit_tab_widget('password')->value();
- $userData->{password} = $passwd;
- $passwd = $self->get_edit_tab_widget('password1')->value();
- $userData->{password1} = $passwd;
- }
- elsif ($previus_tab eq $userEditLabel{account_info}) {
- $userData->{acc_check_exp} = $self->get_edit_tab_widget('acc_check_exp')->value();
- $userData->{acc_expy} = $self->get_edit_tab_widget('acc_expy')->value();
- $userData->{acc_expm} = $self->get_edit_tab_widget('acc_expm')->value();
- $userData->{acc_expd} = $self->get_edit_tab_widget('acc_expd')->value();
- $userData->{lockuser} = $self->get_edit_tab_widget('lockuser')->value();
- $userData->{icon_face} = $self->_iconButtonLabel($self->get_edit_tab_widget('icon_face'));
- }
- elsif ($previus_tab eq $userEditLabel{password_info}) {
- $userData->{pwd_check_exp} = $self->get_edit_tab_widget('pwd_check_exp')->value();
- $userData->{pwd_exp_min} = $self->get_edit_tab_widget('pwd_exp_min')->value();
- $userData->{pwd_exp_max} = $self->get_edit_tab_widget('pwd_exp_max')->value();
- $userData->{pwd_exp_warn} = $self->get_edit_tab_widget('pwd_exp_warn')->value();
- $userData->{pwd_exp_inact} = $self->get_edit_tab_widget('pwd_exp_inact')->value();
- }
- elsif ($previus_tab eq $userEditLabel{groups}) {
- my $tbl = $self->get_edit_tab_widget('members');
- $userData->{members} = undef;
- my @members;
- my $i;
- for($i=0;$i<$tbl->itemsCount();$i++) {
- push (@members, $tbl->item($i)->label()) if $tbl->toCBYTableItem($tbl->item($i))->checked();
- }
- $userData->{members} = \@members;
-
- if ($self->get_edit_tab_widget('primary_group')->selectedItem()) {
- my $groupname = $self->get_edit_tab_widget('primary_group')->selectedItem()->label();
- my $primgroup = $self->sh_users->groupID($groupname);
- $userData->{primary_group} = $primgroup;
- }
- else {
- $userData->{primary_group} = -1;
- }
- }
-
- return $userData;
-}
-
-#=============================================================
-
-=head2 _userDataTabWidget
-
-=head3 INPUT
-
- $self: this object
- $dialog: YUI dialog that owns the YUI replace point
- $replace_pnt: YUI replace point, needed to add a new tab
- widget
- $userData: hash reference containing user data info, tabs are
- removed and added again on selection, so
- data must be saved outside of widgets.
-
-=head3 OUTPUT
-
- $userDataWidget: hash containing new YUI widget objects
- such as:
- returned onject from _buildUserData and
- homedir.
-
-=head3 DESCRIPTION
-
- This internal method removes old tab widget saving its
- relevant data into userData and creates new selected table
- to be shown.
-
-=cut
-
-#=============================================================
-sub _userDataTabWidget {
- my ($self, $dialog, $replace_pnt, $userData) = @_;
-
- my $factory = yui::YUI::widgetFactory;
-
- $dialog->startMultipleChanges();
-
- $replace_pnt->deleteChildren();
- my $layout = $factory->createVBox($replace_pnt);
- my $userDataWidget = $self->_buildUserData($layout, $userData->{shell});
-
- ## user 'login name'
- my $align = $factory->createRight($layout);
- my $hbox = $factory->createHBox($align);
- my $label = $factory->createLabel($hbox, $self->loc->N("Home:") );
- $factory->createHSpacing($hbox, 2.0);
- $userDataWidget->{homedir} = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $userDataWidget->{homedir}->setWeight($yui::YD_HORIZ, 2);
-
- # fill data into widgets
- ##
- # full_name, login_name, password, password1,
- # login_shell
- $userDataWidget->{full_name}->setValue($userData->{full_name});
- $userDataWidget->{login_name}->setValue($userData->{username});
- yui::YUI::ui()->blockEvents();
- $userDataWidget->{password}->setValue($userData->{password}) if $userData->{password};
- yui::YUI::ui()->unblockEvents();
- $userDataWidget->{password1}->setValue($userData->{password1}) if $userData->{password1};
- $userDataWidget->{homedir}->setValue($userData->{homedir});
-
- $replace_pnt->showChild();
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
-
- return $userDataWidget;
-}
-
-
-#=============================================================
-
-=head2 _groupDataTabWidget
-
-=head3 INPUT
-
- $self: this object
- $dialog: YUI dialog that owns the YUI replace point
- $replace_pnt: YUI replace point, needed to add a new tab
- widget
- %groupData: hash containing group data info, tabs are
- removed and added again on selection, so
- data must be saved outside of widgets.
- $previus_tab: previous tab widget label, needed to store
- group data from the old tab before removing
- it, if user changed something.
-
-=head3 OUTPUT
-
- %groupDataWidget: hash containing new YUI widget objects
- such as:
- groupname.
-
-=head3 DESCRIPTION
-
- This internal method removes old tab widget saving its
- relevant data into groupData and creates new selected table
- to be shown.
-
-=cut
-
-#=============================================================
-sub _groupDataTabWidget {
- my ($self, $dialog, $replace_pnt, %groupData) = @_;
-
- my $factory = yui::YUI::widgetFactory;
-
- $dialog->startMultipleChanges();
-
- $replace_pnt->deleteChildren();
- my $layout = $factory->createVBox($replace_pnt);
-
- my %groupDataWidget;
-
- ## user 'login name'
- my $align = $factory->createRight($layout);
- my $hbox = $factory->createHBox($align);
- my $label = $factory->createLabel($hbox, $self->loc->N("Group Name:") );
- $groupDataWidget{groupname} = $factory->createInputField($hbox, "", 0);
- $label->setWeight($yui::YD_HORIZ, 1);
- $groupDataWidget{groupname}->setWeight($yui::YD_HORIZ, 2);
-
- $groupDataWidget{groupname}->setValue($groupData{groupname});
-
- $replace_pnt->showChild();
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
-
- return %groupDataWidget;
-}
-
-
-sub _userAccountInfoTabWidget {
- my ($self, $dialog, $replace_pnt, $userData) = @_;
-
- my $factory = yui::YUI::widgetFactory;
-
- $dialog->startMultipleChanges();
-
- $replace_pnt->deleteChildren();
- my $layout = $factory->createVBox($replace_pnt);
-
- my %userAccountWidget;
- $userAccountWidget{acc_check_exp} = $factory->createCheckBoxFrame($layout, $self->loc->N("Enable account expiration"), 1);
- my $align = $factory->createRight($userAccountWidget{acc_check_exp});
- my $hbox = $factory->createHBox($align);
- my $label = $factory->createLabel($hbox, $self->loc->N("Account expires (YYYY-MM-DD):"));
- $userAccountWidget{acc_expy} = $factory->createIntField($hbox, "", 1970, 9999, $userData->{acc_expy});
- $userAccountWidget{acc_expm} = $factory->createIntField($hbox, "", 1, 12, $userData->{acc_expm});
- $userAccountWidget{acc_expd} = $factory->createIntField($hbox, "", 1, 31, $userData->{acc_expd});
- $userAccountWidget{acc_check_exp}->setValue($userData->{acc_check_exp});
- $label->setWeight($yui::YD_HORIZ, 2);
- $align = $factory->createLeft($layout);
- $userAccountWidget{lockuser} = $factory->createCheckBox($align, $self->loc->N("Lock User Account"), $userData->{lockuser});
-
- $align = $factory->createLeft($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Click on the icon to change it"));
- $userAccountWidget{icon_face} = $factory->createPushButton($hbox, "");
- $userAccountWidget{icon_face}->setIcon($self->sh_users->face2png($userData->{icon_face}));
- $self->_iconButtonLabel($userAccountWidget{icon_face}, $userData->{icon_face});
-
- $replace_pnt->showChild();
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
-
- return \%userAccountWidget;
-}
-
-
-sub _userPasswordInfoTabWidget {
- my ($self, $dialog, $replace_pnt, $userData) = @_;
-
- my $factory = yui::YUI::widgetFactory;
-
- $dialog->startMultipleChanges();
-
- $replace_pnt->deleteChildren();
- my $layout = $factory->createVBox($replace_pnt);
-
- my %userPasswordWidget;
-
- my $userInfo = $self->sh_users->getUserInfo($userData->{username});
- my $lastchg = $userInfo->{last_change};
-
- my $align = $factory->createLeft($layout);
- my $hbox = $factory->createHBox($align);
- my $label = $factory->createLabel($hbox, $self->loc->N("User last changed password on: "));
- my $dayStr = $factory->createLabel($hbox, "");
- my $month = $factory->createLabel($hbox, "");
- my $dayInt = $factory->createLabel($hbox, "");
- my $year = $factory->createLabel($hbox, "");
- if ($lastchg) {
- my $times = _TimeOfArray($lastchg, 0);
- $dayStr->setValue($times->{daystr});
- $month->setValue($times->{month});
- $dayInt->setValue($times->{dayint});
- $year->setValue($times->{year});
- }
-
- $userPasswordWidget{pwd_check_exp} = $factory->createCheckBoxFrame($layout, $self->loc->N("Enable Password Expiration"), 1);
- $layout = $factory->createVBox($userPasswordWidget{pwd_check_exp});
- $align = $factory->createLeft($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Days before change allowed:"));
- $userPasswordWidget{pwd_exp_min} = $factory->createInputField($hbox, "", 0);
- $userPasswordWidget{pwd_exp_min}->setValue("$userData->{pwd_exp_min}");
- $label->setWeight($yui::YD_HORIZ, 1);
- $userPasswordWidget{pwd_exp_min}->setWeight($yui::YD_HORIZ, 2);
-
- $align = $factory->createLeft($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Days before change required:"));
- $userPasswordWidget{pwd_exp_max} = $factory->createInputField($hbox, "", 0);
- $userPasswordWidget{pwd_exp_max}->setValue("$userData->{pwd_exp_max}");
- $label->setWeight($yui::YD_HORIZ, 1);
- $userPasswordWidget{pwd_exp_max}->setWeight($yui::YD_HORIZ, 2);
-
- $align = $factory->createLeft($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Days warning before change:"));
- $userPasswordWidget{pwd_exp_warn} = $factory->createInputField($hbox, "", 0);
- $userPasswordWidget{pwd_exp_warn}->setValue("$userData->{pwd_exp_warn}");
- $label->setWeight($yui::YD_HORIZ, 1);
- $userPasswordWidget{pwd_exp_warn}->setWeight($yui::YD_HORIZ, 2);
-
- $align = $factory->createLeft($layout);
- $hbox = $factory->createHBox($align);
- $label = $factory->createLabel($hbox, $self->loc->N("Days before account inactive:"));
- $userPasswordWidget{pwd_exp_inact} = $factory->createInputField($hbox, "", 0);
- $userPasswordWidget{pwd_exp_inact}->setValue("$userData->{pwd_exp_inact}");
- $label->setWeight($yui::YD_HORIZ, 1);
- $userPasswordWidget{pwd_exp_inact}->setWeight($yui::YD_HORIZ, 2);
-
- $userPasswordWidget{pwd_check_exp}->setValue($userData->{pwd_check_exp});
-
- $replace_pnt->showChild();
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
-
- return \%userPasswordWidget;
-}
-
-sub _groupUsersTabWidget {
- my ($self, $dialog, $replace_pnt, %groupData) = @_;
-
- my $factory = yui::YUI::widgetFactory;
- my $mageiaPlugin = "mga";
- my $mgaFactory = yui::YExternalWidgets::externalWidgetFactory($mageiaPlugin);
- $mgaFactory = yui::YMGAWidgetFactory::getYMGAWidgetFactory($mgaFactory);
-
- $dialog->startMultipleChanges();
-
- $replace_pnt->deleteChildren();
-
- my %groupUsersWidget;
-
- my $layout = _labeledFrameBox($replace_pnt, $self->loc->N("Select the users to join this group:"));
-
- my $yTableHeader = new yui::YTableHeader();
- $yTableHeader->addColumn("", $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("User"), $yui::YAlignBegin);
-
- $groupUsersWidget{members} = $mgaFactory->createCBTable($layout, $yTableHeader, $yui::YCBTableCheckBoxOnFirstColumn);
-
- my $users = $self->sh_users->getUsers();
- my @susers = sort(@$users);
-
- my $itemCollection = new yui::YItemCollection;
- my $members = $groupData{members};
- foreach my $user (@susers) {
- my $item = new yui::YCBTableItem($user);
- $item->check(MDK::Common::DataStructure::member($user, @$members));
- $item->setLabel($user);
- $itemCollection->push($item);
- $item->DISOWN();
- }
- $groupUsersWidget{members}->addItems($itemCollection);
-
- $replace_pnt->showChild();
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
-
- return %groupUsersWidget;
-}
-
-sub _userGroupsTabWidget {
- my ($self, $dialog, $replace_pnt, $userData) = @_;
-
- my $factory = yui::YUI::widgetFactory;
- my $mageiaPlugin = "mga";
- my $mgaFactory = yui::YExternalWidgets::externalWidgetFactory($mageiaPlugin);
- $mgaFactory = yui::YMGAWidgetFactory::getYMGAWidgetFactory($mgaFactory);
-
- $dialog->startMultipleChanges();
-
- $replace_pnt->deleteChildren();
-
- my %userGroupsWidget;
- my $userInfo = $self->sh_users->getUserInfo($userData->{username});
- my $lastchg = $userInfo->{last_change};
-
- my $layout = _labeledFrameBox($replace_pnt, $self->loc->N("Select groups that the user will be member of:"));
-
- my $yTableHeader = new yui::YTableHeader();
- $yTableHeader->addColumn("", $yui::YAlignBegin);
- $yTableHeader->addColumn($self->loc->N("Group"), $yui::YAlignBegin);
-
- $userGroupsWidget{members} = $mgaFactory->createCBTable($layout, $yTableHeader, $yui::YCBTableCheckBoxOnFirstColumn);
-
- my $grps = $self->sh_users->getGoups();
- my @sgroups = sort @$grps;
-
- my $itemCollection = new yui::YItemCollection;
- my $members = $userData->{members};
- foreach my $group (@sgroups) {
- my $item = new yui::YCBTableItem($group);
- $item->check(MDK::Common::DataStructure::member($group, @$members));
- $item->setLabel($group);
- $itemCollection->push($item);
- $item->DISOWN();
- }
- $userGroupsWidget{members}->addItems($itemCollection);
- $userGroupsWidget{members}->setNotify(1);
- my $primgroup = '';
- if ($userData->{primary_group} != -1) {
- $primgroup = $self->sh_users->groupName($userData->{primary_group});
- }
-
- my $align = $factory->createLeft($layout);
- my $hbox = $factory->createHBox($align);
- my $label = $factory->createLabel($hbox, $self->loc->N("Primary Group"));
- $userGroupsWidget{primary_group} = $factory->createComboBox($hbox, "", 0);
- my $itemColl = new yui::YItemCollection;
- foreach my $member (@$members) {
- my $item = new yui::YItem ($member, 0);
- $item->setSelected(1) if ($item->label() eq $primgroup);
- $itemColl->push($item);
- $item->DISOWN();
- }
- $userGroupsWidget{primary_group}->addItems($itemColl);
- $label->setWeight($yui::YD_HORIZ, 1);
- $userGroupsWidget{primary_group}->setWeight($yui::YD_HORIZ, 2);
-
- $replace_pnt->showChild();
- $dialog->recalcLayout();
- $dialog->doneMultipleChanges();
-
- return \%userGroupsWidget;
-}
-
-sub _groupEdit_Ok {
- my ($self, %groupData) = @_;
-
- # update last changes if any
- %groupData = $self->_storeDataFromGroupEditPreviousTab(%groupData);
-
- my ($continue, $errorString) = $self->sh_users->valid_groupname($groupData{groupname});
- if (!$continue) {
- $self->sh_gui->msgBox({text => $errorString}) if ($errorString);
- return $continue;
- }
-
- my $groupInfo = {
- groupname => $groupData{groupname},
- members => $groupData{members},
- };
-
- if ($groupData{start_groupname} ne $groupData{groupname}) {
- $groupInfo->{old_groupname} = $groupData{start_groupname};
- }
-
- my $retval = $self->sh_users->modifyGroup($groupInfo);
-
- if (!$retval->{status}) {
- $self->sh_gui->msgBox({text => $retval->{error}} );
- }
-
- $self->_refresh();
-
- return 1;
-}
-
-sub _userEdit_Ok {
- my ($self, $userData) = @_;
-
- # update last changes if any
- $self->_storeDataFromUserEditPreviousTab($userData);
-
- my ($continue, $errorString) = $self->sh_users->valid_username($userData->{username});
- if (!$continue) {
- $self->sh_gui->msgBox({text => $errorString}) if ($errorString);
- return $continue;
- }
-
- if ( $userData->{password} ne $userData->{password1}) {
- $self->sh_gui->msgBox({text => $self->loc->N("Password Mismatch")});
- return 0;
- }
-
- if ($userData->{password} ne '') {
- if ($self->sh_users->weakPasswordForSecurityLevel($userData->{password})) {
- $self->sh_gui->msgBox({text => $self->loc->N("This password is too simple. \n Good passwords should be > 6 characters")});
- return 0;
- }
- }
-
- if ($userData->{primary_group} == -1) {
- $self->sh_gui->msgBox({ text => $self->loc->N("Please select at least one group for the user")});
- return 0;
- }
-
- my $userInfo = {
- username => $userData->{username},
- fullname => $userData->{full_name},
- homedir => $userData->{homedir},
- shell => $userData->{shell},
- members => $userData->{members},
- gid => $userData->{primary_group},
- lockuser => $userData->{lockuser},
- };
-
- $userInfo->{old_username} = $userData->{old_username} if $userData->{username} ne $userData->{old_username};
- $userInfo->{password} = $userData->{password} if $userData->{password} ne '';
-
-
- if ($userData->{acc_check_exp}) {
- my $yr = $userData->{acc_expy};
- my $mo = $userData->{acc_expm};
- my $dy = $userData->{acc_expd};
- if (!_ValidInt($yr, $dy, $mo)) {
- $self->sh_gui->msgBox({text => $self->loc->N("Please specify Year, Month and Day \n for Account Expiration ")});
- return 0;
- }
- $userInfo->{acc_expires} = {
- exp_y => $yr,
- exp_m => $mo,
- exp_d => $dy,
- };
- }
-
- if ($userData->{pwd_check_exp}) {
- my $allowed = int($userData->{pwd_exp_min});
- my $required = int($userData->{pwd_exp_max});
- my $warning = int($userData->{pwd_exp_warn});
- my $inactive = int($userData->{pwd_exp_inact});
- if (!$allowed || !$required || !$warning || !$inactive) {
- $self->sh_gui->msgBox({text => $self->loc->N("Please fill up all fields in password aging\n")});
- return 0;
- }
- $userInfo->{password_expires} = {
- exp_min => $allowed,
- exp_max => $required,
- exp_warn => $warning,
- exp_inact => $inactive,
- };
- }
-
- $self->sh_users->modifyUser($userInfo);
-
-
- defined $userData->{icon_face} and $self->sh_users->addKdmIcon($userData->{username}, $userData->{icon_face});
- $self->_refresh();
-
- return 1;
-}
-
-
-# check the password and set the widget accordingly
-sub _checkWeaknessPassword {
- my ($self, $password, $weakness_widget) = @_;
-
- my $strongp = $self->sh_users->strongPassword($password);
- if (yui::YUI::app()->hasImageSupport()) {
- my $file = File::ShareDir::dist_file(ManaTools::Shared::distName(), 'images/Warning_Shield_Grey16x16.png');
- if ($strongp) {
- $file = File::ShareDir::dist_file(ManaTools::Shared::distName(), 'images/Checked_Shield_Green16x16.png');
- }
- $weakness_widget->setImage($file);
- }
- else {
- # For ncurses set a label
- $weakness_widget->setValue(($strongp ? $self->loc->N("Strong") : $self->loc->N("Weak")));
- }
-}
-
-sub _editUserDialog {
- my $self = shift;
-
- my $dontcreatehomedir = 0;
- my $is_system = 0;
-
- ## push application title
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($self->loc->N("Edit User"));
-
- my $factory = yui::YUI::widgetFactory;
- my $optional = yui::YUI::optionalWidgetFactory;
-
- my $dlg = $factory->createPopupDialog();
- my $layout = $factory->createVBox($dlg);
-
- my %tabs;
- if ($optional->hasDumbTab()) {
- my $hbox = $factory->createHBox($layout);
- my $align = $factory->createHCenter($hbox);
- $tabs{widget} = $optional->createDumbTab($align);
-
- $tabs{user_data} = new yui::YItem($userEditLabel{user_data});
- $tabs{user_data}->setSelected();
- $tabs{used} = $tabs{user_data}->label();
- $tabs{widget}->addItem( $tabs{user_data} );
- $tabs{user_data}->DISOWN();
-
- $tabs{account_info} = new yui::YItem($userEditLabel{account_info});
- $tabs{widget}->addItem( $tabs{account_info} );
- $tabs{account_info}->DISOWN();
-
- $tabs{password_info} = new yui::YItem($userEditLabel{password_info});
- $tabs{widget}->addItem( $tabs{password_info} );
- $tabs{password_info}->DISOWN();
-
- $tabs{groups} = new yui::YItem($userEditLabel{groups});
- $tabs{widget}->addItem( $tabs{groups} );
- $tabs{groups}->DISOWN();
-
- my $vbox = $factory->createVBox($tabs{widget});
- $align = $factory->createLeft($vbox);
- $tabs{replace_pnt} = $factory->createReplacePoint($align);
-
- $hbox = $factory->createHBox($vbox);
- $align = $factory->createRight($hbox);
- my $cancelButton = $factory->createPushButton($align, $self->loc->N("&Cancel"));
- my $okButton = $factory->createPushButton($hbox, $self->loc->N("&Ok"));
-
- my $userData = $self->_getUserInfo();
- # userData here should be tested because it could be undef
-
- # Useful entry point for the current edit user/group tab widget
- $self->set_edit_tab_widget( %{$self->_userDataTabWidget($dlg, $tabs{replace_pnt}, $userData)} );
- $self->set_edit_tab_widget( edit_tab_label => $userEditLabel{user_data});
-
- while(1) {
- my $event = $dlg->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::MenuEvent) {
- ### MENU ###
- my $item = $event->item();
- if ($item->label() eq $tabs{user_data}->label()) {
- $self->_storeDataFromUserEditPreviousTab($userData);
- my $edit_tab = $self->_userDataTabWidget($dlg, $tabs{replace_pnt}, $userData );
- $self->edit_tab_widgets( {} );
- $self->set_edit_tab_widget(%{$edit_tab});
- $self->set_edit_tab_widget( edit_tab_label => $userEditLabel{user_data});
- }
- elsif ($item->label() eq $tabs{account_info}->label()) {
- $self->_storeDataFromUserEditPreviousTab($userData);
- my $edit_tab = $self->_userAccountInfoTabWidget($dlg, $tabs{replace_pnt}, $userData );
- $self->edit_tab_widgets( {} );
- $self->set_edit_tab_widget(%{$edit_tab});
- $self->set_edit_tab_widget( edit_tab_label => $userEditLabel{account_info});
- }
- elsif ($item->label() eq $tabs{password_info}->label()) {
- $self->_storeDataFromUserEditPreviousTab($userData);
- my $edit_tab = $self->_userPasswordInfoTabWidget($dlg, $tabs{replace_pnt}, $userData );
- $self->edit_tab_widgets( {} );
- $self->set_edit_tab_widget(%{$edit_tab});
- $self->set_edit_tab_widget( edit_tab_label => $userEditLabel{password_info});
- }
- elsif ($item->label() eq $tabs{groups}->label()) {
- $self->_storeDataFromUserEditPreviousTab($userData);
- my $edit_tab = $self->_userGroupsTabWidget($dlg, $tabs{replace_pnt}, $userData );
- $self->edit_tab_widgets( {} );
- $self->set_edit_tab_widget(%{$edit_tab});
- $self->set_edit_tab_widget( edit_tab_label => $userEditLabel{groups});
- }
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- ### widget
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $self->get_edit_tab_widget('password')) {
- my $pass = $self->get_edit_tab_widget('password')->value();
- $self->_checkWeaknessPassword($pass, $self->get_edit_tab_widget('weakness'));
- }
- elsif ($widget == $okButton) {
- ## save changes
- if ($self->_userEdit_Ok($userData)) {
- last;
- }
- }
-# last: managing tab widget events
- else {
- my $current_tab = $self->get_edit_tab_widget('edit_tab_label');
- if ($current_tab && $current_tab eq $userEditLabel{account_info}) {
- if ($widget == $self->get_edit_tab_widget('icon_face')) {
- my $iconLabel = $self->_iconButtonLabel($self->get_edit_tab_widget('icon_face'));
- my $nextIcon = $self->sh_users->GetFaceIcon($iconLabel, 1);
- $self->_iconButtonLabel($self->get_edit_tab_widget('icon_face'), $nextIcon);
- $self->get_edit_tab_widget('icon_face')->setIcon($self->sh_users->face2png($nextIcon));
- }
- }
- elsif ($current_tab && $current_tab eq $userEditLabel{groups}) {
- if ($widget == $self->get_edit_tab_widget('members')) {
- my $item = $self->get_edit_tab_widget('members')->changedItem();
- if ($item) {
- if ($item->checked()) {
- # add it to possible primary groups
- my $pgItem = new yui::YItem ($item->label(), 0);
- $self->get_edit_tab_widget('primary_group')->addItem($pgItem);
- }
- else {
- # remove it to possible primary groups
- $dlg->startMultipleChanges();
- my $itemColl = new yui::YItemCollection;
- my $tbl = $self->get_edit_tab_widget('members');
- for(my $i=0;$i < $tbl->itemsCount();$i++) {
- if ($tbl->toCBYTableItem($tbl->item($i))->checked()) {
- my $pgItem = new yui::YItem ($tbl->item($i)->label(), 0);
- my $primgroup = $self->sh_users->groupName($userData->{primary_group});
- $pgItem->setSelected(1) if ($pgItem->label() eq $primgroup);
-
- $itemColl->push($pgItem);
- $pgItem->DISOWN();
- }
- }
- $self->get_edit_tab_widget('primary_group')->deleteAllItems();
- $self->get_edit_tab_widget('primary_group')->addItems($itemColl);
- $dlg->recalcLayout();
- $dlg->doneMultipleChanges();
- }
- }
- }
- }
- }
- }
- }
-
- }
- else {
- $self->sh_gui->warningMsgBox({text => $self->loc->N("Cannot create tab widgets")});
- }
-
- destroy $dlg;
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle);
-
-}
-
-sub _editGroupDialog {
- my $self = shift;
-
- ## push application title
- my $appTitle = yui::YUI::app()->applicationTitle();
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($self->loc->N("Edit Group"));
-
- my $factory = yui::YUI::widgetFactory;
- my $optional = yui::YUI::optionalWidgetFactory;
-
- my $dlg = $factory->createPopupDialog();
- my $layout = $factory->createVBox($dlg);
-
- my %tabs;
- if ($optional->hasDumbTab()) {
- my $hbox = $factory->createHBox($layout);
- my $align = $factory->createHCenter($hbox);
- $tabs{widget} = $optional->createDumbTab($align);
-
- $tabs{group_data} = new yui::YItem($groupEditLabel{group_data});
- $tabs{group_data}->setSelected();
- $tabs{widget}->addItem( $tabs{group_data} );
- $tabs{group_data}->DISOWN();
-
- $tabs{group_users} = new yui::YItem($groupEditLabel{group_users});
- $tabs{widget}->addItem( $tabs{group_users} );
- $tabs{group_users}->DISOWN();
-
- my $vbox = $factory->createVBox($tabs{widget});
- $align = $factory->createLeft($vbox);
- $tabs{replace_pnt} = $factory->createReplacePoint($align);
-
- $hbox = $factory->createHBox($vbox);
- $align = $factory->createRight($hbox);
- my $cancelButton = $factory->createPushButton($align, $self->loc->N("Cancel"));
- my $okButton = $factory->createPushButton($hbox, $self->loc->N("Ok"));
-
- my %groupData = $self->_getGroupInfo();
- # groupData here should be tested because it could be undef
-
-# %groupData: selected group info as:
-# $groupname: group name
-# $members: users that are members of this group
-
-
- # Useful entry point for the current edit user/group tab widget
- $self->set_edit_tab_widget( $self->_groupDataTabWidget($dlg, $tabs{replace_pnt}, %groupData) );
- $self->set_edit_tab_widget( edit_tab_label => $groupEditLabel{group_data});
-
- while(1) {
- my $event = $dlg->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::MenuEvent) {
- ### MENU ###
- my $item = $event->item();
- if ($item->label() eq $tabs{group_data}->label()) {
- %groupData = $self->_storeDataFromGroupEditPreviousTab(%groupData);
- my %edit_tab = $self->_groupDataTabWidget($dlg, $tabs{replace_pnt}, %groupData );
- $self->edit_tab_widgets( {} );
- $self->set_edit_tab_widget(%edit_tab);
- $self->set_edit_tab_widget( edit_tab_label => $groupEditLabel{group_data});
- }
- elsif ($item->label() eq $tabs{group_users}->label()) {
- %groupData = $self->_storeDataFromGroupEditPreviousTab(%groupData);
- my %edit_tab = $self->_groupUsersTabWidget($dlg, $tabs{replace_pnt}, %groupData );
- $self->edit_tab_widgets( {} );
- $self->set_edit_tab_widget(%edit_tab);
- $self->set_edit_tab_widget( edit_tab_label => $groupEditLabel{group_users});
- }
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
- ### widget
- my $widget = $event->widget();
- if ($widget == $cancelButton) {
- last;
- }
- elsif ($widget == $okButton) {
- ## save changes
- if ($self->_groupEdit_Ok(%groupData)) {
- last;
- }
- }
- }
- }
-
- }
- else {
- $self->sh_gui->warningMsgBox({text => $self->loc->N("Cannot create tab widgets")});
- }
-
- destroy $dlg;
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle);
-
-}
-
-sub _editUserOrGroup {
- my $self = shift;
-
- # TODO item management avoid label if possible
- my $label = $self->_skipShortcut($self->get_widget('tabs')->selectedItem()->label());
- if ($label eq $self->loc->N("Users") ) {
- $self->_editUserDialog();
- }
- else {
- $self->_editGroupDialog();
- }
- $self->_refresh();
-}
-
-
-sub _deleteUserOrGroup {
- my $self = shift;
-
- # TODO item management avoid label if possible
- my $label = $self->_skipShortcut($self->get_widget('tabs')->selectedItem()->label());
- if ($label eq $self->loc->N("Users") ) {
- $self->_deleteUserDialog();
- $self->_refresh();
- }
- else {
- $self->_deleteGroupDialog();
- $self->_refresh();
- }
-}
-
-
-sub _refresh {
- my $self = shift;
-
- # TODO item management avoid label if possible
- my $label = $self->_skipShortcut($self->get_widget('tabs')->selectedItem()->label());
- if ($label eq $self->loc->N("Users") ) {
- $self->_refreshUsers();
- }
- else {
- $self->_refreshGroups();
- }
-# TODO xguest
-# RefreshXguest(1);
-}
-
-# TODO context menu creation is missed in libyui
-sub _contextMenuActions {
- my $self = shift;
-
- my $item = $self->get_widget('table')->selectedItem();
- if ($item) {
- }
-}
-
-sub _refreshActions {
- my $self = shift;
-
- my $item = $self->get_widget('table')->selectedItem();
- $self->dialog->startMultipleChanges();
- $self->get_widget('action_menu')->deleteAllItems();
-
- # do we need to undef them first?
- $self->set_action_menu(
- add_user => undef,
- add_group => undef,
- edit => undef,
- del => undef,
- inst => undef,
- );
- $self->set_action_menu(
- add_user => new yui::YMenuItem($self->loc->N("Add User")),
- add_group => new yui::YMenuItem($self->loc->N("Add Group")),
- edit => new yui::YMenuItem($self->loc->N("&Edit")),
- del => new yui::YMenuItem($self->loc->N("&Delete")),
- inst => new yui::YMenuItem($self->loc->N("Install guest account")),
- );
-
- my $itemColl = new yui::YItemCollection;
- for my $pair ( $self->action_menu_pairs ) {
- my $menuItem = $pair->[1];
- if ($pair->[0] eq 'edit' || $pair->[0] eq 'del') {
- if ($item) {
- $itemColl->push($menuItem);
- }
- }
- else {
- $itemColl->push($menuItem);
- }
- $menuItem->DISOWN();
- }
- $self->get_widget('action_menu')->addItems($itemColl);
- $self->get_widget('action_menu')->rebuildMenuTree();
- if ($item) {
- $self->get_widget('edit')->setEnabled();
- $self->get_widget('del')->setEnabled();
- }
- else {
- $self->get_widget('edit')->setDisabled();
- $self->get_widget('del')->setDisabled();
- }
-
- $self->dialog->doneMultipleChanges();
-}
-
-sub _showAboutDialog {
- my $self = shift;
-
- my $translators = $self->loc->N("_: Translator(s) name(s) & email(s)\n");
- $translators =~ s/\</\&lt\;/g;
- $translators =~ s/\>/\&gt\;/g;
- $self->sh_gui->AboutDialog({
- name => $self->loc->N("manauser"),
- version => $self->VERSION,
- credits => $self->loc->N("Copyright (C) %s Mageia community", '2013-2015'),
- license => $self->loc->N("GPLv2"),
- description => $self->loc->N("manauser is a Mageia user management tool \n(from the original idea of Mandriva userdrake)."),
- authors => $self->loc->N("<h3>Developers</h3>
- <ul><li>%s</li>
- <li>%s</li>
- </ul>
- <h3>Translators</h3>
- <ul><li>%s</li></ul>",
- "Angelo Naselli &lt;anaselli\@linux.it&gt;",
- "Matteo Pasotti &lt;matteo.pasotti\@gmail.com&gt;",
- $translators
- ),
- });
-}
-sub _manageUsersDialog {
- my $self = shift;
-
- if ($EUID != 0) {
- $self->sh_gui->warningMsgBox({
- title => $self->name,
- text => $self->loc->N("root privileges required"),
- });
- return;
- }
-
- ## TODO fix for manatools
- my $pixdir = '/usr/share/userdrake/pixmaps/';
- ## push application title
- my $appTitle = yui::YUI::app()->applicationTitle();
-
- ## set new title to get it in dialog
- yui::YUI::app()->setApplicationTitle($self->name);
- ## set icon if not already set by external launcher
- yui::YUI::app()->setApplicationIcon($self->icon);
-
-
- my $factory = yui::YUI::widgetFactory;
- my $optional = yui::YUI::optionalWidgetFactory;
-
-
- $self->dialog($factory->createMainDialog());
- my $layout = $factory->createVBox($self->dialog);
-
- my $hbox_headbar = $factory->createHBox($layout);
- my $head_align_left = $factory->createLeft($hbox_headbar);
- my $head_align_right = $factory->createRight($hbox_headbar);
- my $headbar = $factory->createHBox($head_align_left);
- my $headRight = $factory->createHBox($head_align_right);
-
- my %fileMenu = (
- widget => $factory->createMenuButton($headbar,$self->loc->N("File")),
- refresh => new yui::YMenuItem($self->loc->N("Refresh")),
- quit => new yui::YMenuItem($self->loc->N("&Quit")),
- );
-
- $fileMenu{ widget }->addItem($fileMenu{ refresh });
- $fileMenu{ widget }->addItem($fileMenu{ quit });
- $fileMenu{ widget }->rebuildMenuTree();
-
- my $actionMenu = $factory->createMenuButton($headbar, $self->loc->N("Actions"));
- $actionMenu->DISOWN();
-
- my %helpMenu = (
- widget => $factory->createMenuButton($headRight, $self->loc->N("&Help")),
- help => new yui::YMenuItem($self->loc->N("Help")),
- report_bug => new yui::YMenuItem($self->loc->N("Report Bug")),
- about => new yui::YMenuItem($self->loc->N("&About")),
- );
-
- while ( my ($key, $value) = each(%helpMenu) ) {
- if ($key ne 'widget' ) {
- $helpMenu{ widget }->addItem($value);
- }
- }
- $helpMenu{ widget }->rebuildMenuTree();
-
- my $hbox = $factory->createHBox($layout);
- $hbox = $factory->createHBox($factory->createLeft($hbox));
- $self->set_widget(
- add_user => $factory->createIconButton($hbox, $pixdir . 'user_add.png', $self->loc->N("Add User")),
- add_group => $factory->createIconButton($hbox, $pixdir . 'group_add.png', $self->loc->N("Add Group")),
- edit => $factory->createIconButton($hbox, $pixdir . 'user_conf.png', $self->loc->N("Edit")),
- del => $factory->createIconButton($hbox, $pixdir . 'user_del.png', $self->loc->N("Delete")),
- refresh => $factory->createIconButton($hbox, $pixdir . 'refresh.png', $self->loc->N("Refresh")),
- action_menu => $actionMenu,
- );
-
-
- $hbox = $factory->createHBox($layout);
- $head_align_left = $factory->createLeft($hbox);
-
- my $sysfilter = 1;
- if (-e $self->config_file) {
- my $prefs = Config::Auto::parse($self->config_file);
- $sysfilter = ($prefs->{FILTER} eq 'true' or $prefs->{FILTER} eq 'true' or $prefs->{FILTER} eq '1');
- }
- $self->set_widget(filter_system => $factory->createCheckBox($head_align_left, $self->loc->N("Filter system users"),
- $sysfilter));
- $factory->createHSpacing($hbox, 3);
- $head_align_right = $factory->createRight($hbox);
- $headRight = $factory->createHBox($head_align_right);
- $factory->createLabel($headRight, $self->loc->N("Search:"));
- $self->set_widget(filter => $factory->createInputField($headRight, "", 0));
- $self->set_widget(apply_filter => $factory->createPushButton($headRight, $self->loc->N("Apply filter")));
- $self->get_widget('filter')->setWeight($yui::YD_HORIZ, 2);
- $self->get_widget('apply_filter')->setWeight($yui::YD_HORIZ, 1);
- $self->get_widget('filter_system')->setNotify(1);
-
- my %tabs;
- if ($optional->hasDumbTab()) {
- $hbox = $factory->createHBox($layout);
- my $align = $factory->createHCenter($hbox);
- $self->set_widget(tabs => $optional->createDumbTab($align));
- }
-
- $hbox = $factory->createHBox($layout);
- my $align = $factory->createLeft($hbox);
- my $aboutButton = $factory->createPushButton($align, $self->loc->N("&About") );
- $align = $factory->createRight($hbox);
- my $quitButton = $factory->createPushButton($align, $self->loc->N("&Quit") );
-
- if ($optional->hasDumbTab()) {
- $tabs{users} = new yui::YItem($self->loc->N("Users"));
- $tabs{users}->setSelected();
- $self->get_widget('tabs')->addItem( $tabs{users} );
- $tabs{users}->DISOWN();
- $tabs{groups} = new yui::YItem($self->loc->N("Groups"));
- $self->get_widget('tabs')->addItem( $tabs{groups} );
- $tabs{groups}->DISOWN();
- my $vbox = $factory->createVBox($self->get_widget('tabs'));
- $align = $factory->createLeft($vbox);
- $self->set_widget(replace_pnt => $factory->createReplacePoint($align));
- $self->_createUserTable();
- $self->get_widget('table')->setImmediateMode(1);
- $self->get_widget('table')->DISOWN();
- }
-
- $self->_refreshActions();
-
- # main loop
- while(1) {
- my $event = $self->dialog->waitForEvent();
- my $eventType = $event->eventType();
-
- #event type checking
- if ($eventType == $yui::YEvent::CancelEvent) {
- last;
- }
- elsif ($eventType == $yui::YEvent::MenuEvent) {
-### MENU ###
- my $item = $event->item();
- my $menuLabel = $item->label();
- if ($menuLabel eq $fileMenu{ quit }->label()) {
- last;
- }
- elsif ($menuLabel eq $helpMenu{about}->label()) {
- $self->_showAboutDialog();
- }
- elsif ($menuLabel eq $self->get_action_menu('add_user')->label()) {
- $self->addUserDialog();
- $self->_refresh();
- }
- elsif ($menuLabel eq $self->get_action_menu('add_group')->label()) {
- $self->_addGroupDialog();
- $self->_refresh();
- }
- elsif ($menuLabel eq $self->get_action_menu('del')->label()) {
- $self->_deleteUserOrGroup();
- }
- elsif ($menuLabel eq $self->get_action_menu('edit')->label()) {
- $self->_editUserOrGroup();
- }
- elsif ($self->get_widget('tabs') && $menuLabel eq $tabs{groups}->label()) {
- $self->_createGroupTable();
- }
- elsif ($self->get_widget('tabs') && $menuLabel eq $tabs{users}->label()) {
- $self->_createUserTable();
- }
- elsif ($menuLabel eq $fileMenu{refresh}->label()) {
- $self->_refresh();
- }
- }
- elsif ($eventType == $yui::YEvent::WidgetEvent) {
-### Buttons and widgets ###
- my $widget = $event->widget();
- if ($widget == $quitButton) {
- last;
- }
- elsif ($widget == $aboutButton) {
- $self->_showAboutDialog();
- }
- elsif ($widget == $self->get_widget('add_user')) {
- $self->addUserDialog();
- $self->_refresh();
- }
- elsif ($widget == $self->get_widget('del')) {
- $self->_deleteUserOrGroup();
- }
- elsif ($widget == $self->get_widget('table')) {
- $self->_refreshActions();
- my $wEvent = yui::YMGAWidgetFactory::getYWidgetEvent($event);
- if ($wEvent && $wEvent->reason() == $yui::YEvent::Activated) {
- $self->_editUserOrGroup();
- }
- }
- elsif ($widget == $self->get_widget('add_group')) {
- $self->_addGroupDialog();
- $self->_refresh();
- }
- elsif ($widget == $self->get_widget('edit')) {
- $self->_editUserOrGroup();
- }
- elsif ( $widget == $self->get_widget('filter_system') ||
- $widget == $self->get_widget('refresh') ||
- $widget == $self->get_widget('apply_filter') ) {
- $self->_refresh();
- }
- }
- }
-
- $self->dialog->destroy() ;
-
- #restore old application title
- yui::YUI::app()->setApplicationTitle($appTitle) if $appTitle;
-}
-
-#=============================================================
-
-=head2 _skipShortcut
-
-=head3 INPUT
-
- $self: this object
- $label: an item label to be cleaned by keyboard shortcut "&"
-
-=head3 OUTPUT
-
- $label: cleaned label
-
-=head3 DESCRIPTION
-
- This internal method is a workaround to label that are
- changed by "&" due to keyborad shortcut.
-
-=cut
-
-#=============================================================
-sub _skipShortcut {
- my ($self, $label) = @_;
-
- $label =~ s/&// if ($label);
-
- return ($label);
-}
-
-
-sub _ValidInt {
- foreach my $i (@_) { $i =~ /\d+/ or return 0 }
- return 1;
-}
-
-
-sub _TimeOfArray {
- my ($reltime, $cm) = @_;
- my $h; my %mth = (Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5, Jun => 6, Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11, Dec => 12);
- my $_t = localtime($reltime * 24 * 60 * 60) =~ /(\S+)\s+(\S+)\s+(\d+)\s+(\S+)\s+(\d+)/;
- $h->{daystr} = $1;
- $h->{month} = $2;
- $h->{dayint} = $3;
- $h->{year} = $5;
- $cm and $h->{month} = $mth{$2};
- $h;
-}
-
-
-no Moose;
-__PACKAGE__->meta->make_immutable;
-
-1;