Antoine Beaupr : My free software activities, April 2017
Debian Long Term Support (LTS)
This is my monthly Debian LTS report. My time this month was spent
working on various hairy security issues, most notably XBMC (now known
as Kodi) and yaml-cpp.
Kodi directory transversal
I started by looking in CVE-2017-5982, a "directory
traversal" vulnerability in XBMC (now known as Kodi) which is a
technical term for "allow attackers to read any world-readable file on
your computer from the network". It's a serious vulnerability which
has no known fix. When you enable the "remote control" interface in
Kodi, it allows anyone with the password (which is disabled by
default) to download any files Kodi has read access to on the
machine it's running. Considering Kodi is often connected to multiple
services, this may mean elevated compromise and more nasty stuff.
I furthered the investigation done with my own analysis which
showed the problem is difficult to solve: Kodi internally uses the
facility to show thumbnails and media to the user, and there are no
clear way of restricting which paths Kodi should have access
to. Indeed, Kodi is designed to access mounted file systems and paths
in arbitrary locations. In Debian bug #855225, I further confirmed
confirmed wheezy and jessie-backports as vulnerable and therefore
showed with good certainty that stretch and sid are vulnerable as
well. I also suggested possible workaround, but at this point, it's in
upstream's hands, as the changes will be intrusive. The file transfer
mechanism need to be revamped all over Kodi, or authentication (with a
proper password policy), need to be enforced.
Squirrelmail
Next I looked at that old webmail software, Squirrelmail, which
suffers from a remote code execution vulnerability (CVE-2017-7692) when sending mails with sendmail on the
commandline. This is arguably an edge case, but considering the patch
was simple, I figured I would provide an update to the LTS
community. I tried to get a coordinated release for jessie, since the
code is the same, but this wasn't completed at the time of writing. A
patch is available and will hopefully be picked up by another LTS
worker soon.
Fop and Batik
Those issues (CVE-2017-5661 and CVE-2017-5662)
were more difficult. The patches weren't clearly documented and there
were no upstream references other than security advisories for the
first release in years (in the case of batik) or months (in the case
of fop), which made it hard to track down the issues. Fortunately, I
was able to track down the upstream issues (FOP-2668
and BATIK-1139) where I got confirmation on what the proper fixes
were. I could then release DLA-927-1 and DLA-926-1 with the
backported patches.
I do not use fop or batik. In fact, even after reading the homepage of
both products, I couldn't quite figure out what use people could
possibly have for that thing. Before uploading the packages, I
therefore made packages available for testing for fop
and batik.
libsndfile
Next up was libsndfile which a bunch of overflows when
parsing various audio files. I backported a patch for CVE-2017-7585 CVE-2017-7586 and CVE-2017-7741 which all seemed to be fixed by a single patch
usptream. CVE-2017-7742 was also fixed, although with a
separate patch. In all of those, i could only test CVE-2017-7741 and
CVE-2017-7742, as the others were missing test cases.
I provided a test package for a few days then I also figured it
would be best to incorporate the security fixes done in stable, which
brought in fixes for CVE-2015-7805, CVE-2014-9756 and CVE-2014-9496. So in the end, I ported
patches from wheezy to jessie and uploaded the jessie version
(reverting certain build changes) into wheezy and
uploaded DLA-928-1 with the results.
yaml-cpp
I then turned to yaml-cpp, a C++ parser for YAML. This one
didn't have a known upstream fix, but I figured I would give it a shot
anyways. I ended up writing my first C++ code in years which is
still pending review and merge upstream. It's not an easy problem to
fix: this is basically an excessive recursion problem that can be used
to smash the stack. I figured I could introduce a recursion limit, but
as the discussion showed, this is a limited approach: stack size
varies on different platforms and it's not easy to find the right
limit.
The real solution is to rewrite the code to avoid recursion but that's
a major code refactoring I didn't feel belong in a LTS
update. Besides, this could be better handled by upstream, so I will
leave things at that for now. It does make you wonder how much code
out there is recursing on untrusted data structures...
kedpm
Finally, a friend over at Koumbit.org reported
Debian bug #860817, as information leak in kedpm, a password manager I
previously maintained. I requested and got assigned CVE-2017-8296 and provided a fix for wheezy and jessie. For unstable
and the coming stretch release, I have requested kedpm to be
completely removed from Debian (Debian bug #860817) which involved a
release notes update (Debian bug #861277).
It's unfortunate to see software go, but kedpm wasn't maintained. I
wasn't the original author: I just gave a few patches and ended up
maintaining that software and not using it. It's a bad situation to be
in, as you don't really know what's working and not with the tools you
are supposed to be responsible for. There are more modern alternatives
available now and I encourage everyone to switch.
Triage
Looking for more work, I peeked a bit in the secretary tasks to triage
some pending issues. I found that trafficserver could be
crashed with simple requests (CVE-2017-5659) so I looked
into that issue. My analysis showed that the patch is long and
complex and could be difficult to backport to the old version
available in wheezy. I also couldn't reproduce the issue in wheezy, so
it may be a bug introduced only later, although I couldn't confirm
that directly.
I also triaged wireshark, where I just noted the
maintainer expressed concern that we were taking up issues too fast
and will probably take care of this one. I also postponed various
issues in GnuTLS (marked "no-dsa") as they affect only a
(unfortunately) rarely used part of GnuTLS that has been removed in
later version: OpenPGP support.
Other free software work
Debiman
I finally got around contributing to the debiman project. I worked
on ensuring that there is a dman compatibility in debiman, by
shipping dman in the debian-goodies package (Debian bug #860920). I also submitted a pull request to fix
the fix about page title, document
the custom assets repository, fix a stray bracket and link to
the link to venerable man7.org project
After a discussion on IRC, I also filed a few more issues:
- redirect bpf to bpf.2, not bpf.4freebsd
- redirect to unstable by default
- arrows missing in table of contents
- automatically collapse long links
- old ?query= parameter ignored/failing
I'm happy to be able to contribute to this important service and I
hope the new FAQ I created will be online soon!
XMonad and Emacs
I started using writeroom-mode again as part of my work on LWN.
As it turns out, my setup was not exactly working: I had to port my
config to the new version and windows weren't "sticky" as they should
be, a known issue with Xmonad. Indeed, Xmonad doesn't obey the
"static" or "all desktops" standard directives.
Writeroom is a "distraction-free writing" mode for Emacs, so the irony
of working on such a deep distraction in establishing a distraction
free environment is not lost on me.
Needing to scratch that particular itch, and with the help of clever
people from the IRC channel, I was able to make Emacs tell Xmonad to
show its window (or "frame" as Emacs likes to call it) on all
desktops. This involved creating a new function which I think could be
useful in the CopyWindow library:
-- Toggle between "copyToAll" or "killAllOtherCopies". Copies to all
-- workspaces, or remove from all other workspaces, depending on
-- previous state (checked with "wsContainingCopies").
copyToAllToggle :: X ()
copyToAllToggle = do
-- check which workspaces have copies
copies <- wsContainingCopies
if null copies
then windows copyToAll -- no workspaces, make sticky
else killAllOtherCopies -- already other workspaces, unstick
There are probably better ways of implementing this directly in the
CopyWindow code - wsContainingCopies, in particular, is probably
overkill. But it's all I can use directly from my xmonad.hs, so that's
what I did.
The other bit I needed was something to trigger that function from the
outside. I rejected the ServerMode hook because it looked a bit
too complicated and there is a built-in facility within X that works
without this, which, from Emacs' point of view, is the
x-send-client-message function. So I made up a new message
identifier and wrote a event hook handler to process it:
-- handle X client messages that tell Xmonad to make a window appear
-- on all workspaces
--
-- this should really be using _NET_WM_STATE and
-- _NET_WM_STATE_STICKY. but that's more complicated: then we'd need
-- to inspect a window and figure out the current state and act
-- accordingly. I am not good enough with Xmonad to figure out that
-- part yet.
--
-- Instead, just check for the relevant message and check if the
-- focused window is already on all workspaces and toggle based on
-- that.
--
-- this is designed to interoperate with Emacs's writeroom-mode module
-- and called be called from elisp with:
--
-- (x-send-client-message nil 0 nil "XMONAD_COPY_ALL_SELF" 8 '(0))
myClientMessageEventHook :: Event -> X All
myClientMessageEventHook (ClientMessageEvent ev_message_type = mt, ev_data = dt ) = do
dpy <- asks display
-- the client message we're expecting
copyAllMsg <- io $ internAtom dpy "XMONAD_COPY_ALL_SELF" False
-- if the event matches the message we expect, toggle sticky state
when (mt == copyAllMsg && dt /= []) $ do
copyToAllToggle
-- we processed the event completely
return $ All True
All that was left was to hook that into Emacs, and I was done!
Whoohoo! Full screen total domination, distraction free work!
I would love to hear from others what they think of that approach, if
they have improvements or if the above copyToAllToggle function could be
merged in. Ideally, Xmonad would just parse the STICKY client messages
and do the right thing - maybe even directly in CopyWindow - but I have
found this enough Haskell for one day.
You can see the diff on my home directory
to see exactly the changes involved to make this configuration work.
Emacs packaging
Speaking of Emacs, after complaining in the noisy #emacs IRC channel
about the poor TLS configuration of marmelade.org -- and filing a
bug (Debian bug #861106) regarding the use of SHA-1 in certificate
pinning -- I was told we shouldn't expect trust from third-party ELPA
repositories. Marmelade seems to be dead, as the maintainer is
"behind the great firewall of China" and MELPA still hasn't
figured out how to sign packages. In the end, it seems like there
are tons of elpa packages in Debian and that if your favorite one
is missing, that's a bug that can be filed and fixed.
I first discovered that 6 of the packages I used were already
packaged:
And so I went ahead and filed a ton more bugs for the packages I am
using but that aren't in Debian just yet:
- company-go: Debian bug #861177
- elpy: Debian bug #861174
- markdown-toc: Debian bug #861128
- multiple-cursors: Debian bug #861127
- writegood-mode: Debian bug #861125
- writeroom-mode: Debian bug #861124
Of those, I can't recommend multiple-cursors (MC) enough: I used
it at least 4 times just writing this text. It's just awesome. The
other ones are also all great in their own right of course, but I feel
they are more specific to my workflow whereas MC is just amazing.
ikiwiki
I did some more work on ikiwiki the software driving this blog. I
created a new plugin to, at least, fix anchors in the table of
contents to be human readable. This is something I had done on
the MoinMoin wiki almost a decade ago -- which I called
then NicerHeadingIds and that I have always found frustrating with
Ikiwiki.
It turns out the problem was both easier and hairier than I
thought. Right from the start, something weird was happening:
something was already adding nice headings, but they were somewhat
broken. It turns out that multimarkdown already inserts those
headers, but I wasn't satisfied with the way they were generated. But
even worse, I had the headinganchors plugin enabled, but that
plugin wasn't taking effect, because of multimarkdown. And even if it
would take effect, it doesn't behave well with non-ASCII characters,
which gets turned in their numeric presentation.
So I also wrote the i18nheadinganchors plugin that creates better
headings and patched the toc plugin so that it can reuse existing
anchors if they exist, while keeping backwards compatibility. I hope
this gets merged in a future ikiwiki release so I do not have to carry
this patch locally too long...
In other news, I have upgraded the ikiwiki-hosting package to the
latest version and sent a patch upstream to provide HSTS support.
Other stuff
I have migrated all my public repos hosted on my home server to
either Gitlab.com or Github. I also have repositories
on 0xacab and it seemed ludicrous to have 4 different, canonical,
places where my code was hosted. I have now about 40 different projects
on Gitlab and about 60 on Github, although most of the latter are
forks of existing projects.
I also made a manpage for stressant and moved the documentation
to RTFD which makes it neatly accessible. I also made small
incremental improvements (like --directory support).
I installed Rainloop on this server to give a nice,
mobile-friendly webmail. Instructions to replicate this setup are in
mail.
In the constant git-annex documentation effort, I tried to draft
a user guide that could be a basis for restructuring the
documentation to be more easily accessible. I also helped a friend put
his documentation on the wiki in splitting a repository.
Finally, I also looked into Android stuff a little more. I wrote
a usability review of the F-Droid privileged extension that will
bring good changes, I hope. I also opened the discussion regarding
reproducible builds to try and clarify exactly how those worked to
help the Wallabag people ship consistently signed alphas. So far,
it seems that it will remain a standard practice on F-Droid to ship
packages that are not signed by the official upstream signature,
unfortunately, unless upstream provides a reproducible build that is
publicly available... Switching to such build is also a hairy issue,
as, obviously, the signature changes, which raises the alarm we are
trying to avoid in the first place.
Squirrelmail
Next I looked at that old webmail software, Squirrelmail, which
suffers from a remote code execution vulnerability (CVE-2017-7692) when sending mails with sendmail on the
commandline. This is arguably an edge case, but considering the patch
was simple, I figured I would provide an update to the LTS
community. I tried to get a coordinated release for jessie, since the
code is the same, but this wasn't completed at the time of writing. A
patch is available and will hopefully be picked up by another LTS
worker soon.
Fop and Batik
Those issues (CVE-2017-5661 and CVE-2017-5662)
were more difficult. The patches weren't clearly documented and there
were no upstream references other than security advisories for the
first release in years (in the case of batik) or months (in the case
of fop), which made it hard to track down the issues. Fortunately, I
was able to track down the upstream issues (FOP-2668
and BATIK-1139) where I got confirmation on what the proper fixes
were. I could then release DLA-927-1 and DLA-926-1 with the
backported patches.
I do not use fop or batik. In fact, even after reading the homepage of
both products, I couldn't quite figure out what use people could
possibly have for that thing. Before uploading the packages, I
therefore made packages available for testing for fop
and batik.
libsndfile
Next up was libsndfile which a bunch of overflows when
parsing various audio files. I backported a patch for CVE-2017-7585 CVE-2017-7586 and CVE-2017-7741 which all seemed to be fixed by a single patch
usptream. CVE-2017-7742 was also fixed, although with a
separate patch. In all of those, i could only test CVE-2017-7741 and
CVE-2017-7742, as the others were missing test cases.
I provided a test package for a few days then I also figured it
would be best to incorporate the security fixes done in stable, which
brought in fixes for CVE-2015-7805, CVE-2014-9756 and CVE-2014-9496. So in the end, I ported
patches from wheezy to jessie and uploaded the jessie version
(reverting certain build changes) into wheezy and
uploaded DLA-928-1 with the results.
yaml-cpp
I then turned to yaml-cpp, a C++ parser for YAML. This one
didn't have a known upstream fix, but I figured I would give it a shot
anyways. I ended up writing my first C++ code in years which is
still pending review and merge upstream. It's not an easy problem to
fix: this is basically an excessive recursion problem that can be used
to smash the stack. I figured I could introduce a recursion limit, but
as the discussion showed, this is a limited approach: stack size
varies on different platforms and it's not easy to find the right
limit.
The real solution is to rewrite the code to avoid recursion but that's
a major code refactoring I didn't feel belong in a LTS
update. Besides, this could be better handled by upstream, so I will
leave things at that for now. It does make you wonder how much code
out there is recursing on untrusted data structures...
kedpm
Finally, a friend over at Koumbit.org reported
Debian bug #860817, as information leak in kedpm, a password manager I
previously maintained. I requested and got assigned CVE-2017-8296 and provided a fix for wheezy and jessie. For unstable
and the coming stretch release, I have requested kedpm to be
completely removed from Debian (Debian bug #860817) which involved a
release notes update (Debian bug #861277).
It's unfortunate to see software go, but kedpm wasn't maintained. I
wasn't the original author: I just gave a few patches and ended up
maintaining that software and not using it. It's a bad situation to be
in, as you don't really know what's working and not with the tools you
are supposed to be responsible for. There are more modern alternatives
available now and I encourage everyone to switch.
Triage
Looking for more work, I peeked a bit in the secretary tasks to triage
some pending issues. I found that trafficserver could be
crashed with simple requests (CVE-2017-5659) so I looked
into that issue. My analysis showed that the patch is long and
complex and could be difficult to backport to the old version
available in wheezy. I also couldn't reproduce the issue in wheezy, so
it may be a bug introduced only later, although I couldn't confirm
that directly.
I also triaged wireshark, where I just noted the
maintainer expressed concern that we were taking up issues too fast
and will probably take care of this one. I also postponed various
issues in GnuTLS (marked "no-dsa") as they affect only a
(unfortunately) rarely used part of GnuTLS that has been removed in
later version: OpenPGP support.
Other free software work
Debiman
I finally got around contributing to the debiman project. I worked
on ensuring that there is a dman compatibility in debiman, by
shipping dman in the debian-goodies package (Debian bug #860920). I also submitted a pull request to fix
the fix about page title, document
the custom assets repository, fix a stray bracket and link to
the link to venerable man7.org project
After a discussion on IRC, I also filed a few more issues:
- redirect bpf to bpf.2, not bpf.4freebsd
- redirect to unstable by default
- arrows missing in table of contents
- automatically collapse long links
- old ?query= parameter ignored/failing
I'm happy to be able to contribute to this important service and I
hope the new FAQ I created will be online soon!
XMonad and Emacs
I started using writeroom-mode again as part of my work on LWN.
As it turns out, my setup was not exactly working: I had to port my
config to the new version and windows weren't "sticky" as they should
be, a known issue with Xmonad. Indeed, Xmonad doesn't obey the
"static" or "all desktops" standard directives.
Writeroom is a "distraction-free writing" mode for Emacs, so the irony
of working on such a deep distraction in establishing a distraction
free environment is not lost on me.
Needing to scratch that particular itch, and with the help of clever
people from the IRC channel, I was able to make Emacs tell Xmonad to
show its window (or "frame" as Emacs likes to call it) on all
desktops. This involved creating a new function which I think could be
useful in the CopyWindow library:
-- Toggle between "copyToAll" or "killAllOtherCopies". Copies to all
-- workspaces, or remove from all other workspaces, depending on
-- previous state (checked with "wsContainingCopies").
copyToAllToggle :: X ()
copyToAllToggle = do
-- check which workspaces have copies
copies <- wsContainingCopies
if null copies
then windows copyToAll -- no workspaces, make sticky
else killAllOtherCopies -- already other workspaces, unstick
There are probably better ways of implementing this directly in the
CopyWindow code - wsContainingCopies, in particular, is probably
overkill. But it's all I can use directly from my xmonad.hs, so that's
what I did.
The other bit I needed was something to trigger that function from the
outside. I rejected the ServerMode hook because it looked a bit
too complicated and there is a built-in facility within X that works
without this, which, from Emacs' point of view, is the
x-send-client-message function. So I made up a new message
identifier and wrote a event hook handler to process it:
-- handle X client messages that tell Xmonad to make a window appear
-- on all workspaces
--
-- this should really be using _NET_WM_STATE and
-- _NET_WM_STATE_STICKY. but that's more complicated: then we'd need
-- to inspect a window and figure out the current state and act
-- accordingly. I am not good enough with Xmonad to figure out that
-- part yet.
--
-- Instead, just check for the relevant message and check if the
-- focused window is already on all workspaces and toggle based on
-- that.
--
-- this is designed to interoperate with Emacs's writeroom-mode module
-- and called be called from elisp with:
--
-- (x-send-client-message nil 0 nil "XMONAD_COPY_ALL_SELF" 8 '(0))
myClientMessageEventHook :: Event -> X All
myClientMessageEventHook (ClientMessageEvent ev_message_type = mt, ev_data = dt ) = do
dpy <- asks display
-- the client message we're expecting
copyAllMsg <- io $ internAtom dpy "XMONAD_COPY_ALL_SELF" False
-- if the event matches the message we expect, toggle sticky state
when (mt == copyAllMsg && dt /= []) $ do
copyToAllToggle
-- we processed the event completely
return $ All True
All that was left was to hook that into Emacs, and I was done!
Whoohoo! Full screen total domination, distraction free work!
I would love to hear from others what they think of that approach, if
they have improvements or if the above copyToAllToggle function could be
merged in. Ideally, Xmonad would just parse the STICKY client messages
and do the right thing - maybe even directly in CopyWindow - but I have
found this enough Haskell for one day.
You can see the diff on my home directory
to see exactly the changes involved to make this configuration work.
Emacs packaging
Speaking of Emacs, after complaining in the noisy #emacs IRC channel
about the poor TLS configuration of marmelade.org -- and filing a
bug (Debian bug #861106) regarding the use of SHA-1 in certificate
pinning -- I was told we shouldn't expect trust from third-party ELPA
repositories. Marmelade seems to be dead, as the maintainer is
"behind the great firewall of China" and MELPA still hasn't
figured out how to sign packages. In the end, it seems like there
are tons of elpa packages in Debian and that if your favorite one
is missing, that's a bug that can be filed and fixed.
I first discovered that 6 of the packages I used were already
packaged:
And so I went ahead and filed a ton more bugs for the packages I am
using but that aren't in Debian just yet:
- company-go: Debian bug #861177
- elpy: Debian bug #861174
- markdown-toc: Debian bug #861128
- multiple-cursors: Debian bug #861127
- writegood-mode: Debian bug #861125
- writeroom-mode: Debian bug #861124
Of those, I can't recommend multiple-cursors (MC) enough: I used
it at least 4 times just writing this text. It's just awesome. The
other ones are also all great in their own right of course, but I feel
they are more specific to my workflow whereas MC is just amazing.
ikiwiki
I did some more work on ikiwiki the software driving this blog. I
created a new plugin to, at least, fix anchors in the table of
contents to be human readable. This is something I had done on
the MoinMoin wiki almost a decade ago -- which I called
then NicerHeadingIds and that I have always found frustrating with
Ikiwiki.
It turns out the problem was both easier and hairier than I
thought. Right from the start, something weird was happening:
something was already adding nice headings, but they were somewhat
broken. It turns out that multimarkdown already inserts those
headers, but I wasn't satisfied with the way they were generated. But
even worse, I had the headinganchors plugin enabled, but that
plugin wasn't taking effect, because of multimarkdown. And even if it
would take effect, it doesn't behave well with non-ASCII characters,
which gets turned in their numeric presentation.
So I also wrote the i18nheadinganchors plugin that creates better
headings and patched the toc plugin so that it can reuse existing
anchors if they exist, while keeping backwards compatibility. I hope
this gets merged in a future ikiwiki release so I do not have to carry
this patch locally too long...
In other news, I have upgraded the ikiwiki-hosting package to the
latest version and sent a patch upstream to provide HSTS support.
Other stuff
I have migrated all my public repos hosted on my home server to
either Gitlab.com or Github. I also have repositories
on 0xacab and it seemed ludicrous to have 4 different, canonical,
places where my code was hosted. I have now about 40 different projects
on Gitlab and about 60 on Github, although most of the latter are
forks of existing projects.
I also made a manpage for stressant and moved the documentation
to RTFD which makes it neatly accessible. I also made small
incremental improvements (like --directory support).
I installed Rainloop on this server to give a nice,
mobile-friendly webmail. Instructions to replicate this setup are in
mail.
In the constant git-annex documentation effort, I tried to draft
a user guide that could be a basis for restructuring the
documentation to be more easily accessible. I also helped a friend put
his documentation on the wiki in splitting a repository.
Finally, I also looked into Android stuff a little more. I wrote
a usability review of the F-Droid privileged extension that will
bring good changes, I hope. I also opened the discussion regarding
reproducible builds to try and clarify exactly how those worked to
help the Wallabag people ship consistently signed alphas. So far,
it seems that it will remain a standard practice on F-Droid to ship
packages that are not signed by the official upstream signature,
unfortunately, unless upstream provides a reproducible build that is
publicly available... Switching to such build is also a hairy issue,
as, obviously, the signature changes, which raises the alarm we are
trying to avoid in the first place.
libsndfile
Next up was libsndfile which a bunch of overflows when
parsing various audio files. I backported a patch for CVE-2017-7585 CVE-2017-7586 and CVE-2017-7741 which all seemed to be fixed by a single patch
usptream. CVE-2017-7742 was also fixed, although with a
separate patch. In all of those, i could only test CVE-2017-7741 and
CVE-2017-7742, as the others were missing test cases.
I provided a test package for a few days then I also figured it
would be best to incorporate the security fixes done in stable, which
brought in fixes for CVE-2015-7805, CVE-2014-9756 and CVE-2014-9496. So in the end, I ported
patches from wheezy to jessie and uploaded the jessie version
(reverting certain build changes) into wheezy and
uploaded DLA-928-1 with the results.
yaml-cpp
I then turned to yaml-cpp, a C++ parser for YAML. This one
didn't have a known upstream fix, but I figured I would give it a shot
anyways. I ended up writing my first C++ code in years which is
still pending review and merge upstream. It's not an easy problem to
fix: this is basically an excessive recursion problem that can be used
to smash the stack. I figured I could introduce a recursion limit, but
as the discussion showed, this is a limited approach: stack size
varies on different platforms and it's not easy to find the right
limit.
The real solution is to rewrite the code to avoid recursion but that's
a major code refactoring I didn't feel belong in a LTS
update. Besides, this could be better handled by upstream, so I will
leave things at that for now. It does make you wonder how much code
out there is recursing on untrusted data structures...
kedpm
Finally, a friend over at Koumbit.org reported
Debian bug #860817, as information leak in kedpm, a password manager I
previously maintained. I requested and got assigned CVE-2017-8296 and provided a fix for wheezy and jessie. For unstable
and the coming stretch release, I have requested kedpm to be
completely removed from Debian (Debian bug #860817) which involved a
release notes update (Debian bug #861277).
It's unfortunate to see software go, but kedpm wasn't maintained. I
wasn't the original author: I just gave a few patches and ended up
maintaining that software and not using it. It's a bad situation to be
in, as you don't really know what's working and not with the tools you
are supposed to be responsible for. There are more modern alternatives
available now and I encourage everyone to switch.
Triage
Looking for more work, I peeked a bit in the secretary tasks to triage
some pending issues. I found that trafficserver could be
crashed with simple requests (CVE-2017-5659) so I looked
into that issue. My analysis showed that the patch is long and
complex and could be difficult to backport to the old version
available in wheezy. I also couldn't reproduce the issue in wheezy, so
it may be a bug introduced only later, although I couldn't confirm
that directly.
I also triaged wireshark, where I just noted the
maintainer expressed concern that we were taking up issues too fast
and will probably take care of this one. I also postponed various
issues in GnuTLS (marked "no-dsa") as they affect only a
(unfortunately) rarely used part of GnuTLS that has been removed in
later version: OpenPGP support.
Other free software work
Debiman
I finally got around contributing to the debiman project. I worked
on ensuring that there is a dman compatibility in debiman, by
shipping dman in the debian-goodies package (Debian bug #860920). I also submitted a pull request to fix
the fix about page title, document
the custom assets repository, fix a stray bracket and link to
the link to venerable man7.org project
After a discussion on IRC, I also filed a few more issues:
- redirect bpf to bpf.2, not bpf.4freebsd
- redirect to unstable by default
- arrows missing in table of contents
- automatically collapse long links
- old ?query= parameter ignored/failing
I'm happy to be able to contribute to this important service and I
hope the new FAQ I created will be online soon!
XMonad and Emacs
I started using writeroom-mode again as part of my work on LWN.
As it turns out, my setup was not exactly working: I had to port my
config to the new version and windows weren't "sticky" as they should
be, a known issue with Xmonad. Indeed, Xmonad doesn't obey the
"static" or "all desktops" standard directives.
Writeroom is a "distraction-free writing" mode for Emacs, so the irony
of working on such a deep distraction in establishing a distraction
free environment is not lost on me.
Needing to scratch that particular itch, and with the help of clever
people from the IRC channel, I was able to make Emacs tell Xmonad to
show its window (or "frame" as Emacs likes to call it) on all
desktops. This involved creating a new function which I think could be
useful in the CopyWindow library:
-- Toggle between "copyToAll" or "killAllOtherCopies". Copies to all
-- workspaces, or remove from all other workspaces, depending on
-- previous state (checked with "wsContainingCopies").
copyToAllToggle :: X ()
copyToAllToggle = do
-- check which workspaces have copies
copies <- wsContainingCopies
if null copies
then windows copyToAll -- no workspaces, make sticky
else killAllOtherCopies -- already other workspaces, unstick
There are probably better ways of implementing this directly in the
CopyWindow code - wsContainingCopies, in particular, is probably
overkill. But it's all I can use directly from my xmonad.hs, so that's
what I did.
The other bit I needed was something to trigger that function from the
outside. I rejected the ServerMode hook because it looked a bit
too complicated and there is a built-in facility within X that works
without this, which, from Emacs' point of view, is the
x-send-client-message function. So I made up a new message
identifier and wrote a event hook handler to process it:
-- handle X client messages that tell Xmonad to make a window appear
-- on all workspaces
--
-- this should really be using _NET_WM_STATE and
-- _NET_WM_STATE_STICKY. but that's more complicated: then we'd need
-- to inspect a window and figure out the current state and act
-- accordingly. I am not good enough with Xmonad to figure out that
-- part yet.
--
-- Instead, just check for the relevant message and check if the
-- focused window is already on all workspaces and toggle based on
-- that.
--
-- this is designed to interoperate with Emacs's writeroom-mode module
-- and called be called from elisp with:
--
-- (x-send-client-message nil 0 nil "XMONAD_COPY_ALL_SELF" 8 '(0))
myClientMessageEventHook :: Event -> X All
myClientMessageEventHook (ClientMessageEvent ev_message_type = mt, ev_data = dt ) = do
dpy <- asks display
-- the client message we're expecting
copyAllMsg <- io $ internAtom dpy "XMONAD_COPY_ALL_SELF" False
-- if the event matches the message we expect, toggle sticky state
when (mt == copyAllMsg && dt /= []) $ do
copyToAllToggle
-- we processed the event completely
return $ All True
All that was left was to hook that into Emacs, and I was done!
Whoohoo! Full screen total domination, distraction free work!
I would love to hear from others what they think of that approach, if
they have improvements or if the above copyToAllToggle function could be
merged in. Ideally, Xmonad would just parse the STICKY client messages
and do the right thing - maybe even directly in CopyWindow - but I have
found this enough Haskell for one day.
You can see the diff on my home directory
to see exactly the changes involved to make this configuration work.
Emacs packaging
Speaking of Emacs, after complaining in the noisy #emacs IRC channel
about the poor TLS configuration of marmelade.org -- and filing a
bug (Debian bug #861106) regarding the use of SHA-1 in certificate
pinning -- I was told we shouldn't expect trust from third-party ELPA
repositories. Marmelade seems to be dead, as the maintainer is
"behind the great firewall of China" and MELPA still hasn't
figured out how to sign packages. In the end, it seems like there
are tons of elpa packages in Debian and that if your favorite one
is missing, that's a bug that can be filed and fixed.
I first discovered that 6 of the packages I used were already
packaged:
And so I went ahead and filed a ton more bugs for the packages I am
using but that aren't in Debian just yet:
- company-go: Debian bug #861177
- elpy: Debian bug #861174
- markdown-toc: Debian bug #861128
- multiple-cursors: Debian bug #861127
- writegood-mode: Debian bug #861125
- writeroom-mode: Debian bug #861124
Of those, I can't recommend multiple-cursors (MC) enough: I used
it at least 4 times just writing this text. It's just awesome. The
other ones are also all great in their own right of course, but I feel
they are more specific to my workflow whereas MC is just amazing.
ikiwiki
I did some more work on ikiwiki the software driving this blog. I
created a new plugin to, at least, fix anchors in the table of
contents to be human readable. This is something I had done on
the MoinMoin wiki almost a decade ago -- which I called
then NicerHeadingIds and that I have always found frustrating with
Ikiwiki.
It turns out the problem was both easier and hairier than I
thought. Right from the start, something weird was happening:
something was already adding nice headings, but they were somewhat
broken. It turns out that multimarkdown already inserts those
headers, but I wasn't satisfied with the way they were generated. But
even worse, I had the headinganchors plugin enabled, but that
plugin wasn't taking effect, because of multimarkdown. And even if it
would take effect, it doesn't behave well with non-ASCII characters,
which gets turned in their numeric presentation.
So I also wrote the i18nheadinganchors plugin that creates better
headings and patched the toc plugin so that it can reuse existing
anchors if they exist, while keeping backwards compatibility. I hope
this gets merged in a future ikiwiki release so I do not have to carry
this patch locally too long...
In other news, I have upgraded the ikiwiki-hosting package to the
latest version and sent a patch upstream to provide HSTS support.
Other stuff
I have migrated all my public repos hosted on my home server to
either Gitlab.com or Github. I also have repositories
on 0xacab and it seemed ludicrous to have 4 different, canonical,
places where my code was hosted. I have now about 40 different projects
on Gitlab and about 60 on Github, although most of the latter are
forks of existing projects.
I also made a manpage for stressant and moved the documentation
to RTFD which makes it neatly accessible. I also made small
incremental improvements (like --directory support).
I installed Rainloop on this server to give a nice,
mobile-friendly webmail. Instructions to replicate this setup are in
mail.
In the constant git-annex documentation effort, I tried to draft
a user guide that could be a basis for restructuring the
documentation to be more easily accessible. I also helped a friend put
his documentation on the wiki in splitting a repository.
Finally, I also looked into Android stuff a little more. I wrote
a usability review of the F-Droid privileged extension that will
bring good changes, I hope. I also opened the discussion regarding
reproducible builds to try and clarify exactly how those worked to
help the Wallabag people ship consistently signed alphas. So far,
it seems that it will remain a standard practice on F-Droid to ship
packages that are not signed by the official upstream signature,
unfortunately, unless upstream provides a reproducible build that is
publicly available... Switching to such build is also a hairy issue,
as, obviously, the signature changes, which raises the alarm we are
trying to avoid in the first place.
kedpm
Finally, a friend over at Koumbit.org reported
Debian bug #860817, as information leak in kedpm, a password manager I
previously maintained. I requested and got assigned CVE-2017-8296 and provided a fix for wheezy and jessie. For unstable
and the coming stretch release, I have requested kedpm to be
completely removed from Debian (Debian bug #860817) which involved a
release notes update (Debian bug #861277).
It's unfortunate to see software go, but kedpm wasn't maintained. I
wasn't the original author: I just gave a few patches and ended up
maintaining that software and not using it. It's a bad situation to be
in, as you don't really know what's working and not with the tools you
are supposed to be responsible for. There are more modern alternatives
available now and I encourage everyone to switch.
Triage
Looking for more work, I peeked a bit in the secretary tasks to triage
some pending issues. I found that trafficserver could be
crashed with simple requests (CVE-2017-5659) so I looked
into that issue. My analysis showed that the patch is long and
complex and could be difficult to backport to the old version
available in wheezy. I also couldn't reproduce the issue in wheezy, so
it may be a bug introduced only later, although I couldn't confirm
that directly.
I also triaged wireshark, where I just noted the
maintainer expressed concern that we were taking up issues too fast
and will probably take care of this one. I also postponed various
issues in GnuTLS (marked "no-dsa") as they affect only a
(unfortunately) rarely used part of GnuTLS that has been removed in
later version: OpenPGP support.
Other free software work
Debiman
I finally got around contributing to the debiman project. I worked
on ensuring that there is a dman compatibility in debiman, by
shipping dman in the debian-goodies package (Debian bug #860920). I also submitted a pull request to fix
the fix about page title, document
the custom assets repository, fix a stray bracket and link to
the link to venerable man7.org project
After a discussion on IRC, I also filed a few more issues:
- redirect bpf to bpf.2, not bpf.4freebsd
- redirect to unstable by default
- arrows missing in table of contents
- automatically collapse long links
- old ?query= parameter ignored/failing
I'm happy to be able to contribute to this important service and I
hope the new FAQ I created will be online soon!
XMonad and Emacs
I started using writeroom-mode again as part of my work on LWN.
As it turns out, my setup was not exactly working: I had to port my
config to the new version and windows weren't "sticky" as they should
be, a known issue with Xmonad. Indeed, Xmonad doesn't obey the
"static" or "all desktops" standard directives.
Writeroom is a "distraction-free writing" mode for Emacs, so the irony
of working on such a deep distraction in establishing a distraction
free environment is not lost on me.
Needing to scratch that particular itch, and with the help of clever
people from the IRC channel, I was able to make Emacs tell Xmonad to
show its window (or "frame" as Emacs likes to call it) on all
desktops. This involved creating a new function which I think could be
useful in the CopyWindow library:
-- Toggle between "copyToAll" or "killAllOtherCopies". Copies to all
-- workspaces, or remove from all other workspaces, depending on
-- previous state (checked with "wsContainingCopies").
copyToAllToggle :: X ()
copyToAllToggle = do
-- check which workspaces have copies
copies <- wsContainingCopies
if null copies
then windows copyToAll -- no workspaces, make sticky
else killAllOtherCopies -- already other workspaces, unstick
There are probably better ways of implementing this directly in the
CopyWindow code - wsContainingCopies, in particular, is probably
overkill. But it's all I can use directly from my xmonad.hs, so that's
what I did.
The other bit I needed was something to trigger that function from the
outside. I rejected the ServerMode hook because it looked a bit
too complicated and there is a built-in facility within X that works
without this, which, from Emacs' point of view, is the
x-send-client-message function. So I made up a new message
identifier and wrote a event hook handler to process it:
-- handle X client messages that tell Xmonad to make a window appear
-- on all workspaces
--
-- this should really be using _NET_WM_STATE and
-- _NET_WM_STATE_STICKY. but that's more complicated: then we'd need
-- to inspect a window and figure out the current state and act
-- accordingly. I am not good enough with Xmonad to figure out that
-- part yet.
--
-- Instead, just check for the relevant message and check if the
-- focused window is already on all workspaces and toggle based on
-- that.
--
-- this is designed to interoperate with Emacs's writeroom-mode module
-- and called be called from elisp with:
--
-- (x-send-client-message nil 0 nil "XMONAD_COPY_ALL_SELF" 8 '(0))
myClientMessageEventHook :: Event -> X All
myClientMessageEventHook (ClientMessageEvent ev_message_type = mt, ev_data = dt ) = do
dpy <- asks display
-- the client message we're expecting
copyAllMsg <- io $ internAtom dpy "XMONAD_COPY_ALL_SELF" False
-- if the event matches the message we expect, toggle sticky state
when (mt == copyAllMsg && dt /= []) $ do
copyToAllToggle
-- we processed the event completely
return $ All True
All that was left was to hook that into Emacs, and I was done!
Whoohoo! Full screen total domination, distraction free work!
I would love to hear from others what they think of that approach, if
they have improvements or if the above copyToAllToggle function could be
merged in. Ideally, Xmonad would just parse the STICKY client messages
and do the right thing - maybe even directly in CopyWindow - but I have
found this enough Haskell for one day.
You can see the diff on my home directory
to see exactly the changes involved to make this configuration work.
Emacs packaging
Speaking of Emacs, after complaining in the noisy #emacs IRC channel
about the poor TLS configuration of marmelade.org -- and filing a
bug (Debian bug #861106) regarding the use of SHA-1 in certificate
pinning -- I was told we shouldn't expect trust from third-party ELPA
repositories. Marmelade seems to be dead, as the maintainer is
"behind the great firewall of China" and MELPA still hasn't
figured out how to sign packages. In the end, it seems like there
are tons of elpa packages in Debian and that if your favorite one
is missing, that's a bug that can be filed and fixed.
I first discovered that 6 of the packages I used were already
packaged:
And so I went ahead and filed a ton more bugs for the packages I am
using but that aren't in Debian just yet:
- company-go: Debian bug #861177
- elpy: Debian bug #861174
- markdown-toc: Debian bug #861128
- multiple-cursors: Debian bug #861127
- writegood-mode: Debian bug #861125
- writeroom-mode: Debian bug #861124
Of those, I can't recommend multiple-cursors (MC) enough: I used
it at least 4 times just writing this text. It's just awesome. The
other ones are also all great in their own right of course, but I feel
they are more specific to my workflow whereas MC is just amazing.
ikiwiki
I did some more work on ikiwiki the software driving this blog. I
created a new plugin to, at least, fix anchors in the table of
contents to be human readable. This is something I had done on
the MoinMoin wiki almost a decade ago -- which I called
then NicerHeadingIds and that I have always found frustrating with
Ikiwiki.
It turns out the problem was both easier and hairier than I
thought. Right from the start, something weird was happening:
something was already adding nice headings, but they were somewhat
broken. It turns out that multimarkdown already inserts those
headers, but I wasn't satisfied with the way they were generated. But
even worse, I had the headinganchors plugin enabled, but that
plugin wasn't taking effect, because of multimarkdown. And even if it
would take effect, it doesn't behave well with non-ASCII characters,
which gets turned in their numeric presentation.
So I also wrote the i18nheadinganchors plugin that creates better
headings and patched the toc plugin so that it can reuse existing
anchors if they exist, while keeping backwards compatibility. I hope
this gets merged in a future ikiwiki release so I do not have to carry
this patch locally too long...
In other news, I have upgraded the ikiwiki-hosting package to the
latest version and sent a patch upstream to provide HSTS support.
Other stuff
I have migrated all my public repos hosted on my home server to
either Gitlab.com or Github. I also have repositories
on 0xacab and it seemed ludicrous to have 4 different, canonical,
places where my code was hosted. I have now about 40 different projects
on Gitlab and about 60 on Github, although most of the latter are
forks of existing projects.
I also made a manpage for stressant and moved the documentation
to RTFD which makes it neatly accessible. I also made small
incremental improvements (like --directory support).
I installed Rainloop on this server to give a nice,
mobile-friendly webmail. Instructions to replicate this setup are in
mail.
In the constant git-annex documentation effort, I tried to draft
a user guide that could be a basis for restructuring the
documentation to be more easily accessible. I also helped a friend put
his documentation on the wiki in splitting a repository.
Finally, I also looked into Android stuff a little more. I wrote
a usability review of the F-Droid privileged extension that will
bring good changes, I hope. I also opened the discussion regarding
reproducible builds to try and clarify exactly how those worked to
help the Wallabag people ship consistently signed alphas. So far,
it seems that it will remain a standard practice on F-Droid to ship
packages that are not signed by the official upstream signature,
unfortunately, unless upstream provides a reproducible build that is
publicly available... Switching to such build is also a hairy issue,
as, obviously, the signature changes, which raises the alarm we are
trying to avoid in the first place.
Other free software work
Debiman
I finally got around contributing to the debiman project. I worked
on ensuring that there is a dman compatibility in debiman, by
shipping dman in the debian-goodies package (Debian bug #860920). I also submitted a pull request to fix
the fix about page title, document
the custom assets repository, fix a stray bracket and link to
the link to venerable man7.org project
After a discussion on IRC, I also filed a few more issues:
- redirect bpf to bpf.2, not bpf.4freebsd
- redirect to unstable by default
- arrows missing in table of contents
- automatically collapse long links
- old ?query= parameter ignored/failing
I'm happy to be able to contribute to this important service and I
hope the new FAQ I created will be online soon!
XMonad and Emacs
I started using writeroom-mode again as part of my work on LWN.
As it turns out, my setup was not exactly working: I had to port my
config to the new version and windows weren't "sticky" as they should
be, a known issue with Xmonad. Indeed, Xmonad doesn't obey the
"static" or "all desktops" standard directives.
Writeroom is a "distraction-free writing" mode for Emacs, so the irony
of working on such a deep distraction in establishing a distraction
free environment is not lost on me.
Needing to scratch that particular itch, and with the help of clever
people from the IRC channel, I was able to make Emacs tell Xmonad to
show its window (or "frame" as Emacs likes to call it) on all
desktops. This involved creating a new function which I think could be
useful in the CopyWindow library:
-- Toggle between "copyToAll" or "killAllOtherCopies". Copies to all
-- workspaces, or remove from all other workspaces, depending on
-- previous state (checked with "wsContainingCopies").
copyToAllToggle :: X ()
copyToAllToggle = do
-- check which workspaces have copies
copies <- wsContainingCopies
if null copies
then windows copyToAll -- no workspaces, make sticky
else killAllOtherCopies -- already other workspaces, unstick
There are probably better ways of implementing this directly in the
CopyWindow code - wsContainingCopies, in particular, is probably
overkill. But it's all I can use directly from my xmonad.hs, so that's
what I did.
The other bit I needed was something to trigger that function from the
outside. I rejected the ServerMode hook because it looked a bit
too complicated and there is a built-in facility within X that works
without this, which, from Emacs' point of view, is the
x-send-client-message function. So I made up a new message
identifier and wrote a event hook handler to process it:
-- handle X client messages that tell Xmonad to make a window appear
-- on all workspaces
--
-- this should really be using _NET_WM_STATE and
-- _NET_WM_STATE_STICKY. but that's more complicated: then we'd need
-- to inspect a window and figure out the current state and act
-- accordingly. I am not good enough with Xmonad to figure out that
-- part yet.
--
-- Instead, just check for the relevant message and check if the
-- focused window is already on all workspaces and toggle based on
-- that.
--
-- this is designed to interoperate with Emacs's writeroom-mode module
-- and called be called from elisp with:
--
-- (x-send-client-message nil 0 nil "XMONAD_COPY_ALL_SELF" 8 '(0))
myClientMessageEventHook :: Event -> X All
myClientMessageEventHook (ClientMessageEvent ev_message_type = mt, ev_data = dt ) = do
dpy <- asks display
-- the client message we're expecting
copyAllMsg <- io $ internAtom dpy "XMONAD_COPY_ALL_SELF" False
-- if the event matches the message we expect, toggle sticky state
when (mt == copyAllMsg && dt /= []) $ do
copyToAllToggle
-- we processed the event completely
return $ All True
All that was left was to hook that into Emacs, and I was done!
Whoohoo! Full screen total domination, distraction free work!
I would love to hear from others what they think of that approach, if
they have improvements or if the above copyToAllToggle function could be
merged in. Ideally, Xmonad would just parse the STICKY client messages
and do the right thing - maybe even directly in CopyWindow - but I have
found this enough Haskell for one day.
You can see the diff on my home directory
to see exactly the changes involved to make this configuration work.
Emacs packaging
Speaking of Emacs, after complaining in the noisy #emacs IRC channel
about the poor TLS configuration of marmelade.org -- and filing a
bug (Debian bug #861106) regarding the use of SHA-1 in certificate
pinning -- I was told we shouldn't expect trust from third-party ELPA
repositories. Marmelade seems to be dead, as the maintainer is
"behind the great firewall of China" and MELPA still hasn't
figured out how to sign packages. In the end, it seems like there
are tons of elpa packages in Debian and that if your favorite one
is missing, that's a bug that can be filed and fixed.
I first discovered that 6 of the packages I used were already
packaged:
And so I went ahead and filed a ton more bugs for the packages I am
using but that aren't in Debian just yet:
- company-go: Debian bug #861177
- elpy: Debian bug #861174
- markdown-toc: Debian bug #861128
- multiple-cursors: Debian bug #861127
- writegood-mode: Debian bug #861125
- writeroom-mode: Debian bug #861124
Of those, I can't recommend multiple-cursors (MC) enough: I used
it at least 4 times just writing this text. It's just awesome. The
other ones are also all great in their own right of course, but I feel
they are more specific to my workflow whereas MC is just amazing.
ikiwiki
I did some more work on ikiwiki the software driving this blog. I
created a new plugin to, at least, fix anchors in the table of
contents to be human readable. This is something I had done on
the MoinMoin wiki almost a decade ago -- which I called
then NicerHeadingIds and that I have always found frustrating with
Ikiwiki.
It turns out the problem was both easier and hairier than I
thought. Right from the start, something weird was happening:
something was already adding nice headings, but they were somewhat
broken. It turns out that multimarkdown already inserts those
headers, but I wasn't satisfied with the way they were generated. But
even worse, I had the headinganchors plugin enabled, but that
plugin wasn't taking effect, because of multimarkdown. And even if it
would take effect, it doesn't behave well with non-ASCII characters,
which gets turned in their numeric presentation.
So I also wrote the i18nheadinganchors plugin that creates better
headings and patched the toc plugin so that it can reuse existing
anchors if they exist, while keeping backwards compatibility. I hope
this gets merged in a future ikiwiki release so I do not have to carry
this patch locally too long...
In other news, I have upgraded the ikiwiki-hosting package to the
latest version and sent a patch upstream to provide HSTS support.
Other stuff
I have migrated all my public repos hosted on my home server to
either Gitlab.com or Github. I also have repositories
on 0xacab and it seemed ludicrous to have 4 different, canonical,
places where my code was hosted. I have now about 40 different projects
on Gitlab and about 60 on Github, although most of the latter are
forks of existing projects.
I also made a manpage for stressant and moved the documentation
to RTFD which makes it neatly accessible. I also made small
incremental improvements (like --directory support).
I installed Rainloop on this server to give a nice,
mobile-friendly webmail. Instructions to replicate this setup are in
mail.
In the constant git-annex documentation effort, I tried to draft
a user guide that could be a basis for restructuring the
documentation to be more easily accessible. I also helped a friend put
his documentation on the wiki in splitting a repository.
Finally, I also looked into Android stuff a little more. I wrote
a usability review of the F-Droid privileged extension that will
bring good changes, I hope. I also opened the discussion regarding
reproducible builds to try and clarify exactly how those worked to
help the Wallabag people ship consistently signed alphas. So far,
it seems that it will remain a standard practice on F-Droid to ship
packages that are not signed by the official upstream signature,
unfortunately, unless upstream provides a reproducible build that is
publicly available... Switching to such build is also a hairy issue,
as, obviously, the signature changes, which raises the alarm we are
trying to avoid in the first place.
- redirect bpf to bpf.2, not bpf.4freebsd
- redirect to unstable by default
- arrows missing in table of contents
- automatically collapse long links
- old ?query= parameter ignored/failing
XMonad and Emacs
I started using writeroom-mode again as part of my work on LWN.
As it turns out, my setup was not exactly working: I had to port my
config to the new version and windows weren't "sticky" as they should
be, a known issue with Xmonad. Indeed, Xmonad doesn't obey the
"static" or "all desktops" standard directives.
Writeroom is a "distraction-free writing" mode for Emacs, so the irony
of working on such a deep distraction in establishing a distraction
free environment is not lost on me.
Needing to scratch that particular itch, and with the help of clever
people from the IRC channel, I was able to make Emacs tell Xmonad to
show its window (or "frame" as Emacs likes to call it) on all
desktops. This involved creating a new function which I think could be
useful in the CopyWindow library:
-- Toggle between "copyToAll" or "killAllOtherCopies". Copies to all
-- workspaces, or remove from all other workspaces, depending on
-- previous state (checked with "wsContainingCopies").
copyToAllToggle :: X ()
copyToAllToggle = do
-- check which workspaces have copies
copies <- wsContainingCopies
if null copies
then windows copyToAll -- no workspaces, make sticky
else killAllOtherCopies -- already other workspaces, unstick
There are probably better ways of implementing this directly in the
CopyWindow code - wsContainingCopies, in particular, is probably
overkill. But it's all I can use directly from my xmonad.hs, so that's
what I did.
The other bit I needed was something to trigger that function from the
outside. I rejected the ServerMode hook because it looked a bit
too complicated and there is a built-in facility within X that works
without this, which, from Emacs' point of view, is the
x-send-client-message function. So I made up a new message
identifier and wrote a event hook handler to process it:
-- handle X client messages that tell Xmonad to make a window appear
-- on all workspaces
--
-- this should really be using _NET_WM_STATE and
-- _NET_WM_STATE_STICKY. but that's more complicated: then we'd need
-- to inspect a window and figure out the current state and act
-- accordingly. I am not good enough with Xmonad to figure out that
-- part yet.
--
-- Instead, just check for the relevant message and check if the
-- focused window is already on all workspaces and toggle based on
-- that.
--
-- this is designed to interoperate with Emacs's writeroom-mode module
-- and called be called from elisp with:
--
-- (x-send-client-message nil 0 nil "XMONAD_COPY_ALL_SELF" 8 '(0))
myClientMessageEventHook :: Event -> X All
myClientMessageEventHook (ClientMessageEvent ev_message_type = mt, ev_data = dt ) = do
dpy <- asks display
-- the client message we're expecting
copyAllMsg <- io $ internAtom dpy "XMONAD_COPY_ALL_SELF" False
-- if the event matches the message we expect, toggle sticky state
when (mt == copyAllMsg && dt /= []) $ do
copyToAllToggle
-- we processed the event completely
return $ All True
All that was left was to hook that into Emacs, and I was done!
Whoohoo! Full screen total domination, distraction free work!
I would love to hear from others what they think of that approach, if
they have improvements or if the above copyToAllToggle function could be
merged in. Ideally, Xmonad would just parse the STICKY client messages
and do the right thing - maybe even directly in CopyWindow - but I have
found this enough Haskell for one day.
You can see the diff on my home directory
to see exactly the changes involved to make this configuration work.
Emacs packaging
Speaking of Emacs, after complaining in the noisy #emacs IRC channel
about the poor TLS configuration of marmelade.org -- and filing a
bug (Debian bug #861106) regarding the use of SHA-1 in certificate
pinning -- I was told we shouldn't expect trust from third-party ELPA
repositories. Marmelade seems to be dead, as the maintainer is
"behind the great firewall of China" and MELPA still hasn't
figured out how to sign packages. In the end, it seems like there
are tons of elpa packages in Debian and that if your favorite one
is missing, that's a bug that can be filed and fixed.
I first discovered that 6 of the packages I used were already
packaged:
And so I went ahead and filed a ton more bugs for the packages I am
using but that aren't in Debian just yet:
- company-go: Debian bug #861177
- elpy: Debian bug #861174
- markdown-toc: Debian bug #861128
- multiple-cursors: Debian bug #861127
- writegood-mode: Debian bug #861125
- writeroom-mode: Debian bug #861124
Of those, I can't recommend multiple-cursors (MC) enough: I used
it at least 4 times just writing this text. It's just awesome. The
other ones are also all great in their own right of course, but I feel
they are more specific to my workflow whereas MC is just amazing.
ikiwiki
I did some more work on ikiwiki the software driving this blog. I
created a new plugin to, at least, fix anchors in the table of
contents to be human readable. This is something I had done on
the MoinMoin wiki almost a decade ago -- which I called
then NicerHeadingIds and that I have always found frustrating with
Ikiwiki.
It turns out the problem was both easier and hairier than I
thought. Right from the start, something weird was happening:
something was already adding nice headings, but they were somewhat
broken. It turns out that multimarkdown already inserts those
headers, but I wasn't satisfied with the way they were generated. But
even worse, I had the headinganchors plugin enabled, but that
plugin wasn't taking effect, because of multimarkdown. And even if it
would take effect, it doesn't behave well with non-ASCII characters,
which gets turned in their numeric presentation.
So I also wrote the i18nheadinganchors plugin that creates better
headings and patched the toc plugin so that it can reuse existing
anchors if they exist, while keeping backwards compatibility. I hope
this gets merged in a future ikiwiki release so I do not have to carry
this patch locally too long...
In other news, I have upgraded the ikiwiki-hosting package to the
latest version and sent a patch upstream to provide HSTS support.
Other stuff
I have migrated all my public repos hosted on my home server to
either Gitlab.com or Github. I also have repositories
on 0xacab and it seemed ludicrous to have 4 different, canonical,
places where my code was hosted. I have now about 40 different projects
on Gitlab and about 60 on Github, although most of the latter are
forks of existing projects.
I also made a manpage for stressant and moved the documentation
to RTFD which makes it neatly accessible. I also made small
incremental improvements (like --directory support).
I installed Rainloop on this server to give a nice,
mobile-friendly webmail. Instructions to replicate this setup are in
mail.
In the constant git-annex documentation effort, I tried to draft
a user guide that could be a basis for restructuring the
documentation to be more easily accessible. I also helped a friend put
his documentation on the wiki in splitting a repository.
Finally, I also looked into Android stuff a little more. I wrote
a usability review of the F-Droid privileged extension that will
bring good changes, I hope. I also opened the discussion regarding
reproducible builds to try and clarify exactly how those worked to
help the Wallabag people ship consistently signed alphas. So far,
it seems that it will remain a standard practice on F-Droid to ship
packages that are not signed by the official upstream signature,
unfortunately, unless upstream provides a reproducible build that is
publicly available... Switching to such build is also a hairy issue,
as, obviously, the signature changes, which raises the alarm we are
trying to avoid in the first place.
-- Toggle between "copyToAll" or "killAllOtherCopies". Copies to all
-- workspaces, or remove from all other workspaces, depending on
-- previous state (checked with "wsContainingCopies").
copyToAllToggle :: X ()
copyToAllToggle = do
-- check which workspaces have copies
copies <- wsContainingCopies
if null copies
then windows copyToAll -- no workspaces, make sticky
else killAllOtherCopies -- already other workspaces, unstick
-- handle X client messages that tell Xmonad to make a window appear
-- on all workspaces
--
-- this should really be using _NET_WM_STATE and
-- _NET_WM_STATE_STICKY. but that's more complicated: then we'd need
-- to inspect a window and figure out the current state and act
-- accordingly. I am not good enough with Xmonad to figure out that
-- part yet.
--
-- Instead, just check for the relevant message and check if the
-- focused window is already on all workspaces and toggle based on
-- that.
--
-- this is designed to interoperate with Emacs's writeroom-mode module
-- and called be called from elisp with:
--
-- (x-send-client-message nil 0 nil "XMONAD_COPY_ALL_SELF" 8 '(0))
myClientMessageEventHook :: Event -> X All
myClientMessageEventHook (ClientMessageEvent ev_message_type = mt, ev_data = dt ) = do
dpy <- asks display
-- the client message we're expecting
copyAllMsg <- io $ internAtom dpy "XMONAD_COPY_ALL_SELF" False
-- if the event matches the message we expect, toggle sticky state
when (mt == copyAllMsg && dt /= []) $ do
copyToAllToggle
-- we processed the event completely
return $ All True
#emacs IRC channel
about the poor TLS configuration of marmelade.org -- and filing a
bug (Debian bug #861106) regarding the use of SHA-1 in certificate
pinning -- I was told we shouldn't expect trust from third-party ELPA
repositories. Marmelade seems to be dead, as the maintainer is
"behind the great firewall of China" and MELPA still hasn't
figured out how to sign packages. In the end, it seems like there
are tons of elpa packages in Debian and that if your favorite one
is missing, that's a bug that can be filed and fixed.
I first discovered that 6 of the packages I used were already
packaged:
And so I went ahead and filed a ton more bugs for the packages I am
using but that aren't in Debian just yet:
- company-go: Debian bug #861177
- elpy: Debian bug #861174
- markdown-toc: Debian bug #861128
- multiple-cursors: Debian bug #861127
- writegood-mode: Debian bug #861125
- writeroom-mode: Debian bug #861124
ikiwiki
I did some more work on ikiwiki the software driving this blog. I
created a new plugin to, at least, fix anchors in the table of
contents to be human readable. This is something I had done on
the MoinMoin wiki almost a decade ago -- which I called
then NicerHeadingIds and that I have always found frustrating with
Ikiwiki.
It turns out the problem was both easier and hairier than I
thought. Right from the start, something weird was happening:
something was already adding nice headings, but they were somewhat
broken. It turns out that multimarkdown already inserts those
headers, but I wasn't satisfied with the way they were generated. But
even worse, I had the headinganchors plugin enabled, but that
plugin wasn't taking effect, because of multimarkdown. And even if it
would take effect, it doesn't behave well with non-ASCII characters,
which gets turned in their numeric presentation.
So I also wrote the i18nheadinganchors plugin that creates better
headings and patched the toc plugin so that it can reuse existing
anchors if they exist, while keeping backwards compatibility. I hope
this gets merged in a future ikiwiki release so I do not have to carry
this patch locally too long...
In other news, I have upgraded the ikiwiki-hosting package to the
latest version and sent a patch upstream to provide HSTS support.
Other stuff
I have migrated all my public repos hosted on my home server to
either Gitlab.com or Github. I also have repositories
on 0xacab and it seemed ludicrous to have 4 different, canonical,
places where my code was hosted. I have now about 40 different projects
on Gitlab and about 60 on Github, although most of the latter are
forks of existing projects.
I also made a manpage for stressant and moved the documentation
to RTFD which makes it neatly accessible. I also made small
incremental improvements (like --directory support).
I installed Rainloop on this server to give a nice,
mobile-friendly webmail. Instructions to replicate this setup are in
mail.
In the constant git-annex documentation effort, I tried to draft
a user guide that could be a basis for restructuring the
documentation to be more easily accessible. I also helped a friend put
his documentation on the wiki in splitting a repository.
Finally, I also looked into Android stuff a little more. I wrote
a usability review of the F-Droid privileged extension that will
bring good changes, I hope. I also opened the discussion regarding
reproducible builds to try and clarify exactly how those worked to
help the Wallabag people ship consistently signed alphas. So far,
it seems that it will remain a standard practice on F-Droid to ship
packages that are not signed by the official upstream signature,
unfortunately, unless upstream provides a reproducible build that is
publicly available... Switching to such build is also a hairy issue,
as, obviously, the signature changes, which raises the alarm we are
trying to avoid in the first place.
--directory support).
I installed Rainloop on this server to give a nice,
mobile-friendly webmail. Instructions to replicate this setup are in
mail.
In the constant git-annex documentation effort, I tried to draft
a user guide that could be a basis for restructuring the
documentation to be more easily accessible. I also helped a friend put
his documentation on the wiki in splitting a repository.
Finally, I also looked into Android stuff a little more. I wrote
a usability review of the F-Droid privileged extension that will
bring good changes, I hope. I also opened the discussion regarding
reproducible builds to try and clarify exactly how those worked to
help the Wallabag people ship consistently signed alphas. So far,
it seems that it will remain a standard practice on F-Droid to ship
packages that are not signed by the official upstream signature,
unfortunately, unless upstream provides a reproducible build that is
publicly available... Switching to such build is also a hairy issue,
as, obviously, the signature changes, which raises the alarm we are
trying to avoid in the first place.
A few weeks ago I blogged about an experiment of mine, where I
What is your view on the Fellowship and FSFE structure?
Several candidates made comments about the Fellowship program and the way individual members and volunteers are involved in FSFE governance. This is not a new topic. Debate about this topic is very welcome and I would be particularly interested to hear any concerns or ideas for improvement that people may contribute. One of the best places to share these ideas would be through the
Git is cool, for reasons I won't go into here.
It doesn't deal very well with very large files, but that's fine; when
using things like
Tomorrow we are leaving for
And having the chance to visit my family at the same time in Vienna makes this trip, how painful the long flight with our daughter will be, worth it.
See you in Vienna and Bachotek!
PS: No pun intended with the photo-logo combination, just a shot of the great surroundings in Bachotek
Before I start, debconf registration
Apart from the conference, I have shared about the northern lights and the snacks on stand thing, there is one thing more to explore and that is the
The motor drive attaches to the camera using the tripod socket, a replacement tripod socket is provided on the base of plate. There s also a metal plate with the bottom of the hand grip attached to it held on to the base plate with a thumb screw. When this is released it gives access to the screw holding in the battery compartment which (very conveniently) takes 6 AA batteries. This also provides power to the camera body when attached.
On the back of the base of the camera there s a button with a red LED next to it which illuminates slightly when the button is pressed (it s visible in low light only). I m not 100% sure what this is for, I d have guessed a battery check if the light were easier to see.
On the top of the camera there is a hot shoe (with a plastic blanking plate, a nice touch), a mode selector and two buttons. The larger button on the front replicates the shutter release button on the body (which continues to function as well) while the smaller button to the rear of the camera controls the motor depending on the current state of the camera it cocks the shutter, winds the film and resets the mirror when it is locked up. The mode dial offers three modes: off, S and C. S and C appear to correspond to the S and C modes of the main camera, single and continuous mirror lockup shots.
Overall with this grip fitted and a prism attached the camera operates very similarly to a 35mm SLR in terms of film winding and so on. It is of course heavier (the whole setup weighs in at 2.5kg) but balanced very well and the grip is very comfortable to use.

A fair amount of things happened since I last blogged something else than music. First of all we did actually hold a
New package! And, as it happens, a effectively a subset or variant of one my oldest packages,