Completed
Pull Request — develop (#1726)
by
unknown
19:16
created
trustedlogin/psr/log/Psr/Log/Test/TestLogger.php 1 patch
Indentation   +78 added lines, -78 removed lines patch added patch discarded remove patch
@@ -62,92 +62,92 @@
 block discarded – undo
62 62
  */
63 63
 class TestLogger extends AbstractLogger
64 64
 {
65
-    /**
66
-     * @var array
67
-     */
68
-    public $records = [];
65
+	/**
66
+	 * @var array
67
+	 */
68
+	public $records = [];
69 69
 
70
-    public $recordsByLevel = [];
70
+	public $recordsByLevel = [];
71 71
 
72
-    /**
73
-     * @inheritdoc
74
-     */
75
-    public function log($level, $message, array $context = [])
76
-    {
77
-        $record = [
78
-            'level' => $level,
79
-            'message' => $message,
80
-            'context' => $context,
81
-        ];
72
+	/**
73
+	 * @inheritdoc
74
+	 */
75
+	public function log($level, $message, array $context = [])
76
+	{
77
+		$record = [
78
+			'level' => $level,
79
+			'message' => $message,
80
+			'context' => $context,
81
+		];
82 82
 
83
-        $this->recordsByLevel[$record['level']][] = $record;
84
-        $this->records[] = $record;
85
-    }
83
+		$this->recordsByLevel[$record['level']][] = $record;
84
+		$this->records[] = $record;
85
+	}
86 86
 
87
-    public function hasRecords($level)
88
-    {
89
-        return isset($this->recordsByLevel[$level]);
90
-    }
87
+	public function hasRecords($level)
88
+	{
89
+		return isset($this->recordsByLevel[$level]);
90
+	}
91 91
 
92
-    public function hasRecord($record, $level)
93
-    {
94
-        if (is_string($record)) {
95
-            $record = ['message' => $record];
96
-        }
97
-        return $this->hasRecordThatPasses(function ($rec) use ($record) {
98
-            if ($rec['message'] !== $record['message']) {
99
-                return false;
100
-            }
101
-            if (isset($record['context']) && $rec['context'] !== $record['context']) {
102
-                return false;
103
-            }
104
-            return true;
105
-        }, $level);
106
-    }
92
+	public function hasRecord($record, $level)
93
+	{
94
+		if (is_string($record)) {
95
+			$record = ['message' => $record];
96
+		}
97
+		return $this->hasRecordThatPasses(function ($rec) use ($record) {
98
+			if ($rec['message'] !== $record['message']) {
99
+				return false;
100
+			}
101
+			if (isset($record['context']) && $rec['context'] !== $record['context']) {
102
+				return false;
103
+			}
104
+			return true;
105
+		}, $level);
106
+	}
107 107
 
108
-    public function hasRecordThatContains($message, $level)
109
-    {
110
-        return $this->hasRecordThatPasses(function ($rec) use ($message) {
111
-            return strpos($rec['message'], $message) !== false;
112
-        }, $level);
113
-    }
108
+	public function hasRecordThatContains($message, $level)
109
+	{
110
+		return $this->hasRecordThatPasses(function ($rec) use ($message) {
111
+			return strpos($rec['message'], $message) !== false;
112
+		}, $level);
113
+	}
114 114
 
115
-    public function hasRecordThatMatches($regex, $level)
116
-    {
117
-        return $this->hasRecordThatPasses(function ($rec) use ($regex) {
118
-            return preg_match($regex, $rec['message']) > 0;
119
-        }, $level);
120
-    }
115
+	public function hasRecordThatMatches($regex, $level)
116
+	{
117
+		return $this->hasRecordThatPasses(function ($rec) use ($regex) {
118
+			return preg_match($regex, $rec['message']) > 0;
119
+		}, $level);
120
+	}
121 121
 
122
-    public function hasRecordThatPasses(callable $predicate, $level)
123
-    {
124
-        if (!isset($this->recordsByLevel[$level])) {
125
-            return false;
126
-        }
127
-        foreach ($this->recordsByLevel[$level] as $i => $rec) {
128
-            if (call_user_func($predicate, $rec, $i)) {
129
-                return true;
130
-            }
131
-        }
132
-        return false;
133
-    }
122
+	public function hasRecordThatPasses(callable $predicate, $level)
123
+	{
124
+		if (!isset($this->recordsByLevel[$level])) {
125
+			return false;
126
+		}
127
+		foreach ($this->recordsByLevel[$level] as $i => $rec) {
128
+			if (call_user_func($predicate, $rec, $i)) {
129
+				return true;
130
+			}
131
+		}
132
+		return false;
133
+	}
134 134
 
135
-    public function __call($method, $args)
136
-    {
137
-        if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
138
-            $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
139
-            $level = strtolower($matches[2]);
140
-            if (method_exists($this, $genericMethod)) {
141
-                $args[] = $level;
142
-                return call_user_func_array([$this, $genericMethod], $args);
143
-            }
144
-        }
145
-        throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');
146
-    }
135
+	public function __call($method, $args)
136
+	{
137
+		if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
138
+			$genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
139
+			$level = strtolower($matches[2]);
140
+			if (method_exists($this, $genericMethod)) {
141
+				$args[] = $level;
142
+				return call_user_func_array([$this, $genericMethod], $args);
143
+			}
144
+		}
145
+		throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');
146
+	}
147 147
 
148
-    public function reset()
149
-    {
150
-        $this->records = [];
151
-        $this->recordsByLevel = [];
152
-    }
148
+	public function reset()
149
+	{
150
+		$this->records = [];
151
+		$this->recordsByLevel = [];
152
+	}
153 153
 }
Please login to merge, or discard this patch.
trustedlogin/psr/log/Psr/Log/Test/LoggerInterfaceTest.php 1 patch
Indentation   +121 added lines, -121 removed lines patch added patch discarded remove patch
@@ -20,125 +20,125 @@
 block discarded – undo
20 20
  */
21 21
 abstract class LoggerInterfaceTest extends TestCase
22 22
 {
23
-    /**
24
-     * @return LoggerInterface
25
-     */
26
-    abstract public function getLogger();
27
-
28
-    /**
29
-     * This must return the log messages in order.
30
-     *
31
-     * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>".
32
-     *
33
-     * Example ->error('Foo') would yield "error Foo".
34
-     *
35
-     * @return string[]
36
-     */
37
-    abstract public function getLogs();
38
-
39
-    public function testImplements()
40
-    {
41
-        $this->assertInstanceOf('GravityView\Psr\Log\LoggerInterface', $this->getLogger());
42
-    }
43
-
44
-    /**
45
-     * @dataProvider provideLevelsAndMessages
46
-     */
47
-    public function testLogsAtAllLevels($level, $message)
48
-    {
49
-        $logger = $this->getLogger();
50
-        $logger->{$level}($message, array('user' => 'Bob'));
51
-        $logger->log($level, $message, array('user' => 'Bob'));
52
-
53
-        $expected = array(
54
-            $level.' message of level '.$level.' with context: Bob',
55
-            $level.' message of level '.$level.' with context: Bob',
56
-        );
57
-        $this->assertEquals($expected, $this->getLogs());
58
-    }
59
-
60
-    public function provideLevelsAndMessages()
61
-    {
62
-        return array(
63
-            LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'),
64
-            LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'),
65
-            LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'),
66
-            LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'),
67
-            LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'),
68
-            LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'),
69
-            LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'),
70
-            LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'),
71
-        );
72
-    }
73
-
74
-    /**
75
-     * @expectedException \GravityView\Psr\Log\InvalidArgumentException
76
-     */
77
-    public function testThrowsOnInvalidLevel()
78
-    {
79
-        $logger = $this->getLogger();
80
-        $logger->log('invalid level', 'Foo');
81
-    }
82
-
83
-    public function testContextReplacement()
84
-    {
85
-        $logger = $this->getLogger();
86
-        $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
87
-
88
-        $expected = array('info {Message {nothing} Bob Bar a}');
89
-        $this->assertEquals($expected, $this->getLogs());
90
-    }
91
-
92
-    public function testObjectCastToString()
93
-    {
94
-        if (method_exists($this, 'createPartialMock')) {
95
-            $dummy = $this->createPartialMock('GravityView\GravityView\Psr\Log\Test\DummyTest', array('__toString'));
96
-        } else {
97
-            $dummy = $this->getMock('GravityView\GravityView\Psr\Log\Test\DummyTest', array('__toString'));
98
-        }
99
-        $dummy->expects($this->once())
100
-            ->method('__toString')
101
-            ->will($this->returnValue('DUMMY'));
102
-
103
-        $this->getLogger()->warning($dummy);
104
-
105
-        $expected = array('warning DUMMY');
106
-        $this->assertEquals($expected, $this->getLogs());
107
-    }
108
-
109
-    public function testContextCanContainAnything()
110
-    {
111
-        $closed = fopen('php://memory', 'r');
112
-        fclose($closed);
113
-
114
-        $context = array(
115
-            'bool' => true,
116
-            'null' => null,
117
-            'string' => 'Foo',
118
-            'int' => 0,
119
-            'float' => 0.5,
120
-            'nested' => array('with object' => new DummyTest),
121
-            'object' => new \DateTime,
122
-            'resource' => fopen('php://memory', 'r'),
123
-            'closed' => $closed,
124
-        );
125
-
126
-        $this->getLogger()->warning('Crazy context data', $context);
127
-
128
-        $expected = array('warning Crazy context data');
129
-        $this->assertEquals($expected, $this->getLogs());
130
-    }
131
-
132
-    public function testContextExceptionKeyCanBeExceptionOrOtherValues()
133
-    {
134
-        $logger = $this->getLogger();
135
-        $logger->warning('Random message', array('exception' => 'oops'));
136
-        $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
137
-
138
-        $expected = array(
139
-            'warning Random message',
140
-            'critical Uncaught Exception!'
141
-        );
142
-        $this->assertEquals($expected, $this->getLogs());
143
-    }
23
+	/**
24
+	 * @return LoggerInterface
25
+	 */
26
+	abstract public function getLogger();
27
+
28
+	/**
29
+	 * This must return the log messages in order.
30
+	 *
31
+	 * The simple formatting of the messages is: "<LOG LEVEL> <MESSAGE>".
32
+	 *
33
+	 * Example ->error('Foo') would yield "error Foo".
34
+	 *
35
+	 * @return string[]
36
+	 */
37
+	abstract public function getLogs();
38
+
39
+	public function testImplements()
40
+	{
41
+		$this->assertInstanceOf('GravityView\Psr\Log\LoggerInterface', $this->getLogger());
42
+	}
43
+
44
+	/**
45
+	 * @dataProvider provideLevelsAndMessages
46
+	 */
47
+	public function testLogsAtAllLevels($level, $message)
48
+	{
49
+		$logger = $this->getLogger();
50
+		$logger->{$level}($message, array('user' => 'Bob'));
51
+		$logger->log($level, $message, array('user' => 'Bob'));
52
+
53
+		$expected = array(
54
+			$level.' message of level '.$level.' with context: Bob',
55
+			$level.' message of level '.$level.' with context: Bob',
56
+		);
57
+		$this->assertEquals($expected, $this->getLogs());
58
+	}
59
+
60
+	public function provideLevelsAndMessages()
61
+	{
62
+		return array(
63
+			LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'),
64
+			LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'),
65
+			LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'),
66
+			LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'),
67
+			LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'),
68
+			LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'),
69
+			LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'),
70
+			LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}'),
71
+		);
72
+	}
73
+
74
+	/**
75
+	 * @expectedException \GravityView\Psr\Log\InvalidArgumentException
76
+	 */
77
+	public function testThrowsOnInvalidLevel()
78
+	{
79
+		$logger = $this->getLogger();
80
+		$logger->log('invalid level', 'Foo');
81
+	}
82
+
83
+	public function testContextReplacement()
84
+	{
85
+		$logger = $this->getLogger();
86
+		$logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar'));
87
+
88
+		$expected = array('info {Message {nothing} Bob Bar a}');
89
+		$this->assertEquals($expected, $this->getLogs());
90
+	}
91
+
92
+	public function testObjectCastToString()
93
+	{
94
+		if (method_exists($this, 'createPartialMock')) {
95
+			$dummy = $this->createPartialMock('GravityView\GravityView\Psr\Log\Test\DummyTest', array('__toString'));
96
+		} else {
97
+			$dummy = $this->getMock('GravityView\GravityView\Psr\Log\Test\DummyTest', array('__toString'));
98
+		}
99
+		$dummy->expects($this->once())
100
+			->method('__toString')
101
+			->will($this->returnValue('DUMMY'));
102
+
103
+		$this->getLogger()->warning($dummy);
104
+
105
+		$expected = array('warning DUMMY');
106
+		$this->assertEquals($expected, $this->getLogs());
107
+	}
108
+
109
+	public function testContextCanContainAnything()
110
+	{
111
+		$closed = fopen('php://memory', 'r');
112
+		fclose($closed);
113
+
114
+		$context = array(
115
+			'bool' => true,
116
+			'null' => null,
117
+			'string' => 'Foo',
118
+			'int' => 0,
119
+			'float' => 0.5,
120
+			'nested' => array('with object' => new DummyTest),
121
+			'object' => new \DateTime,
122
+			'resource' => fopen('php://memory', 'r'),
123
+			'closed' => $closed,
124
+		);
125
+
126
+		$this->getLogger()->warning('Crazy context data', $context);
127
+
128
+		$expected = array('warning Crazy context data');
129
+		$this->assertEquals($expected, $this->getLogs());
130
+	}
131
+
132
+	public function testContextExceptionKeyCanBeExceptionOrOtherValues()
133
+	{
134
+		$logger = $this->getLogger();
135
+		$logger->warning('Random message', array('exception' => 'oops'));
136
+		$logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail')));
137
+
138
+		$expected = array(
139
+			'warning Random message',
140
+			'critical Uncaught Exception!'
141
+		);
142
+		$this->assertEquals($expected, $this->getLogs());
143
+	}
144 144
 }
Please login to merge, or discard this patch.
trustedlogin/psr/log/Psr/Log/Test/DummyTest.php 1 patch
Indentation   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -17,8 +17,8 @@
 block discarded – undo
17 17
  */
18 18
 class DummyTest
19 19
 {
20
-    public function __toString()
21
-    {
22
-        return 'DummyTest';
23
-    }
20
+	public function __toString()
21
+	{
22
+		return 'DummyTest';
23
+	}
24 24
 }
Please login to merge, or discard this patch.
trustedlogin/psr/log/Psr/Log/LoggerInterface.php 1 patch
Indentation   +95 added lines, -95 removed lines patch added patch discarded remove patch
@@ -25,107 +25,107 @@
 block discarded – undo
25 25
  */
26 26
 interface LoggerInterface
27 27
 {
28
-    /**
29
-     * System is unusable.
30
-     *
31
-     * @param string  $message
32
-     * @param mixed[] $context
33
-     *
34
-     * @return void
35
-     */
36
-    public function emergency($message, array $context = array());
28
+	/**
29
+	 * System is unusable.
30
+	 *
31
+	 * @param string  $message
32
+	 * @param mixed[] $context
33
+	 *
34
+	 * @return void
35
+	 */
36
+	public function emergency($message, array $context = array());
37 37
 
38
-    /**
39
-     * Action must be taken immediately.
40
-     *
41
-     * Example: Entire website down, database unavailable, etc. This should
42
-     * trigger the SMS alerts and wake you up.
43
-     *
44
-     * @param string  $message
45
-     * @param mixed[] $context
46
-     *
47
-     * @return void
48
-     */
49
-    public function alert($message, array $context = array());
38
+	/**
39
+	 * Action must be taken immediately.
40
+	 *
41
+	 * Example: Entire website down, database unavailable, etc. This should
42
+	 * trigger the SMS alerts and wake you up.
43
+	 *
44
+	 * @param string  $message
45
+	 * @param mixed[] $context
46
+	 *
47
+	 * @return void
48
+	 */
49
+	public function alert($message, array $context = array());
50 50
 
51
-    /**
52
-     * Critical conditions.
53
-     *
54
-     * Example: Application component unavailable, unexpected exception.
55
-     *
56
-     * @param string  $message
57
-     * @param mixed[] $context
58
-     *
59
-     * @return void
60
-     */
61
-    public function critical($message, array $context = array());
51
+	/**
52
+	 * Critical conditions.
53
+	 *
54
+	 * Example: Application component unavailable, unexpected exception.
55
+	 *
56
+	 * @param string  $message
57
+	 * @param mixed[] $context
58
+	 *
59
+	 * @return void
60
+	 */
61
+	public function critical($message, array $context = array());
62 62
 
63
-    /**
64
-     * Runtime errors that do not require immediate action but should typically
65
-     * be logged and monitored.
66
-     *
67
-     * @param string  $message
68
-     * @param mixed[] $context
69
-     *
70
-     * @return void
71
-     */
72
-    public function error($message, array $context = array());
63
+	/**
64
+	 * Runtime errors that do not require immediate action but should typically
65
+	 * be logged and monitored.
66
+	 *
67
+	 * @param string  $message
68
+	 * @param mixed[] $context
69
+	 *
70
+	 * @return void
71
+	 */
72
+	public function error($message, array $context = array());
73 73
 
74
-    /**
75
-     * Exceptional occurrences that are not errors.
76
-     *
77
-     * Example: Use of deprecated APIs, poor use of an API, undesirable things
78
-     * that are not necessarily wrong.
79
-     *
80
-     * @param string  $message
81
-     * @param mixed[] $context
82
-     *
83
-     * @return void
84
-     */
85
-    public function warning($message, array $context = array());
74
+	/**
75
+	 * Exceptional occurrences that are not errors.
76
+	 *
77
+	 * Example: Use of deprecated APIs, poor use of an API, undesirable things
78
+	 * that are not necessarily wrong.
79
+	 *
80
+	 * @param string  $message
81
+	 * @param mixed[] $context
82
+	 *
83
+	 * @return void
84
+	 */
85
+	public function warning($message, array $context = array());
86 86
 
87
-    /**
88
-     * Normal but significant events.
89
-     *
90
-     * @param string  $message
91
-     * @param mixed[] $context
92
-     *
93
-     * @return void
94
-     */
95
-    public function notice($message, array $context = array());
87
+	/**
88
+	 * Normal but significant events.
89
+	 *
90
+	 * @param string  $message
91
+	 * @param mixed[] $context
92
+	 *
93
+	 * @return void
94
+	 */
95
+	public function notice($message, array $context = array());
96 96
 
97
-    /**
98
-     * Interesting events.
99
-     *
100
-     * Example: User logs in, SQL logs.
101
-     *
102
-     * @param string  $message
103
-     * @param mixed[] $context
104
-     *
105
-     * @return void
106
-     */
107
-    public function info($message, array $context = array());
97
+	/**
98
+	 * Interesting events.
99
+	 *
100
+	 * Example: User logs in, SQL logs.
101
+	 *
102
+	 * @param string  $message
103
+	 * @param mixed[] $context
104
+	 *
105
+	 * @return void
106
+	 */
107
+	public function info($message, array $context = array());
108 108
 
109
-    /**
110
-     * Detailed debug information.
111
-     *
112
-     * @param string  $message
113
-     * @param mixed[] $context
114
-     *
115
-     * @return void
116
-     */
117
-    public function debug($message, array $context = array());
109
+	/**
110
+	 * Detailed debug information.
111
+	 *
112
+	 * @param string  $message
113
+	 * @param mixed[] $context
114
+	 *
115
+	 * @return void
116
+	 */
117
+	public function debug($message, array $context = array());
118 118
 
119
-    /**
120
-     * Logs with an arbitrary level.
121
-     *
122
-     * @param mixed   $level
123
-     * @param string  $message
124
-     * @param mixed[] $context
125
-     *
126
-     * @return void
127
-     *
128
-     * @throws \GravityView\Psr\Log\InvalidArgumentException
129
-     */
130
-    public function log($level, $message, array $context = array());
119
+	/**
120
+	 * Logs with an arbitrary level.
121
+	 *
122
+	 * @param mixed   $level
123
+	 * @param string  $message
124
+	 * @param mixed[] $context
125
+	 *
126
+	 * @return void
127
+	 *
128
+	 * @throws \GravityView\Psr\Log\InvalidArgumentException
129
+	 */
130
+	public function log($level, $message, array $context = array());
131 131
 }
Please login to merge, or discard this patch.
trustedlogin/autoload.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -2,19 +2,19 @@
 block discarded – undo
2 2
 // autoload.php @generated by Strauss
3 3
 
4 4
 if ( file_exists( __DIR__ . '/autoload-classmap.php' ) ) {
5
-    $class_map = include __DIR__ . '/autoload-classmap.php';
6
-    if ( is_array( $class_map ) ) {
7
-        spl_autoload_register(
8
-            function ( $classname ) use ( $class_map ) {
9
-                if ( isset( $class_map[ $classname ] ) && file_exists( $class_map[ $classname ] ) ) {
10
-                    require_once $class_map[ $classname ];
11
-                }
12
-            }
13
-        );
14
-    }
15
-    unset( $class_map );
5
+	$class_map = include __DIR__ . '/autoload-classmap.php';
6
+	if ( is_array( $class_map ) ) {
7
+		spl_autoload_register(
8
+			function ( $classname ) use ( $class_map ) {
9
+				if ( isset( $class_map[ $classname ] ) && file_exists( $class_map[ $classname ] ) ) {
10
+					require_once $class_map[ $classname ];
11
+				}
12
+			}
13
+		);
14
+	}
15
+	unset( $class_map );
16 16
 }
17 17
 
18 18
 if ( file_exists( __DIR__ . '/autoload-files.php' ) ) {
19
-    require_once __DIR__ . '/autoload-files.php';
19
+	require_once __DIR__ . '/autoload-files.php';
20 20
 }
21 21
\ No newline at end of file
Please login to merge, or discard this patch.
trustedlogin/katzgrau/klogger/src/Logger.php 1 patch
Indentation   +318 added lines, -318 removed lines patch added patch discarded remove patch
@@ -34,322 +34,322 @@
 block discarded – undo
34 34
  */
35 35
 class Logger extends AbstractLogger
36 36
 {
37
-    /**
38
-     * KLogger options
39
-     *  Anything options not considered 'core' to the logging library should be
40
-     *  settable view the third parameter in the constructor
41
-     *
42
-     *  Core options include the log file path and the log threshold
43
-     *
44
-     * @var array
45
-     */
46
-    protected $options = array (
47
-        'extension'      => 'txt',
48
-        'dateFormat'     => 'Y-m-d G:i:s.u',
49
-        'filename'       => false,
50
-        'flushFrequency' => false,
51
-        'prefix'         => 'log_',
52
-        'logFormat'      => false,
53
-        'appendContext'  => true,
54
-    );
55
-
56
-    /**
57
-     * Path to the log file
58
-     * @var string
59
-     */
60
-    private $logFilePath;
61
-
62
-    /**
63
-     * Current minimum logging threshold
64
-     * @var integer
65
-     */
66
-    protected $logLevelThreshold = LogLevel::DEBUG;
67
-
68
-    /**
69
-     * The number of lines logged in this instance's lifetime
70
-     * @var int
71
-     */
72
-    private $logLineCount = 0;
73
-
74
-    /**
75
-     * Log Levels
76
-     * @var array
77
-     */
78
-    protected $logLevels = array(
79
-        LogLevel::EMERGENCY => 0,
80
-        LogLevel::ALERT     => 1,
81
-        LogLevel::CRITICAL  => 2,
82
-        LogLevel::ERROR     => 3,
83
-        LogLevel::WARNING   => 4,
84
-        LogLevel::NOTICE    => 5,
85
-        LogLevel::INFO      => 6,
86
-        LogLevel::DEBUG     => 7
87
-    );
88
-
89
-    /**
90
-     * This holds the file handle for this instance's log file
91
-     * @var resource
92
-     */
93
-    private $fileHandle;
94
-
95
-    /**
96
-     * This holds the last line logged to the logger
97
-     *  Used for unit tests
98
-     * @var string
99
-     */
100
-    private $lastLine = '';
101
-
102
-    /**
103
-     * Octal notation for default permissions of the log file
104
-     * @var integer
105
-     */
106
-    private $defaultPermissions = 0777;
107
-
108
-    /**
109
-     * Class constructor
110
-     *
111
-     * @param string $logDirectory      File path to the logging directory
112
-     * @param string $logLevelThreshold The LogLevel Threshold
113
-     * @param array  $options
114
-     *
115
-     * @internal param string $logFilePrefix The prefix for the log file name
116
-     * @internal param string $logFileExt The extension for the log file
117
-     */
118
-    public function __construct($logDirectory, $logLevelThreshold = LogLevel::DEBUG, array $options = array())
119
-    {
120
-        $this->logLevelThreshold = $logLevelThreshold;
121
-        $this->options = array_merge($this->options, $options);
122
-
123
-        $logDirectory = rtrim($logDirectory, DIRECTORY_SEPARATOR);
124
-        if ( ! file_exists($logDirectory)) {
125
-            mkdir($logDirectory, $this->defaultPermissions, true);
126
-        }
127
-
128
-        if(strpos($logDirectory, 'php://') === 0) {
129
-            $this->setLogToStdOut($logDirectory);
130
-            $this->setFileHandle('w+');
131
-        } else {
132
-            $this->setLogFilePath($logDirectory);
133
-            if(file_exists($this->logFilePath) && !is_writable($this->logFilePath)) {
134
-                throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
135
-            }
136
-            $this->setFileHandle('a');
137
-        }
138
-
139
-        if ( ! $this->fileHandle) {
140
-            throw new RuntimeException('The file could not be opened. Check permissions.');
141
-        }
142
-    }
143
-
144
-    /**
145
-     * @param string $stdOutPath
146
-     */
147
-    public function setLogToStdOut($stdOutPath) {
148
-        $this->logFilePath = $stdOutPath;
149
-    }
150
-
151
-    /**
152
-     * @param string $logDirectory
153
-     */
154
-    public function setLogFilePath($logDirectory) {
155
-        if ($this->options['filename']) {
156
-            if (strpos($this->options['filename'], '.log') !== false || strpos($this->options['filename'], '.txt') !== false) {
157
-                $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'];
158
-            }
159
-            else {
160
-                $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'].'.'.$this->options['extension'];
161
-            }
162
-        } else {
163
-            $this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['prefix'].date('Y-m-d').'.'.$this->options['extension'];
164
-        }
165
-    }
166
-
167
-    /**
168
-     * @param $writeMode
169
-     *
170
-     * @internal param resource $fileHandle
171
-     */
172
-    public function setFileHandle($writeMode) {
173
-        $this->fileHandle = fopen($this->logFilePath, $writeMode);
174
-    }
175
-
176
-
177
-    /**
178
-     * Class destructor
179
-     */
180
-    public function __destruct()
181
-    {
182
-        if ($this->fileHandle) {
183
-            fclose($this->fileHandle);
184
-        }
185
-    }
186
-
187
-    /**
188
-     * Sets the date format used by all instances of KLogger
189
-     *
190
-     * @param string $dateFormat Valid format string for date()
191
-     */
192
-    public function setDateFormat($dateFormat)
193
-    {
194
-        $this->options['dateFormat'] = $dateFormat;
195
-    }
196
-
197
-    /**
198
-     * Sets the Log Level Threshold
199
-     *
200
-     * @param string $logLevelThreshold The log level threshold
201
-     */
202
-    public function setLogLevelThreshold($logLevelThreshold)
203
-    {
204
-        $this->logLevelThreshold = $logLevelThreshold;
205
-    }
206
-
207
-    /**
208
-     * Logs with an arbitrary level.
209
-     *
210
-     * @param mixed $level
211
-     * @param string $message
212
-     * @param array $context
213
-     * @return null
214
-     */
215
-    public function log($level, $message, array $context = array())
216
-    {
217
-        if ($this->logLevels[$this->logLevelThreshold] < $this->logLevels[$level]) {
218
-            return;
219
-        }
220
-        $message = $this->formatMessage($level, $message, $context);
221
-        $this->write($message);
222
-    }
223
-
224
-    /**
225
-     * Writes a line to the log without prepending a status or timestamp
226
-     *
227
-     * @param string $message Line to write to the log
228
-     * @return void
229
-     */
230
-    public function write($message)
231
-    {
232
-        if (null !== $this->fileHandle) {
233
-            if (fwrite($this->fileHandle, $message) === false) {
234
-                throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
235
-            } else {
236
-                $this->lastLine = trim($message);
237
-                $this->logLineCount++;
238
-
239
-                if ($this->options['flushFrequency'] && $this->logLineCount % $this->options['flushFrequency'] === 0) {
240
-                    fflush($this->fileHandle);
241
-                }
242
-            }
243
-        }
244
-    }
245
-
246
-    /**
247
-     * Get the file path that the log is currently writing to
248
-     *
249
-     * @return string
250
-     */
251
-    public function getLogFilePath()
252
-    {
253
-        return $this->logFilePath;
254
-    }
255
-
256
-    /**
257
-     * Get the last line logged to the log file
258
-     *
259
-     * @return string
260
-     */
261
-    public function getLastLogLine()
262
-    {
263
-        return $this->lastLine;
264
-    }
265
-
266
-    /**
267
-     * Formats the message for logging.
268
-     *
269
-     * @param  string $level   The Log Level of the message
270
-     * @param  string $message The message to log
271
-     * @param  array  $context The context
272
-     * @return string
273
-     */
274
-    protected function formatMessage($level, $message, $context)
275
-    {
276
-        if ($this->options['logFormat']) {
277
-            $parts = array(
278
-                'date'          => $this->getTimestamp(),
279
-                'level'         => strtoupper($level),
280
-                'level-padding' => str_repeat(' ', 9 - strlen($level)),
281
-                'priority'      => $this->logLevels[$level],
282
-                'message'       => $message,
283
-                'context'       => json_encode($context),
284
-            );
285
-            $message = $this->options['logFormat'];
286
-            foreach ($parts as $part => $value) {
287
-                $message = str_replace('{'.$part.'}', $value, $message);
288
-            }
289
-
290
-        } else {
291
-            $message = "[{$this->getTimestamp()}] [{$level}] {$message}";
292
-        }
293
-
294
-        if ($this->options['appendContext'] && ! empty($context)) {
295
-            $message .= PHP_EOL.$this->indent($this->contextToString($context));
296
-        }
297
-
298
-        return $message.PHP_EOL;
299
-
300
-    }
301
-
302
-    /**
303
-     * Gets the correctly formatted Date/Time for the log entry.
304
-     *
305
-     * PHP DateTime is dump, and you have to resort to trickery to get microseconds
306
-     * to work correctly, so here it is.
307
-     *
308
-     * @return string
309
-     */
310
-    private function getTimestamp()
311
-    {
312
-        $originalTime = microtime(true);
313
-        $micro = sprintf("%06d", ($originalTime - floor($originalTime)) * 1000000);
314
-        $date = new DateTime(date('Y-m-d H:i:s.'.$micro, $originalTime));
315
-
316
-        return $date->format($this->options['dateFormat']);
317
-    }
318
-
319
-    /**
320
-     * Takes the given context and coverts it to a string.
321
-     *
322
-     * @param  array $context The Context
323
-     * @return string
324
-     */
325
-    protected function contextToString($context)
326
-    {
327
-        $export = '';
328
-        foreach ($context as $key => $value) {
329
-            $export .= "{$key}: ";
330
-            $export .= preg_replace(array(
331
-                '/=>\s+([a-zA-Z])/im',
332
-                '/array\(\s+\)/im',
333
-                '/^  |\G  /m'
334
-            ), array(
335
-                '=> $1',
336
-                'array()',
337
-                '    '
338
-            ), str_replace('array (', 'array(', var_export($value, true)));
339
-            $export .= PHP_EOL;
340
-        }
341
-        return str_replace(array('\\\\', '\\\''), array('\\', '\''), rtrim($export));
342
-    }
343
-
344
-    /**
345
-     * Indents the given string with the given indent.
346
-     *
347
-     * @param  string $string The string to indent
348
-     * @param  string $indent What to use as the indent.
349
-     * @return string
350
-     */
351
-    protected function indent($string, $indent = '    ')
352
-    {
353
-        return $indent.str_replace("\n", "\n".$indent, $string);
354
-    }
37
+	/**
38
+	 * KLogger options
39
+	 *  Anything options not considered 'core' to the logging library should be
40
+	 *  settable view the third parameter in the constructor
41
+	 *
42
+	 *  Core options include the log file path and the log threshold
43
+	 *
44
+	 * @var array
45
+	 */
46
+	protected $options = array (
47
+		'extension'      => 'txt',
48
+		'dateFormat'     => 'Y-m-d G:i:s.u',
49
+		'filename'       => false,
50
+		'flushFrequency' => false,
51
+		'prefix'         => 'log_',
52
+		'logFormat'      => false,
53
+		'appendContext'  => true,
54
+	);
55
+
56
+	/**
57
+	 * Path to the log file
58
+	 * @var string
59
+	 */
60
+	private $logFilePath;
61
+
62
+	/**
63
+	 * Current minimum logging threshold
64
+	 * @var integer
65
+	 */
66
+	protected $logLevelThreshold = LogLevel::DEBUG;
67
+
68
+	/**
69
+	 * The number of lines logged in this instance's lifetime
70
+	 * @var int
71
+	 */
72
+	private $logLineCount = 0;
73
+
74
+	/**
75
+	 * Log Levels
76
+	 * @var array
77
+	 */
78
+	protected $logLevels = array(
79
+		LogLevel::EMERGENCY => 0,
80
+		LogLevel::ALERT     => 1,
81
+		LogLevel::CRITICAL  => 2,
82
+		LogLevel::ERROR     => 3,
83
+		LogLevel::WARNING   => 4,
84
+		LogLevel::NOTICE    => 5,
85
+		LogLevel::INFO      => 6,
86
+		LogLevel::DEBUG     => 7
87
+	);
88
+
89
+	/**
90
+	 * This holds the file handle for this instance's log file
91
+	 * @var resource
92
+	 */
93
+	private $fileHandle;
94
+
95
+	/**
96
+	 * This holds the last line logged to the logger
97
+	 *  Used for unit tests
98
+	 * @var string
99
+	 */
100
+	private $lastLine = '';
101
+
102
+	/**
103
+	 * Octal notation for default permissions of the log file
104
+	 * @var integer
105
+	 */
106
+	private $defaultPermissions = 0777;
107
+
108
+	/**
109
+	 * Class constructor
110
+	 *
111
+	 * @param string $logDirectory      File path to the logging directory
112
+	 * @param string $logLevelThreshold The LogLevel Threshold
113
+	 * @param array  $options
114
+	 *
115
+	 * @internal param string $logFilePrefix The prefix for the log file name
116
+	 * @internal param string $logFileExt The extension for the log file
117
+	 */
118
+	public function __construct($logDirectory, $logLevelThreshold = LogLevel::DEBUG, array $options = array())
119
+	{
120
+		$this->logLevelThreshold = $logLevelThreshold;
121
+		$this->options = array_merge($this->options, $options);
122
+
123
+		$logDirectory = rtrim($logDirectory, DIRECTORY_SEPARATOR);
124
+		if ( ! file_exists($logDirectory)) {
125
+			mkdir($logDirectory, $this->defaultPermissions, true);
126
+		}
127
+
128
+		if(strpos($logDirectory, 'php://') === 0) {
129
+			$this->setLogToStdOut($logDirectory);
130
+			$this->setFileHandle('w+');
131
+		} else {
132
+			$this->setLogFilePath($logDirectory);
133
+			if(file_exists($this->logFilePath) && !is_writable($this->logFilePath)) {
134
+				throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
135
+			}
136
+			$this->setFileHandle('a');
137
+		}
138
+
139
+		if ( ! $this->fileHandle) {
140
+			throw new RuntimeException('The file could not be opened. Check permissions.');
141
+		}
142
+	}
143
+
144
+	/**
145
+	 * @param string $stdOutPath
146
+	 */
147
+	public function setLogToStdOut($stdOutPath) {
148
+		$this->logFilePath = $stdOutPath;
149
+	}
150
+
151
+	/**
152
+	 * @param string $logDirectory
153
+	 */
154
+	public function setLogFilePath($logDirectory) {
155
+		if ($this->options['filename']) {
156
+			if (strpos($this->options['filename'], '.log') !== false || strpos($this->options['filename'], '.txt') !== false) {
157
+				$this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'];
158
+			}
159
+			else {
160
+				$this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['filename'].'.'.$this->options['extension'];
161
+			}
162
+		} else {
163
+			$this->logFilePath = $logDirectory.DIRECTORY_SEPARATOR.$this->options['prefix'].date('Y-m-d').'.'.$this->options['extension'];
164
+		}
165
+	}
166
+
167
+	/**
168
+	 * @param $writeMode
169
+	 *
170
+	 * @internal param resource $fileHandle
171
+	 */
172
+	public function setFileHandle($writeMode) {
173
+		$this->fileHandle = fopen($this->logFilePath, $writeMode);
174
+	}
175
+
176
+
177
+	/**
178
+	 * Class destructor
179
+	 */
180
+	public function __destruct()
181
+	{
182
+		if ($this->fileHandle) {
183
+			fclose($this->fileHandle);
184
+		}
185
+	}
186
+
187
+	/**
188
+	 * Sets the date format used by all instances of KLogger
189
+	 *
190
+	 * @param string $dateFormat Valid format string for date()
191
+	 */
192
+	public function setDateFormat($dateFormat)
193
+	{
194
+		$this->options['dateFormat'] = $dateFormat;
195
+	}
196
+
197
+	/**
198
+	 * Sets the Log Level Threshold
199
+	 *
200
+	 * @param string $logLevelThreshold The log level threshold
201
+	 */
202
+	public function setLogLevelThreshold($logLevelThreshold)
203
+	{
204
+		$this->logLevelThreshold = $logLevelThreshold;
205
+	}
206
+
207
+	/**
208
+	 * Logs with an arbitrary level.
209
+	 *
210
+	 * @param mixed $level
211
+	 * @param string $message
212
+	 * @param array $context
213
+	 * @return null
214
+	 */
215
+	public function log($level, $message, array $context = array())
216
+	{
217
+		if ($this->logLevels[$this->logLevelThreshold] < $this->logLevels[$level]) {
218
+			return;
219
+		}
220
+		$message = $this->formatMessage($level, $message, $context);
221
+		$this->write($message);
222
+	}
223
+
224
+	/**
225
+	 * Writes a line to the log without prepending a status or timestamp
226
+	 *
227
+	 * @param string $message Line to write to the log
228
+	 * @return void
229
+	 */
230
+	public function write($message)
231
+	{
232
+		if (null !== $this->fileHandle) {
233
+			if (fwrite($this->fileHandle, $message) === false) {
234
+				throw new RuntimeException('The file could not be written to. Check that appropriate permissions have been set.');
235
+			} else {
236
+				$this->lastLine = trim($message);
237
+				$this->logLineCount++;
238
+
239
+				if ($this->options['flushFrequency'] && $this->logLineCount % $this->options['flushFrequency'] === 0) {
240
+					fflush($this->fileHandle);
241
+				}
242
+			}
243
+		}
244
+	}
245
+
246
+	/**
247
+	 * Get the file path that the log is currently writing to
248
+	 *
249
+	 * @return string
250
+	 */
251
+	public function getLogFilePath()
252
+	{
253
+		return $this->logFilePath;
254
+	}
255
+
256
+	/**
257
+	 * Get the last line logged to the log file
258
+	 *
259
+	 * @return string
260
+	 */
261
+	public function getLastLogLine()
262
+	{
263
+		return $this->lastLine;
264
+	}
265
+
266
+	/**
267
+	 * Formats the message for logging.
268
+	 *
269
+	 * @param  string $level   The Log Level of the message
270
+	 * @param  string $message The message to log
271
+	 * @param  array  $context The context
272
+	 * @return string
273
+	 */
274
+	protected function formatMessage($level, $message, $context)
275
+	{
276
+		if ($this->options['logFormat']) {
277
+			$parts = array(
278
+				'date'          => $this->getTimestamp(),
279
+				'level'         => strtoupper($level),
280
+				'level-padding' => str_repeat(' ', 9 - strlen($level)),
281
+				'priority'      => $this->logLevels[$level],
282
+				'message'       => $message,
283
+				'context'       => json_encode($context),
284
+			);
285
+			$message = $this->options['logFormat'];
286
+			foreach ($parts as $part => $value) {
287
+				$message = str_replace('{'.$part.'}', $value, $message);
288
+			}
289
+
290
+		} else {
291
+			$message = "[{$this->getTimestamp()}] [{$level}] {$message}";
292
+		}
293
+
294
+		if ($this->options['appendContext'] && ! empty($context)) {
295
+			$message .= PHP_EOL.$this->indent($this->contextToString($context));
296
+		}
297
+
298
+		return $message.PHP_EOL;
299
+
300
+	}
301
+
302
+	/**
303
+	 * Gets the correctly formatted Date/Time for the log entry.
304
+	 *
305
+	 * PHP DateTime is dump, and you have to resort to trickery to get microseconds
306
+	 * to work correctly, so here it is.
307
+	 *
308
+	 * @return string
309
+	 */
310
+	private function getTimestamp()
311
+	{
312
+		$originalTime = microtime(true);
313
+		$micro = sprintf("%06d", ($originalTime - floor($originalTime)) * 1000000);
314
+		$date = new DateTime(date('Y-m-d H:i:s.'.$micro, $originalTime));
315
+
316
+		return $date->format($this->options['dateFormat']);
317
+	}
318
+
319
+	/**
320
+	 * Takes the given context and coverts it to a string.
321
+	 *
322
+	 * @param  array $context The Context
323
+	 * @return string
324
+	 */
325
+	protected function contextToString($context)
326
+	{
327
+		$export = '';
328
+		foreach ($context as $key => $value) {
329
+			$export .= "{$key}: ";
330
+			$export .= preg_replace(array(
331
+				'/=>\s+([a-zA-Z])/im',
332
+				'/array\(\s+\)/im',
333
+				'/^  |\G  /m'
334
+			), array(
335
+				'=> $1',
336
+				'array()',
337
+				'    '
338
+			), str_replace('array (', 'array(', var_export($value, true)));
339
+			$export .= PHP_EOL;
340
+		}
341
+		return str_replace(array('\\\\', '\\\''), array('\\', '\''), rtrim($export));
342
+	}
343
+
344
+	/**
345
+	 * Indents the given string with the given indent.
346
+	 *
347
+	 * @param  string $string The string to indent
348
+	 * @param  string $indent What to use as the indent.
349
+	 * @return string
350
+	 */
351
+	protected function indent($string, $indent = '    ')
352
+	{
353
+		return $indent.str_replace("\n", "\n".$indent, $string);
354
+	}
355 355
 }
Please login to merge, or discard this patch.
vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php 1 patch
Indentation   +148 added lines, -148 removed lines patch added patch discarded remove patch
@@ -27,164 +27,164 @@
 block discarded – undo
27 27
  */
28 28
 
29 29
 if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
30
-    define('RANDOM_COMPAT_READ_BUFFER', 8);
30
+	define('RANDOM_COMPAT_READ_BUFFER', 8);
31 31
 }
32 32
 
33 33
 if (!is_callable('random_bytes')) {
34
-    /**
35
-     * Unless open_basedir is enabled, use /dev/urandom for
36
-     * random numbers in accordance with best practices
37
-     *
38
-     * Why we use /dev/urandom and not /dev/random
39
-     * @ref https://www.2uo.de/myths-about-urandom
40
-     * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
41
-     *
42
-     * @param int $bytes
43
-     *
44
-     * @throws Exception
45
-     *
46
-     * @return string
47
-     */
48
-    function random_bytes($bytes)
49
-    {
50
-        /** @var resource $fp */
51
-        static $fp = null;
34
+	/**
35
+	 * Unless open_basedir is enabled, use /dev/urandom for
36
+	 * random numbers in accordance with best practices
37
+	 *
38
+	 * Why we use /dev/urandom and not /dev/random
39
+	 * @ref https://www.2uo.de/myths-about-urandom
40
+	 * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
41
+	 *
42
+	 * @param int $bytes
43
+	 *
44
+	 * @throws Exception
45
+	 *
46
+	 * @return string
47
+	 */
48
+	function random_bytes($bytes)
49
+	{
50
+		/** @var resource $fp */
51
+		static $fp = null;
52 52
 
53
-        /**
54
-         * This block should only be run once
55
-         */
56
-        if (empty($fp)) {
57
-            /**
58
-             * We don't want to ever read C:\dev\random, only /dev/urandom on
59
-             * Unix-like operating systems. While we guard against this
60
-             * condition in random.php, it doesn't hurt to be defensive in depth
61
-             * here.
62
-             *
63
-             * To that end, we only try to open /dev/urandom if we're on a Unix-
64
-             * like operating system (which means the directory separator is set
65
-             * to "/" not "\".
66
-             */
67
-            if (DIRECTORY_SEPARATOR === '/') {
68
-                if (!is_readable('/dev/urandom')) {
69
-                    throw new Exception(
70
-                        'Environment misconfiguration: ' .
71
-                        '/dev/urandom cannot be read.'
72
-                    );
73
-                }
74
-                /**
75
-                 * We use /dev/urandom if it is a char device.
76
-                 * We never fall back to /dev/random
77
-                 */
78
-                /** @var resource|bool $fp */
79
-                $fp = fopen('/dev/urandom', 'rb');
80
-                if (is_resource($fp)) {
81
-                    /** @var array<string, int> $st */
82
-                    $st = fstat($fp);
83
-                    if (($st['mode'] & 0170000) !== 020000) {
84
-                        fclose($fp);
85
-                        $fp = false;
86
-                    }
87
-                }
88
-            }
53
+		/**
54
+		 * This block should only be run once
55
+		 */
56
+		if (empty($fp)) {
57
+			/**
58
+			 * We don't want to ever read C:\dev\random, only /dev/urandom on
59
+			 * Unix-like operating systems. While we guard against this
60
+			 * condition in random.php, it doesn't hurt to be defensive in depth
61
+			 * here.
62
+			 *
63
+			 * To that end, we only try to open /dev/urandom if we're on a Unix-
64
+			 * like operating system (which means the directory separator is set
65
+			 * to "/" not "\".
66
+			 */
67
+			if (DIRECTORY_SEPARATOR === '/') {
68
+				if (!is_readable('/dev/urandom')) {
69
+					throw new Exception(
70
+						'Environment misconfiguration: ' .
71
+						'/dev/urandom cannot be read.'
72
+					);
73
+				}
74
+				/**
75
+				 * We use /dev/urandom if it is a char device.
76
+				 * We never fall back to /dev/random
77
+				 */
78
+				/** @var resource|bool $fp */
79
+				$fp = fopen('/dev/urandom', 'rb');
80
+				if (is_resource($fp)) {
81
+					/** @var array<string, int> $st */
82
+					$st = fstat($fp);
83
+					if (($st['mode'] & 0170000) !== 020000) {
84
+						fclose($fp);
85
+						$fp = false;
86
+					}
87
+				}
88
+			}
89 89
 
90
-            if (is_resource($fp)) {
91
-                /**
92
-                 * stream_set_read_buffer() does not exist in HHVM
93
-                 *
94
-                 * If we don't set the stream's read buffer to 0, PHP will
95
-                 * internally buffer 8192 bytes, which can waste entropy
96
-                 *
97
-                 * stream_set_read_buffer returns 0 on success
98
-                 */
99
-                if (is_callable('stream_set_read_buffer')) {
100
-                    stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
101
-                }
102
-                if (is_callable('stream_set_chunk_size')) {
103
-                    stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
104
-                }
105
-            }
106
-        }
90
+			if (is_resource($fp)) {
91
+				/**
92
+				 * stream_set_read_buffer() does not exist in HHVM
93
+				 *
94
+				 * If we don't set the stream's read buffer to 0, PHP will
95
+				 * internally buffer 8192 bytes, which can waste entropy
96
+				 *
97
+				 * stream_set_read_buffer returns 0 on success
98
+				 */
99
+				if (is_callable('stream_set_read_buffer')) {
100
+					stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
101
+				}
102
+				if (is_callable('stream_set_chunk_size')) {
103
+					stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
104
+				}
105
+			}
106
+		}
107 107
 
108
-        try {
109
-            /** @var int $bytes */
110
-            $bytes = RandomCompat_intval($bytes);
111
-        } catch (TypeError $ex) {
112
-            throw new TypeError(
113
-                'random_bytes(): $bytes must be an integer'
114
-            );
115
-        }
108
+		try {
109
+			/** @var int $bytes */
110
+			$bytes = RandomCompat_intval($bytes);
111
+		} catch (TypeError $ex) {
112
+			throw new TypeError(
113
+				'random_bytes(): $bytes must be an integer'
114
+			);
115
+		}
116 116
 
117
-        if ($bytes < 1) {
118
-            throw new Error(
119
-                'Length must be greater than 0'
120
-            );
121
-        }
117
+		if ($bytes < 1) {
118
+			throw new Error(
119
+				'Length must be greater than 0'
120
+			);
121
+		}
122 122
 
123
-        /**
124
-         * This if() block only runs if we managed to open a file handle
125
-         *
126
-         * It does not belong in an else {} block, because the above
127
-         * if (empty($fp)) line is logic that should only be run once per
128
-         * page load.
129
-         */
130
-        if (is_resource($fp)) {
131
-            /**
132
-             * @var int
133
-             */
134
-            $remaining = $bytes;
123
+		/**
124
+		 * This if() block only runs if we managed to open a file handle
125
+		 *
126
+		 * It does not belong in an else {} block, because the above
127
+		 * if (empty($fp)) line is logic that should only be run once per
128
+		 * page load.
129
+		 */
130
+		if (is_resource($fp)) {
131
+			/**
132
+			 * @var int
133
+			 */
134
+			$remaining = $bytes;
135 135
 
136
-            /**
137
-             * @var string|bool
138
-             */
139
-            $buf = '';
136
+			/**
137
+			 * @var string|bool
138
+			 */
139
+			$buf = '';
140 140
 
141
-            /**
142
-             * We use fread() in a loop to protect against partial reads
143
-             */
144
-            do {
145
-                /**
146
-                 * @var string|bool
147
-                 */
148
-                $read = fread($fp, $remaining);
149
-                if (!is_string($read)) {
150
-                    /**
151
-                     * We cannot safely read from the file. Exit the
152
-                     * do-while loop and trigger the exception condition
153
-                     *
154
-                     * @var string|bool
155
-                     */
156
-                    $buf = false;
157
-                    break;
158
-                }
159
-                /**
160
-                 * Decrease the number of bytes returned from remaining
161
-                 */
162
-                $remaining -= RandomCompat_strlen($read);
163
-                /**
164
-                 * @var string $buf
165
-                 */
166
-                $buf .= $read;
167
-            } while ($remaining > 0);
141
+			/**
142
+			 * We use fread() in a loop to protect against partial reads
143
+			 */
144
+			do {
145
+				/**
146
+				 * @var string|bool
147
+				 */
148
+				$read = fread($fp, $remaining);
149
+				if (!is_string($read)) {
150
+					/**
151
+					 * We cannot safely read from the file. Exit the
152
+					 * do-while loop and trigger the exception condition
153
+					 *
154
+					 * @var string|bool
155
+					 */
156
+					$buf = false;
157
+					break;
158
+				}
159
+				/**
160
+				 * Decrease the number of bytes returned from remaining
161
+				 */
162
+				$remaining -= RandomCompat_strlen($read);
163
+				/**
164
+				 * @var string $buf
165
+				 */
166
+				$buf .= $read;
167
+			} while ($remaining > 0);
168 168
 
169
-            /**
170
-             * Is our result valid?
171
-             * @var string|bool $buf
172
-             */
173
-            if (is_string($buf)) {
174
-                if (RandomCompat_strlen($buf) === $bytes) {
175
-                    /**
176
-                     * Return our random entropy buffer here:
177
-                     */
178
-                    return $buf;
179
-                }
180
-            }
181
-        }
169
+			/**
170
+			 * Is our result valid?
171
+			 * @var string|bool $buf
172
+			 */
173
+			if (is_string($buf)) {
174
+				if (RandomCompat_strlen($buf) === $bytes) {
175
+					/**
176
+					 * Return our random entropy buffer here:
177
+					 */
178
+					return $buf;
179
+				}
180
+			}
181
+		}
182 182
 
183
-        /**
184
-         * If we reach here, PHP has failed us.
185
-         */
186
-        throw new Exception(
187
-            'Error reading from source device'
188
-        );
189
-    }
183
+		/**
184
+		 * If we reach here, PHP has failed us.
185
+		 */
186
+		throw new Exception(
187
+			'Error reading from source device'
188
+		);
189
+	}
190 190
 }
Please login to merge, or discard this patch.
vendor/paragonie/random_compat/lib/random_int.php 1 patch
Indentation   +200 added lines, -200 removed lines patch added patch discarded remove patch
@@ -1,204 +1,204 @@
 block discarded – undo
1 1
 <?php
2 2
 
3 3
 if (!is_callable('random_int')) {
4
-    /**
5
-     * Random_* Compatibility Library
6
-     * for using the new PHP 7 random_* API in PHP 5 projects
7
-     *
8
-     * The MIT License (MIT)
9
-     *
10
-     * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
11
-     *
12
-     * Permission is hereby granted, free of charge, to any person obtaining a copy
13
-     * of this software and associated documentation files (the "Software"), to deal
14
-     * in the Software without restriction, including without limitation the rights
15
-     * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
-     * copies of the Software, and to permit persons to whom the Software is
17
-     * furnished to do so, subject to the following conditions:
18
-     *
19
-     * The above copyright notice and this permission notice shall be included in
20
-     * all copies or substantial portions of the Software.
21
-     *
22
-     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
-     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
-     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
-     * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
-     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
-     * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
-     * SOFTWARE.
29
-     */
30
-
31
-    /**
32
-     * Fetch a random integer between $min and $max inclusive
33
-     *
34
-     * @param int $min
35
-     * @param int $max
36
-     *
37
-     * @throws Exception
38
-     *
39
-     * @return int
40
-     */
41
-    function random_int($min, $max)
42
-    {
43
-        /**
44
-         * Type and input logic checks
45
-         *
46
-         * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
47
-         * (non-inclusive), it will sanely cast it to an int. If you it's equal to
48
-         * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats
49
-         * lose precision, so the <= and => operators might accidentally let a float
50
-         * through.
51
-         */
52
-
53
-        try {
54
-            /** @var int $min */
55
-            $min = RandomCompat_intval($min);
56
-        } catch (TypeError $ex) {
57
-            throw new TypeError(
58
-                'random_int(): $min must be an integer'
59
-            );
60
-        }
61
-
62
-        try {
63
-            /** @var int $max */
64
-            $max = RandomCompat_intval($max);
65
-        } catch (TypeError $ex) {
66
-            throw new TypeError(
67
-                'random_int(): $max must be an integer'
68
-            );
69
-        }
70
-
71
-        /**
72
-         * Now that we've verified our weak typing system has given us an integer,
73
-         * let's validate the logic then we can move forward with generating random
74
-         * integers along a given range.
75
-         */
76
-        if ($min > $max) {
77
-            throw new Error(
78
-                'Minimum value must be less than or equal to the maximum value'
79
-            );
80
-        }
81
-
82
-        if ($max === $min) {
83
-            return (int) $min;
84
-        }
85
-
86
-        /**
87
-         * Initialize variables to 0
88
-         *
89
-         * We want to store:
90
-         * $bytes => the number of random bytes we need
91
-         * $mask => an integer bitmask (for use with the &) operator
92
-         *          so we can minimize the number of discards
93
-         */
94
-        $attempts = $bits = $bytes = $mask = $valueShift = 0;
95
-        /** @var int $attempts */
96
-        /** @var int $bits */
97
-        /** @var int $bytes */
98
-        /** @var int $mask */
99
-        /** @var int $valueShift */
100
-
101
-        /**
102
-         * At this point, $range is a positive number greater than 0. It might
103
-         * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to
104
-         * a float and we will lose some precision.
105
-         *
106
-         * @var int|float $range
107
-         */
108
-        $range = $max - $min;
109
-
110
-        /**
111
-         * Test for integer overflow:
112
-         */
113
-        if (!is_int($range)) {
114
-
115
-            /**
116
-             * Still safely calculate wider ranges.
117
-             * Provided by @CodesInChaos, @oittaa
118
-             *
119
-             * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435
120
-             *
121
-             * We use ~0 as a mask in this case because it generates all 1s
122
-             *
123
-             * @ref https://eval.in/400356 (32-bit)
124
-             * @ref http://3v4l.org/XX9r5  (64-bit)
125
-             */
126
-            $bytes = PHP_INT_SIZE;
127
-            /** @var int $mask */
128
-            $mask = ~0;
129
-
130
-        } else {
131
-
132
-            /**
133
-             * $bits is effectively ceil(log($range, 2)) without dealing with
134
-             * type juggling
135
-             */
136
-            while ($range > 0) {
137
-                if ($bits % 8 === 0) {
138
-                    ++$bytes;
139
-                }
140
-                ++$bits;
141
-                $range >>= 1;
142
-                /** @var int $mask */
143
-                $mask = $mask << 1 | 1;
144
-            }
145
-            $valueShift = $min;
146
-        }
147
-
148
-        /** @var int $val */
149
-        $val = 0;
150
-        /**
151
-         * Now that we have our parameters set up, let's begin generating
152
-         * random integers until one falls between $min and $max
153
-         */
154
-        /** @psalm-suppress RedundantCondition */
155
-        do {
156
-            /**
157
-             * The rejection probability is at most 0.5, so this corresponds
158
-             * to a failure probability of 2^-128 for a working RNG
159
-             */
160
-            if ($attempts > 128) {
161
-                throw new Exception(
162
-                    'random_int: RNG is broken - too many rejections'
163
-                );
164
-            }
165
-
166
-            /**
167
-             * Let's grab the necessary number of random bytes
168
-             */
169
-            $randomByteString = random_bytes($bytes);
170
-
171
-            /**
172
-             * Let's turn $randomByteString into an integer
173
-             *
174
-             * This uses bitwise operators (<< and |) to build an integer
175
-             * out of the values extracted from ord()
176
-             *
177
-             * Example: [9F] | [6D] | [32] | [0C] =>
178
-             *   159 + 27904 + 3276800 + 201326592 =>
179
-             *   204631455
180
-             */
181
-            $val &= 0;
182
-            for ($i = 0; $i < $bytes; ++$i) {
183
-                $val |= ord($randomByteString[$i]) << ($i * 8);
184
-            }
185
-            /** @var int $val */
186
-
187
-            /**
188
-             * Apply mask
189
-             */
190
-            $val &= $mask;
191
-            $val += $valueShift;
192
-
193
-            ++$attempts;
194
-            /**
195
-             * If $val overflows to a floating point number,
196
-             * ... or is larger than $max,
197
-             * ... or smaller than $min,
198
-             * then try again.
199
-             */
200
-        } while (!is_int($val) || $val > $max || $val < $min);
201
-
202
-        return (int) $val;
203
-    }
4
+	/**
5
+	 * Random_* Compatibility Library
6
+	 * for using the new PHP 7 random_* API in PHP 5 projects
7
+	 *
8
+	 * The MIT License (MIT)
9
+	 *
10
+	 * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
11
+	 *
12
+	 * Permission is hereby granted, free of charge, to any person obtaining a copy
13
+	 * of this software and associated documentation files (the "Software"), to deal
14
+	 * in the Software without restriction, including without limitation the rights
15
+	 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+	 * copies of the Software, and to permit persons to whom the Software is
17
+	 * furnished to do so, subject to the following conditions:
18
+	 *
19
+	 * The above copyright notice and this permission notice shall be included in
20
+	 * all copies or substantial portions of the Software.
21
+	 *
22
+	 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+	 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+	 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+	 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+	 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+	 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+	 * SOFTWARE.
29
+	 */
30
+
31
+	/**
32
+	 * Fetch a random integer between $min and $max inclusive
33
+	 *
34
+	 * @param int $min
35
+	 * @param int $max
36
+	 *
37
+	 * @throws Exception
38
+	 *
39
+	 * @return int
40
+	 */
41
+	function random_int($min, $max)
42
+	{
43
+		/**
44
+		 * Type and input logic checks
45
+		 *
46
+		 * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
47
+		 * (non-inclusive), it will sanely cast it to an int. If you it's equal to
48
+		 * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats
49
+		 * lose precision, so the <= and => operators might accidentally let a float
50
+		 * through.
51
+		 */
52
+
53
+		try {
54
+			/** @var int $min */
55
+			$min = RandomCompat_intval($min);
56
+		} catch (TypeError $ex) {
57
+			throw new TypeError(
58
+				'random_int(): $min must be an integer'
59
+			);
60
+		}
61
+
62
+		try {
63
+			/** @var int $max */
64
+			$max = RandomCompat_intval($max);
65
+		} catch (TypeError $ex) {
66
+			throw new TypeError(
67
+				'random_int(): $max must be an integer'
68
+			);
69
+		}
70
+
71
+		/**
72
+		 * Now that we've verified our weak typing system has given us an integer,
73
+		 * let's validate the logic then we can move forward with generating random
74
+		 * integers along a given range.
75
+		 */
76
+		if ($min > $max) {
77
+			throw new Error(
78
+				'Minimum value must be less than or equal to the maximum value'
79
+			);
80
+		}
81
+
82
+		if ($max === $min) {
83
+			return (int) $min;
84
+		}
85
+
86
+		/**
87
+		 * Initialize variables to 0
88
+		 *
89
+		 * We want to store:
90
+		 * $bytes => the number of random bytes we need
91
+		 * $mask => an integer bitmask (for use with the &) operator
92
+		 *          so we can minimize the number of discards
93
+		 */
94
+		$attempts = $bits = $bytes = $mask = $valueShift = 0;
95
+		/** @var int $attempts */
96
+		/** @var int $bits */
97
+		/** @var int $bytes */
98
+		/** @var int $mask */
99
+		/** @var int $valueShift */
100
+
101
+		/**
102
+		 * At this point, $range is a positive number greater than 0. It might
103
+		 * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to
104
+		 * a float and we will lose some precision.
105
+		 *
106
+		 * @var int|float $range
107
+		 */
108
+		$range = $max - $min;
109
+
110
+		/**
111
+		 * Test for integer overflow:
112
+		 */
113
+		if (!is_int($range)) {
114
+
115
+			/**
116
+			 * Still safely calculate wider ranges.
117
+			 * Provided by @CodesInChaos, @oittaa
118
+			 *
119
+			 * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435
120
+			 *
121
+			 * We use ~0 as a mask in this case because it generates all 1s
122
+			 *
123
+			 * @ref https://eval.in/400356 (32-bit)
124
+			 * @ref http://3v4l.org/XX9r5  (64-bit)
125
+			 */
126
+			$bytes = PHP_INT_SIZE;
127
+			/** @var int $mask */
128
+			$mask = ~0;
129
+
130
+		} else {
131
+
132
+			/**
133
+			 * $bits is effectively ceil(log($range, 2)) without dealing with
134
+			 * type juggling
135
+			 */
136
+			while ($range > 0) {
137
+				if ($bits % 8 === 0) {
138
+					++$bytes;
139
+				}
140
+				++$bits;
141
+				$range >>= 1;
142
+				/** @var int $mask */
143
+				$mask = $mask << 1 | 1;
144
+			}
145
+			$valueShift = $min;
146
+		}
147
+
148
+		/** @var int $val */
149
+		$val = 0;
150
+		/**
151
+		 * Now that we have our parameters set up, let's begin generating
152
+		 * random integers until one falls between $min and $max
153
+		 */
154
+		/** @psalm-suppress RedundantCondition */
155
+		do {
156
+			/**
157
+			 * The rejection probability is at most 0.5, so this corresponds
158
+			 * to a failure probability of 2^-128 for a working RNG
159
+			 */
160
+			if ($attempts > 128) {
161
+				throw new Exception(
162
+					'random_int: RNG is broken - too many rejections'
163
+				);
164
+			}
165
+
166
+			/**
167
+			 * Let's grab the necessary number of random bytes
168
+			 */
169
+			$randomByteString = random_bytes($bytes);
170
+
171
+			/**
172
+			 * Let's turn $randomByteString into an integer
173
+			 *
174
+			 * This uses bitwise operators (<< and |) to build an integer
175
+			 * out of the values extracted from ord()
176
+			 *
177
+			 * Example: [9F] | [6D] | [32] | [0C] =>
178
+			 *   159 + 27904 + 3276800 + 201326592 =>
179
+			 *   204631455
180
+			 */
181
+			$val &= 0;
182
+			for ($i = 0; $i < $bytes; ++$i) {
183
+				$val |= ord($randomByteString[$i]) << ($i * 8);
184
+			}
185
+			/** @var int $val */
186
+
187
+			/**
188
+			 * Apply mask
189
+			 */
190
+			$val &= $mask;
191
+			$val += $valueShift;
192
+
193
+			++$attempts;
194
+			/**
195
+			 * If $val overflows to a floating point number,
196
+			 * ... or is larger than $max,
197
+			 * ... or smaller than $min,
198
+			 * then try again.
199
+			 */
200
+		} while (!is_int($val) || $val > $max || $val < $min);
201
+
202
+		return (int) $val;
203
+	}
204 204
 }
Please login to merge, or discard this patch.
vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php 1 patch
Indentation   +58 added lines, -58 removed lines patch added patch discarded remove patch
@@ -27,67 +27,67 @@
 block discarded – undo
27 27
  */
28 28
 
29 29
 if (!is_callable('random_bytes')) {
30
-    /**
31
-     * If the libsodium PHP extension is loaded, we'll use it above any other
32
-     * solution.
33
-     *
34
-     * libsodium-php project:
35
-     * @ref https://github.com/jedisct1/libsodium-php
36
-     *
37
-     * @param int $bytes
38
-     *
39
-     * @throws Exception
40
-     *
41
-     * @return string
42
-     */
43
-    function random_bytes($bytes)
44
-    {
45
-        try {
46
-            /** @var int $bytes */
47
-            $bytes = RandomCompat_intval($bytes);
48
-        } catch (TypeError $ex) {
49
-            throw new TypeError(
50
-                'random_bytes(): $bytes must be an integer'
51
-            );
52
-        }
30
+	/**
31
+	 * If the libsodium PHP extension is loaded, we'll use it above any other
32
+	 * solution.
33
+	 *
34
+	 * libsodium-php project:
35
+	 * @ref https://github.com/jedisct1/libsodium-php
36
+	 *
37
+	 * @param int $bytes
38
+	 *
39
+	 * @throws Exception
40
+	 *
41
+	 * @return string
42
+	 */
43
+	function random_bytes($bytes)
44
+	{
45
+		try {
46
+			/** @var int $bytes */
47
+			$bytes = RandomCompat_intval($bytes);
48
+		} catch (TypeError $ex) {
49
+			throw new TypeError(
50
+				'random_bytes(): $bytes must be an integer'
51
+			);
52
+		}
53 53
 
54
-        if ($bytes < 1) {
55
-            throw new Error(
56
-                'Length must be greater than 0'
57
-            );
58
-        }
54
+		if ($bytes < 1) {
55
+			throw new Error(
56
+				'Length must be greater than 0'
57
+			);
58
+		}
59 59
 
60
-        /**
61
-         * @var string
62
-         */
63
-        $buf = '';
60
+		/**
61
+		 * @var string
62
+		 */
63
+		$buf = '';
64 64
 
65
-        /**
66
-         * \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
67
-         * generated in one invocation.
68
-         */
69
-        if ($bytes > 2147483647) {
70
-            for ($i = 0; $i < $bytes; $i += 1073741824) {
71
-                $n = ($bytes - $i) > 1073741824
72
-                    ? 1073741824
73
-                    : $bytes - $i;
74
-                $buf .= Sodium::randombytes_buf((int) $n);
75
-            }
76
-        } else {
77
-            $buf .= Sodium::randombytes_buf((int) $bytes);
78
-        }
65
+		/**
66
+		 * \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
67
+		 * generated in one invocation.
68
+		 */
69
+		if ($bytes > 2147483647) {
70
+			for ($i = 0; $i < $bytes; $i += 1073741824) {
71
+				$n = ($bytes - $i) > 1073741824
72
+					? 1073741824
73
+					: $bytes - $i;
74
+				$buf .= Sodium::randombytes_buf((int) $n);
75
+			}
76
+		} else {
77
+			$buf .= Sodium::randombytes_buf((int) $bytes);
78
+		}
79 79
 
80
-        if (is_string($buf)) {
81
-            if (RandomCompat_strlen($buf) === $bytes) {
82
-                return $buf;
83
-            }
84
-        }
80
+		if (is_string($buf)) {
81
+			if (RandomCompat_strlen($buf) === $bytes) {
82
+				return $buf;
83
+			}
84
+		}
85 85
 
86
-        /**
87
-         * If we reach here, PHP has failed us.
88
-         */
89
-        throw new Exception(
90
-            'Could not gather sufficient random data'
91
-        );
92
-    }
86
+		/**
87
+		 * If we reach here, PHP has failed us.
88
+		 */
89
+		throw new Exception(
90
+			'Could not gather sufficient random data'
91
+		);
92
+	}
93 93
 }
Please login to merge, or discard this patch.