Passed
Push — master ( 84baa6...a87660 )
by Tomasz
04:23
created

WindowsCommon::prepareInstallerLang()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 8
nc 2
nop 0
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
1
<?php
2
/*
3
 * ******************************************************************************
4
 * Copyright 2011-2017 DANTE Ltd. and GÉANT on behalf of the GN3, GN3+, GN4-1 
5
 * and GN4-2 consortia
6
 *
7
 * License: see the web/copyright.php file in the file structure
8
 * ******************************************************************************
9
 */
10
11
/**
12
 * This file contains common functions needed by all Windows installers
13
 * @author Tomasz Wolniewicz <[email protected]>
14
 *
15
 * @package ModuleWriting
16
 */
17
18
namespace devices\ms;
19
use \Exception;
20
21
/**
22
 * This class defines common functions needed by all Windows installers
23
 * @author Tomasz Wolniewicz <[email protected]>
24
 *
25
 * @package ModuleWriting
26
 */
27
class WindowsCommon extends \core\DeviceConfig {
28
29
    public function copyBasicFiles() {
30
        if (!($this->copyFile('wlan_test.exe') &&
31
                $this->copyFile('check_wired.cmd') &&
32
                $this->copyFile('install_wired.cmd') &&
33
                $this->copyFile('cat_bg.bmp') &&
34
                $this->copyFile('base64.nsh'))) {
35
            throw new Exception("Copying needed files (part 1) failed for at least one file!");
36
        }
37
38
        if (!($this->copyFile('cat32.ico') &&
39
                $this->copyFile('cat_150.bmp') &&
40
                $this->copyFile('WLANSetEAPUserData/WLANSetEAPUserData32.exe', 'WLANSetEAPUserData32.exe') &&
41
                $this->copyFile('WLANSetEAPUserData/WLANSetEAPUserData64.exe', 'WLANSetEAPUserData64.exe'))) {
42
            throw new Exception("Copying needed files (part 2) failed for at least one file!");
43
        }
44
        if (!$this->translateFile('common.inc', 'common.nsh', $this->codePage)) {
45
            throw new Exception("Translating needed file common.inc failed!");
46
        }
47
        return;
48
    }
49
50
    public function copyPwdFiles() {
51
        if (!($this->copyFile('Aruba_Networks_EAP-pwd_x32.msi') &&
52
                $this->copyFile('Aruba_Networks_EAP-pwd_x64.msi'))) {
53
            throw new Exception("Copying needed files (EAP-pwd) failed for at least one file!");
54
        }
55
        if (!$this->translateFile('pwd.inc', 'cat.NSI', $this->codePage)) {
56
            throw new Exception("Translating needed file pwd.inc failed!");
57
        }
58
    }
59
60
    public function copyGeantLinkFiles() {
61
        if (!($this->copyFile('GEANTLink/GEANTLink32.msi', 'GEANTLink32.msi') &&
62
                $this->copyFile('GEANTLink/GEANTLink64.msi', 'GEANTLink64.msi') &&
63
                $this->copyFile('GEANTLink/CredWrite.exe', 'CredWrite.exe') &&
64
                $this->copyFile('GEANTLink/MsiUseFeature.exe', 'MsiUseFeature.exe'))) {
65
            throw new Exception("Copying needed files (GEANTLink) failed for at least one file!");
66
        }
67
        if (!$this->translateFile('geant_link.inc', 'cat.NSI', $this->codePage)) {
68
            throw new Exception("Translating needed file geant_link.inc failed!");
69
        }
70
    }
71
72
73
    /**
74
     * function to escape double quotes in a special NSI-compatible way
75
     * 
76
     * @param string $in input string
77
     * @return string
78
     */
79
    public static function echo_nsi($in) {
80
        echo preg_replace('/"/', '$\"', $in);
81
    }
82
83
    /**
84
     * @param string $input input string
85
     * @return string
86
     */
87
    public static function sprint_nsi($input) {
88
        return preg_replace('/"/', '$\"', $input);
89
    }
90
91
    public function __construct() {
92
        parent::__construct();
93
        $this->useGeantLink = (isset($this->options['args']) && $this->options['args'] == 'gl' ) ? 1 : 0;
94
    }
95
96
    protected function prepareInstallerLang() {
97
        if (isset($this->LANGS[$this->languageInstance->getLang()])) {
98
            $language = $this->LANGS[$this->languageInstance->getLang()];
99
            $this->lang = $language['nsis'];
100
            $this->codePage = 'cp' . $language['cp'];
101
        } else {
102
            $this->lang = 'English';
103
            $this->codePage = 'cp1252';
104
        }
105
    }
106
107
    public function writeDeviceInfo() {
108
        $ssidCount = count($this->attributes['internal:SSID']);
109
        $out = "<p>";
110
        $out .= sprintf(_("%s installer will be in the form of an EXE file. It will configure %s on your device, by creating wireless network profiles.<p>When you click the download button, the installer will be saved by your browser. Copy it to the machine you want to configure and execute."), CONFIG_CONFASSISTANT['CONSORTIUM']['display_name'], CONFIG_CONFASSISTANT['CONSORTIUM']['display_name']);
111
        $out .= "<p>";
112
        if ($ssidCount > 1) {
113
            if ($ssidCount > 2) {
114
                $out .= sprintf(_("In addition to <strong>%s</strong> the installer will also configure access to the following networks:"), implode(', ', CONFIG_CONFASSISTANT['CONSORTIUM']['ssid'])) . " ";
115
            } else {
116
                $out .= sprintf(_("In addition to <strong>%s</strong> the installer will also configure access to:"), implode(', ', CONFIG_CONFASSISTANT['CONSORTIUM']['ssid'])) . " ";
117
            }
118
            $out .= '<strong>' . join('</strong>, <strong>', array_diff(array_keys($this->attributes['internal:SSID']), CONFIG_CONFASSISTANT['CONSORTIUM']['ssid'])) . '</strong>';
119
            $out .= "<p>";
120
        }
121
// TODO - change this below
122
        if ($this->selectedEapObject->isClientCertRequired()) {
0 ignored issues
show
Bug introduced by
The property selectedEapObject does not seem to exist. Did you mean selectedEap?

An attempt at access to an undefined property has been detected. This may either be a typographical error or the property has been renamed but there are still references to its old name.

If you really want to allow access to undefined properties, you can define magic methods to allow access. See the php core documentation on Overloading.

Loading history...
123
            $out .= sprintf(_("In order to connect to the network you will need an a personal certificate in the form of a p12 file. You should obtain this certificate from your %s. Consult the support page to find out how this certificate can be obtained. Such certificate files are password protected. You should have both the file and the password available during the installation process."), $this->nomenclature_inst);
124
            return($out);
125
        }
126
        // not EAP-TLS
127
        $out .= sprintf(_("In order to connect to the network you will need an account from your %s. You should consult the support page to find out how this account can be obtained. It is very likely that your account is already activated."), $this->nomenclature_inst);
128
129
        if (! $this->useGeantLink && $this->selectedEap['OUTER'] == \core\common\EAP::TTLS) {
130
            $out .= "<p>";
131
            $out .= _("When you are connecting to the network for the first time, Windows will pop up a login box, where you should enter your user name and password. This information will be saved so that you will reconnect to the network automatically each time you are in the range.");
132
            if ($ssidCount > 1) {
133
                $out .= "<p>";
134
                $out .= _("You will be required to enter the same credentials for each of the configured notworks:") . " ";
135
                $out .= '<strong>' . join('</strong>, <strong>', array_keys($this->attributes['internal:SSID'])) . '</strong>';
136
            }
137
        }
138
        return($out);
139
    }    
140
    
141
    private function scaleLogo($imagePath, $maxSize) {
142
        $imageObject = new \Imagick($imagePath);
143
        $imageSize = $imageObject->getImageGeometry();
144
        $imageMax = max($imageSize);
145
        $this->loggerInstance->debug(5, "Logo size: ");
146
        $this->loggerInstance->debug(5, $imageSize);
147
        $this->loggerInstance->debug(5, "max=$imageMax\n");
148
// resize logo if necessary
149
        if ($imageMax > $maxSize) {
150
            if ($imageMax == $imageSize['width']) {
151
                $imageObject->scaleImage($maxSize, 0);
152
            } else {
153
                $imageObject->scaleImage(0, $maxSize);
154
            }
155
        }
156
        $imageSize = $imageObject->getImageGeometry();
157
        $this->background['freeHeight'] -= $imageSize['height'];
158
        return($imageObject);
159
    }
160
161
    protected function combineLogo($logos = NULL, $fedLogo = NULL) {
162
        // maximum size to which we want to resize the logos
163
        
164
        $maxSize = 120;
165
        // $freeTop is set to how much vertical space we need to leave at the top
166
        // this will depend on the design of the background
167
        $freeTop = 70;
168
        // $freeBottom is set to how much vertical space we need to leave at the bottom
169
        // this will depend on the design of the background
170
        $freeBottom = 30;
171
        // $useFederationLogo controls if federation logos should be enabled (TRUE or FALSE)
172
        $useFederationLogo = FALSE;
173
174
        $bgImage = new \Imagick('cat_bg.bmp');
175
        $bgImage->setFormat('BMP3');
176
        $bgImageSize = $bgImage->getImageGeometry();
177
        $logosToPlace = [];
178
        $this->background = [];
179
        $this->background['freeHeight'] = $bgImageSize['height'] - $freeTop - $freeBottom;
180
181
        if ($useFederationLogo && $fedLogo != NULL) {
182
            $logosToPlace[] = $this->scaleLogo($fedLogo[0]['name'],$maxSize);
183
        }
184
        if ($logos != NULL) {
185
            $logosToPlace[] = $this->scaleLogo($logos[0]['name'],$maxSize);
186
        }
187
188
        $logoCount = count($logosToPlace);
189
        if ($logoCount > 0) {
190
            $voffset = $freeTop;
191
            $freeSpace = round($this->background['freeHeight'] / ($logoCount + 1));
192
            foreach ($logosToPlace as $logo) {
193
                $voffset += $freeSpace;
194
                $logoSize = $logo->getImageGeometry();
195
                $hoffset = round(($bgImageSize['width'] - $logoSize['width']) / 2);
196
                $bgImage->compositeImage($logo, $logo->getImageCompose(), $hoffset, $voffset);
197
                $voffset += $logoSize['height'];
198
                }
199
        }
200
//new image is saved as the background
201
        $bgImage->writeImage('BMP3:cat_bg.bmp');
202
    }
203
204
    protected function signInstaller() {
205
        $fileName = $this->installerBasename . '.exe';
206
        if (!$this->sign) {
207
            rename("installer.exe", $fileName);
208
            return $fileName;
209
        }
210
        // are actually signing
211
        $outputFromSigning = system($this->sign . " installer.exe '$fileName' > /dev/null");
212
        if ($outputFromSigning === FALSE) {
213
            $this->loggerInstance->debug(2, "Signing the WindowsCommon installer $fileName FAILED!\n");
214
        }
215
        return $fileName;
216
    }
217
218
    protected function compileNSIS() {
219
        if (CONFIG_CONFASSISTANT['NSIS_VERSION'] >= 3) {
220
            $makensis = CONFIG_CONFASSISTANT['PATHS']['makensis'] . " -INPUTCHARSET UTF8";
221
        } else {
222
            $makensis = CONFIG_CONFASSISTANT['PATHS']['makensis'];
223
        }
224
        $command = $makensis . ' -V4 cat.NSI > nsis.log';
225
        system($command);
226
        $this->loggerInstance->debug(4, "compileNSIS:$command\n");
227
    }
228
229
    protected function msInfoFile($attr) {
230
        $out = '';
231
        if (isset($attr['support:info_file'])) {
232
            $out .= '!define EXTERNAL_INFO "';
233
//  $this->loggerInstance->debug(4,"Info file type ".$attr['support:info_file'][0]['mime']."\n");
0 ignored issues
show
Unused Code Comprehensibility introduced by
80% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
234
            if ($attr['internal:info_file'][0]['mime'] == 'rtf') {
235
                $out = '!define LICENSE_FILE "' . $attr['internal:info_file'][0]['name'];
236
            } elseif ($attr['internal:info_file'][0]['mime'] == 'txt') {
237
                $infoFile = file_get_contents($attr['internal:info_file'][0]['name']);
238
                if (CONFIG_CONFASSISTANT['NSIS_VERSION'] >= 3) {
239
                    $infoFileConverted = $infoFile;
240
                } else {
241
                    $infoFileConverted = iconv('UTF-8', $this->codePage . '//TRANSLIT', $infoFile);
242
                }
243
                if ($infoFileConverted) {
244
                    file_put_contents('info_f.txt', $infoFileConverted);
245
                    $out = '!define LICENSE_FILE " info_f.txt';
246
                }
247
            } else {
248
                $out = '!define EXTERNAL_INFO "' . $attr['internal:info_file'][0]['name'];
249
            }
250
251
            $out .= "\"\n";
252
        }
253
        $this->loggerInstance->debug(4, "Info file returned: $out");
254
        return $out;
255
    }
256
257
    protected function writeAdditionalDeletes($profiles) {
258
        if (count($profiles) == 0) {
259
            return;
260
        }
261
        $fileHandle = fopen('profiles.nsh', 'a');
262
        fwrite($fileHandle, "!define AdditionalDeletes\n");
263
        foreach ($profiles as $profile) {
264
            fwrite($fileHandle, "!insertmacro define_delete_profile \"$profile\"\n");
265
        }
266
        fclose($fileHandle);
267
    }
268
269
    protected function writeClientP12File() {
270
        if (!is_array($this->clientCert)) {
271
            throw new Exception("the client block was called but there is no client certificate!");
272
        }
273
        $fileHandle = fopen('SB_cert.p12', 'w');
274
        fwrite($fileHandle, $this->clientCert["certdata"]);
275
        fclose($fileHandle);
276
    }
277
278
    protected function writeTlsUserProfile() {
279
        
280
    }
281
282
    public $LANGS = [
283
        'fr' => ['nsis' => "French", 'cp' => '1252'],
284
        'de' => ['nsis' => "German", 'cp' => '1252'],
285
        'es' => ['nsis' => "SpanishInternational", 'cp' => '1252'],
286
        'it' => ['nsis' => "Italian", 'cp' => '1252'],
287
        'nl' => ['nsis' => "Dutch", 'cp' => '1252'],
288
        'sv' => ['nsis' => "Swedish", 'cp' => '1252'],
289
        'fi' => ['nsis' => "Finnish", 'cp' => '1252'],
290
        'pl' => ['nsis' => "Polish", 'cp' => '1250'],
291
        'ca' => ['nsis' => "Catalan", 'cp' => '1252'],
292
        'sr' => ['nsis' => "SerbianLatin", 'cp' => '1250'],
293
        'hr' => ['nsis' => "Croatian", 'cp' => '1250'],
294
        'sl' => ['nsis' => "Slovenian", 'cp' => '1250'],
295
        'da' => ['nsis' => "Danish", 'cp' => '1252'],
296
        'nb' => ['nsis' => "Norwegian", 'cp' => '1252'],
297
        'nn' => ['nsis' => "NorwegianNynorsk", 'cp' => '1252'],
298
        'el' => ['nsis' => "Greek", 'cp' => '1253'],
299
        'ru' => ['nsis' => "Russian", 'cp' => '1251'],
300
        'pt' => ['nsis' => "Portuguese", 'cp' => '1252'],
301
        'uk' => ['nsis' => "Ukrainian", 'cp' => '1251'],
302
        'cs' => ['nsis' => "Czech", 'cp' => '1250'],
303
        'sk' => ['nsis' => "Slovak", 'cp' => '1250'],
304
        'bg' => ['nsis' => "Bulgarian", 'cp' => '1251'],
305
        'hu' => ['nsis' => "Hungarian", 'cp' => '1250'],
306
        'ro' => ['nsis' => "Romanian", 'cp' => '1250'],
307
        'lv' => ['nsis' => "Latvian", 'cp' => '1257'],
308
        'mk' => ['nsis' => "Macedonian", 'cp' => '1251'],
309
        'et' => ['nsis' => "Estonian", 'cp' => '1257'],
310
        'tr' => ['nsis' => "Turkish", 'cp' => '1254'],
311
        'lt' => ['nsis' => "Lithuanian", 'cp' => '1257'],
312
        'ar' => ['nsis' => "Arabic", 'cp' => '1256'],
313
        'he' => ['nsis' => "Hebrew", 'cp' => '1255'],
314
        'id' => ['nsis' => "Indonesian", 'cp' => '1252'],
315
        'mn' => ['nsis' => "Mongolian", 'cp' => '1251'],
316
        'sq' => ['nsis' => "Albanian", 'cp' => '1252'],
317
        'br' => ['nsis' => "Breton", 'cp' => '1252'],
318
        'be' => ['nsis' => "Belarusian", 'cp' => '1251'],
319
        'is' => ['nsis' => "Icelandic", 'cp' => '1252'],
320
        'ms' => ['nsis' => "Malay", 'cp' => '1252'],
321
        'bs' => ['nsis' => "Bosnian", 'cp' => '1250'],
322
        'ga' => ['nsis' => "Irish", 'cp' => '1250'],
323
        'uz' => ['nsis' => "Uzbek", 'cp' => '1251'],
324
        'gl' => ['nsis' => "Galician", 'cp' => '1252'],
325
        'af' => ['nsis' => "Afrikaans", 'cp' => '1252'],
326
        'ast' => ['nsis' => "Asturian", 'cp' => '1252'],
327
    ];
328
    public $codePage;
329
    public $lang;
330
    public $useGeantLink;
331
    private $background;
332
333
}
334