Passed
Push — development ( fb8b55...b814ca )
by Nils
08:04
created
Severity
1
<?php
2
/**
3
 * @package       otv.php
4
 * @author        Nils Laumaillé <[email protected]>
5
 * @version       2.1.27
6
 * @copyright     2009-2018 Nils Laumaillé
7
 * @license       GNU GPL-3.0
8
 * @link          https://www.teampass.net
9
 *
10
 * This library is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13
 */
14
15
require_once('sources/SecureHandler.php');
16
if (!isset($_SESSION['CPM']) || $_SESSION['CPM'] != 1) {
17
    die('Hacking attempt...');
18
}
19
20
// Load config
21
if (file_exists('../includes/config/tp.config.php')) {
22
    include_once '../includes/config/tp.config.php';
23
} elseif (file_exists('./includes/config/tp.config.php')) {
24
    include_once './includes/config/tp.config.php';
25
} else {
26
    throw new Exception("Error file '/includes/config/tp.config.php' not exists", 1);
27
}
28
29
$html = "";
30
if (filter_var($_GET['code'], FILTER_SANITIZE_STRING) !== false
31
    && filter_var($_GET['stamp'], FILTER_VALIDATE_INT) !== false
32
) {
33
    //Include files
34
    require_once $SETTINGS['cpassman_dir'].'/includes/config/settings.php';
35
    require_once $SETTINGS['cpassman_dir'].'/includes/config/include.php';
36
    require_once $SETTINGS['cpassman_dir'].'/sources/SplClassLoader.php';
37
    require_once $SETTINGS['cpassman_dir'].'/sources/main.functions.php';
38
39
    // connect to DB
40
    require_once $SETTINGS['cpassman_dir'].'/includes/libraries/Database/Meekrodb/db.class.php';
41
    $pass = defuse_return_decrypted($pass);
42
DB::$host = $server;
43
    DB::$user = $user;
44
    DB::$password = $pass;
45
    DB::$dbName = $database;
46
    DB::$port = $port;
47
    DB::$encoding = $encoding;
48
    DB::$error_handler = true;
49
    $link = mysqli_connect($server, $user, $pass, $database, $port);
50
    $link->set_charset($encoding);
51
52
    if (!isset($SETTINGS['otv_is_enabled']) || $SETTINGS['otv_is_enabled'] === "0") {
53
        echo '<div style="padding:10px; margin:90px 30px 30px 30px; text-align:center;" class="ui-widget-content ui-state-error ui-corner-all"><i class="fa fa-warning fa-2x"></i>&nbsp;One-Time-View is not allowed!</div>';
54
    }
55
56
    // check session validity
57
    $data = DB::queryfirstrow(
58
        "SELECT id, timestamp, code, item_id FROM ".prefix_table("otv")."
59
        WHERE code = %s",
60
        $_GET['code']
61
    );
62
    if ($data['timestamp'] == intval($_GET['stamp'])) {
63
        // otv is too old
64
        if ($data['timestamp'] < (time() - ($SETTINGS['otv_expiration_period'] * 86400))) {
65
            $html = "Link is too old!";
66
        } else {
67
            // get from DB
68
            $dataItem = DB::queryfirstrow(
69
                "SELECT *
70
                FROM ".prefix_table("items")." as i
71
                INNER JOIN ".prefix_table("log_items")." as l ON (l.id_item = i.id)
72
                WHERE i.id = %i AND l.action = %s",
73
                intval($data['item_id']),
74
                'at_creation'
75
            );
76
77
            // is Item still valid regarding number of times being seen
78
            // Decrement the number before being deleted
79
            $dataDelete = DB::queryfirstrow(
80
                "SELECT * FROM ".prefix_table("automatic_del")." WHERE item_id=%i",
81
                $data['item_id']
82
            );
83
            if (isset($SETTINGS['enable_delete_after_consultation']) && $SETTINGS['enable_delete_after_consultation'] == 1) {
84
                if ($dataDelete['del_enabled'] == 1) {
85
                    if ($dataDelete['del_type'] == 1 && $dataDelete['del_value'] >= 1) {
86
                        // decrease counter
87
                        DB::update(
88
                            $pre."automatic_del",
89
                            array(
90
                                'del_value' => $dataDelete['del_value'] - 1
91
                                ),
92
                            "item_id = %i",
93
                            $data['item_id']
94
                        );
95
                    } elseif ($dataDelete['del_type'] == 1 && $dataDelete['del_value'] <= 1
0 ignored issues
show
Consider adding parentheses for clarity. Current Interpretation: ($dataDelete['del_type']...e['del_value'] < time(), Probably Intended Meaning: $dataDelete['del_type'] ...['del_value'] < time())
Loading history...
96
                        || $dataDelete['del_type'] == 2 && $dataDelete['del_value'] < time()
97
                    ) {
98
                        // delete item
99
                        DB::delete($pre."automatic_del", "item_id = %i", $data['item_id']);
100
                        // make inactive object
101
                        DB::update(
102
                            prefix_table("items"),
103
                            array(
104
                                'inactif' => '1',
105
                                ),
106
                            "id = %i",
107
                            $data['item_id']
108
                        );
109
                        // log
110
                        logItems(
111
                            $data['item_id'],
112
                            $dataItem['label'],
113
                            OTV_USER_ID,
114
                            'at_delete',
115
                            'otv',
116
                            'at_automatically_deleted'
117
                        );
118
119
                        echo '<div style="padding:10px; margin:90px 30px 30px 30px; text-align:center;" class="ui-widget-content ui-state-error ui-corner-all"><i class="fa fa-warning fa-2x"></i>&nbsp;'.
120
                        addslashes($LANG['not_allowed_to_see_pw_is_expired']).'</div>';
121
                        return false;
122
                    }
123
                }
124
            }
125
126
            // get data
127
            $pw = cryption($dataItem['pw'], "", "decrypt");
128
            $label = $dataItem['label'];
129
            $email = $dataItem['email'];
130
            $url = $dataItem['url'];
131
            $description = preg_replace('/(?<!\\r)\\n+(?!\\r)/', '', strip_tags($dataItem['description'], $SETTINGS_EXT['allowedTags']));
132
            $login = str_replace('"', '&quot;', $dataItem['login']);
133
134
            // display data
135
            $html = "<div style='margin:30px;'>".
136
                "<div style='font-size:20px;font-weight:bold;'>Welcome to One-Time item view page.</div>".
137
                "<div style='font-style:italic;'>Here are the details of the Item that has been shared to you</div>".
138
                "<div style='margin-top:10px;'><table>".
139
                "<tr><td>Label:</td><td>".$label."</td></tr>".
140
                "<tr><td>Password:</td><td>".htmlspecialchars($pw['string'])."</td></tr>".
141
                "<tr><td>Description:</td><td>".$description."</td></tr>".
142
                "<tr><td>login:</td><td>".$login."</td></tr>".
143
                "<tr><td>URL:</td><td>".$url."</td></tr>".
144
                "</table></div>".
145
                "<div style='margin-top:30px;'>Copy carefully the data you need. This page is only visible once.</div>".
146
                "</div>";
147
148
            // log
149
            logItems(
150
                $data['item_id'],
151
                $dataItem['label'],
152
                OTV_USER_ID,
153
                'at_shown',
154
                'otv'
155
            );
156
157
            // delete entry
158
            DB::delete(prefix_table("otv"), "id = %i", $data['id']);
159
160
            // display
161
            echo $html;
162
        }
163
    } else {
164
        echo '<div style="padding:10px; margin:90px 30px 30px 30px; text-align:center;" class="ui-widget-content ui-state-error ui-corner-all"><i class="fa fa-warning fa-2x"></i>&nbsp;Not a valid page!</div>';
165
    }
166
} else {
167
    echo '<div style="padding:10px; margin:90px 30px 30px 30px; text-align:center;" class="ui-widget-content ui-state-error ui-corner-all"><i class="fa fa-warning fa-2x"></i>&nbsp;No valid OTV inputs!</div>';
168
}
169