Test Failed
Push — master ( 1c755b...e1e902 )
by Tomasz
03:13
created

WindowsCommon::scaleLogo()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 19
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 15
nc 3
nop 2
dl 0
loc 19
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
    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
172
        $useFederationLogo = FALSE;
173
174
        $bgImage = new \Imagick('cat_bg.bmp');
175
        $bgImage->setFormat('BMP3');
176
        $bgImageSize = $bgImage->getImageGeometry();
177
        $usedHeight = 0;
0 ignored issues
show
Unused Code introduced by
$usedHeight is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
178
        $logosToPlace = [];
179
        $this->background = [];
180
        $this->background['freeHeight'] = $bgImageSize['height'] - $freeTop - $freeBottom;
181
182
        if ($useFederationLogo && $fedLogo != NULL) {
183
            $logosToPlace[] = $this->scaleLogo($fedLogo[0]['name'],$maxSize);
184
        }
185
        if ($logos != NULL) {
186
            $logosToPlace[] = $this->scaleLogo($logos[0]['name'],$maxSize);
187
        }
188
189
        $logoCount = count($logosToPlace);
190
        if ($logoCount > 0) {
191
            $voffset = $freeTop;
192
            $freeSpace = round($this->background['freeHeight'] / ($logoCount + 1));
193
            foreach ($logosToPlace as $logo) {
194
                $voffset += $freeSpace;
195
                $logoSize = $logo->getImageGeometry();
196
                $hoffset = round(($bgImageSize['width'] - $logoSize['width']) / 2);
197
                $bgImage->compositeImage($logo, $logo->getImageCompose(), $hoffset, $voffset);
198
                $voffset += $logoSize['height'];
199
                }
200
        }
201
202
//new image is saved as the background
203
        $bgImage->writeImage('BMP3:cat_bg.bmp');
204
    }
205
206
    protected function signInstaller() {
207
        $fileName = $this->installerBasename . '.exe';
208
        if (!$this->sign) {
209
            rename("installer.exe", $fileName);
210
            return $fileName;
211
        }
212
        // are actually signing
213
        $outputFromSigning = system($this->sign . " installer.exe '$fileName' > /dev/null");
214
        if ($outputFromSigning === FALSE) {
215
            $this->loggerInstance->debug(2, "Signing the WindowsCommon installer $fileName FAILED!\n");
216
        }
217
        return $fileName;
218
    }
219
220
    protected function compileNSIS() {
221
        if (CONFIG_CONFASSISTANT['NSIS_VERSION'] >= 3) {
222
            $makensis = CONFIG_CONFASSISTANT['PATHS']['makensis'] . " -INPUTCHARSET UTF8";
223
        } else {
224
            $makensis = CONFIG_CONFASSISTANT['PATHS']['makensis'];
225
        }
226
        $command = $makensis . ' -V4 cat.NSI > nsis.log';
227
        system($command);
228
        $this->loggerInstance->debug(4, "compileNSIS:$command\n");
229
    }
230
231
    protected function msInfoFile($attr) {
232
        $out = '';
233
        if (isset($attr['support:info_file'])) {
234
            $out .= '!define EXTERNAL_INFO "';
235
//  $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...
236
            if ($attr['internal:info_file'][0]['mime'] == 'rtf') {
237
                $out = '!define LICENSE_FILE "' . $attr['internal:info_file'][0]['name'];
238
            } elseif ($attr['internal:info_file'][0]['mime'] == 'txt') {
239
                $infoFile = file_get_contents($attr['internal:info_file'][0]['name']);
240
                if (CONFIG_CONFASSISTANT['NSIS_VERSION'] >= 3) {
241
                    $infoFileConverted = $infoFile;
242
                } else {
243
                    $infoFileConverted = iconv('UTF-8', $this->codePage . '//TRANSLIT', $infoFile);
244
                }
245
                if ($infoFileConverted) {
246
                    file_put_contents('info_f.txt', $infoFileConverted);
247
                    $out = '!define LICENSE_FILE " info_f.txt';
248
                }
249
            } else {
250
                $out = '!define EXTERNAL_INFO "' . $attr['internal:info_file'][0]['name'];
251
            }
252
253
            $out .= "\"\n";
254
        }
255
        $this->loggerInstance->debug(4, "Info file returned: $out");
256
        return $out;
257
    }
258
259
    protected function writeAdditionalDeletes($profiles) {
260
        if (count($profiles) == 0) {
261
            return;
262
        }
263
        $fileHandle = fopen('profiles.nsh', 'a');
264
        fwrite($fileHandle, "!define AdditionalDeletes\n");
265
        foreach ($profiles as $profile) {
266
            fwrite($fileHandle, "!insertmacro define_delete_profile \"$profile\"\n");
267
        }
268
        fclose($fileHandle);
269
    }
270
271
    protected function writeClientP12File() {
272
        if (!is_array($this->clientCert)) {
273
            throw new Exception("the client block was called but there is no client certificate!");
274
        }
275
        $fileHandle = fopen('SB_cert.p12', 'w');
276
        fwrite($fileHandle, $this->clientCert["certdata"]);
277
        fclose($fileHandle);
278
    }
279
280
    protected function writeTlsUserProfile() {
281
        
282
    }
283
284
    public $LANGS = [
285
        'fr' => ['nsis' => "French", 'cp' => '1252'],
286
        'de' => ['nsis' => "German", 'cp' => '1252'],
287
        'es' => ['nsis' => "SpanishInternational", 'cp' => '1252'],
288
        'it' => ['nsis' => "Italian", 'cp' => '1252'],
289
        'nl' => ['nsis' => "Dutch", 'cp' => '1252'],
290
        'sv' => ['nsis' => "Swedish", 'cp' => '1252'],
291
        'fi' => ['nsis' => "Finnish", 'cp' => '1252'],
292
        'pl' => ['nsis' => "Polish", 'cp' => '1250'],
293
        'ca' => ['nsis' => "Catalan", 'cp' => '1252'],
294
        'sr' => ['nsis' => "SerbianLatin", 'cp' => '1250'],
295
        'hr' => ['nsis' => "Croatian", 'cp' => '1250'],
296
        'sl' => ['nsis' => "Slovenian", 'cp' => '1250'],
297
        'da' => ['nsis' => "Danish", 'cp' => '1252'],
298
        'nb' => ['nsis' => "Norwegian", 'cp' => '1252'],
299
        'nn' => ['nsis' => "NorwegianNynorsk", 'cp' => '1252'],
300
        'el' => ['nsis' => "Greek", 'cp' => '1253'],
301
        'ru' => ['nsis' => "Russian", 'cp' => '1251'],
302
        'pt' => ['nsis' => "Portuguese", 'cp' => '1252'],
303
        'uk' => ['nsis' => "Ukrainian", 'cp' => '1251'],
304
        'cs' => ['nsis' => "Czech", 'cp' => '1250'],
305
        'sk' => ['nsis' => "Slovak", 'cp' => '1250'],
306
        'bg' => ['nsis' => "Bulgarian", 'cp' => '1251'],
307
        'hu' => ['nsis' => "Hungarian", 'cp' => '1250'],
308
        'ro' => ['nsis' => "Romanian", 'cp' => '1250'],
309
        'lv' => ['nsis' => "Latvian", 'cp' => '1257'],
310
        'mk' => ['nsis' => "Macedonian", 'cp' => '1251'],
311
        'et' => ['nsis' => "Estonian", 'cp' => '1257'],
312
        'tr' => ['nsis' => "Turkish", 'cp' => '1254'],
313
        'lt' => ['nsis' => "Lithuanian", 'cp' => '1257'],
314
        'ar' => ['nsis' => "Arabic", 'cp' => '1256'],
315
        'he' => ['nsis' => "Hebrew", 'cp' => '1255'],
316
        'id' => ['nsis' => "Indonesian", 'cp' => '1252'],
317
        'mn' => ['nsis' => "Mongolian", 'cp' => '1251'],
318
        'sq' => ['nsis' => "Albanian", 'cp' => '1252'],
319
        'br' => ['nsis' => "Breton", 'cp' => '1252'],
320
        'be' => ['nsis' => "Belarusian", 'cp' => '1251'],
321
        'is' => ['nsis' => "Icelandic", 'cp' => '1252'],
322
        'ms' => ['nsis' => "Malay", 'cp' => '1252'],
323
        'bs' => ['nsis' => "Bosnian", 'cp' => '1250'],
324
        'ga' => ['nsis' => "Irish", 'cp' => '1250'],
325
        'uz' => ['nsis' => "Uzbek", 'cp' => '1251'],
326
        'gl' => ['nsis' => "Galician", 'cp' => '1252'],
327
        'af' => ['nsis' => "Afrikaans", 'cp' => '1252'],
328
        'ast' => ['nsis' => "Asturian", 'cp' => '1252'],
329
    ];
330
    public $codePage;
331
    public $lang;
332
    public $useGeantLink;
333
    public $background;
334
335
}
336