Passed
Push — main ( 405ee4...25b418 )
by Miaad
01:25
created

webhook::checkSecret()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 5
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 3
nc 2
nop 0
1
<?php
2
3
namespace BPT\receiver;
4
5
use BPT\api\telegram;
6
use BPT\BPT;
7
use BPT\constants\loggerTypes;
8
use BPT\exception\bptException;
9
use BPT\lock;
10
use BPT\logger;
11
use BPT\settings;
12
use BPT\tools;
13
use CURLFile;
14
15
class webhook extends receiver {
16
    public static function init () {
17
        if (settings::$multi) {
18
            multi::init();
19
        }
20
        else {
21
            if (lock::exist('BPT-HOOK')) {
22
                self::checkSecret();
23
                receiver::telegramVerify();
24
                receiver::processUpdate();
25
                logger::write('Update received , lets process it ;)');
26
            }
27
            else {
28
                self::deleteOldLocks();
29
                self::checkURL();
30
                self::setCertificate();
31
                $url = self::setURL();
32
                $secret = tools::randomString(64);
33
                self::setWebhook($url,$secret);
34
                lock::save('BPT-HOOK',$secret);
35
                BPT::exit('Done');
36
            }
37
        }
38
    }
39
40
    private static function deleteOldLocks() {
41
        if (lock::exist('BPT-MULTI-EXEC')) {
42
            lock::delete('BPT-MULTI-EXEC');
43
        }
44
        if (lock::exist('BPT-MULTI-CURL')) {
45
            lock::delete('BPT-MULTI-CURL');
46
        }
47
        if (lock::exist('getUpdate')) {
48
            lock::delete('getUpdate');
49
        }
50
    }
51
52
    protected static function setWebhook(string $url,string $secret = '') {
53
        $res = telegram::setWebhook($url, settings::$certificate, max_connections:settings::$max_connection, allowed_updates : settings::$allowed_updates, secret_token: $secret);
54
        if (telegram::$status) {
55
            logger::write('Webhook was set successfully',loggerTypes::INFO);
56
        }
57
        else {
58
            logger::write("There is some problem happened , telegram response : \n".json_encode($res),loggerTypes::ERROR);
59
            BPT::exit(print_r($res,true));
0 ignored issues
show
Bug introduced by
It seems like print_r($res, true) can also be of type true; however, parameter $message of BPT\BPT::exit() does only seem to accept null|string, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

59
            BPT::exit(/** @scrutinizer ignore-type */ print_r($res,true));
Loading history...
60
        }
61
    }
62
63
    protected static function checkURL() {
64
        if (!(isset($_SERVER['SERVER_NAME']) && isset($_SERVER['REQUEST_URI']))) {
65
            logger::write('For using webhook receiver , you should open this file in your webserver(by domain)',loggerTypes::ERROR);
66
            throw new bptException('WEBHOOK_NEED_URL');
67
        }
68
    }
69
70
    private static function setURL(): string {
71
        return (isset(settings::$certificate) ? 'http://' : 'https://') . $_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_NAME'];
72
    }
73
74
    protected static function setCertificate() {
75
        if (isset(settings::$certificate)) {
76
            if (is_string(settings::$certificate)) {
77
                if (file_exists(settings::$certificate)) {
78
                    settings::$certificate = new CURLFile(settings::$certificate);
79
                }
80
                else {
81
                    settings::$certificate = null;
82
                }
83
            }
84
        }
85
    }
86
87
    private static function checkSecret() {
88
        $secret = lock::read('BPT-HOOK');
89
        if (!isset($_SERVER['HTTP_X_TELEGRAM_BOT_API_SECRET_TOKEN']) || $_SERVER['HTTP_X_TELEGRAM_BOT_API_SECRET_TOKEN'] != $secret) {
90
            logger::write('not authorized access denied. IP : '. $_SERVER['REMOTE_ADDR'] ?? 'unknown',loggerTypes::WARNING);
91
            BPT::exit();
92
        }
93
    }
94
}