1 #################################################################################
2 # Xestia Scanner Server - Users System Module #
5 # This module is licensed under the same license as Xestia Scanner Server which #
6 # is licensed under the GPL version 3. #
8 # This program is free software: you can redistribute it and/or modify #
9 # it under the terms of the GNU General Public License as published by #
10 # the Free Software Foundation, version 3 of the License. #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
19 #################################################################################
21 package Modules::System::Users;
23 use Modules::System::Common;
24 use Modules::System::Scan;
30 our @ISA = qw(Exporter);
31 our @EXPORT = qw(xestiascan_users_list xestiascan_users_add xestiascan_users_edit xestiascan_users_delete xestiascan_users_flush);
33 sub xestiascan_users_list{
34 #################################################################################
35 # xestiascan_users_list: Get the list of available users. #
39 # xestiascan_users_list(options); #
41 # Specifies the following options as a hash (in any order). #
43 # HideDeactivatedUsers Hide deactivated users. #
44 #################################################################################
46 # Get the values that have been passed to the subroutine.
50 my $showdeactivated = 0;
52 if ($options->{"ShowDeactivatedUsers"} && $options->{"ShowDeactivatedUsers"} eq 1){
54 # Show deactivated users.
60 # Connect to the database server.
62 $main::xestiascan_authmodule->connect();
64 # Check if any errors occured while connecting to the database server.
66 if ($main::xestiascan_authmodule->geterror eq "AuthConnectionError"){
68 # A database connection error has occured so return
71 xestiascan_error("authconnectionerror", $main::xestiascan_authmodule->geterror(1));
75 # Get the permissions for the user and check if the user is allowed to access this.
77 my $access_userlist = $main::xestiascan_authmodule->getpermissions({ Username => $main::loggedin_user, PermissionType => "Admin" });
79 xestiascan_error("usernameblank") if ($main::xestiascan_authmodule->geterror eq "UsernameBlank");
80 xestiascan_error("permissiontypeblank") if ($main::xestiascan_authmodule->geterror eq "PermissionTypeBlank");
81 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1)) if ($main::xestiascan_authmodule->geterror eq "DatabaseError");
83 if ($access_userlist ne 1){
85 # User not allowed to access the user list so return an error.
86 xestiascan_error("notpermitted");
97 $main::xestiascan_presmodule->startbox("sectionboxnofloat");
98 $main::xestiascan_presmodule->startbox("sectiontitle");
99 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{listusers});
100 $main::xestiascan_presmodule->endbox();
101 $main::xestiascan_presmodule->startbox("secondbox");
103 $main::xestiascan_presmodule->startform($main::xestiascan_env{"script_filename"}, "POST");
104 $main::xestiascan_presmodule->addhiddendata("mode", "users");
106 $main::xestiascan_presmodule->addbutton("action", { Value => "add", Description => $main::xestiascan_lang{users}{adduser} });
107 $main::xestiascan_presmodule->addtext(" | ");
108 $main::xestiascan_presmodule->addbutton("action", { Value => "flush", Description => $main::xestiascan_lang{users}{logoutallusers} });
110 $main::xestiascan_presmodule->addlinebreak();
112 $main::xestiascan_presmodule->addcheckbox("showdeactivated", { OptionDescription => $main::xestiascan_lang{users}{showdeactivated}, Checked => $showdeactivated });
113 $main::xestiascan_presmodule->addtext(" | ");
114 $main::xestiascan_presmodule->addsubmit($main::xestiascan_lang{users}{update});
115 $main::xestiascan_presmodule->addlinebreak();
116 $main::xestiascan_presmodule->endform();
118 # Get the list of users and return a message if the permissions system is
119 # unsupported by this database server type.
121 %user_list = $main::xestiascan_authmodule->getuserlist({ Reduced => 1, ShowDeactivated => $showdeactivated });
123 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
125 # A database error has occured so return an error with
126 # the extended error information.
128 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1));
132 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
133 $main::xestiascan_presmodule->startheader();
134 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{username}, { Style => "tablecellheader" });
135 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{name}, { Style => "tablecellheader" });
136 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{options}, { Style => "tablecellheader" });
137 $main::xestiascan_presmodule->endheader();
139 foreach $user_name (keys %user_list){
141 $main::xestiascan_presmodule->startrow();
145 $cssname = "tablecell1";
150 $cssname = "tablecell2";
155 $cssname = "tablecelldisabled" if $user_list{$user_name}{deactivated} eq 1;
157 $main::xestiascan_presmodule->addcell($cssname);
158 $main::xestiascan_presmodule->addtext($user_list{$user_name}{username});
159 $main::xestiascan_presmodule->endcell();
160 $main::xestiascan_presmodule->addcell($cssname);
161 $main::xestiascan_presmodule->addtext($user_list{$user_name}{name});
162 $main::xestiascan_presmodule->endcell();
163 $main::xestiascan_presmodule->addcell($cssname);
164 $main::xestiascan_presmodule->addlink($main::xestiascan_env{"script_filename"} . "?mode=users&action=edit&user=" . $user_list{$user_name}{username}, { Text => $main::xestiascan_lang{options}{edit} });
165 $main::xestiascan_presmodule->addlink($main::xestiascan_env{"script_filename"} . "?mode=users&action=delete&user=" . $user_list{$user_name}{username}, { Text => $main::xestiascan_lang{options}{delete} });
166 $main::xestiascan_presmodule->endcell();
168 $main::xestiascan_presmodule->endrow();
172 $main::xestiascan_presmodule->endtable();
174 $main::xestiascan_presmodule->endbox();
175 $main::xestiascan_presmodule->endbox();
177 # Disconnect from the database server.
179 $main::xestiascan_authmodule->disconnect();
181 return $main::xestiascan_presmodule->grab();
185 sub xestiascan_users_add{
186 #################################################################################
187 # xestiascan_users_add: Add a user to the user list. #
191 # xestiascan_users_add(username, userinfo, scannerinfo, outputmoduleinfo, #
192 # exportmoduleinfo, confirm); #
194 # username Specifies the username to add to the user list. #
195 # userinfo Specifies the userinfo as a hashref. #
196 # scannerinfo Specifies the scanner permissions as a hashref. #
197 # outputmoduleinfo Specifies the output module permissions as a hashref. #
198 # exportmoduleinfo Specifies the export module permissions as a hashref. #
199 # confirm Confirms the action to add a user to the user list. #
200 #################################################################################
202 my $username = shift;
204 my $passed_userinfo = shift;
205 my $passed_scannerinfo = shift;
206 my $passed_outputmoduleinfo = shift;
207 my $passed_exportmoduleinfo = shift;
211 $confirm = 0 if !$confirm;
213 # Connect to the database server.
215 $main::xestiascan_authmodule->connect();
217 # Check if any errors occured while connecting to the database server.
219 if ($main::xestiascan_authmodule->geterror eq "AuthConnectionError"){
221 # A database connection error has occured so return
224 xestiascan_error("authconnectionerror", $main::xestiascan_authmodule->geterror(1));
228 # Check to see if the user has permission to manage users.
230 my $access_userlist = $main::xestiascan_authmodule->getpermissions({ Username => $main::loggedin_user, PermissionType => "Admin" });
232 xestiascan_error("usernameblank") if ($main::xestiascan_authmodule->geterror eq "UsernameBlank");
233 xestiascan_error("permissiontypeblank") if ($main::xestiascan_authmodule->geterror eq "PermissionTypeBlank");
234 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1)) if ($main::xestiascan_authmodule->geterror eq "DatabaseError");
236 if ($access_userlist ne 1){
238 # User not allowed to access the user list so return an error.
239 xestiascan_error("notpermitted");
243 # Check if there is a value in the username value and if there is then
244 # assume a user is being added.
248 my %final_userinfo = ();
249 my %final_scannerinfo = ();
250 my %final_outputmoduleinfo = ();
251 my %final_exportmoduleinfo = ();
255 # De-reference the user information hash.
259 foreach $hashkey (keys %$passed_userinfo){
261 $final_userinfo{$hashkey} = $$passed_userinfo{$hashkey};
265 # De-reference the scanner information hash.
270 foreach $hashkey (keys %$passed_scannerinfo){
272 $hashkey_short = $hashkey;
273 $hashkey_short =~ s/^scanner_//g;
275 $final_scannerinfo{$hashkey_short} = $$passed_scannerinfo{$hashkey};
279 # De-reference the output module information hash.
284 foreach $hashkey (keys %$passed_outputmoduleinfo){
286 $hashkey_short = $hashkey;
287 $hashkey_short =~ s/^outputmodule_//g;
289 $final_outputmoduleinfo{$hashkey_short} = $$passed_outputmoduleinfo{$hashkey};
293 # De-reference the export module information hash.
298 foreach $hashkey (keys %$passed_exportmoduleinfo){
300 $hashkey_short = $hashkey;
301 $hashkey_short =~ s/^exportmodule_//g;
303 $final_exportmoduleinfo{$hashkey_short} = $$passed_exportmoduleinfo{$hashkey};
307 # Check if the username and password are blank and if they are
308 # then return an error.
312 xestiascan_error("usernameblank");
316 if (!$final_userinfo{Password}){
318 xestiascan_error("passwordblank");
322 # Check if the password matches with the confirm password value
323 # and return an error if this is not the case.
325 if ($final_userinfo{Password} ne $final_userinfo{ConfirmPassword}){
327 xestiascan_error("passwordsdonotmatch");
331 # Check all the values being passed to this subroutine are UTF-8
334 xestiascan_variablecheck(xestiascan_utf8convert($username), "utf8", 0, 0);
335 xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{Name}), "utf8", 0, 0);
336 xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{Password}), "utf8", 0, 0);
338 # Check the length of the username, name and password to make sure
341 my $username_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($username), "maxlength", 64, 1);
342 my $name_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{Name}), "maxlength", 256, 1);
343 my $password_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{Password}), "maxlength", 128, 1);
345 if ($username_maxlength_check eq 1){
347 # Username is too long so return an error.
349 xestiascan_error("usernametoolong");
353 if ($name_maxlength_check eq 1){
355 # Name is too long so return an error.
357 xestiascan_error("nametoolong");
361 if ($password_maxlength_check eq 1){
363 # Password is too long so return an error,
365 xestiascan_error("passwordtoolong");
371 foreach $final_scanner (keys %final_scannerinfo){
373 # Check to make sure that the scanner name and value
374 # are both valid UTF8.
376 xestiascan_variablecheck($final_scanner, "utf8", 0, 0);
377 xestiascan_variablecheck($final_scannerinfo{$final_scanner}, "utf8", 0, 0);
381 # Check that the export and output modules contain valid UTF8
382 # and are valid filenames.
385 my $module_lettersnumbers_check;
387 foreach $final_module (keys %final_outputmoduleinfo){
389 xestiascan_variablecheck($final_module, "utf8", 0, 0);
390 xestiascan_variablecheck($final_outputmoduleinfo{$final_module}, "utf8", 0, 0);
392 $module_lettersnumbers_check = xestiascan_variablecheck($final_module, "lettersnumbers", 0, 1);
393 xestiascan_error("moduleinvalid", xestiascan_language($main::xestiascan_lang{scan}{nameofoutputmoduleerror}, $final_module)) if $module_lettersnumbers_check eq 1;
398 $module_lettersnumbers_check = 0;
400 foreach $final_module (keys %final_exportmoduleinfo){
402 xestiascan_variablecheck($final_module, "utf8", 0, 0);
403 xestiascan_variablecheck($final_exportmoduleinfo{$final_module}, "utf8", 0, 0);
405 $module_lettersnumbers_check = xestiascan_variablecheck($final_module, "lettersnumbers", 0, 1);
406 xestiascan_error("moduleinvalid", xestiascan_language($main::xestiascan_lang{scan}{nameofexportmoduleerror}, $final_module)) if $module_lettersnumbers_check eq 1;
410 # Add the user via adduser and pass the permissions to the
411 # edituser subroutine for the authentication module.
413 $main::xestiascan_authmodule->adduser($username, %final_userinfo);
415 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
417 xestiascan_error("userediterror", $main::xestiascan_authmodule->geterror(1));
421 if ($main::xestiascan_authmodule->geterror eq "UserExists"){
423 xestiascan_error("userexists");
427 $main::xestiascan_authmodule->edituser($username, "Scanner", %final_scannerinfo);
429 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
431 xestiascan_error("userediterror", $main::xestiascan_authmodule->geterror(1));
435 $main::xestiascan_authmodule->edituser($username, "OutputModule", %final_outputmoduleinfo);
437 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
439 xestiascan_error("userediterror", $main::xestiascan_authmodule->geterror(1));
443 $main::xestiascan_authmodule->edituser($username, "ExportModule", %final_exportmoduleinfo);
445 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
447 xestiascan_error("userediterror", $main::xestiascan_authmodule->geterror(1));
451 # Disconnect from the database server.
453 $main::xestiascan_authmodule->disconnect();
455 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
457 # A database error has occured so return an error with
458 # the extended error information.
460 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1));
464 # Write a message saying that the user has been added.
466 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{useradded}, { Style => "pageheader" });
467 $main::xestiascan_presmodule->addlinebreak();
468 $main::xestiascan_presmodule->addlinebreak();
469 $main::xestiascan_presmodule->addtext(xestiascan_language($main::xestiascan_lang{users}{useraddedtolist}, xestiascan_utf8convert($username)));
470 $main::xestiascan_presmodule->addlinebreak();
471 $main::xestiascan_presmodule->addlinebreak();
472 $main::xestiascan_presmodule->addlink($main::xestiascan_env{"script_filename"} . "?mode=users", { Text => $main::xestiascan_lang{users}{returnuserlist} });
475 return $main::xestiascan_presmodule->grab();
479 # Disconnect from the database server.
481 $main::xestiascan_authmodule->disconnect();
483 # As there is no username value, print a form for adding a user.
485 # Get the list of available scanners.
490 tie(%scannerlist, 'Tie::IxHash');
492 foreach $scanner (Sane->get_devices){
493 $scannerlist{$scanner->{'name'}}{name} = $scanner->{'name'};
494 $scannerlist{$scanner->{'name'}}{model} = $scanner->{'model'};
495 $scannerlist{$scanner->{'name'}}{vendor} = $scanner->{'vendor'};
498 # Get the list of available output modules.
500 my @availableoutputmodules;
501 @availableoutputmodules = xestiascan_scan_getoutputmodules;
503 # Get the list of available export modules.
505 my @availableexportmodules;
506 @availableexportmodules = xestiascan_scan_getexportmodules;
508 # Print out the form for editing the user.
510 $main::xestiascan_presmodule->startbox("sectionboxnofloat");
511 $main::xestiascan_presmodule->startbox("sectiontitle");
512 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{adduser});
513 $main::xestiascan_presmodule->endbox();
514 $main::xestiascan_presmodule->startbox("secondbox");
516 $main::xestiascan_presmodule->startform($main::xestiascan_env{"script_filename"}, "POST");
517 $main::xestiascan_presmodule->addhiddendata("mode", "users");
518 $main::xestiascan_presmodule->addhiddendata("action", "add");
519 $main::xestiascan_presmodule->addhiddendata("confirm", "1");
521 # Process the user information.
523 $main::xestiascan_presmodule->addboldtext($main::xestiascan_lang{users}{userdetails});
525 $main::xestiascan_presmodule->addlinebreak();
526 $main::xestiascan_presmodule->addlinebreak();
528 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
529 $main::xestiascan_presmodule->startheader();
530 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{common}{setting}, { Style => "tablecellheader" });
531 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{common}{value}, { Style => "tablecellheader" });
532 $main::xestiascan_presmodule->endheader();
534 $main::xestiascan_presmodule->startrow();
535 $main::xestiascan_presmodule->addcell("tablecell1");
536 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{username});
537 $main::xestiascan_presmodule->endcell();
538 $main::xestiascan_presmodule->addcell("tablecell1");
539 $main::xestiascan_presmodule->addinputbox("username", { MaxLength => "64", Size => "32"});
540 $main::xestiascan_presmodule->endcell();
541 $main::xestiascan_presmodule->endrow();
543 $main::xestiascan_presmodule->startrow();
544 $main::xestiascan_presmodule->addcell("tablecell2");
545 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{name});
546 $main::xestiascan_presmodule->endcell();
547 $main::xestiascan_presmodule->addcell("tablecell2");
548 $main::xestiascan_presmodule->addinputbox("name", { MaxLength => "128", Size => "32" });
549 $main::xestiascan_presmodule->endcell();
550 $main::xestiascan_presmodule->endrow();
552 $main::xestiascan_presmodule->startrow();
553 $main::xestiascan_presmodule->addcell("tablecell1");
554 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{adminprivs});
555 $main::xestiascan_presmodule->endcell();
556 $main::xestiascan_presmodule->addcell("tablecell1");
557 $main::xestiascan_presmodule->addcheckbox("admin");
558 $main::xestiascan_presmodule->endcell();
559 $main::xestiascan_presmodule->endrow();
561 $main::xestiascan_presmodule->startrow();
562 $main::xestiascan_presmodule->addcell("tablecell2");
563 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{accountenabled});
564 $main::xestiascan_presmodule->endcell();
565 $main::xestiascan_presmodule->addcell("tablecell2");
566 $main::xestiascan_presmodule->addcheckbox("enabled");
567 $main::xestiascan_presmodule->endcell();
568 $main::xestiascan_presmodule->endrow();
570 $main::xestiascan_presmodule->startrow();
571 $main::xestiascan_presmodule->addcell("tablecell1");
572 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{password});
573 $main::xestiascan_presmodule->endcell();
574 $main::xestiascan_presmodule->addcell("tablecell1");
575 $main::xestiascan_presmodule->addinputbox("password", { MaxLength => "256", Size => "32", Password => 1 });
576 $main::xestiascan_presmodule->endcell();
577 $main::xestiascan_presmodule->endrow();
579 $main::xestiascan_presmodule->startrow();
580 $main::xestiascan_presmodule->addcell("tablecell2");
581 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{confirmpassword});
582 $main::xestiascan_presmodule->endcell();
583 $main::xestiascan_presmodule->addcell("tablecell2");
584 $main::xestiascan_presmodule->addinputbox("confirmpassword", { MaxLength => "256", Size => "32", Password => 1 });
585 $main::xestiascan_presmodule->endcell();
586 $main::xestiascan_presmodule->endrow();
588 $main::xestiascan_presmodule->endtable();
591 $main::xestiascan_presmodule->addlinebreak();
593 # Process the list of available scanners.
595 $main::xestiascan_presmodule->addboldtext($main::xestiascan_lang{users}{scannerlist});
596 $main::xestiascan_presmodule->addlinebreak();
597 $main::xestiascan_presmodule->addlinebreak();
599 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
600 $main::xestiascan_presmodule->startheader();
601 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{scannername}, { Style => "tablecellheader" });
602 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{allowaccess}, { Style => "tablecellheader" });
603 $main::xestiascan_presmodule->endheader();
608 my @connectedscanners;
610 # Process the list of connected scanners.
612 foreach $scannername (keys %scannerlist){
614 $main::xestiascan_presmodule->startrow();
616 # Setup the styling for the row.
620 $cssname = "tablecell1";
625 $cssname = "tablecell2";
630 # Add the name of the scanner.
632 $main::xestiascan_presmodule->addcell($cssname);
633 $main::xestiascan_presmodule->addboldtext($scannerlist{$scannername}{vendor} . " " . $scannerlist{$scannername}{model});
634 $main::xestiascan_presmodule->addlinebreak();
635 $main::xestiascan_presmodule->additalictext($scannerlist{$scannername}{name});
636 $main::xestiascan_presmodule->endcell();
638 # See if it has permissions (or not) to use the scanner.
640 $main::xestiascan_presmodule->addcell($cssname);
642 $main::xestiascan_presmodule->addcheckbox("scanner_" . $scannerlist{$scannername}{name}, { Checked => 0 });
644 $main::xestiascan_presmodule->endcell();
646 push(@connectedscanners, $scannername);
648 $main::xestiascan_presmodule->endrow();
652 $main::xestiascan_presmodule->endtable();
654 $main::xestiascan_presmodule->addlinebreak();
656 $main::xestiascan_presmodule->addboldtext($main::xestiascan_lang{users}{outputmodulelist});
657 $main::xestiascan_presmodule->addlinebreak();
658 $main::xestiascan_presmodule->addlinebreak();
660 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
661 $main::xestiascan_presmodule->startheader();
662 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{modulename}, { Style => "tablecellheader" });
663 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{allowaccess}, { Style => "tablecellheader" });
664 $main::xestiascan_presmodule->endheader();
666 my $outputmodulename;
667 my $outputmoduleavailable = 0;
668 my $outputmoduleavailname;
671 # Process the list of available user output modules.
673 foreach $outputmodulename (@availableoutputmodules){
675 # Check if the module is in the list of available
676 # output modules, otherwise mark as not available.
678 # Setup the styling for the row.
682 $cssname = "tablecell1";
687 $cssname = "tablecell2";
692 $main::xestiascan_presmodule->addcell($cssname);
693 $main::xestiascan_presmodule->addtext($outputmodulename);
694 $main::xestiascan_presmodule->endcell();
696 $main::xestiascan_presmodule->addcell($cssname);
698 $main::xestiascan_presmodule->addcheckbox("outputmodule_" . $outputmodulename, { Checked => 0 });
700 $main::xestiascan_presmodule->endcell();
702 $main::xestiascan_presmodule->endrow();
706 $main::xestiascan_presmodule->endtable();
708 $main::xestiascan_presmodule->addlinebreak();
710 $main::xestiascan_presmodule->addboldtext($main::xestiascan_lang{users}{exportmodulelist});
711 $main::xestiascan_presmodule->addlinebreak();
712 $main::xestiascan_presmodule->addlinebreak();
714 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
715 $main::xestiascan_presmodule->startheader();
716 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{modulename}, { Style => "tablecellheader" });
717 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{allowaccess}, { Style => "tablecellheader" });
718 $main::xestiascan_presmodule->endheader();
720 my $exportmodulename;
721 my $exportmoduleavailable = 0;
722 my $exportmoduleavailname;
725 # Process the list of available user export modules.
727 foreach $exportmodulename (@availableexportmodules){
729 # Setup the styling for the row.
733 $cssname = "tablecell1";
738 $cssname = "tablecell2";
743 $main::xestiascan_presmodule->addcell($cssname);
744 $main::xestiascan_presmodule->addtext($exportmodulename);
745 $main::xestiascan_presmodule->endcell();
747 $main::xestiascan_presmodule->addcell($cssname);
749 $main::xestiascan_presmodule->addcheckbox("exportmodule_" . $exportmodulename, { Checked => 0 });
751 $main::xestiascan_presmodule->endcell();
753 $main::xestiascan_presmodule->endrow();
757 $main::xestiascan_presmodule->endtable();
759 $main::xestiascan_presmodule->addlinebreak();
761 $main::xestiascan_presmodule->addsubmit($main::xestiascan_lang{users}{adduserbutton});
762 $main::xestiascan_presmodule->addtext(" | ");
763 $main::xestiascan_presmodule->addreset($main::xestiascan_lang{common}{clearvalues});
765 $main::xestiascan_presmodule->endform();
767 $main::xestiascan_presmodule->endbox();
768 $main::xestiascan_presmodule->endbox();
770 return $main::xestiascan_presmodule->grab();
774 sub xestiascan_users_edit{
775 #################################################################################
776 # xestiascan_users_edit: Edit a user in the user list. #
780 # xestiascan_users_edit(username, userinfo, scannerinfo, outputmoduleinfo, #
781 # exportmoduleinfo, confirm); #
783 # username Specifies the username to edit. #
784 # userinfo Specifies the user information as a hash. #
785 # scannerinfo Specifies the scanner information as a hash. #
786 # outputmoduleinfo Specifies the output module information as a hash. #
787 # exportmoduleinfo Specifies the export module information as a hash. #
788 # confirm Specifies if the action to edit has been confirmed. #
789 #################################################################################
791 my $username = shift;
793 my $passed_userinfo = shift;
794 my $passed_scannerinfo = shift;
795 my $passed_outputmoduleinfo = shift;
796 my $passed_exportmoduleinfo = shift;
802 # Username is blank so return an error.
804 xestiascan_error("usernameblank");
814 # Check to see if the username is valid.
816 xestiascan_variablecheck(xestiascan_utf8convert($username), "utf8", 0, 0);
818 my $username_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($username), "maxlength", 64, 1);
820 if ($username_maxlength_check eq 1){
822 # Username is too long so return an error.
824 xestiascan_error("usernametoolong");
828 # Connect to the database server.
830 $main::xestiascan_authmodule->connect();
832 # Check if any errors occured while connecting to the database server.
834 if ($main::xestiascan_authmodule->geterror eq "AuthConnectionError"){
836 # A database connection error has occured so return
839 xestiascan_error("authconnectionerror", $main::xestiascan_authmodule->geterror(1));
843 # Check to see if the user has permission to manage users.
845 my $access_userlist = $main::xestiascan_authmodule->getpermissions({ Username => $main::loggedin_user, PermissionType => "Admin" });
847 xestiascan_error("usernameblank") if ($main::xestiascan_authmodule->geterror eq "UsernameBlank");
848 xestiascan_error("permissiontypeblank") if ($main::xestiascan_authmodule->geterror eq "PermissionTypeBlank");
849 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1)) if ($main::xestiascan_authmodule->geterror eq "DatabaseError");
851 if ($access_userlist ne 1){
853 # User not allowed to access the user list so return an error.
854 xestiascan_error("notpermitted");
859 # Check to see if the action to edit the user has been confirmed and
860 # if it has then edit the user.
864 my %final_userinfo = ();
865 my %final_scannerinfo = ();
866 my %final_outputmoduleinfo = ();
867 my %final_exportmoduleinfo = ();
871 # De-reference the user information hash.
875 foreach $hashkey (keys %$passed_userinfo){
877 $final_userinfo{$hashkey} = $$passed_userinfo{$hashkey};
881 # De-reference the scanner information hash.
886 foreach $hashkey (keys %$passed_scannerinfo){
888 $hashkey_short = $hashkey;
889 $hashkey_short =~ s/^scanner_//g;
891 $final_scannerinfo{$hashkey_short} = $$passed_scannerinfo{$hashkey};
895 # De-reference the output module information hash.
900 foreach $hashkey (keys %$passed_outputmoduleinfo){
902 $hashkey_short = $hashkey;
903 $hashkey_short =~ s/^outputmodule_//g;
905 $final_outputmoduleinfo{$hashkey_short} = $$passed_outputmoduleinfo{$hashkey};
909 # De-reference the export module information hash.
914 foreach $hashkey (keys %$passed_exportmoduleinfo){
916 $hashkey_short = $hashkey;
917 $hashkey_short =~ s/^exportmodule_//g;
919 $final_exportmoduleinfo{$hashkey_short} = $$passed_exportmoduleinfo{$hashkey};
923 # Check if the username and password are blank and if they are
924 # then return an error.
928 xestiascan_error("usernameblank");
932 # Check if the password matches with the confirm password value
933 # and return an error if this is not the case.
935 if ($final_userinfo{Password} ne $final_userinfo{ConfirmPassword}){
937 xestiascan_error("passwordsdonotmatch");
941 # Check all the values being passed to this subroutine are UTF-8
944 xestiascan_variablecheck(xestiascan_utf8convert($username), "utf8", 0, 0);
945 xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{NewUsername}), "utf8", 0, 0);
946 xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{Name}), "utf8", 0, 0);
947 xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{Password}), "utf8", 0, 0);
949 # Check the length of the username, name and password to make sure
952 my $username_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($username), "maxlength", 64, 1);
953 my $newusername_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{NewUsername}), "maxlength", 32, 1);
954 my $name_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{Name}), "maxlength", 256, 1);
955 my $password_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($final_userinfo{Password}), "maxlength", 128, 1);
957 if ($username_maxlength_check eq 1){
959 # Username is too long so return an error.
961 xestiascan_error("usernametoolong");
965 if ($name_maxlength_check eq 1){
967 # Name is too long so return an error.
969 xestiascan_error("nametoolong");
973 if ($password_maxlength_check eq 1){
975 # Password is too long so return an error,
977 xestiascan_error("passwordtoolong");
983 foreach $final_scanner (keys %final_scannerinfo){
985 # Check to make sure that the scanner name and value
986 # are both valid UTF8.
988 xestiascan_variablecheck($final_scanner, "utf8", 0, 0);
989 xestiascan_variablecheck($final_scannerinfo{$final_scanner}, "utf8", 0, 0);
993 # Check that the export and output modules contain valid UTF8
994 # and are valid filenames.
997 my $module_lettersnumbers_check;
999 foreach $final_module (keys %final_outputmoduleinfo){
1001 xestiascan_variablecheck($final_module, "utf8", 0, 0);
1002 xestiascan_variablecheck($final_outputmoduleinfo{$final_module}, "utf8", 0, 0);
1004 $module_lettersnumbers_check = xestiascan_variablecheck($final_module, "lettersnumbers", 0, 1);
1005 xestiascan_error("moduleinvalid", xestiascan_language($main::xestiascan_lang{scan}{nameofoutputmoduleerror}, $final_module)) if $module_lettersnumbers_check eq 1;
1010 $module_lettersnumbers_check = 0;
1012 foreach $final_module (keys %final_exportmoduleinfo){
1014 xestiascan_variablecheck($final_module, "utf8", 0, 0);
1015 xestiascan_variablecheck($final_exportmoduleinfo{$final_module}, "utf8", 0, 0);
1017 $module_lettersnumbers_check = xestiascan_variablecheck($final_module, "lettersnumbers", 0, 1);
1018 xestiascan_error("moduleinvalid", xestiascan_language($main::xestiascan_lang{scan}{nameofexportmoduleerror}, $final_module)) if $module_lettersnumbers_check eq 1;
1022 # Get the list of available scanners.
1027 tie(%scannerlist, 'Tie::IxHash');
1029 foreach $scanner (Sane->get_devices){
1030 $scannerlist{$scanner->{'name'}}{name} = $scanner->{'name'};
1031 $scannerlist{$scanner->{'name'}}{model} = $scanner->{'model'};
1032 $scannerlist{$scanner->{'name'}}{vendor} = $scanner->{'vendor'};
1035 # Get the list of available output modules.
1037 my @availableoutputmodules;
1038 @availableoutputmodules = xestiascan_scan_getoutputmodules;
1040 # Get the list of available export modules.
1042 my @availableexportmodules;
1043 @availableexportmodules = xestiascan_scan_getexportmodules;
1045 # Pass the permissions to the edituser subroutine
1046 # for the authentication module.
1048 $main::xestiascan_authmodule->edituser($username, "User", %final_userinfo);
1050 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1052 xestiascan_error("userediterror", $main::xestiascan_authmodule->geterror(1));
1056 $main::xestiascan_authmodule->edituser($username, "Scanner", %final_scannerinfo);
1058 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1060 xestiascan_error("userediterror", $main::xestiascan_authmodule->geterror(1));
1064 $main::xestiascan_authmodule->edituser($username, "OutputModule", %final_outputmoduleinfo);
1066 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1068 xestiascan_error("userediterror", $main::xestiascan_authmodule->geterror(1));
1072 $main::xestiascan_authmodule->edituser($username, "ExportModule", %final_exportmoduleinfo);
1074 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1076 xestiascan_error("userediterror", $main::xestiascan_authmodule->geterror(1));
1080 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{useredited}, { Style => "pageheader" });
1081 $main::xestiascan_presmodule->addlinebreak();
1082 $main::xestiascan_presmodule->addlinebreak();
1083 $main::xestiascan_presmodule->addtext(xestiascan_language($main::xestiascan_lang{users}{usereditedsuccess}, xestiascan_utf8convert($username))) ;
1084 $main::xestiascan_presmodule->addlinebreak();
1085 $main::xestiascan_presmodule->addlinebreak();
1086 $main::xestiascan_presmodule->addlink($main::xestiascan_env{"script_filename"} . "?mode=users", { Text => $main::xestiascan_lang{users}{returnuserlist} });
1088 return $main::xestiascan_presmodule->grab();
1093 # Get the general information about the user.
1097 %userinfo = $main::xestiascan_authmodule->getpermissions({ Username => xestiascan_utf8convert($username), PermissionType => "UserInfo" });
1099 xestiascan_error("usernameblank") if ($main::xestiascan_authmodule->geterror eq "UsernameBlank");
1100 xestiascan_error("permissiontypeblank") if ($main::xestiascan_authmodule->geterror eq "PermissionTypeBlank");
1101 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1)) if ($main::xestiascan_authmodule->geterror eq "DatabaseError");
1103 # Get the list of scanners with permissions for the user.
1105 my %userscannerinfo;
1107 %userscannerinfo = $main::xestiascan_authmodule->getpermissions({ Username => xestiascan_utf8convert($username), PermissionType => "Scanner" });
1109 xestiascan_error("usernameblank") if ($main::xestiascan_authmodule->geterror eq "UsernameBlank");
1110 xestiascan_error("permissiontypeblank") if ($main::xestiascan_authmodule->geterror eq "PermissionTypeBlank");
1111 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1)) if ($main::xestiascan_authmodule->geterror eq "DatabaseError");
1113 # Get the list of output modules with permissions for the user.
1117 %useroutputinfo = $main::xestiascan_authmodule->getpermissions({ Username => xestiascan_utf8convert($username), PermissionType => "OutputModule" });
1119 xestiascan_error("usernameblank") if ($main::xestiascan_authmodule->geterror eq "UsernameBlank");
1120 xestiascan_error("permissiontypeblank") if ($main::xestiascan_authmodule->geterror eq "PermissionTypeBlank");
1121 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1)) if ($main::xestiascan_authmodule->geterror eq "DatabaseError");
1123 # Get the list of export modules with permissions for the user.
1127 %userexportinfo = $main::xestiascan_authmodule->getpermissions({ Username => xestiascan_utf8convert($username), PermissionType => "ExportModule" });
1129 xestiascan_error("usernameblank") if ($main::xestiascan_authmodule->geterror eq "UsernameBlank");
1130 xestiascan_error("permissiontypeblank") if ($main::xestiascan_authmodule->geterror eq "PermissionTypeBlank");
1131 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1)) if ($main::xestiascan_authmodule->geterror eq "DatabaseError");
1133 # Get the list of available scanners.
1138 tie(%scannerlist, 'Tie::IxHash');
1140 foreach $scanner (Sane->get_devices){
1141 $scannerlist{$scanner->{'name'}}{name} = $scanner->{'name'};
1142 $scannerlist{$scanner->{'name'}}{model} = $scanner->{'model'};
1143 $scannerlist{$scanner->{'name'}}{vendor} = $scanner->{'vendor'};
1146 # Get the list of available output modules.
1148 my @availableoutputmodules;
1149 @availableoutputmodules = xestiascan_scan_getoutputmodules;
1151 # Get the list of available export modules.
1153 my @availableexportmodules;
1154 @availableexportmodules = xestiascan_scan_getexportmodules;
1156 # Print out the form for editing the user.
1158 $main::xestiascan_presmodule->startbox("sectionboxnofloat");
1159 $main::xestiascan_presmodule->startbox("sectiontitle");
1160 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{edituser});
1161 $main::xestiascan_presmodule->endbox();
1162 $main::xestiascan_presmodule->startbox("secondbox");
1164 $main::xestiascan_presmodule->startform($main::xestiascan_env{"script_filename"}, "POST");
1165 $main::xestiascan_presmodule->addhiddendata("mode", "users");
1166 $main::xestiascan_presmodule->addhiddendata("action", "edit");
1167 $main::xestiascan_presmodule->addhiddendata("confirm", "1");
1168 $main::xestiascan_presmodule->addhiddendata("username_original", xestiascan_utf8convert($username));
1170 # Process the user information.
1172 $main::xestiascan_presmodule->addboldtext($main::xestiascan_lang{users}{userdetails});
1174 $main::xestiascan_presmodule->addlinebreak();
1175 $main::xestiascan_presmodule->addlinebreak();
1177 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
1178 $main::xestiascan_presmodule->startheader();
1179 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{common}{setting}, { Style => "tablecellheader" });
1180 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{common}{value}, { Style => "tablecellheader" });
1181 $main::xestiascan_presmodule->endheader();
1183 $main::xestiascan_presmodule->startrow();
1184 $main::xestiascan_presmodule->addcell("tablecell1");
1185 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{username});
1186 $main::xestiascan_presmodule->endcell();
1187 $main::xestiascan_presmodule->addcell("tablecell1");
1188 $main::xestiascan_presmodule->addinputbox("username", { MaxLength => "64", Size => "32", Value => $userinfo{Username} });
1189 $main::xestiascan_presmodule->endcell();
1190 $main::xestiascan_presmodule->endrow();
1192 $main::xestiascan_presmodule->startrow();
1193 $main::xestiascan_presmodule->addcell("tablecell2");
1194 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{name});
1195 $main::xestiascan_presmodule->endcell();
1196 $main::xestiascan_presmodule->addcell("tablecell2");
1197 $main::xestiascan_presmodule->addinputbox("name", { MaxLength => "128", Size => "32", Value => $userinfo{Name} });
1198 $main::xestiascan_presmodule->endcell();
1199 $main::xestiascan_presmodule->endrow();
1201 $main::xestiascan_presmodule->startrow();
1202 $main::xestiascan_presmodule->addcell("tablecell1");
1203 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{adminprivs});
1204 $main::xestiascan_presmodule->endcell();
1205 $main::xestiascan_presmodule->addcell("tablecell1");
1206 $main::xestiascan_presmodule->addcheckbox("admin", { Checked => $userinfo{Admin} });
1207 $main::xestiascan_presmodule->endcell();
1208 $main::xestiascan_presmodule->endrow();
1210 $main::xestiascan_presmodule->startrow();
1211 $main::xestiascan_presmodule->addcell("tablecell2");
1212 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{accountenabled});
1213 $main::xestiascan_presmodule->endcell();
1214 $main::xestiascan_presmodule->addcell("tablecell2");
1215 $main::xestiascan_presmodule->addcheckbox("enabled", { Checked => $userinfo{Enabled} });
1216 $main::xestiascan_presmodule->endcell();
1217 $main::xestiascan_presmodule->endrow();
1219 $main::xestiascan_presmodule->startrow();
1220 $main::xestiascan_presmodule->addcell("tablecell1");
1221 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{newpassword});
1222 $main::xestiascan_presmodule->endcell();
1223 $main::xestiascan_presmodule->addcell("tablecell1");
1224 $main::xestiascan_presmodule->addinputbox("password", { MaxLength => "256", Size => "32", Password => 1 });
1225 $main::xestiascan_presmodule->endcell();
1226 $main::xestiascan_presmodule->endrow();
1228 $main::xestiascan_presmodule->startrow();
1229 $main::xestiascan_presmodule->addcell("tablecell2");
1230 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{confirmnewpassword});
1231 $main::xestiascan_presmodule->endcell();
1232 $main::xestiascan_presmodule->addcell("tablecell2");
1233 $main::xestiascan_presmodule->addinputbox("confirmpassword", { MaxLength => "256", Size => "32", Password => 1 });
1234 $main::xestiascan_presmodule->endcell();
1235 $main::xestiascan_presmodule->endrow();
1237 $main::xestiascan_presmodule->endtable();
1240 $main::xestiascan_presmodule->addlinebreak();
1242 # Process the list of available scanners.
1244 $main::xestiascan_presmodule->addboldtext($main::xestiascan_lang{users}{scannerlist});
1245 $main::xestiascan_presmodule->addlinebreak();
1246 $main::xestiascan_presmodule->addlinebreak();
1248 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
1249 $main::xestiascan_presmodule->startheader();
1250 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{scannername}, { Style => "tablecellheader" });
1251 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{allowaccess}, { Style => "tablecellheader" });
1252 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{connected}, { Style => "tablecellheader" });
1253 $main::xestiascan_presmodule->endheader();
1258 my @connectedscanners;
1260 # Process the list of connected scanners.
1262 foreach $scannername (keys %scannerlist){
1264 $main::xestiascan_presmodule->startrow();
1266 # Setup the styling for the row.
1268 if ($cssstyle eq 0){
1270 $cssname = "tablecell1";
1275 $cssname = "tablecell2";
1280 # Add the name of the scanner.
1282 $main::xestiascan_presmodule->addcell($cssname);
1283 $main::xestiascan_presmodule->addboldtext($scannerlist{$scannername}{vendor} . " " . $scannerlist{$scannername}{model});
1284 $main::xestiascan_presmodule->addlinebreak();
1285 $main::xestiascan_presmodule->additalictext($scannerlist{$scannername}{name});
1286 $main::xestiascan_presmodule->endcell();
1288 # See if it has permissions (or not) to use the scanner.
1290 $main::xestiascan_presmodule->addcell($cssname);
1292 if ($userscannerinfo{$scannername}){
1294 if ($userscannerinfo{$scannername} eq 1){
1296 $main::xestiascan_presmodule->addcheckbox("scanner_" . $scannerlist{$scannername}{name}, { Checked => 1 });
1300 $main::xestiascan_presmodule->addcheckbox("scanner_" . $scannerlist{$scannername}{name}, { Checked => 0 });
1306 $main::xestiascan_presmodule->addcheckbox("scanner_" . $scannerlist{$scannername}{name}, { Checked => 0 });
1310 $main::xestiascan_presmodule->endcell();
1312 # As we are dealing with the connected scanners first,
1313 # Write 'Yes' for connected.
1315 $main::xestiascan_presmodule->addcell($cssname);
1316 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{devconnected});
1317 $main::xestiascan_presmodule->endcell();
1319 push(@connectedscanners, $scannername);
1321 $main::xestiascan_presmodule->endrow();
1325 # Process the list of disconnected scanners.
1328 my $duplicatescannername;
1329 my $duplicatescannerfound = 0;
1331 foreach $scannername (keys %userscannerinfo){
1333 # Check the list of connected scanners and skip
1334 # this bit if the scanner name matches this list.
1336 $duplicatescannerfound = 0;
1338 foreach $duplicatescannername (@connectedscanners){
1340 if ($duplicatescannername eq $scannername){
1342 $duplicatescannerfound = 1;
1348 next if $duplicatescannerfound eq 1;
1350 # Setup the styling for the row.
1352 if ($cssstyle eq 0){
1354 $cssname = "tablecell1";
1359 $cssname = "tablecell2";
1364 # Add the name of the scanner.
1366 $main::xestiascan_presmodule->addcell($cssname);
1367 $main::xestiascan_presmodule->addboldtext($scannerlist{$scannername}{vendor} . " " . $scannerlist{$scannername}{model});
1368 $main::xestiascan_presmodule->addlinebreak();
1369 $main::xestiascan_presmodule->additalictext($scannerlist{$scannername}{name});
1370 $main::xestiascan_presmodule->endcell();
1372 # See if it has permissions (or not) to use the scanner.
1374 $main::xestiascan_presmodule->addcell($cssname);
1376 if ($userscannerinfo{$scannername}){
1378 if ($userscannerinfo{$scannername} eq 1){
1380 $main::xestiascan_presmodule->addcheckbox("scanner_" . $scannerlist{$scannername}{name}, { Checked => 1 });
1384 $main::xestiascan_presmodule->addcheckbox("scanner_" . $scannerlist{$scannername}{name}, { Checked => 0 });
1390 $main::xestiascan_presmodule->addcheckbox("scanner_" . $scannerlist{$scannername}{name}, { Checked => 0 });
1394 $main::xestiascan_presmodule->endcell();
1396 # As we are dealing with the connected scanners first,
1397 # Write 'Yes' for connected.
1399 $main::xestiascan_presmodule->addcell($cssname);
1400 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{devdisconnected});
1401 $main::xestiascan_presmodule->endcell();
1403 $main::xestiascan_presmodule->endrow();
1407 $main::xestiascan_presmodule->endtable();
1409 $main::xestiascan_presmodule->addlinebreak();
1411 $main::xestiascan_presmodule->addboldtext($main::xestiascan_lang{users}{outputmodulelist});
1412 $main::xestiascan_presmodule->addlinebreak();
1413 $main::xestiascan_presmodule->addlinebreak();
1415 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
1416 $main::xestiascan_presmodule->startheader();
1417 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{modulename}, { Style => "tablecellheader" });
1418 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{allowaccess}, { Style => "tablecellheader" });
1419 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{available}, { Style => "tablecellheader" });
1420 $main::xestiascan_presmodule->endheader();
1422 my $outputmodulename;
1423 my $outputmoduleavailable = 0;
1424 my $outputmoduleavailname;
1427 # Process the list of available user output modules.
1429 foreach $outputmodulename (@availableoutputmodules){
1431 # Check if the module is in the list of available
1432 # output modules, otherwise mark as not available.
1434 # Setup the styling for the row.
1436 if ($cssstyle eq 0){
1438 $cssname = "tablecell1";
1443 $cssname = "tablecell2";
1448 $main::xestiascan_presmodule->addcell($cssname);
1449 $main::xestiascan_presmodule->addtext($outputmodulename);
1450 $main::xestiascan_presmodule->endcell();
1452 $main::xestiascan_presmodule->addcell($cssname);
1454 if ($useroutputinfo{$outputmodulename}){
1456 if ($useroutputinfo{$outputmodulename} eq 1){
1458 $main::xestiascan_presmodule->addcheckbox("outputmodule_" . $outputmodulename, { Checked => 1 });
1462 $main::xestiascan_presmodule->addcheckbox("outputmodule_" . $outputmodulename, { Checked => 0 });
1468 $main::xestiascan_presmodule->addcheckbox("outputmodule_" . $outputmodulename, { Checked => 0 });
1472 $main::xestiascan_presmodule->endcell();
1474 $main::xestiascan_presmodule->addcell($cssname);
1475 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{modavailable});
1476 $main::xestiascan_presmodule->endcell();
1478 $main::xestiascan_presmodule->endrow();
1482 # Process the list of not available output modules.
1484 $outputmodulename = "";
1485 my $duplicateoutputmodulename = "";
1486 my $duplicateoutputmodulefound = 0;
1488 foreach $outputmodulename (keys %useroutputinfo){
1490 # Check the list of available output modules and skip
1491 # this bit if the output module name matches this list.
1493 $duplicateoutputmodulefound = 0;
1495 foreach $duplicateoutputmodulename (@availableoutputmodules){
1497 if ($duplicateoutputmodulename eq $outputmodulename){
1499 $duplicateoutputmodulefound = 1;
1505 next if $duplicateoutputmodulefound eq 1;
1507 # Setup the styling for the row.
1509 if ($cssstyle eq 0){
1511 $cssname = "tablecell1";
1516 $cssname = "tablecell2";
1521 $main::xestiascan_presmodule->addcell($cssname);
1522 $main::xestiascan_presmodule->addtext($outputmodulename);
1523 $main::xestiascan_presmodule->endcell();
1525 $main::xestiascan_presmodule->addcell($cssname);
1527 if ($useroutputinfo{$outputmodulename}){
1529 if ($useroutputinfo{$outputmodulename} eq 1){
1531 $main::xestiascan_presmodule->addcheckbox("outputmodule_" . $outputmodulename, { Checked => 1 });
1535 $main::xestiascan_presmodule->addcheckbox("outputmodule_" . $outputmodulename, { Checked => 0 });
1541 $main::xestiascan_presmodule->addcheckbox("outputmodule_" . $outputmodulename, { Checked => 0 });
1545 $main::xestiascan_presmodule->endcell();
1547 $main::xestiascan_presmodule->addcell($cssname);
1548 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{modunavailable});
1549 $main::xestiascan_presmodule->endcell();
1551 $main::xestiascan_presmodule->endrow();
1555 $main::xestiascan_presmodule->endtable();
1557 $main::xestiascan_presmodule->addlinebreak();
1559 $main::xestiascan_presmodule->addboldtext($main::xestiascan_lang{users}{exportmodulelist});
1560 $main::xestiascan_presmodule->addlinebreak();
1561 $main::xestiascan_presmodule->addlinebreak();
1563 $main::xestiascan_presmodule->starttable("", { CellPadding => "5", CellSpacing => "0" });
1564 $main::xestiascan_presmodule->startheader();
1565 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{modulename}, { Style => "tablecellheader" });
1566 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{allowaccess}, { Style => "tablecellheader" });
1567 $main::xestiascan_presmodule->addheader($main::xestiascan_lang{users}{available}, { Style => "tablecellheader" });
1568 $main::xestiascan_presmodule->endheader();
1570 my $exportmodulename;
1571 my $exportmoduleavailable = 0;
1572 my $exportmoduleavailname;
1575 # Process the list of available user export modules.
1577 foreach $exportmodulename (@availableexportmodules){
1579 # Setup the styling for the row.
1581 if ($cssstyle eq 0){
1583 $cssname = "tablecell1";
1588 $cssname = "tablecell2";
1593 $main::xestiascan_presmodule->addcell($cssname);
1594 $main::xestiascan_presmodule->addtext($exportmodulename);
1595 $main::xestiascan_presmodule->endcell();
1597 $main::xestiascan_presmodule->addcell($cssname);
1599 if ($userexportinfo{$exportmodulename}){
1601 if ($userexportinfo{$exportmodulename} eq 1){
1603 $main::xestiascan_presmodule->addcheckbox("exportmodule_" . $exportmodulename, { Checked => 1 });
1607 $main::xestiascan_presmodule->addcheckbox("exportmodule_" . $exportmodulename, { Checked => 0 });
1613 $main::xestiascan_presmodule->addcheckbox("exportmodule_" . $exportmodulename, { Checked => 0 });
1617 $main::xestiascan_presmodule->endcell();
1619 $main::xestiascan_presmodule->addcell($cssname);
1620 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{modavailable});
1621 $main::xestiascan_presmodule->endcell();
1623 $main::xestiascan_presmodule->endrow();
1627 # Process the list of not available user export modules.
1629 $exportmodulename = "";
1630 my $duplicateexportmodulename = "";
1631 my $duplicateexportmodulefound = 0;
1633 foreach $exportmodulename (keys %userexportinfo){
1635 # Check the list of available output modules and skip
1636 # this bit if the output module name matches this list.
1638 $duplicateexportmodulefound = 0;
1640 foreach $duplicateexportmodulename (@availableexportmodules){
1642 if ($duplicateexportmodulename eq $exportmodulename){
1644 $duplicateexportmodulefound = 1;
1650 next if $duplicateexportmodulefound eq 1;
1652 # Setup the styling for the row.
1654 if ($cssstyle eq 0){
1656 $cssname = "tablecell1";
1661 $cssname = "tablecell2";
1666 $main::xestiascan_presmodule->addcell($cssname);
1667 $main::xestiascan_presmodule->addtext($exportmodulename);
1668 $main::xestiascan_presmodule->endcell();
1670 $main::xestiascan_presmodule->addcell($cssname);
1672 if ($userexportinfo{$outputmodulename}){
1674 if ($userexportinfo{$outputmodulename} eq 1){
1676 $main::xestiascan_presmodule->addcheckbox("exportmodule_" . $exportmodulename, { Checked => 1 });
1680 $main::xestiascan_presmodule->addcheckbox("exportmodule_" . $exportmodulename, { Checked => 0 });
1686 $main::xestiascan_presmodule->addcheckbox("exportmodule_" . $exportmodulename, { Checked => 0 });
1690 $main::xestiascan_presmodule->endcell();
1692 $main::xestiascan_presmodule->addcell($cssname);
1693 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{modunavailable});
1694 $main::xestiascan_presmodule->endcell();
1696 $main::xestiascan_presmodule->endrow();
1700 $main::xestiascan_presmodule->endtable();
1702 $main::xestiascan_presmodule->addlinebreak();
1704 # User Information table.
1706 $main::xestiascan_presmodule->addsubmit($main::xestiascan_lang{users}{edituserbutton});
1707 $main::xestiascan_presmodule->addtext(" | ");
1708 $main::xestiascan_presmodule->addreset($main::xestiascan_lang{common}{clearvalues});
1710 $main::xestiascan_presmodule->endform();
1712 $main::xestiascan_presmodule->endbox();
1713 $main::xestiascan_presmodule->endbox();
1715 return $main::xestiascan_presmodule->grab();
1719 sub xestiascan_users_delete{
1720 #################################################################################
1721 # xestiascan_users_delete: Delete a user in the user list. #
1725 # xestiascan_users_delete(username, confirm); #
1727 # username Specifies the user to delete. #
1728 # confirm Confirms if the user should be deleted. #
1729 #################################################################################
1731 my $username = shift;
1732 my $confirm = shift;
1742 # The username is blank so return an error.
1744 xestiascan_error("usernameblank");
1748 # Connect to the database server.
1750 $main::xestiascan_authmodule->connect();
1752 # Check if any errors occured while connecting to the database server.
1754 if ($main::xestiascan_authmodule->geterror eq "AuthConnectionError"){
1756 # A database connection error has occured so return
1759 xestiascan_error("authconnectionerror", $main::xestiascan_authmodule->geterror(1));
1763 # Check to see if the user has permission to manage users.
1765 my $access_userlist = $main::xestiascan_authmodule->getpermissions({ Username => $main::loggedin_user, PermissionType => "Admin" });
1767 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1769 # A database error has occured so return an error with
1770 # the extended error information.
1772 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1));
1776 if ($access_userlist ne 1){
1778 # User not allowed to access the user list so return an error.
1779 xestiascan_error("notpermitted");
1783 # Check the user name to see if it is valid.
1785 xestiascan_variablecheck($username, "utf8", 0, 0);
1787 my $username_maxlength_check = xestiascan_variablecheck(xestiascan_utf8convert($username), "maxlength", 32, 1);
1789 if ($username_maxlength_check eq 1){
1791 # Username is too long so return an error.
1793 xestiascan_error("usernametoolong");
1797 # Check to see if the user exists.
1799 $main::xestiascan_authmodule->getpermissions({ Username => $username, PermissionType => "Enabled" });
1801 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1803 # A database error has occured so return an error with
1804 # the extended error information.
1806 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1));
1812 if ($main::xestiascan_authmodule->geterror eq "UserDoesNotExist"){
1814 xestiascan_error("usernameinvalid");
1820 # The action to delete the user has been confirmed.
1822 $main::xestiascan_authmodule->deleteuser($username);
1824 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1826 # A database error has occured so return an error with
1827 # the extended error information.
1829 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1));
1833 if ($main::xestiascan_authmodule->geterror eq "UserDoesNotExist"){
1835 xestiascan_error("usernameinvalid");
1839 # Disconnect from the database server.
1841 $main::xestiascan_authmodule->disconnect();
1843 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{userdeleted}, { Style => "pageheader" });
1844 $main::xestiascan_presmodule->addlinebreak();
1845 $main::xestiascan_presmodule->addlinebreak();
1846 $main::xestiascan_presmodule->addtext(xestiascan_language($main::xestiascan_lang{users}{userdeletedsuccess}, xestiascan_utf8convert($username)));
1847 $main::xestiascan_presmodule->addlinebreak();
1848 $main::xestiascan_presmodule->addlinebreak();
1849 $main::xestiascan_presmodule->addlink($main::xestiascan_env{"script_filename"} . "?mode=users", { Text => $main::xestiascan_lang{users}{returnuserlist} });
1851 return $main::xestiascan_presmodule->grab();
1855 # Disconnect from the database server.
1857 $main::xestiascan_authmodule->disconnect();
1859 # The action to delete the user has not been confirmed so
1860 # write out a form asking the user to confirm it.
1862 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{deleteuser}, { Style => "pageheader" });
1863 $main::xestiascan_presmodule->addlinebreak();
1864 $main::xestiascan_presmodule->addlinebreak();
1865 $main::xestiascan_presmodule->addtext(xestiascan_language($main::xestiascan_lang{users}{deleteuserareyousure}, xestiascan_utf8convert($username)));
1866 $main::xestiascan_presmodule->addlinebreak();
1867 $main::xestiascan_presmodule->addlinebreak();
1869 $main::xestiascan_presmodule->startform($main::xestiascan_env{"script_filename"}, "POST");
1870 $main::xestiascan_presmodule->addhiddendata("mode", "users");
1871 $main::xestiascan_presmodule->addhiddendata("action", "delete");
1872 $main::xestiascan_presmodule->addhiddendata("confirm", "1");
1873 $main::xestiascan_presmodule->addhiddendata("user", xestiascan_utf8convert($username));
1874 $main::xestiascan_presmodule->addsubmit($main::xestiascan_lang{users}{deleteuserbutton});
1875 $main::xestiascan_presmodule->addtext(" | ");
1876 $main::xestiascan_presmodule->addlink($main::xestiascan_env{"script_filename"} . "?mode=users", { Text => $main::xestiascan_lang{users}{noreturnuserlist} });
1877 $main::xestiascan_presmodule->endform();
1879 return $main::xestiascan_presmodule->grab();
1883 sub xestiascan_users_flush{
1884 #################################################################################
1885 # xestiascan_users_flush: Flush the users out of the sessions table. #
1889 # xestiascan_users_flush(confirm); #
1891 # confirm Confirms the actions to flush the users out of the sessions #
1893 #################################################################################
1895 my $confirm = shift;
1903 # Connect to the database server.
1905 $main::xestiascan_authmodule->connect();
1907 # Check if any errors occured while connecting to the database server.
1909 if ($main::xestiascan_authmodule->geterror eq "AuthConnectionError"){
1911 # A database connection error has occured so return
1914 xestiascan_error("authconnectionerror", $main::xestiascan_authmodule->geterror(1));
1918 # Check to see if the user has permission to manage users.
1920 my $access_userlist = $main::xestiascan_authmodule->getpermissions({ Username => $main::loggedin_user, PermissionType => "Admin" });
1922 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1924 # A database error has occured so return an error with
1925 # the extended error information.
1927 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1));
1931 if ($access_userlist ne 1){
1933 # User not allowed to access the user list so return an error.
1934 xestiascan_error("notpermitted");
1936 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1938 # A database error has occured so return an error with
1939 # the extended error information.
1941 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1));
1947 # Check to see if the action to flush the users from session
1948 # table has been confirmed.
1952 # Action confirmed, so flush the users table.
1954 $main::xestiascan_authmodule->flushusers();
1956 # Check to see if an error occured while flushing the users out of the session table.
1958 if ($main::xestiascan_authmodule->geterror eq "DatabaseError"){
1960 # A database error has occured so return an error with
1961 # the extended error information.
1963 xestiascan_error("autherror", $main::xestiascan_authmodule->geterror(1));
1967 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{logoutallusers}, {Style => "pageheader" });
1968 $main::xestiascan_presmodule->addlinebreak();
1969 $main::xestiascan_presmodule->addlinebreak();
1970 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{logoutallsuccess});
1971 $main::xestiascan_presmodule->addlinebreak();
1972 $main::xestiascan_presmodule->addlinebreak();
1973 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{logoutallloginagain});
1974 $main::xestiascan_presmodule->addlinebreak();
1975 $main::xestiascan_presmodule->addlinebreak();
1976 $main::xestiascan_presmodule->addlink($main::xestiascan_env{"script_filename"}, { Text => $main::xestiascan_lang{users}{logoutallcontinue} });
1978 return $main::xestiascan_presmodule->grab();
1982 # Disconnect from server.
1984 $main::xestiascan_authmodule->disconnect();
1986 # The action to flush the users from the session tables has not
1987 # been confirmed so write a message asking for confiramation.
1989 # $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{deleteuser}, { Style => "pageheader" });
1990 # $main::xestiascan_presmodule->addlinebreak();
1991 # $main::xestiascan_presmodule->addlinebreak();
1992 # $main::xestiascan_presmodule->addtext(xestiascan_language($main::xestiascan_lang{users}{deleteuserareyousure}, $username));
1993 # $main::xestiascan_presmodule->addlinebreak();
1994 # $main::xestiascan_presmodule->addlinebreak();
1996 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{logoutallusers}, {Style => "pageheader" });
1997 $main::xestiascan_presmodule->addlinebreak();
1998 $main::xestiascan_presmodule->addlinebreak();
1999 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{logoutallquestion});
2000 $main::xestiascan_presmodule->addlinebreak();
2001 $main::xestiascan_presmodule->addlinebreak();
2002 $main::xestiascan_presmodule->addtext($main::xestiascan_lang{users}{logoutallwarning});
2003 $main::xestiascan_presmodule->addlinebreak();
2004 $main::xestiascan_presmodule->addlinebreak();
2006 $main::xestiascan_presmodule->startform($main::xestiascan_env{"script_filename"}, "POST");
2007 $main::xestiascan_presmodule->addhiddendata("mode", "users");
2008 $main::xestiascan_presmodule->addhiddendata("action", "flush");
2009 $main::xestiascan_presmodule->addhiddendata("confirm", "1");
2010 $main::xestiascan_presmodule->addsubmit($main::xestiascan_lang{users}{logoutallbutton});
2011 $main::xestiascan_presmodule->addtext(" | ");
2012 $main::xestiascan_presmodule->addlink($main::xestiascan_env{"script_filename"} . "?mode=users", { Text => $main::xestiascan_lang{users}{noreturnuserlist} });
2013 $main::xestiascan_presmodule->endform();
2015 return $main::xestiascan_presmodule->grab();