Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

OPNsense Captive Portal mit vordefnierten Voucher

Mitglied: Crusher79

Crusher79 (Level 2) - Jetzt verbinden

21.09.2019, aktualisiert 12:25 Uhr, 882 Aufrufe, 2 Danke

Hallo,

Ziel war es vorhandene Klienten-Daten (Nummer im System) und Kennwörter anzulegen. Voucher werden durch externes Programm in Papierform erstellt, weswegen die Daten schon vorher vorliegen.

Für die API sind hier nur 2x Dateinen zu modifzieren - ACHTUNG diese werden auch von anderen Funktionen genutzt. Fehler in der Datei könne zu Folgefehlern führen:

/usr/local/opnsense/mvc/app/library/OPNsense/Auth/voucher.php

/usr/local/opnsense/mvc/app/controllers/OPNsense/CaptivePortal/Api/VoucherController.php


Vorab: es ist nicht gerade eine beständige Lösung. Ein OPNsense Update kann dazu führen, dass diese 2x Dateien wieder überschrieben werden. Positiv wäre zu erwähnen, dass sich hier in den letzten Monaten aber kaum was geändert hat und man teils einfach die angepassten Dateien wieder drüber kopieren kann.

Es gilt: Einfaches Datei-Compare Tool vorher drüber laufen lassen. Ggf. OPNsense in virtueller Maschine laufen lassen und Update dort vorher einmal testen. Vom Aufwand her ist es überschaubar.

Habe einmal die kompletten Blöcke kopiert, damit es einfach ist die Stelle zu finden. Im Prinzip wurden neue 2x neue Variablen eingegfügt, die Name und Kennwort via API aufnehmen. Im 2. Schritt wurde entsprechend die Vouchererstellung so werweitert, dass bei Übergabe des $usernamedef kein generiertes Name und Kennwort übernommen wird, sondern das via API übergebende.

Voraussetzung ist, dass ein gültiger API-Key vorliegt. Informationen und Beispiel findet ihr hier: https://docs.opnsense.org/development/how-tos/api.html

01.
curl -XPOST -d "{\"count\":\"1\",\"validity\":\"14400\",\"usernamedef\":\"jondooNEU\",\"passworddef\":\"geheim\",\"vouchergroup\":\"test\"}" -H "Content-Type: application/json" -k -u "MOzGhDB6jRKvmcSqt5YFeFFvFUVFpayYhcdNV+4pefV6hrv3jJmeQmvnf1V+Qysq4rFuVKRvMMGXCzOX":"v5LO4UyEdVRa+BVjOzjEyKQDREx9WcYg9kQUsrPNiZMA6Fz4jrdOPdacBPAnT5IBZTcKkaXxLK9O3tub" http://192.168.0.1/api/captiveportal/voucher/generateVouchers/VoucherSrv/
ACHTUNG: Windows Beipspiel! Darum wurden " mit \ escaped. Statt CURL kann man jede andere Form von Requets nehmen - Sprachen abhängig. CURL kann jeder aber einfach auch Windows nutzen. Darum beschränkt sich mein Beipspiel hier drauf. Ob ihr C#, C++, Perl etc. nehmt ist egal.

Kurz zur Erläuterung:
count: ist die Anzahl. Normal wird über die GUI hier mitgeteilt, wieviele Vouchers die CSV beinhalten soll
validity: Gültigkeit in Sekunden. Hier kann beliebig arbeiten. 4 Std,. 4 Tage oder 4 Wochen.
usernamedef: Der vorher festgelegte Name
passworddef: Das zuvor vergebene Kennwort.
vouchergroup: Der frei defnierbare Gruppename! ACHTUNG. Wen Tickets auch später über API gesperrt werden sollen, hier am besten eine Grupee für alle nehmen. Der Gruppename muss später teils mit angegeben werden.

Zur URL:
VoucherSrv: Ist der Voucher Server Name. Die OPNsense kann mehrere verwalten. Achtet immer auf den richtigen. Sonst geht der Request ins leere.

Wenn der Befehl erfolgreich war, bekommt ihr folgende Meldung:

01.
[{"username":"test","password":"4vFkfV","vouchergroup":"WLAN01","validity":"3628800","expirytime":"0","starttime":null}]

Warum kein "OK". Das liegt daran, dass im orinmal mehrere Vouchers ausgeben werden. Die Antwort kommt im JSON Format zurück. Kann aber auch so einfach validiert werden. In dem man JSON liest und die Werte vergleicht.

Da sinder Phantasie keine Grenzen gesezt.






ACHTUNG: Fehlerhafter Code hat Auswirkungen auf das gesamte System! Die Voucher.php wird NICHT NUR vom Captive Portal benutzt.



/usr/local/opnsense/mvc/app/controllers/OPNsense/CaptivePortal/Api/VoucherController.php

Original:
01.
    /**
02.
     * generate new vouchers
03.
     * @param string $provider auth provider
04.
     * @return array generated vouchers
05.
     */
06.
    public function generateVouchersAction($provider)
07.
    {
08.
        $response = array("status" => "error");
09.
        if ($this->request->isPost()) {
10.
            $authFactory = new AuthenticationFactory();
11.
            $auth = $authFactory->get(urldecode($provider));
12.
            if ($auth != null && method_exists($auth, 'generateVouchers')) {
13.
                $count = $this->request->getPost('count', 'int', 0);
14.
                $validity = $this->request->getPost('validity', 'int', 0);
15.
                $expirytime = $this->request->getPost('expirytime', 'int', 0);
16.
                $vouchergroup = $this->request->getPost('vouchergroup', 'striptags', '---');
17.
                // remove characters which are known to provide issues when using in the url
18.
                foreach (array("&", "#") as $skip_chars) {
19.
                    $vouchergroup = str_replace($skip_chars, "", $vouchergroup);
20.
                }
21.
                if ($count > 0 && $count <= 10000 && $validity > 0) {
22.
                    return $auth->generateVouchers($vouchergroup, $count, $validity, $expirytime);
23.
                }
24.
            }
25.
        }
26.
        return $response;
27.
    }
Mod:
01.
    /**
02.
     * generate new vouchers
03.
     * @param string $provider auth provider
04.
     * @return array generated vouchers
05.
     */
06.
    public function generateVouchersAction($provider)
07.
    {
08.
        $response = array("status" => "error");
09.
        if ($this->request->isPost()) {
10.
            $authFactory = new AuthenticationFactory();
11.
            $auth = $authFactory->get(urldecode($provider));
12.
            if ($auth != null && method_exists($auth, 'generateVouchers')) {
13.
                $count = $this->request->getPost('count', 'int', 0);
14.
                $validity = $this->request->getPost('validity', 'int', 0);
15.
                $expirytime = $this->request->getPost('expirytime', 'int', 0);
16.
                $vouchergroup = $this->request->getPost('vouchergroup', 'striptags', '---');
17.
				$usernamedef = $this->request->getPost('usernamedef', 'striptags', '---');
18.
				$passworddef = $this->request->getPost('passworddef', 'striptags', '---');
19.
                // remove characters which are known to provide issues when using in the url
20.
                foreach (array("&", "#") as $skip_chars) {
21.
                    $vouchergroup = str_replace($skip_chars, "", $vouchergroup);
22.
                }
23.
                if ($count > 0 && $count <= 10000 && $validity > 0) {
24.
					return $auth->generateVouchers($vouchergroup, $count, $validity, $usernamedef, $passworddef, $expirytime);
25.
                }
26.
            }
27.
        }
28.
        return $response;
29.
    }




/usr/local/opnsense/mvc/app/library/OPNsense/Auth/voucher.php

Org:
01.
    /**
02.
     * generate new vouchers and store in voucher database
03.
     * @param string $vouchergroup voucher groupname
04.
     * @param int $count number of vouchers to generate
05.
     * @param int $validity time (in seconds)
06.
     * @param int $starttime valid from
07.
     * @param int $expirytime valid until ('0' means no expiry time)
08.
     * @return array list of generated vouchers
09.
     */
10.
    public function generateVouchers($vouchergroup, $count, $validity, $expirytime, $starttime = null)
11.
    {
12.
        $response = array();
13.
        if ($this->dbHandle != null) {
14.
            if ($this->simplePasswords) {
15.
                // create a map of easy to read characters
16.
                $characterMap = '';
17.
                while (strlen($characterMap) < 256) {
18.
                    $random_bytes = openssl_random_pseudo_bytes(10000);
19.
                    for ($i = 0; $i < strlen($random_bytes); $i++) {
20.
                        $chr_ord = ord($random_bytes[$i]);
21.
                        if (($chr_ord >= 50 && $chr_ord <= 57) || // 2..9
22.
                            ($chr_ord >= 65 && $chr_ord <= 72) || // A..H
23.
                            ($chr_ord >= 74 && $chr_ord <= 78) || // J..N
24.
                            ($chr_ord >= 80 && $chr_ord <= 90) || // P..Z
25.
                            ($chr_ord >= 97 && $chr_ord <= 107) || // a..k
26.
                            ($chr_ord >= 109 && $chr_ord <= 110) || // m..n
27.
                            ($chr_ord >= 112 && $chr_ord <= 122)  // p..z
28.
                        ) {
29.
                            $characterMap .= $random_bytes[$i];
30.
                        }
31.
                    }
32.
                }
33.
            } else {
34.
                // list of characters to skip for random generator
35.
                $doNotUseChr = array('<', '>', '{', '}', '&', 'l' , 'O' ,'`', '\'', '|' ,'^', '"');
36.

37.
                // create map of random readable characters
38.
                $characterMap = '';
39.
                while (strlen($characterMap) < 256) {
40.
                    $random_bytes = openssl_random_pseudo_bytes(10000);
41.
                    for ($i = 0; $i < strlen($random_bytes); $i++) {
42.
                        $chr_ord = ord($random_bytes[$i]);
43.
                        if ($chr_ord >= 33 && $chr_ord <= 125 && !in_array($random_bytes[$i], $doNotUseChr)) {
44.
                            $characterMap .= $random_bytes[$i];
45.
                        }
46.
                    }
47.
                }
48.
            }
49.

50.
            // generate new vouchers
51.
            $vouchersGenerated = 0;
52.
            $expirytime = $expirytime == 0 ? 0 : $expirytime + time();
53.
            while ($vouchersGenerated < $count) {
54.
                $generatedUsername = '';
55.
                $random_bytes = openssl_random_pseudo_bytes($this->usernameLength);
56.
                for ($j=0; $j < strlen($random_bytes); $j++) {
57.
                    $generatedUsername .= $characterMap[ord($random_bytes[$j])];
58.
                }
59.
                $generatedPassword = '';
60.
                $random_bytes = openssl_random_pseudo_bytes($this->passwordLength);
61.
                for ($j=0; $j < strlen($random_bytes); $j++) {
62.
                    $generatedPassword .= $characterMap[ord($random_bytes[$j])];
63.
                }
64.

65.
                if (!$this->userNameExists($generatedUsername)) {
66.
                    $vouchersGenerated++;
67.
                    // save user, hash password first
68.
                    $generatedPasswordHash = crypt($generatedPassword, '$6$');
69.
                    $stmt = $this->dbHandle->prepare('
70.
                                insert into vouchers(username, password, vouchergroup, validity, expirytime, starttime)
71.
                                values (:username, :password, :vouchergroup, :validity, :expirytime, :starttime)
72.
                                ');
73.
                    $stmt->bindParam(':username', $generatedUsername);
74.
                    $stmt->bindParam(':password', $generatedPasswordHash);
75.
                    $stmt->bindParam(':vouchergroup', $vouchergroup);
76.
                    $stmt->bindParam(':validity', $validity);
77.
                    $stmt->bindParam(':expirytime', $expirytime);
78.
                    $stmt->bindParam(':starttime', $starttime);
79.
                    $stmt->execute();
80.

81.
                    $row = array('username' => $generatedUsername,
82.
                        'password' => $generatedPassword,
83.
                        'vouchergroup' => $vouchergroup,
84.
                        'validity' => $validity,
85.
                        'expirytime' => $expirytime,
86.
                        'starttime' => $starttime
87.
                    );
88.
                    $response[] = $row;
89.
                }
90.
            }
91.
        }
92.
        return $response;
93.
    }
01.
    /**
02.
     * generate new vouchers and store in voucher database
03.
     * @param string $vouchergroup voucher groupname
04.
     * @param int $count number of vouchers to generate
05.
     * @param int $validity time (in seconds)
06.
     * @param int $starttime valid from
07.
     * @param int $expirytime valid until ('0' means no expiry time)
08.
     * @return array list of generated vouchers
09.
     */
10.
   	public function generateVouchers($vouchergroup, $count, $validity, $usernamedef, $passworddef, $expirytime, $starttime = null)
11.
    {
12.
        $response = array();
13.
        if ($this->dbHandle != null) {
14.
            if ($this->simplePasswords) {
15.
                // create a map of easy to read characters
16.
                $characterMap = '';
17.
                while (strlen($characterMap) < 256) {
18.
                    $random_bytes = openssl_random_pseudo_bytes(10000);
19.
                    for ($i = 0; $i < strlen($random_bytes); $i++) {
20.
                        $chr_ord = ord($random_bytes[$i]);
21.
                        if (($chr_ord >= 50 && $chr_ord <= 57) || // 2..9
22.
                            ($chr_ord >= 65 && $chr_ord <= 72) || // A..H
23.
                            ($chr_ord >= 74 && $chr_ord <= 78) || // J..N
24.
                            ($chr_ord >= 80 && $chr_ord <= 90) || // P..Z
25.
                            ($chr_ord >= 97 && $chr_ord <= 107) || // a..k
26.
                            ($chr_ord >= 109 && $chr_ord <= 110) || // m..n
27.
                            ($chr_ord >= 112 && $chr_ord <= 122)  // p..z
28.
                        ) {
29.
                            $characterMap .= $random_bytes[$i];
30.
                        }
31.
                    }
32.
                }
33.
            } else {
34.
                // list of characters to skip for random generator
35.
                $doNotUseChr = array('<', '>', '{', '}', '&', 'l' , 'O' ,'`', '\'', '|' ,'^', '"');
36.

37.
                // create map of random readable characters
38.
                $characterMap = '';
39.
                while (strlen($characterMap) < 256) {
40.
                    $random_bytes = openssl_random_pseudo_bytes(10000);
41.
                    for ($i = 0; $i < strlen($random_bytes); $i++) {
42.
                        $chr_ord = ord($random_bytes[$i]);
43.
                        if ($chr_ord >= 33 && $chr_ord <= 125 && !in_array($random_bytes[$i], $doNotUseChr)) {
44.
                            $characterMap .= $random_bytes[$i];
45.
                        }
46.
                    }
47.
                }
48.
            }
49.

50.
            // generate new vouchers
51.
            $vouchersGenerated = 0;
52.
            $expirytime = $expirytime == 0 ? 0 : $expirytime + time();
53.
            while ($vouchersGenerated < $count) {
54.
                $generatedUsername = '';
55.
                $random_bytes = openssl_random_pseudo_bytes($this->usernameLength);
56.
                for ($j=0; $j < strlen($random_bytes); $j++) {
57.
                    $generatedUsername .= $characterMap[ord($random_bytes[$j])];
58.
                }
59.
                $generatedPassword = '';
60.
                $random_bytes = openssl_random_pseudo_bytes($this->passwordLength);
61.
                for ($j=0; $j < strlen($random_bytes); $j++) {
62.
                    $generatedPassword .= $characterMap[ord($random_bytes[$j])];
63.
                }
64.

65.
				#### BLOCK BEGIN ###
66.
				if ($usernamedef != '---')  {
67.
                if (!$this->userNameExists($generatedUsername)) {
68.
                    $vouchersGenerated++;
69.
                    // save user, hash password first
70.
                    $generatedPasswordHash = crypt($passworddef, '$6$');
71.
                    $stmt = $this->dbHandle->prepare('
72.
                                insert into vouchers(username, password, vouchergroup, validity, expirytime, starttime)
73.
                                values (:username, :password, :vouchergroup, :validity, :expirytime, :starttime)
74.
                                ');
75.
                    $stmt->bindParam(':username', $usernamedef);
76.
                    $stmt->bindParam(':password', $generatedPasswordHash);
77.
                    $stmt->bindParam(':vouchergroup', $vouchergroup);
78.
                    $stmt->bindParam(':validity', $validity);
79.
                    $stmt->bindParam(':expirytime', $expirytime);
80.
                    $stmt->bindParam(':starttime', $starttime);
81.
                    $stmt->execute();
82.

83.
                    $row = array('username' => $usernamedef,
84.
                        'password' => $passworddef,
85.
                        'vouchergroup' => $vouchergroup,
86.
                        'validity' => $validity,
87.
                        'expirytime' => $expirytime,
88.
                        'starttime' => $starttime
89.
                    );
90.
                    $response[] = $row;
91.
                }
92.
				}
93.
				ELSE 
94.
				{
95.
                if (!$this->userNameExists($generatedUsername)) {
96.
                    $vouchersGenerated++;
97.
                    // save user, hash password first
98.
                    $generatedPasswordHash = crypt($generatedPassword, '$6$');
99.
                    $stmt = $this->dbHandle->prepare('
100.
                                insert into vouchers(username, password, vouchergroup, validity, expirytime, starttime)
101.
                                values (:username, :password, :vouchergroup, :validity, :expirytime, :starttime)
102.
                                ');
103.
                    $stmt->bindParam(':username', $generatedUsername);
104.
                    $stmt->bindParam(':password', $generatedPasswordHash);
105.
                    $stmt->bindParam(':vouchergroup', $vouchergroup);
106.
                    $stmt->bindParam(':validity', $validity);
107.
                    $stmt->bindParam(':expirytime', $expirytime);
108.
                    $stmt->bindParam(':starttime', $starttime);
109.
                    $stmt->execute();
110.

111.
                    $row = array('username' => $generatedUsername,
112.
                        'password' => $generatedPassword,
113.
                        'vouchergroup' => $vouchergroup,
114.
                        'validity' => $validity,
115.
                        'expirytime' => $expirytime,
116.
                        'starttime' => $starttime
117.
                    );
118.
                    $response[] = $row;
119.
                }
120.
				}
121.
				### BLOCK END ###
122.
            }
123.
        }
124.
        return $response;
125.
    }
Ähnliche Inhalte
Router & Routing
FRITZ!Box bringt Captive Portal
Information von KuemmelRouter & Routing11 Kommentare

Das sieht ja mal interessant aus! :-) Gruß Kümmel

Firewall

Pfsense Captive Portal Seiten im modernen Material UI Design erstellen

Anleitung von fhaeberleFirewall

Pfsense Captive Portal Seiten im modernen Material UI Design erstellen Diese Benutzeroberfläche wird in Kürze als Standard in die ...

Neue Wissensbeiträge
Humor (lol)
Das IoT wird schlimmer
Erfahrungsbericht von Henere vor 1 TagHumor (lol)7 Kommentare

Nun auch schon über den WSUS:

Sicherheit

Win10 1809 und höher erlauben nun das Sperren und Whitelisten von bestimmten Geräten

Tipp von DerWoWusste vor 2 TagenSicherheit1 Kommentar

Vor 1809 konnten nur Geräteklassen gesperrt werden, nun können endlich einzelne Device instance IDs gewhitelistet werden (oder andersherum: gesperrt ...

Windows 10

Hands-On: What is new in the Windows 10 November 2019 Update?

Information von DerWoWusste vor 2 TagenWindows 10

Die wenigen (aber zum Teil interessanten) Neuheiten werden in diesem Video sehr schnell erklärt und vorgeführt.

Grafik

Gute Spiele aus der Ubuntu Repository: SuperTuxKart

Information von NetzwerkDude vor 3 TagenGrafik2 Kommentare

Fall jemand die Firmenpolicy hat das man Linux Software nur aus dem default Repository installieren kann: Ich habe festgestellt ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
10G Netzwerk konfigurieren für maximalen Datendurchsatz
gelöst Frage von hukimanLAN, WAN, Wireless38 Kommentare

Guten Morgen, in unserem Betrieb wurde das Netzwerk auf 10G (Kupfer) umgerüstet. Grund dafür sind große Laserscandaten die sehr ...

Netzwerke
Subnetzmaske mit Hilfe der IP-Adresse berechnen
gelöst Frage von Jennifer21Netzwerke21 Kommentare

Hi zusammen, kann mir bitte jemand helfen bei dieser Aufgabe. Ich muss die die Subnetzsmaske berechnen von den IP-Adressen: ...

Exchange Server
Exchange 2016 550 5.7.60 SMTP Client does not have permissions to send
Frage von kermit-elmoExchange Server17 Kommentare

Hallo, ich möchte für bestimmte Mitarbeiter einen IMAP Zugang zum Firmen internen Exchange 2016 bereitstellen. Ein paar verwenden Linux ...

Windows 10
3D PDF bei WIN 10 mit Adobe Acrobat DC öffnen
Frage von DysfunktionWindows 1016 Kommentare

Hallo zusammen, Aus einem Konstruktionsprogramm ( Catia ) kann man Zeichnungen als 3 d PDF exportieren. Diese werden lokal ...