diff -Nru meiga-0.3.4/build-package.sh meiga-0.4.0/build-package.sh --- meiga-0.3.4/build-package.sh 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/build-package.sh 2010-12-31 02:55:57.000000000 +0000 @@ -6,6 +6,9 @@ # After that, ***cd /tmp*** and upload with: dput -f meiga meiga*.changes # -rn distro The same than -r, but precompiling C sources to avoid dependancy on # Vala package in the target distro +# -s Prepares a source release +# -sn The same than -s, but precompiling C sources to avoid dependancy on +# Vala package # ------------------------------------------------- @@ -18,11 +21,13 @@ Ubuntu|Debian) VALA_INSTALLED=0 WKDIR=`pwd` + MEIGA_VERSION=`grep AC_INIT "$WKDIR/configure.ac" | sed -e 's/[^,]*,\[\([^]]*\).*/\1/'` + if [ "$#" -ge 1 ] then if [ "$1" = "-d" ] then - shift + shift if [ -f /usr/bin/lsb_release ] then UBUNTU_RELEASE=`lsb_release -r | { read _ X; echo $X; }` @@ -51,29 +56,46 @@ fi fi - if [ "$1" = "-r" -o "$1" = "-rn" ] + if [ "$1" = "-r" -o "$1" = "-rn" -o "$1" = "-s" -o "$1" = "-sn" ] then RELEASETYPE="$1" - DISTRO="$2" - BUILDPATH="/tmp/meiga" - shift - shift - rm -rf "$BUILDPATH" "$BUILDPATH"_* - mkdir "$BUILDPATH" \ + DISTRO="$2" + PACKAGE="meiga-$MEIGA_VERSION" + BUILDPATH="/tmp/$PACKAGE" + + shift + if [ "$RELEASETYPE" = "-r" -o "$RELEASETYPE" = "-rn" ] + then + shift + fi + + if [ ! -d .git ] + then + echo "This kind of release can only be done from a git clone, not from downloaded sources" + exit + fi + + rm -rf "$BUILDPATH" "$BUILDPATH"_* + mkdir "$BUILDPATH" \ && cp -a .git "$BUILDPATH" \ && cd "$BUILDPATH" \ && git reset --hard HEAD \ && rm -rf .git \ - && sed -e "s/) unstable/$DISTRO) $DISTRO/" < "$WKDIR/debian/changelog" > "$BUILDPATH/debian/changelog" + && { + if [ "$RELEASETYPE" = "-r" -o "$RELEASETYPE" = "-rn" ] + then + sed -e "s/) unstable/$DISTRO) $DISTRO/" < "$WKDIR/debian/changelog" > "$BUILDPATH/debian/changelog" + fi + } - BINARYONLY="-S" + BINARYONLY="-S" SIGNCHANGES="" - if [ "$RELEASETYPE" = "-rn" ] + if [ "$RELEASETYPE" = "-rn" -o "$RELEASETYPE" = "-sn" ] then # Remove valac dependency from debian/control in /tmp/meiga sed -e 's/, valac (.*)//' < "$WKDIR/debian/control" > "$BUILDPATH/debian/control" \ - && ./autogen.sh \ + && cd "$BUILDPATH" && ./autogen.sh \ && cd "$BUILDPATH/src/gui" && make meiga.vala.stamp && cd "$BUILDPATH" \ && cd "$BUILDPATH/src/server" && make meiga.vala.stamp && cd "$BUILDPATH" fi @@ -99,10 +121,17 @@ echo fi - # If you're using a distribution for which an updated Vala package - # exists and you want to check the dependency, remove the "-d" option + if [ "$RELEASETYPE" = "-s" -o "$RELEASETYPE" = "-sn" ] + then + cd "$BUILDPATH" \ + && cd .. \ + && tar zcvf "$PACKAGE.tar.gz" "$PACKAGE" + else + # If you're using a distribution for which an updated Vala package + # exists and you want to check the dependency, remove the "-d" option - dpkg-buildpackage -d -rfakeroot $BINARYONLY $SIGNCHANGES + dpkg-buildpackage -d -rfakeroot $BINARYONLY $SIGNCHANGES + fi if [ "$VALA_INSTALLED" = "1" ] then diff -Nru meiga-0.3.4/ChangeLog meiga-0.4.0/ChangeLog --- meiga-0.3.4/ChangeLog 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/ChangeLog 2010-12-31 02:55:57.000000000 +0000 @@ -1,3 +1,14 @@ +meiga (0.4.0) - Fri, 31 Dec 2010 03:26:28 +0100 + + * Dynamic port change + * SSL support + * Persistent settings storage + * Password protection + +meiga (0.3.5) - Tue, 14 Dec 2010 10:49:11 +0100 + + * Improvements in building process + meiga (0.3.4) - Sun, 06 Jun 2010 03:26:42 +0300 * Fixed bug: memory leak when a download is aborted diff -Nru meiga-0.3.4/configure.ac meiga-0.4.0/configure.ac --- meiga-0.3.4/configure.ac 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/configure.ac 2010-12-31 02:55:57.000000000 +0000 @@ -1,5 +1,5 @@ AC_PREREQ(2.62) -AC_INIT([meiga],[0.3.4],[info@igalia.com],[meiga]) +AC_INIT([meiga],[0.4.0],[info@igalia.com],[meiga]) AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_HEADERS([config.h]) @@ -53,9 +53,48 @@ # No need to ask for the Vala compiler if the sources are # already compiled to C -if test ! -f src/server/MeigaServer.c -a "`$VALAC --version`" \< "Vala $VALA_REQUIRED" +if test ! -f src/server/MeigaServer.c then - AC_MSG_ERROR([Vala >= $VALA_REQUIRED is required.]) + + # Compare major, minor and revision version values one by one + # because lexicographic order isn't enough + + VALA_REQUIRED="0.11.2" + VALAC_VERSION="Vala 0.11.3" + IFS_BAK="$IFS" + IFS=". " + VALAC_MAJ=`echo "$VALAC_VERSION" | { read _ A _ _; echo $A; }` + VALAC_MIN=`echo "$VALAC_VERSION" | { read _ _ A _; echo $A; }` + VALAC_REV=`echo "$VALAC_VERSION" | { read _ _ _ A; echo $A; }` + VALAC_REQ_MAJ=`echo "$VALA_REQUIRED" | { read A _ _; echo $A; }` + VALAC_REQ_MIN=`echo "$VALA_REQUIRED" | { read _ A _; echo $A; }` + VALAC_REQ_REV=`echo "$VALA_REQUIRED" | { read _ _ A; echo $A; }` + IFS="$IFS_BAK" + + VALAC_REQ_FAIL=0 + if test "$VALAC_MAJ" \< "$VALAC_REQ_MAJ" + then + VALAC_REQ_FAIL=1 + elif test "$VALAC_MAJ" = "$VALAC_REQ_MAJ" + then + echo "Equal majors" + if test "$VALAC_MIN" \< "$VALAC_REQ_MIN" + then + VALAC_REQ_FAIL=1 + elif test "$VALAC_MIN" = "$VALAC_REQ_MIN" + then + echo "Equal minors" + if test "$VALAC_REV" \< "$VALAC_REQ_REV" + then + VALAC_REQ_FAIL=1 + fi + fi + fi + + if test "$VALAC_REQ_FAIL" = "1" + then + AC_MSG_ERROR([Vala >= $VALA_REQUIRED is required.]) + fi fi PKG_CHECK_MODULES(gthread, gthread-2.0 >= $GTHREAD_REQUIRED) diff -Nru meiga-0.3.4/debian/changelog meiga-0.4.0/debian/changelog --- meiga-0.3.4/debian/changelog 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/debian/changelog 2010-12-31 02:55:57.000000000 +0000 @@ -1,3 +1,15 @@ +meiga (0.4.0-1lucid) lucid; urgency=low + + * New upstream release + + -- Enrique Ocaña González Fri, 31 Dec 2010 03:26:28 +0100 + +meiga (0.3.5-1lucid) lucid; urgency=low + + * New upstream release + + -- Enrique Ocaña González Tue, 14 Dec 2010 10:49:11 +0100 + meiga (0.3.4-1lucid) lucid; urgency=low * New upstream release diff -Nru meiga-0.3.4/fedora/meiga.spec meiga-0.4.0/fedora/meiga.spec --- meiga-0.3.4/fedora/meiga.spec 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/fedora/meiga.spec 2010-12-31 02:55:57.000000000 +0000 @@ -1,5 +1,5 @@ Name: meiga -Version: 0.3.4 +Version: 0.4.0 Release: 1%{?dist} Summary: Easy to use tool to share selected local directories via web @@ -87,6 +87,7 @@ %{_bindir}/meiga %{_bindir}/meigaserver %{_bindir}/meiga-askpass +%{_bindir}/make-meiga-ssl-cert %{_datadir}/nautilus-scripts/share-on-meiga %{_datadir}/dbus-1/services/com.igalia.Meiga.service %{_datadir}/applications/%{name}.desktop diff -Nru meiga-0.3.4/NEWS meiga-0.4.0/NEWS --- meiga-0.3.4/NEWS 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/NEWS 2010-12-31 02:55:57.000000000 +0000 @@ -1,7 +1,6 @@ -meiga (0.3.4) - Sun, 06 Jun 2010 03:26:42 +0300 +meiga (0.4.0) - Fri, 31 Dec 2010 03:26:28 +0100 - * Fixed bug: memory leak when a download is aborted - * Meiga ported to Vala 0.8.1 - * Trigger default action on Enter press in Add dialog - * Update RPM spec - * Improved release process + * Dynamic port change + * SSL support + * Persistent settings storage + * Password protection diff -Nru meiga-0.3.4/po/es.po meiga-0.4.0/po/es.po --- meiga-0.3.4/po/es.po 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/po/es.po 2010-12-31 02:55:57.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: meiga\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-06 03:24+0300\n" +"POT-Creation-Date: 2010-12-31 03:38+0100\n" "PO-Revision-Date: 2009-06-13 21:41+0200\n" "Last-Translator: Enrique Ocaña González \n" "Language-Team: Spanish \n" @@ -16,175 +16,189 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../src/server/Meiga.vala:123 +#: ../src/server/Meiga.vala:155 msgid "--- No log available ---" msgstr "--- Registro no disponible ---" -#: ../src/server/MeigaServer.vala:81 +#: ../src/server/MeigaServer.vala:112 +msgid "Error creating SSL certificate" +msgstr "Error creando certificado SSL" + +#: ../src/server/MeigaServer.vala:115 +#, fuzzy +msgid "Error spawning SSL certificate creation process" +msgstr "Error creando proceso de detección IP" + +#: ../src/server/MeigaServer.vala:177 #, c-format msgid "External URL: %s" msgstr "La URL externa es: %s" -#: ../src/server/MeigaServer.vala:113 +#: ../src/server/MeigaServer.vala:209 #, c-format msgid "Error opening file %s" msgstr "Error abriendo archivo %s" -#: ../src/server/MeigaServer.vala:128 +#: ../src/server/MeigaServer.vala:224 msgid "Registering DBUS service" msgstr "Registrando servicio DBUS" -#: ../src/server/MeigaServer.vala:131 +#: ../src/server/MeigaServer.vala:227 msgid "Not registering DBUS service: not primary owner" msgstr "No registrando servicio DBUS: no es el propietario principal" -#: ../src/server/MeigaServer.vala:134 +#: ../src/server/MeigaServer.vala:230 #, c-format msgid "Error registering DBUS server: %s" msgstr "Error registrando servicio DBUS: %s" -#: ../src/server/MeigaServer.vala:162 +#: ../src/server/MeigaServer.vala:328 msgid "Attempted to register path without GUI started. Ignoring." msgstr "Se intentó registrar una ruta sin haber iniciado el GUI. Ignorando." -#: ../src/server/MeigaServer.vala:168 +#: ../src/server/MeigaServer.vala:334 #, c-format msgid "Registered logical path '%s' to real path '%s'" msgstr "Ruta local '%s' registrada a ruta real '%s'" -#: ../src/server/MeigaServer.vala:176 +#: ../src/server/MeigaServer.vala:343 msgid "Attempted to unregister path without GUI started. Ignoring." msgstr "Se intentó desregistrar una ruta sin haber iniciado el GUI. Ignorando." -#: ../src/server/MeigaServer.vala:180 +#: ../src/server/MeigaServer.vala:347 #, c-format msgid "Unregistered logical path '%s'" msgstr "Ruta lógica desregistrada '%s'" -#: ../src/server/MeigaServer.vala:263 +#: ../src/server/MeigaServer.vala:408 +#, c-format +msgid "Invalid authentication asking for path %s" +msgstr "Autenticación inválida para ruta %s" + +#: ../src/server/MeigaServer.vala:442 #, c-format msgid "Request: %s --> Serving: %s" msgstr "Petición: %s --> Sirviendo: %s" -#: ../src/server/MeigaServer.vala:319 ../src/server/MeigaServer.vala:324 +#: ../src/server/MeigaServer.vala:498 ../src/server/MeigaServer.vala:503 #, c-format msgid "Index of %s\n" msgstr "Índice de %s\n" -#: ../src/server/MeigaServer.vala:333 +#: ../src/server/MeigaServer.vala:512 #, c-format msgid "Served by Meiga %s" msgstr "Servido por Meiga %s" -#: ../src/server/MeigaServer.vala:367 +#: ../src/server/MeigaServer.vala:546 #, c-format msgid "Request: %s --> Serving (RSS mode): %s" msgstr "Petición: %s --> Sirviendo (modo RSS): %s" -#: ../src/server/MeigaServer.vala:403 +#: ../src/server/MeigaServer.vala:582 #, c-format msgid "Documents under %s" msgstr "Documentos bajo %s" # -#: ../src/server/MeigaServer.vala:414 +#: ../src/server/MeigaServer.vala:593 msgid "File not found" msgstr "Archivo no encontrado" -#: ../src/server/Net.vala:158 +#: ../src/server/Net.vala:177 msgid "Error creating thread for UPNP redirector process" msgstr "Error creando hilo para proceso redirector UPNP" -#: ../src/server/Net.vala:165 +#: ../src/server/Net.vala:184 msgid "Error creating thread for SSH redirector process" msgstr "Error creando hilo para proceso redirector SSH" -#: ../src/server/Net.vala:172 +#: ../src/server/Net.vala:191 msgid "Error creating thread for FON redirector process" msgstr "Error creando hilo para proceso redirector FON" -#: ../src/server/Net.vala:207 ../src/server/Net.vala:250 -#: ../src/server/Net.vala:366 ../src/server/Net.vala:482 +#: ../src/server/Net.vala:226 ../src/server/Net.vala:269 +#: ../src/server/Net.vala:385 ../src/server/Net.vala:501 #, c-format msgid "Found internal IP: %s" msgstr "IP interna encontrada: %s" # -#: ../src/server/Net.vala:209 ../src/server/Net.vala:252 -#: ../src/server/Net.vala:368 ../src/server/Net.vala:484 +#: ../src/server/Net.vala:228 ../src/server/Net.vala:271 +#: ../src/server/Net.vala:387 ../src/server/Net.vala:503 msgid "Local IP not found" msgstr "IP local no encontrada" -#: ../src/server/Net.vala:220 ../src/server/Net.vala:244 -#: ../src/server/Net.vala:360 ../src/server/Net.vala:476 +#: ../src/server/Net.vala:239 ../src/server/Net.vala:263 +#: ../src/server/Net.vala:379 ../src/server/Net.vala:495 msgid "Error spawning IP detection process" msgstr "Error creando proceso de detección IP" -#: ../src/server/Net.vala:272 ../src/server/Net.vala:508 +#: ../src/server/Net.vala:291 ../src/server/Net.vala:527 #, c-format msgid "Found external IP: %s" msgstr "IP externa encontrada: %s" -#: ../src/server/Net.vala:278 ../src/server/Net.vala:514 +#: ../src/server/Net.vala:297 ../src/server/Net.vala:533 msgid "Creating redirection" msgstr "Creando redirección" -#: ../src/server/Net.vala:284 ../src/server/Net.vala:404 -#: ../src/server/Net.vala:520 ../src/gui/Gui.vala:429 +#: ../src/server/Net.vala:303 ../src/server/Net.vala:423 +#: ../src/server/Net.vala:539 ../src/gui/Gui.vala:459 msgid "Redirection performed" msgstr "Redirección realizada" -#: ../src/server/Net.vala:288 ../src/server/Net.vala:524 +#: ../src/server/Net.vala:307 ../src/server/Net.vala:543 msgid "Redirection already present" msgstr "Redirección ya presente" -#: ../src/server/Net.vala:292 +#: ../src/server/Net.vala:311 msgid "" "External IP not found. Check that your router has UPnP enabled and working" msgstr "" "IP externa no encontrada. Compruebe que su router tiene UPnP activado y " "funcionando" -#: ../src/server/Net.vala:296 ../src/server/Net.vala:327 +#: ../src/server/Net.vala:315 ../src/server/Net.vala:346 msgid "Error spawning UPNP redirector process" msgstr "Error creando proceso redirector UPNP" -#: ../src/server/Net.vala:331 ../src/server/Net.vala:449 -#: ../src/server/Net.vala:568 +#: ../src/server/Net.vala:350 ../src/server/Net.vala:468 +#: ../src/server/Net.vala:587 msgid "Redirection removed" msgstr "Redirección eliminada" -#: ../src/server/Net.vala:333 ../src/server/Net.vala:451 -#: ../src/server/Net.vala:570 +#: ../src/server/Net.vala:352 ../src/server/Net.vala:470 +#: ../src/server/Net.vala:589 msgid "Unable to remove redirection" msgstr "Imposible eliminar redirección" -#: ../src/server/Net.vala:384 +#: ../src/server/Net.vala:403 #, c-format msgid "Using external IP: %s" msgstr "Usando IP externa: %s" -#: ../src/server/Net.vala:385 +#: ../src/server/Net.vala:404 msgid "Creating SSH tunnel" msgstr "Creando túnel SSH" -#: ../src/server/Net.vala:407 +#: ../src/server/Net.vala:426 msgid "Error creating SSH tunnel. Check config parameters and password." msgstr "" "Error creando túnel SSH. Compruebe parámetros de configuración y password." -#: ../src/server/Net.vala:412 ../src/server/Net.vala:445 +#: ../src/server/Net.vala:431 ../src/server/Net.vala:464 msgid "Error spawning SSH redirector process" msgstr "Error creando proceso redirector SSH" -#: ../src/server/Net.vala:528 +#: ../src/server/Net.vala:547 msgid "" "External IP not found. Check that you really have a Fonera version 1 router" msgstr "" "IP externa no encontrada. Compruebe que su router es realmente una Fonera " "versión 1" -#: ../src/server/Net.vala:532 ../src/server/Net.vala:564 +#: ../src/server/Net.vala:551 ../src/server/Net.vala:583 msgid "Error spawning FON redirector process" msgstr "Error creando proceso redirector FON" @@ -215,200 +229,204 @@ msgid "RssFeed.new_from_directory(): Error\n" msgstr "RssFeed.new_from_directory(): Error\n" -#: ../src/gui/Gui.vala:113 +#: ../src/gui/Gui.vala:117 #, c-format msgid "Remote error deleting share '%s'\n" msgstr "Error remoto borrando elemento compartido '%s'\n" -#: ../src/gui/Gui.vala:139 +#: ../src/gui/Gui.vala:157 msgid "Remote error applying redirection options\n" msgstr "Error remoto aplicando opciones de redirección\n" -#: ../src/gui/Gui.vala:159 +#: ../src/gui/Gui.vala:177 msgid "Empty share name not allowed" msgstr "Nombre de elemento compartido vacío no permitido" -#: ../src/gui/Gui.vala:163 +#: ../src/gui/Gui.vala:181 msgid "Share name not allowed" msgstr "Nombre de elemento compartido no permitido" -#: ../src/gui/Gui.vala:172 +#: ../src/gui/Gui.vala:190 #, c-format msgid "Remote error sharing '%s' as '%s'\n" msgstr "Error remoto compartiendo '%s' como '%s'\n" -#: ../src/gui/Gui.vala:243 +#: ../src/gui/Gui.vala:261 #, c-format msgid "Error looking for DBUS server: %s\n" msgstr "Error buscando servidor DBUS: %s\n" -#: ../src/gui/Gui.vala:252 +#: ../src/gui/Gui.vala:270 msgid "Error looking for DBUS server: remote object not found\n" msgstr "Error buscando servidor DBUS: objeto remoto no encontrado\n" -#: ../src/gui/Gui.vala:272 +#: ../src/gui/Gui.vala:292 msgid "Share on Meiga..." msgstr "Compartir en Meiga..." -#: ../src/gui/Gui.vala:276 +#: ../src/gui/Gui.vala:296 #, c-format msgid "Creating Nautilus context menu for Meiga %s --> %s\n" msgstr "Creando menú de contexto de Nautilus para Meiga %s --> %s\n" -#: ../src/gui/Gui.vala:303 +#: ../src/gui/Gui.vala:323 msgid "Icon file not found\n" msgstr "Archivo de icono no encontrado\n" -#: ../src/gui/Gui.vala:360 +#: ../src/gui/Gui.vala:382 msgid "Remote error getting paths\n" msgstr "Error remoto obteniendo rutas\n" -#: ../src/gui/Gui.vala:366 +#: ../src/gui/Gui.vala:390 msgid "Remote error getting redirection options\n" msgstr "Error remoto obteniendo opciones de redirección\n" -#: ../src/gui/Gui.vala:390 +#: ../src/gui/Gui.vala:420 msgid "Remote error getting log lines\n" msgstr "Error remoto obteniendo líneas de registro\n" -#: ../src/gui/Gui.vala:427 +#: ../src/gui/Gui.vala:457 msgid "Direct connection" msgstr "Conexión directa" -#: ../src/gui/Gui.vala:428 +#: ../src/gui/Gui.vala:458 msgid "Performing redirection" msgstr "Creando redirección" -#: ../src/gui/Gui.vala:430 +#: ../src/gui/Gui.vala:460 msgid "Redirection error" msgstr "Redirección realizada" -#: ../src/gui/Gui.vala:435 +#: ../src/gui/Gui.vala:465 msgid "Remote error getting public url\n" msgstr "Error remoto obteniendo url pública\n" -#: ../src/gui/Gui.vala:467 +#: ../src/gui/Gui.vala:497 msgid "Remote error shutting down server\n" msgstr "Error remoto deteniendo el servidor\n" -#: ../src/gui/Gui.vala:475 +#: ../src/gui/Gui.vala:505 msgid "_File" msgstr "_Archivo" -#: ../src/gui/Gui.vala:490 +#: ../src/gui/Gui.vala:520 msgid "_Share" msgstr "_Compartir" -#: ../src/gui/Gui.vala:504 ../src/gui/Gui.vala:545 +#: ../src/gui/Gui.vala:534 ../src/gui/Gui.vala:575 msgid "_Copy invitation" msgstr "_Copiar invitación" -#: ../src/gui/Gui.vala:516 +#: ../src/gui/Gui.vala:546 msgid "_Help" msgstr "Ay_uda" -#: ../src/gui/Gui.vala:560 ../src/gui/Gui.vala:853 +#: ../src/gui/Gui.vala:590 ../src/gui/Gui.vala:936 msgid "Meiga" msgstr "Meiga" -#: ../src/gui/Gui.vala:600 +#: ../src/gui/Gui.vala:630 msgid "Local file" msgstr "Archivo local" -#: ../src/gui/Gui.vala:603 +#: ../src/gui/Gui.vala:633 msgid "Shared as" msgstr "Compartido como" -#: ../src/gui/Gui.vala:610 +#: ../src/gui/Gui.vala:640 msgid "Shares" msgstr "Elementos compartidos" -#: ../src/gui/Gui.vala:626 +#: ../src/gui/Gui.vala:656 msgid "Log" msgstr "Registro" -#: ../src/gui/Gui.vala:635 +#: ../src/gui/Gui.vala:665 ../src/gui/Gui.vala:784 +msgid "User" +msgstr "Usuario" + +#: ../src/gui/Gui.vala:678 ../src/gui/Gui.vala:799 +msgid "Password" +msgstr "Contraseña" + +#: ../src/gui/Gui.vala:692 ../src/gui/Gui.vala:769 +msgid "Port" +msgstr "Puerto" + +#: ../src/gui/Gui.vala:705 +msgid "Encrypt transmission" +msgstr "Cifrar transmisión" + +#: ../src/gui/Gui.vala:718 msgid "Port redirection scheme" msgstr "Tipo de redirección" -#: ../src/gui/Gui.vala:648 +#: ../src/gui/Gui.vala:731 msgid "None" msgstr "Ninguna" -#: ../src/gui/Gui.vala:650 +#: ../src/gui/Gui.vala:733 msgid "UPnP" msgstr "UPnP" -#: ../src/gui/Gui.vala:652 +#: ../src/gui/Gui.vala:735 msgid "SSH" msgstr "SSH" -#: ../src/gui/Gui.vala:654 +#: ../src/gui/Gui.vala:737 msgid "FON" msgstr "FON" -#: ../src/gui/Gui.vala:664 +#: ../src/gui/Gui.vala:747 msgid "SSH options" msgstr "Opciones SSH" -#: ../src/gui/Gui.vala:671 +#: ../src/gui/Gui.vala:754 msgid "Host" msgstr "Servidor" -#: ../src/gui/Gui.vala:686 -msgid "Port" -msgstr "Puerto" - -#: ../src/gui/Gui.vala:701 -msgid "User" -msgstr "Usuario" - -#: ../src/gui/Gui.vala:716 -msgid "Password" -msgstr "Contraseña" - -#: ../src/gui/Gui.vala:757 +#: ../src/gui/Gui.vala:840 msgid "Options" msgstr "Opciones" -#: ../src/gui/Gui.vala:783 +#: ../src/gui/Gui.vala:866 msgid "Add path" msgstr "Añadir ruta" -#: ../src/gui/Gui.vala:794 +#: ../src/gui/Gui.vala:877 msgid "Local directory" msgstr "Directorio local" -#: ../src/gui/Gui.vala:802 +#: ../src/gui/Gui.vala:885 msgid "Select a folder to share" msgstr "Selecciona una carpeta para compartir" -#: ../src/gui/Gui.vala:810 +#: ../src/gui/Gui.vala:893 msgid "Share as" msgstr "Compartir como" -#: ../src/gui/Gui.vala:856 +#: ../src/gui/Gui.vala:939 msgid "This program comes with ABSOLUTELY NO WARRANTY.\n" msgstr "Este programa se suministra SIN NINGUNA GARANTÍA.\n" -#: ../src/gui/Gui.vala:857 +#: ../src/gui/Gui.vala:940 msgid "" "Licensed under GNU GPL 2.0. This is free software, and you are welcome to " msgstr "" "Licenciado bajo GNU GPL 2.0. Esto es software libre y estás invitado a " -#: ../src/gui/Gui.vala:858 +#: ../src/gui/Gui.vala:941 msgid "redistribute it under certain conditions.\n" msgstr "redistribuirlo bajo ciertas condiciones.\n" -#: ../src/gui/Gui.vala:860 +#: ../src/gui/Gui.vala:943 msgid "For more information, see:\n" msgstr "Para más información, consulta:\n" -#: ../src/gui/Gui.vala:864 +#: ../src/gui/Gui.vala:947 msgid "Xunta de Galicia partially funded this project using " msgstr "La Xunta de Galicia ha financiado este proyecto parcialmente usando " -#: ../src/gui/Gui.vala:865 +#: ../src/gui/Gui.vala:948 msgid "the European Regional Development Fund (ERDF)\n" msgstr "el Fondo Europeo de Desarrollo Regional (FEDER)\n" diff -Nru meiga-0.3.4/po/gl_ES.po meiga-0.4.0/po/gl_ES.po --- meiga-0.3.4/po/gl_ES.po 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/po/gl_ES.po 2010-12-31 02:55:57.000000000 +0000 @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: meiga\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-06-06 03:24+0300\n" +"POT-Creation-Date: 2010-12-31 03:38+0100\n" "PO-Revision-Date: 2009-06-14 21:12+0200\n" "Last-Translator: Enrique Ocaña González \n" "Language-Team: Galician \n" @@ -16,175 +16,189 @@ "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: ../src/server/Meiga.vala:123 +#: ../src/server/Meiga.vala:155 msgid "--- No log available ---" msgstr "--- Rexistro non dispoñible ---" -#: ../src/server/MeigaServer.vala:81 +#: ../src/server/MeigaServer.vala:112 +msgid "Error creating SSL certificate" +msgstr "Erro creando certificado SSL" + +#: ../src/server/MeigaServer.vala:115 +#, fuzzy +msgid "Error spawning SSL certificate creation process" +msgstr "Erro creando proceso de detección de IP" + +#: ../src/server/MeigaServer.vala:177 #, c-format msgid "External URL: %s" msgstr "A URL externa é: %s" -#: ../src/server/MeigaServer.vala:113 +#: ../src/server/MeigaServer.vala:209 #, c-format msgid "Error opening file %s" msgstr "Erro abrindo arquivo %s" -#: ../src/server/MeigaServer.vala:128 +#: ../src/server/MeigaServer.vala:224 msgid "Registering DBUS service" msgstr "Rexistrando servizo DBUS" -#: ../src/server/MeigaServer.vala:131 +#: ../src/server/MeigaServer.vala:227 msgid "Not registering DBUS service: not primary owner" msgstr "Non rexistrando servizo DBUS: non é o propietario principal" -#: ../src/server/MeigaServer.vala:134 +#: ../src/server/MeigaServer.vala:230 #, c-format msgid "Error registering DBUS server: %s" msgstr "Erro rexistrando servizo DBUS: %s" -#: ../src/server/MeigaServer.vala:162 +#: ../src/server/MeigaServer.vala:328 msgid "Attempted to register path without GUI started. Ignoring." msgstr "Tentouse rexistrar unha ruta sen iniciar o GUI. Ignorando." -#: ../src/server/MeigaServer.vala:168 +#: ../src/server/MeigaServer.vala:334 #, c-format msgid "Registered logical path '%s' to real path '%s'" msgstr "Ruta local '%s' rexistrada a ruta real '%s'" -#: ../src/server/MeigaServer.vala:176 +#: ../src/server/MeigaServer.vala:343 msgid "Attempted to unregister path without GUI started. Ignoring." msgstr "Tentouse desrexistrar unha ruta sen iniciar o GUI. Ignorando." -#: ../src/server/MeigaServer.vala:180 +#: ../src/server/MeigaServer.vala:347 #, c-format msgid "Unregistered logical path '%s'" msgstr "Ruta lóxica desrexistrada '%s'" -#: ../src/server/MeigaServer.vala:263 +#: ../src/server/MeigaServer.vala:408 +#, c-format +msgid "Invalid authentication asking for path %s" +msgstr "Autenticación inválida para ruta %s" + +#: ../src/server/MeigaServer.vala:442 #, c-format msgid "Request: %s --> Serving: %s" msgstr "Petición: %s --> Servindo: %s" -#: ../src/server/MeigaServer.vala:319 ../src/server/MeigaServer.vala:324 +#: ../src/server/MeigaServer.vala:498 ../src/server/MeigaServer.vala:503 #, c-format msgid "Index of %s\n" msgstr "Índice de %s\n" -#: ../src/server/MeigaServer.vala:333 +#: ../src/server/MeigaServer.vala:512 #, c-format msgid "Served by Meiga %s" msgstr "Servido por Meiga %s" -#: ../src/server/MeigaServer.vala:367 +#: ../src/server/MeigaServer.vala:546 #, c-format msgid "Request: %s --> Serving (RSS mode): %s" msgstr "Petición: %s --> Servindo (modo RSS): %s" -#: ../src/server/MeigaServer.vala:403 +#: ../src/server/MeigaServer.vala:582 #, c-format msgid "Documents under %s" msgstr "Documentos baixo %s" # -#: ../src/server/MeigaServer.vala:414 +#: ../src/server/MeigaServer.vala:593 msgid "File not found" msgstr "Arquivo non atopado" -#: ../src/server/Net.vala:158 +#: ../src/server/Net.vala:177 msgid "Error creating thread for UPNP redirector process" msgstr "Erro creando fío para proceso redirector UPNP" -#: ../src/server/Net.vala:165 +#: ../src/server/Net.vala:184 msgid "Error creating thread for SSH redirector process" msgstr "Erro creando fío para proceso redirector SSH" -#: ../src/server/Net.vala:172 +#: ../src/server/Net.vala:191 msgid "Error creating thread for FON redirector process" msgstr "Erro creando fío para proceso redirector FON" -#: ../src/server/Net.vala:207 ../src/server/Net.vala:250 -#: ../src/server/Net.vala:366 ../src/server/Net.vala:482 +#: ../src/server/Net.vala:226 ../src/server/Net.vala:269 +#: ../src/server/Net.vala:385 ../src/server/Net.vala:501 #, c-format msgid "Found internal IP: %s" msgstr "IP interna atopada: %s" # -#: ../src/server/Net.vala:209 ../src/server/Net.vala:252 -#: ../src/server/Net.vala:368 ../src/server/Net.vala:484 +#: ../src/server/Net.vala:228 ../src/server/Net.vala:271 +#: ../src/server/Net.vala:387 ../src/server/Net.vala:503 msgid "Local IP not found" msgstr "IP local non atopada" -#: ../src/server/Net.vala:220 ../src/server/Net.vala:244 -#: ../src/server/Net.vala:360 ../src/server/Net.vala:476 +#: ../src/server/Net.vala:239 ../src/server/Net.vala:263 +#: ../src/server/Net.vala:379 ../src/server/Net.vala:495 msgid "Error spawning IP detection process" msgstr "Erro creando proceso de detección de IP" -#: ../src/server/Net.vala:272 ../src/server/Net.vala:508 +#: ../src/server/Net.vala:291 ../src/server/Net.vala:527 #, c-format msgid "Found external IP: %s" msgstr "IP externa atopada: %s" -#: ../src/server/Net.vala:278 ../src/server/Net.vala:514 +#: ../src/server/Net.vala:297 ../src/server/Net.vala:533 msgid "Creating redirection" msgstr "Creando redirección" -#: ../src/server/Net.vala:284 ../src/server/Net.vala:404 -#: ../src/server/Net.vala:520 ../src/gui/Gui.vala:429 +#: ../src/server/Net.vala:303 ../src/server/Net.vala:423 +#: ../src/server/Net.vala:539 ../src/gui/Gui.vala:459 msgid "Redirection performed" msgstr "Redirección realizada" -#: ../src/server/Net.vala:288 ../src/server/Net.vala:524 +#: ../src/server/Net.vala:307 ../src/server/Net.vala:543 msgid "Redirection already present" msgstr "Redirección xa presente" -#: ../src/server/Net.vala:292 +#: ../src/server/Net.vala:311 msgid "" "External IP not found. Check that your router has UPnP enabled and working" msgstr "" "IP externa non atopada. Comprobe que o seu router ten UPnP activado e " "funcionando" -#: ../src/server/Net.vala:296 ../src/server/Net.vala:327 +#: ../src/server/Net.vala:315 ../src/server/Net.vala:346 msgid "Error spawning UPNP redirector process" msgstr "Erro creando proceso redirector UPNP" -#: ../src/server/Net.vala:331 ../src/server/Net.vala:449 -#: ../src/server/Net.vala:568 +#: ../src/server/Net.vala:350 ../src/server/Net.vala:468 +#: ../src/server/Net.vala:587 msgid "Redirection removed" msgstr "Redirección eliminada" -#: ../src/server/Net.vala:333 ../src/server/Net.vala:451 -#: ../src/server/Net.vala:570 +#: ../src/server/Net.vala:352 ../src/server/Net.vala:470 +#: ../src/server/Net.vala:589 msgid "Unable to remove redirection" msgstr "Imposible eliminar redirección" -#: ../src/server/Net.vala:384 +#: ../src/server/Net.vala:403 #, c-format msgid "Using external IP: %s" msgstr "Usando IP externa: %s" -#: ../src/server/Net.vala:385 +#: ../src/server/Net.vala:404 msgid "Creating SSH tunnel" msgstr "Creando túnel SSH" -#: ../src/server/Net.vala:407 +#: ../src/server/Net.vala:426 msgid "Error creating SSH tunnel. Check config parameters and password." msgstr "" "Erro creando túnel SSH. Comprobe parámetros de configuración e contrasinal." -#: ../src/server/Net.vala:412 ../src/server/Net.vala:445 +#: ../src/server/Net.vala:431 ../src/server/Net.vala:464 msgid "Error spawning SSH redirector process" msgstr "Erro creando proceso redirector SSH" -#: ../src/server/Net.vala:528 +#: ../src/server/Net.vala:547 msgid "" "External IP not found. Check that you really have a Fonera version 1 router" msgstr "" "IP externa non atopada. Comprobe que o seu router é realmente unha Fonera " "versión 1" -#: ../src/server/Net.vala:532 ../src/server/Net.vala:564 +#: ../src/server/Net.vala:551 ../src/server/Net.vala:583 msgid "Error spawning FON redirector process" msgstr "Erro creando proceso redirector FON" @@ -215,200 +229,204 @@ msgid "RssFeed.new_from_directory(): Error\n" msgstr "RssFeed.new_from_directory(): Erro\n" -#: ../src/gui/Gui.vala:113 +#: ../src/gui/Gui.vala:117 #, c-format msgid "Remote error deleting share '%s'\n" msgstr "Erro remoto borrando elemento compartido '%s'\n" -#: ../src/gui/Gui.vala:139 +#: ../src/gui/Gui.vala:157 msgid "Remote error applying redirection options\n" msgstr "Erro remoto aplicando opcións de redirección\n" -#: ../src/gui/Gui.vala:159 +#: ../src/gui/Gui.vala:177 msgid "Empty share name not allowed" msgstr "Nome de elemento compartido baleiro non permitido" -#: ../src/gui/Gui.vala:163 +#: ../src/gui/Gui.vala:181 msgid "Share name not allowed" msgstr "Nome de elemento compartido non permitido" -#: ../src/gui/Gui.vala:172 +#: ../src/gui/Gui.vala:190 #, c-format msgid "Remote error sharing '%s' as '%s'\n" msgstr "Erro remoto compartindo '%s' como '%s'\n" -#: ../src/gui/Gui.vala:243 +#: ../src/gui/Gui.vala:261 #, c-format msgid "Error looking for DBUS server: %s\n" msgstr "Erro buscando servidor DBUS: %s\n" -#: ../src/gui/Gui.vala:252 +#: ../src/gui/Gui.vala:270 msgid "Error looking for DBUS server: remote object not found\n" msgstr "Erro buscando servidor DBUS: obxecto remoto non atopado\n" -#: ../src/gui/Gui.vala:272 +#: ../src/gui/Gui.vala:292 msgid "Share on Meiga..." msgstr "Compartir en Meiga..." -#: ../src/gui/Gui.vala:276 +#: ../src/gui/Gui.vala:296 #, c-format msgid "Creating Nautilus context menu for Meiga %s --> %s\n" msgstr "Creando menú de contexto de Nautilus para Meiga %s --> %s\n" -#: ../src/gui/Gui.vala:303 +#: ../src/gui/Gui.vala:323 msgid "Icon file not found\n" msgstr "Arquivo de icono non atopado\n" -#: ../src/gui/Gui.vala:360 +#: ../src/gui/Gui.vala:382 msgid "Remote error getting paths\n" msgstr "Erro remoto obtendo rutas\n" -#: ../src/gui/Gui.vala:366 +#: ../src/gui/Gui.vala:390 msgid "Remote error getting redirection options\n" msgstr "Erro remoto obtendo opcións de redirección\n" -#: ../src/gui/Gui.vala:390 +#: ../src/gui/Gui.vala:420 msgid "Remote error getting log lines\n" msgstr "Erro remoto obtendo liñas de rexistro\n" -#: ../src/gui/Gui.vala:427 +#: ../src/gui/Gui.vala:457 msgid "Direct connection" msgstr "Conexión directa" -#: ../src/gui/Gui.vala:428 +#: ../src/gui/Gui.vala:458 msgid "Performing redirection" msgstr "Creando redirección" -#: ../src/gui/Gui.vala:430 +#: ../src/gui/Gui.vala:460 msgid "Redirection error" msgstr "Erro de redirección" -#: ../src/gui/Gui.vala:435 +#: ../src/gui/Gui.vala:465 msgid "Remote error getting public url\n" msgstr "Erro remoto obtendo url pública\n" -#: ../src/gui/Gui.vala:467 +#: ../src/gui/Gui.vala:497 msgid "Remote error shutting down server\n" msgstr "Erro remoto detendo o servidor\n" -#: ../src/gui/Gui.vala:475 +#: ../src/gui/Gui.vala:505 msgid "_File" msgstr "_Arquivo" -#: ../src/gui/Gui.vala:490 +#: ../src/gui/Gui.vala:520 msgid "_Share" msgstr "_Compartir" -#: ../src/gui/Gui.vala:504 ../src/gui/Gui.vala:545 +#: ../src/gui/Gui.vala:534 ../src/gui/Gui.vala:575 msgid "_Copy invitation" msgstr "_Copiar invitación" -#: ../src/gui/Gui.vala:516 +#: ../src/gui/Gui.vala:546 msgid "_Help" msgstr "Ax_uda" -#: ../src/gui/Gui.vala:560 ../src/gui/Gui.vala:853 +#: ../src/gui/Gui.vala:590 ../src/gui/Gui.vala:936 msgid "Meiga" msgstr "Meiga" -#: ../src/gui/Gui.vala:600 +#: ../src/gui/Gui.vala:630 msgid "Local file" msgstr "Arquivo local" -#: ../src/gui/Gui.vala:603 +#: ../src/gui/Gui.vala:633 msgid "Shared as" msgstr "Compartido como" -#: ../src/gui/Gui.vala:610 +#: ../src/gui/Gui.vala:640 msgid "Shares" msgstr "Elementos compartidos" -#: ../src/gui/Gui.vala:626 +#: ../src/gui/Gui.vala:656 msgid "Log" msgstr "Rexistro" -#: ../src/gui/Gui.vala:635 +#: ../src/gui/Gui.vala:665 ../src/gui/Gui.vala:784 +msgid "User" +msgstr "Usuario" + +#: ../src/gui/Gui.vala:678 ../src/gui/Gui.vala:799 +msgid "Password" +msgstr "Contrasinal" + +#: ../src/gui/Gui.vala:692 ../src/gui/Gui.vala:769 +msgid "Port" +msgstr "Porto" + +#: ../src/gui/Gui.vala:705 +msgid "Encrypt transmission" +msgstr "Cifrar transmisión" + +#: ../src/gui/Gui.vala:718 msgid "Port redirection scheme" msgstr "Tipo de redirección" -#: ../src/gui/Gui.vala:648 +#: ../src/gui/Gui.vala:731 msgid "None" msgstr "Ningunha" -#: ../src/gui/Gui.vala:650 +#: ../src/gui/Gui.vala:733 msgid "UPnP" msgstr "UPnP" -#: ../src/gui/Gui.vala:652 +#: ../src/gui/Gui.vala:735 msgid "SSH" msgstr "SSH" -#: ../src/gui/Gui.vala:654 +#: ../src/gui/Gui.vala:737 msgid "FON" msgstr "FON" -#: ../src/gui/Gui.vala:664 +#: ../src/gui/Gui.vala:747 msgid "SSH options" msgstr "Opcións SSH" -#: ../src/gui/Gui.vala:671 +#: ../src/gui/Gui.vala:754 msgid "Host" msgstr "Servidor" -#: ../src/gui/Gui.vala:686 -msgid "Port" -msgstr "Porto" - -#: ../src/gui/Gui.vala:701 -msgid "User" -msgstr "Usuario" - -#: ../src/gui/Gui.vala:716 -msgid "Password" -msgstr "Contrasinal" - -#: ../src/gui/Gui.vala:757 +#: ../src/gui/Gui.vala:840 msgid "Options" msgstr "Opcións" -#: ../src/gui/Gui.vala:783 +#: ../src/gui/Gui.vala:866 msgid "Add path" msgstr "Engadir ruta" -#: ../src/gui/Gui.vala:794 +#: ../src/gui/Gui.vala:877 msgid "Local directory" msgstr "Directorio local" -#: ../src/gui/Gui.vala:802 +#: ../src/gui/Gui.vala:885 msgid "Select a folder to share" msgstr "Selecciona unha carpeta para compartir" -#: ../src/gui/Gui.vala:810 +#: ../src/gui/Gui.vala:893 msgid "Share as" msgstr "Compartir como" -#: ../src/gui/Gui.vala:856 +#: ../src/gui/Gui.vala:939 msgid "This program comes with ABSOLUTELY NO WARRANTY.\n" msgstr "Este programa subminístrase SEN NINGUNHA GARANTÍA.\n" -#: ../src/gui/Gui.vala:857 +#: ../src/gui/Gui.vala:940 msgid "" "Licensed under GNU GPL 2.0. This is free software, and you are welcome to " msgstr "" "Licenciado baixo GNU GPL 2.0. Isto é software libre e estás convidado a " -#: ../src/gui/Gui.vala:858 +#: ../src/gui/Gui.vala:941 msgid "redistribute it under certain conditions.\n" msgstr "redistribuílo baixo certas condicións.\n" -#: ../src/gui/Gui.vala:860 +#: ../src/gui/Gui.vala:943 msgid "For more information, see:\n" msgstr "Para máis información, consulta:\n" -#: ../src/gui/Gui.vala:864 +#: ../src/gui/Gui.vala:947 msgid "Xunta de Galicia partially funded this project using " msgstr "A Xunta de Galicia financiou parcialmente este proxecto empregando " -#: ../src/gui/Gui.vala:865 +#: ../src/gui/Gui.vala:948 msgid "the European Regional Development Fund (ERDF)\n" msgstr "o Fondo Europeo de Desenvolvemento Rexional (FEDER)\n" diff -Nru meiga-0.3.4/src/gui/Gui.vala meiga-0.4.0/src/gui/Gui.vala --- meiga-0.3.4/src/gui/Gui.vala 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/src/gui/Gui.vala 2010-12-31 02:55:57.000000000 +0000 @@ -42,6 +42,10 @@ private Gtk.MenuItem systraymenu_restore; private Gtk.VBox topvbox; private Gtk.TreeView files; + private Gtk.Entry auth_user; + private Gtk.Entry auth_password; + private Gtk.Entry port; + private Gtk.CheckButton ssl; private Gtk.ComboBox redirection_type; private Gtk.Entry ssh_host; private Gtk.Entry ssh_port; @@ -130,6 +134,20 @@ public void on_redirection_apply(Gtk.Widget widget) { if (remote == null) return; try { + remote.set_auth_user(auth_user.get_text()); + string md5passwd; + if (auth_password.get_text()=="") { + md5passwd=""; + } else { + md5passwd=Checksum.compute_for_string(ChecksumType.MD5, auth_password.get_text()); + } + string remote_md5passwd = remote.get_auth_md5passwd(); + if (md5passwd!=remote_md5passwd) { + remote.set_auth_md5passwd(md5passwd); + auth_password.set_text(md5passwd); + } + remote.set_port((uint)port.get_text().to_ulong()); + remote.set_ssl(ssl.get_active()); remote.set_ssh_host(ssh_host.get_text()); remote.set_ssh_port(ssh_port.get_text()); remote.set_ssh_user(ssh_user.get_text()); @@ -197,7 +215,7 @@ // Private methods private Gtk.MenuBar menushell_to_menubar(MenuShell menu) { Gtk.MenuBar menubar=new Gtk.MenuBar(); - weak List children=(List)menu.children; + List children = (List) ((Gtk.Container)menu).get_children(); List childrencopy=new List(); foreach (Gtk.MenuItem menuitem in children) { childrencopy.append(menuitem); @@ -258,6 +276,8 @@ _remote.ModelChanged += this.on_remote_model_changed; _remote.LogChanged += this.on_remote_log_changed; } + + on_remote_model_changed(); } public void on_remote_model_changed() { @@ -350,6 +370,8 @@ // be shaded unless the server confirms its status int int_redirection_status = 1; int int_redirection_type = 0; + uint int_port = 0; + bool bool_ssl = false; bool enable_redirection_options; string_model = null; @@ -362,6 +384,8 @@ try { int_redirection_type = remote.get_redirection_type(); int_redirection_status = remote.get_redirection_status(); + int_port = remote.get_port(); + bool_ssl = remote.get_ssl(); } catch (Error e) { log(_("Remote error getting redirection options\n")); } @@ -369,10 +393,16 @@ if (string_model == null) string_model = ""; update_model_from_string(model, string_model); + auth_user.set_text(remote.get_auth_user()); + auth_password.set_text(remote.get_auth_md5passwd()); + port.set_text("%u".printf(int_port)); + ssl.set_active(bool_ssl); redirection_type.set_active(int_redirection_type); // Disable redirection settings when redirection process is pending enable_redirection_options = (int_redirection_status != 1); + port.set_sensitive(enable_redirection_options); + ssl.set_sensitive(enable_redirection_options); redirection_type.set_sensitive(enable_redirection_options); ssh_host.set_sensitive(enable_redirection_options); ssh_port.set_sensitive(enable_redirection_options); @@ -632,12 +662,65 @@ { Gtk.HBox hb2 = new Gtk.HBox(false, 0); { - Gtk.Label l = new Gtk.Label(_("Port redirection scheme")); + Gtk.Label l = new Gtk.Label(_("User")); hb2.pack_start(l, false, false, 5); l.show(); + auth_user = new Gtk.Entry(); + hb2.pack_start(auth_user, true, true, 5); + auth_user.show(); + } + vb.pack_start(hb2, false, false, 5); + hb2.show(); + + Gtk.HBox hb3 = new Gtk.HBox(false, 0); + { + Gtk.Label l = new Gtk.Label(_("Password")); + hb3.pack_start(l, false, false, 5); + l.show(); + + auth_password = new Gtk.Entry(); + auth_password.visibility = false; + hb3.pack_start(auth_password, true, true, 5); + auth_password.show(); + } + vb.pack_start(hb3, false, false, 5); + hb3.show(); + + Gtk.HBox hb4 = new Gtk.HBox(false, 0); + { + Gtk.Label l = new Gtk.Label(_("Port")); + hb4.pack_start(l, false, false, 5); + l.show(); + + port = new Gtk.Entry(); + hb4.pack_start(port, true, true, 5); + port.show(); + } + vb.pack_start(hb4, false, false, 5); + hb4.show(); + + Gtk.HBox hb5 = new Gtk.HBox(false, 0); + { + Gtk.Label l = new Gtk.Label(_("Encrypt transmission")); + hb5.pack_start(l, false, false, 5); + l.show(); + + ssl = new Gtk.CheckButton(); + hb5.pack_start(ssl, false, false, 5); + ssl.show(); + } + vb.pack_start(hb5, false, false, 5); + hb5.show(); + + Gtk.HBox hb6 = new Gtk.HBox(false, 0); + { + Gtk.Label l = new Gtk.Label(_("Port redirection scheme")); + hb6.pack_start(l, false, false, 5); + l.show(); + redirection_type = new Gtk.ComboBox(); - hb2.pack_start(redirection_type, true, true, 5); + hb6.pack_start(redirection_type, true, true, 5); redirection_type.show(); Gtk.ListStore redirection_type_model = new Gtk.ListStore(1, typeof(string)); @@ -658,8 +741,8 @@ "text", 0); } - vb.pack_start(hb2, false, false, 5); - hb2.show(); + vb.pack_start(hb6, false, false, 5); + hb6.show(); Gtk.Frame f = new Gtk.Frame(_("SSH options")); ((Gtk.Label)(f.label_widget)).use_markup = true; @@ -783,7 +866,7 @@ adddialog.title = _("Add path"); adddialog.modal = true; adddialog.type_hint = Gdk.WindowTypeHint.DIALOG; - adddialog.position = Gtk.WindowPosition.CENTER; + adddialog.set_position (Gtk.WindowPosition.CENTER); { Gtk.Container content_area = (Gtk.Container)((Gtk.Dialog)adddialog).get_content_area(); @@ -866,7 +949,7 @@ a.website = "http://meiga.igalia.com"; a.modal = true; a.type_hint = Gdk.WindowTypeHint.DIALOG; - a.position = Gtk.WindowPosition.CENTER; + a.set_position (Gtk.WindowPosition.CENTER); a.default_height = 300; a.default_width = 300; List blist = ((Gtk.Container)a.get_action_area()).get_children(); diff -Nru meiga-0.3.4/src/net/Makefile.am meiga-0.4.0/src/net/Makefile.am --- meiga-0.3.4/src/net/Makefile.am 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/src/net/Makefile.am 2010-12-31 02:55:57.000000000 +0000 @@ -9,7 +9,7 @@ $(NULL) bin_PROGRAMS = fwupnp -bin_SCRIPTS = fwlocalip fwssh fwssh-task meiga-askpass fwfon +bin_SCRIPTS = fwlocalip fwssh fwssh-task meiga-askpass fwfon make-meiga-ssl-cert fwupnp_SOURCES = \ upnp.c \ diff -Nru meiga-0.3.4/src/net/make-meiga-ssl-cert meiga-0.4.0/src/net/make-meiga-ssl-cert --- meiga-0.3.4/src/net/make-meiga-ssl-cert 1970-01-01 00:00:00.000000000 +0000 +++ meiga-0.4.0/src/net/make-meiga-ssl-cert 2010-12-31 02:55:57.000000000 +0000 @@ -0,0 +1,38 @@ +#!/bin/sh +if [ -z "$HOME" ] +then + echo "\$HOME must be defined" + exit 1 +fi + +SSLDIR="$HOME/.meiga/ssl" + +if [ ! -d "$SSLDIR" ] +then + mkdir -m 700 -p "$SSLDIR" +fi + +cat > "$SSLDIR/meiga_cert_request.req" << EOF +RANDFILE = /dev/urandom + +[ req ] +default_bits = 1024 +default_keyfile = privkey.pem +distinguished_name = req_distinguished_name +prompt = no +policy = policy_anything + +[ req_distinguished_name ] +commonName = meiga +EOF + +openssl req \ + -config "$SSLDIR/meiga_cert_request.req" \ + -new -x509 \ + -days 999999 \ + -nodes \ + -out "$SSLDIR/meiga.pem" \ + -keyout "$SSLDIR/meiga.key" > /dev/null 2>&1 + +chmod 600 "$SSLDIR/meiga.pem" "$SSLDIR/meiga.key" + diff -Nru meiga-0.3.4/src/server/libsoup-2.4.vapi meiga-0.4.0/src/server/libsoup-2.4.vapi --- meiga-0.3.4/src/server/libsoup-2.4.vapi 1970-01-01 00:00:00.000000000 +0000 +++ meiga-0.4.0/src/server/libsoup-2.4.vapi 2010-12-31 02:55:57.000000000 +0000 @@ -0,0 +1,1011 @@ +/* libsoup-2.4.vapi generated by vapigen, do not modify. */ + +[CCode (cprefix = "Soup", lower_case_cprefix = "soup_")] +namespace Soup { + [CCode (cheader_filename = "libsoup/soup.h")] + public class Address : GLib.Object { + [CCode (has_construct_function = false)] + public Address (string name, uint port); + [CCode (has_construct_function = false)] + public Address.any (Soup.AddressFamily family, uint port); + public static bool equal_by_ip (void* addr1, void* addr2); + public static bool equal_by_name (void* addr1, void* addr2); + [CCode (has_construct_function = false)] + public Address.from_sockaddr (void* sa, int len); + public unowned string get_name (); + public unowned string get_physical (); + public uint get_port (); + public void* get_sockaddr (int len); + public static uint hash_by_ip (void* addr); + public static uint hash_by_name (void* addr); + public bool is_resolved (); + public void resolve_async (GLib.MainContext async_context, GLib.Cancellable cancellable, Soup.AddressCallback callback); + public uint resolve_sync (GLib.Cancellable cancellable); + [NoAccessorMethod] + public Soup.AddressFamily family { get; construct; } + public string name { get; construct; } + public string physical { get; } + public int port { get; construct; } + public void* sockaddr { get; construct; } + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class Auth : GLib.Object { + [CCode (has_construct_function = false)] + public Auth (GLib.Type type, Soup.Message msg, string auth_header); + public virtual void authenticate (string username, string password); + public void free_protection_space (GLib.SList space); + public virtual unowned string get_authorization (Soup.Message msg); + public unowned string get_host (); + public unowned string get_info (); + public virtual unowned GLib.SList get_protection_space (Soup.URI source_uri); + public unowned string get_realm (); + public unowned string get_scheme_name (); + public virtual bool update (Soup.Message msg, string auth_header); + public string host { get; construct; } + [NoAccessorMethod] + public bool is_authenticated { get; } + [NoAccessorMethod] + public bool is_for_proxy { get; construct; } + public string realm { get; construct; } + public string scheme_name { get; } + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class AuthDomain : GLib.Object { + public virtual unowned string accepts (Soup.Message msg); + public void add_path (string path); + public virtual unowned string challenge (Soup.Message msg); + public virtual bool check_password (Soup.Message msg, string username, string password); + public bool covers (Soup.Message msg); + public unowned string get_realm (); + public void remove_path (string path); + public void set_filter (owned Soup.AuthDomainFilter filter); + public void set_generic_auth_callback (owned Soup.AuthDomainGenericAuthCallback auth_callback); + public bool try_generic_auth_callback (Soup.Message msg, string username); + [NoAccessorMethod] + public void* filter { get; set; } + [NoAccessorMethod] + public void* filter_data { get; set; } + [NoAccessorMethod] + public void* generic_auth_callback { get; set; } + [NoAccessorMethod] + public void* generic_auth_data { get; set; } + [NoAccessorMethod] + public bool proxy { get; construct; } + public string realm { get; construct; } + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class AuthDomainBasic : Soup.AuthDomain { + [CCode (type = "SoupAuthDomain*", has_construct_function = false)] + public AuthDomainBasic (string optname1, ...); + public static void set_auth_callback (Soup.AuthDomain domain, owned Soup.AuthDomainBasicAuthCallback callback); + [NoAccessorMethod] + public void* auth_callback { get; set; } + [NoAccessorMethod] + public void* auth_data { get; set; } + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class AuthDomainDigest : Soup.AuthDomain { + [CCode (type = "SoupAuthDomain*", has_construct_function = false)] + public AuthDomainDigest (string optname1); + public static unowned string encode_password (string username, string realm, string password); + public static void set_auth_callback (Soup.AuthDomain domain, owned Soup.AuthDomainDigestAuthCallback callback); + [NoAccessorMethod] + public void* auth_callback { get; set; } + [NoAccessorMethod] + public void* auth_data { get; set; } + } + [Compact] + [CCode (ref_function = "soup_buffer_copy", unref_function = "soup_buffer_free", type_id = "SOUP_TYPE_BUFFER", cheader_filename = "libsoup/soup.h")] + public class Buffer { + public weak string data; + public size_t length; + [CCode (has_construct_function = false)] + public Buffer (Soup.MemoryUse use, void* data, size_t length); + public Soup.Buffer copy (); + public void* get_owner (); + [CCode (has_construct_function = false)] + public Buffer.subbuffer (Soup.Buffer parent, size_t offset, size_t length); + [CCode (has_construct_function = false)] + public Buffer.with_owner (void* data, size_t length, void* owner, GLib.DestroyNotify owner_dnotify); + } + [Compact] + [CCode (type_id = "SOUP_TYPE_BYTE_ARRAY", cheader_filename = "libsoup/soup.h")] + public class ByteArray { + } + [Compact] + [CCode (type_id = "SOUP_TYPE_CLIENT_CONTEXT", cheader_filename = "libsoup/soup.h")] + public class ClientContext { + public unowned Soup.Address get_address (); + public unowned Soup.AuthDomain get_auth_domain (); + public unowned string get_auth_user (); + public unowned string get_host (); + public unowned Soup.Socket get_socket (); + } + [Compact] + [CCode (copy_function = "soup_cookie_copy", type_id = "SOUP_TYPE_COOKIE", cheader_filename = "libsoup/soup.h")] + public class Cookie { + public weak string domain; + public weak Soup.Date expires; + public bool http_only; + public weak string name; + public weak string path; + public bool secure; + public weak string value; + [CCode (has_construct_function = false)] + public Cookie (string name, string value, string domain, string path, int max_age); + public bool applies_to_uri (Soup.URI uri); + public Soup.Cookie copy (); + public bool equal (Soup.Cookie cookie2); + public static unowned Soup.Cookie parse (string header, Soup.URI origin); + public void set_domain (string domain); + public void set_expires (Soup.Date expires); + public void set_http_only (bool http_only); + public void set_max_age (int max_age); + public void set_name (string name); + public void set_path (string path); + public void set_secure (bool secure); + public void set_value (string value); + public unowned string to_cookie_header (); + public unowned string to_set_cookie_header (); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class CookieJar : GLib.Object, Soup.SessionFeature { + [CCode (has_construct_function = false)] + public CookieJar (); + public void add_cookie (Soup.Cookie cookie); + public unowned GLib.SList all_cookies (); + public void delete_cookie (Soup.Cookie cookie); + public unowned string get_cookies (Soup.URI uri, bool for_http); + public virtual void save (); + public void set_cookie (Soup.URI uri, string cookie); + [NoAccessorMethod] + public bool read_only { get; construct; } + public virtual signal void changed (Soup.Cookie old_cookie, Soup.Cookie new_cookie); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class CookieJarText : Soup.CookieJar, Soup.SessionFeature { + [CCode (type = "SoupCookieJar*", has_construct_function = false)] + public CookieJarText (string filename, bool read_only); + [NoAccessorMethod] + public string filename { owned get; construct; } + } + [Compact] + [CCode (copy_function = "soup_date_copy", type_id = "SOUP_TYPE_DATE", cheader_filename = "libsoup/soup.h")] + public class Date { + public int day; + public int hour; + public int minute; + public int month; + public int offset; + public int second; + public bool utc; + public int year; + [CCode (has_construct_function = false)] + public Date (int year, int month, int day, int hour, int minute, int second); + public Soup.Date copy (); + [CCode (has_construct_function = false)] + public Date.from_now (int offset_seconds); + [CCode (has_construct_function = false)] + public Date.from_string (string date_string); + [CCode (has_construct_function = false)] + public Date.from_time_t (ulong when); + public bool is_past (); + public unowned string to_string (Soup.DateFormat format); + public ulong to_time_t (); + public void to_timeval (GLib.TimeVal time); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class Logger : GLib.Object, Soup.SessionFeature { + [CCode (has_construct_function = false)] + public Logger (Soup.LoggerLogLevel level, int max_body_size); + public void set_printer (owned Soup.LoggerPrinter printer); + public void set_request_filter (owned Soup.LoggerFilter request_filter); + public void set_response_filter (owned Soup.LoggerFilter response_filter); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class Message : GLib.Object { + public weak Soup.MessageBody request_body; + public weak Soup.MessageHeaders request_headers; + public weak Soup.MessageBody response_body; + public weak Soup.MessageHeaders response_headers; + [CCode (has_construct_function = false)] + public Message (string method, string uri_string); + public uint add_header_handler (string @signal, string header, GLib.Callback callback); + public uint add_status_code_handler (string @signal, uint status_code, GLib.Callback callback); + [CCode (has_construct_function = false)] + public Message.from_uri (string method, Soup.URI uri); + public unowned Soup.Address get_address (); + public Soup.MessageFlags get_flags (); + public Soup.HTTPVersion get_http_version (); + public unowned Soup.URI get_uri (); + public bool is_keepalive (); + public void set_chunk_allocator (owned Soup.ChunkAllocator allocator); + public void set_flags (Soup.MessageFlags flags); + public void set_http_version (Soup.HTTPVersion version); + public void set_request (string content_type, Soup.MemoryUse req_use, string req_body, size_t req_length); + public void set_response (string content_type, Soup.MemoryUse resp_use, string resp_body, size_t resp_length); + public void set_status (uint status_code); + public void set_status_full (uint status_code, string reason_phrase); + public void set_uri (Soup.URI uri); + public Soup.MessageFlags flags { get; set; } + public Soup.HTTPVersion http_version { get; set; } + [NoAccessorMethod] + public string method { owned get; set; } + [NoAccessorMethod] + public string reason_phrase { owned get; set; } + [NoAccessorMethod] + public bool server_side { get; construct; } + [NoAccessorMethod] + public uint status_code { get; set; } + public Soup.URI uri { get; set; } + [HasEmitter] + public virtual signal void finished (); + [HasEmitter] + public virtual signal void got_body (); + [HasEmitter] + public virtual signal void got_chunk (Soup.Buffer chunk); + [HasEmitter] + public virtual signal void got_headers (); + [HasEmitter] + public virtual signal void got_informational (); + [HasEmitter] + public virtual signal void restarted (); + [HasEmitter] + public virtual signal void wrote_body (); + [HasEmitter] + public virtual signal void wrote_body_data (Soup.Buffer p0); + [HasEmitter] + public virtual signal void wrote_chunk (); + [HasEmitter] + public virtual signal void wrote_headers (); + [HasEmitter] + public virtual signal void wrote_informational (); + } + [Compact] + [CCode (type_id = "SOUP_TYPE_MESSAGE_BODY", cheader_filename = "libsoup/soup.h")] + public class MessageBody { + [CCode (array_length = false)] + public weak uint8[] data; + public int64 length; + [CCode (has_construct_function = false)] + public MessageBody (); + public void append (Soup.MemoryUse use, void* data, size_t length); + public void append_buffer (Soup.Buffer buffer); + public void complete (); + public unowned Soup.Buffer flatten (); + public bool get_accumulate (); + public unowned Soup.Buffer get_chunk (int64 offset); + public void got_chunk (Soup.Buffer chunk); + public void set_accumulate (bool accumulate); + public void truncate (); + public void wrote_chunk (Soup.Buffer chunk); + } + [Compact] + [CCode (type_id = "SOUP_TYPE_MESSAGE_HEADERS", cheader_filename = "libsoup/soup.h")] + public class MessageHeaders { + [CCode (has_construct_function = false)] + public MessageHeaders (Soup.MessageHeadersType type); + public void append (string name, string value); + public void clear (); + public void @foreach (Soup.MessageHeadersForeachFunc func); + public void free_ranges (Soup.Range ranges); + public unowned string @get (string name); + public bool get_content_disposition (out string disposition, out GLib.HashTable? @params); + public int64 get_content_length (); + public bool get_content_range (int64 start, int64 end, int64 total_length); + public unowned string get_content_type (out GLib.HashTable? @params); + public Soup.Encoding get_encoding (); + public Soup.Expectation get_expectations (); + public bool get_ranges (int64 total_length, out unowned Soup.Range ranges, int length); + public void remove (string name); + public void replace (string name, string value); + public void set_content_disposition (string disposition, GLib.HashTable @params); + public void set_content_length (int64 content_length); + public void set_content_range (int64 start, int64 end, int64 total_length); + public void set_content_type (string content_type, GLib.HashTable @params); + public void set_encoding (Soup.Encoding encoding); + public void set_expectations (Soup.Expectation expectations); + public void set_range (int64 start, int64 end); + public void set_ranges (Soup.Range ranges, int length); + } + [Compact] + [CCode (cheader_filename = "libsoup/soup.h")] + public class MessageHeadersIter { + public void* dummy; + public void init (Soup.MessageHeaders hdrs); + public bool next (out unowned string name, out unowned string value); + } + [Compact] + [CCode (type_id = "SOUP_TYPE_MULTIPART", cheader_filename = "libsoup/soup.h")] + public class Multipart { + [CCode (has_construct_function = false)] + public Multipart (string mime_type); + public void append_form_file (string control_name, string filename, string content_type, Soup.Buffer body); + public void append_form_string (string control_name, string data); + public void append_part (Soup.MessageHeaders headers, Soup.Buffer body); + [CCode (has_construct_function = false)] + public Multipart.from_message (Soup.MessageHeaders headers, Soup.MessageBody body); + public int get_length (); + public bool get_part (int part, out unowned Soup.MessageHeaders headers, out unowned Soup.Buffer body); + public void to_message (Soup.MessageHeaders dest_headers, Soup.MessageBody dest_body); + } + [Compact] + [CCode (cheader_filename = "libsoup/soup.h")] + public class Range { + public int64 end; + public int64 start; + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class Server : GLib.Object { + [CCode (has_construct_function = false)] + public Server (string optname1, ...); + public void add_auth_domain (Soup.AuthDomain auth_domain); + public void add_handler (string path, owned Soup.ServerCallback callback); + public unowned GLib.MainContext get_async_context (); + public unowned Soup.Socket get_listener (); + public uint get_port (); + public bool is_https (); + public void pause_message (Soup.Message msg); + public void quit (); + public void remove_auth_domain (Soup.AuthDomain auth_domain); + public void remove_handler (string path); + public void run (); + public void run_async (); + public void unpause_message (Soup.Message msg); + public void* async_context { get; construct; } + [NoAccessorMethod] + public Soup.Address @interface { owned get; construct; } + public uint port { get; construct; } + [NoAccessorMethod] + public bool raw_paths { get; construct; } + [NoAccessorMethod] + public string server_header { owned get; set construct; } + [NoAccessorMethod] + public string ssl_cert_file { owned get; construct; } + [NoAccessorMethod] + public string ssl_key_file { owned get; construct; } + public virtual signal void request_aborted (Soup.Message msg, Soup.ClientContext client); + public virtual signal void request_finished (Soup.Message msg, Soup.ClientContext client); + public virtual signal void request_read (Soup.Message msg, Soup.ClientContext client); + public virtual signal void request_started (Soup.Message msg, Soup.ClientContext client); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class Session : GLib.Object { + public void abort (); + public virtual void cancel_message (Soup.Message msg, uint status_code); + public unowned GLib.MainContext get_async_context (); + public void pause_message (Soup.Message msg); + public virtual void queue_message (owned Soup.Message msg, Soup.SessionCallback? callback); + public void remove_feature (Soup.SessionFeature feature); + public virtual void requeue_message (Soup.Message msg); + public virtual uint send_message (Soup.Message msg); + public void unpause_message (Soup.Message msg); + [NoAccessorMethod] + public Soup.SessionFeature add_feature { owned get; set; } + [NoAccessorMethod] + public GLib.Type add_feature_by_type { get; set; } + public void* async_context { get; construct; } + [NoAccessorMethod] + public uint idle_timeout { get; set; } + [NoAccessorMethod] + public int max_conns { get; set; } + [NoAccessorMethod] + public int max_conns_per_host { get; set; } + [NoAccessorMethod] + public Soup.URI proxy_uri { owned get; set; } + [NoAccessorMethod] + public GLib.Type remove_feature_by_type { get; set; } + [NoAccessorMethod] + public string ssl_ca_file { owned get; set; } + [NoAccessorMethod] + public uint timeout { get; set; } + [NoAccessorMethod] + public bool use_ntlm { get; set; } + [NoAccessorMethod] + public string user_agent { owned get; set; } + public virtual signal void authenticate (Soup.Message msg, Soup.Auth auth, bool retrying); + public virtual signal void request_queued (Soup.Message p0); + public virtual signal void request_started (Soup.Message msg, Soup.Socket socket); + public virtual signal void request_unqueued (Soup.Message p0); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class SessionAsync : Soup.Session { + [CCode (type = "SoupSession*", has_construct_function = false)] + public SessionAsync (); + [CCode (type = "SoupSession*", has_construct_function = false)] + public SessionAsync.with_options (string optname1, ...); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class SessionSync : Soup.Session { + [CCode (type = "SoupSession*", has_construct_function = false)] + public SessionSync (); + [CCode (type = "SoupSession*", has_construct_function = false)] + public SessionSync.with_options (string optname1, ...); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public class Socket : GLib.Object { + [CCode (has_construct_function = false)] + public Socket (string optname1); + public void connect_async (GLib.Cancellable cancellable, Soup.SocketCallback callback); + public uint connect_sync (GLib.Cancellable cancellable); + public void disconnect (); + public unowned Soup.Address get_local_address (); + public unowned Soup.Address get_remote_address (); + public bool is_connected (); + public bool is_ssl (); + public bool listen (); + public Soup.SocketIOStatus read (void* buffer, size_t len, size_t nread, GLib.Cancellable cancellable) throws GLib.Error; + public Soup.SocketIOStatus read_until (void* buffer, size_t len, void* boundary, size_t boundary_len, size_t nread, bool got_boundary, GLib.Cancellable cancellable) throws GLib.Error; + public bool start_proxy_ssl (string ssl_host, GLib.Cancellable cancellable); + public bool start_ssl (GLib.Cancellable cancellable); + public Soup.SocketIOStatus write (void* buffer, size_t len, size_t nwrote, GLib.Cancellable cancellable) throws GLib.Error; + [NoAccessorMethod] + public void* async_context { get; construct; } + [NoAccessorMethod] + public bool is_server { get; } + public Soup.Address local_address { get; construct; } + [NoAccessorMethod] + public bool non_blocking { get; set; } + public Soup.Address remote_address { get; construct; } + [NoAccessorMethod] + public void* ssl_creds { get; set; } + [NoAccessorMethod] + public uint timeout { get; set; } + public virtual signal void disconnected (); + public virtual signal void new_connection (Soup.Socket p0); + public virtual signal void readable (); + public virtual signal void writable (); + } + [Compact] + [CCode (copy_function = "soup_uri_copy", type_id = "SOUP_TYPE_URI", cheader_filename = "libsoup/soup.h")] + public class URI { + public weak string fragment; + public weak string host; + public weak string password; + public weak string path; + public uint port; + public weak string query; + public weak string scheme; + public weak string user; + [CCode (has_construct_function = false)] + public URI (string uri_string); + public Soup.URI copy (); + public static string decode (string part); + public static string encode (string part, string? escape_extra); + public bool equal (Soup.URI uri2); + public static string normalize (string part, string unescape_extra); + public void set_fragment (string fragment); + public void set_host (string host); + public void set_password (string password); + public void set_path (string path); + public void set_port (uint port); + public void set_query (string query); + public void set_query_from_fields (...); + public void set_query_from_form (GLib.HashTable form); + public void set_scheme (string scheme); + public void set_user (string user); + public string to_string (bool just_path_and_query); + public bool uses_default_port (); + [CCode (has_construct_function = false)] + public URI.with_base (Soup.URI @base, string uri_string); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public interface ProxyResolver : Soup.SessionFeature, GLib.Object { + public abstract void get_proxy_async (Soup.Message msg, GLib.MainContext async_context, GLib.Cancellable cancellable, Soup.ProxyResolverCallback callback); + public abstract uint get_proxy_sync (Soup.Message msg, GLib.Cancellable cancellable, out unowned Soup.Address addr); + } + [CCode (cheader_filename = "libsoup/soup.h")] + public interface SessionFeature : GLib.Object { + public abstract void attach (Soup.Session session); + public abstract void detach (Soup.Session session); + [NoWrapper] + public abstract void request_queued (Soup.Session session, Soup.Message msg); + [NoWrapper] + public abstract void request_started (Soup.Session session, Soup.Message msg, Soup.Socket socket); + [NoWrapper] + public abstract void request_unqueued (Soup.Session session, Soup.Message msg); + } + [CCode (cprefix = "SOUP_ADDRESS_FAMILY_", cheader_filename = "libsoup/soup.h")] + public enum AddressFamily { + INVALID, + IPV4, + IPV6 + } + [CCode (cprefix = "SOUP_DATE_", cheader_filename = "libsoup/soup.h")] + public enum DateFormat { + HTTP, + COOKIE, + RFC2822, + ISO8601_COMPACT, + ISO8601_FULL, + ISO8601, + ISO8601_XMLRPC + } + [CCode (cprefix = "SOUP_ENCODING_", cheader_filename = "libsoup/soup.h")] + public enum Encoding { + UNRECOGNIZED, + NONE, + CONTENT_LENGTH, + EOF, + CHUNKED, + BYTERANGES + } + [CCode (cprefix = "SOUP_EXPECTATION_", cheader_filename = "libsoup/soup.h")] + [Flags] + public enum Expectation { + UNRECOGNIZED, + CONTINUE + } + [CCode (cprefix = "SOUP_HTTP_", cheader_filename = "libsoup/soup.h")] + public enum HTTPVersion { + @1_0, + @1_1 + } + [CCode (cprefix = "SOUP_STATUS_", cheader_filename = "libsoup/soup.h")] + public enum KnownStatusCode { + NONE, + CANCELLED, + CANT_RESOLVE, + CANT_RESOLVE_PROXY, + CANT_CONNECT, + CANT_CONNECT_PROXY, + SSL_FAILED, + IO_ERROR, + MALFORMED, + TRY_AGAIN, + CONTINUE, + SWITCHING_PROTOCOLS, + PROCESSING, + OK, + CREATED, + ACCEPTED, + NON_AUTHORITATIVE, + NO_CONTENT, + RESET_CONTENT, + PARTIAL_CONTENT, + MULTI_STATUS, + MULTIPLE_CHOICES, + MOVED_PERMANENTLY, + FOUND, + MOVED_TEMPORARILY, + SEE_OTHER, + NOT_MODIFIED, + USE_PROXY, + NOT_APPEARING_IN_THIS_PROTOCOL, + TEMPORARY_REDIRECT, + BAD_REQUEST, + UNAUTHORIZED, + PAYMENT_REQUIRED, + FORBIDDEN, + NOT_FOUND, + METHOD_NOT_ALLOWED, + NOT_ACCEPTABLE, + PROXY_AUTHENTICATION_REQUIRED, + PROXY_UNAUTHORIZED, + REQUEST_TIMEOUT, + CONFLICT, + GONE, + LENGTH_REQUIRED, + PRECONDITION_FAILED, + REQUEST_ENTITY_TOO_LARGE, + REQUEST_URI_TOO_LONG, + UNSUPPORTED_MEDIA_TYPE, + REQUESTED_RANGE_NOT_SATISFIABLE, + INVALID_RANGE, + EXPECTATION_FAILED, + UNPROCESSABLE_ENTITY, + LOCKED, + FAILED_DEPENDENCY, + INTERNAL_SERVER_ERROR, + NOT_IMPLEMENTED, + BAD_GATEWAY, + SERVICE_UNAVAILABLE, + GATEWAY_TIMEOUT, + HTTP_VERSION_NOT_SUPPORTED, + INSUFFICIENT_STORAGE, + NOT_EXTENDED + } + [CCode (cprefix = "SOUP_LOGGER_LOG_", cheader_filename = "libsoup/soup.h")] + public enum LoggerLogLevel { + NONE, + MINIMAL, + HEADERS, + BODY + } + [CCode (cprefix = "SOUP_MEMORY_", cheader_filename = "libsoup/soup.h")] + public enum MemoryUse { + STATIC, + TAKE, + COPY, + TEMPORARY + } + [CCode (cprefix = "SOUP_MESSAGE_", cheader_filename = "libsoup/soup.h")] + [Flags] + public enum MessageFlags { + OVERWRITE_CHUNKS, + NO_REDIRECT + } + [CCode (cprefix = "SOUP_MESSAGE_HEADERS_", cheader_filename = "libsoup/soup.h")] + public enum MessageHeadersType { + REQUEST, + RESPONSE, + MULTIPART + } + [CCode (cprefix = "SOUP_SSL_ERROR_", cheader_filename = "libsoup/soup.h")] + public enum SSLError { + HANDSHAKE_NEEDS_READ, + HANDSHAKE_NEEDS_WRITE, + CERTIFICATE + } + [CCode (cprefix = "SOUP_SOCKET_", cheader_filename = "libsoup/soup.h")] + public enum SocketIOStatus { + OK, + WOULD_BLOCK, + EOF, + ERROR + } + [CCode (cprefix = "SOUP_XMLRPC_ERROR_", cheader_filename = "libsoup/soup.h")] + public enum XMLRPCError { + ARGUMENTS, + RETVAL + } + [CCode (cprefix = "SOUP_XMLRPC_FAULT_", cheader_filename = "libsoup/soup.h")] + public enum XMLRPCFault { + PARSE_ERROR_NOT_WELL_FORMED, + PARSE_ERROR_UNSUPPORTED_ENCODING, + PARSE_ERROR_INVALID_CHARACTER_FOR_ENCODING, + SERVER_ERROR_INVALID_XML_RPC, + SERVER_ERROR_REQUESTED_METHOD_NOT_FOUND, + SERVER_ERROR_INVALID_METHOD_PARAMETERS, + SERVER_ERROR_INTERNAL_XML_RPC_ERROR, + APPLICATION_ERROR, + SYSTEM_ERROR, + TRANSPORT_ERROR + } + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate void AddressCallback (Soup.Address addr, uint status); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate bool AuthDomainBasicAuthCallback (Soup.AuthDomain domain, Soup.Message msg, string username, string password); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate unowned string AuthDomainDigestAuthCallback (Soup.AuthDomain domain, Soup.Message msg, string username); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate bool AuthDomainFilter (Soup.AuthDomain domain, Soup.Message msg); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate bool AuthDomainGenericAuthCallback (Soup.AuthDomain domain, Soup.Message msg, string username); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate unowned Soup.Buffer ChunkAllocator (Soup.Message msg, size_t max_len); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate Soup.LoggerLogLevel LoggerFilter (Soup.Logger logger, Soup.Message msg); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate void LoggerPrinter (Soup.Logger logger, Soup.LoggerLogLevel level, string direction, string data); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate void MessageHeadersForeachFunc (string name, string value); + [CCode (cheader_filename = "libsoup/soup.h", has_target = false)] + public delegate void ProxyResolverCallback (Soup.ProxyResolver p1, Soup.Message p2, uint p3, Soup.Address p4, void* p5); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate void ServerCallback (Soup.Server server, Soup.Message msg, string path, GLib.HashTable query, Soup.ClientContext client); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate void SessionCallback (Soup.Session session, Soup.Message msg); + [CCode (cheader_filename = "libsoup/soup.h")] + public delegate void SocketCallback (Soup.Socket sock, uint status); + [CCode (cheader_filename = "libsoup/soup.h")] + public const int ADDRESS_ANY_PORT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string ADDRESS_FAMILY; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string ADDRESS_NAME; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string ADDRESS_PHYSICAL; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string ADDRESS_PORT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string ADDRESS_SOCKADDR; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int AF_INET6; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_ADD_PATH; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_BASIC_AUTH_CALLBACK; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_BASIC_AUTH_DATA; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int AUTH_DOMAIN_BASIC_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_DIGEST_AUTH_CALLBACK; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_DIGEST_AUTH_DATA; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int AUTH_DOMAIN_DIGEST_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_FILTER; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_FILTER_DATA; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_GENERIC_AUTH_CALLBACK; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_GENERIC_AUTH_DATA; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int AUTH_DOMAIN_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_PROXY; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_REALM; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_DOMAIN_REMOVE_PATH; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int AUTH_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_HOST; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_IS_AUTHENTICATED; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_IS_FOR_PROXY; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_REALM; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string AUTH_SCHEME_NAME; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int COOKIE_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int COOKIE_JAR_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string COOKIE_JAR_READ_ONLY; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string COOKIE_JAR_TEXT_FILENAME; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int COOKIE_JAR_TEXT_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int COOKIE_MAX_AGE_ONE_DAY; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int COOKIE_MAX_AGE_ONE_HOUR; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int COOKIE_MAX_AGE_ONE_WEEK; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int COOKIE_MAX_AGE_ONE_YEAR; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int DATE_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int FORM_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string FORM_MIME_TYPE_MULTIPART; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string FORM_MIME_TYPE_URLENCODED; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int HEADERS_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int LOGGER_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int MESSAGE_BODY_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string MESSAGE_FLAGS; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int MESSAGE_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int MESSAGE_HEADERS_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string MESSAGE_HTTP_VERSION; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string MESSAGE_METHOD; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string MESSAGE_REASON_PHRASE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string MESSAGE_SERVER_SIDE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string MESSAGE_STATUS_CODE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string MESSAGE_URI; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int METHOD_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int MISC_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int MULTIPART_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int PROXY_RESOLVER_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SERVER_ASYNC_CONTEXT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int SERVER_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SERVER_INTERFACE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SERVER_PORT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SERVER_RAW_PATHS; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SERVER_SERVER_HEADER; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SERVER_SSL_CERT_FILE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SERVER_SSL_KEY_FILE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_ADD_FEATURE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_ADD_FEATURE_BY_TYPE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_ASYNC_CONTEXT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int SESSION_ASYNC_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int SESSION_FEATURE_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int SESSION_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_IDLE_TIMEOUT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_MAX_CONNS; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_MAX_CONNS_PER_HOST; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_PROXY_URI; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_REMOVE_FEATURE_BY_TYPE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_SSL_CA_FILE; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int SESSION_SYNC_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_TIMEOUT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_USER_AGENT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SESSION_USE_NTLM; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SOCKET_ASYNC_CONTEXT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SOCKET_FLAG_NONBLOCKING; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int SOCKET_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SOCKET_IS_SERVER; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SOCKET_LOCAL_ADDRESS; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SOCKET_REMOTE_ADDRESS; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SOCKET_SSL_CREDENTIALS; + [CCode (cheader_filename = "libsoup/soup.h")] + public const string SOCKET_TIMEOUT; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int STATUS_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int TYPES_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int URI_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int VALUE_UTILS_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public const int XMLRPC_H; + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.TimeoutSource add_completion (GLib.MainContext async_context, GLib.SourceFunc function, void* data); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.TimeoutSource add_idle (GLib.MainContext async_context, GLib.SourceFunc function, void* data); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.TimeoutSource add_timeout (GLib.MainContext async_context, uint interval, GLib.SourceFunc function, void* data); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void cookies_free (GLib.SList cookies); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.SList cookies_from_request (Soup.Message msg); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.SList cookies_from_response (Soup.Message msg); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string cookies_to_cookie_header (GLib.SList cookies); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void cookies_to_request (GLib.SList cookies, Soup.Message msg); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void cookies_to_response (GLib.SList cookies, Soup.Message msg); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.HashTable form_decode (string encoded_form); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.HashTable form_decode_multipart (Soup.Message msg, string file_control_name, out unowned string filename, out unowned string content_type, out unowned Soup.Buffer file); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string form_encode (...); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string form_encode_datalist (void* form_data_set); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string form_encode_hash (GLib.HashTable form_data_set); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string form_encode_valist (string first_field, void* args); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned Soup.Message form_request_new (string method, string uri, ...); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned Soup.Message form_request_new_from_datalist (string method, string uri, void* form_data_set); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned Soup.Message form_request_new_from_hash (string method, string uri, GLib.HashTable form_data_set); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned Soup.Message form_request_new_from_multipart (string uri, Soup.Multipart multipart); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool header_contains (string header, string token); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void header_free_list (GLib.SList list); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void header_free_param_list (GLib.HashTable param_list); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void header_g_string_append_param (GLib.StringBuilder str, string name, string value); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.SList header_parse_list (string header); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.HashTable header_parse_param_list (string header); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.SList header_parse_quality_list (string header, GLib.SList unacceptable); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.HashTable header_parse_semi_param_list (string header); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool headers_parse (string str, int len, Soup.MessageHeaders dest); + [CCode (cheader_filename = "libsoup/soup.h")] + public static uint headers_parse_request (string str, int len, Soup.MessageHeaders req_headers, out unowned string req_method, out unowned string req_path, Soup.HTTPVersion ver); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool headers_parse_response (string str, int len, Soup.MessageHeaders headers, Soup.HTTPVersion ver, uint status_code, out unowned string reason_phrase); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool headers_parse_status_line (string status_line, Soup.HTTPVersion ver, uint status_code, out unowned string reason_phrase); + [CCode (cheader_filename = "libsoup/soup.h")] + public static GLib.Quark http_error_quark (); + [CCode (cheader_filename = "libsoup/soup.h")] + public static GLib.Quark ssl_error_quark (); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string status_get_phrase (uint status_code); + [CCode (cheader_filename = "libsoup/soup.h")] + public static uint status_proxify (uint status_code); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool str_case_equal (void* v1, void* v2); + [CCode (cheader_filename = "libsoup/soup.h")] + public static uint str_case_hash (void* key); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void value_array_append (GLib.ValueArray array, GLib.Type type); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void value_array_append_vals (GLib.ValueArray array, ...); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.ValueArray value_array_from_args (void* args); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool value_array_get_nth (GLib.ValueArray array, uint index_, GLib.Type type); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void value_array_insert (GLib.ValueArray array, uint index_, GLib.Type type); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.ValueArray value_array_new (); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.ValueArray value_array_new_with_vals (...); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool value_array_to_args (GLib.ValueArray array, void* args); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void value_hash_insert (GLib.HashTable hash, string key, GLib.Type type); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void value_hash_insert_vals (GLib.HashTable hash, ...); + [CCode (cheader_filename = "libsoup/soup.h")] + public static void value_hash_insert_value (GLib.HashTable hash, string key, GLib.Value value); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool value_hash_lookup (GLib.HashTable hash, string key, GLib.Type type); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool value_hash_lookup_vals (GLib.HashTable hash, ...); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.HashTable value_hash_new (); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned GLib.HashTable value_hash_new_with_vals (...); + [PrintfFormat] + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string xmlrpc_build_fault (int fault_code, string fault_format, ...); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string xmlrpc_build_method_call (string method_name, GLib.Value[] @params); + [CCode (cheader_filename = "libsoup/soup.h")] + public static unowned string xmlrpc_build_method_response (GLib.Value value); + [CCode (cheader_filename = "libsoup/soup.h")] + public static GLib.Quark xmlrpc_error_quark (); + [CCode (cheader_filename = "libsoup/soup.h", sentinel = "G_TYPE_INVALID")] + public static bool xmlrpc_extract_method_call (string method_call, int length, out unowned string method_name, ...); + [CCode (cheader_filename = "libsoup/soup.h", sentinel = "G_TYPE_INVALID")] + public static bool xmlrpc_extract_method_response (string method_response, int length, ...) throws GLib.Error; + [CCode (cheader_filename = "libsoup/soup.h")] + public static GLib.Quark xmlrpc_fault_quark (); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool xmlrpc_parse_method_call (string method_call, int length, out unowned string method_name, out unowned GLib.ValueArray @params); + [CCode (cheader_filename = "libsoup/soup.h")] + public static bool xmlrpc_parse_method_response (string method_response, int length, GLib.Value value) throws GLib.Error; + [CCode (cheader_filename = "libsoup/soup.h", sentinel = "G_TYPE_INVALID")] + public static unowned Soup.Message xmlrpc_request_new (string uri, string method_name, ...); + [PrintfFormat] + [CCode (cheader_filename = "libsoup/soup.h")] + public static void xmlrpc_set_fault (Soup.Message msg, int fault_code, string fault_format, ...); + [CCode (cheader_filename = "libsoup/soup.h", sentinel = "G_TYPE_INVALID")] + public static void xmlrpc_set_response (Soup.Message msg, ...); +} diff -Nru meiga-0.3.4/src/server/Makefile.am meiga-0.4.0/src/server/Makefile.am --- meiga-0.3.4/src/server/Makefile.am 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/src/server/Makefile.am 2010-12-31 02:55:57.000000000 +0000 @@ -35,7 +35,7 @@ meiga.vala.stamp: $(meigaserver_VALASOURCES) $(VALAC) -C \ --thread --pkg=libsoup-2.4 --pkg=gtk+-2.0 --pkg=dbus-glib-1 \ - --vapidir=.. --pkg=config --basedir $(top_srcdir)/src/server $^ + --vapidir=. --vapidir=.. --pkg=config --basedir $(top_srcdir)/src/server $^ touch $@ meigaserver_LDADD = \ diff -Nru meiga-0.3.4/src/server/MeigaServer.vala meiga-0.4.0/src/server/MeigaServer.vala --- meiga-0.3.4/src/server/MeigaServer.vala 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/src/server/MeigaServer.vala 2010-12-31 02:55:57.000000000 +0000 @@ -31,7 +31,6 @@ public class MeigaServer : GLib.Object { const string MIME_TYPES_FILE="/etc/mime.types"; - private int port; private Soup.Server server; private GLib.HashTable path_mapping; private GLib.HashTable mimetypes; @@ -39,10 +38,19 @@ private Net net; private uint pending_requests; private uint total_requests; + private GLib.KeyFile settings; public Log logger { public get; private set; default=null; } public uint gui_pid { public get; private set; default=0; } public string display { public get; private set; default=null; } + public uint _port = 8001; + public uint port { + public get { return _port; } + public set { _port = value; } + } + public bool ssl { public get; public set; default=false; } + public string auth_user { public get; public set; default=""; } + public string auth_md5passwd { public get; public set; default=""; } public signal void model_changed(); @@ -56,24 +64,112 @@ public void initialize() { logger = new Log(); - port=8001; pending_requests=0; total_requests=0; initialize_mimetypes(); path_mapping=new GLib.HashTable(GLib.str_hash,GLib.str_equal); + initialize_dbus(); + + notify["port"] += (s, p) => { + reinitialize(); + save_settings(); + model_changed(); + }; + + notify["ssl"] += (s, p) => { + reinitialize(); + save_settings(); + model_changed(); + }; + + notify["auth_user"] += (s, p) => { + reinitialize(); + save_settings(); + model_changed(); + }; + + notify["auth_md5passwd"] += (s, p) => { + reinitialize(); + save_settings(); + model_changed(); + }; + } + + private void enforce_meiga_ssl_cert() { + string txtout; + string txterr; + int result; + + if (!(FileUtils.test(Environment.get_home_dir()+"/.meiga/ssl/meiga.pem", FileTest.EXISTS) + && FileUtils.test(Environment.get_home_dir()+"/.meiga/ssl/meiga.key", FileTest.EXISTS))) { + try { + GLib.Process.spawn_command_line_sync(Config.BINDIR+"/make-meiga-ssl-cert", + out txtout, + out txterr, + out result); + if (result != 0) { + log(_("Error creating SSL certificate")); + } + } catch (GLib.SpawnError e) { + log(_("Error spawning SSL certificate creation process")); + } + } + } + + private void reinitialize() { + if (server!=null) { + foreach (string logical_path in path_mapping.get_keys()) { + server.remove_handler(logical_path); + } + server.remove_handler("/rss"); + server.remove_handler("/"); + server.quit(); + server = null; + } + + int tries = 100; + while (server==null && tries>0) { + if (tries==1) _port = Soup.ADDRESS_ANY_PORT; + if (ssl) { + enforce_meiga_ssl_cert(); + server=new Server(Soup.SERVER_PORT, port, + Soup.SERVER_SSL_CERT_FILE, Environment.get_home_dir()+"/.meiga/ssl/meiga.pem", + Soup.SERVER_SSL_KEY_FILE, Environment.get_home_dir()+"/.meiga/ssl/meiga.key"); + } else { + server=new Server(Soup.SERVER_PORT, port); + } + tries--; + } + _port = server.get_port(); + + if (auth_user!="" && auth_md5passwd!="") { + Soup.AuthDomainBasic auth = new Soup.AuthDomainBasic( + Soup.AUTH_DOMAIN_REALM, "Meiga", + Soup.AUTH_DOMAIN_BASIC_AUTH_CALLBACK, on_auth_callback, + Soup.AUTH_DOMAIN_BASIC_AUTH_DATA, this, + Soup.AUTH_DOMAIN_ADD_PATH, "/"); + server.add_auth_domain(auth); + } - server=new Server(Soup.SERVER_PORT,port); server.add_handler("/",serve_file_callback_default); server.add_handler("/rss",serve_rss_callback); - server.run_async(); - initialize_dbus(); + foreach (string logical_path in path_mapping.get_keys()) { + server.add_handler(logical_path,serve_file_callback); + } + + server.run_async(); + if (net!=null) { + net.protocol = (ssl?"https":"http"); + net.port = port; + } } public void initialize_net() { net = new Net(); net.logger = logger; + net.protocol = (ssl?"https":"http"); net.port = port; net.display = display; net.redirection_type = Net.REDIRECTION_TYPE_NONE; @@ -135,24 +231,94 @@ } } + private void initialize_settings() { + string filename = Environment.get_home_dir()+"/.meiga/meiga.ini"; + settings = new KeyFile(); + try { + if (!FileUtils.test(filename, FileTest.EXISTS)) throw new Error(Quark.from_string(""),1,""); + settings.load_from_file(filename, KeyFileFlags.KEEP_COMMENTS & KeyFileFlags.KEEP_TRANSLATIONS); + } catch (Error e) { } + + try { + string[] stpaths = settings.get_string_list("meiga", "paths"); + for (int i=1; i keys=path_mapping.get_keys().copy(); + keys.sort(GLib.strcmp); + foreach (weak string k in keys) { + string v=path_mapping.lookup(k); + stpaths += k; + stpaths += v; + } + settings.set_string_list("meiga", "paths", stpaths); + settings.set_string("meiga", "port", "%u".printf(_port)); + settings.set_boolean("meiga", "ssl", ssl); + settings.set_string("meiga", "auth_user", auth_user); + settings.set_string("meiga", "auth_md5passwd", auth_md5passwd); + + try { + FileUtils.set_contents(filename, settings.to_data()); + } catch (FileError e) { } + } + public string get_public_url() { return net.url; } public void shutdown() { - server.quit(); + if (server!=null) { + foreach (string logical_path in path_mapping.get_keys()) { + server.remove_handler(logical_path); + } + server.remove_handler("/rss"); + server.remove_handler("/"); + server.quit(); + } net.redirection_type = Net.REDIRECTION_TYPE_NONE; Idle.add_full(Priority.LOW, () => { Gtk.main_quit(); return false; }); } - public void set_port(int port) { - this.port=port; - } - public void register_gui(uint gui_pid, string display) { this.gui_pid = gui_pid; this.display = display; - if (this.net == null) initialize_net(); + if (this.net == null) { + initialize_settings(); + reinitialize(); + initialize_net(); + } + model_changed(); } public void register_path(string real_path, string logical_path) { @@ -167,6 +333,7 @@ path_mapping.insert(logical_path,real_path); log(_("Registered logical path '%s' to real path '%s'").printf(logical_path,real_path)); server.add_handler(logical_path,serve_file_callback); + save_settings(); } public void unregister_path(string logical_path) { @@ -179,6 +346,7 @@ log(_("Unregistered logical path '%s'").printf(logical_path)); path_mapping.remove(logical_path); + save_settings(); } public int get_redirection_type() { @@ -231,6 +399,17 @@ return "%u/%u".printf(pending_requests, total_requests); } + [CCode (instance_pos = -1)] + private bool on_auth_callback (Soup.AuthDomain domain, Soup.Message msg, + string username, string password) { + bool result = (username==auth_user && + Checksum.compute_for_string(ChecksumType.MD5, password)==auth_md5passwd); + if (!result) { + log(_("Invalid authentication asking for path %s").printf(msg.uri.path)); + } + return result; + } + public void serve_file_callback (Soup.Server server, Soup.Message? msg, string path, GLib.HashTable? query, Soup.ClientContext? client) { string real_path=null; diff -Nru meiga-0.3.4/src/server/Meiga.vala meiga-0.4.0/src/server/Meiga.vala --- meiga-0.3.4/src/server/Meiga.vala 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/src/server/Meiga.vala 2010-12-31 02:55:57.000000000 +0000 @@ -94,6 +94,38 @@ return server.get_redirection_status(); } + public uint get_port() { + return server.port; + } + + public void set_port(uint port) { + server.port=port; + } + + public bool get_ssl() { + return server.ssl; + } + + public void set_ssl(bool ssl) { + server.ssl=ssl; + } + + public string get_auth_user() { + return server.auth_user; + } + + public void set_auth_user(string auth_user) { + server.auth_user = auth_user; + } + + public string get_auth_md5passwd() { + return server.auth_md5passwd; + } + + public void set_auth_md5passwd(string auth_md5passwd) { + server.auth_md5passwd = auth_md5passwd; + } + public void set_ssh_host(string ssh_host) { server.set_ssh_host(ssh_host); } diff -Nru meiga-0.3.4/src/server/Net.vala meiga-0.4.0/src/server/Net.vala --- meiga-0.3.4/src/server/Net.vala 2010-06-06 00:40:34.000000000 +0000 +++ meiga-0.4.0/src/server/Net.vala 2010-12-31 02:55:57.000000000 +0000 @@ -50,10 +50,28 @@ private set { lock (worker) { _internal_ip = value; } } } - private int _port; - public int port { - get { int r; lock (worker) { r = _port; } return r; } - set { lock (worker) { _port = value; } } + private uint _port; + public uint port { + get { uint r; lock (worker) { r = _port; } return r; } + set { + bool reload = false; + lock (worker) { reload = (_port!=value); } + if (reload) forward_stop(); + lock (worker) { _port = value; } + if (reload) forward_start(); + } + } + + private string _protocol; + public string protocol { + owned get { string r; lock (worker) { r = _protocol; } return r; } + set { + lock (worker) { + if (_url!=null) _url=_url.splice(0,_protocol.len(),value); + _protocol=value; + } + url = _url; // Force a notify + } } private string _url = null; @@ -120,7 +138,8 @@ } public Net() { - port = 8001; + _port = 8001; + _protocol = "http"; url = null; logger = null; _previous_redirection_type = REDIRECTION_TYPE_NONE; @@ -210,7 +229,7 @@ internal_ip = "127.0.0.1"; } - url="http://%s:%d".printf(internal_ip, port); + url="%s://%s:%u".printf(protocol,internal_ip, port); this.internal_ip = internal_ip; this.external_ip = internal_ip; @@ -270,13 +289,13 @@ && strcmp(txtout,"(null)")!=0) { external_ip = txtout; log(_("Found external IP: %s").printf(external_ip)); - GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwupnp -q %d".printf(port), + GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwupnp -q %u".printf(port), out txtout, out txterr, out result); if (result != 0) { log(_("Creating redirection")); - GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwupnp -r %d %d %s %s %d".printf(port,port,internal_ip,"Meiga",0), + GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwupnp -r %u %u %s %s %d".printf(port,port,internal_ip,"Meiga",0), out txtout, out txterr, out result); @@ -298,7 +317,7 @@ } } - url="http://%s:%d".printf(external_ip, port); + url="%s://%s:%u".printf(protocol, external_ip, port); this.internal_ip = internal_ip; this.external_ip = external_ip; @@ -318,7 +337,7 @@ if (status == REDIRECTION_STATUS_DONE || status == REDIRECTION_STATUS_PENDING) { if (internal_ip != external_ip) { try { - GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwupnp -d %d".printf(port), + GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwupnp -d %u".printf(port), out txtout, out txterr, out result); @@ -379,7 +398,7 @@ string[] sshcmd_argv; tmp_external_ip = ssh_host; - sshcmd += "%s %d %s %d".printf(ssh_host, port, tmp_internal_ip, port); + sshcmd += "%s %u %s %u".printf(ssh_host, port, tmp_internal_ip, port); log(_("Using external IP: %s").printf(tmp_external_ip)); log(_("Creating SSH tunnel")); @@ -415,7 +434,7 @@ } } - tmp_url="http://%s:%d".printf(tmp_external_ip, port); + tmp_url="%s://%s:%u".printf(protocol, tmp_external_ip, port); this.internal_ip = tmp_internal_ip; this.external_ip = tmp_external_ip; @@ -436,7 +455,7 @@ status == REDIRECTION_STATUS_PENDING || status == REDIRECTION_STATUS_ERROR) { try { - GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwssh -d %d".printf(port), + GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwssh -d %u".printf(port), out txtout, out txterr, out result); @@ -506,13 +525,13 @@ && strcmp(txtout,"(null)")!=0) { tmp_external_ip = txtout; log(_("Found external IP: %s").printf(tmp_external_ip)); - GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwfon -q %d".printf(port), + GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwfon -q %u".printf(port), out txtout, out txterr, out result); if (result != 0) { log(_("Creating redirection")); - GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwfon -r %d %s %d".printf(port,tmp_internal_ip,port), + GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwfon -r %u %s %u".printf(port,tmp_internal_ip,port), out txtout, out txterr, out result); @@ -534,7 +553,7 @@ } } - tmp_url="http://%s:%d".printf(tmp_external_ip, port); + tmp_url="%s://%s:%u".printf(protocol, tmp_external_ip, port); this.internal_ip = tmp_internal_ip; this.external_ip = tmp_external_ip; @@ -555,7 +574,7 @@ status == REDIRECTION_STATUS_PENDING || status == REDIRECTION_STATUS_ERROR) { try { - GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwfon -d %d".printf(port), + GLib.Process.spawn_command_line_sync(Config.BINDIR+"/fwfon -d %u".printf(port), out txtout, out txterr, out result);