This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | namespace NotificationChannels\Gammu\Drivers; |
||
4 | |||
5 | use Illuminate\Contracts\Config\Repository; |
||
6 | use NotificationChannels\Gammu\Models\Outbox; |
||
7 | use NotificationChannels\Gammu\Models\OutboxMultipart; |
||
8 | use NotificationChannels\Gammu\Models\Phone; |
||
9 | use NotificationChannels\Gammu\Exceptions\CouldNotSendNotification; |
||
10 | use Exception; |
||
11 | |||
12 | class DbDriver extends DriverAbstract |
||
13 | { |
||
14 | protected $config; |
||
15 | |||
16 | protected $outbox; |
||
17 | |||
18 | protected $multipart; |
||
19 | |||
20 | protected $phone; |
||
21 | |||
22 | protected $data = []; |
||
23 | |||
24 | protected $chunks = []; |
||
25 | |||
26 | public $isLongSms = false; |
||
27 | |||
28 | public $sender; |
||
29 | |||
30 | private $minLongSmsChar = 160; |
||
31 | |||
32 | 20 | public function __construct( |
|
33 | Repository $config, Outbox $outbox, OutboxMultipart $multipart, Phone $phone |
||
34 | ) { |
||
35 | 20 | $this->config = $config; |
|
36 | 20 | $this->outbox = $outbox; |
|
37 | 20 | $this->multipart = $multipart; |
|
38 | 20 | $this->phone = $phone; |
|
39 | |||
40 | 20 | $this->data['CreatorID'] = $this->getSignature(); |
|
41 | 20 | } |
|
42 | |||
43 | 1 | public function send($phoneNumber, $content, $sender = null, $callback = null) |
|
44 | { |
||
45 | 1 | $this->setDestination($phoneNumber); |
|
46 | 1 | $this->setContent($content); |
|
47 | 1 | $this->setSender($sender); |
|
48 | |||
49 | // Check Destination |
||
50 | 1 | $this->getDestination(); |
|
51 | |||
52 | 1 | $outbox = $this->outbox->create($this->data); |
|
0 ignored issues
–
show
|
|||
53 | |||
54 | 1 | if (! empty($this->chunks) && ! empty($outbox->ID)) { |
|
55 | foreach ($this->chunks as $chunk) { |
||
56 | $chunk['ID'] = $outbox->ID; |
||
57 | $this->multipart->create($chunk); |
||
0 ignored issues
–
show
The method
create() does not exist on NotificationChannels\Gammu\Models\OutboxMultipart . Did you maybe mean created() ?
This check marks calls to methods that do not seem to exist on an object. This is most likely the result of a method being renamed without all references to it being renamed likewise. ![]() |
|||
58 | } |
||
59 | } |
||
60 | 1 | } |
|
61 | |||
62 | 3 | public function setDestination($phoneNumber) |
|
63 | { |
||
64 | 3 | if (empty($phoneNumber)) { |
|
65 | 1 | throw CouldNotSendNotification::destinationNotProvided(); |
|
66 | } |
||
67 | |||
68 | 2 | $this->data['DestinationNumber'] = $this->destination = trim($phoneNumber); |
|
69 | |||
70 | 2 | return $this; |
|
71 | } |
||
72 | |||
73 | 3 | public function getDestination() |
|
74 | { |
||
75 | 3 | if (empty($this->data['DestinationNumber'])) { |
|
76 | 1 | throw CouldNotSendNotification::destinationNotProvided(); |
|
77 | } |
||
78 | |||
79 | 2 | return $this->destination; |
|
80 | } |
||
81 | |||
82 | 5 | public function setContent($content) |
|
83 | { |
||
84 | 5 | if (empty($content)) { |
|
85 | 1 | throw CouldNotSendNotification::contentNotProvided(); |
|
86 | } |
||
87 | |||
88 | 4 | $this->content = $content; |
|
89 | |||
90 | 4 | if (strlen($content) > $this->minLongSmsChar) { |
|
91 | 1 | $this->parseLongMessage($content); |
|
92 | } else { |
||
93 | 3 | $this->data['TextDecoded'] = $content; |
|
94 | } |
||
95 | |||
96 | 4 | return $this; |
|
97 | } |
||
98 | |||
99 | 3 | public function getContent() |
|
100 | { |
||
101 | 3 | if (empty($this->content)) { |
|
102 | 1 | throw CouldNotSendNotification::contentNotProvided(); |
|
103 | } |
||
104 | |||
105 | 2 | return $this->content; |
|
106 | } |
||
107 | |||
108 | 2 | public function setSender($sender = null) |
|
109 | { |
||
110 | 2 | if (empty($sender)) { |
|
111 | 1 | $sender = $this->getDefaultSender(); |
|
112 | } |
||
113 | |||
114 | 1 | $senders = $this->getSendersArray(); |
|
115 | |||
116 | 1 | if (! in_array($sender, $senders)) { |
|
117 | return $this->getSender(); |
||
118 | } |
||
119 | |||
120 | 1 | $this->data['SenderID'] = $this->sender = $sender; |
|
121 | |||
122 | 1 | return $this; |
|
123 | } |
||
124 | |||
125 | 9 | public function getSender() |
|
126 | { |
||
127 | 9 | if (empty($this->sender)) { |
|
128 | 8 | $this->sender = $this->getDefaultSender(); |
|
129 | } |
||
130 | |||
131 | 7 | return $this->sender; |
|
132 | } |
||
133 | |||
134 | 9 | private function getDefaultSender() |
|
135 | { |
||
136 | 9 | $sender = $this->config->get('services.gammu.sender'); |
|
137 | |||
138 | 9 | $senders = $this->getSendersArray(); |
|
139 | |||
140 | 6 | if (in_array($sender, $senders)) { |
|
141 | 2 | $this->sender = $sender; |
|
142 | |||
143 | 2 | return $this->sender; |
|
144 | } |
||
145 | |||
146 | try { |
||
147 | 4 | return $this->phone->where('Send', 'yes')->firstOrFail()->ID; |
|
0 ignored issues
–
show
The method
where does not exist on object<NotificationChannels\Gammu\Models\Phone> ? Since you implemented __call , maybe consider adding a @method annotation.
If you implement This is often the case, when class ParentClass {
private $data = array();
public function __call($method, array $args) {
if (0 === strpos($method, 'get')) {
return $this->data[strtolower(substr($method, 3))];
}
throw new \LogicException(sprintf('Unsupported method: %s', $method));
}
}
/**
* If this class knows which fields exist, you can specify the methods here:
*
* @method string getName()
*/
class SomeClass extends ParentClass { }
![]() |
|||
148 | } catch (Exception $e) { |
||
149 | throw CouldNotSendNotification::senderNotProvided(); |
||
150 | } |
||
151 | } |
||
152 | |||
153 | 10 | private function getSendersArray() |
|
154 | { |
||
155 | 10 | $senders = $this->phone->where('Send', 'yes')->get()->pluck('ID')->toArray(); |
|
0 ignored issues
–
show
The method
where does not exist on object<NotificationChannels\Gammu\Models\Phone> ? Since you implemented __call , maybe consider adding a @method annotation.
If you implement This is often the case, when class ParentClass {
private $data = array();
public function __call($method, array $args) {
if (0 === strpos($method, 'get')) {
return $this->data[strtolower(substr($method, 3))];
}
throw new \LogicException(sprintf('Unsupported method: %s', $method));
}
}
/**
* If this class knows which fields exist, you can specify the methods here:
*
* @method string getName()
*/
class SomeClass extends ParentClass { }
![]() |
|||
156 | |||
157 | 10 | if (empty($senders)) { |
|
158 | 3 | throw CouldNotSendNotification::senderNotProvided(); |
|
159 | } |
||
160 | |||
161 | 7 | return $senders; |
|
162 | } |
||
163 | |||
164 | /** |
||
165 | * Generate UDH part for long SMS. |
||
166 | * |
||
167 | * @link https://en.wikipedia.org/wiki/Concatenated_SMS#Sending_a_concatenated_SMS_using_a_User_Data_Header |
||
168 | * |
||
169 | * @return string |
||
170 | */ |
||
171 | 2 | private function generateUDH($total = 2, $sequence = 2, $ref = 0) |
|
172 | { |
||
173 | // Length of User Data Header, in this case 05 |
||
174 | 2 | $octet1 = '05'; |
|
175 | |||
176 | // Information Element Identifier, equal to 00 (Concatenated short messages, 8-bit reference number) |
||
177 | 2 | $octet2 = '00'; |
|
178 | |||
179 | // Length of the header, excluding the first two fields; equal to 03 |
||
180 | 2 | $octet3 = '03'; |
|
181 | |||
182 | // CSMS reference number, must be same for all the SMS parts in the CSMS |
||
183 | 2 | $octet4 = str_pad(dechex($ref), 2, '0', STR_PAD_LEFT); |
|
184 | |||
185 | // Total number of parts |
||
186 | 2 | $octet5 = str_pad(dechex($total), 2, '0', STR_PAD_LEFT); |
|
187 | |||
188 | // Part sequence |
||
189 | 2 | $octet6 = str_pad(dechex($sequence), 2, '0', STR_PAD_LEFT); |
|
190 | |||
191 | 2 | $udh = collect([ |
|
192 | 2 | $octet1, $octet2, $octet3, $octet4, $octet5, $octet6, |
|
193 | 2 | ])->implode(''); |
|
194 | |||
195 | 2 | return strtoupper($udh); |
|
196 | } |
||
197 | |||
198 | 3 | protected function parseLongMessage($content) |
|
199 | { |
||
200 | 3 | if (strlen($content) <= $this->minLongSmsChar) { |
|
201 | 1 | return $this; |
|
202 | } |
||
203 | |||
204 | // Parse message to chunks |
||
205 | // @ref: http://www.nowsms.com/long-sms-text-messages-and-the-160-character-limit |
||
206 | 2 | $messages = str_split($content, 153); |
|
207 | 2 | $messages = collect($messages); |
|
208 | 2 | $messagesCount = $messages->count(); |
|
209 | |||
210 | // Get first message |
||
211 | 2 | $firstChunk = $messages->shift(); |
|
212 | |||
213 | // Generate UDH |
||
214 | 2 | $ref = mt_rand(0, 255); |
|
215 | 2 | $i = 1; |
|
216 | 2 | $firstUDH = $this->generateUDH($messagesCount, $i, $ref); |
|
217 | 2 | ++$i; |
|
218 | |||
219 | 2 | $this->data['TextDecoded'] = $firstChunk; |
|
220 | 2 | $this->data['UDH'] = $firstUDH; |
|
221 | 2 | $this->data['MultiPart'] = 'true'; |
|
222 | |||
223 | 2 | foreach ($messages as $chunk) { |
|
224 | 2 | array_push($this->chunks, [ |
|
225 | 2 | 'UDH' => $this->generateUDH($messagesCount, $i, $ref), |
|
226 | 2 | 'TextDecoded' => $chunk, |
|
227 | 2 | 'SequencePosition' => $i, |
|
228 | ]); |
||
229 | 2 | ++$i; |
|
230 | } |
||
231 | |||
232 | 2 | $this->isLongSms = true; |
|
233 | |||
234 | 2 | return $this; |
|
235 | } |
||
236 | } |
||
237 |
This check marks calls to methods that do not seem to exist on an object.
This is most likely the result of a method being renamed without all references to it being renamed likewise.