Passed
Push — master ( bbdad6...b94785 )
by Tomasz
05:05
created

WindowsCommon::sprint_nsi()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 3
rs 10
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
            $iterator = 0;
119
            foreach ($this->attributes['internal:SSID'] as $ssid => $v) {
120
                if (!in_array($ssid, CONFIG_CONFASSISTANT['CONSORTIUM']['ssid'])) {
121
                    if ($iterator > 0) {
122
                        $out .= ", ";
123
                    }
124
                    $iterator++;
125
                    $out .= "<strong>$ssid</strong>";
126
                }
127
            }
128
            $out .= "<p>";
129
        }
130
// TODO - change this below
131
        if ($this->selectedEap == \core\common\EAP::EAPTYPE_TLS || $this->selectedEap == \core\common\EAP::EAPTYPE_SILVERBULLET) {
132
            $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);
133
            return($out);
134
        }
135
        // not EAP-TLS
136
        $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);
137
138
        if ($this->selectedEap == \core\common\EAP::EAPTYPE_PEAP_MSCHAP2) {
139
            $out .= "<p>";
140
            $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.");
141
            if ($ssidCount > 1) {
142
                $out .= "<p>";
143
                $out .= _("You will be required to enter the same credentials for each of the configured notworks:") . " ";
144
                $iterator = 0;
145
                foreach ($this->attributes['internal:SSID'] as $ssid => $v) {
146
                    if ($iterator > 0) {
147
                        $out .= ", ";
148
                    }
149
                    $iterator++;
150
                    $out .= "<strong>$ssid</strong>";
151
                }
152
            }
153
        }
154
        return($out);
155
    }    
156
    
157
    protected function combineLogo($logos, $fedLogo = NULL) {
158
        // maximum size to which we want to resize the logos
159
        $maxSize = 120;
160
        // $freeTop is set to how much vertical space we need to leave at the top
161
        // this will depend on the design of the background
162
        $freeTop = 70;
163
        // $freeBottom is set to how much vertical space we need to leave at the bottom
164
        // this will depend on the design of the background
165
        $freeBottom = 30;
166
        // $useFederationLogo controls if federation logos should be enabled
167
        $useFederationLogo = FALSE;
168
                
169
        $bgImage = new \Imagick('cat_bg.bmp');
170
        $bgImage->setFormat('BMP3');
171
        $bgImageSize = $bgImage->getImageGeometry();
172
        $freeHeight = $bgImageSize['height'] - $freeTop - $freeBottom;
173
        $idpLogoObject = new \Imagick($logos[0]['name']);
174
        $idpLogoSize = $idpLogoObject->getImageGeometry();
175
        $max = max($idpLogoSize);
176
        $this->loggerInstance->debug(5, "Logo size: ");
177
        $this->loggerInstance->debug(5, $idpLogoSize);
178
        $this->loggerInstance->debug(5, "max=$max\n");
179
180
// resize logo if necessary
181
        if ($max > $maxSize) {
182
            if ($max == $idpLogoSize['width']) {
183
                $idpLogoObject->scaleImage($maxSize, 0);
184
            } else {
185
                $idpLogoObject->scaleImage(0, $maxSize);
186
            }
187
            $idpLogoSize = $idpLogoObject->getImageGeometry();
188
            $this->loggerInstance->debug(5, "New logo size: ");
189
            $this->loggerInstance->debug(5, $idpLogoSize);
190
        }
191
        if($useFederationLogo && $fedLogo != NULL) {
192
            $fedLogoObject = new \Imagick($fedLogo[0]['name']);
193
            $fedLogoSize = $fedLogoObject->getImageGeometry();
194
            $fedMax = max($fedLogoSize);
195
            $this->loggerInstance->debug(5, "Fed Logo size: ");
196
            $this->loggerInstance->debug(5, $fedLogoSize);
197
            $this->loggerInstance->debug(5, "max=$fedMax\n");
198
            if ($fedLogoSize['width'] > $maxSize) {
199
                $fedLogoObject->scaleimage($maxSize, 0);
200
                $fedLogoSize = $fedLogoObject->getImageGeometry();
201
            }
202
            $hoffset = round(($bgImageSize['width'] - $fedLogoSize['width']) / 2);
203
            $freeSpace = round(($freeHeight - $fedLogoSize['height'] - $idpLogoSize['height']) / 3);
204
            $voffset = $freeSpace + $freeTop;
205
            $bgImage->compositeImage($fedLogoObject, $fedLogoObject->getImageCompose(), $hoffset, $voffset);
206
            $voffset = 2 * $freeSpace + $fedLogoSize['height'] + $freeTop;
207
        } else {
208
            $voffset = round(($freeHeight - $idpLogoSize['height']) / 2) + $freeTop;
209
        }
210
        $hoffset = round(($bgImageSize['width'] - $idpLogoSize['width']) / 2);
211
        $bgImage->compositeImage($idpLogoObject, $idpLogoObject->getImageCompose(), $hoffset, $voffset);    
212
213
//new image is saved as the background
214
        $bgImage->writeImage('BMP3:cat_bg.bmp');
215
    }
216
217
    protected function signInstaller() {
218
        $fileName = $this->installerBasename . '.exe';
219
        if (!$this->sign) {
220
            rename("installer.exe", $fileName);
221
            return $fileName;
222
        }
223
        // are actually signing
224
        $outputFromSigning = system($this->sign . " installer.exe '$fileName' > /dev/null");
225
        if ($outputFromSigning === FALSE) {
226
            $this->loggerInstance->debug(2, "Signing the WindowsCommon installer $fileName FAILED!\n");
227
        }
228
        return $fileName;
229
    }
230
231
    protected function compileNSIS() {
232
        if (CONFIG_CONFASSISTANT['NSIS_VERSION'] >= 3) {
233
            $makensis = CONFIG_CONFASSISTANT['PATHS']['makensis'] . " -INPUTCHARSET UTF8";
234
        } else {
235
            $makensis = CONFIG_CONFASSISTANT['PATHS']['makensis'];
236
        }
237
        $command = $makensis . ' -V4 cat.NSI > nsis.log';
238
        system($command);
239
        $this->loggerInstance->debug(4, "compileNSIS:$command\n");
240
    }
241
242
    protected function msInfoFile($attr) {
243
        $out = '';
244
        if (isset($attr['support:info_file'])) {
245
            $out .= '!define EXTERNAL_INFO "';
246
//  $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...
247
            if ($attr['internal:info_file'][0]['mime'] == 'rtf') {
248
                $out = '!define LICENSE_FILE "' . $attr['internal:info_file'][0]['name'];
249
            } elseif ($attr['internal:info_file'][0]['mime'] == 'txt') {
250
                $infoFile = file_get_contents($attr['internal:info_file'][0]['name']);
251
                if (CONFIG_CONFASSISTANT['NSIS_VERSION'] >= 3) {
252
                    $infoFileConverted = $infoFile;
253
                } else {
254
                    $infoFileConverted = iconv('UTF-8', $this->codePage . '//TRANSLIT', $infoFile);
255
                }
256
                if ($infoFileConverted) {
257
                    file_put_contents('info_f.txt', $infoFileConverted);
258
                    $out = '!define LICENSE_FILE " info_f.txt';
259
                }
260
            } else {
261
                $out = '!define EXTERNAL_INFO "' . $attr['internal:info_file'][0]['name'];
262
            }
263
264
            $out .= "\"\n";
265
        }
266
        $this->loggerInstance->debug(4, "Info file returned: $out");
267
        return $out;
268
    }
269
270
    protected function writeAdditionalDeletes($profiles) {
271
        if (count($profiles) == 0) {
272
            return;
273
        }
274
        $fileHandle = fopen('profiles.nsh', 'a');
275
        fwrite($fileHandle, "!define AdditionalDeletes\n");
276
        foreach ($profiles as $profile) {
277
            fwrite($fileHandle, "!insertmacro define_delete_profile \"$profile\"\n");
278
        }
279
        fclose($fileHandle);
280
    }
281
282
    protected function writeClientP12File() {
283
        if (!is_array($this->clientCert)) {
284
            throw new Exception("the client block was called but there is no client certificate!");
285
        }
286
        $fileHandle = fopen('SB_cert.p12', 'w');
287
        fwrite($fileHandle, $this->clientCert["certdata"]);
288
        fclose($fileHandle);
289
    }
290
291
    protected function writeTlsUserProfile() {
292
        
293
    }
294
295
    public $LANGS = [
296
        'fr' => ['nsis' => "French", 'cp' => '1252'],
297
        'de' => ['nsis' => "German", 'cp' => '1252'],
298
        'es' => ['nsis' => "SpanishInternational", 'cp' => '1252'],
299
        'it' => ['nsis' => "Italian", 'cp' => '1252'],
300
        'nl' => ['nsis' => "Dutch", 'cp' => '1252'],
301
        'sv' => ['nsis' => "Swedish", 'cp' => '1252'],
302
        'fi' => ['nsis' => "Finnish", 'cp' => '1252'],
303
        'pl' => ['nsis' => "Polish", 'cp' => '1250'],
304
        'ca' => ['nsis' => "Catalan", 'cp' => '1252'],
305
        'sr' => ['nsis' => "SerbianLatin", 'cp' => '1250'],
306
        'hr' => ['nsis' => "Croatian", 'cp' => '1250'],
307
        'sl' => ['nsis' => "Slovenian", 'cp' => '1250'],
308
        'da' => ['nsis' => "Danish", 'cp' => '1252'],
309
        'nb' => ['nsis' => "Norwegian", 'cp' => '1252'],
310
        'nn' => ['nsis' => "NorwegianNynorsk", 'cp' => '1252'],
311
        'el' => ['nsis' => "Greek", 'cp' => '1253'],
312
        'ru' => ['nsis' => "Russian", 'cp' => '1251'],
313
        'pt' => ['nsis' => "Portuguese", 'cp' => '1252'],
314
        'uk' => ['nsis' => "Ukrainian", 'cp' => '1251'],
315
        'cs' => ['nsis' => "Czech", 'cp' => '1250'],
316
        'sk' => ['nsis' => "Slovak", 'cp' => '1250'],
317
        'bg' => ['nsis' => "Bulgarian", 'cp' => '1251'],
318
        'hu' => ['nsis' => "Hungarian", 'cp' => '1250'],
319
        'ro' => ['nsis' => "Romanian", 'cp' => '1250'],
320
        'lv' => ['nsis' => "Latvian", 'cp' => '1257'],
321
        'mk' => ['nsis' => "Macedonian", 'cp' => '1251'],
322
        'et' => ['nsis' => "Estonian", 'cp' => '1257'],
323
        'tr' => ['nsis' => "Turkish", 'cp' => '1254'],
324
        'lt' => ['nsis' => "Lithuanian", 'cp' => '1257'],
325
        'ar' => ['nsis' => "Arabic", 'cp' => '1256'],
326
        'he' => ['nsis' => "Hebrew", 'cp' => '1255'],
327
        'id' => ['nsis' => "Indonesian", 'cp' => '1252'],
328
        'mn' => ['nsis' => "Mongolian", 'cp' => '1251'],
329
        'sq' => ['nsis' => "Albanian", 'cp' => '1252'],
330
        'br' => ['nsis' => "Breton", 'cp' => '1252'],
331
        'be' => ['nsis' => "Belarusian", 'cp' => '1251'],
332
        'is' => ['nsis' => "Icelandic", 'cp' => '1252'],
333
        'ms' => ['nsis' => "Malay", 'cp' => '1252'],
334
        'bs' => ['nsis' => "Bosnian", 'cp' => '1250'],
335
        'ga' => ['nsis' => "Irish", 'cp' => '1250'],
336
        'uz' => ['nsis' => "Uzbek", 'cp' => '1251'],
337
        'gl' => ['nsis' => "Galician", 'cp' => '1252'],
338
        'af' => ['nsis' => "Afrikaans", 'cp' => '1252'],
339
        'ast' => ['nsis' => "Asturian", 'cp' => '1252'],
340
    ];
341
    public $codePage;
342
    public $lang;
343
    public $useGeantLink;
344
345
}
346