13693261870
2022-09-16 354b3dbfbffb3df45212a2a44dbbf48b4acc2594
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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
<?php
require('config.php');
 
class BogusAction {
    public $action;
    public $method;
    public $data;
    public $tid;
}
 
$isForm = false;
$isUpload = false;
if(isset($HTTP_RAW_POST_DATA)){
    header('Content-Type: text/javascript');
    $data = json_decode($HTTP_RAW_POST_DATA);
}else if(isset($_POST['extAction'])){ // form post
    $isForm = true;
    $isUpload = $_POST['extUpload'] == 'true';
    $data = new BogusAction();
    $data->action = $_POST['extAction'];
    $data->method = $_POST['extMethod'];
    $data->tid = isset($_POST['extTID']) ? $_POST['extTID'] : null; // not set for upload
    $data->data = array($_POST, $_FILES);
}else{
    die('Invalid request.');
}
 
function doRpc($cdata){
    global $API;
    try {
        if(!isset($API[$cdata->action])){
            throw new Exception('Call to undefined action: ' . $cdata->action);
        }
 
        $action = $cdata->action;
        $a = $API[$action];
 
        doAroundCalls($a['before'], $cdata);
 
        $method = $cdata->method;
        $mdef = $a['methods'][$method];
        if(!$mdef){
            throw new Exception("Call to undefined method: $method on action $action");
        }
        doAroundCalls($mdef['before'], $cdata);
 
        $r = array(
            'type'=>'rpc',
            'tid'=>$cdata->tid,
            'action'=>$action,
            'method'=>$method
        );
 
        require_once("classes/$action.php");
        $o = new $action();
        if (isset($mdef['len'])) {
            $params = isset($cdata->data) && is_array($cdata->data) ? $cdata->data : array();
        } else {
            $params = array($cdata->data);
        }
 
        $r['result'] = call_user_func_array(array($o, $method), $params);
 
        doAroundCalls($mdef['after'], $cdata, $r);
        doAroundCalls($a['after'], $cdata, $r);
    }
    catch(Exception $e){
        $r['type'] = 'exception';
        $r['message'] = $e->getMessage();
        $r['where'] = $e->getTraceAsString();
    }
    return $r;
}
 
 
function doAroundCalls(&$fns, &$cdata, &$returnData=null){
    if(!$fns){
        return;
    }
    if(is_array($fns)){
        foreach($fns as $f){
            $f($cdata, $returnData);
        }
    }else{
        $fns($cdata, $returnData);
    }
}
 
$response = null;
if(is_array($data)){
    $response = array();
    foreach($data as $d){
        $response[] = doRpc($d);
    }
}else{
    $response = doRpc($data);
}
if($isForm && $isUpload){
    echo '<html><body><textarea>';
    echo json_encode($response);
    echo '</textarea></body></html>';
}else{
    echo json_encode($response);
}