Passed
Push — master ( afdc54...484f87 )
by Tomasz
07:25 queued 01:37
created

WindowsCommon::writeAdditionalDeletes()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

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