InstallController   A
last analyzed

Complexity

Total Complexity 31

Size/Duplication

Total Lines 243
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 5
Bugs 0 Features 1
Metric Value
wmc 31
c 5
b 0
f 1
lcom 1
cbo 5
dl 0
loc 243
rs 9.8

15 Methods

Rating   Name   Duplication   Size   Complexity  
A displayWelcome() 0 4 1
A displayDatabaseForm() 0 4 1
A displayAccountForm() 0 4 1
D computeRequirements() 0 44 9
B validateDatabaseConnection() 0 29 3
A displayConfigurationForm() 0 6 1
B registerConfiguration() 0 24 2
A checkEnvironmentFile() 0 8 2
A registerAccount() 0 15 1
B createConfigFile() 0 35 2
A displayFinished() 0 11 2
A getPhpVersionId() 0 9 2
A hasDatabaseAccess() 0 10 2
A migrateAndSeedDatabase() 0 6 1
A updateAdminAccount() 0 11 1
1
<?php
2
3
namespace App\Http\Controllers;
4
5
use App\Http\Requests;
6
use App\User;
7
use Config;
8
use DateTimeZone;
9
use Exception;
10
use Hash;
11
use Illuminate\Http\Request;
12
use Illuminate\Support\Facades\Artisan;
13
use PDO;
14
use PDOException;
15
use Session;
16
use URL;
17
18
class InstallController extends Controller
19
{
20
    const REQUIRED_PHP_VERSION_ID = 50509;
21
22
    const CONFIG_KEY = 'temp_settings';
23
24
    const INSTALLATION_FILE = 'install.lock';
25
26
    public function displayWelcome()
27
    {
28
        return view('install.welcome');
29
    }
30
31
    public function computeRequirements()
32
    {
33
        $requirements = ['PHP_VERSION' => false,
34
            'OPENSSL_EXTENSION' => false,
35
            'PDO_EXTENSION' => false,
36
            'MBSTRING_EXTENSION' => false,
37
            'TOKENIZER_EXTENSION' => false,
38
            'WRITE_ACCESS' => false];
39
40
        if ($this->getPhpVersionId() >= self::REQUIRED_PHP_VERSION_ID) {
41
            $requirements['PHP_VERSION'] = true;
42
        }
43
44
        if (extension_loaded('openssl')) {
45
            $requirements['OPENSSL_EXTENSION'] = true;
46
        }
47
48
        if (extension_loaded('PDO')) {
49
            $requirements['PDO_EXTENSION'] = true;
50
        }
51
52
        if (extension_loaded('mbstring')) {
53
            $requirements['MBSTRING_EXTENSION'] = true;
54
        }
55
56
        if (extension_loaded('tokenizer')) {
57
            $requirements['TOKENIZER_EXTENSION'] = true;
58
        }
59
60
        if (is_writable(storage_path())) {
61
            $requirements['WRITE_ACCESS'] = true;
62
        }
63
64
        $accepted = true;
65
        foreach ($requirements as $requirement => $status) {
66
            if ($status === false) {
67
                $accepted = false;
68
                break;
69
            }
70
        }
71
72
        return view('install.requirements')->with('requirements', $requirements)
73
            ->with('accepted', $accepted);
74
    }
75
76
    public function displayDatabaseForm()
77
    {
78
        return view('install.database');
79
    }
80
81
    public function validateDatabaseConnection(Request $request)
82
    {
83
        $this->validate($request, [
84
            'database_host' => 'required',
85
            'username' => '',
86
            'password' => '',
87
            'database_name' => 'required'
88
        ]);
89
90
        if (!$this->hasDatabaseAccess($request->input('database_host'), $request->input('username'), $request->input('password'), $request->input('database_name'))) {
91
            return redirect('install/database')->with('error', 'Barmate could not have access to your database. Please verify your settings.')
92
                ->withInput();
93
        }
94
95
        if (!$request->session()->has(self::CONFIG_KEY)) {
96
            $request->session()->put(self::CONFIG_KEY, []);
97
        }
98
99
        $configArray = $request->session()->get(self::CONFIG_KEY);
100
101
        $configArray['db_hostname'] = $request->input('database_host');
102
        $configArray['db_username'] = $request->input('username');
103
        $configArray['db_password'] = $request->input('password');
104
        $configArray['db_name'] = $request->input('database_name');
105
106
        $request->session()->set(self::CONFIG_KEY, $configArray);
107
108
        return redirect('install/configuration');
109
    }
110
111
    public function displayConfigurationForm(Request $request)
112
    {
113
        return view('install.configuration')->with('applicationUrl', $request->root())
114
            ->with('encryptionKey', str_random(32))
115
            ->with('timezonesId', DateTimeZone::listIdentifiers());
116
    }
117
118
    public function registerConfiguration(Request $request)
119
    {
120
        $this->validate($request, [
121
            'application_url' => 'required|url',
122
            'encryption_key' => 'required|size:32',
123
            'timezone' => 'required'
124
        ]);
125
126
        $configArray = $request->session()->get(self::CONFIG_KEY);
127
128
        $configArray['app_url'] = $request->input('application_url');
129
        $configArray['app_key'] = $request->input('encryption_key');
130
        $configArray['app_timezone'] = $request->input('timezone');
131
132
        $request->session()->set(self::CONFIG_KEY, $configArray);
133
134
        try {
135
            $this->createConfigFile();
136
        } catch (Exception $e) {
137
            return redirect('install/check-config');
138
        }
139
140
        return redirect('install/account');
141
    }
142
143
    public function checkEnvironmentFile(Request $request)
144
    {
145
        if (file_exists(base_path() . '/.env')) {
146
            return redirect('install/account');
147
        }
148
149
        return view('install.error')->with('configArray', $request->session()->get(self::CONFIG_KEY));
150
    }
151
152
    public function displayAccountForm()
153
    {
154
        return view('install.account');
155
    }
156
157
    public function registerAccount(Request $request)
158
    {
159
        $this->validate($request, [
160
            'first_name' => 'required|name',
161
            'last_name' => 'required|name',
162
            'email_address' => 'required|email|max:150',
163
            'password' => 'required|password',
164
            'repeat_password' => 'required|same:password'
165
        ]);
166
167
        $this->migrateAndSeedDatabase();
168
        $this->updateAdminAccount($request->input('first_name'), $request->input('last_name'), $request->input('email_address'), $request->input('password'));
169
170
        return redirect('install/finished');
171
    }
172
173
    private function createConfigFile()
174
    {
175
        $configArray = session(self::CONFIG_KEY);
176
177
        $configContent = 'APP_ENV=production' . PHP_EOL;
178
        $configContent .= 'APP_DEBUG=false' . PHP_EOL;
179
        $configContent .= 'APP_URL=' . $configArray['app_url'] . '' . PHP_EOL;
180
        $configContent .= 'APP_KEY=' . $configArray['app_key'] . '' . PHP_EOL;
181
        $configContent .= 'APP_TIMEZONE=' . $configArray['app_timezone'] . '' . PHP_EOL;
182
183
        $configContent .= 'DB_DRIVER=mysql' . PHP_EOL;
184
        $configContent .= 'DB_HOST=' . $configArray['db_hostname'] . '' . PHP_EOL;
185
        $configContent .= 'DB_DATABASE=' . $configArray['db_name'] . '' . PHP_EOL;
186
        $configContent .= 'DB_USERNAME=' . $configArray['db_username'] . '' . PHP_EOL;
187
        $configContent .= 'DB_PASSWORD=' . $configArray['db_password'] . '' . PHP_EOL;
188
189
        $configContent .= 'MAIL_DRIVER=smtp' . PHP_EOL;
190
        $configContent .= 'MAIL_HOST=mailtrap.io' . PHP_EOL;
191
        $configContent .= 'MAIL_PORT=2525' . PHP_EOL;
192
        $configContent .= 'MAIL_USERNAME=null' . PHP_EOL;
193
        $configContent .= 'MAIL_PASSWORD=null' . PHP_EOL;
194
195
        $configContent .= 'CACHE_DRIVER=file' . PHP_EOL;
196
        $configContent .= 'SESSION_DRIVER=file' . PHP_EOL;
197
        $configContent .= 'QUEUE_DRIVER=sync' . PHP_EOL;
198
199
200
        if (!is_writable(base_path())) {
201
            throw new Exception('Could not create the configuration file');
202
        }
203
204
        $fileHandle = fopen(base_path() . '/.env', "w");
205
        fwrite($fileHandle, $configContent);
206
        fclose($fileHandle);
207
    }
208
209
    public function displayFinished(Request $request)
210
    {
211
        $request->session()->forget(self::CONFIG_KEY);
212
213
        try {
214
            unlink(base_path() . '/' . self::INSTALLATION_FILE);
215
            return view('install.finished');
216
        } catch (\ErrorException $e) {
217
            return view('install.finished')->with('lockError', true);
218
        }
219
    }
220
221
    private function getPhpVersionId()
222
    {
223
        if (!defined('PHP_VERSION_ID')) {
224
            $version = explode('.', PHP_VERSION);
225
            define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
226
        }
227
228
        return PHP_VERSION_ID;
229
    }
230
231
    private function hasDatabaseAccess($hostname, $username, $password, $database)
232
    {
233
        try {
234
            (new PDO("mysql:host=$hostname;dbname=$database", $username, $password))->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);;
235
        } catch (PDOException $e) {
236
            return false;
237
        }
238
239
        return true;
240
    }
241
242
    private function migrateAndSeedDatabase()
243
    {
244
        Artisan::call('migrate', ['--force' => true]);
245
246
        Artisan::call('db:seed', ['--force' => true]);
247
    }
248
249
    private function updateAdminAccount($firstname, $lastname, $email, $password)
250
    {
251
        $admin = User::firstOrFail();
252
253
        $admin->firstname = $firstname;
254
        $admin->lastname = $lastname;
255
        $admin->email = $email;
256
        $admin->password_hash = Hash::make($password);
257
258
        $admin->save();
259
    }
260
}