# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
# bos72D src/bos/usr/sbin/install/ecc/lib/ECC/ProxyPwdManager.pm 1.3.1.2 
#  
# Licensed Materials - Property of IBM 
#  
# Restricted Materials of IBM 
#  
# COPYRIGHT International Business Machines Corp. 2006,2015 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 
package ProxyPwdManager;

use strict;
use warnings;
use Exporter;

use lib '/usr/ecc/lib/ECC';
use Definitions;
use Utils;

use vars qw(@ISA @EXPORT);
@ISA = ('Exporter');
@EXPORT = ('setPassword');

# use Digest::MD5 qw(md5_base64);
use MIME::Base64;

sub remove_backspaces($)
{
    my $str = shift;
    my $str_prev;
    do  
    {
	$str_prev = $str;
	$str =~ s/(.|^)[\b]//;
    } while ($str ne $str_prev);

    return $str;
}

sub enter_pwd()
{
 system "stty -echo";
 my $p = <STDIN>;
 chomp $p;
 system "stty echo";
 print "\n";
 return remove_backspaces($p);
}

sub digest_pwd($)
{
  my $result = encode_base64(shift);
  chomp $result;
  return $result;
}

sub setPassword($)
{
 my $username = shift;

 my $LOCK_EXCLUSIVE = 2;
 my $UNLOCK         = 8;

 if ($username ne 'C10' && $username ne 'C20' && $username ne 'C30' && $username ne 'L1')
 {
   &Utils::showMessage(1, 17, '"\n\n0975-017 Invalid password handle.  Contact your local Service Representative.\n"');
   exit 1;
 }

 my $new_pwd;
 my $new_pwd_confirm;


 if (! -e Definitions::REPO_FILE_LOC)
  { open(repo_file, "+> @{[ Definitions::REPO_FILE_LOC ]}"); }
 else
  { open(repo_file, "+< @{[ Definitions::REPO_FILE_LOC ]}"); }

 flock repo_file, $LOCK_EXCLUSIVE;

 my %repo;

 while ($_ = <repo_file>)
 {
  next if $_ =~ /^\s*#|^\s*$/;
  chomp;
  (my $uid, my $pwd) = split /\s*=\s*/, $_, 2;
  $repo{$uid} = $pwd;
 }

 &Utils::showMessage(2, 27, '"\n\nEnter proxy password: "');
 $new_pwd = enter_pwd();
 
  if ( $new_pwd eq "" ) {
 	&Utils::showMessage(1, 22, '"0975-022 Passwords can not be empty"');
	exit 1;
 }
 
 &Utils::showMessage(2, 28, '"Confirm password: "');
 $new_pwd_confirm = enter_pwd;
 if ( $new_pwd ne $new_pwd_confirm ) {
 	&Utils::showMessage(1, 18, '"0975-018 Passwords do not match."');
	exit 1;
 }

 $repo{$username} = digest_pwd($new_pwd);

 truncate repo_file, 0;
 seek repo_file, 0, 0;

 foreach (keys %repo)
 {
  print repo_file "$_ = $repo{$_}\n";
 }
 
 flock repo_file, $UNLOCK;
 close(repo_file);
}

sub setPasswordUI
{
 my $username = $_[0];
 my $new_pwd = $_[1];

 my $LOCK_EXCLUSIVE = 2;
 my $UNLOCK         = 8;

 if ($username ne 'C10' && $username ne 'C20' && $username ne 'C30' && $username ne 'L1')
 {
   &Utils::showMessage(1, 17, '"\n\n0975-017 Invalid password handle.  Contact your local Service Representative.\n"');
   exit 1;
 }

 if (! -e Definitions::REPO_FILE_LOC)
  { open(repo_file, "+> @{[ Definitions::REPO_FILE_LOC ]}"); }
 else
  { open(repo_file, "+< @{[ Definitions::REPO_FILE_LOC ]}"); }

 flock repo_file, $LOCK_EXCLUSIVE;

 my %repo;

 while ($_ = <repo_file>)
 {
  next if $_ =~ /^\s*#|^\s*$/;
  chomp;
  (my $uid, my $pwd) = split /\s*=\s*/, $_, 2;
  $repo{$uid} = $pwd;
 }

 $repo{$username} = digest_pwd($new_pwd);

 truncate repo_file, 0;
 seek repo_file, 0, 0;

 foreach (keys %repo)
 {
  print repo_file "$_ = $repo{$_}\n";
 }
 
 flock repo_file, $UNLOCK;
 close(repo_file);
}

sub getPassword($)
{
 my $username = shift;


 open(repo_file, "< @{[ Definitions::REPO_FILE_LOC ]}");

 my %repo;

 while ($_ = <repo_file>)
 {
  next if $_ =~ /^\s*#|^\s*$/;
  chomp;
  (my $uid, my $pwd) = split /\s*=\s*/, $_, 2;
  $repo{$uid} = $pwd;
 }
 
 close(repo_file);

 my $ppwd = decode_base64($repo{$username});

 return $ppwd;
}

1;
