Gregor Santner - Android, Linux & Open Source blog2023-02-11T02:17:07+00:00https://gsantner.net/Gregor SantnerMoving to different XMPP account due spam and exploit tries2020-07-20T00:00:00+00:00https://gsantner.net/blog/2020/07/20/xmpp-spam-exploit-sniffing<p>Since over a month my XMPP account is targeted by spammers.<br />
Due that I’m moving on to a different XMPP ID I might announce later.</p>
<p><strong>Note:</strong> Neither my account nor any chats or their keys are compromised.</p>
<h2 id="observerations">Observerations</h2>
<ul>
<li>Messages are mostly short, greetings in Eastern European & Russian languages</li>
<li>At least one new JID per hour initiates a chat, sometimes more frequently</li>
<li>Some messages start with exploit and credit card</li>
<li>Bots are seemingly aware they get blocked/ignored (“cannot write to you, everytime get errors”)</li>
<li>There is heavy interest in getting personal contact and presence information / that a contact request gets accepted</li>
</ul>
<p><img src="data:image/webp;base64,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" /></p>
<p><img src="data:image/webp;base64,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" /></p>
<p>Dear reader and XMPP user, did you experience something similar recently? Let me know and join the discussion below!</p>
Develop Apps for Ubuntu Touch: How to Debug Apps2020-03-09T00:00:00+00:00https://gsantner.net/blog/2020/03/09/develop-apps-for-ubuntu-touch-how-to-debug-apps
<p>Debugging is an essential part of software development. In case of Ubuntu Touch
apps there are basically two ways to debug an app. This blog post showcases both ways.</p>
<p>Some basic knowledge of GDB is assumed as well as of Clickable
which is the recommended tool to build Ubuntu Touch apps.
If not, search the web for GDB tutorials and/or read the
<a href="http://clickable.bhdouglass.com/en/latest/">Clickable Documentation</a>.</p>
<h2 id="desktop-mode">Desktop Mode</h2>
<p>Clickable provides a desktop mode to run an Ubuntu Touch app on desktop.
This mode also enables debugging via GDB. Again there are two ways:</p>
<p>1) Run GDB in a terminal
2) Start <code class="language-bash highlighter-rouge">gdbserver</code> and debug with your preferred IDE.</p>
<h3 id="gdb-on-command-line">GDB on Command Line</h3>
<p>From the project root directory run:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>clickable desktop <span class="nt">--gdb</span>
</code></pre></div></div>
<p>This compiles the app with debug symbols (provided that CMake or qmake is used)
and starts GDB inside a docker container. Use GDB commands
like <code class="language-bash highlighter-rouge"><span class="nb">break </span>main</code> and <code class="language-bash highlighter-rouge">run</code> to start debugging. You can find more examples, like how to set breakpoints on a specific lines of code <a href="http://www.unknownroad.com/rtfm/gdbtut/gdbbreak.html">here</a>.</p>
<h3 id="any-ide-via-gdbserver">Any IDE via gdbserver</h3>
<p>From the project root directory run:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>clickable desktop <span class="nt">--gdbserver</span> 3333
</code></pre></div></div>
<p>This starts the gdbserver on port <code class="language-bash highlighter-rouge">3333</code>. Check for an option to do GDB Remote
Debugging in your IDE and connect to <code class="language-bash highlighter-rouge">localhost:3333</code>.</p>
<h2 id="on-device">On Device</h2>
<p>Debugging in desktop mode is convenient, but it does not cover all use cases,
e.g. those involving Content Hub, App Armor or arm specific issues. In such a
case you need to debug directly on an Ubuntu Touch device.</p>
<p>You can always watch the logs from the device on your desktop via</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>clickable logs
</code></pre></div></div>
<p>This works independently of the debugging described below.</p>
<h3 id="clickable-debugging">Clickable Debugging</h3>
<p>Apps that are started through their own elf binary can be debugged on-device via
Clickable’s Debug feature, as described in its <a href="http://clickable.bhdouglass.com/en/latest/debugging.html">docs</a>. If this does not match your app, continue reading.</p>
<h3 id="preparation">Preparation</h3>
<p><strong>Note</strong>: The steps described below make your rootfs writable and use apt to
install packages. Do only proceed if you know what you are doing and how to
reinstall Ubuntu Touch in case of trouble. Also note that your changes might
get lost after system updates.</p>
<p>Make sure to install a debug build of your app, e.g. via Clickable:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>clickable <span class="nt">--debug</span>
</code></pre></div></div>
<p>Make sure you have started the app at least once normally with that version.</p>
<p>Enter a shell on your device via <a href="http://docs.ubports.com/en/latest/userguide/advanceduse/ssh.html">SSH</a>
and run all subsequent commands on the device.</p>
<p>Remount the root filesystem writable and install gdb:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>mount <span class="nt">-o</span> rw,remount /
<span class="nb">sudo </span>apt update
<span class="nb">sudo </span>apt <span class="nb">install </span>gdb libc6-dbg
</code></pre></div></div>
<p>You may need to repeat this step after an OTA update. Installing <code class="language-bash highlighter-rouge">libc6-dbg</code> is
necessary due to a <a href="https://github.com/ubports/ubuntu-touch/issues/1365">bug</a>
that probably won’t be closed, soon.</p>
<p>Find the app’s desktop file in the <code class="language-bash highlighter-rouge">ubuntu-app-launch</code> cache</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ls</span> /home/phablet/.cache/ubuntu-app-launch/desktop/
</code></pre></div></div>
<p>Let’s use <code class="language-bash highlighter-rouge">Webber</code> as an example. In this example <code class="language-bash highlighter-rouge">/home/phablet/.cache/ubuntu-app-launch/desktop/webber.timsueberkrueb_webber_0.5.1.desktop</code>. You will need that path in a second.</p>
<p>Change directory to the installation path of the app, which can be found at
<code class="language-bash highlighter-rouge">/opt/click.ubuntu.com/<appname>.<maintainer>/current</code>. In case of <a href="https://open-store.io/app/webber.timsueberkrueb">Webber</a></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /opt/click.ubuntu.com/webber.timsueberkrueb/current
</code></pre></div></div>
<p>Look for the <code class="language-bash highlighter-rouge">Exec</code> line in the desktop file to find out how to start the app</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> /home/phablet/.cache/ubuntu-app-launch/desktop/webber.timsueberkrueb_webber_0.5.1.desktop | <span class="nb">grep </span>Exec
</code></pre></div></div>
<p>In case of Webber this returns <code class="language-bash highlighter-rouge"><span class="nv">Exec</span><span class="o">=</span>webber %U</code>. This means the app is started
by the command <code class="language-bash highlighter-rouge">webber</code> (we can omit the <code class="language-bash highlighter-rouge">%U</code>). This executable may be located
directly in the app installation directory or in the sub directory <code class="language-bash highlighter-rouge">lib/<arch-triplet>/bin</code>,
where <code class="language-bash highlighter-rouge"><arch-triplet</code> is <code class="language-bash highlighter-rouge">arm-linux-gnueabihf</code> or <code class="language-bash highlighter-rouge">aarch64-linux-gnu</code> depending
on your device. In case of Webber on a <code class="language-bash highlighter-rouge">armhf</code> device the executable is located
at <code class="language-bash highlighter-rouge">lib/arm-linux-gnueabihf/bin/webber</code>.</p>
<h3 id="sourcing-the-app-environment">Sourcing the app environment</h3>
<p>When an app is started, some environment variables are set and the app may rely
on them to work properly. That’s why you may or may not need to do this step
before starting gdb on your app, too. In this sections you will learn how it can be done.</p>
<p>Start your app normally. Then find out the process ID (PID)</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ps aux | <span class="nb">grep</span> <<span class="nb">command</span><span class="o">></span>
</code></pre></div></div>
<p>where <code class="language-bash highlighter-rouge"><<span class="nb">command</span><span class="o">></span></code> is the executable that starts the app. Example for Webber:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>phablet 32384 8.6 2.2 340256 62620 ? Ssl 08:41 0:01 webber
phablet 32576 0.0 0.0 5684 812 pts/47 R+ 08:41 0:00 <span class="nb">grep</span> <span class="nt">--color</span><span class="o">=</span>auto webber
</code></pre></div></div>
<p>We ignore the <code class="language-bash highlighter-rouge"><span class="nb">grep</span></code> command we just ran and find the PID to be <code class="language-bash highlighter-rouge">32384</code>. While
the app is still running execute:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">.</span> <<span class="o">(</span>xargs <span class="nt">-0</span> bash <span class="nt">-c</span> <span class="s1">'printf "export %q\n" "$@"'</span> <span class="nt">--</span> < /proc/<PID>/environ<span class="o">)</span>
</code></pre></div></div>
<p>replacing <code class="language-bash highlighter-rouge"><PID></code> with the the PID identified above:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">.</span> <<span class="o">(</span>xargs <span class="nt">-0</span> bash <span class="nt">-c</span> <span class="s1">'printf "export %q\n" "$@"'</span> <span class="nt">--</span> < /proc/30649/environ<span class="o">)</span>
</code></pre></div></div>
<p>Now the environment is set up as it would be on a normal app start. Close
the app and start debugging as described in the next section.</p>
<h3 id="debugging">Debugging</h3>
<p>Now you are set up to start your debugging session:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gdb <span class="nt">-ex</span> <span class="s2">"handle SIGILL nostop"</span> <span class="nt">--args</span> <executable> <span class="nt">--desktop_file_hint</span><span class="o">=</span><cached-desktop-file>
</code></pre></div></div>
<p>In case of Webber this is</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gdb <span class="nt">-ex</span> <span class="s2">"handle SIGILL nostop"</span> <span class="nt">--args</span> lib/arm-linux-gnueabihf/bin/webber <span class="nt">--desktop_file_hint</span><span class="o">=</span>/home/phablet/.cache/ubuntu-app-launch/desktop/webber.timsueberkrueb_webber_0.5.1.desktop
</code></pre></div></div>
<p>The <code class="language-bash highlighter-rouge"><span class="nt">-ex</span> <span class="s2">"handle SIGILL nostop"</span></code> part avoids stopping at a <code class="language-bash highlighter-rouge">SIGILL</code> signal
caused by OpenSSL probing the abilities of the architecture. Use GDB commands
like <code class="language-bash highlighter-rouge"><span class="nb">break </span>main</code> and <code class="language-bash highlighter-rouge">run</code> to start debugging.</p>
<hr />
<p><strong>Notice: Jonatan Hatakeyama Zeidler is the author of this article. The content was originally written in March 2020 and first published on this (gsantner’s) blog. ‘I’ refers to the original author.</strong></p>
<hr />
<!-- -------->
Simple M3U Playlist Parser for IPTV Streams (Android/Java)2019-07-26T00:00:00+00:00https://gsantner.net/blog/2019/07/26/simple-m3u-playlist-parser-iptv-m3u8-android-java
<p>This post is is about one simple java class which can parse m3u playlists containing radio and IPTV video streams.<br />
Simply add the <code class="language-java highlighter-rouge"><span class="nc">SimpleM3UParser</span><span class="o">.</span><span class="na">java</span></code> class to your Java or Android project to get started.</p>
<h3 id="parse-streams-display-in-list-and-play">Parse streams, display in list and play</h3>
<p>With this class it’s very easy to get a list of streams:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">List</span><span class="o"><</span><span class="nc">SimpleM3UParser</span><span class="o">.</span><span class="na">M3U_Entry</span><span class="o">></span> <span class="n">playlist</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SimpleM3UParser</span><span class="o">().</span><span class="na">parse</span><span class="o">(</span><span class="s">"/filepath/to/streams.m3u"</span><span class="o">);</span>
</code></pre></div></div>
<p>Below is a screenshot of my personal IPTV Android app that my family uses since years to watch IPTV streams. It uses SimpleM3UParser.
The screenshot also contains the file structure and structure of a m3u/m3u8 playlist for live streams. (same structure as seen at examples in source code file)</p>
<p><img src="/assets/blog/img/2019-07-25--exoiptv.png" alt="Image" /></p>
<p>The list in the screenshot is a ListView with simple Image/TextViews. When clicking a item, playback starts.
If you want to play using an external media player app on Android, here’s a snippet for VLC media player:</p>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">Intent</span> <span class="n">intent</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Intent</span><span class="o">(</span><span class="nc">Intent</span><span class="o">.</span><span class="na">ACTION_VIEW</span><span class="o">);</span>
<span class="n">intent</span><span class="o">.</span><span class="na">setDataAndTypeAndNormalize</span><span class="o">(</span><span class="nc">Uri</span><span class="o">.</span><span class="na">parse</span><span class="o">(</span><span class="n">playlist</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="no">INDEX</span><span class="o">).</span><span class="na">getUrl</span><span class="o">()),</span> <span class="s">"video/*"</span><span class="o">);</span>
<span class="n">intent</span><span class="o">.</span><span class="na">setPackage</span><span class="o">(</span><span class="s">"org.videolan.vlc"</span><span class="o">);</span>
<span class="n">activity</span><span class="o">.</span><span class="na">startActivity</span><span class="o">(</span><span class="n">intent</span><span class="o">);</span>
</code></pre></div></div>
<h3 id="give-me-the-code">Give me the code!</h3>
<p>Code for parser and complete examples is available for <a href="https://github.com/gsantner/opoc/blob/master/java/java/net/gsantner/opoc/format/SimpleM3UParser.java">Download</a> from GitHub and licensed Apache 2.0.</p>
<h3 id="additional-info">Additional info</h3>
<ul>
<li>Looking for URLs of <strong>legal</strong> live streams? Take a look at <a href="https://github.com/jnk22/kodinerds-iptv">KodiNerds-IPTV</a>.</li>
<li>What is the reason for this blog post?
<ul>
<li>I noticed multiple people asking for a simple free & open source app for watching IPTV streams, especially in F-Droid community chat & forum.</li>
<li>Be it open source or not, this is blog post and associated code may be the starting point of your new IPTV & streaming app!</li>
</ul>
</li>
</ul>
Kodi - Play random videos with Smart Playlists2018-07-21T18:40:00+00:00https://gsantner.net/blog/2018/07/21/kodi-random-video-playback<p>Kodi is a media player which can be installed on your computer, on your phone and also on your <a href="https://www.raspberrypi.org/">Raspberry Pi</a>! It is free & open source software and available at <a href="https://kodi.tv/">kodi.tv</a>.</p>
<p>Kodi features a special action to quickly play random media called <strong>PartyMode</strong>.
PartyMode starts playback immediately with random tracks out of the music library. The action accepts either <code class="language-plaintext highlighter-rouge">music</code> or <code class="language-plaintext highlighter-rouge">video</code> as parameter. Unfortunately <code class="language-plaintext highlighter-rouge">video</code> is not working at all, so it’s not possible to play random videos with the <code class="language-plaintext highlighter-rouge">PartyMode</code> feature.</p>
<p>If you have the goal to play random videos (movies, series, episodes) or music with Kodi, here you can find a solution. You will be able to start random playback from a remote client, shell or within Kodi itself.
Kodi has a feature called <a href="https://kodi.wiki/view/Smart_playlists">Smart Playlists</a> which allows to create a solution that is superior to a simple PartyMode for videos.</p>
Regarding GPDR and Privacy on this blog2018-05-24T12:16:29+00:00https://gsantner.net/blog/2018/05/24/regarding-gpdr<p>To be honest – this is a static site without any fonts, javascript or css loaded externally.<br />
I use and write posts to be published on this site mainly offline, so it is important that all works here too.</p>
<p>No analytics library or any other tracker gets loaded when you visit this blog.
Hence this blog doesn’t and can’t keep records of anything you do here.</p>
Contribute to open source Android projects2018-03-19T17:16:53+00:00https://gsantner.net/blog/2018/03/19/android-contribution-guideIntroduction on how to contribute to (Open Source) Android apps and all around. Suited for every kind of contributors - newcomers, developers and managers.Ubuntu - Unity Gnome migration - Terminal color scheme2017-04-08T14:02:21+00:00https://gsantner.net/blog/2017/04/08/ubuntu-migration---look-feelHere are settings and configs of various applications (including specific values) for migrating to any distro having an updated version of GNOME.ETag Fehler - NextCloud/OwnCloud Synchronisation unter Debian 82016-09-22T22:14:31+00:00https://gsantner.net/blog/2016/09/22/etag-fehler-bei-nextcloudsyncNach Recherche in diversen Next/OwnCloud-Foren habe ich das Problem der fehlenden ETags endlich lösen können.F-Droid Repository on GitLab Pages2016-01-13T17:35:26+00:00https://gsantner.net/blog/2016/01/13/f-droid-repo-on-gh-pages<p><strong>Important Notice:</strong> My free & open source Android apps are now in official Repositories. Hence my public hosted F-Droid repository is not available anymore.</p>
<p>Yesterday I tried publishing an <a href="http://f-droid.org/">F-Droid</a> repository on
Github-Pages.
After my first successful tries to download apps using F-Droid I added a small frontend using Jekyll.</p>
<p>You can find my public F-Droid repo here:<br />
<a href="https://gsantner.gitlab.io/fdroid">https://gsantner.gitlab.io/fdroid</a></p>
<p>I already had experience with build-services, including F-Droid for Android apps.
Because I also use it for my private projects I thought why not create a public repo also.
As there will be a small count of apps, the git-repo limit of 1GB seems to be enough for now.</p>
<h2 id="what-is-f-droid">What is F-Droid?</h2>
<blockquote>
<p>F-Droid is an installable catalogue of FOSS
(Free and Open Source Software) applications for the Android platform.
The client makes it easy to browse, install,
and keep track of updates on your device. - <a href="https://f-droid.org/">https://f-droid.org/</a></p>
</blockquote>
<h2 id="how-to-get-apps-from-my-repo">How to get apps from my repo?</h2>
<p>Download and install F-Droid: <a href="https://f-droid.org/FDroid.apk">https://f-droid.org/FDroid.apk</a><br />
Add repository: <a href="https://gsantner.gitlab.io/fdroid/repo">https://gsantner.gitlab.io/fdroid/repo</a></p>
<h2 id="available-apps">Available apps</h2>
<p>These apps are initially available:</p>
<ul>
<li><strong>XPrivacy in AppInfo</strong> / XPosed module</li>
<li><strong>MemeTastic</strong> / MemeCreator, created at university</li>
</ul>