Author Archives: Christian Wulsch

Datenabfrage Vodafone Cube ZTE – Model MF289F

Der Anschluss einer externen Antenne am Vodafone Cube ist eine sehr wackelige Angelegenheit. Deshalb kam der Wunsch auf, mittels eines CRON-Jobs die Signalqualität zu überprüfen und bei zu schwachem Signal eine Warnung ausgeben zu können.

Mit der Hilfe von ChatGPT 🙂 gelang es mir, den Login-Prozess am Vodafone Cube nachzuvollziehen und ein kleines Bash Script zu schreiben, dass die Werte abruft:

#!/bin/bash
#
# Get Vodafone Cube data in JSON format
#
# written and tested with
# Vodafone Cube ZTE Model: MF289F - HW Version: T2 - SW Version: CR_VDFDEMF289FV1.0.0B08
#
# Get singe value e.g. with
# ./get_vodafone_cube_data.sh | jq -cr '.lte_rsrp'
#
# written 2026-02-22 by Christian Wulsch and ChatGPT
# version 2026-02-22ss

ROUTER="http://192.168.0.1"
PASS="Geheim"

COOKIE_JAR="/tmp/mf289f.cookies"

GET_PARAMS=(
cell_id
cr_version
imei
lte_rsrp
network_type
rscp
rssi
sim_imsi
sinr
wa_inner_version
wan_lte_ca
wifi_onoff_state
Z_rssi
Z_SINR
mesh_switch
mesh_role
web_version
wifi_chip1_ssid1_ssid
wifi_start_mode
wifi_mesh_deployed
wifi_lbd_enable
wifi_eacs_enable
)

#
# Functions
#

function ts() {
date +%s%3N;
}

function implode() {
delim="$1"
elems="${*:2}"
echo "${elems// /$delim}"
}

function login() {
# 1) LD holen
LD=$(curl --connect-timeout 10 -s -c "$COOKIE_JAR" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: $ROUTER/index.html" \
"$ROUTER/goform/goform_get_cmd_process?isTest=false&cmd=LD&_=$(ts)" \
| sed -n 's/.*"LD":"\([^"]*\)".*/\1/p')

# 2) Hash berechnen (korrekt: inner & outer uppercase)
H1=$(printf "%s" "$PASS" | openssl dgst -sha256 | awk '{print toupper($2)}')
HASH=$(printf "%s%s" "$H1" "$LD" | openssl dgst -sha256 | awk '{print toupper($2)}')

# 3) Login → setzt zwsd-Cookie
curl --connect-timeout 10 -s -b "$COOKIE_JAR" -c "$COOKIE_JAR" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: $ROUTER/index.html" \
-d "isTest=false&goformId=LOGIN&password=$HASH" \
"$ROUTER/goform/goform_set_cmd_process"
}

function get_values() {
values="$(implode '%2C' $*)"

curl --connect-timeout 10 -s -b "$COOKIE_JAR" \
-H "X-Requested-With: XMLHttpRequest" \
-H "Referer: $ROUTER/index.html" \
"$ROUTER/goform/goform_get_cmd_process?isTest=false&cmd=$values&multi_data=1&_=$(date +%s%3N)"

# "$ROUTER/goform/goform_get_cmd_process?isTest=false&cmd=cr_version%2Cnetwork_type%2Crssi%2Crscp%2Clte_rsrp%2Ccell_id%2CZ_SINR%2Csinr%2CZ_rssi%2Cwan_lte_ca&multi_data=1&_=$(date +%s%3N)"
# "$ROUTER/goform/goform_get_cmd_process?isTest=false&cmd=mesh_switch%2Cmesh_role%2Ccr_version%2Cweb_version%2Cwifi_chip1_ssid1_ssid%2Cwifi_start_mode%2Cwifi_mesh_deployed%2Cwifi_lbd_enable%2Cwifi_eacs_enable&multi_data=1&_==$(date +%s%3N)"
# "$ROUTER/goform/goform_get_cmd_process?isTest=false&cmd=network_type%2Crssi%2Crscp%2Clte_rsrp%2Ccell_id%2CZ_SINR%2Csinr%2CZ_rssi%2Cwan_lte_ca%2Clte_ca_pcell_band%2Clte_ca_pcell_bandwidth%2Clte_ca_scell_band%2Clte_ca_scell_bandwidth%2Clte_ca_pcell_arfcn%2Clte_ca_scell_arfcn%2Clte_ca_scell_info&multi_data=1&_=$(ts)"
}

#
# Main
#

if get_values lte_rsrp | grep -q '"lte_rsrp":""'; then
# echo "Re-Login nötig"
login >/dev/null
fi

DATA="$(get_values ${GET_PARAMS[*]})"
echo "$DATA" | jq

(Leider schmeißt der Cube einen anderen eingeloggten Benutzer raus, sobald ein neuer Login erfolgt.)

WordPress-Plugin: Roundcube Login Form

Die Umstellung auf WordPress brachte für mich die Aufgabe mit sich, den Login in mein Webmail Interface sicher zu stellen. Für Webmail benutze ich seit langer Zeit Roundcube und bin damit sehr zufrieden. Das Loginformular hatte ich in meinem alten, selbtgeschriebenen CMS bereits realisiert. Mit einem einfachen Formular mit Ziel auf die Roundcube Seite funktioniert das Login nicht!
Der Grund liegt darin, dass Roundcube beim initialen Aufruf des Loginformulars einen randomisierten Token generiert und diesen Zusammen mit der IP, den Language und Skin-Definitionen in der Tabelle ’sessions› hinterlegt. Der Token wird dann im Login Formular in einem versteckten Input-Feld gespeichert und beim Login mit übermittelt. Nur wenn dieser mit dem in der Datenbank hinterlegten zusammen mit der IP Adresse des Benutzers übereinstimmen, wird der Login genehmigt. Auf diese Weise wird sichergestellt, dass der Login nur von der Roundcube Login Page kommt.
Das fand ich aber schon immer unbefriedigend, denn ich wollte, dass das ganze System etwas mehr wie aus einem Guß erscheint und man sich nicht durch unnötig viele Seiten klicken muss.
Nun habe ich aus meiner alten Routine ein WordPress Plugin erstellt, mit dem sich dies in für mich befriedigender Weise realisieren lässt.

Es funktioniert nur mit Roundcube-Installationen auf MySQL Basis ($config[’session_storage›]=’db›) und benötigt Lese- und Schreibzugriff auf die Tabelle ’sessions› der Roundcube Datenbank. Es reicht, einen MySQL Benutzer anzulegen, der lediglich auf diese Tabelle Zugriff hat. Die entsprechenden Zugriffsdaten lassen sich wie gewohnt über die Einstellungen des PlugIns hinterlegen.

Um das Formular zu nutzen, muss an beliebiger Stelle der Shortcode [roundcube_login_form] in den Text der Seite, des Beitrags oder des Widgets eingefügt werden. An seiner Stelle erscheint bei aktivierem Plugin automatisch das Loginformular. Es ist möglich dem Shortcode Parameter zu übergeben. Diese stellen CSS Klassen dar, womit es ermöglicht werden soll, das Formular an verschiedenen Stellen der Seite unterschiedlich zu formatieren. Beispiel: Mit [roundcube_login_form inpage] oder [roundcube_login_form sidebar] wird jeweils die CSS Klasse ‹inpage› bzw. ’sidebar› übergeben. Im styles.css des PlugIns (zu bearbeiten z.B. über den Plugin-Editor von WordPress) können dann entsprechende Formatierungen hinterlegt werden.

Wenn das Plugin bei mir gut funktioniert, ist es unwahscheinlich, dass ich daran weiter arbeite. Wenn jemand jedoch Probleme haben sollte, mag er sich melden. Ich kann aber nicht garantieren, dass ich dazu komme zu antworten!

Um das Ganze noch mehr wie aus einem Guß erscheinen zu lassen, habe ich ein kleines Roundcube-Plugin geschrieben, das beim Ausloggen oder beim fehlerhaften Login wieder auf die WordPress Seite führt. Dieses muss wie gewöhnlich ins roundcube/plugins Verzeichnis entpackt und ins $config[‹plugins›] Array in der config.inc.php aufgenommen werden. Es gibt ein kleines Config-File im Plugin-Verzeichnis, welches selbsterklärend sein sollte.

Das WordPress-Plugin lässt sich hier herunter laden: wp-roundcube-login-form.0.2.zip

Das Roundcube-Plugin gibt es hier: roundcube_logout_redirect.0.2.zip

Beide Plugins sind frei und ohne Forderungen meinerseits zu nutzen. Getestet habe ich sie erfolgreich mit Roundcube Version 1.1.1 und 1.3.9. Ich gebe aber keinerlei Garantie und trage keine Verantwortung für die Nutzung! Sollte jemand Anmerkungen oder Verbesserungen haben, freue ich mich über Feedback!