security bingo!
authorelijah <elijah@riseup.net>
Wed, 29 Aug 2012 07:33:56 +0000 (00:33 -0700)
committerelijah <elijah@riseup.net>
Wed, 29 Aug 2012 07:33:56 +0000 (00:33 -0700)
app/assets/stylesheets/leap.scss
app/helpers/application_helper.rb
app/helpers/blog_helper.rb
app/views/layouts/blog/_summary.html.haml
app/views/pages/about-us/news/2012/security-bingo/en.haml [new file with mode: 0644]
app/views/pages/about-us/news/en.haml
lib/static_page.rb

index 1671a40..b51d22b 100644 (file)
@@ -160,9 +160,15 @@ table.timeline {
 
 
 article.blog_summary {
+  margin-bottom: 1em;
   .byline {
     color: #999;
   }
+  .content {
+    p {
+      margin-bottom: 0;
+    }
+  }
 }
 
 article.blog_full {
index 903549b..a9a7dc9 100644 (file)
@@ -45,7 +45,11 @@ module ApplicationHelper
   end
 
   def page_path(page)
-    '/' + ([I18n.locale.to_s] + page.path).join('/')
+    if page.props.path_prefix
+      "/#{I18n.locale.to_s}/#{page.props.path_prefix}/#{page.name}"
+    else
+      '/' + ([I18n.locale.to_s] + page.path).join('/')
+    end
   end
 
   #
index 20e4113..9e58fc8 100644 (file)
@@ -3,7 +3,7 @@ module BlogHelper
   def recent_blog_summaries(path)
     root = StaticPage.find(path)
     if root
-      pages = root.all_children.order_by(:posted_at).limit(PAGINATION_SIZE)
+      pages = root.all_children.order_by(:posted_at, :direction => :desc).limit(PAGINATION_SIZE)
       haml do
         pages.each do |page|
           haml render(:partial => 'layouts/blog/summary', :locals => {:page => page})
index c1f7784..68756b1 100644 (file)
@@ -9,9 +9,9 @@
       %i
         = time_tag(page.props.posted_at.to_date, :format => :long, :pubdate => true)
   %div.content
-  - if page.props.preview
-    = page.props.preview
-    - if page.props.body.try(:any?)
-      = link_to(I18n.t(:read_more), page_path(page))
-  - else
-    = render :template => page.template_path
\ No newline at end of file
+    - if page.props.preview
+      = page.props.preview
+      - if page.props.body.try(:any?)
+        = link_to(I18n.t(:read_more), page_path(page))
+    - else
+      = render :template => page.template_path
\ No newline at end of file
diff --git a/app/views/pages/about-us/news/2012/security-bingo/en.haml b/app/views/pages/about-us/news/2012/security-bingo/en.haml
new file mode 100644 (file)
index 0000000..344ee35
--- /dev/null
@@ -0,0 +1,205 @@
+- @title = "Let's play security bingo!"
+- @author = "Elijah"
+- @posted_at = "2012-08-28"
+- @preview = capture_haml do
+  :textile
+    To be honest, this is might be the least satisfying game of bingo ever--but let's play anyway. The rules are simple: draw a grid, label the columns for different platforms, and label the rows for important communication toolsets. In each cell, put the name of an open source software package with reasonable security properties. If this exercise doesn't make you break down in tears, then you have won.
+
+%style
+  :sass
+    table.table
+      border: 1px solid #ccc
+      background: white
+      td
+        width: 12.5%
+        font-size: 0.9em
+        border-right: 1px solid #ccc
+      td.section
+        border-right: 0
+
+= @preview
+
+:textile
+
+  The rules probably need some adjustment if this game is to catch on.
+
+  Here is my attempt at playing:
+
+%table.table
+  %tr
+    %th
+    %th
+    %th Windows
+    %th Mac
+    %th Linux
+    %th iOS
+    %th Android
+    %th Web
+  %tbody
+    %tr
+      %td.section{:rowspan => 3} Messages
+      %td Short Message
+      %td{:colspan => 3} Pidgin, Gajim, OTR
+      %td SecureChat
+      %td Gibberbot, Beem, TextSecure
+      %td Cryptocat
+    %tr
+      %td Long Message
+      %td{:colspan => 3} (Thunderbird + Enigmail)
+      %td
+      %td (K-9 + AGP)
+      %td
+    -# %tr
+      %td Social Networking
+      %td
+      %td
+      %td
+      %td
+      %td
+      %td
+  %tbody
+    %tr
+      %td.section{:rowspan => 5} Files
+      %td Storage
+      %td DiskCryptor
+      %td
+      %td EncFS, DMCrypt
+      %td
+      %td (AOSP, LUKS Manager, Cryptonite)
+      %td SafeWith.me
+    %tr
+      %td Backup
+      %td Duplicati
+      %td
+      %td Déjà Dup
+      %td
+      %td FlashBack
+      %td
+    %tr
+      %td Synchronization
+      %td{:colspan => 3} (Syncany, git-annex)
+      %td
+      %td
+      %td
+    %tr
+      %td Data Wipe
+      %td
+      %td
+      %td wipe
+      %td
+      %td InTheClear
+      %td N/A
+    -# %tr
+      %td Collaboration
+      %td
+      %td
+      %td
+      %td
+      %td
+      %td
+  %tbody
+    %tr
+      %td.section{:rowspan => 3} Audio/Video
+      %td Direct Calling
+      %td{:colspan => 3} (Jitsi)
+      %td
+      %td RedPhone, CSimpleSip
+      %td
+    %tr
+      %td Conference
+      %td{:colspan => 3} (Mumble)
+      %td
+      %td (Mumble)
+      %td
+    %tr
+      %td Capture & Reporting
+      %td
+      %td
+      %td
+      %td
+      %td ObscuraCam
+      %td
+  %tbody
+    %tr
+      %td.section{:rowspan => 2} Network
+      %td Availability
+      %td{:colspan => 5} Commotion
+      %td N/A
+    %tr
+      %td Confidentiality & Anonymity
+      %td{:colspan => 5} Tor, (OpenVPN)
+      %td N/A
+  %tbody
+    %tr
+      %td.section{:rowspan => 3} Identity
+      %td Passwords
+      %td{:colspan => 3} KeePassX
+      %td
+      %td KeePassDroid
+      %td
+    %tr
+      %td Validation
+      %td{:colspan => 6} (OpenPGP, OTR)
+    %tr
+      %td Authentication
+      %td{:colspan => 6} Mozilla Persona, WebID
+  -# %tbody
+    %tr
+      %td.section{:rowspan => 2} Anti-intrusion
+      %td Firewall
+      %td
+      %td
+      %td Many
+      %td
+      %td DroidWall
+      %td N/A
+    %tr
+      %td Anti-virus
+      %td
+      %td ClamXav
+      %td ClamAV
+      %td
+      %td
+      %td N/A
+  -# %tbody
+    %tr
+      %td.section{:rowspan => 3} Productivity
+      %td Events & Scheduling
+      %td
+      %td
+      %td
+      %td
+      %td
+      %td
+    %tr
+      %td Tasks & Planning
+      %td
+      %td
+      %td
+      %td
+      %td
+      %td
+
+:textile
+  Looking at this table, two things are immediately obvious: first, I don't know much about Mac or iOS; second, there are a lot of missing cells, and most of the filled cells are dubious in nature.
+
+  I put cells in parenthesis whenever I felt that the cell contents were egregiously doubtful. This could be for any number of reasons:
+
+  * *Not ready*: Some software shows promise, but there is not really any code that is ready to be used. For example, Syncany and git-annex.
+  * *Security problems*: Some software has notable security problems. Mumble, for example, only supports variable bit-rate encoding and is thus not suited to prevent eavesdropping by a skilled adversary.
+  * *Hostile to users*: Much of the available software exemplifies a painful user experience. For example, Jitsi, OpenVPN, or OpenPGP.
+
+  What is missing might be more revealing than what is listed. These toolsets are entirely absent from my 'security bingo' game card:
+
+  * *Social Networking:* When I excluded software that I think is unfeasible (SecureShare) or has no security (Diaspora, etc), then you end up with zero projects.
+  * *Document Collaboration:* I have high hopes an encrypted etherpad, but so far no one has started work on it.
+  * *Photos/Vidoes & Galleries:* Nothing I have heard of.
+  * *Events & Scheduling:* Nothing I have heard of.
+  * *Tasks & Planning:* Nothing I have heard of.
+
+  I also excluded a few obvious categories:
+
+  * *Firewall:* Reasonable firewall support is now built into most operating systems.
+  * *Anti-virus:* Viruses are still mostly a problem on Windows. Other platforms have just gotten lucky so far.
+
+  If you have suggestions for how I can fill in my game card, please write elijah@leap.se.
\ No newline at end of file
index 220be02..87eaac5 100644 (file)
@@ -1,2 +1,3 @@
 - @layout = 'blog'
+- @path_prefix = '2012'
 = recent_blog_summaries('about-us/news')
\ No newline at end of file
index 12d4948..65e9c72 100644 (file)
@@ -8,8 +8,13 @@ class StaticPage
     def limit(num)
       PageArray.new(self[0..(num-1)])
     end
-    def order_by(attr, locale=I18n.locale)
+    def order_by(attr, options={})
+      locale = options[:locale] || I18n.locale
+      direction = options[:direction] || :asc
       array = sort do |a,b|
+        if direction == :desc
+          a, b = b, a
+        end
         a_prop = a.props.locale(locale).send(attr)
         b_prop = b.props.locale(locale).send(attr)
         if a_prop.nil? && b_prop.nil?