/
login_check.php
224 lines (195 loc) · 8.17 KB
/
login_check.php
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<?php declare(strict_types=1);
set_include_path(get_include_path().PATH_SEPARATOR.'luokat/');
spl_autoload_extensions('.class.php');
spl_autoload_register();
//require 'tecdoc.php';
/**
* Tarkistaa käyttäjän käyttöoikeuden sivustoon, keskitetysti yhdessä funktiossa.
* Tarkistaa salasanan, aktiivisuuden, ja demo-tilanteen, siinä järjestyksessä.
* @param stdClass $user <p> Käyttää salasana_hajautus-, aktiivinen-, demo-, ja voimassaolopvm-muuttujia
* @param string $user_password <p> käyttäjän antama salasana
* @param bool $skip_pw_check [optional] <p> jos pw_reset, niin salasanaa ei tarvitse tarkistaa.
* Huom. jos TRUE, ei tarkista salasanaa!
*/
function beginning_user_checks( User $user, string $user_password, bool $skip_pw_check = false ) {
if ( !$skip_pw_check ) {
if ( !password_verify($user_password, $user->salasana_hajautus) ) {
header("Location:index.php?redir=2");
exit; //Salasana väärin
}
}
if ( !$user->aktiivinen ) { // Tarkistetaan käyttäjän aktiivisuus
header( "Location:index.php?redir=3" );
exit; //Käyttäjä de-aktivoitu
}
if ( $user->demo ) { // Onko käyttäjätunnus väliaikainen
//tarkistetaan, onko kokeilujakso loppunut
if ( new DateTime( $user->voimassaolopvm ) < new DateTime() ) {
header( "Location:index.php?redir=9" );
exit(); //Käyttöoikeus vanhentunut
}
}
}
/**
* Tarkistaa käyttäjän IP:n ja lähettää ylläpitäjälle sähköpostin epäilyttävästä käytöksestä.
* Lisäksi, jos löytää uuden sijainnin, päivittää sen tietokantaan.
* Huom. toimii vain staattisilla IP-osoitteilla.
* @param DByhteys $db
* @param stdClass $user <p> Käyttää viime_sijainti-muuttujaa.
*/
function check_IP_address( DByhteys $db, User $user ) {
$ip = RemoteAddress::getIpAddress(); //Haetaan asiakkaan IP-osoite
$details = json_decode( file_get_contents( "http://ipinfo.io/{$ip}" ) );
//Haetaan kaupunki lähettämällä asiakkaan ip ipinfo.io serverille
$nykyinen_sijainti = $details->city;
if ( $nykyinen_sijainti != "" ) { //Jos sijainti tiedossa
if ( $user->viime_sijainti != "" ) {
$match = strcmp( $nykyinen_sijainti, $user->viime_sijainti );
if ( $match != 0 ) {
Email::lahetaIlmoitus_EpailyttavaIP( $user, $user->viime_sijainti, $nykyinen_sijainti );
}
}
//päivitetään sijainti tietokantaan
$sql = "UPDATE kayttaja SET viime_sijainti = $nykyinen_sijainti WHERE sahkoposti = ?";
$db->query( $sql, [ $user->sahkoposti ] );
}
}
/**
* Resetoidaan käyttäjän salasana, joko käyttäjän toimesta, tai ylläpidollisista syistä.
* Lähettää käyttäjälle linkin sähköpostilla pw_reset-sivulle, tai jos salasana vanhentunut:
* ohjaa suoraan kyseiselle sivulle.
* @param DByhteys $db
* @param stdClass $user <p> Käyttää id-, sahkoposti-muuttujia.
* @param string $reset_mode <p> onko kyseessä 'reset' vai 'expired'. Eka lähettää linkin, toka ohjaa suoraan.
*/
function password_reset( DByhteys $db, User $user, string $reset_mode ) {
$key = GUID();
$key_hashed = sha1( $key );
$sql = "INSERT INTO pw_reset (kayttaja_id, reset_key_hash) VALUES ( ?, ? )";
$db->query( $sql, [ $user->id, $key_hashed ] );
if ( $reset_mode === "vanhentunut" ) { //Jos salasana vanhentunut, ohjataan suoraan salasananvaihtosivulle
$_SESSION['feedback'] = "<p class='info'>Salasana on vanhentunut.<br>Ole hyvä ja luo uusi salasana.</p>";
header( "Location:pw_reset.php?id={$key}" );
exit;
}
elseif ( $reset_mode === "uusittava" ) { //Jos salasana vanhentunut, ohjataan suoraan salasananvaihtosivulle
$_SESSION['feedback'] = "<p class='info'>Salasana pitää uusia.<br>Ole hyvä ja luo uusi salasana.</p>";
header( "Location:pw_reset.php?id={$key}" );
exit;
}
else { // jos salasanaa pyydetty sähköpostiin, lähetetään linkki
Email::lahetaSalasanaLinkki( $user->sahkoposti, $key );
header( "Location:index.php?redir=6" );
exit(); // Palautuslinkki lähetetty
}
}
/**
* So apparently, com_-aluiset funktiot on poistettu PHP-coresta 5 version jälkeen,
* ja ne saa vaan lisäämällä manuaalisti.
* Jälkimmäinen osio luo käytännössä saman asian kuin com_create_guid.
* Koodi kopioitu PHP-manuaalista, user comment.
* //TODO päivitä GUID v4 --JJ 17-04-15
* @return string
*/
function GUID() {
if ( function_exists( 'com_create_guid' ) ) {
return trim( com_create_guid(), '{}' );
}
else {
return sprintf( '%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand( 0, 65535 ), mt_rand( 0, 65535 ),
mt_rand( 0, 65535 ), mt_rand( 16384, 20479 ), mt_rand( 32768, 49151 ), mt_rand( 0, 65535 ),
mt_rand( 0, 65535 ), mt_rand( 0, 65535 ) );
}
}
if ( empty( $_POST[ "mode" ] ) ) {
header( "Location:index.php?redir=4" );
exit(); // Not logged in
}
$db = new DByhteys();
$mode = $_POST[ "mode" ];
$email = isset( $_POST[ "email" ] ) ? trim( $_POST[ "email" ] ) : null;
$password = (isset( $_POST[ "password" ] ) && strlen( $_POST[ "password" ] ) < 300)
? trim( $_POST[ "password" ] ) : null;
$salasanan_voimassaoloaika = 180;
date_default_timezone_set( "Europe/Helsinki" );
/*************************
* Sisäänkirjautuminen *
*************************/
if ( $mode === "login" ) {
session_start();
session_regenerate_id( true );
// Haetaan käyttäjän tiedot
$sql = "SELECT id, yritys_id, sahkoposti, salasana_hajautus, vahvista_eula, aktiivinen, demo,
voimassaolopvm, viime_sijainti, salasana_vaihdettu, salasana_uusittava
FROM kayttaja WHERE sahkoposti = ?";
/** @var User $login_user */
$login_user = $db->query( $sql, [ $email ], false, null, 'User' );
if ( $login_user ) {
beginning_user_checks( $login_user, $password ); //Tarkistetaan salasana, aktiivisuus, ja demo-tilanne
// Jos läpi tarkistuksista -->
//check_IP_address( $db, $user->id, $user_info->viime_sijainti );
/** Tarkistetaan salasanan voimassaoloaika */
$date = new DateTime( $login_user->salasana_vaihdettu );
$date->modify( "+{$salasanan_voimassaoloaika} days" );
$now = new DateTime('today');
$diff = $now->diff($date)->days;
if ( $login_user->salasana_uusittava ) {
password_reset( $db, $login_user, 'uusittava' );
}
elseif ( $date < $now ) {
password_reset( $db, $login_user, 'vanhentunut' );
}
elseif ( $diff <= 20 ) { $colour = 'info';
if ($diff <= 10) { $colour = 'error'; }
$_SESSION['feedback'] = "<p class='{$colour}'>Salasana vanhenee {$diff} päivän päästä.
<a href='./omat_tiedot.php' style='text-decoration: underline;'>Vaihda salasana.</a></p>";
}
/*
* Kaikki OK, jatketaan sivustolle
*/
// Kirjataan ylös viimeisin kirjautumisaika ylläpitoa varten.
$db->query( "UPDATE kayttaja SET viime_kirjautuminen = current_timestamp WHERE id = ? LIMIT 1",
[ $login_user->id ] );
// Kirjataan ylös käyttäjän selain ja OS
// Näin voimme seurata mitä selaimia sivustolla käytetään.
file_put_contents("./config/log.txt", $login_user->id . '::' . $_SERVER['HTTP_USER_AGENT'] . '<br>\r\n', FILE_APPEND | LOCK_EX);
$_SESSION[ 'id' ] = (int)$login_user->id;
$_SESSION[ 'yritys_id' ] = (int)$login_user->yritys_id;
$_SESSION[ 'email' ] = $login_user->sahkoposti;
$config = parse_ini_file( "./config/config.ini.php" );
$_SESSION['indev'] = (bool)$config['indev'];
$_SESSION['header_tervehdys'] = (string)$config['header_tervehdys'];
// addDynamicAddress();
if ( $login_user->vahvista_eula ) {
header( "Location:eula.php" );
exit;
}
else {
$url = !empty( $_SESSION[ 'redirect_url' ] ) ? $_SESSION['redirect_url'] : 'etusivu.php';
header( "Location:{$url}" );
exit;
}
}
else { //Ei tuloksia == väärä käyttäjätunnus --> lähetä takaisin
header( "Location:index.php?redir=1" );
exit; // Sähköpostia ei löytynyt
}
}
/***************************
* Salasanan vaihtaminen *
***************************/
elseif ( $mode === "password_reset" ) {
$sql = "SELECT id, sahkoposti, aktiivinen, demo, voimassaolopvm
FROM kayttaja WHERE sahkoposti = ?";
$login_user = $db->query( $sql, [ $email ], false, null, 'User' );
if ( $login_user ) {
beginning_user_checks( $login_user, '', true );
password_reset( $db, $login_user, 'reset' );
}
else {
header( "Location:index.php?redir=1" ); //Sähköpostia ei löytynyt
exit();
}
}
header( "Location:index.php?redir=98" );
exit();