mirror of
https://gitlab.linphone.org/BC/public/flexisip-account-manager.git
synced 2026-01-17 10:08:05 +00:00
Send a confirmation email when the password is set for the first time Remove the API link from the menu and move it to the footer Allow different domains to be set in the POST /api/accounts endpoints + related tests Cleanup the API tests Update the dependencies
79 lines
2.2 KiB
PHP
79 lines
2.2 KiB
PHP
<?php
|
|
|
|
namespace Tests;
|
|
|
|
use App\Password;
|
|
use App\Helpers\Utils;
|
|
|
|
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
|
|
|
|
abstract class TestCase extends BaseTestCase
|
|
{
|
|
use CreatesApplication;
|
|
|
|
const ALGORITHMS = ['md5' => 'MD5', 'sha256' => 'SHA-256'];
|
|
|
|
protected function generateFirstResponse(Password $password)
|
|
{
|
|
return $this->withHeaders([
|
|
'From' => 'sip:'.$password->account->identifier
|
|
])->json($this->method, $this->route);
|
|
}
|
|
|
|
protected function generateSecondResponse(Password $password, $firstResponse)
|
|
{
|
|
return $this->withHeaders([
|
|
'From' => 'sip:'.$password->account->identifier,
|
|
'Authorization' => $this->generateDigest($password, $firstResponse),
|
|
]);
|
|
}
|
|
|
|
protected function generateDigest(Password $password, $response, $hash = 'md5', $nc = '00000001')
|
|
{
|
|
$challenge = \substr($response->headers->get('www-authenticate'), 7);
|
|
$extractedChallenge = $this->extractAuthenticateHeader($challenge);
|
|
|
|
$cnonce = Utils::generateNonce();
|
|
|
|
$A1 = $password->password;
|
|
$A2 = hash($hash, $this->method . ':' . $this->route);
|
|
$response = hash($hash,
|
|
sprintf(
|
|
'%s:%s:%s:%s:%s:%s',
|
|
$A1,
|
|
$extractedChallenge['nonce'],
|
|
$nc,
|
|
$cnonce,
|
|
$extractedChallenge['qop'],
|
|
$A2
|
|
)
|
|
);
|
|
|
|
$digest = \sprintf(
|
|
'username="%s",realm="%s",nonce="%s",nc=%s,cnonce="%s",uri="%s",qop=%s,response="%s",opaque="%s",algorithm=%s',
|
|
$password->account->identifier,
|
|
$extractedChallenge['realm'],
|
|
$extractedChallenge['nonce'],
|
|
$nc,
|
|
$cnonce,
|
|
$this->route,
|
|
$extractedChallenge['qop'],
|
|
$response,
|
|
$extractedChallenge['opaque'],
|
|
self::ALGORITHMS[$hash],
|
|
);
|
|
|
|
return 'Digest ' . $digest;
|
|
}
|
|
|
|
protected function extractAuthenticateHeader(string $string): array
|
|
{
|
|
preg_match_all(
|
|
'@(realm|nonce|qop|opaque|algorithm)=[\'"]?([^\'",]+)@',
|
|
$string,
|
|
$array
|
|
);
|
|
|
|
return array_combine($array[1], $array[2]);
|
|
}
|
|
}
|