summaryrefslogtreecommitdiff
path: root/FS/FS/ClientAPI/passwd.pm
blob: 8001e4f2d85f9b45b5f8f9e5ac01df21ebff00ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package FS::ClientAPI::passwd;

use strict;
use FS::Record qw(qsearchs);
use FS::svc_acct;
use FS::svc_domain;

sub passwd {
  my $packet = shift;

  my $domain = $FS::ClientAPI::domain || $packet->{'domain'};
  my $svc_domain = qsearchs('svc_domain', { 'domain' => $domain } )
    or return { error => "Domain $domain not found" };

  my $old_password = $packet->{'old_password'};
  my $new_password = $packet->{'new_password'};
  my $new_gecos = $packet->{'new_gecos'};
  my $new_shell = $packet->{'new_shell'};

  #false laziness w/FS::ClientAPI::MyAccount::login

  my $svc_acct = qsearchs( 'svc_acct', { 'username'  => $packet->{'username'},
                                         'domsvc'    => $svc_domain->svcnum, }
                         );
  return { error => 'User not found.' } unless $svc_acct;

  my $cust_pkg = $svc_acct->cust_svc->cust_pkg;
  return { error => "Can't change password for a suspended service" }
    if $cust_pkg && $cust_pkg->status eq 'suspended';

  return { error => 'Incorrect password.' }
    unless $svc_acct->check_password($old_password);

  my %hash = $svc_acct->hash;
  my $new_svc_acct = new FS::svc_acct ( \%hash );
  $new_svc_acct->setfield('_password', $new_password ) 
    if $new_password && $new_password ne $old_password;
  $new_svc_acct->setfield('finger',$new_gecos) if $new_gecos;
  $new_svc_acct->setfield('shell',$new_shell) if $new_shell;
  my $error = $new_svc_acct->replace($svc_acct);

  return { error => $error };

}

sub chfn {}

sub chsh {}

1;