Update z/OS Password Using PHP cURL Module

I’m trying to change a password on a z/OS mainframe that I make an FTPS connection to. Working with a legacy codebase and I’m trying to get rid of the exec calls to cURL. You’ll notice all the certificate skipping in the old call…

$exec_string = "CURL -q -v -k -S --ftp-ssl-reqd "ftp://" . $hold_user['dm_ftphost'] . "/" --user " . $hold_user['dm_ftpuser'] . ":" . $hold_user['dm_ftppass'] . "/" . $new_pass . "/" . $new_pass . " -Q "cdup"";

I have been unable to translate this to the cURL PHP module. I’ve tried different combinations of CURLOPT_USER, CURLOPT_PASS, and CURLOPT_USERPWD.

As an example of what I’ve tried…

public function updatePassword($newPass) {
        $options = [
            CURLOPT_URL   => "ftp://" . $this->credentials->getField(Ftp_Credentials::HOST),
            CURLOPT_USERPWD =>  $this->credentials->getField(Ftp_Credentials::USER, ret_aes_pass()) . ":" . $this->credentials->getField(Ftp_Credentials::PASS, ret_aes_pass())
                . "/{$newPass}/{$newPass}"
        ];
        return $this->returnSetResult($this->curl($options));
    }

I know I have to update my password at login so there are few options I can use.

Below are my options for every cURL connection I make in case one of these is keeping me from setting my new password.
(I did comment out CURLOPT_USERNAME and CURLOPT_PASSWORD when I tested the above function)

        $options += [
            CURLOPT_FORBID_REUSE     => true,
            CURLOPT_FTP_USE_EPSV     => false,
            CURLOPT_FTP_SKIP_PASV_IP => true,
            CURLOPT_USERNAME         => $this->credentials->getField(Ftp_Credentials::USER, KDRS_AES_KEY),
            CURLOPT_PASSWORD         => $this->credentials->getField(Ftp_Credentials::PASS, KDRS_AES_KEY),
            CURLOPT_PORT             => $this->credentials->getField(Ftp_Credentials::PORT),
            CURLOPT_VERBOSE          => true,
            CURLOPT_FAILONERROR      => true,
            //CURLOPT_FOLLOWLOCATION   => true,
            CURLOPT_TIMEOUT          => 15,
            // SSL options for secure connection
            CURLOPT_FTP_SSL          => CURLFTPSSL_ALL,              // Use SSL/TLS for FTP
            CURLOPT_FTPSSLAUTH       => CURLFTPAUTH_TLS,             // Authenticate using TLS
            CURLOPT_SSLVERSION       => CURL_SSLVERSION_TLSv1_2,     // Use TLS 1.2 explicitly
            CURLOPT_SSL_VERIFYPEER   => true,                        // Verify the peer's SSL certificate
            CURLOPT_SSL_VERIFYHOST   => self::SSL_VERIFY_HOST_ENABLED,                           // Verify the host's name matches the SSL certificate
            CURLOPT_CAINFO           => PATH_CA_BUNDLE               // Path to your CA certificate bundle
        ];