Commit 7ec685f9 authored by Leigh B Stoller's avatar Leigh B Stoller

Changes for dump/restore users:

* dumpuser: Change some user table fields to optional, since Portal
  users do not have to fill those things out (address, phone, zip,
  etc). I am using this to transfer accounts from the Mothership to
  inner Emulab when CONFIG_ADMINUSERS=1.

* newuser: equiv changes, allow some fields to be optional that usually
  are not. Also allow the password has to come through, normally we do
  not pass that through.
parent 0199f565
#!/usr/bin/perl -w #!/usr/bin/perl -w
# #
# Copyright (c) 2010-2013 University of Utah and the Flux Group. # Copyright (c) 2010-2013, 2018 University of Utah and the Flux Group.
# #
# {{{EMULAB-LICENSE # {{{EMULAB-LICENSE
# #
...@@ -128,7 +128,7 @@ sub DumpUser($) ...@@ -128,7 +128,7 @@ sub DumpUser($)
"URL" => {"tag" => "URL", "URL" => {"tag" => "URL",
"optional" => 1 }, "optional" => 1 },
"addr" => {"tag" => "address", "addr" => {"tag" => "address",
"optional" => 0 }, "optional" => 1 },
"addr2" => {"tag" => "address2", "addr2" => {"tag" => "address2",
"optional" => 1 }, "optional" => 1 },
"city" => {"tag" => "city", "city" => {"tag" => "city",
...@@ -136,13 +136,13 @@ sub DumpUser($) ...@@ -136,13 +136,13 @@ sub DumpUser($)
"state" => {"tag" => "state", "state" => {"tag" => "state",
"optional" => 0 }, "optional" => 0 },
"zip" => {"tag" => "zip", "zip" => {"tag" => "zip",
"optional" => 0 }, "optional" => 1 },
"country" => {"tag" => "country", "country" => {"tag" => "country",
"optional" => 0 }, "optional" => 0 },
"phone" => {"tag" => "phone", "phone" => {"tag" => "phone",
"optional" => 0 }, "optional" => 1 },
"title" => {"tag" => "title", "title" => {"tag" => "title",
"optional" => 0 }, "optional" => 1 },
"affil" => {"tag" => "affiliation", "affil" => {"tag" => "affiliation",
"optional" => 0 }, "optional" => 0 },
"shell" => {"tag" => "shell", "shell" => {"tag" => "shell",
......
...@@ -36,12 +36,15 @@ sub usage() ...@@ -36,12 +36,15 @@ sub usage()
print("Usage: newuser [-s] -t <type> <xmlfile>\n"); print("Usage: newuser [-s] -t <type> <xmlfile>\n");
exit(-1); exit(-1);
} }
my $optlist = "dt:nsp"; my $optlist = "dt:nsprP";
my $debug = 0; my $debug = 0;
my $impotent= 0; my $impotent= 0;
my $type = ""; my $type = "";
my $silent = 0; my $silent = 0;
my $relaxed = 0;
my $dopass = 0;
my $portal; my $portal;
my $passhash;
my @keyfiles = (); my @keyfiles = ();
# #
...@@ -117,6 +120,12 @@ if (defined($options{"s"})) { ...@@ -117,6 +120,12 @@ if (defined($options{"s"})) {
if (defined($options{"t"})) { if (defined($options{"t"})) {
$type = $options{"t"}; $type = $options{"t"};
} }
if (defined($options{"r"})) {
$relaxed = 1;
}
if (defined($options{"P"})) {
$dopass = 1;
}
if (@ARGV != 1) { if (@ARGV != 1) {
usage(); usage();
} }
...@@ -176,6 +185,13 @@ my %optional = ("uid" => "uid", ...@@ -176,6 +185,13 @@ my %optional = ("uid" => "uid",
"pubkey" => undef, "pubkey" => undef,
"pubkeys" => undef); "pubkeys" => undef);
my %relaxed_fields = ("affiliation_abbreviation" => 1,
"phone" => 1,
"title" => 1,
"address" => 1,
"zip" => 1,
"wikiname" => 1);
# #
# These are required for most users, but are optional for wiki-only users # These are required for most users, but are optional for wiki-only users
# #
...@@ -219,28 +235,29 @@ if (exists($xmlparse->{'attribute'}->{"portal"})) { ...@@ -219,28 +235,29 @@ if (exists($xmlparse->{'attribute'}->{"portal"})) {
if (!defined($brand)) { if (!defined($brand)) {
fatal("Bad portal: $portal"); fatal("Bad portal: $portal");
} }
# Remove these, we do not require them on the APT path. $relaxed = 1;
delete($required{"affiliation_abbreviation"});
delete($required{"phone"});
delete($required{"title"});
delete($required{"address"});
delete($required{"zip"});
delete($required{"wikiname"});
} }
# #
# Make sure all the required arguments were provided. # Make sure all the required arguments were provided.
# #
foreach my $key (keys(%required)) { foreach my $key (keys(%required)) {
next
if ($relaxed && exists($relaxed_fields{$key}));
fatal("Missing required attribute '$key'") fatal("Missing required attribute '$key'")
if (! exists($xmlparse->{'attribute'}->{"$key"})); if (! exists($xmlparse->{'attribute'}->{"$key"}));
} }
# #
# Always delete this. Used by the portal code but we ignore it. # Used by the portal code but we ignore it unless explicitly told
# not to.
# #
delete($xmlparse->{'attribute'}->{"passhash"}) if (exists($xmlparse->{'attribute'}->{"passhash"})) {
if (exists($xmlparse->{'attribute'}->{"passhash"})); if ($dopass) {
$passhash = $xmlparse->{'attribute'}->{"passhash"}->{'value'};
}
delete($xmlparse->{'attribute'}->{"passhash"});
}
# #
# We build up an array of arguments to pass to User->Create() as we check # We build up an array of arguments to pass to User->Create() as we check
...@@ -464,6 +481,9 @@ if (!defined($newuser)) { ...@@ -464,6 +481,9 @@ if (!defined($newuser)) {
if (defined($portal)) { if (defined($portal)) {
$newuser->SetStatus(USERSTATUS_UNAPPROVED()); $newuser->SetStatus(USERSTATUS_UNAPPROVED());
} }
if (defined($passhash)) {
$newuser->SetPassword($passhash);
}
my $key = $newuser->verify_key(); my $key = $newuser->verify_key();
my $usr_uid = $newuser->uid(); my $usr_uid = $newuser->uid();
my $usr_idx = $newuser->uid_idx(); my $usr_idx = $newuser->uid_idx();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment