From 64ac52e088e592763838bc8715f586d22a27a2d6 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Wed, 11 Jun 2008 19:17:22 +0000 Subject: [PATCH] fixed: userImport.pl overwrites settings when updating users --- docs/changelog/7.x.x.txt | 1 + sbin/userImport.pl | 262 ++++++++++++++++++--------------------- 2 files changed, 124 insertions(+), 139 deletions(-) diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 64736d61b..0d2ca94ef 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,4 +1,5 @@ 7.5.11 + - fixed: userImport.pl overwrites settings when updating users - fixed: Collaboration RSS link in header doesn't indicate title - fixed: edit branch can't update URLs on most assets - Replaced Cool Menus nav with a YUI Menu, which works and looks better. diff --git a/sbin/userImport.pl b/sbin/userImport.pl index 26d2267f7..6f62da700 100644 --- a/sbin/userImport.pl +++ b/sbin/userImport.pl @@ -10,9 +10,9 @@ our ($webguiRoot); -BEGIN { +BEGIN { $webguiRoot = ".."; - unshift (@INC, $webguiRoot."/lib"); + unshift (@INC, $webguiRoot."/lib"); } use strict; @@ -81,130 +81,112 @@ $session->user({userId=>3}); open(FILE,"<".$usersFile); print "OK\n" unless ($quiet); -my $first = 1; my $lineNumber = 0; my @field; my @profileFields = $session->db->buildArray("select fieldName from userProfileField"); -while() { - $lineNumber++; - chomp; - my @row = split($delimiter,$_); - my $i=0; - if ($first) { - # parse field headers - foreach (@row) { - chomp; - $field[$i] = $_; - $i++; - } - $first = 0; +while(my $line = ) { + $lineNumber++; + chomp $line; + next + if $line eq ''; + my @row = split($delimiter, $line); + use Data::Dumper (); + chomp @row; + if ($lineNumber == 1) { + @field = @row; + next; + } + # parse fields + my %user; + foreach my $item (@row) { + $item =~ s/\s+$//; + } + @user{@field} = @row; + if ($user{username} eq "" && $user{firstName} ne "" && $user{lastName} ne "") { + $user{username} = $user{firstName}.".".$user{lastName}; + } + elsif ($user{username} eq '') { + print "Skipping line ${lineNumber}: No username.\n" unless ($quiet); + next; + } - } else { - # parse fields - my %user = (); - foreach (@row) { - chomp; - $user{$field[$i]} = $_; - $user{$field[$i]} =~ s/\s+$//g; #remove trailing whitespace from each field - $i++; - } - - if ($user{username} eq "" && $user{firstName} ne "" && $user{lastName} ne "") { - $user{username} = $user{firstName}.".".$user{lastName}; - } - if ($user{password} eq "") { - $user{identifier} = $defaultIdentifier; - } else { - $user{identifier} = $user{password}; - } - $user{identifier} = Digest::MD5::md5_base64($user{identifier}); - $user{ldapUrl} = $ldapUrl if ($user{ldapUrl} eq ""); - $user{authMethod} = $authMethod if ($user{authMethod} eq ""); - $user{groups} = $groups if ($user{groups} eq ""); - $user{status} = $status if ($user{status} eq ""); - $user{expireOffset} = $expireOffset if ($user{expireOffset} eq ""); - $user{expireOffset} = calculateExpireOffset($user{expireOffset},$expireUnits); - if ($user{birthdate}) { - $user{birthdate} = WebGUI::DateTime->new($user{birthdate}." 00:00:00")->epoch(); + $user{identifier} ||= $user{password} + if $user{password}; + $user{ldapUrl} ||= $ldapUrl + if $ldapUrl; + $user{authMethod} ||= $authMethod + if $authMethod; + $user{groups} ||= $groups + if $groups; + $user{status} ||= $status + if $status; + $user{expireOffset} ||= $expireOffset + if $expireOffset; + $user{expireOffset} = calculateExpireOffset($user{expireOffset},$expireUnits) + if $user{expireOffset}; + $user{birthdate} = WebGUI::DateTime->new($user{birthdate}." 00:00:00")->epoch() + if $user{birthdate}; + $user{changePassword} ||= $canChangePass + if $user{changePassword} == ''; + # process user + my $u; + my ($userId) = $session->db->quickArray("select userid from users where username=?",[$user{username}]); + if (($update || $updateAdd) && $userId) { + # Allowed to update, and user exists + print "Updating user '$user{username}'\n" unless ($quiet); + $u = WebGUI::User->new($session, $userId); + if ($replaceGroups && $user{groups}) { + my $groups = $u->getGroups; + $u->deleteFromGroups(@$groups); } - if ($user{changePassword} eq "") { - if ($canChangePass) { - $user{changePassword} = 1; - } else { - $user{changePassword} = 0; - } - } - # process user - my $u; - my $queryHandler; - my ($duplicate) = $session->db->quickArray("select userid from users where username=?",[$user{username}]); - if ($user{username} eq "") { - print "Skipping line $lineNumber.\n" unless ($quiet); - } else { - # update only - if ($update) { - if ($duplicate) { - print "Updating user $user{username}\n" unless ($quiet); - $u = WebGUI::User->new($session, $duplicate); - if ($replaceGroups and ($user{groups} ne "")) { - $queryHandler = $session->db->prepare("delete from groupings where userid=?",[$duplicate]); - if ($queryHandler) { $queryHandler->execute(); } - } - my ($pw) = $session->db->quickArray("select authentication.fieldData from authentication,users where authentication.authMethod='WebGUI' and users.username=? and users.userId=authentication.userId and authentication.fieldName='identifier'",[$user{username}]); - $user{identifier} = $pw; - } else { - print "User $user{username} not found. Skipping.\n" unless ($quiet); - } - } elsif ($updateAdd) { # update and add users - if ($duplicate) { - print "Updating user $user{username}\n" unless ($quiet); - $u = WebGUI::User->new($session, $duplicate); - if ($replaceGroups and ($user{groups} ne "")) { - $queryHandler = $session->db->prepare("delete from groupings where userid=?",[$duplicate]); - if ($queryHandler) { $queryHandler->execute(); } - } - my ($pw) = $session->db->quickArray("select authentication.fieldData from authentication,users where authentication.authMethod='WebGUI' and users.username=? and users.userId=authentication.userId and authentication.fieldName='identifier'",[$user{username}]); - $user{identifier} = $pw; - } else { - $u = WebGUI::User->new($session, "new"); - print "Adding user $user{username}\n" unless ($quiet); - } - } else { # add users only - if ($duplicate) { - print "User $user{username} already exists. Skipping.\n" unless ($quiet); - } else { - $u = WebGUI::User->new($session, "new"); - print "Adding user $user{username}\n" unless ($quiet); - } - } - } - if ($u) { - $u->username($user{username}); - $u->authMethod($user{authMethod}); - $u->status($user{status}); - my $cmd = "WebGUI::Auth::".$authMethod; - my $load = "use ".$cmd; - $session->log->fatal("Authentication module failed to compile: $cmd.".$@) if($@); - eval($load); - my $auth = eval{$cmd->new($session, $authMethod,$u->userId)}; - $auth->saveParams($u->userId,"WebGUI",{identifier=>$user{identifier}}); - $auth->saveParams($u->userId,"LDAP",{ - ldapUrl=>$user{ldapUrl}, - connectDN=>$user{connectDN} - }); - $auth->saveParams($u->userId,"WebGUI",{changePassword=>$user{changePassword}}); - foreach (keys %user) { - if (isIn($_, @profileFields)) { - $u->profileField($_,$user{$_}); - } - } - if ($user{groups} ne "") { - my @groups = split(/,/,$user{groups}); - $u->addToGroups(\@groups,$user{expireOffset}); - } - } - - } + } + elsif ($update) { + # Can only update, user doesn't exist + print "User '$user{username}' not found. Skipping.\n" unless ($quiet); + next; + } + elsif ($userId) { + print "User '$user{username}' already exists. Skipping.\n" unless ($quiet); + next; + } + else { + # Allowed to add, user doesn't exist + print "Adding user '$user{username}'\n" unless ($quiet); + $u = WebGUI::User->new($session, "new"); + $user{identifier} ||= $defaultIdentifier + } + $user{identifier} = Digest::MD5::md5_base64($user{identifier}) + if ($user{identifier}); + if ($u) { + $u->username($user{username}); + $u->authMethod($user{authMethod}) + if $user{authMethod}; + $u->status($user{status}) + if $user{status}; + my $class = "WebGUI::Auth::".$authMethod; + (my $mod = "$class.pm") =~ s{::|'}{/}g; + if (! eval { require $mod; 1 } ) { + $session->log->fatal("Authentication module failed to compile: $cmd.".$@) if($@); + exit; + } + my $auth = $class->new($session, $authMethod,$u->userId); + $auth->saveParams($u->userId,"WebGUI",{identifier=>$user{identifier}}) + if $user{identifier}; + $auth->saveParams($u->userId,"LDAP",{ldapUrl=>$user{ldapUrl}}) + if $user{ldapUrl}; + $auth->saveParams($u->userId,"LDAP",{connectDN=>$user{connectDN}}) + if $user{connectDN}; + $auth->saveParams($u->userId,"WebGUI",{changePassword=>$user{changePassword}}); + foreach my $field (keys %user) { + if (isIn($field, @profileFields)) { + $u->profileField($field,$user{$field}); + } + } + if ($user{groups}) { + my @groups = split(/,/,$user{groups}); + $u->addToGroups(\@groups,$user{expireOffset}); + } + } } print "Cleaning up..." unless ($quiet); close(FILE); @@ -217,25 +199,27 @@ print "OK\n" unless ($quiet); # calculateExpireOffset(expireOffset,expireUnits) # return: offsetInSeconds sub calculateExpireOffset { - my ($offset, $units) = @_; - return undef if ($offset < 1); - if ($units eq "epoch") { - my $seconds = ($offset); - if ($seconds < 1) { - return undef; - } else { - return $seconds; - } - } - if ($units eq "fixed") { - my $seconds = (($offset - $session->datetime->time())); - if ($seconds < 1) { - return undef; - } else { - return int($seconds); - } + my ($offset, $units) = @_; + return undef if ($offset < 1); + if ($units eq "epoch") { + my $seconds = ($offset); + if ($seconds < 1) { + return undef; } - return $session->datetime->intervalToSeconds($offset, $units) + else { + return $seconds; + } + } + if ($units eq "fixed") { + my $seconds = (($offset - $session->datetime->time())); + if ($seconds < 1) { + return undef; + } + else { + return int($seconds); + } + } + return $session->datetime->intervalToSeconds($offset, $units) } __END__