#!/usr/bin/perl # # $Id: uploadmass.pl,v 1.19 2006/09/11 19:17:18 psims Exp $ # # Source File: uploadmass.pl my $HBI_Debug_uploadmass_pl = 0 ; warn "WARN: " . __FILE__ . " running. " if ($HBI_Debug_uploadmass_pl) ; # Get config use Text::ParseWords; use CGI qw/:standard/; require 'sitecfg.pl'; require 'testlib.pl'; require 'sbalib.pl'; &app_initialize; print "Content-Type: text/html\n\n"; if (&get_session($FORM{'tid'})) { warn "WARN: " . __FILE__ . " running. " if ($HBI_Debug_uploadmass_pl) ; &LanguageSupportInit(); $n=0; &open_results(); #if (defined($UPLOADED_FILES{'subjareas.csv'})) { $n++;upload_subjareas();} #if (defined($UPLOADED_FILES{'tests.csv'})) { $n++;upload_tests();} #if (defined($UPLOADED_FILES{'questions.csv'})) { $n++;upload_questions();} #if (defined($UPLOADED_FILES{'cnds.csv'})) { $n++;upload_users();} #if (defined($UPLOADED_FILES{'groups.csv'})) { $n++;upload_groups();} #if (defined($UPLOADED_FILES{'customfile'})) { $n++;upload_customfile();} $cndsfile = upload('cndsfile'); if (defined($cndsfile)) { warn "WARN: " . __FILE__ . " call upload_users.\n" if ($HBI_Debug_uploadmass_pl) ; $n++; upload_users($cndsfile); } $testfile = upload('testfile'); if (defined($testfile)) { warn "WARN: " . __FILE__ . " call upload_test.\n" if ($HBI_Debug_uploadmass_pl) ; $n++; upload_test($testfile); } if ($n==0) { print "

NO UPLOAD FILES PROVIDED. NOTHING IMPORTED.


\n"; } warn "WARN: " . __FILE__ . " running. " if ($HBI_Debug_uploadmass_pl) ; &close_results(); } sub upload_users { warn "WARN: " . __FILE__ . " called upload_users.\n" if ($HBI_Debug_uploadmass_pl) ; &log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "AD/UU"); # upload users my $cndsfile = $_[0]; print "

Importing USERS:


\n"; @oldrecs = get_data("cnd.$SESSION{'clid'}"); $oldrec = $oldrecs[0]; $oldrec =~ (s/authtests/createdate/); if ( !($oldrec =~ /createdby/) ) { $oldrec =~ s/grpid/createdby/; } chomp ($oldrec); @curflds = split(/&/, $oldrec); for (0 .. $#curflds) { $RECFLDS{$curflds[$_]} = $_;}; $oldkeyidx = $RECFLDS{'uid'}; for (1 .. $#oldrecs) { ($ukey, $trash) = split(/&/, $oldrecs[$_]); $OLDRECS{$ukey} = $trash; } $oldrechdr = shift @oldrecs; $oldrechdr =~ (s/authtests/createdate/); @udata = <$cndsfile>; $newrechdr = "$udata[0]\n"; @flds = parse_line(',',0,$udata[0]); $flds[$#flds] =~ s/\s+$// ; # HBI - Delete whitespace at the end of the last element. for (0 .. $#flds) { $NEWFLDS{$flds[$_]} = $_;}; @flds=(); $uididx = $NEWFLDS{'uid'}; $nmfidx = $NEWFLDS{'nmf'}; $nmmidx = $NEWFLDS{'nmm'}; $nmlidx = $NEWFLDS{'nml'}; $pwdidx = $NEWFLDS{'pwd'}; @duprecs = (); @badfmts = (); @illchars = (); @toolongs = (); @sortedrecs = (); $DEFAULT_FLDS{'authtests'} = time(); #authtests gets set to createdate in &put_candidate_profile(), but we have to set it here so it gets put in the file, so please don't delete this line $DEFAULT_FLDS{'createdate'} = time(); #This sets createdate for existing cnds. The s/authtests/createdate/ gets done before this $DEFAULT_FLDS{'grpid'} = ""; $DEFAULT_FLDS{'createdby'} = "$SESSION{'uid'}"; $DEFAULT_FLDS{'cnd1'} = ""; $DEFAULT_FLDS{'cnd2'} = ""; $DEFAULT_FLDS{'cnd3'} = ""; $DEFAULT_FLDS{'cnd4'} = ""; $DEFAULT_FLDS{'grpowner'} = "N"; my $groups = getGroups($SESSION{'clid'}); my %Clients_Special_Group = () ; my %Clients_Special_Group_Clear = () ; $Clients_Special_Group{'tgwall'} = 1 ; $Clients_Special_Group{'sandbox'} = 1 ; # DEvelopment only. $Clients_Special_Group_Clear{'ot'} = 1 ; $Clients_Special_Group_Clear{'dr'} = 1 ; $Clients_Special_Group_Clear{'pe'} = 1 ; $Clients_Special_Group_Clear{'ma'} = 1 ; if ($Clients_Special_Group{$SESSION{'clid'}}) { # Clear the membership of the special groups. foreach my $grp_clr (keys %Clients_Special_Group_Clear) { $groups->{$grp_clr}->{'grplist'} = [] ; } } warn "WARN: " . __FILE__ . " called getGroups." if ($HBI_Debug_uploadmass_pl) ; for (1 .. $#udata) { chomp($udata[$_]); $udata[$_] =~ s/\r//g; $udata[$_] =~ tr/'/\\'/d; @flds = parse_line(',',0,$udata[$_]); $flds[$#flds] =~ s/\s+$// ; # HBI - Delete whitespace at the end of the last element. $newkey = $flds[$uididx]; if ((length($flds[$uididx]) > 50) || (length($flds[$uididx]) < 3)) { $badrec = "uid: $udata[$_]\n"; push @toolongs, "$badrec"; #print STDERR "$udata[$_]\n (".join('|||',@flds).")\n"; } elsif ((length($flds[$pwdidx]) > 50) || (length($flds[$pwdidx]) < 3)){ $badrec = "pwd: $udata[$_]\n"; push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'sal'}]) > 15){ # $badrec = "sal: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif ((length($flds[$nmfidx]) > 20) || (length($flds[$nmfidx]) < 1)){ } elsif (length($flds[$nmfidx]) < 1) { $badrec = "nmf: $udata[$_]\n"; push @toolongs, "$badrec"; #} elsif (length($flds[$nmmidx]) > 20){ # $badrec = "nmm: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif ((length($flds[$nmlidx]) > 20) || (length($flds[$nmlidx]) < 1)){ } elsif (length($flds[$nmlidx]) < 1) { $badrec = "nml: $udata[$_]\n"; push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'adr'}]) > 50){ # $badrec = "adr: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'cty'}]) > 25){ # $badrec = "cty: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'ste'}]) > 4){ # $badrec = "ste: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'pst'}]) > 10){ # $badrec = "pst: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'ctry'}]) > 4){ # $badrec = "ctry: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'eml'}]) > 100){ # $badrec = "eml: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'cnd1'}]) > 16){ # $badrec = "cnd1: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'cnd2'}]) > 16){ # $badrec = "cnd2: $udata[$_]\n"; # push @toolongs, "$badrec"; #} elsif (length($flds[$NEWFLDS{'grpid'}]) > 100){ # $badrec = "grpid: $udata[$_]\n"; # push @toolongs, "$badrec"; } else { # Check for illegal characters $badrec = ""; foreach $key (keys %NEWFLDS) { $trash = $flds[$NEWFLDS{$key}]; if ($key eq "sal") { $trash =~ tr/. //d; } elsif ($key eq "adr") { $trash =~ tr/\- ,\/.#//d; } elsif ( ($key eq "nmf") || ($key eq "nml") || ($key eq "cty") || ($key eq "ctry") ) { $trash =~ tr/\- .'//d; } elsif ($key eq "nmm") { $trash =~ tr/. //d; } elsif ($key eq "pst") { $trash =~ tr/\- //d; } elsif (($key eq "eml") || ($key eq "uid") || ($key eq "pwd")) { $trash =~ tr/\-@.//d; } elsif ($key eq 'grpid') { $trash =~ tr/:, //d; } elsif (($key eq "cnd1") || ($key eq "cnd2") || ($key eq "cnd3") || ($key eq "cnd4")) { $trash =~ tr/ //d; } if ( $trash =~ /\W/ ) { $badrec = "$key: $udata[$_]\n"; #print STDERR "$key ($flds[$NEWFLDS{$key}],$trash)\n"; push @illchars, "$badrec"; } } # No illegal chars, so must be good if ($badrec eq "") { $goodrec = ""; if ($OLDRECS{$newkey} eq '') { for (0 .. $#curflds) { $delem = ""; $keyword=$curflds[$_]; $jidx = $NEWFLDS{$keyword}; if ($jidx ne '') { $delem = $flds[$jidx]; } if ($delem eq '') { $delem = $DEFAULT_FLDS{$keyword}; } if ($goodrec eq '') { $goodrec = $delem; } else { $goodrec = join('&', $goodrec, $delem); } } push @oldrecs, "$goodrec\n"; my ($ukey, $trash) = split(/&/, $goodrec); $OLDRECS{$ukey} = $trash; } else { $badrec = "$udata[$_]\n"; push @duprecs, "$badrec"; } if ($flds[$NEWFLDS{'grpid'}]) { # The are default group assignments #print STDERR $flds[$NEWFLDS{'grpid'}]."\n"; foreach my $grp (split(/\s*::\s*/,$flds[$NEWFLDS{'grpid'}])) { if (not exists $groups->{$grp}) { $groups->{$grp}->{'grpowner'} = 'grpadmin'; $groups->{$grp}->{'grpid'} = $grp; $groups->{$grp}->{'grpnme'} = $grp; $groups->{$grp}->{'grplist'} = [$flds[$uididx]]; $groups->{$grp}->{'validfrom'} = '01-01-2000'; $groups->{$grp}->{'validto'} = '12-31-2037'; } else { # Only add the user id to the group if it is not already in the group. my $already_in = 0 ; my $User_Id = $flds[$uididx] ; $already_in = grep /^${User_Id}$/ , @{$groups->{$grp}->{'grplist'}} ; unless ($already_in) { push @{$groups->{$grp}->{'grplist'}}, $User_Id ; } } } } } } } @udata = (); unless($#duprecs eq -1) { # duplicate, but add any groups the user may not already be a memeber of print "Rejected: Duplicate user (Group memeberships are added, though)
\n"; print "$newrechdr
\n"; for (0 .. $#duprecs) { print "$duprecs[$_]
\n"; } } @duprecs = (); #unless($#badfmts eq -1) { #print "Rejected: Required Element(s) Missing
\n"; #print "$newrechdr
\n"; #for (0 .. $#badfmts) { #print "$badfmts[$_]
\n"; #} #} unless($#toolongs eq -1) { print "Rejected: Field Is Wrong Length
\n"; print "$newrechdr
\n"; for (0 .. $#toolongs) { print "$toolongs[$_]
\n"; } } unless($#illchars eq -1) { print "Rejected: Illegal Characters
\n"; print "$newrechdr
\n"; for (0 .. $#illchars) { print "$illchars[$_]
\n"; } } @badfmts = (); @toolongs = (); @illchars = (); @sortedrecs = sort @oldrecs; @oldrecs=(); print "Accepted and Existing:
\n"; print "$oldrechdr
\n"; $tmpfile = join($pathsep, $dataroot, "cnd.$SESSION{'clid'}"); open (TMPFILE, ">$tmpfile") or $msg="failed"; print TMPFILE "$oldrechdr"; for (0 .. $#sortedrecs) { print TMPFILE "$sortedrecs[$_]"; print "$sortedrecs[$_]
\n"; }; close TMPFILE; if ($groups) { my @newgrps; #print STDERR Dumper($groups); foreach my $grp (sort keys (%$groups)) { push @newgrps, "$grp
\n"; # make entries unique, and sort for good measure my %tmp = map(($_=>1),@{$groups{$grp}->{'grplist'}}); @{$groups{$grp}->{'grplist'}} = keys %tmp; } if (&setGroups($SESSION{'clid'},$groups)) { print "Created and Populated Groups:
\n@newgrps"; } else { print "***Failed*** to Create and Populate Groups:
\n"; } } else { print "No Groups Defined:
\n"; } print "

\n"; } sub upload_groups { &log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "AD/UG"); # upload groups print "

Importing GROUPS:


\n"; } sub upload_test { # upload test file warn "WARN: " . __FILE__ . " called upload_test." if ($HBI_Debug_uploadmass_pl) ; &log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "AD/UT"); my $testfile = $_[0]; # some browsers send path info - gotta remove it my $testfilename = param('testfile'); $testfilename =~ s/\//;/g; $testfilename =~ s/\\/;/g; @testfilepath = split(/;/, $testfilename); $testfilename = $testfilepath[$#testfilepath]; # make sure client id is in test file name if ($testfilename =~ /.$SESSION{'clid'}$/ || $testfilename =~ /.$SESSION{'clid'}./) { print "

Importing Test file: $testfilename...


\n"; my $writefile = join($pathsep, $questionroot, $testfilename); open (OUTFILE,">$writefile"); while (<$testfile>) { print OUTFILE $_; } close(OUTFILE); print "

Done.


\n"; } else { print "

Test file: $testfilename does not contain proper client id \"$SESSION{'clid'}\".


\n"; } } sub upload_questions { &log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "AD/UQ"); # upload questions print "

Importing QUESTIONS:


\n"; } sub upload_subjareas { &log_entry($SESSION{'clid'}, $SESSION{'uid'}, "2", "AD/US"); # upload subject areas print "

Importing SUBJECT AREAS:


\n"; } sub open_results { print " "; } sub close_results { print " "; }