?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE Job Management : User Validation Interfaces' ??
MODULE jmm$validate_user;

{ PURPOSE:
{   This module contains the routine to validate specific user attributes.
{
{ DESIGN:
{   This module will access the user's validation file and verify the user's
{ validation information.  This module resides in the 23D library.  The
{ interface contained in this module is only callable by a job with a login
{ family of $SYSTEM and a login user of $SYSTEM.

?? NEWTITLE := 'Global Declarations Referenced By This Module' ??
?? PUSH (LISTEXT := ON) ??
*copyc ave$validation_interface_errors
*copyc cle$ecc_lexical
*copyc jmc$system_family
*copyc jme$invalid_parameter
*copyc jmt$user_validation_options
*copyc osd$integer_limits
*copyc ost$name
*copyc ost$status
?? POP ??
*copyc avp$prevalidate_job
*copyc clp$validate_name
*copyc jmp$get_attribute_name
*copyc osp$append_status_parameter
*copyc osp$force_access_violation
*copyc osp$set_status_abnormal
*copyc osp$set_status_condition
*copyc pmp$get_user_identification
?? OLDTITLE ??
?? NEWTITLE := '[XDCL, #GATE] jmp$validate_user', EJECT ??
*copy jmh$validate_user

  PROCEDURE [XDCL, #GATE] jmp$validate_user
    (    login_family: ost$name;
         login_user: ost$name;
         user_validation_options_p: ^jmt$user_validation_options;
     VAR status: ost$status);

    CONST
      password_index = 1;

    VAR
      index: ost$non_negative_integers,
      name_is_valid: boolean,
      scl_name: ost$name,
      user_identification: ost$user_identification,
      valid_encrypted_password: ost$name,
      valid_family: ost$name,
      valid_password: ost$name,
      valid_user: ost$name,
      validation_default: array [1 .. 1] of avt$validation_item,
      validation_options: array [1 .. 1] of avt$validation_item;

    status.normal := TRUE;

{ Verify that the requesting user is valid.  If not, "waste-em!"

    pmp$get_user_identification (user_identification, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;
    IF (user_identification.user <> jmc$system_user) OR (user_identification.family <> jmc$system_family) THEN
      osp$force_access_violation;
    IFEND;

    clp$validate_name (login_family, valid_family, name_is_valid);
    IF NOT name_is_valid THEN
      osp$set_status_abnormal ('CL', cle$improper_name, login_family, status);
      RETURN;
    IFEND;
    clp$validate_name (login_user, valid_user, name_is_valid);
    IF NOT name_is_valid THEN
      osp$set_status_abnormal ('CL', cle$improper_name, login_user, status);
      RETURN;
    IFEND;

    valid_password := osc$null_name;
    valid_encrypted_password := osc$null_name;
    validation_default [1].key := avc$null_validation_key;
    validation_options [1].key := avc$null_validation_key;

    IF user_validation_options_p <> NIL THEN
      FOR index := 1 TO UPPERBOUND (user_validation_options_p^) DO
        CASE user_validation_options_p^ [index].key OF

        = jmc$encrypted_password =
          valid_encrypted_password := user_validation_options_p^ [index].encrypted_password;

        = jmc$login_password =
          valid_password := user_validation_options_p^ [index].login_password;

        = jmc$null_attribute =
          ;

        ELSE
          jmp$get_attribute_name (user_validation_options_p^ [index].key, scl_name);
          osp$set_status_abnormal ('JM', jme$invalid_parameter, scl_name, status);
          osp$append_status_parameter (osc$status_parameter_delimiter, 'USER_VALIDATION_OPTIONS_P', status);
          osp$append_status_parameter (osc$status_parameter_delimiter, 'JMP$VALIDATE_USER', status);
          RETURN;
        CASEND
      FOREND;
    IFEND;

    IF valid_encrypted_password <> osc$null_name THEN
      validation_default [1].key := avc$password_key;
    IFEND;
    IF valid_password <> osc$null_name THEN
      validation_options [1].key := avc$password_key;
      validation_options [1].password := valid_password;
    IFEND;

    avp$prevalidate_job (valid_user, valid_family, ^validation_options, ^validation_default, status);
    IF status.normal THEN
      IF (valid_encrypted_password <> osc$null_name) AND (valid_encrypted_password <>
            validation_default [1].password) THEN
        osp$set_status_condition (ave$bad_user_validation_info, status);
      IFEND;
    IFEND;

  PROCEND jmp$validate_user;
?? OLDTITLE ??
MODEND jmm$validate_user;
