admin 发表于 2017-2-6 08:30:14

转贴:最新开心版WHMCS下载(含LIC文件)

WHMCS版本为6.2.2,从官方下载,未解密,未添加任何代码
链接:http://pan.baidu.com/s/1c0K5u8o 密码:lryj

lic文件:<?php
namespace WHMCS;
class License {
    protected $licensekey = '';
    protected $localkey = '';
    protected $keydata = array();
    protected $salt = '';
    protected $date = '';
    protected $localkeydecoded = '';
    protected $responsedata = '';
    protected $postmd5hash = '';
    protected $localkeydays = '10';
    protected $allowcheckfaildays = '5';
    protected $debuglog = array();
    protected $version = '7a1bbff560de83ab800c4d1d2f215b91006be8e6';

function __construct() {
    $whmcs = Application::getinstance();
    $this->licensekey = $whmcs->get_license_key();
    $this->localkey = $whmcs->get_config( 'License' );
    $this->salt = sha1( 'WHMCS' . $whmcs->get_config( 'Version' ) . 'TFB' . $whmcs->get_hash() );
    $this->date = date( 'Ymd' );
    $this->decodeLocalOnce();

    if (isset( $_GET['forceremote'] )) {
      $this->forceRemoteCheck();
      Terminus::getinstance()->doExit();
    }

}

function setInstance($license) {
    $license = self::$instance;
    return $license;
}

function destroyInstance() {
    self::$instance = null;
}

function getInstance() {
    if (is_null(self::$instance))
    {
      self::setinstance(new License());
    }

    return self::$instance;
}

function getHosts() {
    $hosts = gethostbynamel( 'licensing28.whmcs.com' );

    if ($hosts === false) {
      $hosts = array();
    }

    return $hosts;
}

function getLicenseKey() {
    return $this->licensekey;
}

function getHostIP() {
    if (isset( $_SERVER['SERVER_ADDR'] )) {
      $ip = $_SERVER['SERVER_ADDR'];
    } else {
      if (isset( $_SERVER['LOCAL_ADDR'] )) {
            $ip = $_SERVER['LOCAL_ADDR'];
      } else {
            if (function_exists( 'gethostname' )) {
                $ip = gethostbyname( gethostname() );
            } else {
                $ip = '';
            }
      }
    }

    return $ip;
}

function getHostDomain() {
    return (isset( $_SERVER['SERVER_NAME'] ) ? $_SERVER['SERVER_NAME'] : '');
}

function getHostDir() {
    return ROOTDIR;
}

function getSalt() {
    return $this->salt;
}

function getDate() {
    return $this->date;
}

function checkLocalKeyExpiry() {
    $originalcheckdate = $this->getKeyData( 'checkdate' );
    $localexpirymax = date( 'Ymd', mktime( 0, 0, 0, date( 'm' ), date( 'd' ) - $this->localkeydays, date( 'Y' ) ) );

    if ($originalcheckdate < $localexpirymax) {
      return false;
    }

    $localmax = date( 'Ymd', mktime( 0, 0, 0, date( 'm' ), date( 'd' ) + 2, date( 'Y' ) ) );

    if ($localmax < $originalcheckdate) {
      return false;
    }

    return true;
}

function remoteCheck($forceRemote = false) {
    try {
      $localkeyvalid = $this->decodeLocalOnce();
      $this->debug( '' . 'Local Key Valid: ' . $localkeyvalid );

      if ($localkeyvalid) {
            $localkeyvalid = $this->checkLocalKeyExpiry();
            $this->debug( '' . 'Local Key Expiry: ' . $localkeyvalid );

            if ($localkeyvalid) {
                $localkeyvalid = $this->validateLocalKey();
                $this->debug( '' . 'Local Key Validation: ' . $localkeyvalid );
            }
      }


      if ( !$localkeyvalid || $forceRemote ) {
            $whmcs                     = Application::getinstance();
            $results["status"]         = "Active";
            $results["key"]            = $this->licensekey;
            $results["registeredname"] = $whmcs->get_config("CompanyName");
            $results["productname"]    = "Owned License No Branding";
            $results["productid"]      = "5";
            $results["billingcycle"]   = "One Time";
            $results["validdomains"]   = $this->getHostDomain();
            $results["validips"]       = $this->getHostIP();
            $results["validdirs"]      = $this->getHostDir();
            $results["checkdate"]      = $this->getDate();
            $results["version"]      = $whmcs->getVersion()->getCanonical();
            $results["regdate"]      = "2014-02-06";
            $results["nextduedate"]    = "2050-02-06";
            $results["addons"]         = array(
                array(
                  'name' => 'Branding Removal',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                ),
                array(
                  'name' => 'Support and Updates',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                ),
                array(
                  'name' => 'Project Management Addon',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                ),
                array(
                  'name' => 'Licensing Addon',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                ),
                array(
                  'name' => 'Mobile Edition',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                ),
                array(
                  'name' => 'iPhone App',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                ),
                array(
                  'name' => 'Android App',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                ),
                array(
                  'name' => 'Configurable Package Addon',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                ),
                array(
                  'name' => 'Live Chat Monthly No Branding',
                  'nextduedate' => '2050-12-30',
                  'status' => 'Active'
                )
            );
            $this->setKeyData($results);
            $this->updateLocalKey();
      }

      $this->debug( 'Remote Check Done' );
    }
    catch (Exception $exception) {
      $this->debug( sprintf( 'License Error: %s', $exception->getMessage() ) );
      return false;
    }
    return true;
}

function getLocalMaxExpiryDate() {
    return date( 'Ymd', mktime( 0, 0, 0, date( 'm' ), date( 'd' ) - ( $this->localkeydays + $this->allowcheckfaildays ), date( 'Y' ) ) );
}

function buildQuery($postfields) {
    $query_string = '';
    foreach ($postfields as $k => $v) {
      $query_string .= $k . '=' . urlencode( $v ) . '&';
    }

    return $query_string;
}

function callHome($postfields) {
    $query_string = $this->buildQuery( $postfields );
    $res = $this->callHomeLoop( $query_string, 5 );

    if ($res) {
      return $res;
    }

    return $this->callHomeLoop( $query_string, 30 );
}

function callHomeLoop($query_string, $timeout = 5) {
    $hostips = $this->getHosts();
    foreach ($hostips as $hostip) {
      $responsecode = $this->makeCall( $hostip, $query_string, $timeout );

      if ($responsecode == 200) {
            return $this->responsedata;
      }
    }

    return false;
}

function makeCall($ip, $query_string, $timeout = 5) {
    $url = 'https://' . $ip . '/license/verify53.php';
    $this->debug( '' . 'Request URL ' . $url );
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_POST, 1 );
    curl_setopt( $ch, CURLOPT_POSTFIELDS, $query_string );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
    $this->responsedata = curl_exec( $ch );
    $responsecode = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
    $this->debug( '' . 'Response Code: ' . $responsecode . ' Data: ' . $this->responsedata );

    if (curl_error( $ch )) {
      $this->debug( 'Curl Error: ' . curl_error( $ch ) . ' - ' . curl_errno( $ch ) );
    }

    curl_close( $ch );
    return $responsecode;
}

function processResponse($data) {
    $data = strrev( $data );
    $data = base64_decode( $data );
    $results = unserialize( $data );
    $this->posthash = $results['hash'];
    unset( $results['hash'] );
    $results['checkdate'] = $this->getDate();
    return $results;
}

function updateLocalKey()
{
    $data_encoded = serialize($this->keydata);
    $data_encoded = base64_encode($data_encoded);
    $data_encoded = sha1($this->getDate() . $this->getSalt()) . $data_encoded;
    $data_encoded = strrev($data_encoded);
    $splpt = strlen($data_encoded) / 2;
    $data_encoded = substr($data_encoded, $splpt) . substr($data_encoded, 0, $splpt);
    $data_encoded = sha1($data_encoded . $this->getSalt()) . $data_encoded . sha1($data_encoded . $this->getSalt() . time());
    $data_encoded = base64_encode($data_encoded);
    $data_encoded = wordwrap($data_encoded, 80, "\n", true);
    Application::getinstance()->set_config("License", $data_encoded);
    $this->debug("Updated Local Key");
    return null;
}

function forceRemoteCheck() {
    $this->remoteCheck( true );
}

function setInvalid($reason = 'Invalid') {
    $this->keydata = array( 'status' => $reason );
}

function decodeLocal()
{
    $this->debug("Decoding local key");
    $localkey = $this->localkey;

    if (!$localkey)
    {
      return false;
    }

    $localkey = str_replace("\n", "", $localkey);
    $localkey = base64_decode($localkey);
    $localdata = substr($localkey, 40, 0 - 40);
    $md5hash = substr($localkey, 0, 40);

    if ($md5hash == sha1($localdata . $this->getSalt()))
    {
      $splpt = strlen($localdata) / 2;
      $localdata = substr($localdata, $splpt) . substr($localdata, 0, $splpt);
      $localdata = strrev($localdata);
      $md5hash = substr($localdata, 0, 40);
      $localdata = substr($localdata, 40);
      $localdata = base64_decode($localdata);
      $localkeyresults = unserialize($localdata);
      $originalcheckdate = $localkeyresults['checkdate'];

      if ($md5hash == sha1($originalcheckdate . $this->getSalt()))
      {
            if (isset($localkeyresults['key']) && $localkeyresults['key'] == Application::getinstance()->get_license_key())
            {
                $this->debug("Local Key Decode Successful");
                $this->setKeyData($localkeyresults);
            }
            else
            {
                $this->debug("License Key Invalid");
            }
      }
      else
      {
            $this->debug("Local Key MD5 Hash 2 Invalid");
      }
    }
    else
    {
      $this->debug("Local Key MD5 Hash Invalid");
    }

    $this->localkeydecoded = true;
    return $this->getKeyData("status") == "Active" ? true : false;
}

function decodeLocalOnce() {
    if ($this->localkeydecoded) {
      return true;
    }

    return $this->decodeLocal();
}

function isRunningInCLI() {
    return ( php_sapi_name() == 'cli' && empty( $_SERVER['REMOTE_ADDR'] ) );
}

function validateLocalKey() {
    if ($this->getKeyData( 'status' ) != 'Active') {
      $this->debug( 'Local Key Status Check Failure' );
      return false;
    }


    if ($this->isRunningInCLI()) {
      $this->debug( 'Running in CLI Mode' );
    } else {
      $this->debug( 'Running in Browser Mode' );

      if ($this->isValidDomain( $this->getHostDomain() )) {
            $this->debug( 'Domain Validated Successfully' );
      } else {
            $this->debug( 'Local Key Domain Check Failure' );
            return false;
      }

      $ip = $this->getHostIP();
      $this->debug( '' . 'Host IP Address: ' . $ip );

      if (!$ip) {
            $this->debug( 'IP Could Not Be Determined - Skipping Local Validation of IP' );
      } else {
            if (!trim( $this->getKeyData( 'validips' ) )) {
                $this->debug( 'No Valid IPs returned by license check - Cloud Based License - Skipping Local Validation of IP' );
            } else {
                if ($this->isValidIP( $ip )) {
                  $this->debug( 'IP Validated Successfully' );
                } else {
                  $this->debug( 'Local Key IP Check Failure' );
                  return false;
                }
            }
      }
    }


    if ($this->isValidDir( $this->getHostDir() )) {
      $this->debug( 'Directory Validated Successfully' );
    }
    else {
      $this->debug( 'Local Key Directory Check Failure' );
      return false;
    }

    return true;
}

function isValidDomain($domain) {
    $validdomains = $this->getArrayKeyData( 'validdomains' );
    return in_array( $domain, $validdomains );
}

function isValidIP($ip) {
    $validips = $this->getArrayKeyData( 'validips' );
    return in_array( $ip, $validips );
}

function isValidDir($dir) {
    $validdirs = $this->getArrayKeyData( 'validdirs' );
    return in_array( $dir, $validdirs );
}

function revokeLocal() {
    Application::getinstance()->set_config( 'License', '' );
}

function getKeyData($var) {
    return (isset( $this->keydata[$var] ) ? $this->keydata[$var] : '');
}

function setKeyData($data) {
    $this->keydata = $data;
}

function getArrayKeyData($var) {
    $listData = array();
    $rawData = $this->getKeyData( $var );

    if (is_string( $rawData )) {
      $listData = explode( ',', $rawData );
      foreach ($listData as $k => $v) {
            if (is_string( $v )) {
                $listData[$k] = trim( $v );
                continue;
            }

            throw new Exception( 'Invalid license data structure' );
      }
    } else {
      if (!is_null( $rawData )) {
            throw new Exception( 'Invalid license data structure' );
      }
    }

    return $listData;
}

function getRegisteredName() {
    return $this->getKeyData( 'registeredname' );
}

function getProductName() {
    return $this->getKeyData( 'productname' );
}

function getStatus() {
    return $this->getKeyData( 'status' );
}

function getSupportAccess() {
    return $this->getKeyData( 'supportaccess' );
}

function getLicensedAddons() {
    $licensedAddons = $this->getKeyData( 'addons' );

    if (!is_array( $licensedAddons )) {
      $licensedAddons = array();
    }

    return $licensedAddons;
}

function getActiveAddons() {
    $licensedAddons = $this->getLicensedAddons();
    $activeAddons = array();
    foreach ($licensedAddons as $addon) {
      if ($addon['status'] == 'Active') {
            $activeAddons[] = $addon['name'];
            continue;
      }
    }

    return $activeAddons;
}

function isActiveAddon($addon) {
    return (in_array( $addon, $this->getActiveAddons() ) ? true : false);
}

function getExpiryDate($showday = false) {
    $expiry = $this->getKeyData( 'nextduedate' );

    if (!$expiry) {
      $expiry = 'Never';
    } else {
      if ($showday) {
            $expiry = date( 'l, jS F Y', strtotime( $expiry ) );
      } else {
            $expiry = date( 'jS F Y', strtotime( $expiry ) );
      }
    }

    return $expiry;
}

function getLatestPublicVersion() {
    try {
      $latestVersion = new Version\SemanticVersion ($this->getKeyData( 'latestpublicversion' ));
    }
    catch (Exception\Version\BadVersionNumber $e) {
      $whmcs = Application::getinstance();
      $latestVersion = $whmcs->getVersion();
    }
    return $latestVersion;
}

function getLatestPreReleaseVersion() {
    try {
      $latestVersion = new Version\SemanticVersion($this->getKeyData( 'latestprereleaseversion' ));
    }
    catch (Exception\Version\BadVersionNumber $e) {
      $whmcs = Application::getinstance();
      $latestVersion = $whmcs->getVersion();
    }
    return $latestVersion;
}

function getLatestVersion() {
    $whmcs = Application::getinstance();
    $installedVersion = $whmcs->getVersion();

    if (in_array( $installedVersion->getPreReleaseIdentifier(), array( 'beta', 'rc' ) )) {
      $latestVersion = $this->getLatestPreReleaseVersion();
    } else {
      $latestVersion = $this->getLatestPublicVersion();
    }

    return $latestVersion;
}

function isUpdateAvailable() {
    $whmcs = Application::getinstance();
    $installedVersion = $whmcs->getVersion();
    $latestVersion = $this->getLatestVersion();
    return Version\SemanticVersion::compare( $latestVersion, $installedVersion, '>' );
}

function getRequiresUpdates() {
    return ($this->getKeyData( 'requiresupdates' ) ? true : false);
}

function checkOwnedUpdates() {
    if (!$this->getRequiresUpdates()) {
      return true;
    }

    $whmcs = Application::getinstance();
    $licensedAddons =$this->getLicensedAddons();
    foreach ($licensedAddons as $addon) {
      if ( $addon['name'] == 'Support and Updates' && $addon['status'] == 'Active' ) {
            if (str_replace( '-', '', $whmcs->getReleaseDate() ) <= str_replace( '-', '', $addon['nextduedate'] )) {
                return true;
                continue;
            }

            continue;
      }
    }

    return false;
}

function getBrandingRemoval() {
    if (in_array( $this->getProductName(), array( 'Owned License No Branding', 'Monthly Lease No Branding' ) )) {
      return true;
    }

    $licensedAddons = $this->getLicensedAddons();
    foreach ($licensedAddons as $addon) {
      if ( $addon['name'] == 'Branding Removal' && $addon['status'] == 'Active' ) {
            return true;
            continue;
      }
    }

    return false;
}

function getVersionHash() {
    return $this->version;
}

function debug($msg) {
    $this->debuglog[] = $msg;
}

function getDebugLog() {
    return $this->debuglog;
}

function isClientLimitsEnabled() {
    return (string)$this->getKeyData( 'ClientLimitsEnabled' );
}

function getClientLimit() {
    $clientLimit = $this->getKeyData( 'ClientLimit' );

    if ($clientLimit == '') {
      return 0 - 1;
    }


    if (!is_numeric( $clientLimit )) {
      $this->debug( 'Invalid client limit value in license' );
      return 0;
    }

    return (int)$clientLimit;
}

function getTextClientLimit($admin = null) {
    $clientLimit = $this->getClientLimit();
    $result = 'Unlimited';

    if (0 < $clientLimit) {
      $result = number_format( $clientLimit, 0, '', ',' );
    } else {
      if ($admin && $text = $admin->lang( 'global', 'unlimited' )) {
            $result = $text;
      }
    }

    return $result;
}

function getNumberOfActiveClients() {
    return (int)get_query_val( 'tblclients', 'count(id)', 'status=\'Active\'' );
}

function getTextNumberOfActiveClients($admin = null) {
    $clientLimit = $this->getNumberOfActiveClients();
    $result = 'None';

    if (0 < $clientLimit) {
      $result = number_format( $clientLimit, 0, '', ',' );
    } else {
      if ($admin && $text = $admin->lang( 'global', 'none' )) {
            $result = $text;
      }
    }

    return $result;
}

function getClientBoundaryId() {
    return (int)get_query_val( 'tblclients', 'id', 'status=\'Active\'', 'id', 'ASC', (int)$this->getClientLimit() . ',1' );
}

function isNearClientLimit() {
    $clientLimit = $this->getClientLimit();
    $numClients = $this->getNumberOfActiveClients();

    if ($numClients < 1 || $clientLimit < 1) {
      return false;
    }

    $percentageBound = (250 < $clientLimit ? 0.0500000000000000027755576 : 0.100000000000000005551115);
    return $clientLimit * ( 1 - $percentageBound ) <= $numClients;
}

function getMemberPublicKey() {
    return '-----BEGIN PUBLIC KEY-----
      MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7OMhxWvu3FOqMblJGXjh
      vZQLhQa2wRQoetxAM7j/c+SzFVHmLteAZrn06FeoU1RhjQz9TE0kD6BzoBBuE1bm
      JkybOuhVJGVlI8QqLnl2F/jDFP3xshm2brRUt9vNBWXhGDRvOLOgmxaFtVjCiNAT
      9n4dtG+344xN7w568Rw3hnnGApypGFtypaKHSeNV6waeFgHeePXSPFMUpe9evZJa
      pyc9ENEWvi6nK9hWm1uZ+CfoeRjIKqW2QlgazGDqQtQev05LbDihK0Nc8LBqmVQS
      NB/N2CueyYKrzVUmNqbrkJaBVm6N3EnSNBOR7WXOPf1VOjGDu79kYrbhT1MUlKpp
      LQIDAQAB
      -----END PUBLIC KEY-----';
}

function encryptMemberData($data = array(), &$publicKey = '') {
    if (!$publicKey) {
      $publicKey = $this->getMemberPublicKey();
    }

    $publicKey = str_replace( array( "\n", "\r", " " ), array( '', '', '' ), $publicKey );
    $cipherText = '';

    if (is_array( $data )) {
      try {
            $rsa = new Crypt_RSA();
            $rsa->loadKey( $publicKey );
            $rsa->setEncryptionMode( CRYPT_RSA_ENCRYPTION_OAEP );
            $cipherText = $rsa->encrypt( json_encode( $data ) );

            if (!$cipherText) {
                throw new Exception( 'Could not perform rsa encryption' );
            } else {
                $cipherText = base64_encode( $cipherText );
            }
      }
      catch (Exception $e) {
            $this->debug( 'Failed to encrypt member data' );
      }
    }

    return $cipherText;
}
}?>
页: [1]
查看完整版本: 转贴:最新开心版WHMCS下载(含LIC文件)