?? RIGHT := 110 ??
?? NEWTITLE := 'NOS/VE: Program Management Miscellaneous Administrator Commands' ??
MODULE pmm$system_admin_misc_commands;

{ PURPOSE:
{   This module contains miscellaneous commands used to secure the system on
{ specified mainframes.
{

?? NEWTITLE := 'Global Declarations Referenced by this Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc clt$parameter_value_table
*copyc clt$which_parameter
*copyc dse$interval_password_errors
*copyc ofe$error_codes
*copyc pme$new_password_does_not_match
?? POP ??
*copyc avp$system_administrator
*copyc clp$evaluate_parameters
*copyc osp$append_status_parameter
*copyc osp$set_status_abnormal
*copyc osp$set_status_condition
*copyc pmp$change_operation_password
*copyc pmp$get_compact_date_time
*copyc pmp$lock_unlock_main_window
*copyc pmp$set_operation_password
*copyc pmp$set_operation_interval
?? OLDTITLE ??
?? NEWTITLE := '[XDCL] pmp$_change_operation_password', EJECT ??

  PROCEDURE [XDCL] pmp$_change_operation_password
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

{ PROCEDURE (osm$chaop) change_operation_password, chaop (
{   old_password, opw: (SECURE) name 7..7 = $required
{   new_password, npw: (CHECK, SECURE) name 7..7 = $required
{   verify_new_password, vnpw: (CHECK, SECURE) name 7..7 = $required
{   status)

?? PUSH (LISTEXT := ON) ??
?? FMT (FORMAT := OFF) ??

  VAR
    pdt: [STATIC, READ, cls$declaration_section] record
      header: clt$pdt_header,
      names: array [1 .. 7] of clt$pdt_parameter_name,
      parameters: array [1 .. 4] of clt$pdt_parameter,
      type1: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type2: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type3: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type4: record
        header: clt$type_specification_header,
      recend,
    recend := [
    [1,
    [91, 2, 12, 12, 48, 55, 677],
    clc$command, 7, 4, 3, 0, 0, 0, 4, 'OSM$CHAOP'], [
    ['NEW_PASSWORD                   ',clc$nominal_entry, 2],
    ['NPW                            ',clc$abbreviation_entry, 2],
    ['OLD_PASSWORD                   ',clc$nominal_entry, 1],
    ['OPW                            ',clc$abbreviation_entry, 1],
    ['STATUS                         ',clc$nominal_entry, 4],
    ['VERIFY_NEW_PASSWORD            ',clc$nominal_entry, 3],
    ['VNPW                           ',clc$abbreviation_entry, 3]],
    [
{ PARAMETER 1
    [3, clc$normal_usage_entry, clc$secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$standard_parameter_checking, 5, clc$required_parameter, 0
  , 0],
{ PARAMETER 2
    [1, clc$normal_usage_entry, clc$secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$extended_parameter_checking, 5, clc$required_parameter, 0
  , 0],
{ PARAMETER 3
    [6, clc$normal_usage_entry, clc$secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$extended_parameter_checking, 5, clc$required_parameter, 0
  , 0],
{ PARAMETER 4
    [5, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name],
    clc$pass_by_reference, clc$immediate_evaluation, clc$standard_parameter_checking, 3,
  clc$optional_parameter, 0, 0]],
{ PARAMETER 1
    [[1, 0, clc$name_type], [7, 7]],
{ PARAMETER 2
    [[1, 0, clc$name_type], [7, 7]],
{ PARAMETER 3
    [[1, 0, clc$name_type], [7, 7]],
{ PARAMETER 4
    [[1, 0, clc$status_type]]];

?? FMT (FORMAT := ON) ??
?? POP ??

    CONST
      p$old_password = 1,
      p$new_password = 2,
      p$verify_new_password = 3,
      p$status = 4;

    VAR
      pvt: array [1 .. 4] of clt$parameter_value;

?? NEWTITLE := 'check_procedure', EJECT ??

    PROCEDURE check_procedure
      (    parameter_value_table: ^clt$parameter_value_table;
           which_parameter: clt$which_parameter;
       VAR status: ost$status);

      VAR
        index: 1 .. 7,
        valid_password: string (7);

      status.normal := TRUE;

      IF NOT (which_parameter.specific) THEN
        IF (parameter_value_table^ [p$new_password].value^.name_value <>
              parameter_value_table^ [p$verify_new_password].value^.name_value) THEN
          osp$set_status_abnormal ('PM', pme$new_password_does_not_match, 'NEW_PASSWORD', status);
          osp$append_status_parameter (osc$status_parameter_delimiter, 'VERIFY_NEW_PASSWORD', status);
          RETURN;
        IFEND;

        valid_password := parameter_value_table^ [p$new_password].value^.name_value;
        FOR index := 1 TO STRLENGTH (valid_password) DO
          IF NOT (((valid_password (index) >= 'A') AND (valid_password (index) <= 'Z')) OR
                ((valid_password (index) >= '0') AND (valid_password (index) <= '9'))) THEN
            osp$set_status_condition (dse$alphanumeric_password, status);
            RETURN;
          IFEND;
        FOREND;

      IFEND;

    PROCEND check_procedure;
?? OLDTITLE, EJECT ??

    status.normal := TRUE;

    IF NOT avp$system_administrator () THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'SYSTEM_ADMINISTRATION', status);
      RETURN;
    IFEND;

    clp$evaluate_parameters (parameter_list, #SEQ (pdt), ^check_procedure, ^pvt, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    pmp$change_operation_password (pvt [p$old_password].value^.name_value,
          pvt [p$new_password].value^.name_value, status);

  PROCEND pmp$_change_operation_password;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL] pmp$_disable_main_operator_wind', EJECT ??

  PROCEDURE [XDCL] pmp$_disable_main_operator_wind
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

{ PROCEDURE (osm$dismow) disable_main_operator_window, dismow (
{   password, pw: (SECURE) name 7..7 = $required
{   status)

?? PUSH (LISTEXT := ON) ??
?? FMT (FORMAT := OFF) ??

  VAR
    pdt: [STATIC, READ, cls$declaration_section] record
      header: clt$pdt_header,
      names: array [1 .. 3] of clt$pdt_parameter_name,
      parameters: array [1 .. 2] of clt$pdt_parameter,
      type1: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type2: record
        header: clt$type_specification_header,
      recend,
    recend := [
    [1,
    [91, 2, 6, 17, 42, 11, 12],
    clc$command, 3, 2, 1, 0, 0, 0, 2, 'OSM$DISMOW'], [
    ['PASSWORD                       ',clc$nominal_entry, 1],
    ['PW                             ',clc$abbreviation_entry, 1],
    ['STATUS                         ',clc$nominal_entry, 2]],
    [
{ PARAMETER 1
    [1, clc$normal_usage_entry, clc$secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$standard_parameter_checking, 5, clc$required_parameter, 0
  , 0],
{ PARAMETER 2
    [3, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name],
    clc$pass_by_reference, clc$immediate_evaluation, clc$standard_parameter_checking, 3,
  clc$optional_parameter, 0, 0]],
{ PARAMETER 1
    [[1, 0, clc$name_type], [7, 7]],
{ PARAMETER 2
    [[1, 0, clc$status_type]]];

?? FMT (FORMAT := ON) ??
?? POP ??

    CONST
      p$password = 1,
      p$status = 2;

    VAR
      pvt: array [1 .. 2] of clt$parameter_value;


    status.normal := TRUE;

    IF NOT avp$system_administrator () THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'SYSTEM_ADMINISTRATION', status);
      RETURN;
    IFEND;

    clp$evaluate_parameters (parameter_list, #SEQ (pdt), NIL, ^pvt, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    pmp$lock_unlock_main_window (pvt [p$password].value^.name_value, TRUE, status);

  PROCEND pmp$_disable_main_operator_wind;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL] pmp$_enable_main_operator_windo', EJECT ??

  PROCEDURE [XDCL] pmp$_enable_main_operator_windo
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

{ PROCEDURE (osm$enamow) enable_main_operator_window, enamow (
{   password, pw: (SECURE) name 7..7 = $required
{   status)

?? PUSH (LISTEXT := ON) ??
?? FMT (FORMAT := OFF) ??

  VAR
    pdt: [STATIC, READ, cls$declaration_section] record
      header: clt$pdt_header,
      names: array [1 .. 3] of clt$pdt_parameter_name,
      parameters: array [1 .. 2] of clt$pdt_parameter,
      type1: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type2: record
        header: clt$type_specification_header,
      recend,
    recend := [
    [1,
    [91, 2, 6, 17, 42, 42, 415],
    clc$command, 3, 2, 1, 0, 0, 0, 2, 'OSM$ENAMOW'], [
    ['PASSWORD                       ',clc$nominal_entry, 1],
    ['PW                             ',clc$abbreviation_entry, 1],
    ['STATUS                         ',clc$nominal_entry, 2]],
    [
{ PARAMETER 1
    [1, clc$normal_usage_entry, clc$secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$standard_parameter_checking, 5, clc$required_parameter, 0
  , 0],
{ PARAMETER 2
    [3, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name],
    clc$pass_by_reference, clc$immediate_evaluation, clc$standard_parameter_checking, 3,
  clc$optional_parameter, 0, 0]],
{ PARAMETER 1
    [[1, 0, clc$name_type], [7, 7]],
{ PARAMETER 2
    [[1, 0, clc$status_type]]];

?? FMT (FORMAT := ON) ??
?? POP ??

    CONST
      p$password = 1,
      p$status = 2;

    VAR
      pvt: array [1 .. 2] of clt$parameter_value;


    status.normal := TRUE;

    IF NOT avp$system_administrator () THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'SYSTEM_ADMINISTRATION', status);
      RETURN;
    IFEND;

    clp$evaluate_parameters (parameter_list, #SEQ (pdt), NIL, ^pvt, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    pmp$lock_unlock_main_window (pvt [p$password].value^.name_value, FALSE, status);

  PROCEND pmp$_enable_main_operator_windo;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL] pmp$_set_operation_password', EJECT ??

  PROCEDURE [XDCL] pmp$_set_operation_password
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

{ PROCEDURE (osm$setop) set_operation_password, setop (
{   password, pw: (CHECK, SECURE) name 7..7 = $required
{   verify_password, vpw: (CHECK, SECURE) name 7..7 = $required
{   status)

?? PUSH (LISTEXT := ON) ??
?? FMT (FORMAT := OFF) ??

  VAR
    pdt: [STATIC, READ, cls$declaration_section] record
      header: clt$pdt_header,
      names: array [1 .. 5] of clt$pdt_parameter_name,
      parameters: array [1 .. 3] of clt$pdt_parameter,
      type1: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type2: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type3: record
        header: clt$type_specification_header,
      recend,
    recend := [
    [1,
    [91, 2, 12, 12, 49, 20, 436],
    clc$command, 5, 3, 2, 0, 0, 0, 3, 'OSM$SETOP'], [
    ['PASSWORD                       ',clc$nominal_entry, 1],
    ['PW                             ',clc$abbreviation_entry, 1],
    ['STATUS                         ',clc$nominal_entry, 3],
    ['VERIFY_PASSWORD                ',clc$nominal_entry, 2],
    ['VPW                            ',clc$abbreviation_entry, 2]],
    [
{ PARAMETER 1
    [1, clc$normal_usage_entry, clc$secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$extended_parameter_checking, 5, clc$required_parameter, 0
  , 0],
{ PARAMETER 2
    [4, clc$normal_usage_entry, clc$secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$extended_parameter_checking, 5, clc$required_parameter, 0
  , 0],
{ PARAMETER 3
    [3, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name],
    clc$pass_by_reference, clc$immediate_evaluation, clc$standard_parameter_checking, 3,
  clc$optional_parameter, 0, 0]],
{ PARAMETER 1
    [[1, 0, clc$name_type], [7, 7]],
{ PARAMETER 2
    [[1, 0, clc$name_type], [7, 7]],
{ PARAMETER 3
    [[1, 0, clc$status_type]]];

?? FMT (FORMAT := ON) ??
?? POP ??

    CONST
      p$password = 1,
      p$verify_password = 2,
      p$status = 3;

    VAR
      pvt: array [1 .. 3] of clt$parameter_value;

?? NEWTITLE := 'check_procedure', EJECT ??

    PROCEDURE check_procedure
      (    parameter_value_table: ^clt$parameter_value_table;
           which_parameter: clt$which_parameter;
       VAR status: ost$status);


      VAR
        index: 1 .. 7,
        valid_password: string (7);

      status.normal := TRUE;

      IF NOT (which_parameter.specific) THEN

        IF (parameter_value_table^ [p$password].value^.name_value <>
              parameter_value_table^ [p$verify_password].value^.name_value) THEN
          osp$set_status_abnormal ('PM', pme$new_password_does_not_match, 'PASSWORD', status);
          osp$append_status_parameter (osc$status_parameter_delimiter, 'VERIFY_PASSWORD', status);
          RETURN;
        IFEND;

        valid_password := parameter_value_table^ [p$password].value^.name_value;
        FOR index := 1 TO STRLENGTH (valid_password) DO
          IF NOT (((valid_password (index) >= 'A') AND (valid_password (index) <= 'Z')) OR
                ((valid_password (index) >= '0') AND (valid_password (index) <= '9'))) THEN
            osp$set_status_condition (dse$alphanumeric_password, status);
            RETURN;
          IFEND;
        FOREND;

      IFEND;

    PROCEND check_procedure;
?? OLDTITLE, EJECT ??

    status.normal := TRUE;

    IF NOT avp$system_administrator () THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'SYSTEM_ADMINISTRATION', status);
      RETURN;
    IFEND;

    clp$evaluate_parameters (parameter_list, #SEQ (pdt), ^check_procedure, ^pvt, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    pmp$set_operation_password (pvt [p$password].value^.name_value, status);

  PROCEND pmp$_set_operation_password;
?? OLDTITLE ??
?? NEWTITLE := '[XDCL] pmp$_set_operation_interval', EJECT ??

  PROCEDURE [XDCL] pmp$_set_operation_interval
    (    parameter_list: clt$parameter_list;
     VAR status: ost$status);

{ PROCEDURE (osm$setoi) set_operation_interval, setoi (
{   password, pw: (SECURE) name 7..7 = $required
{   month, m: integer 1..12 = $required
{   day, d: integer 1..31 = $required
{   year, y: integer 1900..2155 = $required
{   status)

?? PUSH (LISTEXT := ON) ??
?? FMT (FORMAT := OFF) ??

  VAR
    pdt: [STATIC, READ, cls$declaration_section] record
      header: clt$pdt_header,
      names: array [1 .. 9] of clt$pdt_parameter_name,
      parameters: array [1 .. 5] of clt$pdt_parameter,
      type1: record
        header: clt$type_specification_header,
        qualifier: clt$name_type_qualifier,
      recend,
      type2: record
        header: clt$type_specification_header,
        qualifier: clt$integer_type_qualifier,
      recend,
      type3: record
        header: clt$type_specification_header,
        qualifier: clt$integer_type_qualifier,
      recend,
      type4: record
        header: clt$type_specification_header,
        qualifier: clt$integer_type_qualifier,
      recend,
      type5: record
        header: clt$type_specification_header,
      recend,
    recend := [
    [1,
    [91, 2, 6, 17, 46, 26, 142],
    clc$command, 9, 5, 4, 0, 0, 0, 5, 'OSM$SETOI'], [
    ['D                              ',clc$abbreviation_entry, 3],
    ['DAY                            ',clc$nominal_entry, 3],
    ['M                              ',clc$abbreviation_entry, 2],
    ['MONTH                          ',clc$nominal_entry, 2],
    ['PASSWORD                       ',clc$nominal_entry, 1],
    ['PW                             ',clc$abbreviation_entry, 1],
    ['STATUS                         ',clc$nominal_entry, 5],
    ['Y                              ',clc$abbreviation_entry, 4],
    ['YEAR                           ',clc$nominal_entry, 4]],
    [
{ PARAMETER 1
    [5, clc$normal_usage_entry, clc$secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$standard_parameter_checking, 5, clc$required_parameter, 0
  , 0],
{ PARAMETER 2
    [4, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$standard_parameter_checking, 20, clc$required_parameter,
  0, 0],
{ PARAMETER 3
    [2, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$standard_parameter_checking, 20, clc$required_parameter,
  0, 0],
{ PARAMETER 4
    [9, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name, clc$specify_positionally],
    clc$pass_by_value, clc$immediate_evaluation, clc$standard_parameter_checking, 20, clc$required_parameter,
  0, 0],
{ PARAMETER 5
    [7, clc$normal_usage_entry, clc$non_secure_parameter,
    $clt$parameter_spec_methods[clc$specify_by_name],
    clc$pass_by_reference, clc$immediate_evaluation, clc$standard_parameter_checking, 3,
  clc$optional_parameter, 0, 0]],
{ PARAMETER 1
    [[1, 0, clc$name_type], [7, 7]],
{ PARAMETER 2
    [[1, 0, clc$integer_type], [1, 12, 10]],
{ PARAMETER 3
    [[1, 0, clc$integer_type], [1, 31, 10]],
{ PARAMETER 4
    [[1, 0, clc$integer_type], [1900, 2155, 10]],
{ PARAMETER 5
    [[1, 0, clc$status_type]]];

?? FMT (FORMAT := ON) ??
?? POP ??

    CONST
      p$password = 1,
      p$month = 2,
      p$day = 3,
      p$year = 4,
      p$status = 5;

    VAR
      pvt: array [1 .. 5] of clt$parameter_value;

    VAR
      current_date_time: ost$date_time,
      expiration_date: ost$date_time;


    status.normal := TRUE;

    IF NOT avp$system_administrator () THEN
      osp$set_status_abnormal ('OF', ofe$sou_not_active, 'SYSTEM_ADMINISTRATION', status);
      RETURN;
    IFEND;

    clp$evaluate_parameters (parameter_list, #SEQ (pdt), NIL, ^pvt, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    expiration_date.year := pvt [p$year].value^.integer_value.value - 1900;
    expiration_date.month := pvt [p$month].value^.integer_value.value;
    expiration_date.day := pvt [p$day].value^.integer_value.value;
    expiration_date.hour := 0;
    expiration_date.minute := 0;
    expiration_date.second := 0;
    expiration_date.millisecond := 0;

    pmp$get_compact_date_time (current_date_time, status);
    IF NOT status.normal THEN
      RETURN;
    IFEND;

    IF (expiration_date.year < current_date_time.year) THEN
      osp$set_status_condition (dse$invalid_interval_entered, status);
      RETURN;
    ELSEIF (expiration_date.year = current_date_time.year) THEN
      IF (expiration_date.month < current_date_time.month) THEN
        osp$set_status_condition (dse$invalid_interval_entered, status);
        RETURN;
      ELSEIF (expiration_date.month = current_date_time.month) THEN
        IF (expiration_date.day < current_date_time.day) THEN
          osp$set_status_condition (dse$invalid_interval_entered, status);
          RETURN;
        IFEND;
      IFEND;
    IFEND;

    pmp$set_operation_interval (pvt [p$password].value^.name_value, expiration_date, status);

  PROCEND pmp$_set_operation_interval;
?? OLDTITLE ??

MODEND pmm$system_admin_misc_commands;
