diff options
| author | Jan Tatje <jan@jnt.io> | 2022-08-12 21:08:59 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-12 12:08:59 -0700 |
| commit | 7c5346cbabfb9b7057506e0775faa7f74fd31157 (patch) | |
| tree | daa1032ee1528e70f1b0322c5f3974a738633b21 /src | |
| parent | eba3c1a6629e832db1da713825043d162bec9d28 (diff) | |
Add support for EAP-PWD (#246)
I also added a German translation of the new strings.
Diffstat (limited to 'src')
| -rw-r--r-- | src/App.js | 35 | ||||
| -rw-r--r-- | src/components/Settings.js | 13 | ||||
| -rw-r--r-- | src/components/WifiCard.js | 49 | ||||
| -rw-r--r-- | src/translations.js | 10 |
4 files changed, 103 insertions, 4 deletions
| @@ -18,6 +18,10 @@ function App() { | |||
| 18 | password: '', | 18 | password: '', |
| 19 | // Settings: Network encryption mode | 19 | // Settings: Network encryption mode |
| 20 | encryptionMode: 'WPA', | 20 | encryptionMode: 'WPA', |
| 21 | // Settings: EAP Method | ||
| 22 | eapMethod: 'PWD', | ||
| 23 | // Settings: EAP identity | ||
| 24 | eapIdentity: '', | ||
| 21 | // Settings: Hide password on the printed card | 25 | // Settings: Hide password on the printed card |
| 22 | hidePassword: false, | 26 | hidePassword: false, |
| 23 | // Settings: Mark your network as hidden SSID | 27 | // Settings: Mark your network as hidden SSID |
| @@ -28,6 +32,7 @@ function App() { | |||
| 28 | const [errors, setErrors] = useState({ | 32 | const [errors, setErrors] = useState({ |
| 29 | ssidError: '', | 33 | ssidError: '', |
| 30 | passwordError: '', | 34 | passwordError: '', |
| 35 | eapIdentityError: '', | ||
| 31 | }); | 36 | }); |
| 32 | 37 | ||
| 33 | const htmlDirection = (languageID) => { | 38 | const htmlDirection = (languageID) => { |
| @@ -63,6 +68,26 @@ function App() { | |||
| 63 | }); | 68 | }); |
| 64 | return; | 69 | return; |
| 65 | } | 70 | } |
| 71 | if ( | ||
| 72 | settings.password.length < 1 && | ||
| 73 | settings.encryptionMode === 'WPA2-EAP' | ||
| 74 | ) { | ||
| 75 | setErrors({ | ||
| 76 | ...errors, | ||
| 77 | passwordError: t('wifi.alert.password'), | ||
| 78 | }); | ||
| 79 | return; | ||
| 80 | } | ||
| 81 | if ( | ||
| 82 | settings.eapIdentity.length < 1 && | ||
| 83 | settings.encryptionMode === 'WPA2-EAP' | ||
| 84 | ) { | ||
| 85 | setErrors({ | ||
| 86 | ...errors, | ||
| 87 | eapIdentityError: t('wifi.alert.eapIdentity'), | ||
| 88 | }); | ||
| 89 | return; | ||
| 90 | } | ||
| 66 | document.title = 'WiFi Card - ' + settings.ssid; | 91 | document.title = 'WiFi Card - ' + settings.ssid; |
| 67 | window.print(); | 92 | window.print(); |
| 68 | }; | 93 | }; |
| @@ -79,6 +104,13 @@ function App() { | |||
| 79 | setErrors({ ...errors, passwordError: '' }); | 104 | setErrors({ ...errors, passwordError: '' }); |
| 80 | setSettings({ ...settings, encryptionMode }); | 105 | setSettings({ ...settings, encryptionMode }); |
| 81 | }; | 106 | }; |
| 107 | const onEapMethodChange = (eapMethod) => { | ||
| 108 | setSettings({ ...settings, eapMethod }); | ||
| 109 | }; | ||
| 110 | const onEapIdentityChange = (eapIdentity) => { | ||
| 111 | setErrors({ ...errors, eapIdentityError: '' }); | ||
| 112 | setSettings({ ...settings, eapIdentity }); | ||
| 113 | }; | ||
| 82 | const onOrientationChange = (portrait) => { | 114 | const onOrientationChange = (portrait) => { |
| 83 | setSettings({ ...settings, portrait }); | 115 | setSettings({ ...settings, portrait }); |
| 84 | }; | 116 | }; |
| @@ -125,7 +157,9 @@ function App() { | |||
| 125 | settings={settings} | 157 | settings={settings} |
| 126 | ssidError={errors.ssidError} | 158 | ssidError={errors.ssidError} |
| 127 | passwordError={errors.passwordError} | 159 | passwordError={errors.passwordError} |
| 160 | eapIdentityError={errors.eapIdentityError} | ||
| 128 | onSSIDChange={onSSIDChange} | 161 | onSSIDChange={onSSIDChange} |
| 162 | onEapIdentityChange={onEapIdentityChange} | ||
| 129 | onPasswordChange={onPasswordChange} | 163 | onPasswordChange={onPasswordChange} |
| 130 | /> | 164 | /> |
| 131 | 165 | ||
| @@ -135,6 +169,7 @@ function App() { | |||
| 135 | onFirstLoad={onFirstLoad} | 169 | onFirstLoad={onFirstLoad} |
| 136 | onLanguageChange={onChangeLanguage} | 170 | onLanguageChange={onChangeLanguage} |
| 137 | onEncryptionModeChange={onEncryptionModeChange} | 171 | onEncryptionModeChange={onEncryptionModeChange} |
| 172 | onEapMethodChange={onEapMethodChange} | ||
| 138 | onOrientationChange={onOrientationChange} | 173 | onOrientationChange={onOrientationChange} |
| 139 | onHidePasswordChange={onHidePasswordChange} | 174 | onHidePasswordChange={onHidePasswordChange} |
| 140 | onHiddenSSIDChange={onHiddenSSIDChange} | 175 | onHiddenSSIDChange={onHiddenSSIDChange} |
diff --git a/src/components/Settings.js b/src/components/Settings.js index f12fe35..a0dbab5 100644 --- a/src/components/Settings.js +++ b/src/components/Settings.js | |||
| @@ -10,9 +10,10 @@ export const Settings = (props) => { | |||
| 10 | const encryptionModes = [ | 10 | const encryptionModes = [ |
| 11 | { label: t('wifi.password.encryption.none'), value: '' }, | 11 | { label: t('wifi.password.encryption.none'), value: '' }, |
| 12 | { label: 'WPA/WPA2/WPA3', value: 'WPA' }, | 12 | { label: 'WPA/WPA2/WPA3', value: 'WPA' }, |
| 13 | { label: 'WPA2-EAP', value: 'WPA2-EAP' }, | ||
| 13 | { label: 'WEP', value: 'WEP' }, | 14 | { label: 'WEP', value: 'WEP' }, |
| 14 | ]; | 15 | ]; |
| 15 | 16 | const eapMethods = [{ label: 'PWD', value: 'PWD' }]; | |
| 16 | const langSelectDefaultValue = () => { | 17 | const langSelectDefaultValue = () => { |
| 17 | const t = Translations.filter((t) => t.id === i18n.language); | 18 | const t = Translations.filter((t) => t.id === i18n.language); |
| 18 | if (t.length !== 1) { | 19 | if (t.length !== 1) { |
| @@ -68,6 +69,16 @@ export const Settings = (props) => { | |||
| 68 | options={encryptionModes} | 69 | options={encryptionModes} |
| 69 | onChange={(e) => props.onEncryptionModeChange(e.target.value)} | 70 | onChange={(e) => props.onEncryptionModeChange(e.target.value)} |
| 70 | /> | 71 | /> |
| 72 | <RadioGroup | ||
| 73 | label={t('wifi.encryption.eapMethod')} | ||
| 74 | size={16} | ||
| 75 | value={props.settings.eapMethod} | ||
| 76 | options={eapMethods} | ||
| 77 | className={` | ||
| 78 | ${props.settings.encryptionMode !== 'WPA2-EAP' && 'hidden'} | ||
| 79 | `} | ||
| 80 | onChange={(e) => props.onEapMethodChange(e.target.value)} | ||
| 81 | /> | ||
| 71 | </Pane> | 82 | </Pane> |
| 72 | ); | 83 | ); |
| 73 | }; | 84 | }; |
diff --git a/src/components/WifiCard.js b/src/components/WifiCard.js index 8edf147..35f35a7 100644 --- a/src/components/WifiCard.js +++ b/src/components/WifiCard.js | |||
| @@ -37,9 +37,11 @@ export const WifiCard = (props) => { | |||
| 37 | const password = !props.settings.encryptionMode | 37 | const password = !props.settings.encryptionMode |
| 38 | ? '' | 38 | ? '' |
| 39 | : escape(props.settings.password); | 39 | : escape(props.settings.password); |
| 40 | setQrvalue( | 40 | const qrval = |
| 41 | `WIFI:T:${props.settings.encryptionMode};S:${ssid};P:${password};H:${props.settings.hiddenSSID};` | 41 | props.settings.encryptionMode === 'WPA2-EAP' |
| 42 | ); | 42 | ? `WIFI:T:${props.settings.encryptionMode};S:${ssid};P:${password};H:${props.settings.hiddenSSID};E:${props.settings.eapMethod};I:${props.settings.eapIdentity};;` |
| 43 | : `WIFI:T:${props.settings.encryptionMode};S:${ssid};P:${password};H:${props.settings.hiddenSSID};;`; | ||
| 44 | setQrvalue(qrval); | ||
| 43 | }, [props.settings]); | 45 | }, [props.settings]); |
| 44 | 46 | ||
| 45 | const portraitWidth = () => { | 47 | const portraitWidth = () => { |
| @@ -53,6 +55,15 @@ export const WifiCard = (props) => { | |||
| 53 | return hiddenPassword ? '' : t('wifi.password'); | 55 | return hiddenPassword ? '' : t('wifi.password'); |
| 54 | }; | 56 | }; |
| 55 | 57 | ||
| 58 | const eapIdentityFieldLabel = () => { | ||
| 59 | const hiddenIdentity = props.settings.encryptionMode !== 'WPA2-EAP'; | ||
| 60 | return hiddenIdentity ? '' : t('wifi.identity'); | ||
| 61 | }; | ||
| 62 | |||
| 63 | const eapMethodFieldLabel = () => { | ||
| 64 | return !eapIdentityFieldLabel() ? '' : t('wifi.encryption.eapMethod'); | ||
| 65 | }; | ||
| 66 | |||
| 56 | return ( | 67 | return ( |
| 57 | <Pane> | 68 | <Pane> |
| 58 | <Card | 69 | <Card |
| @@ -101,6 +112,38 @@ export const WifiCard = (props) => { | |||
| 101 | validationMessage={!!props.ssidError && props.ssidError} | 112 | validationMessage={!!props.ssidError && props.ssidError} |
| 102 | /> | 113 | /> |
| 103 | <TextareaField | 114 | <TextareaField |
| 115 | id="eapmethod" | ||
| 116 | type="text" | ||
| 117 | marginBottom={5} | ||
| 118 | readOnly={true} | ||
| 119 | spellCheck={false} | ||
| 120 | className={` | ||
| 121 | ${props.settings.encryptionMode !== 'WPA2-EAP' && 'hidden'} | ||
| 122 | `} | ||
| 123 | label={eapMethodFieldLabel()} | ||
| 124 | value={props.settings.eapMethod} | ||
| 125 | /> | ||
| 126 | <TextareaField | ||
| 127 | id="identity" | ||
| 128 | type="text" | ||
| 129 | marginBottom={5} | ||
| 130 | autoComplete="off" | ||
| 131 | autoCorrect="off" | ||
| 132 | autoCapitalize="none" | ||
| 133 | spellCheck={false} | ||
| 134 | className={` | ||
| 135 | ${props.settings.encryptionMode !== 'WPA2-EAP' && 'hidden'} | ||
| 136 | `} | ||
| 137 | label={eapIdentityFieldLabel()} | ||
| 138 | placeholder={t('wifi.identity.placeholder')} | ||
| 139 | value={props.settings.eapIdentity} | ||
| 140 | onChange={(e) => props.onEapIdentityChange(e.target.value)} | ||
| 141 | isInvalid={!!props.eapIdentityError} | ||
| 142 | validationMessage={ | ||
| 143 | !!props.eapIdentityError && props.eapIdentityError | ||
| 144 | } | ||
| 145 | /> | ||
| 146 | <TextareaField | ||
| 104 | id="password" | 147 | id="password" |
| 105 | type="text" | 148 | type="text" |
| 106 | maxLength="63" | 149 | maxLength="63" |
diff --git a/src/translations.js b/src/translations.js index 861716d..d9d6fa4 100644 --- a/src/translations.js +++ b/src/translations.js | |||
| @@ -9,6 +9,8 @@ export const Translations = [ | |||
| 9 | 'desc.privacy': | 9 | 'desc.privacy': |
| 10 | 'Your WiFi information is never sent to the server. No tracking, analytics, or fingerprinting are used on this website. View the', | 10 | 'Your WiFi information is never sent to the server. No tracking, analytics, or fingerprinting are used on this website. View the', |
| 11 | 'desc.source': 'source code', | 11 | 'desc.source': 'source code', |
| 12 | 'wifi.identity': 'Identity', | ||
| 13 | 'wifi.identity.placeholder': 'Username', | ||
| 12 | 'wifi.login': 'WiFi Login', | 14 | 'wifi.login': 'WiFi Login', |
| 13 | 'wifi.name': 'Network name', | 15 | 'wifi.name': 'Network name', |
| 14 | 'wifi.name.hiddenSSID': 'Hidden SSID', | 16 | 'wifi.name.hiddenSSID': 'Hidden SSID', |
| @@ -18,13 +20,16 @@ export const Translations = [ | |||
| 18 | 'wifi.password.hide': 'Hide password', | 20 | 'wifi.password.hide': 'Hide password', |
| 19 | 'wifi.password.encryption': 'Encryption', | 21 | 'wifi.password.encryption': 'Encryption', |
| 20 | 'wifi.password.encryption.none': 'None', | 22 | 'wifi.password.encryption.none': 'None', |
| 23 | 'wifi.encryption.eapMethod': 'EAP method', | ||
| 21 | 'wifi.tip': | 24 | 'wifi.tip': |
| 22 | "Point your phone's camera at the QR Code to connect automatically", | 25 | "Point your phone's camera at the QR Code to connect automatically", |
| 23 | 'wifi.alert.name': 'Network name cannot be empty', | 26 | 'wifi.alert.name': 'Network name cannot be empty', |
| 27 | 'wifi.alert.password': 'Password cannot be empty', | ||
| 24 | 'wifi.alert.password.length.5': | 28 | 'wifi.alert.password.length.5': |
| 25 | 'Password must be at least 5 characters, or change the encryption to "None"', | 29 | 'Password must be at least 5 characters, or change the encryption to "None"', |
| 26 | 'wifi.alert.password.length.8': | 30 | 'wifi.alert.password.length.8': |
| 27 | 'Password must be at least 8 characters, or change the encryption to "None"', | 31 | 'Password must be at least 8 characters, or change the encryption to "None"', |
| 32 | 'wifi.alert.eapIdentity': 'Identity cannot be empty', | ||
| 28 | 'button.rotate': 'Rotate', | 33 | 'button.rotate': 'Rotate', |
| 29 | 'button.print': 'Print', | 34 | 'button.print': 'Print', |
| 30 | select: 'Select Language', | 35 | select: 'Select Language', |
| @@ -436,6 +441,8 @@ export const Translations = [ | |||
| 436 | 'desc.privacy': | 441 | 'desc.privacy': |
| 437 | 'Deine Zugangsdaten werden niemals zum Server gesendet. Es gibt kein Tracking, Analytics, oder Fingerprinting auf dieser Website. Hier geht es zum', | 442 | 'Deine Zugangsdaten werden niemals zum Server gesendet. Es gibt kein Tracking, Analytics, oder Fingerprinting auf dieser Website. Hier geht es zum', |
| 438 | 'desc.source': 'Quellcode', | 443 | 'desc.source': 'Quellcode', |
| 444 | 'wifi.identity': 'Identität', | ||
| 445 | 'wifi.identity.placeholder': 'Nutzername', | ||
| 439 | 'wifi.login': 'WLAN-Zugangsdaten', | 446 | 'wifi.login': 'WLAN-Zugangsdaten', |
| 440 | 'wifi.name': 'WLAN-Netzwerkname (SSID)', | 447 | 'wifi.name': 'WLAN-Netzwerkname (SSID)', |
| 441 | 'wifi.name.placeholder': 'WLAN-Netzwerkname (SSID)', | 448 | 'wifi.name.placeholder': 'WLAN-Netzwerkname (SSID)', |
| @@ -445,13 +452,16 @@ export const Translations = [ | |||
| 445 | 'wifi.name.hiddenSSID': 'Versteckte SSID', | 452 | 'wifi.name.hiddenSSID': 'Versteckte SSID', |
| 446 | 'wifi.password.encryption': 'Verschlüsselung', | 453 | 'wifi.password.encryption': 'Verschlüsselung', |
| 447 | 'wifi.password.encryption.none': 'Keine', | 454 | 'wifi.password.encryption.none': 'Keine', |
| 455 | 'wifi.encryption.eapMethod': 'EAP Methode', | ||
| 448 | 'wifi.tip': | 456 | 'wifi.tip': |
| 449 | 'Zeige mit der Kamera deines Handys auf den QR-Code, um automatisch eine Verbindung herzustellen', | 457 | 'Zeige mit der Kamera deines Handys auf den QR-Code, um automatisch eine Verbindung herzustellen', |
| 450 | 'wifi.alert.name': 'Der Netzwerkname darf nicht leer sein', | 458 | 'wifi.alert.name': 'Der Netzwerkname darf nicht leer sein', |
| 459 | 'wifi.alert.password': 'Das Passwort darf nicht leer sein', | ||
| 451 | 'wifi.alert.password.length.5': | 460 | 'wifi.alert.password.length.5': |
| 452 | 'Das Passwort muss mindestends 5 Zeichen lang sein, oder stelle die Verschlüsselung auf "Keine"', | 461 | 'Das Passwort muss mindestends 5 Zeichen lang sein, oder stelle die Verschlüsselung auf "Keine"', |
| 453 | 'wifi.alert.password.8': | 462 | 'wifi.alert.password.8': |
| 454 | 'Das Passwort muss mindestends 8 Zeichen lang sein, oder stelle die Verschlüsselung auf "Keine"', | 463 | 'Das Passwort muss mindestends 8 Zeichen lang sein, oder stelle die Verschlüsselung auf "Keine"', |
| 464 | 'wifi.alert.eapIdentity': 'Die Identität darf nicht leer sein', | ||
| 455 | 'button.rotate': 'Drehen', | 465 | 'button.rotate': 'Drehen', |
| 456 | 'button.print': 'Drucken', | 466 | 'button.print': 'Drucken', |
| 457 | select: 'Sprache auswählen', | 467 | select: 'Sprache auswählen', |
