in managementnode/lib/VCL/Module.pm [2158:2305]
sub setup_test_rpc_xml {
my $self = shift;
unless (ref($self) && $self->isa('VCL::Module')) {
notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method");
return;
}
my $verbose = shift;
if (!defined($verbose)) {
$verbose = 1;
}
my $error_count = 0;
my $user_id;
if (!$XMLRPC_URL) {
print "PROBLEM: xmlrpc_url is not configured in $CONF_FILE_PATH\n";
$error_count++;
}
if (!$XMLRPC_USER) {
print "PROBLEM: xmlrpc_username is not configured in $CONF_FILE_PATH\n";
$error_count++;
}
elsif ($XMLRPC_USER !~ /.@./) {
print "PROBLEM: xmlrpc_username value is not valid: '$XMLRPC_USER', the format must be 'username" . '@' . "affiliation_name'\n";
$error_count++;
}
else {
my ($username, $user_affiliation_name) = $XMLRPC_USER =~ /(.+)@(.+)/;
my $affiliation_ok = 0;
my $affiliation_info = get_affiliation_info();
if (!$affiliation_info) {
print "WARNING: unable to retrieve affiliation info from the database, unable to determine if affilation '$user_affiliation_name' is valid\n";
}
else {
for my $affiliation_id (keys(%$affiliation_info)) {
my $affiliation_name = $affiliation_info->{$affiliation_id}{name};
if ($user_affiliation_name =~ /^$affiliation_name$/i) {
print "OK: verified user affiliation exists in the database: '$affiliation_name'\n";
$affiliation_ok = 1;
last;
}
}
if (!$affiliation_ok) {
print "PROBLEM: user affiliation '$user_affiliation_name' does not exist in the database\n";
$error_count++;
}
}
if ($affiliation_ok) {
my $user_info = get_user_info($username, $user_affiliation_name);
if ($user_info) {
print "OK: verified user exists in the database: '$XMLRPC_USER'\n";
$user_id = $user_info->{id};
}
else {
print "PROBLEM: user does not exist in the database database: username: '$username', affiliation: '$user_affiliation_name'\n";
$error_count++;
}
if (!$XMLRPC_PASS) {
print "not verifying user password because xmlrpc_pass is not set in $CONF_FILE_PATH\n";
}
elsif ($user_affiliation_name !~ /^local$/i) {
print "not verifying user password because $XMLRPC_USER is not a local account\n";
}
elsif (!$user_info->{localauth}) {
print "WARNING: not verifying user password because localauth information could not be retrieved from the database\n";
}
else {
my $passhash = $user_info->{localauth}{passhash};
my $salt = $user_info->{localauth}{salt};
#print "verifying user password: '$XMLRPC_PASS':'$salt' =? '$passhash'\n";
# Get an SHA1 hex digest from the password and random string
my $digest = sha1_hex("$XMLRPC_PASS$salt");
if ($passhash eq $digest) {
print "OK: verfied xmlrpc_pass value is the correct password for $XMLRPC_USER\n";
}
else {
print "PROBLEM: xmlrpc_pass value configured in $CONF_FILE_PATH is not correct\n";
#print "localauth.passhash: $passhash\n";
#print "localauth.salt: $salt\n";
#print "xmlrpc_pass: $XMLRPC_PASS\n";
#print "calculated SHA1 digest ('$XMLRPC_PASS$salt'): $digest\n";
#print "'$digest' != '$passhash'";
$error_count++;
}
}
}
}
if (!$XMLRPC_PASS) {
print "PROBLEM: xmlrpc_pass is not configured in $CONF_FILE_PATH\n";
$error_count++;
}
print "\n";
if ($error_count) {
print "FAILURE: RPC-XML access is not configured correctly, errors encountered: $error_count\n";
return 0;
}
my $xmlrpc_function = 'system.listMethods';
my @xmlrpc_arguments = (
$xmlrpc_function,
);
my $response = xmlrpc_call(@xmlrpc_arguments);
if ($response && $response->value) {
print "SUCCESS: RPC-XML access is configured correctly\n" . format_data($response->value) . "\n" if ($verbose == 1);
return 1;
}
if (!$ENV->{rpc_xml_error}) {
print "FAILURE: RPC-XML access is not configured correctly, view the log file for more information: $LOGFILE\n";
return 0;
}
print "FAILURE: RPC-XML access is not configured correctly, error message:\n$ENV->{rpc_xml_error}\n\n";
if ($ENV->{rpc_xml_error} =~ /access denied/i) {
# Affiliation not correct
# Affiliation not included, default affiliation isn't Local
# Incorrect password
print "SUGGESTION: make sure the xmlrpc_username and xmlrpc_pass values are correct in $CONF_FILE_PATH\n";
}
if ($ENV->{rpc_xml_error} =~ /internal server error/i) {
# Affiliation not included in username
# User doesn't exist but affiliation does
# Affiliation does not exist
print "SUGGESTION: make sure the xmlrpc_username is correct in $CONF_FILE_PATH, current value: '$XMLRPC_USER'\n";
}
if ($ENV->{rpc_xml_error} =~ /internal error while processing/i) {
# Affiliation not included in username
# User doesn't exist but affiliation does
# Affiliation does not exist
print "SUGGESTION: make sure user ID $user_id has been added to the \$xmlrpcBlockAPIUsers line in the conf.php file on the web server\n";
}
return 0;
}