├── .styleci.yml ├── scripts ├── php-cs-fixer │ └── php-cs-fixer ├── install.sh └── post-install.sh ├── README.md ├── src ├── EncryptorInterface.php ├── PasswordGeneratorInterface.php ├── Encryptor.php ├── OtpRoutes.php ├── PasswordGenerators │ ├── StringPasswordGenerator.php │ ├── NumericNo0PasswordGenerator.php │ └── NumericPasswordGenerator.php ├── PasswordGeneratorManagerInterface.php ├── TemporaryAccessFacade.php ├── TokenNotification.php ├── Http │ ├── Middleware │ │ └── OtpAccess.php │ └── Controllers │ │ └── OtpController.php ├── PasswordGeneratorManager.php ├── TokenInterface.php ├── TemporaryAccessServiceProvider.php ├── TemporaryAccessService.php └── Token.php ├── .editorconfig ├── contrib ├── commit-msg ├── pre-commit └── commit-template ├── config └── temporary_access.php ├── database └── migrations │ └── 2016_12_30_000001_create_temporary_access_tokens_table.php ├── LICENSE.md ├── composer.json ├── CHANGELOG.md ├── views └── otp │ └── create.blade.php ├── CONTRIBUTING.md ├── .php_cs └── package.xml /.styleci.yml: -------------------------------------------------------------------------------- 1 | preset: laravel 2 | -------------------------------------------------------------------------------- /scripts/php-cs-fixer/php-cs-fixer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fg/temporary-access/master/scripts/php-cs-fixer/php-cs-fixer -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Temporary Access 2 | 3 | **[Abandoned]** 4 | 5 | Moved to [erdemkeren/laravel-otp](https://github.com/erdemkeren/laravel-otp). Please use it instead. 6 | -------------------------------------------------------------------------------- /src/EncryptorInterface.php: -------------------------------------------------------------------------------- 1 | $COMMIT_FILE 12 | echo "The _issue_id_ placeholder has been replaced the one which matches the current branches' issue id: $ISSUE_ID" 13 | fi 14 | -------------------------------------------------------------------------------- /src/PasswordGeneratorInterface.php: -------------------------------------------------------------------------------- 1 | key = $key; 17 | } 18 | 19 | public function encrypt(string $plainText): string 20 | { 21 | return hash_hmac('sha256', $plainText, $this->key); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/OtpRoutes.php: -------------------------------------------------------------------------------- 1 | ['create', 'store'], 22 | 'prefix' => 'otp', 23 | ])->middleware(['web', 'auth']); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/PasswordGenerators/StringPasswordGenerator.php: -------------------------------------------------------------------------------- 1 | /dev/null 15 | 16 | if [ $? != 0 ]; 17 | then 18 | echo "Fix the error before commit." 19 | exit 1 20 | fi 21 | 22 | ./scripts/php-cs-fixer/php-cs-fixer fix -q "$line"; 23 | git add "$line"; 24 | done 25 | 26 | exit $? 27 | -------------------------------------------------------------------------------- /src/PasswordGeneratorManagerInterface.php: -------------------------------------------------------------------------------- 1 | 'string', 21 | 22 | /* 23 | * The name of the table to be used to store 24 | * the temporary access tokens. 25 | */ 26 | 27 | 'table' => 'temporary_access_tokens', 28 | 29 | /* 30 | * The expiry time of the tokens in minutes. 31 | */ 32 | 33 | 'expires' => 15, // in minutes. 34 | 35 | /* 36 | * The default notification channels of the 37 | * token notification. 38 | * 39 | * Accepts: 40 | * array 41 | * comma separated string 42 | */ 43 | 44 | 'default_channels' => 'mail', 45 | ]; 46 | -------------------------------------------------------------------------------- /src/TemporaryAccessFacade.php: -------------------------------------------------------------------------------- 1 | unsignedInteger('authenticable_id'); 21 | $table->string('cipher_text', 64); 22 | $table->timestamp('created_at')->useCurrent(); 23 | $table->timestamp('updated_at')->useCurrent(); 24 | $table->unsignedSmallInteger('expiry_time')->nullable(); 25 | 26 | $table->unique(['authenticatable_id', 'cipher_text']); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | */ 33 | public function down() 34 | { 35 | Schema::drop('temporary_access_tokens'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/PasswordGenerators/NumericNo0PasswordGenerator.php: -------------------------------------------------------------------------------- 1 | getRandomDigitWithNo0(), (string) parent::generate($length)); 28 | } 29 | 30 | /** 31 | * Generate a random digit with no zeroes. 32 | * 33 | * @return int 34 | */ 35 | private function getRandomDigitWithNo0() 36 | { 37 | try { 38 | $int = random_int(1, 9); 39 | } catch (Exception $e) { 40 | $int = rand(1, 9); 41 | } 42 | 43 | return $int; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # The MIT License (MIT) 2 | 3 | Copyright (c) Hilmi Erdem KEREN 4 | 5 | > Permission is hereby granted, free of charge, to any person obtaining a copy 6 | > of this software and associated documentation files (the "Software"), to deal 7 | > in the Software without restriction, including without limitation the rights 8 | > to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | > copies of the Software, and to permit persons to whom the Software is 10 | > furnished to do so, subject to the following conditions: 11 | > 12 | > The above copyright notice and this permission notice shall be included in 13 | > all copies or substantial portions of the Software. 14 | > 15 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | > IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | > FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | > AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | > LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | > OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | > THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /scripts/post-install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | CURRPHP=$(which php) 4 | SOURCE="${BASH_SOURCE[0]}" 5 | DIR="$( cd -P "$( dirname "$SOURCE" )/.." && pwd )" 6 | 7 | # Make sure the php-cs-fixer package is installed. Otherwise, install it. 8 | if ! [ -x ./scripts/php-cs-fixer/php-cs-fixer ] 9 | then 10 | echo "php-cs-fixer package is not detected in your scripts folder." 11 | echo "" 12 | echo "Installing php-cs-fixer package." 13 | mkdir ./scripts/php-cs-fixer 14 | echo "" 15 | wget -nv http://cs.sensiolabs.org/download/php-cs-fixer-v2.phar -O ./scripts/php-cs-fixer/php-cs-fixer 16 | echo "" 17 | echo "Set executable flag for the binary." 18 | chmod +x ./scripts/php-cs-fixer/php-cs-fixer 19 | echo "" 20 | echo "php-cs-fixer package has been successfully installed." 21 | fi 22 | 23 | # Copy the pre-commit hook to git hooks directory. 24 | # Also make sure that it is executable. 25 | cp $DIR/contrib/pre-commit $DIR/.git/hooks/pre-commit 26 | chmod +x $DIR/.git/hooks/pre-commit 27 | 28 | # Add the config template to the project. 29 | git config commit.template $DIR/contrib/commit-template 30 | 31 | # Copy the commit-msg hook to git hooks directory. 32 | # Also make sure that it is executable. 33 | cp $DIR/contrib/commit-msg $DIR/.git/hooks/commit-msg 34 | chmod +x $DIR/.git/hooks/commit-msg 35 | -------------------------------------------------------------------------------- /src/PasswordGenerators/NumericPasswordGenerator.php: -------------------------------------------------------------------------------- 1 | generateRangeForLength($length); 28 | 29 | try { 30 | $int = random_int($range[0], $range[1]); 31 | } catch (Exception $e) { 32 | $int = rand($range[0], $range[1]); 33 | } 34 | 35 | return (string) $int; 36 | } 37 | 38 | /** 39 | * Generate the required range for the given length. 40 | * 41 | * @param int $length 42 | * 43 | * @return array 44 | */ 45 | protected function generateRangeForLength(int $length): array 46 | { 47 | $min = 1; 48 | $max = 9; 49 | 50 | while ($length > 1) { 51 | $min .= 0; 52 | $max .= 9; 53 | 54 | $length--; 55 | } 56 | 57 | return [ 58 | $min, $max, 59 | ]; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "erdemkeren/temporary-access", 3 | "description": "This package allows you to secure your routes with one-time passwords (otp).", 4 | "homepage": "https://github.com/erdemkeren/temporary-access", 5 | "keywords": ["temporary", "access", "grant", "otp"], 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Hilmi Erdem KEREN", 10 | "email": "erdemkeren@gmail.com" 11 | }, 12 | { 13 | "name": "Berkay Güre", 14 | "email": "bgure@hotmail.com.tr" 15 | } 16 | ], 17 | "require": { 18 | "php": ">=7.1", 19 | "illuminate/database": "^5.5|^6.0|^7.0", 20 | "illuminate/http": "^5.5|^6.0|^7.0", 21 | "illuminate/notifications": "^5.5|^6.0|^7.0", 22 | "illuminate/routing": "^5.5|^6.0|^7.0", 23 | "illuminate/support": "^5.5|^6.0|^7.0", 24 | "nesbot/carbon": " ~2.0" 25 | }, 26 | "require-dev": { 27 | "illuminate/config": "^5.5", 28 | "mockery/mockery": "~1.0", 29 | "phpunit/phpunit": "7.*" 30 | }, 31 | "autoload": { 32 | "psr-4": { 33 | "Erdemkeren\\TemporaryAccess\\": "src" 34 | } 35 | }, 36 | "autoload-dev": { 37 | "psr-4": { 38 | "Erdemkeren\\TemporaryAccess\\Test\\": "tests" 39 | } 40 | }, 41 | "scripts": { 42 | "test": "vendor/bin/phpunit" 43 | }, 44 | "config": { 45 | "sort-packages": true 46 | }, 47 | "minimum-stability": "dev", 48 | "prefer-stable": true, 49 | "extra": { 50 | "laravel": { 51 | "providers": [ 52 | "Erdemkeren\\TemporaryAccess\\TemporaryAccessServiceProvider" 53 | ], 54 | "aliases": { 55 | "TemporaryAccess": "Erdemkeren\\TemporaryAccess\\TemporaryAccessFacade" 56 | } 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /contrib/commit-template: -------------------------------------------------------------------------------- 1 | _type_: _subject_ 2 | 3 | # _body_ 4 | 5 | Resolves: _issue_id_ 6 | # See also: 7 | 8 | ######################################################################################## 9 | # A) Type: The type is contained within the title and can be one of these types: 10 | ######################################################################################## 11 | # feat: a new feature 12 | # fix: a bug fix 13 | # docs: changes to documentation 14 | # style: formatting, missing semi colons, etc; no code change 15 | # refactor: refactoring production code 16 | # test: adding tests, refactoring test; no production code change 17 | # chore: updating build tasks, package manager configs, etc; no production code change 18 | ######################################################################################## 19 | # B) Subject: Subjects should be no greater than 50 characters, 20 | # (!) Should begin with a capital letter and do not end with a period. 21 | ######################################################################################## 22 | # Describe what exactly the issue does, rather than what it did. 23 | # Example: Adds bla bla. 24 | ######################################################################################## 25 | # C) Body 26 | ######################################################################################## 27 | # Not all commits are complex enough to warrant a body, 28 | # therefore it is optional and only used when a commit requires a bit of 29 | # explanation and context. 30 | # 31 | # Use the body to explain the what and why of a commit, not the how. 32 | # 33 | # When writing a body, the blank line between the title and the body is required 34 | # and you should limit the length of each line to no more than 72 characters. 35 | ######################################################################################## 36 | # D) Footer 37 | ######################################################################################## 38 | # The footer is used to reference issue tracker IDs. 39 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to `erdemkeren/temporary-access` will be documented in this file. 4 | 5 | ## 3.0.0 - 2018-11-08 6 | 7 | - OtpController and OtpAccess middleware are introduced 8 | - Token generators are now password generators 9 | - Token creation is now being handled by Encryptor implementations 10 | - Repository pattern is not used anymore. Token persistence is a part of token itself 11 | 12 | ### v2 to v3 service method mapping: 13 | 14 | - retrieve -> retrieveByCipherText 15 | - retrieveUsingPlainText -> retrieveByPlainText 16 | - check -> check 17 | - checkUsingPlainText -> none. Token should be retrieved and then checked like `TemporaryAccess::retrieveByPlainText()->expired()` 18 | - checkAndProlong -> none. Token should be retrieved and then extended like `TemporaryAccess::retrieveByPlainText()->extend(10)` 19 | - checkUsingPlainTextAndProlong -> none. Above usages applies as well 20 | - generate -> create 21 | - update -> none. Use token methods to modify token state (`Token::extend()`, `Token::invalidate()` etc.) 22 | - makeTokenFromPlainText -> no need anymore 23 | - makeTokenFromEncryptedText -> no need anymore 24 | - retrieveByAttributes -> no need anymore. But moved to `Token::retrieveByAttributes() 25 | - delete -> will be implemented later. Not really needed since `Token::invalidate()` does the job 26 | - deleteExpired -> will be implemented later 27 | 28 | ## 2.1.0 - 2018-02-06 29 | 30 | - Adds token generator options: 31 | - String 32 | - Numeric 33 | - Numeric No 0 34 | which is configurable from config file. 35 | - Moves the token & generators and interfaces to a common directory and namespace. 36 | 37 | ## 2.0.0 - 2017-01-04 38 | 39 | - The code and token discrimination removed from the package. Plain text and encrypted text used instead. 40 | - Totally separated token is now a part of access token. 41 | - Interface names were changed after 1.0.0 but never released. This version includes new interface names. 42 | - Most of the public service method signatures were changed due to removal of 'code'. 43 | 44 | ## 1.0.0 - 2016-12-30 45 | 46 | - First release of the package. 47 | -------------------------------------------------------------------------------- /src/TokenNotification.php: -------------------------------------------------------------------------------- 1 | token = $token; 38 | } 39 | 40 | /** 41 | * Get the notification's delivery channels. 42 | * 43 | * @param mixed $notifiable 44 | * 45 | * @return array 46 | */ 47 | public function via($notifiable) 48 | { 49 | $channels = method_exists($notifiable, 'otpChannels') && ! empty($notifiable->otpChannels()) 50 | ? $notifiable->otpChannels() 51 | : config('temporary_access.default_channels'); 52 | 53 | return \is_array($channels) 54 | ? $channels 55 | : array_map('trim', explode(',', $channels)); 56 | } 57 | 58 | /** 59 | * Get the mail presentation of the notification. 60 | * 61 | * @return MailMessage 62 | */ 63 | public function toMail(): MailMessage 64 | { 65 | return (new MailMessage()) 66 | ->subject(config('app.name').' One Time Password') 67 | ->greeting('Hello!') 68 | ->line('Somebody recently requested for a one-time password in behalf of you.') 69 | ->line('You can enter the following reset code: '.$this->token->plainText()) 70 | ->line('If you didn\'t request the password, simply ignore this message.'); 71 | } 72 | 73 | /** 74 | * Get the sms presentation of the notification. 75 | * 76 | * @return string 77 | */ 78 | public function toSms(): string 79 | { 80 | return 'Somebody recently requested a one-time password.' 81 | ." You can enter the following reset code: {$this->token->plainText()}" 82 | .' If you didn\'t request the password, simply ignore this message.'; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /views/otp/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 | 9 |
10 | OTP Required 11 |
12 | 13 |
14 |
15 | @csrf 16 | 17 | 18 |
19 | 20 | 21 | 22 |
23 | 30 | 31 | @if ($errors->has('password')) 32 | 33 | {{ $errors->first('password') }} 34 | 35 | @endif 36 |
37 |
38 | 39 | 40 |
41 |
42 | 45 | 46 | Need a new password? 47 | 48 |
49 |
50 | 51 |
52 |
53 | 54 |
55 |
56 |
57 |
58 | @endsection 59 | -------------------------------------------------------------------------------- /src/Http/Middleware/OtpAccess.php: -------------------------------------------------------------------------------- 1 | user($guard)) { 31 | throw new \LogicException( 32 | 'The otp access control middleware requires user authentication via laravel guards.' 33 | ); 34 | } 35 | 36 | if (! $request->hasCookie('otp_token')) { 37 | $this->sendNewOtpToUser($user); 38 | 39 | return $this->redirectToOtpPage(); 40 | } 41 | 42 | $token = TemporaryAccess::retrieveByCipherText( 43 | $user->getAuthIdentifier(), 44 | $request->cookie('otp_token') 45 | ); 46 | 47 | if (! $token || $token->expired()) { 48 | $this->sendNewOtpToUser($user); 49 | 50 | return $this->redirectToOtpPage(); 51 | } 52 | 53 | $request->macro('otpToken', function () use ($token): TokenInterface { 54 | return $token; 55 | }); 56 | 57 | return $next($request); 58 | } 59 | 60 | /** 61 | * Get the redirect url if check do not pass. 62 | * 63 | * @return RedirectResponse 64 | */ 65 | protected function redirectToOtpPage(): RedirectResponse 66 | { 67 | session([ 68 | 'otp_requested' => true, 69 | 'otp_redirect_url' => url()->current(), 70 | ]); 71 | 72 | return redirect()->route('otp.create'); 73 | } 74 | 75 | /** 76 | * Create a new otp and notify the user. 77 | * 78 | * @param Authenticatable $user 79 | */ 80 | private function sendNewOtpToUser(Authenticatable $user): void 81 | { 82 | $token = TemporaryAccess::create($user, 6); 83 | 84 | if (! method_exists($user, 'notify')) { 85 | throw new \UnexpectedValueException( 86 | 'The otp owner should be an instance of notifiable or implement the notify method.' 87 | ); 88 | } 89 | 90 | $user->notify($token->toNotification()); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/PasswordGeneratorManager.php: -------------------------------------------------------------------------------- 1 | createGeneratorFromString($generator); 32 | } 33 | 34 | if (! \is_callable($generator) && ! $generator instanceof PasswordGeneratorInterface) { 35 | $msg = 'The generators should either be callable or an instance of '.PasswordGeneratorInterface::class; 36 | 37 | throw new \UnexpectedValueException($msg); 38 | } 39 | 40 | static::$generators[$name] = \is_callable($generator) 41 | ? $generator 42 | : function (int $length) use ($generator): string { 43 | return $generator->generate($length); 44 | }; 45 | } 46 | 47 | /** 48 | * Get the previously registered generator by the given name. 49 | * 50 | * @param null|string $generatorName 51 | * 52 | * @return callable 53 | */ 54 | public function get(?string $generatorName = null): callable 55 | { 56 | if (! \in_array($generatorName, array_keys(static::$generators), true)) { 57 | throw new \UnexpectedValueException( 58 | 'The '.$generatorName.' password generator is not registered.' 59 | ); 60 | } 61 | 62 | return static::$generators[$generatorName]; 63 | } 64 | 65 | /** 66 | * Create a new password generator instance using the given 67 | * fully qualified password generator class name. 68 | * 69 | * @param string $className 70 | * 71 | * @return PasswordGeneratorInterface 72 | */ 73 | private function createGeneratorFromString(string $className): PasswordGeneratorInterface 74 | { 75 | if (! class_exists($className)) { 76 | throw new \RuntimeException( 77 | "The generator [{$className}] could not be found." 78 | ); 79 | } 80 | 81 | $generatorReflection = new \ReflectionClass($className); 82 | if (! $generatorReflection->isInstantiable()) { 83 | throw new \RuntimeException( 84 | "The generator [{$className}] is not instantiable." 85 | ); 86 | } 87 | 88 | return new $className(); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Contributions are **welcome** and will be fully **credited**. 4 | 5 | Please read and understand the contribution guide before creating an issue or pull request. 6 | 7 | ## Etiquette 8 | 9 | This project is open source, and as such, the maintainers give their free time to build and maintain the source code 10 | held within. They make the code freely available in the hope that it will be of use to other developers. It would be 11 | extremely unfair for them to suffer abuse or anger for their hard work. 12 | 13 | Please be considerate towards maintainers when raising issues or presenting pull requests. Let's show the 14 | world that developers are civilized and selfless people. 15 | 16 | It's the duty of the maintainer to ensure that all submissions to the project are of sufficient 17 | quality to benefit the project. Many developers have different skillsets, strengths, and weaknesses. Respect the maintainer's decision, and do not be upset or abusive if your submission is not used. 18 | 19 | ## Viability 20 | 21 | When requesting or submitting new features, first consider whether it might be useful to others. Open 22 | source projects are used by many developers, who may have entirely different needs to your own. Think about 23 | whether or not your feature is likely to be used by other users of the project. 24 | 25 | ## Procedure 26 | 27 | Before filing an issue: 28 | 29 | - Attempt to replicate the problem, to ensure that it wasn't a coincidental incident. 30 | - Check to make sure your feature suggestion isn't already present within the project. 31 | - Check the pull requests tab to ensure that the bug doesn't have a fix in progress. 32 | - Check the pull requests tab to ensure that the feature isn't already in progress. 33 | 34 | Before submitting a pull request: 35 | 36 | - Check the codebase to ensure that your feature doesn't already exist. 37 | - Check the pull requests to ensure that another person hasn't already submitted the feature or fix. 38 | 39 | ## Requirements 40 | 41 | If the project maintainer has any additional requirements, you will find them listed here. 42 | 43 | - **[PSR-2 Coding Standard](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)** - The easiest way to apply the conventions is to install [PHP Code Sniffer](http://pear.php.net/package/PHP_CodeSniffer). 44 | 45 | - **Add tests!** - Your patch won't be accepted if it doesn't have tests. 46 | 47 | - **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. 48 | 49 | - **Consider our release cycle** - We try to follow [SemVer v2.0.0](http://semver.org/). Randomly breaking public APIs is not an option. 50 | 51 | - **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. 52 | 53 | - **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](http://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. 54 | 55 | **Happy coding**! 56 | -------------------------------------------------------------------------------- /src/TokenInterface.php: -------------------------------------------------------------------------------- 1 | publishes([$this->configPath() => config_path('temporary_access.php')]); 27 | $this->publishes([$this->migrationPath() => database_path('migrations')]); 28 | $this->publishes([$this->viewPath() => resource_path('views')]); 29 | } 30 | 31 | /** 32 | * Register the temporary access service. 33 | */ 34 | public function register(): void 35 | { 36 | $service = $this->createServiceInstance(); 37 | $this->registerDefaultPasswordGenerators($service); 38 | 39 | $this->app->singleton('temporary-access', function () use ($service) { 40 | return $service; 41 | }); 42 | 43 | /** @var Router $router */ 44 | $router = $this->app['router']; 45 | $router->aliasMiddleware('otp-access', OtpAccess::class); 46 | } 47 | 48 | /** 49 | * Get the services provided by the provider. 50 | * 51 | * @return array 52 | */ 53 | public function provides(): array 54 | { 55 | return [ 56 | 'temporary-access', 57 | ]; 58 | } 59 | 60 | /** 61 | * Create a new temporary access service instance. 62 | * 63 | * @return TemporaryAccessService 64 | */ 65 | private function createServiceInstance(): TemporaryAccessService 66 | { 67 | return new TemporaryAccessService( 68 | new PasswordGeneratorManager(), 69 | new Encryptor(config('app.secret')), 70 | config('temporary_access.password_generator', 'string'), 71 | 6, 72 | Token::class 73 | ); 74 | } 75 | 76 | /** 77 | * Register default password generators to the 78 | * given temporary access service instance. 79 | * 80 | * @param TemporaryAccessService $service 81 | */ 82 | private function registerDefaultPasswordGenerators($service): void 83 | { 84 | $service->addPasswordGenerator('string', Generators\StringPasswordGenerator::class); 85 | $service->addPasswordGenerator('numeric', Generators\NumericPasswordGenerator::class); 86 | $service->addPasswordGenerator('numeric-no-0', Generators\NumericNo0PasswordGenerator::class); 87 | } 88 | 89 | /** 90 | * Get the project config path. 91 | * 92 | * @return string 93 | */ 94 | private function configPath() 95 | { 96 | return __DIR__.'/../config/temporary_access.php'; 97 | } 98 | 99 | /** 100 | * Get the migration path. 101 | * 102 | * @return string 103 | */ 104 | private function migrationPath() 105 | { 106 | return __DIR__.'/../database/migrations/'; 107 | } 108 | 109 | /** 110 | * Get the view path. 111 | * 112 | * @return string 113 | */ 114 | private function viewPath() 115 | { 116 | return __DIR__.'/../views/'; 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /src/Http/Controllers/OtpController.php: -------------------------------------------------------------------------------- 1 | otpHasBeenRequested()) { 32 | return redirect('/'); 33 | } 34 | 35 | return view('otp.create'); 36 | } 37 | 38 | /** 39 | * Store the otp in cookies and redirect user 40 | * to their original path. 41 | * 42 | * @param Request $request 43 | * 44 | * @return RedirectResponse 45 | */ 46 | public function store(Request $request): RedirectResponse 47 | { 48 | if (! $this->otpHasBeenRequested()) { 49 | return redirect('/'); 50 | } 51 | 52 | $validator = $this->getOtpSubmissionRequestValidator($request); 53 | 54 | if ($validator->fails()) { 55 | return redirect()->back()->withErrors($validator); 56 | } 57 | 58 | if (! $token = $this->retrieveOtpTokenByPlainText( 59 | $request->user(), 60 | $request->input('password') 61 | )) { 62 | $validator->getMessageBag()->add( 63 | 'password', 64 | 'The password is not valid.' 65 | ); 66 | 67 | return redirect()->back()->withErrors($validator); 68 | } 69 | 70 | if ($token->expired()) { 71 | $validator->getMessageBag()->add( 72 | 'password', 73 | 'The password is expired.' 74 | ); 75 | 76 | return redirect()->back()->withErrors($validator); 77 | } 78 | 79 | session()->forget('otp_requested'); 80 | 81 | return redirect() 82 | ->to(session()->pull('otp_redirect_url')) 83 | ->withCookie( 84 | cookie()->make('otp_token', (string) $token, $token->expiryTime() / 60) 85 | ); 86 | } 87 | 88 | /** 89 | * Validate the given otp submission request. 90 | * 91 | * @param Request $request 92 | * 93 | * @return ValidatorInterface 94 | */ 95 | private function getOtpSubmissionRequestValidator(Request $request): ValidatorInterface 96 | { 97 | return ValidatorFacade::make($request->all(), [ 98 | 'password' => 'required|string', 99 | ]); 100 | } 101 | 102 | /** 103 | * Retrieve a token by the given user and password. 104 | * 105 | * @param Authenticatable $user 106 | * @param string $password 107 | * 108 | * @return mixed 109 | */ 110 | private function retrieveOtpTokenByPlainText(Authenticatable $user, string $password): ?TokenInterface 111 | { 112 | return TemporaryAccess::retrieveByPlainText($user, $password); 113 | } 114 | 115 | /** 116 | * Determine if an otp requested or not. 117 | * 118 | * @return mixed 119 | */ 120 | private function otpHasBeenRequested() 121 | { 122 | return session('otp_requested', false); 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /src/TemporaryAccessService.php: -------------------------------------------------------------------------------- 1 | manager = $manager; 77 | $this->encryptor = $encryptor; 78 | $this->passwordLength = $passwordLength; 79 | $this->defaultGenerator = $defaultGenerator; 80 | 81 | if (! class_exists($tokenClass)) { 82 | throw new \RuntimeException( 83 | "The token implementation [{$tokenClass}] could not be found." 84 | ); 85 | } 86 | 87 | $generatorReflection = new \ReflectionClass($tokenClass); 88 | if (! $generatorReflection->isInstantiable()) { 89 | throw new \RuntimeException( 90 | "The token implementation [{$tokenClass}] is not instantiable." 91 | ); 92 | } 93 | 94 | if (! is_subclass_of($tokenClass, TokenInterface::class)) { 95 | throw new \TypeError( 96 | 'The token class should be an instance of '.TokenInterface::class 97 | ); 98 | } 99 | 100 | $this->tokenClass = $tokenClass; 101 | } 102 | 103 | /** 104 | * Check the temporary access of the authenticable 105 | * with the given cipher text. 106 | * 107 | * @param mixed $authenticableId 108 | * @param string $token 109 | * 110 | * @return bool 111 | */ 112 | public function check($authenticableId, string $token): bool 113 | { 114 | $token = $this->retrieveByCipherText($authenticableId, $token); 115 | 116 | return (bool) $token && ! $token->expired(); 117 | } 118 | 119 | /** 120 | * Set the active password generator of the temporary access service. 121 | * 122 | * @param string $name 123 | */ 124 | public function setPasswordGenerator(string $name): void 125 | { 126 | $this->passwordGenerator = $this->manager->get($name); 127 | } 128 | 129 | /** 130 | * Create a new temporary access token. 131 | * 132 | * @param Authenticatable|mixed $authenticatableId 133 | * @param int $length 134 | * 135 | * @return Token 136 | */ 137 | public function create($authenticatableId, ?int $length = null): TokenInterface 138 | { 139 | $plainText = $this->getPasswordGenerator()($length ?: $this->passwordLength); 140 | $cipherText = $this->encryptor->encrypt($plainText); 141 | 142 | if ($authenticatableId instanceof Authenticatable) { 143 | $authenticatableId = $authenticatableId->getAuthIdentifier(); 144 | } 145 | 146 | return $this->tokenClass::create($authenticatableId, $cipherText, $plainText); 147 | } 148 | 149 | /** 150 | * Retrieve the token of the authenticable 151 | * by the given plain text. 152 | * 153 | * @param mixed $authenticableId 154 | * @param string $plainText 155 | * 156 | * @return null|TokenInterface 157 | */ 158 | public function retrieveByPlainText($authenticableId, string $plainText): ?TokenInterface 159 | { 160 | return $this->retrieveByCipherText($authenticableId, $this->encryptor->encrypt($plainText)); 161 | } 162 | 163 | /** 164 | * Retrieve the token of the authenticable 165 | * by the given cipher text. 166 | * 167 | * @param mixed $authenticableId 168 | * @param string $cipherText 169 | * 170 | * @return null|TokenInterface 171 | */ 172 | public function retrieveByCipherText($authenticableId, string $cipherText): ?TokenInterface 173 | { 174 | if ($authenticableId instanceof Authenticatable) { 175 | $authenticableId = $authenticableId->getAuthIdentifier(); 176 | } 177 | 178 | return $this->tokenClass::retrieveByAttributes([ 179 | 'authenticable_id' => $authenticableId, 180 | 'cipher_text' => $cipherText, 181 | ]); 182 | } 183 | 184 | /** 185 | * Add a new password generator implementation. 186 | * 187 | * @param string $name 188 | * @param callable|PasswordGeneratorInterface|string $generator 189 | */ 190 | public function addPasswordGenerator(string $name, $generator): void 191 | { 192 | $this->manager->register($name, $generator); 193 | } 194 | 195 | /** 196 | * Get the active password generator. 197 | * 198 | * @return callable 199 | */ 200 | private function getPasswordGenerator(): callable 201 | { 202 | return $this->passwordGenerator ?: $this->passwordGenerator = $this->manager->get($this->defaultGenerator); 203 | } 204 | } 205 | -------------------------------------------------------------------------------- /.php_cs: -------------------------------------------------------------------------------- 1 | setRiskyAllowed(true) 14 | ->setRules([ 15 | // Migration and Presets 16 | '@PHP56Migration' => true, 17 | '@PHPUnit60Migration:risky' => true, 18 | '@Symfony' => true, 19 | '@Symfony:risky' => true, 20 | 21 | // Laravel 22 | 'phpdoc_align' => true, 23 | 'binary_operator_spaces' => [ 24 | 'align_double_arrow' => true, 25 | 'align_equals' => false, 26 | ], 27 | 'blank_line_after_namespace' => true, 28 | 'blank_line_after_opening_tag' => true, 29 | 'blank_line_before_return' => true, 30 | 'braces' => true, 31 | 'cast_spaces' => [ 32 | 'space' => 'single', 33 | ], 34 | 'class_definition' => [ 35 | 'single_line' => true, 36 | ], 37 | 'concat_space' => [ 38 | 'spacing' => 'none', 39 | ], 40 | 'declare_equal_normalize' => true, 41 | 'elseif' => true, 42 | 'encoding' => true, 43 | 'full_opening_tag' => true, 44 | 'function_declaration' => true, 45 | 'function_typehint_space' => true, 46 | 'hash_to_slash_comment' => true, 47 | 'heredoc_to_nowdoc' => true, 48 | 'include' => true, 49 | 'indentation_type' => true, 50 | 'ordered_imports' => [ 51 | 'sortAlgorithm' => 'length', 52 | ], 53 | 'lowercase_cast' => true, 54 | 'lowercase_constants' => true, 55 | 'lowercase_keywords' => true, 56 | 'magic_constant_casing' => true, 57 | 'method_argument_space' => true, 58 | 'class_attributes_separation' => [ 59 | 'elements' => ['method', 'property'], 60 | ], 61 | 'visibility_required' => true, 62 | 'native_function_casing' => true, 63 | 'no_alias_functions' => true, 64 | 'no_blank_lines_after_class_opening' => true, 65 | 'no_blank_lines_after_phpdoc' => true, 66 | 'no_closing_tag' => true, 67 | 'no_empty_phpdoc' => true, 68 | 'no_empty_statement' => true, 69 | 'no_extra_consecutive_blank_lines' => true, 70 | 'no_leading_import_slash' => true, 71 | 'no_leading_namespace_whitespace' => true, 72 | 'no_multiline_whitespace_around_double_arrow' => true, 73 | 'no_multiline_whitespace_before_semicolons' => true, 74 | 'no_short_bool_cast' => true, 75 | 'no_singleline_whitespace_before_semicolons' => true, 76 | 'no_spaces_after_function_name' => true, 77 | 'no_spaces_around_offset' => [ 78 | 'positions' => ['inside', 'outside'], 79 | ], 80 | 'no_spaces_inside_parenthesis' => true, 81 | 'no_trailing_comma_in_list_call' => true, 82 | 'no_trailing_comma_in_singleline_array' => true, 83 | 'no_trailing_whitespace' => true, 84 | 'no_trailing_whitespace_in_comment' => true, 85 | 'no_unneeded_control_parentheses' => true, 86 | 'no_unused_imports' => true, 87 | 'no_useless_return' => true, 88 | 'no_whitespace_before_comma_in_array' => true, 89 | 'no_whitespace_in_blank_line' => true, 90 | 'normalize_index_brace' => true, 91 | 'object_operator_without_whitespace' => true, 92 | 'phpdoc_indent' => true, 93 | 'phpdoc_inline_tag' => true, 94 | 'phpdoc_no_access' => true, 95 | 'phpdoc_no_package' => true, 96 | 'phpdoc_no_useless_inheritdoc' => true, 97 | 'phpdoc_scalar' => true, 98 | 'phpdoc_single_line_var_spacing' => true, 99 | 'phpdoc_summary' => true, 100 | 'phpdoc_to_comment' => true, 101 | 'phpdoc_trim' => true, 102 | 'phpdoc_no_alias_tag' => [ 103 | 'replacements' => [ 104 | 'property-read' => 'property', 105 | 'property-write' => 'property', 106 | 'type' => 'var', 107 | 'link' => 'see', 108 | ] 109 | ], 110 | 'phpdoc_types' => true, 111 | 'phpdoc_var_without_name' => true, 112 | 'no_mixed_echo_print' => true, 113 | 'psr4' => true, // risky! 114 | 'self_accessor' => true, 115 | 'array_syntax' => ['syntax' => 'short'], 116 | 'short_scalar_cast' => true, 117 | 'simplified_null_return' => true, 118 | 'single_blank_line_at_eof' => true, 119 | 'single_blank_line_before_namespace' => true, 120 | 'single_class_element_per_statement' => true, 121 | 'single_import_per_statement' => true, 122 | 'single_line_after_imports' => true, 123 | 'single_quote' => true, 124 | 'space_after_semicolon' => true, 125 | 'standardize_not_equals' => true, 126 | 'switch_case_semicolon_to_colon' => true, 127 | 'switch_case_space' => true, 128 | 'ternary_operator_spaces' => true, 129 | 'trailing_comma_in_multiline_array' => true, 130 | 'no_trailing_comma_in_singleline_array' => true, 131 | 'trim_array_spaces' => true, 132 | 'unary_operator_spaces' => false, 133 | 'line_ending' => true, 134 | 'whitespace_after_comma_in_array' => true, 135 | 136 | // Customization 137 | 'align_multiline_comment' => [ 138 | 'comment_type' => 'phpdocs_like' 139 | ], 140 | 'combine_consecutive_issets' => true, 141 | 'combine_consecutive_unsets' => true, 142 | 'compact_nullable_typehint' => true, 143 | 'escape_implicit_backslashes' => true, 144 | 'explicit_indirect_variable' => true, 145 | 'explicit_string_variable' => true, 146 | 147 | 'final_internal_class' => true, 148 | 'list_syntax' => ['syntax' => 'long'], 149 | 'method_chaining_indentation' => true, 150 | 'no_extra_blank_lines' => [ 151 | 'tokens' => [ 152 | 'break', 'continue', 'extra', 'return', 'throw', 'use', 'use_trait', 153 | 'parenthesis_brace_block', 'square_brace_block', 'curly_brace_block' 154 | ] 155 | ], 156 | 'no_null_property_initialization' => true, 157 | 'no_short_echo_tag' => true, 158 | 'no_superfluous_elseif' => true, 159 | 'no_unneeded_curly_braces' => true, 160 | 'no_unneeded_final_method' => true, 161 | 'no_unreachable_default_argument_value' => true, 162 | 'no_useless_else' => true, 163 | 'no_useless_return' => true, 164 | 'ordered_class_elements' => true, 165 | 'php_unit_strict' => true, 166 | 'php_unit_test_annotation' => true, 167 | 'php_unit_test_class_requires_covers' => true, 168 | 'phpdoc_add_missing_param_annotation' => true, 169 | 'phpdoc_order' => true, 170 | 'phpdoc_types_order' => true, 171 | 'semicolon_after_instruction' => true, 172 | 'strict_comparison' => true, 173 | 'strict_param' => true, 174 | 'yoda_style' => true, 175 | 176 | // Customization 177 | 'header_comment' => ['header' => $header], 178 | ]) 179 | ->setFinder( 180 | PhpCsFixer\Finder::create() 181 | ->exclude($excludedFolders) 182 | ->notName('server.php') 183 | ->in(__DIR__) 184 | ) 185 | ; 186 | 187 | try { 188 | PhpCsFixer\FixerFactory::create() 189 | ->registerBuiltInFixers() 190 | ->registerCustomFixers($config->getCustomFixers()) 191 | ->useRuleSet(new PhpCsFixer\RuleSet($config->getRules())); 192 | } catch (PhpCsFixer\ConfigurationException\InvalidConfigurationException $e) { 193 | $config->setRules([]); 194 | } catch (UnexpectedValueException $e) { 195 | $config->setRules([]); 196 | } catch (InvalidArgumentException $e) { 197 | $config->setRules([]); 198 | } 199 | 200 | return $config; 201 | -------------------------------------------------------------------------------- /src/Token.php: -------------------------------------------------------------------------------- 1 | null, 26 | 'plain_text' => null, 27 | 'expiry_time' => null, 28 | 'cipher_text' => null, 29 | 'created_at' => null, 30 | 'updated_at' => null, 31 | ]; 32 | 33 | /** 34 | * Token constructor. 35 | * 36 | * @param int|mixed|string $authenticableId 37 | * @param string $cipherText 38 | * @param null|string $plainText 39 | * @param null|int $expiryTime 40 | * @param null|Carbon $createdAt 41 | * @param null|Carbon $updatedAt 42 | */ 43 | public function __construct( 44 | $authenticableId, 45 | string $cipherText, 46 | ?string $plainText = null, 47 | ?int $expiryTime = null, 48 | ?Carbon $createdAt = null, 49 | ?Carbon $updatedAt = null 50 | ) { 51 | $now = $this->getNow(); 52 | 53 | if (null === $authenticableId) { 54 | throw new \LogicException( 55 | 'The unique identifier of token owner shall not be null.' 56 | ); 57 | } 58 | 59 | $this->attributes['authenticable_id'] = $authenticableId; 60 | $this->attributes['plain_text'] = $plainText; 61 | $this->attributes['cipher_text'] = $cipherText; 62 | $this->attributes['created_at'] = $createdAt ?: $now; 63 | $this->attributes['updated_at'] = $updatedAt ?: $now; 64 | $this->attributes['expiry_time'] = null === $expiryTime ? $this->getDefaultExpiryTime() : $expiryTime; 65 | } 66 | 67 | /** 68 | * Convert the token to string. 69 | * 70 | * @return string 71 | */ 72 | public function __toString(): string 73 | { 74 | return $this->cipherText(); 75 | } 76 | 77 | /** 78 | * Get the unique identifier of the authenticable 79 | * who owns the token. 80 | * 81 | * @return mixed 82 | */ 83 | public function authenticableId() 84 | { 85 | return $this->attributes['authenticable_id']; 86 | } 87 | 88 | /** 89 | * Get the token as cipher text. 90 | * 91 | * @return string 92 | */ 93 | public function cipherText(): string 94 | { 95 | return $this->attributes['cipher_text']; 96 | } 97 | 98 | /** 99 | * Get the token as plain text. 100 | * 101 | * @return null|string 102 | */ 103 | public function plainText(): ?string 104 | { 105 | return $this->attributes['plain_text']; 106 | } 107 | 108 | /** 109 | * Get the date token created. 110 | * 111 | * @return Carbon 112 | */ 113 | public function createdAt(): Carbon 114 | { 115 | return clone $this->attributes['created_at']; 116 | } 117 | 118 | /** 119 | * Get the last update date of the token. 120 | * 121 | * @return Carbon 122 | */ 123 | public function updatedAt(): Carbon 124 | { 125 | return clone $this->attributes['updated_at']; 126 | } 127 | 128 | /** 129 | * Get the expiry time of the token in seconds. 130 | * 131 | * @return int 132 | */ 133 | public function expiryTime(): int 134 | { 135 | return $this->attributes['expiry_time']; 136 | } 137 | 138 | /** 139 | * Get the date time the token will expire. 140 | * 141 | * @return Carbon 142 | */ 143 | public function expiresAt(): Carbon 144 | { 145 | return (clone $this->createdAt())->addSeconds($this->expiryTime()); 146 | } 147 | 148 | /** 149 | * Get the validity time left for the token. 150 | * 151 | * @return int 152 | */ 153 | public function timeLeft(): int 154 | { 155 | return $this->getNow()->diffInSeconds($this->expiresAt(), false); 156 | } 157 | 158 | /** 159 | * Determine if the token is expired or not. 160 | * 161 | * @return bool 162 | */ 163 | public function expired(): bool 164 | { 165 | return $this->timeLeft() <= 0; 166 | } 167 | 168 | /** 169 | * Alias for invalidate. 170 | */ 171 | public function revoke(): void 172 | { 173 | $this->invalidate(); 174 | } 175 | 176 | /** 177 | * Invalidate the token. 178 | */ 179 | public function invalidate(): void 180 | { 181 | $this->attributes['expiry_time'] = 0; 182 | 183 | $this->persist(); 184 | } 185 | 186 | /** 187 | * Extend the validity of the token. 188 | * 189 | * @param null|int $seconds 190 | * 191 | * @return bool 192 | */ 193 | public function extend(?int $seconds = null): bool 194 | { 195 | $seconds = null === $seconds ? $this->getDefaultExpiryTime() : $seconds; 196 | 197 | $this->attributes['expiry_time'] += $seconds; 198 | 199 | return $this->persist(); 200 | } 201 | 202 | /** 203 | * Refresh the token. 204 | * 205 | * @return bool 206 | */ 207 | public function refresh(): bool 208 | { 209 | return $this->extend( 210 | $this->getNow()->diffInSeconds($this->updatedAt()) 211 | ); 212 | } 213 | 214 | /** 215 | * Create a new token. 216 | * 217 | * @param $authenticableId 218 | * @param string $cipherText 219 | * @param null|string $plainText 220 | * 221 | * @return TokenInterface 222 | */ 223 | public static function create( 224 | $authenticableId, 225 | string $cipherText, 226 | ?string $plainText = null 227 | ): TokenInterface { 228 | $token = new self($authenticableId, $cipherText, $plainText); 229 | 230 | $token->persist(); 231 | 232 | return $token; 233 | } 234 | 235 | /** 236 | * Retrieve a token by the given attributes from the storage. 237 | * 238 | * @param array $attributes 239 | * 240 | * @return null|TokenInterface 241 | */ 242 | public static function retrieveByAttributes(array $attributes): ?TokenInterface 243 | { 244 | $query = DB::table(self::getTable()); 245 | 246 | foreach ($attributes as $key => $value) { 247 | $query->where($key, $value); 248 | } 249 | 250 | if (! $entity = $query->first()) { 251 | return null; 252 | } 253 | 254 | return new static( 255 | $entity->authenticable_id, 256 | $entity->cipher_text, 257 | null, 258 | $entity->expiry_time, 259 | new Carbon($entity->created_at), 260 | new Carbon($entity->updated_at) 261 | ); 262 | } 263 | 264 | /** 265 | * Convert the token to a token notification. 266 | * 267 | * @return Notification 268 | */ 269 | public function toNotification(): Notification 270 | { 271 | return new TokenNotification($this); 272 | } 273 | 274 | /** 275 | * Persist the token in the storage. 276 | * 277 | * @return bool 278 | */ 279 | protected function persist(): bool 280 | { 281 | $this->attributes['created_at'] = $this->attributes['created_at']->toDateTimeString(); 282 | $this->attributes['updated_at'] = $this->getNow()->toDateTimeString(); 283 | 284 | $attributes = $this->attributes; 285 | 286 | if (array_key_exists('plain_text', $attributes)) { 287 | unset($attributes['plain_text']); 288 | } 289 | 290 | try { 291 | DB::beginTransaction(); 292 | 293 | DB::table(self::getTable())->updateOrInsert([ 294 | 'authenticable_id' => $this->authenticableId(), 295 | 'cipher_text' => $this->cipherText(), 296 | ], $attributes); 297 | 298 | DB::commit(); 299 | } catch (\Exception $e) { 300 | DB::rollBack(); 301 | 302 | throw new \RuntimeException( 303 | 'Something went wrong while saving the access token.', 304 | 0, 305 | $e 306 | ); 307 | } 308 | 309 | return true; 310 | } 311 | 312 | /** 313 | * Get the date time at the moment. 314 | * 315 | * @return Carbon 316 | */ 317 | private function getNow(): Carbon 318 | { 319 | return Carbon::now(); 320 | } 321 | 322 | /** 323 | * Get the name of the table token will be persisted. 324 | * 325 | * @return string 326 | */ 327 | private static function getTable(): string 328 | { 329 | return config('temporary_access.table'); 330 | } 331 | 332 | /** 333 | * Get the default expiry time in seconds. 334 | * 335 | * @return int 336 | */ 337 | private function getDefaultExpiryTime(): int 338 | { 339 | return config('temporary_access.expires') * 60; 340 | } 341 | } 342 | -------------------------------------------------------------------------------- /package.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | xdebug 4 | pecl.php.net 5 | Provides functions for function traces and profiling 6 | The Xdebug extension helps you debugging your script by providing a lot of 7 | valuable debug information. The debug information that Xdebug can provide 8 | includes the following: 9 | 10 | * stack and function traces in error messages with: 11 | o full parameter display for user defined functions 12 | o function name, file name and line indications 13 | o support for member functions 14 | * memory allocation 15 | * protection for infinite recursions 16 | 17 | Xdebug also provides: 18 | 19 | * profiling information for PHP scripts 20 | * code coverage analysis 21 | * capabilities to debug your scripts interactively with a debug client 22 | 23 | Derick Rethans 24 | derick 25 | derick@xdebug.org 26 | yes 27 | 28 | 2018-01-29 29 | 30 | 31 | 2.6.0 32 | 2.6.0 33 | 34 | 35 | stable 36 | stable 37 | 38 | BSD style 39 | 40 | Mon, Jan 29, 2018 - xdebug 2.6.0 41 | 42 | = Fixed bugs: 43 | 44 | - Fixed issue #1522: Remote debugging test failures on s390 (Big Endian). 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 7.0.0 139 | 140 | 141 | 1.9.1 142 | 143 | 144 | 145 | xdebug 146 | 147 | 148 | 149 | 2018-01-23 150 | 151 | 152 | 2.6.0RC2 153 | 2.6.0RC2 154 | 155 | 156 | beta 157 | beta 158 | 159 | BSD style 160 | 161 | Tue, Jan 23, 2018 - xdebug 2.6.0RC2 162 | 163 | = Fixed bugs: 164 | 165 | - Fixed issue #1521: xdebug_gc_stats.* missing from 2.6.0RC1 tarball 166 | 167 | 168 | 169 | 2018-01-22 170 | 171 | 172 | 2.6.0RC1 173 | 2.6.0RC1 174 | 175 | 176 | beta 177 | beta 178 | 179 | BSD style 180 | 181 | Mon, Jan 22, 2018 - xdebug 2.6.0RC1 182 | 183 | + Added features: 184 | 185 | - Fixed issue #1506: Add garbage collection statistics feature (Benjamin Eberlei). 186 | - Fixed issue #1507: Add functions to access Zend Engine garbage collection metrics (Benjamin Eberlei). 187 | 188 | + Improvements: 189 | 190 | - Fixed issue #1510: Change switch/case "break intentionally missing" comments to use GCC 7's new "fallthrough" attribute. 191 | - Fixed issue #1511: Detect and use compiler flags through new configure option. 192 | 193 | = Fixed bugs: 194 | 195 | - Fixed issue #1335: Debugging with PhpStorm sometimes gives "can not get property". 196 | - Fixed issue #1454: Invalid memory read or segfaults from a __call() method. 197 | - Fixed issue #1508: Code coverage filter not checked in xdebug_common_assign_dim handler. 198 | - Fixed issue #1509: Code coverage missing for case inside switch with PHP 7.2. 199 | - Fixed issue #1512: Xdebug does not properly encode and escape properties with quotes and \0 characters. 200 | - Fixed issue #1514: Variable names with a NULL char are cut off at NULL char. 201 | - Fixed issue #1515: Object property names with a NULL char are cut off at NULL char. 202 | - Fixed issue #1516: Can't fetch variables or object properties which have \0 characters in them. 203 | - Fixed issue #1517: Notifications incorrectly specify the error type in "type_string" instead of "type". 204 | 205 | 206 | 207 | 2017-12-28 208 | 209 | 210 | 2.6.0beta1 211 | 2.6.0beta1 212 | 213 | 214 | beta 215 | beta 216 | 217 | BSD style 218 | 219 | Thu, Dec 28, 2017 - xdebug 2.6.0beta1 220 | 221 | + Added features: 222 | 223 | - Fixed issue #1059: Add filter capabilities to tracing, stack traces, and code coverage. 224 | - Fixed issue #1437: Add X-Profile-File-Name header when a profile file has been generated. 225 | 226 | + Improvements: 227 | 228 | - Fixed issue #1493: Run test suite in AppVeyor for Windows CI. 229 | - Fixed issue #1498: Use new ZEND_EXTENSION API in config.w32 build scripts. (Kalle) 230 | 231 | = Fixed bugs: 232 | 233 | - Fixed issue #702: Check whether variables tracing also works with =&. 234 | - Fixed issue #1501: Xdebug var dump tries casting properties. 235 | - Fixed issue #1502: SEND_REF lines are not marked as covered. 236 | 237 | 238 | 239 | 2017-12-02 240 | 241 | 242 | 2.6.0alpha1 243 | 2.6.0alpha1 244 | 245 | 246 | beta 247 | beta 248 | 249 | BSD style 250 | 251 | Sat, Dec 2, 2017 - xdebug 2.6.0alpha1 252 | 253 | + Added features: 254 | 255 | - Implemented issue #474: Added "memory" output to profiling files, to find out where memory is allocated. 256 | - Implemented issue #575: Dump super globals contents to error log upon errors, just like when this would happen for stack traces. 257 | - Implemented issue #964: Parse X-Forwarded-For for the first IP address when selecting the remote_connect_back host (Steve Easley). 258 | - Implemented issue #990: Add DBGp: notifications for notices and warnings to be shown in IDEs. 259 | - Implemented issue #1312: Implement extended_properties feature to remote debugging to support names and values with low ASCII values. 260 | - Implemented issue #1323: Added xdebug.filename_format setting to configure the formatting of filenames when tracing. 261 | - Implemented issue #1379: Added support for Unix domain sockets to xdebug.remote_host (Sara Golemon). 262 | - Implemented issue #1380: Added xdebug_is_debugger_active() that returns true when debugger is connected. 263 | - Implemented issue #1391: Added support for earlier stack frames through new argument for xdebug_call_* functions. 264 | - Implemented issue #1420: Handle PHP 7.2's new methods for switch/case 265 | - Implemented issue #1470: Added xdebug.remote_timeout to make connect timeout configurable. 266 | - Implemented issue #1495: Make var_dump() also use the new xdebug.filename_format when formatting filenames. 267 | 268 | + Improvements: 269 | 270 | - Implemented issue #847: Added support for "%s" specifier for xdebug.trace_output_name. 271 | - Implemented issue #1384: Compile warning on Ubuntu 16.04 with GCC 5.4.x. 272 | - Implemented issue #1401: Improved error message in case the connection breaks. 273 | - Implemented issue #1430: Change DBGp tests to use TEST_PHP_EXECUTABLE instead of hard coded 'php' 274 | - Implemented issue #1484: Use FD_CLOEXEC with debugging sockets to prevent FDs from leaking to forked processes (Chris Wright). 275 | - Improve the foldexpr in xt.vim to fold lines correctly (Donie Leigh). 276 | 277 | = Fixed bugs: 278 | 279 | - Fixed issue #1272: property_get doesn't return @attributes for SimpleXMLElement. 280 | - Fixed issue #1305: Property names with quotes can not be fetch while debugging. 281 | - Fixed issue #1431: Fix "use after free" with in add_name_attribute_or_element. 282 | - Fixed issue #1432: Fixed memory leak with xdebug_path_info_dtor. 283 | - Fixed issue #1449: Debugging breaks with array element keys containing low-ASCII variables. 284 | - Fixed issue #1471: Tracing crashes with return_assignments and ternairy operator. 285 | - Fixed issue #1474: Crashes due to variable resolving/reading mechanism not taking care of temporary hash tables correctly (Nikita Popov, Derick). 286 | - Fixed issue #1481: Fixed s390x and ppc64 builds (Remi Collet). 287 | - Fixed issue #1486: Crash on ZEND_SWITCH_LONG / ZEND_SWITCH_STRING with more than 32 cases. 288 | - Fixed issue #1496: Rewrite README.rst to be more clear on how to install and build Xdebug. 289 | 290 | ~ Changes: 291 | 292 | - Fixed issue #1411: Use Error (Throwable) instead of fatal error when maximum nesting level is reached. 293 | 294 | - Removed features: 295 | 296 | - Implemented issue #1377: Drop support for PHP 5.5 and 5.6, only PHP 7 is now supported 297 | 298 | 299 | 300 | 2017-06-21 301 | 302 | 303 | 2.5.5 304 | 2.5.5 305 | 306 | 307 | stable 308 | stable 309 | 310 | BSD style 311 | 312 | = Fixed bugs: 313 | 314 | - Fixed issue #1439: TYPE_CHECK needs overloading due to smart branches 315 | - Fixed issue #1444: Code Coverage misses a variable in a multi-line function 316 | call 317 | - Fixed issue #1446: Code Coverage misses elseif if it uses an isset with a 318 | property 319 | 320 | 321 | 322 | 2017-05-15 323 | 324 | 325 | 2.5.4 326 | 2.5.4 327 | 328 | 329 | stable 330 | stable 331 | 332 | BSD style 333 | 334 | Mon, May 15, 2017 - xdebug 2.5.4 335 | 336 | = Fixed bugs: 337 | 338 | - Fixed issue #799: Function traces report base class instead of object name 339 | - Fixed issue #1421: Fix set_time_limit hanging on PHP 5.6 when pcntl_exec 340 | does not exist (Frode E. Moe) 341 | - Fixed issue #1429: Code coverage does not cover null coalesce 342 | - Fixed issue #1434: Code coverage segfaults on 32-bit arch 343 | 344 | 345 | 346 | 2017-04-18 347 | 348 | 349 | 2.5.3 350 | 2.5.3 351 | 352 | 353 | stable 354 | stable 355 | 356 | BSD style 357 | 358 | Mon, Apr 18, 2017 - xdebug 2.5.3 359 | 360 | = Fixed bugs: 361 | 362 | - Fixed issue #1421: Xdebug crashes when it is loaded without pcntl being 363 | present 364 | 365 | 366 | 367 | 2017-04-17 368 | 369 | 370 | 2.5.2 371 | 2.5.2 372 | 373 | 374 | stable 375 | stable 376 | 377 | BSD style 378 | 379 | Mon, Apr 17, 2017 - xdebug 2.5.2 380 | 381 | = Fixed bugs: 382 | 383 | - Fixed issue #701: Functions as array indexes show ??? in trace 384 | - Fixed issue #1403: Code coverage does not cover BIND_STATIC 385 | - Fixed issue #1404: Execution time is calculated incorrectly 386 | - Fixed issue #1413: Code coverage mishap with PHP 7.1.3 387 | - Fixed issue #1414: Missing variable assignment in traces with OPcache 388 | loaded 389 | - Fixed issue #1415: Crash with multiple catch constructs with OPcache loaded 390 | - Fixed issue #1416: Trace files should not include the first result of a 391 | generator if it hasn't started yet 392 | - Fixed issue #1417: Fetching properties of static class contexts fails due 393 | to incorrect fetch mode 394 | - Fixed issue #1419: Summary not written when script ended with 395 | "pcntl_exec()" 396 | 397 | 398 | 399 | 2017-04-17 400 | 401 | 402 | 2.5.2 403 | 2.5.2 404 | 405 | 406 | stable 407 | stable 408 | 409 | BSD style 410 | 411 | Sun, Feb 26, 2017 - xdebug 2.5.1 412 | 413 | = Fixed bugs: 414 | 415 | - Fixed issue #1057: Add xdebug.ini of all settings to package 416 | - Fixed issue #1165: DBGp: step_out skips subsequent function calls 417 | - Fixed issue #1180: Code coverage crashes with non-standard start/stops 418 | - Fixed issue #1278: Xdebug with PHP 7 does not handle prefill-from-oparray 419 | for XDEBUG_CC_UNUSED 420 | - Fixed issue #1300: Xdebug functions are not exposing their signature to 421 | Reflection 422 | - Fixed issue #1313: Arguments to __call() trampoline picked from the wrong 423 | memory location 424 | - Fixed issue #1329: While printing out a stack with and function parameters, 425 | XDebug reads uninitialized zvals or free()d memory 426 | - Fixed issue #1381: Code Coverage misses line due to missing FETCH_DIM_W 427 | overload 428 | - Fixed issue #1385: can not fetch IS_INDIRECT properties 429 | - Fixed issue #1386: Executable code not shown as executed/executable 430 | - Fixed issue #1392: Unable to compile on FreeBSD due to missing struct 431 | definition 432 | - Fixed issue #1394: Code coverage does not cover instanceof (in elseif) 433 | 434 | 435 | 436 | 2016-12-04 437 | 438 | 439 | 2.5.0 440 | 2.5.0 441 | 442 | 443 | stable 444 | stable 445 | 446 | BSD style 447 | 448 | Sun, Dec 4, 2016 - xdebug 2.5.0 449 | 450 | + Added features: 451 | 452 | - Implemented issue #1232: add memory delta to HTML traces 453 | - Implemented issue #1365: Allow remote_connect_back to be set through 454 | XDEBUG_CONFIG 455 | 456 | = Fixed bugs: 457 | 458 | - Fixed issue #1168: Added defensive check to prevent infinite loop 459 | - Fixed issue #1242: Xdebug on Windows with Eclipse has issues with 460 | breakpoint IDs 461 | - Fixed issue #1343: Wrong values of numerical keys outside 32bit range 462 | - Fixed issue #1357: Function signature using variadics is reported as being 463 | not executed 464 | - Fixed issue #1361: Remote debugging connection issues with Windows (Anatol 465 | Belski) 466 | - Fixed issue #1373: Crash in zend_hash_apply_with_arguments when debugging, 467 | due to unset symbol table 468 | 469 | 470 | 471 | 2016-11-12 472 | 473 | 474 | 2.5.0RC1 475 | 2.5.0RC1 476 | 477 | 478 | stable 479 | stable 480 | 481 | BSD style 482 | 483 | Sat, Nov 12, 2016 - xdebug 2.5.0RC1 484 | 485 | + Added features: 486 | 487 | - Implemented issue #998: Added support for IPv6 (Thomas Vanhaniemi) 488 | - Implemented issue #1297: Initial PHP 7.1 support 489 | 490 | = Fixed bugs: 491 | 492 | - Fixed issue #1295: Apache crashes (SIGSEGV) when trying to establish 493 | connection when sockfd is large 494 | - Fixed issue #1303: POLLRDHUP is not supported outside of Gnu/Linux 495 | - Fixed issue #1331: Segfault in code coverage 496 | 497 | - Removed features: 498 | 499 | - Support for PHP versions lower than PHP 5.5 has been dropped 500 | 501 | 502 | 503 | 2016-08-02 504 | 505 | 506 | 2.4.1 507 | 2.4.1 508 | 509 | 510 | stable 511 | stable 512 | 513 | BSD style 514 | 515 | Tue, Aug 02, 2016 - xdebug 2.4.1 516 | 517 | = Fixed bugs: 518 | 519 | - Fixed issue #1106: A thrown Exception after a class with __debugInfo gives 520 | 2 errors 521 | - Fixed issue #1241: FAST_CALL/FAST_RET take #2 522 | - Fixed issue #1246: Path and branch coverage should be initialised per 523 | request, not globally 524 | - Fixed issue #1263: Code coverage segmentation fault with opcache enabled 525 | - Fixed issue #1277: Crash when using a userland function from RSHUTDOWN with 526 | profiling enabled 527 | - Fixed issue #1282: var_dump() of integers > 32 bit is broken on Windows 528 | - Fixed issue #1288: Segfault when uncaught exception message does not 529 | contain " in " 530 | - Fixed issue #1291: Debugclient installation fails on Mac OS X 531 | - Fixed issue #1326: Tracing and generators crashes with PHP 7.x 532 | - Fixed issue #1333: Profiler accesses memory structures after freeing 533 | 534 | 535 | 536 | 2016-01-25 537 | 538 | 539 | 2.4.0RC4 540 | 2.4.0RC4 541 | 542 | 543 | beta 544 | beta 545 | 546 | BSD style 547 | 548 | Mon, Jan 25, 2016 - xdebug 2.4.0RC4 549 | 550 | = Fixed bugs: 551 | 552 | - Fixed issue #1220: Segmentation fault if var_dump() output is too large. 553 | - Fixed issue #1223: Xdebug crashes on PHP 7 when doing a DBGp eval command. 554 | - Fixed issue #1229: Issues with GCC 4.8, which in -O2 move removes some 555 | required code. 556 | - Fixed issue #1235: Xdebug does not compile against PHP 7.1-dev due to 557 | ZEND_FETCH_STATIC_PROP*. 558 | - Fixed issue #1236: Can't remove breakpoints with negative IDs. 559 | - Fixed issue #1238: Xdebug crashes with SIGSEGV while enumerating references 560 | in variables. 561 | - Fixed issue #1239: Crash due to changes with the CATCH opcode's jump 562 | mechanism in 7.1 563 | - Fixed issue #1241: Xdebug doesn't handle FAST_RET and FAST_CALL opcodes for 564 | branch/dead code analysis, and path coverage. 565 | - Fixed issue #1245: xdebug_dump_superglobals dumps *uninitialized* with PHP 566 | 7. 567 | - Fixed issue #1250: Add PHP version descriptors to debugging log and profile 568 | files. 569 | 570 | 571 | 572 | 2016-03-03 573 | 574 | 575 | 2.4.0 576 | 2.4.0 577 | 578 | 579 | stable 580 | stable 581 | 582 | BSD style 583 | 584 | Thu, Mar 03, 2016 - xdebug 2.4.0 585 | 586 | = Fixed bugs: 587 | 588 | - Fixed issue #1258: Case in PHP 7.0 and code coverage 589 | - Fixed issue #1261: segmentation fault in xdebug.so with PHP 7.0 version of 590 | 'pkgtools' due to spl_autoload() 591 | - Fixed issue #1262: overload_var_dump=0 messes with xdebug_var_dump() 592 | - Fixed issue #1266: xdebug_dump_superglobals() always dumps empty stack on 593 | PHP 7 594 | - Fixed issue #1267: AIX build issues 595 | - Fixed issue #1270: String parsing marked not covered with PHP 7 596 | 597 | 598 | 599 | 2015-12-12 600 | 601 | 602 | 2.4.0RC3 603 | 2.4.0RC3 604 | 605 | 606 | beta 607 | beta 608 | 609 | BSD style 610 | 611 | Wed, Dec 12, 2015 - xdebug 2.4.0RC3 612 | 613 | = Fixed bugs: 614 | 615 | - Fixed issue #1221: Sort out Windows x64 PHP 7 support 616 | - Fixed issue #1229: Detect GCC 4.8 and disable optimisations when it is found 617 | 618 | = Others: 619 | 620 | - Made the test suite work for Windows too. Finally, after 13 years. 621 | 622 | 623 | 624 | 2015-12-02 625 | 626 | 627 | 2.4.0RC2 628 | 2.4.0RC2 629 | 630 | 631 | beta 632 | beta 633 | 634 | BSD style 635 | 636 | Wed, Dec 02, 2015 - xdebug 2.4.0RC2 637 | 638 | = Fixed bugs: 639 | 640 | - Fixed issue #1181: Remote debugging does not handle exceptions after using 641 | zend_read_property 642 | - Fixed issue #1189: Remove address attribute from remote debugging responses 643 | - Fixed issue #1194: The error message is doubly HTML-encoded with assert() 644 | - Fixed issue #1210: Segfault with code coverage dead code analysis and 645 | foreach on PHP 7 646 | - Fixed issue #1215: SIGSEGV if xdebug.trace_output_dir directory does not 647 | exist 648 | - Fixed issue #1217: xdebug.show_error_trace should not be enabled by default 649 | - Fixed issue #1218: Xdebug messes with the exception code, by casting it to 650 | int 651 | - Fixed issue #1219: Set default value for xdebug.overload_var_dump to 2 to 652 | include file / line numbers by default 653 | - Use long for PHP 5, and zend_long for PHP 7 for ini settings in the globals 654 | 655 | 656 | 657 | 2015-11-21 658 | 659 | 660 | 2.4.0RC1 661 | 2.4.0RC1 662 | 663 | 664 | beta 665 | beta 666 | 667 | BSD style 668 | 669 | Sat, Nov 21, 2015 - xdebug 2.4.0RC1 670 | 671 | = Fixed bugs: 672 | 673 | - Fixed issue #1195: Segfault with code coverage and foreach 674 | - Fixed issue #1200: Additional opcodes need to be overloaded for PHP 7 675 | - Fixed issue #1202: Anonymous classes are not handled properly while remote debugging 676 | - Fixed issue #1203: Accessing static property of a class that has no static properties crashes while remote debugging 677 | - Fixed issue #1209: Segfault with building a function name for create_function 678 | - Restored Windows support (Includes patches by Jan Ehrhardt) 679 | 680 | 681 | 682 | 2015-11-05 683 | 684 | 685 | 2.4.0beta1 686 | 2.4.0beta1 687 | 688 | 689 | beta 690 | beta 691 | 692 | BSD style 693 | 694 | Thu, Sep 05, 2015 - xdebug 2.4.0beta1 695 | 696 | + Added features: 697 | 698 | - Implemented issue #1109: Added support for PHP 7. 699 | - Implemented issue #1153: Add function monitor functionality. 700 | - Implemented issue #1183: Add xdebug.show_error_trace setting to 701 | allow/disallow to show a stack trace for every Error (throwable) 702 | 703 | = Fixed bugs: 704 | 705 | - Fixed issue #1070: Too many open files error with php-fpm: connections not 706 | closed. (Patch by Sean Dubois) 707 | - Fixed issue #1123: With Xdebug 2.3.1, PHPUnit with coverage is 708 | exponentially slower than without 709 | - Fixed issue #1166: Using $this in __debugInfo() causes infinite recursion 710 | - Fixed issue #1173: Segmentation fault in xdebug_get_monitored_functions() 711 | - Fixed issue #1182: Using PHPStorm with PHP 7 RC1 and xdebug 2.4-dev break 712 | points are passed by including setting break point at start of script 713 | - Fixed issue #1192: Dead code analysis does not work for generators with 714 | 'return;' 715 | 716 | 717 | 718 | 2015-06-19 719 | 720 | 721 | 2.3.3 722 | 2.3.3 723 | 724 | 725 | stable 726 | stable 727 | 728 | BSD style 729 | 730 | Fri, Jun 19, 2015 - xdebug 2.3.3 731 | 732 | = Fixed bugs: 733 | 734 | - Fixed issue #1130: Escaping issues with docrefs and HTML characters in 735 | error messages 736 | - Fixed issue #1133: PDO exception code value type is changed 737 | - Fixed issue #1137: Windows does not support %zu formatting for sprintf 738 | - Fixed issue #1140: Tracing with __debugInfo() crashes Xdebug due to a stack 739 | overflow 740 | - Fixed issue #1148: Can't disable max_nesting_function 741 | - Fixed issue #1151: Crash when another extension calls call_user_function() 742 | during RINIT 743 | 744 | - Fixed crash with code coverage (Antony Dovgal) 745 | - Fixed usage of virtual_file_ex and STR_FREE (Remi Collet) 746 | - Reset overloaded opcodes at the end of each request (Eran Ifrah) 747 | 748 | = Improvements: 749 | 750 | - Fixed issue #686: Not possible to inspect SplObjectStorage instances with 751 | Xdebug 752 | - Fixed issue #864: No attributes are shown if an object extends 753 | ArrayIterator 754 | - Fixed issue #996: Can't evaluate property of class that extends ArrayObject 755 | - Fixed issue #1134: Allow introspection of ArrayObject implementation's 756 | internal storage 757 | - Get rid of setlocale hack, by using %F instead of %f (and speed up tracing 758 | by 15-20%) 759 | 760 | 761 | 762 | 2015-03-22 763 | 764 | 765 | 2.3.2 766 | 2.3.2 767 | 768 | 769 | stable 770 | stable 771 | 772 | BSD style 773 | 774 | Sun, Mar 22, 2015 - xdebug 2.3.2 775 | 776 | = Fixed bugs: 777 | 778 | - Fixed issue #1117: Path/branch coverage sometimes crashes 779 | - Fixed issue #1121: Segfaults with path/branch coverage 780 | 781 | 782 | 783 | 2015-02-24 784 | 785 | 786 | 2.3.1 787 | 2.3.1 788 | 789 | 790 | stable 791 | stable 792 | 793 | BSD style 794 | 795 | Tue, Feb 24, 2015 - xdebug 2.3.1 796 | 797 | = Fixed bugs: 798 | 799 | - Fixed issue #1112: Setting an invalid xdebug.trace_format causes Xdebug to 800 | crash 801 | - Fixed issue #1113: xdebug.*_trigger do no longer work, due to NULL not 802 | being an empty string 803 | 804 | 805 | 806 | 2015-02-22 807 | 808 | 809 | 2.3.0 810 | 2.3.0 811 | 812 | 813 | stable 814 | stable 815 | 816 | BSD style 817 | 818 | Sun, Feb 22, 2015 - xdebug 2.3.0 819 | 820 | = Fixed bugs: 821 | 822 | - Fixed bug #932: Added an error message in case the remote debug log 823 | couldn't be opened 824 | - Fixed bug #982: Incorrect file paths in exception stack trace 825 | - Fixed bug #1094: Segmentation fault when attempting to use branch/path 826 | coverage 827 | - Fixed bug #1101: Debugger is not triggered on xdebug_break() in JIT mode 828 | - Fixed bug #1102: Stop Xdebug from crashing when debugging PHP Code with 829 | "php -r". 830 | - Fixed bug #1103: XDEBUG_SESSION_STOP_NO_EXEC only stops first script 831 | executed with auto_prepend|append_files 832 | - Fixed bug #1104: One character non-public properties cause issues with 833 | debugging 834 | - Fixed bug #1105: Setting properties without specifying a type only works in 835 | topmost frame (Dominik del Bondio) 836 | - Fixed bug #1095: Crash when using a non-associate array key in GLOBALS 837 | - Fixed bug #1111: eval does not work when debugger is stopped in 838 | xdebug_throw_exception_hook (Dominik del Bondio) 839 | 840 | + Added features: 841 | 842 | - General 843 | 844 | - Implemented issue #304: File name and line number info for overloaded 845 | var_dump() 846 | - Implemented issue #310: Allow class vars and array keys with 847 | xdebug_debug_zval() 848 | - Implemented issue #722: Add stack trace limit setting. 849 | - Implemented issue #1003: Add option to xdebug_print_function_stack() to 850 | suppress filename and line number 851 | - Implemented issue #1004: Ability to halt on warning/notice 852 | - Implemented issue #1023: Add support for PHP 5.6 variadics 853 | - Implemented issue #1024: Add support for PHP 5.6's ASSIGN_POW 854 | 855 | - Debugging 856 | 857 | - Implemented issue #406: Added support for remote debugging user-defined 858 | constants 859 | - Implemented issue #495: Added support for the wildcard exception name '*' 860 | - Implemented issue #1066: Better error message for SELinux preventing 861 | debugging connections 862 | - Implemented issue #1084: Added support for extended classes to trigger 863 | exception breakpoints 864 | - Implemented issue #1084: Added exception code as extra element to 865 | debugger XML 866 | 867 | - Tracing 868 | 869 | - Implemented issue #341: Added the time index and memory usage for 870 | function returns in normal tracefiles 871 | - Implemented issue #644: Shared secret for profiler_enable_trigger and 872 | trace_enable_trigger with *_value option 873 | - Implemented issue #971: Added the trace file option 874 | "XDEBUG_TRACE_NAKED_FILENAME" to xdebug_start_trace() to prevent the 875 | ".xt" extension from being added 876 | - Implemented issue #1021: Added support for return values to computerized 877 | trace files 878 | - Implemented issue #1022: Added support for serialized variables as format 879 | in trace files in the form of option "5" for "xdebug.collect_params" 880 | 881 | - Code coverage 882 | 883 | - Implemented issue #380: Added xdebug_code_coverage_started() 884 | - Implemented issue #1034: Add collected path and branch information to 885 | xdebug_get_code_coverage() output 886 | 887 | - Profiling 888 | 889 | - Implement issue #1054: Support for filename and function name compression 890 | in cachegrind files 891 | 892 | + Changes: 893 | 894 | - Implemented issue #863: Support xdebug.overload_var_dump through 895 | ini_set() 896 | - Implemented issue #973: Use case-insensitive filename comparison on all 897 | systems (Galen Wright-Watson) 898 | - Implemented issue #1015: Added the xdebug.force_display_errors and 899 | xdebug.force_error_reporting php.ini-only settings to always override 900 | PHP's settings for display_errors and error_reporting 901 | - Implemented issue #1057: Removed trailing whitespace from example 902 | xdebug.ini 903 | - Implemented issue #1096: Improve performance improvement for handling 904 | breakpoints by ignoring locales (Daniel Sloof) 905 | - Implemented issue #1100: Raise default max_nesting_level to 256 906 | 907 | - Removed features: 908 | 909 | - Support for PHP versions lower than PHP 5.4 have been dropped. 910 | 911 | 912 | 913 | 2015-01-21 914 | 915 | 916 | 2.2.7 917 | 2.2.7 918 | 919 | 920 | stable 921 | stable 922 | 923 | BSD style 924 | 925 | Thu, Jan 22, 2014 - xdebug 2.2.7 926 | 927 | = Fixed bugs: 928 | 929 | - Fixed bug #1083: Segfault when requesting a variable for a context that did 930 | not have them. 931 | - Fixed bug #1087: zend_execute_script or zend_eval_string in RINIT segfaults. 932 | - Fixed bug #1088: Xdebug won't show dead and not executed lines at the second 933 | time. 934 | - Fixed bug #1098: Xdebug doesn't make use of __debugInfo. 935 | - Fixed segfaults with ZTS on PHP 5.6. 936 | 937 | 938 | 939 | 2014-11-14 940 | 941 | 942 | 2.2.6 943 | 2.2.6 944 | 945 | 946 | stable 947 | stable 948 | 949 | BSD style 950 | 951 | Fri, Nov 14, 2014 - xdebug 2.2.6 952 | 953 | = Fixed bugs: 954 | 955 | - Fixed bug #1048: Can not get $GLOBAL variable by property_value on function 956 | context. 957 | - Fixed bug #1073 and #1075: Segmentation fault with internal functions 958 | calling internal functions. 959 | - Fixed bug #1085: Fixed the tracefile analyser as the format version had been 960 | bumbed. 961 | - Fixed memory leaks 962 | 963 | 964 | 965 | 2014-04-29 966 | 967 | 968 | 2.2.5 969 | 2.2.5 970 | 971 | 972 | stable 973 | stable 974 | 975 | BSD style 976 | 977 | Tue, Apr 29, 2014 - xdebug 2.2.5 978 | 979 | = Fixed bugs: 980 | 981 | - Fixed bug #1040: Fixed uninitialized sa value. 982 | - Fixed building on hurd-i386. 983 | 984 | 985 | 986 | 2014-02-28 987 | 988 | 989 | 2.2.4 990 | 2.2.4 991 | 992 | 993 | stable 994 | stable 995 | 996 | BSD style 997 | 998 | Fri, Feb 28, 2014 - xdebug 2.2.4 999 | 1000 | = Fixed bugs: 1001 | 1002 | - Fixed bug #785: Profiler does not handle closures and call_user_func_array well. 1003 | - Fixed bug #963: Xdebug waits too long for response from remote client 1004 | - Fixed bug #976: XDebug crashes if current varibles scope contains COM object. 1005 | - Fixed bug #978: Inspection of array with negative keys fails 1006 | - Fixed bug #979: property_value -m 0 should mean all bytes, not 0 bytes 1007 | - Fixed bug #987: Hidden property names not shown. 1008 | 1009 | 1010 | 1011 | 2013-05-22 1012 | 1013 | 1014 | 2.2.3 1015 | 2.2.3 1016 | 1017 | 1018 | stable 1019 | stable 1020 | 1021 | BSD style 1022 | 1023 | Tue, May 21, 2013 - xdebug 2.2.3 1024 | 1025 | + Added features: 1026 | 1027 | - Support for PHP 5.5. 1028 | 1029 | = Fixed bugs: 1030 | 1031 | - Fixed bug #923: Xdebug + Netbeans + ext/MongoDB crash on MongoCursor instance 1032 | - Fixed bug #929: Directory name management in xdebug.profiler_output_dir 1033 | - Fixed bug #931: xdebug_str_add does not check for NULL str before calling strlen on it 1034 | - Fixed bug #935: Document the return value from xdebug_get_code_coverage() 1035 | - Fixed bug #947: Newlines converted when html_errors = 0 1036 | 1037 | 1038 | 1039 | 2013-03-23 1040 | 1041 | 1042 | 2.2.2 1043 | 2.2.2 1044 | 1045 | 1046 | stable 1047 | stable 1048 | 1049 | BSD style 1050 | 1051 | Sat, Mar 23, 2013 - xdebug 2.2.2 1052 | 1053 | + Added features: 1054 | 1055 | - Support for PHP 5.5. 1056 | 1057 | = Fixed bugs: 1058 | 1059 | - Fixed bug #598: Use HTTP_X_FORWARDED_FOR to determine remote debugger. 1060 | - Fixed bug #625: xdebug_get_headers() -> Headers are reset unexpectedly. 1061 | - Fixed bug #811: PHP Documentation Link. 1062 | - Fixed bug #818: Require a php script in the PHP_RINIT causes Xdebug to crash. 1063 | - Fixed bug #903: xdebug_get_headers() returns replaced headers. 1064 | - Fixed bug #905: Support PHP 5.5 and generators. 1065 | - Fixed bug #920: AM_CONFIG_HEADER is depreciated. 1066 | 1067 | 1068 | 1069 | 1070 | 2.2.1 1071 | 2.2.1 1072 | 1073 | 1074 | stable 1075 | stable 1076 | 1077 | 2012-07-14 1078 | BSD style 1079 | 1080 | = Fixed bugs: 1081 | 1082 | - Fixed bug #843: Text output depends on php locale. 1083 | - Fixed bug #838/#839/#840: Debugging static properties crashes Xdebug. 1084 | - Fixed bug #821: Variable assignments (beginning with =>) should be 1085 | indented one more scope. 1086 | - Fixed bug #811: PHP Documentation Link. 1087 | - Fixed bug #800: var_dump(get_class(new foo\bar')) add an extra "\" in 1088 | class name. 1089 | 1090 | 1091 | 1092 | 1093 | 2.2.0 1094 | 2.2.0 1095 | 1096 | 1097 | stable 1098 | stable 1099 | 1100 | 2012-05-08 1101 | BSD style 1102 | 1103 | Tue, May 08, 2012 - xdebug 2.2.0 1104 | 1105 | + Added features: 1106 | 1107 | - Support for PHP 5.4. 1108 | 1109 | - Added ANSI colour output for the shell. (Including patches by Michael 1110 | Maclean) 1111 | - Added var_dump() overloading on the command line (issue #457). 1112 | 1113 | - Added better support for closures in stack and function traces. 1114 | - Added the size of arrays to the overloaded variable output, so that you 1115 | know how many elements there are. 1116 | - Added support for X-HTTP-FORWARDED-FOR before falling back to REMOTE_ADDR 1117 | (issue #660). (Patch by Hannes Magnusson) 1118 | - Added the method call type to xdebug_get_function_stack() (issue #695). 1119 | - Added extra information to error printouts to tell that the error 1120 | suppression operator has been ignored due to xdebug.scream. 1121 | - Added a error-specific CSS class to stack traces. 1122 | 1123 | + New settings: 1124 | 1125 | - xdebug.cli_color for colouring output on the command line (Unix only). 1126 | - Added xdebug.trace_enable_trigger to triger function traces through a 1127 | GET/POST/COOKIE parameter (issue #517). (Patch by Patrick Allaert) 1128 | - Added support for the 'U' format specifier for function trace and 1129 | profiler filenames. 1130 | 1131 | + Changes: 1132 | 1133 | - Improved performance by lazy-initializing data structures. 1134 | - Improved code coverage performance. (Including some patches by Taavi 1135 | Burns) 1136 | - Improved compatibility with KCacheGrind. 1137 | - Improved logging of remote debugging connections, by added connection 1138 | success/failure logging to the xdebug.remote_log functionality. 1139 | 1140 | = Fixed bugs: 1141 | 1142 | - Fixed bug #827: Enabling Xdebug causes phpt tests to fail because of 1143 | var_dump() formatting issues. 1144 | - Fixed bug #823: Single quotes are escaped in var_dumped string output. 1145 | - Fixed issue #819: Xdebug 2.2.0RC2 can't stand on a breakpoint more than 30 seconds. 1146 | - Fixed bug #801: Segfault with streamwrapper and unclosed $fp on 1147 | destruction. 1148 | - Fixed issue #797: Xdebug crashes when fetching static properties. 1149 | - Fixed bug #794: Allow coloured output on Windows. 1150 | - Fixed bug #784: Unlimited feature for var_display_max_data and 1151 | var_display_max_depth is undocumented. 1152 | - Fixed bug #774: Apache crashes on header() calls. 1153 | - Fixed bug #764: Tailored Installation instructions do not work. 1154 | - Fixed bug #758: php_value xdebug.idekey is ignored in .htaccess files 1155 | - Fixed bug #728: Profiler reports __call() invocations confusingly/wrongly. 1156 | - Fixed bug #687: Xdebug does not show dynamically defined variable. 1157 | - Fixed bug #662: idekey is set to running user. 1158 | - Fixed bug #627: Added the realpath check. 1159 | 1160 | 1161 | 1162 | 1163 | 2.2.0RC2 1164 | 2.2.0RC2 1165 | 1166 | 1167 | stable 1168 | stable 1169 | 1170 | 2012-04-22 1171 | BSD style 1172 | 1173 | Tue, Apr 22, 2012 - xdebug 2.2.0rc2 1174 | 1175 | = Fixed bugs: 1176 | 1177 | - Fixed bug #801: Segfault with streamwrapper and unclosed $fp on 1178 | destruction. 1179 | - Fixed bug #794: Allow coloured output on Windows. 1180 | - Fixed bug #784: Unlimited feature for var_display_max_data and 1181 | var_display_max_depth is undocumented. 1182 | - Fixed bug #774: Apache crashes on header() calls. 1183 | - Fixed bug #764: Tailored Installation instructions do not work. 1184 | - Fixed bug #758: php_value xdebug.idekey is ignored in .htaccess files 1185 | - Fixed bug #662: idekey is set to running user. 1186 | 1187 | 1188 | 1189 | 1190 | 2.2.0RC1 1191 | 2.2.0RC1 1192 | 1193 | 1194 | stable 1195 | stable 1196 | 1197 | 2012-03-12 1198 | BSD style 1199 | 1200 | Tue, Mar 13, 2012 - xdebug 2.2.0rc1 1201 | 1202 | + Added features: 1203 | 1204 | - Support for PHP 5.4. 1205 | 1206 | - Added ANSI colour output for the shell. (Including patches by Michael 1207 | Maclean) 1208 | - Added var_dump() overloading on the command line (issue #457). 1209 | 1210 | - Added better support for closures in stack and function traces. 1211 | - Added the size of arrays to the overloaded variable output, so that you 1212 | know how many elements there are. 1213 | - Added support for X-HTTP-FORWARDED-FOR before falling back to REMOTE_ADDR 1214 | (issue #660). (Patch by Hannes Magnusson) 1215 | - Added the method call type to xdebug_get_function_stack() (issue #695). 1216 | - Added extra information to error printouts to tell that the error 1217 | suppression operator has been ignored due to xdebug.scream. 1218 | - Added a error-specific CSS class to stack traces. 1219 | 1220 | 1221 | + New settings: 1222 | 1223 | - xdebug.cli_color for colouring output on the command line (Unix only). 1224 | - Added xdebug.trace_enable_trigger to triger function traces through a 1225 | GET/POST/COOKIE parameter (issue #517). (Patch by Patrick Allaert) 1226 | - Added support for the 'U' format specifier for function trace and 1227 | profiler filenames. 1228 | 1229 | + Changes: 1230 | 1231 | - Improved performance by lazy-initializing data structures. 1232 | - Improved code coverage performance. (Including some patches by Taavi 1233 | Burns) 1234 | - Improved compatibility with KCacheGrind. 1235 | - Improved logging of remote debugging connections, by added connection 1236 | success/failure logging to the xdebug.remote_log functionality. 1237 | 1238 | = Fixed bugs: 1239 | 1240 | - No additional bug fixes besides the ones from the 2.1 branch up til 1241 | Xdebug 2.1.4. 1242 | 1243 | 1244 | 1245 | 1246 | 2.1.4 1247 | 2.1.4 1248 | 1249 | 1250 | stable 1251 | stable 1252 | 1253 | 2012-03-12 1254 | BSD style 1255 | 1256 | = Fixed bugs: 1257 | 1258 | - Fixed bug #788: Collect errors eats fatal errors. 1259 | - Fixed bug #787: Segmentation Fault with PHP header_remove(). 1260 | - Fixed bug #778: Xdebug session in Eclipse crash whenever it run into 1261 | simplexml_load_string call. 1262 | - Fixed bug #756: Added support for ZEND_*_*_OBJ and self::*. 1263 | - Fixed bug #747: Still problem with error message and soap client / soap 1264 | server. 1265 | - Fixed bug #744: new lines in a PHP file from Windows are displayed with 1266 | an extra white line with var_dump(). 1267 | - Fixed an issue with debugging and the eval command. 1268 | - Fixed compilation with ZTS on PHP < 5.3 1269 | 1270 | 1271 | 1272 | 1273 | 2.1.3 1274 | 2.1.3 1275 | 1276 | 1277 | stable 1278 | stable 1279 | 1280 | 2012-01-25 1281 | BSD style 1282 | 1283 | = Fixed bugs: 1284 | 1285 | - Fixed bug #725: EG(current_execute_data) is not checked in xdebug.c, 1286 | xdebug_statement_call. 1287 | - Fixed bug #723: xdebug is stricter than PHP regarding Exception property 1288 | types. 1289 | - Fixed bug #714: Cachegrind files have huge (wrong) numbers in some lines. 1290 | - Fixed bug #709: Xdebug doesn't understand E_USER_DEPRECATED. 1291 | - Fixed bug #698: Allow xdebug.remote_connect_back to be set in .htaccess. 1292 | - Fixed bug #690: Function traces are not appended to file with 1293 | xdebug_start_trace() and xdebug.trace_options=1. 1294 | - Fixed bug #623: Static properties of a class can be evaluated only with 1295 | difficulty. 1296 | - Fixed bug #614/#619: Viewing private variables in base classes through 1297 | the debugger. 1298 | - Fixed bug #609: Xdebug and SOAP extension's error handlers conflict. 1299 | - Fixed bug #606/#678/#688/#689/#704: crash after using eval on an 1300 | unparsable, or un-executable statement. 1301 | - Fixed bug #305: xdebug exception handler doesn't properly handle special 1302 | chars. 1303 | 1304 | + Changes: 1305 | 1306 | - Changed xdebug_break() to hint to the statement execution trap instead of 1307 | breaking forcefully adding an extra stackframe. 1308 | - Prevent Xdebug 2.1.x to build with PHP 5.4. 1309 | 1310 | 1311 | 1312 | 1313 | 2.1.2 1314 | 2.1.2 1315 | 1316 | 1317 | stable 1318 | stable 1319 | 1320 | 2011-07-28 1321 | BSD style 1322 | 1323 | = Fixed bugs: 1324 | 1325 | - Fixed bug #622: Working with eval() code is inconvenient and difficult. 1326 | - Fixed bug #684: xdebug_var_dump - IE does not support &. 1327 | - Fixed bug #693: Cachegrind files not written when filename is very long. 1328 | - Fixed bug #697: Incorrect code coverage of function arguments when using 1329 | XDEBUG_CC_UNUSED. 1330 | - Fixed bug #699: Xdebug gets the filename wrong for the countable 1331 | interface. 1332 | - Fixed bug #703 by adding another opcode to the list that needs to be 1333 | overridden. 1334 | 1335 | 1336 | 1337 | 1338 | 2.1.2 1339 | 2.1.2 1340 | 1341 | 1342 | stable 1343 | stable 1344 | 1345 | 2011-07-28 1346 | BSD style 1347 | 1348 | = Fixed bugs: 1349 | 1350 | - Fixed bug #622: Working with eval() code is inconvenient and difficult. 1351 | - Fixed bug #684: xdebug_var_dump - IE does not support &. 1352 | - Fixed bug #693: Cachegrind files not written when filename is very long. 1353 | - Fixed bug #697: Incorrect code coverage of function arguments when using 1354 | XDEBUG_CC_UNUSED. 1355 | - Fixed bug #699: Xdebug gets the filename wrong for the countable 1356 | interface. 1357 | - Fixed bug #703 by adding another opcode to the list that needs to be 1358 | overridden. 1359 | 1360 | 1361 | 1362 | 1363 | 2.1.1 1364 | 2.1.1 1365 | 1366 | 1367 | stable 1368 | stable 1369 | 1370 | 2011-03-28 1371 | BSD style 1372 | 1373 | Mon, Mar 28, 2011 - xdebug 2.1.1 1374 | 1375 | = Fixed bugs: 1376 | 1377 | - Fixed ZTS compilation. 1378 | 1379 | 1380 | 1381 | 1382 | 2.1.1RC1 1383 | 2.1.1RC1 1384 | 1385 | 1386 | beta 1387 | beta 1388 | 1389 | 2011-03-22 1390 | BSD style 1391 | 1392 | Tue, Mar 22, 2011 - xdebug 2.1.1rc1 1393 | 1394 | = Fixed bugs: 1395 | 1396 | = Debugger 1397 | - Fixed bug #518: Removed CLASSNAME pseudo-property optional. 1398 | - Fixed bug #592: Xdebug crashes with run after detach. 1399 | - Fixed bug #596: Call breakpoint never works with instance methods, only 1400 | static methods. 1401 | - Fixed JIT mode in the debugger so that it works for xdebug_break() too. 1402 | 1403 | = Profiler 1404 | - Fixed bug #631: Summary not written when script ended with "exit()". 1405 | - Fixed bug #639: Xdebug profiling: output not correct - missing 'cfl='. 1406 | - Fixed bug #642: Fixed line numbers for offsetGet, offsetSet, 1407 | __get/__set/__isset/__unset and __call in profile files and stack 1408 | traces/function traces. 1409 | - Fixed bug #643: Profiler gets line numbers wrong. 1410 | - Fixed bug #653: XDebug profiler crashes with %H in file name and non 1411 | standard port. 1412 | 1413 | = Others 1414 | - Fixed bug #651: Incorrect code coverage after empty() in conditional. 1415 | - Fixed bug #654: Xdebug hides error message in CLI. 1416 | - Fixed bug #665: Xdebug does not respect display_errors=stderr. 1417 | Patch by Ben Spencer <dangerous.ben@gmail.com> 1418 | - Fixed bug #670: Xdebug crashes with broken "break x" code. 1419 | 1420 | 1421 | 1422 | 1423 | 2.1.0 1424 | 2.1.0 1425 | 1426 | 1427 | stable 1428 | stable 1429 | 1430 | 2010-06-29 1431 | BSD style 1432 | 1433 | Tue, Jun 29, 2010 - xdebug 2.1.0 1434 | 1435 | = Fixed bugs: 1436 | - Fixed bug #562: Incorrect coverage information for closure function 1437 | headers. 1438 | - Fixed bug #566: Xdebug crashes when using conditional breakpoints. 1439 | - Fixed bug #567: xdebug_debug_zval and xdebug_debug_zval_stdout don't work 1440 | with PHP 5.3. (Patch by Endo Hiroaki). 1441 | - Fixed bug #570: undefined symbol: zend_memrchr. 1442 | 1443 | 1444 | 1445 | 1446 | 2.1.0RC1 1447 | 2.1.0RC1 1448 | 1449 | 1450 | beta 1451 | beta 1452 | 1453 | 2010-02-27 1454 | BSD style 1455 | 1456 | Thu, Apr 06, 2010 - xdebug 2.1.0rc1 1457 | 1458 | = Fixed bugs: 1459 | - Fixed bug #494: Private attributes of parent class unavailable when 1460 | inheriting. 1461 | - Fixed bug #400: Xdebug shows errors, even when PHP is request startup 1462 | mode. 1463 | - Fixed bug #421: xdebug sends back invalid characters in xml sometimes. 1464 | - Fixed bug #475: Property names with null chars are not sent fully to the 1465 | client. 1466 | - Fixed bug #480: Issues with the reserved resource in multi threaded 1467 | environments (Patch by Francis.Grolemund@netapp.com). 1468 | - Fixed bug #558: PHP segfaults when running a nested eval. 1469 | 1470 | 1471 | 1472 | 1473 | 2.1.0beta3 1474 | 2.1.0beta3 1475 | 1476 | 1477 | beta 1478 | beta 1479 | 1480 | 2010-02-27 1481 | BSD style 1482 | 1483 | Sat, Feb 27, 2010 - xdebug 2.1.0beta3 1484 | 1485 | = Fixed bugs: 1486 | - Fixed memory corruption issues. 1487 | - Fixed a threading related issue for code-coverage. 1488 | - Fixed bug #532: XDebug breaks header() function. 1489 | - DBGP: Prevent Xdebug from returning properties when a too high page number 1490 | has been requested. 1491 | 1492 | 1493 | 1494 | 1495 | 2.1.0beta2 1496 | 2.1.0beta2 1497 | 1498 | 1499 | beta 1500 | beta 1501 | 1502 | 2010-02-03 1503 | BSD style 1504 | 1505 | Wed, Feb 03, 2010 - xdebug 2.1.0beta2 1506 | 1507 | = Fixed bugs: 1508 | - Fixed memory leak in breakpoint handling. 1509 | - Fixed bug #528: Core dump generated with remote_connect_back option set 1510 | and CLI usage. 1511 | - Fixed bug #515: declare(ticks) statement confuses code coverage. 1512 | - Fixed bug #512: DBGP: breakpoint_get doesn't return conditions in its 1513 | response. 1514 | - Possible fix for bug #507/#517: Crashes because of uninitalised header 1515 | globals. 1516 | - Fixed bug #501: Xdebug's variable tracing misses POST_INC and variants. 1517 | 1518 | 1519 | 1520 | 1521 | 2.1.0beta1 1522 | 2.1.0beta1 1523 | 1524 | 1525 | beta 1526 | beta 1527 | 1528 | 2010-01-03 1529 | BSD style 1530 | 1531 | Sun, Jan 03, 2010 - xdebug 2.1.0beta1 1532 | 1533 | + Added features: 1534 | - Added error display collection and suppressions. 1535 | - Added the recording of headers being set in scripts. 1536 | - Added variable assignment tracing. 1537 | - Added the ability to turn of the default overriding of var_dump(). 1538 | - Added "Scream" support, which disables the @ operator. 1539 | - Added a trace-file analysing script. 1540 | - Added support for debugging into phars. 1541 | - Added a default xdebug.ini. (Patch by Martin Schuhfu 1542 | <martins@spot-media.de>) 1543 | - Added function parameters in computerized function traces. 1544 | - PHP 5.3 compatibility. 1545 | - Improved code coverage accuracy. 1546 | 1547 | + New functions: 1548 | - xdebug_get_formatted_function_stack(), which returns a formatted function 1549 | stack instead of displaying it. 1550 | - xdebug_get_headers(), which returns all headers that have been set in a 1551 | script, both explicitly with things like header(), but also implicitly 1552 | for things like setcookie(). 1553 | - xdebug_start_error_collection(), xdebug_stop_error_collection() and 1554 | xdebug_get_collected_errors(), which allow you to collect all notices, 1555 | warnings and error messages that Xdebug generates from PHP's 1556 | error_reporting functionality so that you can output them at a later 1557 | point in your script by hand. 1558 | 1559 | + New settings: 1560 | - xdebug.collect_assignments, which enables the emitting of variable 1561 | assignments in function traces. 1562 | - xdebug.file_line_format, to generate a link with a specific format for 1563 | every filename that Xdebug outputs. 1564 | - xdebug.overload_var_dump, which allows you to turn off Xdebug's version 1565 | of var_dump(). 1566 | - xdebug.remote_cookie_expire_time, that controls the length of a 1567 | remote debugging session. (Patch by Rick Pannen <pannen@gmail.com>) 1568 | - xdebug.scream, which makes the @ operator to be ignored. 1569 | 1570 | + Changes: 1571 | - Added return values for xdebug_start_code_coverage() and 1572 | xdebug_stop_code_coverage() to indicate whether the action was 1573 | successful. xdebug_start_code_coverage() will return TRUE if the call 1574 | enabled code coverage, and FALSE if it was already enabled. 1575 | xdebug_stop_code_coverage() will return FALSE when code coverage wasn't 1576 | started yet and TRUE if it was turned on. 1577 | - Added an optional argument to xdebug_print_function_stack() to display 1578 | your own message. (Patch by Mikko Koppanen). 1579 | - All HTML output as generated by Xdebug now has a HTML "class" attribute 1580 | for easy CSS formatting. 1581 | 1582 | - Removed features: 1583 | - Support for PHP versions lower than PHP 5.1 have been dropped. 1584 | - The PHP3 and GDB debugger engines have been removed. 1585 | 1586 | = Fixed bugs: 1587 | - Fixed support for showing $this in remote debugging sessions. 1588 | - Fixed bug in formatting the display of "Variables in the local scope". 1589 | - Possible fix for a threading issue where the headers gathering function 1590 | would create stack overflows. 1591 | - Possible fix for #324: xdebug_dump_superglobals() only dumps superglobals 1592 | that were accessed before, and #478: XDebug 2.0.x can't use %R in 1593 | xdebug.profiler_output_name if register_long_arrays is off. 1594 | 1595 | - Fixed bug #505: %s in xdebug.trace_output_name breaks functions traces. 1596 | - Fixed bug #494: Private attributes of parent class unavailable when 1597 | inheriting. 1598 | - Fixed bug #486: feature_get -n breakpoint_types returns out of date list. 1599 | - Fixed bug #476: Xdebug doesn't support PHP 5.3's exception chaining. 1600 | - Fixed bug #472: Dead Code Analysis for code coverage messed up after goto. 1601 | - Fixed bug #470: Catch blocks marked as dead code unless executed. 1602 | - Fixed bug #469: context_get for function variables always appear as 1603 | "uninitialized". 1604 | - Fixed bug #468: Property_get on $GLOBALS works only at top-level, by 1605 | adding GLOBALS to the super globals context. 1606 | - Fixed bug #453: Memory leaks. 1607 | - Fixed bug #445: error_prepend_string and error_append_string are ignored 1608 | by xdebug_error_cb. (Patch by Kent Davidson <kent@marketruler.com>) 1609 | - Fixed bug #442: configure: error: "you have strange libedit". 1610 | - Fixed bug #439: Xdebug crash in xdebug_header_handler. 1611 | - Fixed bug #423: Conflicts with funcall. 1612 | - Fixed bug #419: Make use of P_tmpdir if defined instead of hard coded 1613 | '/tmp'. 1614 | - Fixed bug #417: Response of context_get may lack page and pagesize 1615 | attributes. 1616 | - Fixed bug #411: Class/function breakpoint setting does not follow the 1617 | specs. 1618 | - Fixed bug #393: eval returns array data at the previous page request. 1619 | - Fixed bug #391: Xdebug doesn't stop executing script on catchable fatal 1620 | errors. 1621 | - Fixed bug #389: Destructors called on fatal error. 1622 | - Fixed bug #368: Xdebug's debugger bails out on a parse error with the 1623 | eval command. 1624 | - Fixed bug #356: Temporary breakpoints persist. 1625 | - Fixed bug #355: Function numbers in trace files weren't unique. 1626 | - Fixed bug #340: Segfault while throwing an Exception. 1627 | - Fixed bug #328: Private properties are incorrectly enumerated in case of 1628 | extended classes. 1629 | - Fixed bug #249: Xdebug's error handler messes up with the SOAP 1630 | extension's error handler. 1631 | 1632 | + DBGP: 1633 | - Fixed cases where private properties where shown for objects, but not 1634 | accessible. 1635 | - Added a patch by Lucas Nealan (lucas@php.net) and Brian Shire 1636 | (shire@php.net) of Facebook to allow connections to the initiating 1637 | request's IP address for remote debugging. 1638 | - Added the -p argument to the eval command as well, pending inclusion into 1639 | DBGP. 1640 | - Added the retrieval of a file's execution lines. I added a new 1641 | un-official method called xcmd_get_executable_lines which requires the 1642 | stack depth as argument (-d). You can only fetch this information for 1643 | stack frames as it needs an available op-array which is only available 1644 | when a function is executed. 1645 | - Added a fake "CLASSNAME" property to objects that are returned in debug 1646 | requests to facilitate deficiencies in IDEs that fail to show the "classname" 1647 | XML attribute. 1648 | 1649 | 1650 | 1651 | 1652 | 2.0.5 1653 | 2.0.5 1654 | 1655 | 1656 | stable 1657 | stable 1658 | 1659 | 2009-07-03 1660 | BSD style 1661 | 1662 | Fri, Jul 03, 2009 - xdebug 2.0.5 1663 | 1664 | = Fixed bugs: 1665 | - Fixed bug #425: memory leak (around 40MB for each request) when using 1666 | xdebug_start_trace. 1667 | - Fixed bug #422: Segfaults when using code coverage with a parse error in 1668 | the script. 1669 | - Fixed bug #418: compilation breaks with CodeWarrior for NetWare. 1670 | - Fixed bug #403: 'call' and 'return' breakpoints triggers both on call and 1671 | return for class method breakpoints. 1672 | - Fixed TSRM issues for PHP 5.2 and PHP 5.3. (Original patch by Elizabeth 1673 | M. Smith). 1674 | - Fixed odd crash bugs, due to GCC 4 sensitivity. 1675 | 1676 | 1677 | 1678 | 1679 | 2.0.4 1680 | 2.0.4 1681 | 1682 | 1683 | stable 1684 | stable 1685 | 1686 | 2008-12-30 1687 | BSD style 1688 | 1689 | Tue, Dec 30, 2008 - xdebug 2.0.4 1690 | 1691 | = Fixed bugs: 1692 | - Fixed for strange jump positions in path analysis. 1693 | - Fixed issues with code coverage crashing on parse errors. 1694 | - Fixed code code coverage by overriding more opcodes. 1695 | - Fixed issues with Xdebug stalling/crashing when detaching from remote 1696 | debugging. 1697 | - Fixed crash on Vista where memory was freed with routines from a different 1698 | standard-C library than it was allocated with. (Patch by Eric Promislow 1699 | <ericp@activestate.com>). 1700 | - Link against the correct CRT library. (Patch by Eric Promislow 1701 | <ericp@activestate.com>). 1702 | - Sort the symbol elements according to name. (Patch by Eric Promislow 1703 | <ericp@activestate.com>). 1704 | - Fixed support for mapped-drive UNC paths for Windows. (Patch by Eric 1705 | Promislow <ericp@activestate.com>). 1706 | - Fixed a segfault in interactive mode while including a file. 1707 | - Fixed a crash in super global dumping in case somebody was strange enough 1708 | to reassign them to a value type other than an Array. 1709 | - Simplify version checking for libtool. (Patch by PGNet 1710 | <pgnet.trash@gmail.com>). 1711 | - Fixed display of unused returned variables from functions in PHP 5.3. 1712 | - Include config.w32 in the packages as well. 1713 | - Fixed .dsp for building with PHP 4. 1714 | 1715 | + Added features: 1716 | - Support debugging into phars. 1717 | - Basic PHP 5.3 support. 1718 | 1719 | 1720 | 1721 | 1722 | 2.0.3 1723 | 2.0.3 1724 | 1725 | 1726 | stable 1727 | stable 1728 | 1729 | 2008-04-09 1730 | BSD style 1731 | 1732 | Wed, Apr 09, 2008 - xdebug 2.0.3 1733 | 1734 | = Fixed bugs: 1735 | - Fixed bug #338: Crash with: xdebug.remote_handler=req. 1736 | - Fixed bug #334: Code Coverage Regressions. 1737 | - Fixed abstract method detection for PHP 5.3. 1738 | - Fixed code coverage dead-code detection. 1739 | - Ignore ZEND_ADD_INTERFACE, which is on a different line in PHP >= 5.3 for 1740 | some weird reason. 1741 | 1742 | + Changes: 1743 | - Added a CSS-class for xdebug's var_dump(). 1744 | - Added support for the new E_DEPRECATED. 1745 | 1746 | 1747 | 1748 | 1749 | 2.0.2 1750 | 2.0.2 1751 | 1752 | 1753 | stable 1754 | stable 1755 | 1756 | 2007-11-11 1757 | BSD style 1758 | 1759 | Sun, Nov 11, 2007 - xdebug 2.0.2 1760 | 1761 | = Fixed bugs: 1762 | - Fixed bug #325: DBGP: "detach" stops further sessions being established 1763 | from Apache. 1764 | - Fixed bug #321: Code coverage crashes on empty PHP files. 1765 | - Fixed bug #318: Segmentation Fault in code coverage analysis. 1766 | - Fixed bug #315: Xdebug crashes when including a file that doesn't exist. 1767 | - Fixed bug #314: PHP CLI Error Logging thwarted when XDebug Loaded. 1768 | - Fixed bug #300: Direction of var_dump(). 1769 | - Always set the transaction_id and command. (Related to bug #313). 1770 | 1771 | 1772 | 1773 | 1774 | 2.0.1 1775 | 2.0.1 1776 | 1777 | 1778 | stable 1779 | stable 1780 | 1781 | 2007-10-29 1782 | BSD style 1783 | 1784 | Sat, Oct 20, 2007 - xdebug 2.0.1 1785 | 1786 | + Changes: 1787 | - Improved code coverage performance dramatically. 1788 | - PHP 5.3 compatibility (no namespaces yet though). 1789 | 1790 | = Fixed bugs: 1791 | - Fixed bug #301: Loading would cause SIGBUS on Solaris 10 SPARC. (Patch by 1792 | Sean Chalmers) 1793 | - Fixed bug #300: Xdebug does not force LTR rendering for its tables. 1794 | - Fixed bug #299: Computerized traces don't have a newline for return 1795 | entries if memory limit is not enabled. 1796 | - Fixed bug #298: xdebug_var_dump() doesn't handle entity replacements 1797 | correctly concerning string length. 1798 | - Fixed a memory free error related to remote debugging conditions. 1799 | (Related to bug #297). 1800 | 1801 | 1802 | 1803 | 1804 | 2.0.0 1805 | 2.0.0 1806 | 1807 | 1808 | stable 1809 | stable 1810 | 1811 | 2007-07-18 1812 | BSD style 1813 | 1814 | Wed, Jul 18, 2007 - xdebug 2.0.0 1815 | 1816 | + Changes: 1817 | - Put back the disabling of stack traces - apperently people were relying 1818 | on this. This brings back xdebug_enable(), xdebug_disable() and 1819 | xdebug_is_enabled(). 1820 | - xdebug.collect_params is no longer a boolean setting. Although it worked 1821 | fine, phpinfo() showed only just On or Off here. 1822 | - Fixed the Xdebug version of raw_url_encode to not encode : and \. This is 1823 | not necessary according to the RFCs and it makes debug breakpoints work 1824 | on Windows. 1825 | 1826 | = Fixed bugs: 1827 | - Fixed bug #291: Tests that use SPL do not skip when SPL is not available. 1828 | - Fixed bug #290: Function calls leak memory. 1829 | - Fixed bug #289: Xdebug terminates connection when eval() is run in the 1830 | init stage. 1831 | - Fixed bug #284: Step_over on breakpointed line made Xdebug break twice. 1832 | - Fixed bug #283: Xdebug always returns $this with the value of last stack 1833 | frame. 1834 | - Fixed bug #282: %s is not usable for xdebug.profiler_output_name on 1835 | Windows in all stack frames. 1836 | - Fixed bug #280: var_dump() doesn't display key of array as expected. 1837 | - Fixed bug #278: Code Coverage Issue. 1838 | - Fixed bug #273: Remote debugging: context_get does not return context id. 1839 | - Fixed bug #270: Debugger aborts when PHP's eval() is encountered. 1840 | - Fixed bug #265: XDebug breaks error_get_last() . 1841 | - Fixed bug #261: Code coverage issues by overloading zend_assign_dim. 1842 | 1843 | + DBGP: 1844 | - Added support for "breakpoint_languages". 1845 | 1846 | 1847 | 1848 | 1849 | 2.0.0RC4 1850 | 2.0.0RC4 1851 | 1852 | 1853 | beta 1854 | beta 1855 | 1856 | 2007-05-17 1857 | BSD style 1858 | 1859 | Wed, May 17, 2007 - xdebug 2.0.0rc4 1860 | + Changes: 1861 | - Use µ seconds instead of a tenths of µ seconds to avoid confusion in 1862 | profile information. 1863 | - Changed xdebug.profiler_output_name and xdebug.trace_output_name to use 1864 | modifier tags: 1865 | %c = crc32 of the current working directory 1866 | %p = pid 1867 | %r = random number 1868 | %s = script name 1869 | %t = timestamp (seconds) 1870 | %u = timestamp (microseconds) 1871 | %H = $_SERVER['HTTP_HOST'] 1872 | %R = $_SERVER['REQUEST_URI'] 1873 | %S = session_id (from $_COOKIE if set) 1874 | %% = literal % 1875 | 1876 | = Fixed bugs: 1877 | - Fixed bug #255: Call Stack Table doesn't show Location on Windows. 1878 | - Fixed bug #251: Using the source command with an invalid filename returns 1879 | unexpected result. 1880 | - Fixed bug #243: show_exception_trace="0" ignored. 1881 | - Fixed bug #241: Crash in xdebug_get_function_stack(). 1882 | - Fixed bug #240: Crash with xdebug.remote_log on Windows. 1883 | - Fixed a segfault in rendering stack traces to error logs. 1884 | - Fixed a bug that prevented variable names from being recorded for remote 1885 | debug session while xdebug.collect_vars was turned off. 1886 | - Fixed xdebug_dump_superglobals() in case no super globals were 1887 | configured. 1888 | 1889 | - Removed functions: 1890 | - Removed support for Memory profiling as that didn't work properly. 1891 | - Get rid of xdebug.default_enable setting and associated functions: 1892 | xdebug_disable() and xdebug_enable(). 1893 | 1894 | + Added features: 1895 | - Implemented support for four different xdebug.collect_params settings for 1896 | stack traces and function traces. 1897 | - Allow to trigger profiling by the XDEBUG_PROFILE cookie. 1898 | 1899 | + DBGP: 1900 | - Correctly add namespace definitions to XML. 1901 | - Added the xdebug namespace that adds extra information to breakpoints if 1902 | available. 1903 | - Stopped the use of >error> elements for exception breakpoints, as that 1904 | violates the protocol. 1905 | 1906 | 1907 | 1908 | 1909 | 2.0.0RC3 1910 | 2.0.0RC3 1911 | 1912 | 1913 | beta 1914 | beta 1915 | 1916 | 2007-01-31 1917 | BSD style 1918 | 1919 | Wed, Jan 31, 2007 - xdebug 2.0.0rc3 1920 | + Changes: 1921 | - Removed the bogus "xdebug.allowed_clients" setting - it was not 1922 | implemented. 1923 | - Optimized used variable collection by switching to a linked list instead 1924 | of a hash. This is about 30% faster, but it needed a quick conversion to 1925 | hash in the case the information had to be shown to remove duplicate 1926 | variable names. 1927 | 1928 | = Fixed bugs: 1929 | - Fixed bug #232: PHP log_errors functionality lost after enabling xdebug 1930 | error handler when CLI is used. 1931 | - Fixed problems with opening files - the filename could cause double free 1932 | issues. 1933 | - Fixed memory tracking as memory_limit is always enabled in PHP 5.2.1 and 1934 | later. 1935 | - Fixed a segfault that occurred when creating printable stack traces and 1936 | collect_params was turned off. 1937 | 1938 | 1939 | 1940 | 1941 | 2.0.0RC2 1942 | 2.0.0RC2 1943 | 1944 | 1945 | beta 1946 | beta 1947 | 1948 | 2006-12-24 1949 | BSD style 1950 | 1951 | Sun, Dec 24, 2006 - xdebug 2.0.0rc2 1952 | + Added new features: 1953 | - Implemented the "xdebug.var_display_max_children" setting. The default is 1954 | set to 128 children. 1955 | - Added types to fancy var dumping function. 1956 | - Implemented FR #210: Add a way to stop the debug session without having 1957 | to execute a script. The GET/POST parameter "XDEBUG_SESSION_STOP_NO_EXEC" 1958 | works in the same way as XDEBUG_SESSION_STOP, except that the script will 1959 | not be executed. 1960 | - DBGP: Allow postmortem analysis. 1961 | - DBGP: Added the non-standard function xcmd_profiler_name_get. 1962 | 1963 | + Changes: 1964 | - Fixed the issue where xdebug_get_declared_vars() did not know about 1965 | variables there are in the declared function header, but were not used in 1966 | the code. Due to this change expected arguments that were not send to a 1967 | function will now show up as ??? in stack and function traces in PHP 5.1 1968 | and PHP 5.2. 1969 | - Allow xdebug.var_display_max_data and xdebug.var_display_max_depth 1970 | settings of -1 which will unlimit those settings. 1971 | - DBGP: Sort super globals in Globals overview. 1972 | - DBGP: Fixed a bug where error messages where not added upon errors in the 1973 | protocol. 1974 | - DBGP: Change context 1 from globals (superglobals + vars in bottom most 1975 | stack frame) to just superglobals. 1976 | 1977 | = Fixed bugs: 1978 | - Fixed linking error on AIX by adding libm. 1979 | - Fixed dead code analysis for THROW. 1980 | - Fixed oparray prefill caching for code coverage. 1981 | - Fixed the xdebug.remote_log feature work. 1982 | - DBGP: Fixed a bug where $this did not appear in the local scoped context. 1983 | - DBGP: Reimplemented property_set to use the same symbol fetching function 1984 | as property_get. We now only use eval in case no type (-t) argument was 1985 | given. 1986 | - DBGP: Fixed some issues with finding out the classname, which is 1987 | important for fetching private properties. 1988 | - DBGP: Fixed usage of uninitialized memory that prevented looking up 1989 | numerical array keys while fetching array elements not work properly. 1990 | - Fixed bug #228: Binary safety for stream output and property fetches. 1991 | - Fixed bug #227: The SESSION super global does not show up in the Globals 1992 | scope. 1993 | - Fixed bug #225: xdebug dumps core when protocol is GDB. 1994 | - Fixed bug #224: Compile failure on Solaris. 1995 | - Fixed bug #219: Memory usage delta in traces don't work on PHP 5.2.0. 1996 | - Fixed bug #215: Cannot retrieve nested arrays when the array key is a 1997 | numeric index. 1998 | - Fixed bug #214: The depth level of arrays was incorrectly checked so it 1999 | would show the first page of a level too deep as well. 2000 | - Fixed bug #213: Dead code analysis doesn't take catches for throws into 2001 | account. 2002 | - Fixed bug #211: When starting a new session with a different idekey, the 2003 | cookie is not updated. 2004 | - Fixed bug #209: Additional remote debugging session started when 2005 | triggering shutdown function. 2006 | - Fixed bug #208: Socket connection attempted when XDEBUG_SESSION_STOP. 2007 | - Fixed PECL bug #8989: Compile error with PHP 5 and GCC 2.95. 2008 | 2009 | 2010 | 2011 | 2012 | 2.0.0rc1 2013 | 2.0.0rc1 2014 | 2015 | 2016 | beta 2017 | beta 2018 | 2019 | 2006-10-08 2020 | BSD style 2021 | 2022 | + Added new features: 2023 | - Implemented FR #70: Provide optional depth on xdebug_call_* functions. 2024 | - Partially implemented FR #50: Resource limiting for variable display. By 2025 | default only two levels of nested variables and max string lengths of 512 2026 | are shown. This can be changed by setting the ini settings 2027 | xdebug.var_display_max_depth and xdebug.var_display_max_data. 2028 | - Implemented breakpoints for different types of PHP errors. You can now 2029 | set an 'exception' breakpoint on "Fatal error", "Warning", "Notice" etc. 2030 | This is related to bug #187. 2031 | - Added the xdebug_print_function_trace() function to display a stack trace on 2032 | demand. 2033 | - Reintroduce HTML tracing by adding a new tracing option "XDEBUG_TRACE_HTML" 2034 | (4). 2035 | - Made xdebug_stop_trace() return the trace file name, so that the 2036 | following works: <?php echo file_get_contents( xdebug_stop_trace() ); ?> 2037 | - Added the xdebug.collect_vars setting to tell Xdebug to collect 2038 | information about which variables are used in a scope. Now you don't need 2039 | to show variables with xdebug.show_local_vars anymore for 2040 | xdebug_get_declared_vars() to work. 2041 | - Make the filename parameter to the xdebug_start_trace() function 2042 | optional. If left empty it will use the same algorithm to pick a filename 2043 | as when you are using the xdebug.auto_trace setting. 2044 | 2045 | + Changes: 2046 | - Implemented dead code analysis during code coverage for: 2047 | * abstract methods. 2048 | * dead code after return, throw and exit. 2049 | * implicit returns when a normal return is present. 2050 | - Improved readability of stack traces. 2051 | - Use PG(html_errors) instead of checking whether we run with CLI when 2052 | deciding when to use HTML messages or plain text messages. 2053 | 2054 | = Fixed bugs: 2055 | - Fixed bug #203: PHP errors with HTML content processed incorrectly. This 2056 | patch backs out the change that was made to fix bug #182. 2057 | - Fixed bug #198: Segfault when trying to use a non-existing debug handler. 2058 | - Fixed bug #197: Race condition fixes created too many files. 2059 | - Fixed bug #196: Profile timing on Windows does not work. 2060 | - Fixed bug #195: CLI Error after debugging session. 2061 | - Fixed bug #193: Compile problems with PHP 5.2. 2062 | - Fixed bug #191: File/line breakpoints are case-sensitive on Windows. 2063 | - Fixed bug #181: Xdebug doesn't handle uncaught exception output 2064 | correctly. 2065 | - Fixed bug #173: Coverage produces wrong coverage. 2066 | - Fixed a typo that prevented the XDEBUG_CONFIG option "profiler_enable" 2067 | from working. 2068 | 2069 | 2070 | 2071 | 2072 | 2.0.0beta6 2073 | 2.0.0beta6 2074 | 2075 | 2076 | beta 2077 | beta 2078 | 2079 | 2006-06-30 2080 | BSD style 2081 | 2082 | + Added new features: 2083 | - Implemented FR #137: feature_get for general commands doesn't have a text field. 2084 | - Implemented FR #131: XDebug needs to implement paged child object requests. 2085 | - Implemented FR #124: Add backtrace dumping information when exception thrown. 2086 | - Implemented FR #70: Add feature_get breakpoint_types. 2087 | - Added profiling aggregation functions (patch by Andrei Zmievski) 2088 | - Implemented the "timestamp" option for the xdebug.trace_output_name and 2089 | xdebug.profiler_output_name settings. 2090 | - Added the xdebug.remote_log setting that allows you to log debugger 2091 | communication to a log file for debugging. This can also be set through 2092 | the "remote_log" element in the XDEBUG_CONFIG environment variable. 2093 | - Added a "script" value to the profiler_output_name option. This will write 2094 | the profiler output to a filename that consists of the script's full path 2095 | (using underscores). ie: /var/www/index.php becomes 2096 | var_www_index_php_cachegrind.out. (Patch by Brian Shire). 2097 | - DBGp: Implemented support for hit conditions for breakpoints. 2098 | - DBGp: Added support for conditions for file/line breakpoints. 2099 | - DBGp: Added support for hit value checking to file/line breakpoints. 2100 | - DBGp: Added support for "exception" breakpoints. 2101 | + Performance improvements: 2102 | - Added a cache that prevents the code coverage functionality from running a 2103 | "which code is executable check" on every function call, even if they 2104 | were executed multiple times. This should speed up code coverage a lot. 2105 | - Speedup Xdebug but only gathering information about variables in scopes when 2106 | either remote debugging is used, or show_local_vars is enabled. 2107 | = Fixed bugs: 2108 | - Fixed bug #184: problem with control chars in code traces 2109 | - Fixed bug #183: property_get -n $this->somethingnonexistent crashes the 2110 | debugger. 2111 | - Fixed bug #182: Errors are not html escaped when being displayed. 2112 | - Fixed bug #180: collected includes not shown in trace files. (Patch by 2113 | Cristian Rodriguez) 2114 | - Fixed bug #178: $php_errormsg and Track errors unavailable. 2115 | - Fixed bug #177: debugclient fails to compile due to Bison. 2116 | - Fixed bug #176: Segfault using SplTempFileObject. 2117 | - Fixed bug #173: Xdebug segfaults using SPL ArrayIterator. 2118 | - Fixed bug #171: set_time_limit stack overflow on 2nd request. 2119 | - Fixed bug #168: Xdebug's DBGp crashes on an eval command where the 2120 | result is an array. 2121 | - Fixed bug #125: show_mem_delta does not calculate correct negative values on 2122 | 64bit machines. 2123 | - Fixed bug #121: property_get -n $r[2] returns the whole hash. 2124 | - Fixed bug #111: xdebug does not ignore set_time_limit() function during debug 2125 | session. 2126 | - Fixed bug #87: Warning about headers when "register_shutdown_function" used. 2127 | - Fixed PECL bug #6940 (XDebug ignores set_time_limit) 2128 | - Fixed Komodo bug 45484: no member data for objects in PHP debugger. 2129 | - Suppress NOP/EXT_NOP from being marked as executable code with Code 2130 | Coverage. 2131 | 2132 | 2133 | 2134 | 2135 | 2.0.0beta5 2136 | 2.0.0beta5 2137 | 2138 | 2139 | beta 2140 | beta 2141 | 2142 | 2005-12-31 2143 | BSD style 2144 | 2145 | + Added new features: 2146 | - Implemented FR #161: var_dump doesn't show lengths for strings. 2147 | - Implemented FR #158: Function calls from the {main} scope always have the 2148 | line number 0. 2149 | - Implemented FR #156: it's impossible to know the time taken by the last 2150 | func call in xdebug trace mode 0. 2151 | - Implemented FR #153: xdebug_get_declared_vars(). 2152 | 2153 | = Fixed bugs: 2154 | - Fixed shutdown crash with ZTS on Win32 2155 | - Fixed bad memory leak when a E_ERROR of exceeding memory_limit was 2156 | thrown. 2157 | - Fixed bug #154: GCC 4.0.2 optimizes too much out with -O2. 2158 | - Fixed bug #141: Remote context_get causes segfault. 2159 | 2160 | 2161 | 2162 | 2163 | 2.0.0beta4 2164 | 2.0.0beta4 2165 | 2166 | 2167 | beta 2168 | beta 2169 | 2170 | 2005-09-24 2171 | BSD style 2172 | 2173 | + Added new features: 2174 | - Added xdebug_debug_zval_stdout(). 2175 | - Added xdebug_get_profile_filename() function which returns the current 2176 | profiler dump file. 2177 | - Updated for latest 5.1 and 6.0 CVS versions of PHP. 2178 | - Added FR #148: Option to append to cachegrind files, instead of 2179 | overwriting. 2180 | - Implemented FR #114: Rename tests/*.php to tests/*.inc 2181 | 2182 | - Changed features: 2183 | - Allow "xdebug.default_enable" to be set everywhere. 2184 | 2185 | = Fixed bugs: 2186 | - DBGP: Xdebug should return "array" with property get, which is defined 2187 | in the typemap to the common type "hash". 2188 | - Fixed bug #142: xdebug crashes with implicit destructor calls. 2189 | - Fixed bug #136: The "type" attribute is missing from stack_get returns. 2190 | - Fixed bug #133: PHP scripts exits with 0 on PHP error. 2191 | - Fixed bug #132: use of eval causes a segmentation fault. 2192 | 2193 | 2194 | 2195 | 2196 | 2.0.0beta3 2197 | 2.0.0beta3 2198 | 2199 | 2200 | beta 2201 | beta 2202 | 2203 | 2005-05-12 2204 | BSD style 2205 | 2206 | + Added new features: 2207 | - Added the possibility to trigger the profiler by setting 2208 | "xdebug.profiler_enable_trigger" to 1 and using XDEBUG_PROFILE as a get 2209 | parameter. 2210 | 2211 | = Fixed bugs: 2212 | - Fixed a segfault for when an attribute value is NULL on XML string 2213 | generation. 2214 | - Fixed bug #118: Segfault with exception when remote debugging. 2215 | - Fixed bug #117: var_dump dows not work with "private". 2216 | - Fixed bug #109: DBGP's eval will abort the script when the eval statement 2217 | is invalid. 2218 | - Fixed bug #108: log_only still displays some text for errors in included 2219 | files. 2220 | - Fixed bug #107: Code Coverage only detects executable code in used 2221 | functions and classes. 2222 | - Fixed bug #103: crash when running the DBGp command 'eval' on a global 2223 | variable 2224 | - Fixed bug #95: Segfault when deinitializing Xdebug module. 2225 | (Patch by Maxim Poltarak <demiurg@gmail.com>) 2226 | 2227 | 2228 | 2229 | 2230 | 2.0.0beta2 2231 | 2.0.0beta2 2232 | 2233 | 2234 | beta 2235 | beta 2236 | 2237 | 2004-11-28 2238 | BSD style 2239 | 2240 | + Added new features: 2241 | - DBGP: Added error messages to returned errors (in most cases) 2242 | 2243 | + Added new functions: 2244 | - xdebug_debug_zval() to debug zvals by printing its refcounts and is_ref 2245 | values. 2246 | 2247 | = Changed features: 2248 | - xdebug_code_coverage_stop() will now clean up the code coverage array, 2249 | unless you specify FALSE as parameter. 2250 | - The proper Xdebug type is "hash" for associative arrays. 2251 | - Extended the code-coverage functionality by returning lines with 2252 | executable code on them, but where not executed with a count value of -1. 2253 | 2254 | = Fixed bugs: 2255 | - DBGP: Make property_get and property_value finally work as they should, 2256 | including retrieving information from different depths then the most top 2257 | stack frame. 2258 | - DBGP: Fix eval'ed $varnames in property_get. 2259 | - DBGP: Support the -d option for property_get. 2260 | - Fixed the exit handler hook to use the new "5.1" way of handling it; 2261 | which fortunately also works with PHP 5.0. 2262 | - Fixed bug #102: Problems with configure for automake 1.8. 2263 | - Fixed bug #101: crash with set_exeception_handler() and uncatched exceptions. 2264 | - Fixed bug #99: unset variables return the name as a string with property_get. 2265 | - Fixed bug #98: 'longname' attribute not returned for uninitialized 2266 | property in context_get request. 2267 | - Fixed bug #94: xdebug_sprintf misbehaves with x86_64/glibc-2.3.3 2268 | - Fixed bug #93: Crash in lookup_hostname on x86_64 2269 | - Fixed bug #92: xdebug_disable() doesn't disable the exception handler. 2270 | - Fixed bug #68: Summary not written when script ended with "exit()". 2271 | 2272 | 2273 | 2274 | 2275 | 2.0.0beta1 2276 | 2.0.0beta1 2277 | 2278 | 2279 | beta 2280 | beta 2281 | 2282 | 2004-09-15 2283 | BSD style 2284 | 2285 | + Added new features: 2286 | - Added support for the new DBGp protocol for communicating with the debug 2287 | engine. 2288 | - A computerized trace format for easier parsing by external programs. 2289 | - The ability to set remote debugging features via the environment. This 2290 | allows an IDE to emulate CGI and still pass the configuration through to 2291 | the debugger. In CGI mode, PHP does not allow -d arguments. 2292 | - Reimplementation of the tracing code, you can now only trace to file; this greatly 2293 | enhances performance as no string representation of variables need to be 2294 | kept in memory any more. 2295 | - Re-implemented profiling support. Xdebug outputs information the same way 2296 | that cachegrind does so it is possible to use Kcachegrind as front-end. 2297 | - Xdebug emits warnings when it was not loaded as a Zend extension. 2298 | - Added showing private, protected and public to the fancy var_dump() 2299 | replacement function. 2300 | - Added the setting of the TCP_NODELAY socket option to stop delays in 2301 | transferring data to the remote debugger client. (Patch by Christof J. Reetz) 2302 | + DebugClient: Added setting for port to listen on and implemented running 2303 | the previous command when pressing just enter. 2304 | 2305 | + Added new functions: 2306 | - xdebug_get_stack_depth() to return the current stack depth level. 2307 | - xdebug_get_tracefile_name() to retrieve the name of the tracefile. This 2308 | is useful in case auto trace is enabled and you want to clean the trace 2309 | file. 2310 | - xdebug_peak_memory_usage() which returns the peak memory 2311 | used in a script. (Only works when --enable-memory-limit was enabled) 2312 | 2313 | + Added feature requests: 2314 | - FR #5: xdebug_break() function which interupts the script for the debug 2315 | engine. 2316 | - FR #30: Dump current scope information in stack traces on error. 2317 | - FR #88: Make the url parameter XDEBUG_SESSION_START optional. So it can 2318 | be disabled and the user does not need to add it. 2319 | 2320 | + Added new php.ini settings: 2321 | - xdebug.auto_trace_file: to configure a trace file to write to as addition 2322 | to the xdebug.auto_trace setting which just turns on tracing. 2323 | - xdebug.collect_includes: separates collecting 2324 | names of include files from the xdebug.collect_params setting. 2325 | - xdebug.collect_return: showing return values in traces. 2326 | - xdebug.dump_global: with which you can turn off dumping of super globals 2327 | even in you have that configured. 2328 | - xdebug.extended_info: turns off the generation of extended opcodes that 2329 | are needed for stepping and breakpoints for the remote debugger. This is 2330 | useful incase you want to profile memory usage as the generation of this 2331 | extended info increases memory usage of oparrrays by about 33%. 2332 | - xdebug.profiler_output_dir: profiler output directory. 2333 | - xdebug.profiler_enable: enable the profiler. 2334 | - xdebug.show_local_vars: turn off the showing of local variables in the 2335 | top most stack frame on errors. 2336 | - xdebug.show_mem_delta: show differences between current and previous 2337 | memory usage on a function call level. 2338 | - xdebug.trace_options: to configure extra 2339 | options for trace dumping: 2340 | o XDEBUG_TRACE_APPEND option (1) 2341 | 2342 | = Changed features: 2343 | - xdebug_start_trace() now returns the filename of the tracefile (.xt is 2344 | added to the requested name). 2345 | - Changed default debugging protocol to dbgp instead of gdb. 2346 | - Changed default debugger port from 17869 to 9000. 2347 | - Changed trace file naming: xdebug.trace_output_dir is now used to 2348 | configure a directory to dump automatic traces; the trace file name now 2349 | also includes the pid (xdebug.trace_output_name=pid) or a crc32 checksum 2350 | of the current working dir (xdebug.trace_output_name=crc32) and traces 2351 | are not being appended to an existing file anymore, but simply 2352 | overwritten. 2353 | - Removed $this and $GLOBALS from showing variables in the local scope. 2354 | 2355 | - Removed functions: 2356 | - xdebug_get_function_trace/xdebug_dump_function_trace() because of the new 2357 | idea of tracing. 2358 | 2359 | = Fixed bugs: 2360 | - Fixed bug #89: var_dump shows empty strings garbled. 2361 | - Fixed bug #85: Xdebug segfaults when no idekey is set. 2362 | - Fixed bug #83: More than 32 parameters functions make xdebug crash. 2363 | - Fixed bug #75: xdebug's var_dump implementation is not binary safe. 2364 | - Fixed bug #73: komodo beta 4.3.7 crash. 2365 | - Fixed bug #72: breakpoint_get returns wrong structure. 2366 | - Fixed bug #69: Integer overflow in cachegrind summary. 2367 | - Fixed bug #67: Filenames in Xdebug break URI RFC with spaces. 2368 | - Fixed bug #64: Missing include of xdebug_compat.h. 2369 | - Fixed bug #57: Crash with overloading functions. 2370 | - Fixed bug #54: source command did not except missing -f parameter. 2371 | - Fixed bug #53: Feature get misusing the supported attribute. 2372 | - Fixed bug #51: Only start a debug session if XDEBUG_SESSION_START is 2373 | passed as GET or POST parameter, or the DBGP_COOKIE is send to the server. 2374 | Passing XDEBUG_SESSION_STOP as GET/POST parameter will end the debug 2375 | session and removes the cookie again. The cookie is also passed to the 2376 | remote handler backends; for DBGp it is added to the <init> packet. 2377 | - Fixed bug #49: Included file's names should not be stored by address. 2378 | - Fixed bug #44: Script time-outs should be disabled when debugging. 2379 | = Fixed bug #36: GDB handler using print causes segfault with wrong syntax 2380 | - Fixed bug #33: Implemented the use of the ZEND_POST_DEACTIVATE hook. Now we 2381 | can handle destructors safely too. 2382 | - Fixed bug #32: Unusual dynamic variables cause xdebug to crash. 2383 | 2384 | 2385 | 2386 | 2387 | 1.3.1 2388 | 1.3.1 2389 | 2390 | 2391 | stable 2392 | stable 2393 | 2394 | 2004-04-06 2395 | BSD style 2396 | 2397 | = Fixed profiler to aggregate class/method calls correctly. (Robert Beenen) 2398 | = Fixed debugclient to initialize socket structure correctly. (Brandon Philips 2399 | and David Sklar) 2400 | = GDB: Fixed bug where the source file wasn't closed after a "source" command. 2401 | (Derick) 2402 | 2403 | 2404 | 2405 | 2406 | 1.3.0 2407 | 1.3.0 2408 | 2409 | 2410 | stable 2411 | stable 2412 | 2413 | 2003-09-17 2414 | BSD style 2415 | 2416 | = Fixed segfault where a function name didn't exist in case of a 2417 | "call_user_function". (Derick) 2418 | = Fixed reading a filename in case of an callback to a PHP function from an 2419 | internal function (like "array_map()"). (Derick) 2420 | 2421 | 2422 | 2423 | 2424 | 1.3.0rc1 2425 | 1.3.0rc1 2426 | 2427 | 2428 | beta 2429 | beta 2430 | 2431 | 2003-09-17 2432 | BSD style 2433 | 2434 | = Fixed bug with wrong file names for functions called from call_user_*(). 2435 | (Derick) 2436 | + Added the option "dump_superglobals" to the remote debugger. If you set this 2437 | option to 0 the "show-local" and similar commands will not return any data 2438 | from superglobals anymore. (Derick) 2439 | = Fixed bug #2: "pear package" triggers a segfault. (Derick) 2440 | = Fixed crash bug when a function had sprintf style parameters (ie. 2441 | strftime()). (Derick) 2442 | + Added "id" attribute to <var /> elements in responses from the remove 2443 | debugger when the response method is XML. This makes it possible to 2444 | distinguish between unique elements by use of recursion for example. (Derick) 2445 | = Improved performance greatly by doing lazy folding of variables outside 2446 | trace mode. (Derick) 2447 | = Fixed a bug with "quit", if it was used it disabled the extension for the 2448 | current process. (Derick) 2449 | + Added the "full" argument to the remote command "backtrace". When this 2450 | argument is passed, the local variables will be returned to for each frame in 2451 | the stack. (Derick) 2452 | + Implemented xdebug_time_index() which returns the time passed since the 2453 | start of the script. This change also changes the output of the tracing 2454 | functions as the start time will no longer be the first function call, but 2455 | the real start time of the script. (Derick) 2456 | + Implemented the "show-local" command (shows all local variables in the 2457 | current scope including all contents). (Derick) 2458 | + Implemented conditions for breakpoints in the "break" command. (Derick) 2459 | 2460 | 2461 | 2462 | 2463 | 1.2.0 2464 | 1.2.0 2465 | 2466 | 2467 | stable 2468 | stable 2469 | 2470 | 2003-04-21 2471 | BSD style 2472 | 2473 | = Fixed compilation on MacOSX. (Derick) 2474 | 2475 | 2476 | 2477 | 2478 | 1.2.0rc2 2479 | 1.2.0rc2 2480 | 2481 | 2482 | beta 2483 | beta 2484 | 2485 | 2003-04-15 2486 | BSD style 2487 | 2488 | = Fixed handling Windows paths in the debugger. (Derick) 2489 | = Fixed getting zvals out of Zend Engine 2. (Derick) 2490 | 2491 | 2492 | 2493 | 2494 | 1.2.0rc1 2495 | 1.2.0rc1 2496 | 2497 | 2498 | beta 2499 | beta 2500 | 2501 | 2003-04-06 2502 | BSD style 2503 | 2504 | + Added code coverage functions to check which lines and how often they were 2505 | touched during execution. (Derick) 2506 | + Made Xdebug compatible with Zend Engine 2. (Derick) 2507 | + Added dumping of super globals on errors. (Harald Radi) 2508 | + Added XML protocol for the debugger client. (Derick) 2509 | = Fixed handling of "continue" (so that it also continues with the script). 2510 | (Derick) 2511 | + Additions to the remote debugger: "eval" (evaluate any PHP code from the 2512 | debugger client). (Derick) 2513 | + Added profiling support to xdebug. This introduces 3 new functions, 2514 | xdebug_start_profiling() that begins profiling process, 2515 | xdebug_stop_profiling() that ends the profiling process and 2516 | xdebug_dump_function_trace() that dumps the profiling data. (Ilia) 2517 | + Implemented the "kill" (kills the running script) and "delete" (removes 2518 | a breakpoint on a specified element) command. (Derick) 2519 | 2520 | 2521 | 2522 | 2523 | 1.1.0 2524 | 1.1.0 2525 | 2526 | 2527 | stable 2528 | stable 2529 | 2530 | 2002-11-11 2531 | BSD style 2532 | 2533 | + Implemented the "list" (source listing), "print" (printing variable 2534 | contents), "show" (show all variables in the scope), "step" (step through 2535 | execution), "pwd" (print working directory), "next" (step over) and "finish" 2536 | (step out) commands for the remote debugger. (Derick) 2537 | = Fixed lots of small bugs, under them memory leaks and crash bugs. (Derick) 2538 | 2539 | 2540 | 2541 | 2542 | 1.1.0pre2 2543 | 1.1.0pre2 2544 | 2545 | 2546 | beta 2547 | beta 2548 | 2549 | 2002-10-29 2550 | BSD style 2551 | 2552 | + Implemented class::method, object->method and file.ext:line style 2553 | breakpoints. (Derick) 2554 | + Added xdebug.collect_params setting. If this setting is on (the default) 2555 | then Xdebug collects all parameters passed to functions, otherwise they 2556 | are not collected at all. (Derick) 2557 | + Implemented correct handling of include/require and eval. (Derick) 2558 | 2559 | 2560 | 2561 | 2562 | 1.1.0pre1 2563 | 1.1.0pre1 2564 | 2565 | 2566 | beta 2567 | beta 2568 | 2569 | 2002-10-22 2570 | BSD style 2571 | 2572 | + Added automatic starting of function traces (xdebug.auto_trace, defaulting to 2573 | "off"). (Derick) 2574 | - Xdebug no longer supports PHP versions below PHP 4.3.0pre1. (Derick) 2575 | + Added gdb compatible debugger handler with support for simple (function only) 2576 | breakpoints. (Derick) 2577 | = Implemented a new way to get class names and file names. (Derick, Thies C. 2578 | Arntzen <thies@thieso.net>) 2579 | + Added time-index and memory footprint to CLI dumps. (Derick) 2580 | + Implemented remote debugger handler abstraction. (Derick) 2581 | + Added a php3 compatible debugger handler. (Derick) 2582 | 2583 | 2584 | 2585 | 2586 | 1.0.0rc1 2587 | 1.0.0rc1 2588 | 2589 | 2590 | beta 2591 | beta 2592 | 2593 | 2002-09-01 2594 | BSD style 2595 | 2596 | + Implemented gathering of parameters to internal functions (only available 2597 | in combination with PHP 4.3.0-dev). (Derick) 2598 | = Implemented a new way to get class names and file names. (Derick, Thies C. 2599 | Arntzen >thies@thieso.net<) 2600 | + Added support for error messages with stack trace in syslog. (Sergio 2601 | Ballestrero >s.ballestrero@planetweb.it<) 2602 | = Windows compilation fixes. (Derick) 2603 | 2604 | 2605 | 2606 | 2607 | 0.9.0 2608 | 0.9.0 2609 | 2610 | 2611 | beta 2612 | beta 2613 | 2614 | 2002-06-16 2615 | BSD style 2616 | 2617 | = Fixed a memory leak in delayed included files. (Derick) 2618 | - Added support for PHP 4.1.2. (Derick) 2619 | = Rewrote xdebug_get_function_stack() and xdebug_get_function_trace() to return 2620 | data in multidimensional arrays. (Derick) 2621 | = Fixed compiling without memory limit enabled (Sander Roobol, Derick) 2622 | - Add support for classnames, variable include files and variable 2623 | function names. (Derick) 2624 | - Implemented links to the PHP Manual in traces. (Derick) 2625 | - Added timestamps and memory usage to function traces. (Derick) 2626 | = Fixed crash when using an user defined session handler. (Derick) 2627 | + Implemented variable function names ($a = 'foo'; $f();) for use in 2628 | traces. (Derick) 2629 | 2630 | 2631 | 2632 | 2633 | 0.8.0 2634 | 0.8.0 2635 | 2636 | 2637 | beta 2638 | beta 2639 | 2640 | 2002-05-26 2641 | BSD style 2642 | 2643 | + Implemented much better parameter tracing for user defined 2644 | functions. (Derick) 2645 | = Renamed xdebug_get_function_trace() to xdebug_dump_function_trace(). 2646 | (Derick) 2647 | = Implemented new xdebug_get_function_trace() to return the function trace in 2648 | an array. (Derick) 2649 | + Added a parameter to xdebug_start_trace(). When this parameter is used, 2650 | xdebug will dump a function trace to the filename which this parameter 2651 | speficies. (Derick) 2652 | - Fix a problem with nested member functions. (Derick) 2653 | = Make configure scripts work with PHP 4.2.x. (Derick) 2654 | + Implemented handling single-dimensional constant arrays passed to a 2655 | function. (Derick) 2656 | = Fix function traces in windows. (Derick) 2657 | + Implemented function traces, which you can start and stop with 2658 | xdebug_start_trace() and xdebug_stop_trace(). You can view the trace by using 2659 | the return array from xdebug_get_function_trace(). (Derick) 2660 | = Fixed segfaults with xdebug_call_*(). (Derick) 2661 | 2662 | 2663 | 2664 | 2665 | 0.7.0 2666 | 0.7.0 2667 | 2668 | 2669 | beta 2670 | beta 2671 | 2672 | 2002-05-08 2673 | BSD style 2674 | 2675 | + Implemented handling of static method calls (foo::bar). (Derick) 2676 | + Added correct handling of include(_once)/require(_once) and eval(). 2677 | (Derick) 2678 | + Added ini setting to change the default setting for enabling showing 2679 | enhanced error messages. (Defaults to "On"). (Derick) 2680 | + Added the functions xdebug_enable() and xdebug_disable() to change the 2681 | showing of stack traces from within your code. (Derick) 2682 | = Fixed the extension to show all errors. (Derick) 2683 | + Implemented xdebug_memory_usage() which returns the memory in use by PHPs 2684 | engine. (Derick) 2685 | 2686 | 2687 | 2688 | 2689 | --------------------------------------------------------------------------------