<span class="c">#!/usr/bin/env python</span>
<span class="c">################################################################################</span>
<span class="c"># OpenWifiAutoConnect - Stephane PUYBAREAU (puyb <at> puyb <dot> net) - 2008 # </span>
<span class="c"># Fully automated authentication to capture portal based wifi networks. # </span>
<span class="c"># Config file: ~/.OpenWifiAutoConnect - Format: ini #</span>
<span class="c"># Section are network SSID (names) #</span>
<span class="c"># key / value pair define user submited information (based on the html form) #</span>
<span class="c"># # </span>
<span class="c"># This software is provided under the terms of the GPL v3 licence. # </span>
<span class="c"># See http://www.gnu.org/licenses/gpl.html for more information # </span>
<span class="c"># # </span>
<span class="c"># This software use python dbus bindings, pynotify and BeautifulSoup modules #</span>
<span class="c">################################################################################</span>
<span class="c"># The url the program will try to open hoping to be redirected to the portal</span>
<span class="n">URL</span> <span class="o">=</span> <span class="s">'http://perdu.com/'</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">gobject</span>
<span class="kn">import</span> <span class="nn">dbus</span>
<span class="kn">import</span> <span class="nn">dbus.mainloop.glib</span>
<span class="kn">import</span> <span class="nn">urllib2</span><span class="o">,</span> <span class="nn">urllib</span>
<span class="kn">from</span> <span class="nn">BeautifulSoup</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span>
<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">ConfigParser</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">pynotify</span>
<span class="k">def</span> <span class="nf">properties_changed_signal_handler</span><span class="p">(</span><span class="n">props</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">props</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s">'ActiveConnections'</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">for</span> <span class="n">device_path</span> <span class="ow">in</span> <span class="n">props</span><span class="p">[</span><span class="s">'ActiveConnections'</span><span class="p">]:</span>
<span class="n">device</span> <span class="o">=</span> <span class="n">bus</span><span class="o">.</span><span class="n">get_object</span><span class="p">(</span><span class="s">'org.freedesktop.NetworkManager'</span><span class="p">,</span> <span class="n">device_path</span><span class="p">)</span>
<span class="n">device_props</span> <span class="o">=</span> <span class="n">device</span><span class="o">.</span><span class="n">GetAll</span><span class="p">(</span><span class="s">"org.freedesktop.NetworkManager.Connection.Active"</span><span class="p">,</span> <span class="n">dbus_interface</span><span class="o">=</span><span class="s">"org.freedesktop.DBus.Properties"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">device_props</span><span class="p">[</span><span class="s">'Default'</span><span class="p">]:</span>
<span class="k">return</span>
<span class="n">ap_path</span> <span class="o">=</span> <span class="n">device_props</span><span class="p">[</span><span class="s">'SpecificObject'</span><span class="p">]</span>
<span class="k">if</span> <span class="n">ap_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">'/org/freedesktop/NetworkManager/AccessPoint/'</span><span class="p">):</span>
<span class="n">ap</span> <span class="o">=</span> <span class="n">bus</span><span class="o">.</span><span class="n">get_object</span><span class="p">(</span><span class="s">'org.freedesktop.NetworkManager'</span><span class="p">,</span> <span class="n">ap_path</span><span class="p">)</span>
<span class="n">ssid</span> <span class="o">=</span> <span class="n">ap</span><span class="o">.</span><span class="n">Get</span><span class="p">(</span><span class="s">"org.freedesktop.NetworkManager.AccessPoint"</span><span class="p">,</span> <span class="s">"Ssid"</span><span class="p">,</span> <span class="n">dbus_interface</span><span class="o">=</span><span class="s">"org.freedesktop.DBus.Properties"</span><span class="p">)</span>
<span class="n">ssid</span> <span class="o">=</span> <span class="s">''</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">ssid</span><span class="p">])</span>
<span class="k">if</span> <span class="n">ssid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">config</span><span class="o">.</span><span class="n">sections</span><span class="p">():</span>
<span class="k">return</span>
<span class="k">print</span> <span class="n">ssid</span>
<span class="n">device</span><span class="o">.</span><span class="n">connect_to_signal</span><span class="p">(</span><span class="s">"PropertiesChanged"</span><span class="p">,</span> <span class="n">device_properties_changed_signal_handler</span><span class="p">(</span><span class="n">ssid</span><span class="p">),</span> <span class="n">dbus_interface</span><span class="o">=</span><span class="s">"org.freedesktop.NetworkManager.Connection.Active"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">device_properties_changed_signal_handler</span><span class="p">(</span><span class="n">ssid</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">handler</span><span class="p">(</span><span class="n">props</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">props</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s">'State'</span><span class="p">):</span>
<span class="k">return</span>
<span class="k">if</span> <span class="n">props</span><span class="p">[</span><span class="s">'State'</span><span class="p">]</span> <span class="o">!=</span> <span class="mf">2</span><span class="p">:</span>
<span class="k">return</span>
<span class="k">print</span> <span class="n">ssid</span>
<span class="n">section</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">config</span><span class="o">.</span><span class="n">items</span><span class="p">(</span><span class="n">ssid</span><span class="p">))</span>
<span class="k">if</span> <span class="n">login</span><span class="p">(</span><span class="n">section</span><span class="p">):</span>
<span class="n">txt</span> <span class="o">=</span> <span class="s">"Successfully logged on "</span> <span class="o">+</span> <span class="n">ssid</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">txt</span> <span class="o">=</span> <span class="s">"Failled to log on "</span> <span class="o">+</span> <span class="n">ssid</span>
<span class="n">n</span> <span class="o">=</span> <span class="n">pynotify</span><span class="o">.</span><span class="n">Notification</span><span class="p">(</span><span class="s">"Open Wifi Auto Connect"</span><span class="p">,</span> <span class="n">txt</span><span class="p">,</span> <span class="s">"dialog-warning"</span><span class="p">)</span>
<span class="n">n</span><span class="o">.</span><span class="n">set_urgency</span><span class="p">(</span><span class="n">pynotify</span><span class="o">.</span><span class="n">URGENCY_NORMAL</span><span class="p">)</span>
<span class="n">n</span><span class="o">.</span><span class="n">set_timeout</span><span class="p">(</span><span class="mf">10</span><span class="p">)</span>
<span class="c">#n.add_action("clicked","Button text", callback_function, None)</span>
<span class="n">n</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
<span class="k">return</span> <span class="n">handler</span>
<span class="k">def</span> <span class="nf">login</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
<span class="c"># build an http fetcher that support cookies</span>
<span class="n">opener</span> <span class="o">=</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span> <span class="n">urllib2</span><span class="o">.</span><span class="n">HTTPCookieProcessor</span><span class="p">()</span> <span class="p">)</span>
<span class="n">urllib2</span><span class="o">.</span><span class="n">install_opener</span><span class="p">(</span><span class="n">opener</span><span class="p">)</span>
<span class="c"># try to open the portal page</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">URL</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">redirect_url</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">geturl</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'?'</span><span class="p">)[</span><span class="mf">0</span><span class="p">]</span>
<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">if</span> <span class="n">redirect_url</span> <span class="o">==</span> <span class="n">URL</span><span class="p">:</span>
<span class="k">return</span> <span class="c"># Our request wasn't hijacked by the portal (maybe the wifi network isn't the default connection)</span>
<span class="c"># parse the portal page</span>
<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">form</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">'form'</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">form</span><span class="p">:</span>
<span class="k">return</span> <span class="c"># There's no form on this page</span>
<span class="c"># creating the post values</span>
<span class="n">login_post</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="nb">input</span> <span class="ow">in</span> <span class="n">form</span><span class="o">.</span><span class="n">findAll</span><span class="p">(</span><span class="s">'input'</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">input</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s">'name'</span><span class="p">):</span>
<span class="n">default</span> <span class="o">=</span> <span class="s">''</span>
<span class="k">if</span> <span class="nb">input</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s">'type'</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">input</span><span class="p">[</span><span class="s">'type'</span><span class="p">]</span> <span class="o">==</span> <span class="s">'checkbox'</span><span class="p">:</span>
<span class="n">default</span> <span class="o">=</span> <span class="s">'on'</span>
<span class="n">login_post</span><span class="p">[</span><span class="nb">input</span><span class="p">[</span><span class="s">'name'</span><span class="p">]]</span> <span class="o">=</span> <span class="nb">input</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s">'value'</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">input</span><span class="p">[</span><span class="s">'value'</span><span class="p">]</span> <span class="ow">or</span> <span class="n">default</span>
<span class="n">login_post</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
<span class="c"># guessing the post url</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">form</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s">'action'</span><span class="p">):</span>
<span class="n">url</span> <span class="o">=</span> <span class="n">redirect_url</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">form</span><span class="p">[</span><span class="s">'action'</span><span class="p">]</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">'/'</span><span class="p">):</span>
<span class="n">url</span> <span class="o">=</span> <span class="s">'/'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">redirect_url</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'/'</span><span class="p">)[:</span><span class="o">-</span><span class="mf">1</span><span class="p">])</span> <span class="o">+</span> <span class="s">'/'</span> <span class="o">+</span> <span class="n">form</span><span class="p">[</span><span class="s">'action'</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">url</span> <span class="o">=</span> <span class="s">'/'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">redirect_url</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'/'</span><span class="p">)[:</span><span class="mf">3</span><span class="p">])</span> <span class="o">+</span> <span class="n">form</span><span class="p">[</span><span class="s">'action'</span><span class="p">]</span>
<span class="c"># GET ou POST ?</span>
<span class="n">postBody</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">if</span> <span class="n">form</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s">'method'</span><span class="p">)</span> <span class="ow">and</span> <span class="n">form</span><span class="p">[</span><span class="s">'method'</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s">'post'</span><span class="p">:</span>
<span class="n">postBody</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">urlencode</span><span class="p">(</span><span class="n">login_post</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">url</span> <span class="o">+=</span> <span class="s">'?'</span> <span class="o">+</span> <span class="n">urllib</span><span class="o">.</span><span class="n">urlencode</span><span class="p">(</span><span class="n">login_post</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s">' '</span><span class="p">,</span> <span class="s">'+'</span><span class="p">)</span>
<span class="c"># submit the form</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">postBody</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c"># Test if the login was a success</span>
<span class="n">f</span> <span class="o">=</span> <span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">URL</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="n">status</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">geturl</span><span class="p">()</span> <span class="o">==</span> <span class="n">URL</span>
<span class="n">f</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">return</span> <span class="n">status</span>
<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="o">.</span><span class="n">RawConfigParser</span><span class="p">()</span>
<span class="n">config</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s">'~/.OpenWifiAutoConnect'</span><span class="p">))</span>
<span class="n">pynotify</span><span class="o">.</span><span class="n">init</span><span class="p">(</span> <span class="s">"Open Wifi Auto Connect"</span> <span class="p">)</span>
<span class="n">dbus</span><span class="o">.</span><span class="n">mainloop</span><span class="o">.</span><span class="n">glib</span><span class="o">.</span><span class="n">DBusGMainLoop</span><span class="p">(</span><span class="n">set_as_default</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">bus</span> <span class="o">=</span> <span class="n">dbus</span><span class="o">.</span><span class="n">SystemBus</span><span class="p">()</span>
<span class="n">nm</span> <span class="o">=</span> <span class="n">bus</span><span class="o">.</span><span class="n">get_object</span><span class="p">(</span><span class="s">"org.freedesktop.NetworkManager"</span><span class="p">,</span> <span class="s">"/org/freedesktop/NetworkManager"</span><span class="p">)</span>
<span class="n">nm</span><span class="o">.</span><span class="n">connect_to_signal</span><span class="p">(</span><span class="s">"PropertiesChanged"</span><span class="p">,</span> <span class="n">properties_changed_signal_handler</span><span class="p">,</span> <span class="n">dbus_interface</span><span class="o">=</span><span class="s">"org.freedesktop.NetworkManager"</span><span class="p">)</span>
<span class="n">loop</span> <span class="o">=</span> <span class="n">gobject</span><span class="o">.</span><span class="n">MainLoop</span><span class="p">()</span>
<span class="n">loop</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
Commentaires récents