<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Daniel Hall&#039;s Website &#187; Computing</title>
	<atom:link href="http://www.danielhall.me/category/computing/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.danielhall.me</link>
	<description>Because the Internet doesn&#039;t have enough opinions already</description>
	<lastBuildDate>Thu, 29 Jul 2010 11:52:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Programming In Javascript</title>
		<link>http://www.danielhall.me/2010/07/programming-in-javascript/</link>
		<comments>http://www.danielhall.me/2010/07/programming-in-javascript/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 11:48:36 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Web Programming]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[JScript]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[WebKit]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=657</guid>
		<description><![CDATA[<p>Javascript is an interesting language. Its partly a functional programming language and part object oriented. It uses a C style syntax but borrows its naming conventions from Java (mostly). Personally I find Javascript language to be one of the most interesting languages that I have played with. The complaints I hear most often regarding Javascript [...]]]></description>
			<content:encoded><![CDATA[<p>Javascript is an interesting language. Its partly a functional programming language and part object oriented. It uses a C style syntax but borrows its naming conventions from Java (mostly). Personally I find Javascript language to be one of the most interesting languages that I have played with. The complaints I hear most often regarding Javascript are that it is very hard to learn and that there are many subtle differences between the interpreters.</p>
<h2>Difficult to learn</h2>
<p>This used to be mostly true. Javascript was a poorly documented language, often only documented in tutorial form by w3schools, or technically documented as ECMAScript. The absolute wealth of tutorials and blog posts made the good information few and far between. Largely when looking for information on how to perform a particular function you had to download some sample code and figure out how it was done based on that.</p>
<p>More recently though Javascript has caught the wave that is trying to standardize the web and this has somewhat improved the situation. Browser manufacturers are documenting their Javascript implementations and largely converging on a common standard. Additionally many helper libraries have been introduced to make the task of working on Javascript even easier. Once Javascript may have been difficult to learn, but as of late this is no longer true.</p>
<p>Javascript Documentation:</p>
<ul>
<li><a href="https://developer.mozilla.org/en/javascript">Mozilla Developer Center &#8211; Javascript</a></li>
<li><a href="http://developer.apple.com/safari/library/documentation/AppleApplications/Reference/WebKitDOMRef/index.html">WebKit DOM Reference</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/yek4tbz0%28VS.85%29.aspx">MSDN &#8211; JScript Language Reference</a></li>
<li><a href="http://dev.opera.com/libraries/">Opera Libraries</a></li>
</ul>
<h2>Subtle differences in interpretation</h2>
<p>This is is one of the biggest problems you still see in Javascript today. You will often find developers writing functions to simply deal with the differences between browsers, there are even entire libraries dedicate to to abstracting away the differences. If I had a dollar for every implementation of a function to get a XMLHttpRequest object across browsers, I wouldn&#8217;t need my job.</p>
<p>﻿﻿﻿﻿﻿Unfortunately it is still however very important to know the differences between implementations of Javascript if you plan on writing anything that will run on more than one browser. These difference may be in the features available in the language, in the Document Object Model or in the way the browser handles CSS. Thankfully many people work on documenting the difference and abstracting around them in libraries.</p>
<p>Javascript Implementations Differences:</p>
<ul>
<li><a href="http://quirksmode.org/">Quirks Mode</a></li>
<li><a href="https://developer.mozilla.org/en/Migrate_apps_from_Internet_Explorer_to_Mozilla">Browser Migration &#8211; MDN</a></li>
<li><a href="http://www.webdevout.net/browser-support-css">Web Browser CSS Support</a></li>
</ul>
<p>Javascript Libraries:</p>
<ul>
<li><a href="http://dojotoolkit.org/">DOJO ToolKit</a></li>
<li><a href="http://www.prototypejs.org/">Prototype</a></li>
<li><a href="http://jquery.com/">jQuery</a></li>
<li><a href="http://script.aculo.us/">script.aculo.us</a></li>
<li><a href="http://miniajax.com/">MiniAJAX</a></li>
</ul>
<p><b>Random Thought:</b> If only Facebook didn&#8217;t get in the way of Javascript all the time&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/07/programming-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Protecting Email with DKIM</title>
		<link>http://www.danielhall.me/2010/07/protecting-email-with-dkim/</link>
		<comments>http://www.danielhall.me/2010/07/protecting-email-with-dkim/#comments</comments>
		<pubDate>Mon, 12 Jul 2010 12:57:19 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[System Administration]]></category>
		<category><![CDATA[DKIM]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[Mail]]></category>
		<category><![CDATA[Phishing]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Spam]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=629</guid>
		<description><![CDATA[<p>One of the problems with the email and the protocols used to transfer it (SMTP) is that they were designed long ago when the Internet was a much friendlier place. When SMTP was designed it was assumed that other hosts on the Internet could be trusted. This is particularly visible in the configuration of relays [...]]]></description>
			<content:encoded><![CDATA[<p>One of the problems with the email and the protocols used to transfer it (SMTP) is that they were designed long ago when the Internet was a much friendlier place. When SMTP was designed it was assumed that other hosts on the Internet could be trusted. This is particularly visible in the configuration of relays where the sender doesn&#8217;t have to be identified. A mail relay will accept mail from any server regardless of where the mail appears to be coming from.</p>
<p>To attempt to rectify this SPF was created. To setup SPF you add either a TXT or an SPF record to the DNS zone you will be sending from. This record defines which servers are allowed to send mail that is coming from that domain. So on my domain danielhall.me I could publish an SPF record that says only my mail server is allowed to send mail that ends in @danielhall.me. Any mailservers receiving mail that is from my domain but not coming from an address listed in my SPF record can see that the mail is likely forged and throw it away. SPF works well in most situations but fails at a very common use case. If someone I send mail to tries to forward it to another address using an automatic process (no clicking forward in their client) then the mail will appear to come from my domain when it gets to the user it was forwarded to, however it will have came from the original recipients mailserver.</p>
<p>DKIM solves this problem by giving each sending mailserver a cryptographic key pair. The public keys is then published in a DNS record in that zone and stores the private key somewhere safe on the server. The server then proceeds to sign the headers (especially the From: header) and the body of all outgoing emails. This signature is then attached to the email as an extra header. When the receiving server get the email it gets the signature and uses that along with the list of signed headers to verify the signature against the public key of the signing domain. This means as long as the mail has passed through an authorised mailserver at any point it will be considered valid.</p>
<p>Setting up a DKIM is relatively simple process. You will need access to the  zone records for your domain and access to the configuration of all the mailservers which all mail originating at your domain passes through. You also need to be aware that signing mail makes it slightly more processor intensive to send an email. If you send a large amount of email this difference could be quite significant. If you&#8217;re using sendmail you may be able to alleviate it by switching to a less resource hungry MTA like Exim. You should also note that in some configurations DKIM can not be setup. For example if you use masquerading in sendmail DKIM will always fail as sendmail will modify the from header after signing.</p>
<p>Ultimately DKIM is a good move for the internet community at large, especially when combined with SPF. DKIM mail is assured to come from the sender and can be cryptographically proven so. While it does take more take a little more effort to setup and maintain it assures mail from your domain is secure and can be assured to have come from you or your company. Ultimately DKIM can protect your company against phishing attempts and boost your spam scores.</p>
<p><strong>Random thought:</strong> What would Email look like if it were designed today?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/07/protecting-email-with-dkim/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google&#8217;s Privacy Bungle</title>
		<link>http://www.danielhall.me/2010/06/googles-privacy-bungle/</link>
		<comments>http://www.danielhall.me/2010/06/googles-privacy-bungle/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 03:37:27 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[Wifi]]></category>
		<category><![CDATA[Wireless]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=621</guid>
		<description><![CDATA[<p>Google has recently taken a large amount of criticism for capturing  unencrypted wireless network traffic as part of its Street View project.  Google admitted to the world that although it was only looking to  capture station MAC addresses it inadvertently also captured the payload  data. Many articles have emerged blasting Google [...]]]></description>
			<content:encoded><![CDATA[<p>Google has recently taken a large amount of criticism for capturing  unencrypted wireless network traffic as part of its Street View project.  Google admitted to the world that although it was only looking to  capture station MAC addresses it inadvertently also captured the payload  data. Many articles have emerged blasting Google for what Senator  Conroy calls &#8216;This is probably the single greatest breach in the history of privacy&#8217;. I believe Google hasn&#8217;t done all that wrong, to  understand why you need to know how a wireless network works.</p>
<p>Wireless networks can either be encrypted or unencrypted but in both  these cases only the payload is encrypted. The packet headers which  contain information about who the packet is addressed to and who it is  from. The reasons for this are similar to why you might write a letter  in code, but you would not write the envelope in code. In an unencrypted  network the whole packet is sent in clear text including the envelope  and contents. The difference between these analogies and how a real  network works though is that to read the envelope you need to physically  obtain it and there is only one copy. A wireless network broadcasts  everything to everyone within 100 meters.</p>
<p>This isn&#8217;t really a problem if your network is encrypted as people will  not be able to read it easily. If however your network is not encrypted  its the equivalent of yelling out everything that you type into and read  from your PC. Almost all banking websites will ask your PC to use extra  encryption, but many other sites will not. So anyone in a 100 meter  range of your computer or access point can watch everything you do on  your computer.</p>
<p>What Google were trying to do was get a list of the locations of these  access points. So they would have captured the headers of all packets  they saw, grabbed the wireless routers address out of it and marked its  location on a map. Except according to them they accidentally put code in  that captured the whole packet. This meant that for all the unencrypted  networks the Google Street View cars drove past they may have captured  private information.</p>
<p>There is a class action in Germany against Google for capturing this  data, and more can be expected elsewhere soon. Suing Google for this is  like walking in to a public place, yelling out a bunch of private  information and then suing anyone who happened to be recording at the  time, or suing someone for writing down smoke signals you send to someone from the top of a mountain. If your  access point is sending data unencrypted then every wireless device  within 100 meters cannot help but hear your data, you&#8217;re just lucky most  will ignore it.</p>
<p>If you really cared about your privacy you would at least make some  attempt to restrict others access to your data. Not knowing is much an  excuse as not knowing people were recording in that shopping mall. Don&#8217;t  take your privacy for granted, check whether your network is encrypted,  and if you don&#8217;t know how, get someone who does. Ignorance is not an  excuse! This time it was Google, the next time it could be an identity  thief.</p>
<p><strong>Random Thought:</strong> If privacy is so important to people at the moment, what&#8217;s with all the data on Facebook?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/06/googles-privacy-bungle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cross-Domain AJAX</title>
		<link>http://www.danielhall.me/2010/05/cross-domain-ajax/</link>
		<comments>http://www.danielhall.me/2010/05/cross-domain-ajax/#comments</comments>
		<pubDate>Tue, 04 May 2010 21:21:58 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Web Programming]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=499</guid>
		<description><![CDATA[<p>When making an xmlhttprequest from a website the browser will restrict you to the site from which the script came. This is a security precaution. If sites were able to tell the browser to make requests from other domains then they would be able to DDOS a site with a users browser. There are legitimate [...]]]></description>
			<content:encoded><![CDATA[<p>When making an xmlhttprequest from a website the browser will restrict you to the site from which the script came. This is a security precaution. If sites were able to tell the browser to make requests from other domains then they would be able to DDOS a site with a users browser. There are legitimate reasons to make requests to other sites though.</p>
<p>Many sites offer web services, xml data and json encoded data. These can provide almost anything from the weather, to search results, to advanced APIs. To use these services from your site using javascript you&#8217;ll have to employ one of the methods below.</p>
<h1>Signing Javascript</h1>
<p>Firefox allows you to sign your Javascript and place it in a jar file. This will give your code more privileges, You can also request these permissions explicitly without having your code signed, but having a dialog box appear for every AJAX request could get very tiring for the user. Another problem with this approach is that it isn&#8217;t documented very well and its Firefox specific. The first link in the references section deals with this method.</p>
<h1>Access-Control Headers</h1>
<p>This is the w3 approved method of allowing a client from another domain to access your web service. It is a server side method and requires no changes on the client to implement. This is both and advantage and a disadvantage. If you have control over the server then this method is simple, otherwise (for sites such as Yahoo API or other public services) you will not be able to implement this. It should also be noted that this was implemented in Firefox 3.5 so it can&#8217;t be used with earlier versions, or other browsers.</p>
<p>To use this method you tell your service to output extra headers that tell the browser whether access was allowed or denied.</p>
<h1>Flash Enabled xmlhttprequest</h1>
<p>This method involves using an invisible flash player to perform the actual request then handing the result back to the Javascript for processing. Flash still performs permission checking by looking for a /crossdomain.xml file in the root directory of the domain the request is being made to. There are several libraries that implement this approach and a few even implement in a way which is compatible with xmlhttprequest. One downside is this Flash is required, though recently Flash is required for several major sites and most browsers will have it installed.</p>
<h1>Add Sites To Trusted Zone</h1>
<p>Internet Explorer allows and denies cross-domain based xmlhttprequests based on the security setting. This approach is likely not going to be used on the Internet as it requires user interaction and is Internet Explorer specific. On a corporate Intranet this is slightly less difficult but not by much.</p>
<h1>Apache mod_proxy</h1>
<p>With this method you use the same server you shared the page from to proxy the requests automatically to the server with the data you&#8217;re fetching. For this to work your version of Apache has to be compiled with proxy support or you need to have the mod_proxy dso loaded. This method increases the latency of requests as they must first go via your server. It should also be noted that this cannot be implemented in .htaccess file and must be done in the main configuration.</p>
<h1>Manual Proxy</h1>
<p>If you don&#8217;t have control over your servers configuration then you can mimic the above method by writing a script that forwards the variables required and forwards back the data. This approach can even be more preferable than the above method as it allows you to preprocess the variables and cache the data if required.</p>
<h1>References</h1>
<p><a href="http://www.mozilla.org/projects/security/components/signed-scripts.htm">http://www.mozilla.org/projects/security/components/signed-scripts.htm</a>l</p>
<p><a href="http://dev.w3.org/2006/waf/access-control/">http://dev.w3.org/2006/waf/access-control/</a></p>
<p><a href="http://developer.yahoo.com/javascript/howto-proxy.html">http://developer.yahoo.com/javascript/howto-proxy.html</a></p>
<p><a href="https://developer.mozilla.org/En/HTTP_Access_Control">https://developer.mozilla.org/En/HTTP_Access_Control</a></p>
<p><a href="http://ejohn.org/blog/cross-site-xmlhttprequest/">http://ejohn.org/blog/cross-site-xmlhttprequest/</a></p>
<p><a href="http://ajaxpatterns.org/XMLHttpRequest_Call">http://ajaxpatterns.org/XMLHttpRequest_Call</a></p>
<p><a href="http://ajaxpatterns.org/Flash-enabled_XHR">http://ajaxpatterns.org/Flash-enabled_XHR</a></p>
<p><strong>Random Thought:</strong> Can you use AJAX to make web applications cleaner?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/05/cross-domain-ajax/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Using EncFS to encrypt your files</title>
		<link>http://www.danielhall.me/2010/04/using-encfs-to-encrypt-your-files/</link>
		<comments>http://www.danielhall.me/2010/04/using-encfs-to-encrypt-your-files/#comments</comments>
		<pubDate>Tue, 27 Apr 2010 20:53:38 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Encryption]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=546</guid>
		<description><![CDATA[About EncFS
<p>EncFS is an encrypted filesystem based on FUSE. It transparently encrypts files stored in it and places them on another volume. This is in contrast to block level encrypted filesystems which transparently encrypt the data under the filesystem layer as it is being written to disk. Think of EncFS as a bind mount, except [...]]]></description>
			<content:encoded><![CDATA[<h1>About EncFS</h1>
<p>EncFS is an encrypted filesystem based on FUSE. It transparently encrypts files stored in it and places them on another volume. This is in contrast to block level encrypted filesystems which transparently encrypt the data under the filesystem layer as it is being written to disk. Think of EncFS as a bind mount, except that the source for the mount is encrypted and the place it is mounted to is the only place it is available unencrypted.</p>
<p>The main advantage of EncFS filesystems is that when backing up only the files which have changed need to be backed up. This means it works perfectly with tools such as rsnapshot. Another advantage is that the filesystem doesn&#8217;t need a block of disk allocated to it and will shrink and expand as the files inside change.</p>
<p>Finally because this is all implemented with FUSE it is all done in userspace. No root access is required (apart from setting FUSE up) to create and alter encfs filesystems.</p>
<h2>Setting Up an EncFS Volume</h2>
<p>So the first thing you need to do to setup an encfs volume is to install FUSE and EncFS. If you don&#8217;t have root access you will have to ask your sysadmin to do this for you, otherwise follow your distribution specific method of installing new packages. On Fedora it is called &#8216;fuse-encfs&#8217; and on Debian/Ubuntu its called &#8216;encfs&#8217;. On some older systems users wishing to use FUSE may need to be added to the correct group.</p>
<p>First you need to decide where you will put the encfs volume, and where you&#8217;ll mount it. I usually put mine in /home/daniel/.crypt and mount it to /home/daniel/crypt. But feel free to name it whetever you want. When you&#8217;ve decided run the EncFS with those arguments, for example to use the example I specified it would look like this:</p>
<pre class="brush: plain;">
&lt;daniel@server ~&gt;$ encfs /home/daniel/.crypt /home/daniel/crypt
The directory &quot;/home/daniel/.crypt/&quot; does not exist. Should it be created? (y,n) y
The directory &quot;/home/daniel/crypt&quot; does not exist. Should it be created? (y,n) y
Creating new encrypted volume.
Please choose from one of the following options:
 enter &quot;x&quot; for expert configuration mode,
 enter &quot;p&quot; for pre-configured paranoia mode,
 anything else, or an empty line will select standard mode.
?&gt;

Standard configuration selected.

Configuration finished.  The filesystem to be created has
the following properties:
Filesystem cipher: &quot;ssl/aes&quot;, version 2:2:1
Filename encoding: &quot;nameio/block&quot;, version 3:0:1
Key Size: 192 bits
Block Size: 1024 bytes
Each file contains 8 byte header with unique IV data.
Filenames encoded using IV chaining mode.
File holes passed through to ciphertext.

Now you will need to enter a password for your filesystem.
You will need to remember this password, as there is absolutely
no recovery mechanism.  However, the password can be changed
later using encfsctl.

New Encfs Password:
Verify Encfs Password:
</pre>
<p>As you can see the directories don&#8217;t need to be created first. There is also a prompt for what security settings you want to use. Hitting enter will give you standard settings, but for something more powerful you should hit &#8216;p&#8217; then enter. You can now proceed to place files in /home/daniel/crypt and they will be encrypted and placed into /home/daniel/.crypt. If you don&#8217;t believe me go ahead and check.</p>
<p>See? I told you so. Now you can unmount it using &#8216;fusermount -u /home/daniel/crypt&#8217; and mount it again using <span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;">encfs /home/daniel/.crypt /home/daniel/crypt and typing your password.</span></p>
<p><strong>Random Thought:</strong> When travelling to other countries, local laws may mean that customs can search your laptop, including encrypted filesystems. You may have to reveal your key, or be arrested.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/04/using-encfs-to-encrypt-your-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Australian Mandatory Internet Filter</title>
		<link>http://www.danielhall.me/2010/04/the-australian-mandatory-internet-filter/</link>
		<comments>http://www.danielhall.me/2010/04/the-australian-mandatory-internet-filter/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 09:39:40 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[The Internet]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[No Clean Feed]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=564</guid>
		<description><![CDATA[<p>I&#8217;m ashamed that in today&#8217;s society I have to begin this post with this paragraph but I have to nonetheless. For the record I am absolutely opposed to child pornography, bestiality, sexual violence and rape. I am abhorred that people are involved in the production and distribution of such material and I strongly feel that [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m ashamed that in today&#8217;s society I have to begin this post with this paragraph but I have to nonetheless. For the record I am absolutely opposed to child pornography, bestiality, sexual violence and rape. I am abhorred that people are involved in the production and distribution of such material and I strongly feel that these people need to be brought to justice. I feel strongly that the government needs to implement measures to catch and prosecute these people and to make such material impossible to produce or distribute. I do however believe that the Mandatory Internet Filter as proposed by Steven Conroy is the wrong way to go about this.</p>
<p>The Internet filter, quite simply put is technically infeasible. The filter will work by directing all requests from Australian users towards a site containing RC content to a filtering device. This device then relays all requests to that site to the actual server, unless a requests is made for a blocked page, which will instead return a page indicating the site is blocked. This is similar to the way the firewall in China and other countries with a national Internet filter. This method is effective in that it is often 100% effective (which means that every page on the blocked list is blocked, with no false positives) when done right. There is a problem however, this method does not scale well. If the government were to block a page on a large site (as was attempted to Wikipedia in the UK) then the filter would not be able to handle the load. Secondly it appears to the administrators of that site that all requests are coming from a few IP adresses. This could cause Wikipedia to eventually block all Australians either because the requests will look similar to a DDOS or because they have no way to distinguish between users and need to prevent abuse. Although the filter may be 100% accurate at blocking web traffic it will not be capable of dealing with many other varieties of Internet data.</p>
<p>The proposed filter will only be capable of filtering standard web traffic from web browsers. The Internet consists of a large number of computers talking in any number of protocols. While web traffic is one of these there are many other ways to exchange information. This filter will not be capable of filtering email, bit torrent, edonkey, gnutella, XMPP, DDC, SSH, VPN, TOR and that is only naming a small portion. Many people caught to have been in possession of child pornography and other illegal content are found to have downloaded it via peer to peer technology. This is because standard web traffic makes it easy to trace and identify the owner, where as peer to peer traffic can be hidden much easier. Secondly web traffic can be &#8216;tunnelled&#8217; or hidden inside these other protocols and this way completely bypass the filter. This means anyone with sufficient knowledge or five minutes to learn will be able to configure their PC to hide their data amongst an SSH or VPN connection. These technical arguments come from my experience as a systems Administrator, but there are other arguments not so technical.</p>
<p>Steven Conroy has said that the filter will only deal with RC rated content, however there is no transparency about what will be blocked. The government can&#8217;t publish a list of sites that are blocked because that will effectively give people looking for this content a list of places to find it. Without knowing what sites are being blocked we won&#8217;t know if or when the government decides that they would like to start blocking sites that are debating for or against abortion, euthanasia or any other politically sensitive topic. It may be interesting to know that the definition for RC content includes pages instructing in any crime, which would include euthanasia. A representative for Steven Conroy has specifically stated the filter won&#8217;t be filtering pages related to euthanasia but because of this broad definition it could be changed at any time and we wouldn&#8217;t know until after the material was blocked.</p>
<p>I am a Unix Systems Administrator, and for the reasons listed above, and more covered better by other bloggers, I am opposed to the filter proposed by Senator Steven Conroy and the Labor government. I urge my readers who are also opposed to the filter to write to your local MP, to Senator Conroy, to Tony Smith (Shadow Minister Minister for Broadband, Communications<br />
and the Digital Economy). If all else fails and the Government does not see sense then use your vote. The filter will not work and will waste taxpayer money that could be used in many better ways.</p>
<p><strong>Random Thought:</strong> Will posting instructions about how to bypass the filter be illegal?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/04/the-australian-mandatory-internet-filter/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Google G1: Six Months On</title>
		<link>http://www.danielhall.me/2010/03/google-g1-six-months-on/</link>
		<comments>http://www.danielhall.me/2010/03/google-g1-six-months-on/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 09:20:09 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[SSH]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=559</guid>
		<description><![CDATA[<p>So six months ago I bought my Google G1, my first impressions were excited and extremely positive. Has this phone stood the test of time though?</p>
Physically
<p>The phone is still in good physical condition, which is more than I could have said about my old XDA Atom Flame after six months. There are a few scratches [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight: normal;">So six months ago I bought my Google G1, my first impressions were excited and extremely positive. Has this phone stood the test of time though?</span></p>
<h1>Physically</h1>
<p>The phone is still in good physical condition, which is more than I could have said about my old XDA Atom Flame after six months. There are a few scratches on the screen, but I bought a screen protector for it so I can simply peel them off. Surprisingly the various crevices on the phone have avoided build ups of dust which commonly plagues my phones. The battery is beginning to fade, and can only last me around 12 hours with my ordinary usage (which is probably considered heavy usage). This makes weekends away from home interesting as I have to avoid using my phone to stretch the battery over 24 hours.</p>
<p>When I first got the phone I expected that the keyboard keys would fade, or that the keyboard snap mechanism would somehow break. I was wrong, the keys are still as visible as when I first got it, and the snap mechanism still works perfectly.</p>
<h1>The OS</h1>
<p>In the time I&#8217;ve had this phone Android has gone from 1.1 to 2.0. Sadly there haven&#8217;t been any official new releases of the phone software. There have however been releases of the well known mod for this phone called &#8216;CyanogenMod&#8217;. Currently CyanogenMod is at Android version 1.5 with parts of 2.0 ported across.</p>
<p>Since the first week I had the phone I&#8217;ve been using CyanogenMod and have seen the improvements in it take it from strength to strength. Originally it looks almost the exact same as the original OS but now it includes several features that I could not live without. My favorites would be:</p>
<ul>
<li>Tethering to my Linux PC</li>
<li>OpenVPN settings</li>
<li>360 degree rotation</li>
<li>Improved contacts screen with direct call links</li>
<li>Voice Search</li>
</ul>
<h1>The Applications</h1>
<p>Like any mobile OS the best part is the applications. This is where an OS either make it or breaks it. While Google have been constantly improving the Android platform old apps have remained around and stayed compatible with the phone. Google has also held two developer competitions during the time I&#8217;ve had the phone which has brought loads of new apps and innovation. So as each application is its own entity I&#8217;m going to review my favorites separately.</p>
<h2>Google Maps</h2>
<p>When I got the phone Google Maps was simply a map, with limited search capability and able to give directions. Since then however Google have added Street View, Navigation (US Only sadly), Buzz and much better searching. For something I used once a month I now use it almost daily.</p>
<h2>ConnectBot</h2>
<p>One of the reasons I went for a phone with a hardware keyboard was to make SSHing into my Linux machines easier. ConnectBot handles this perfectly. I cannot stress enough how useful this application is. Recently it has been improved to include support for SSH agents too which improved things even further.</p>
<h2>My Tracks</h2>
<p>As someone who enjoys hiking and walking having a GPS logger can be extremely useful. My Tracks basically turns your Android phone into a GPS logger and displays the data for you on a map. It also allows you to export the logs in popular formats or simply upload them to My Maps on Google. It can also graph your elevation, speed and display interesting statistics.</p>
<h1>Conclusion</h1>
<p>All up I still enjoy this phone, and still use it daily. I am looking at moving to either an N900 or the Google Nexus One next. I haven&#8217;t moved because the N900 has been having trouble with the USB connectors breaking off, and the Nexus One is too expensive to import into Australia. I doubt I&#8217;ll be moving to another phone any time soon and this phone doesn&#8217;t look like it will give out any time in the near future.</p>
<p><strong>Random Thought:</strong> What is the cell phone market going to look like five years from now? And where the hell is my wristwatch phone?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/03/google-g1-six-months-on/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fingerprint readers and PC security</title>
		<link>http://www.danielhall.me/2010/02/fingerprint-readers-and-pc-security/</link>
		<comments>http://www.danielhall.me/2010/02/fingerprint-readers-and-pc-security/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 11:16:34 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Security]]></category>
		<category><![CDATA[Biometrics]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=508</guid>
		<description><![CDATA[How fingerprint readers work
The user sees
<p>You register your fingerprint using the built in reader and it saves it as your password. Next time you go to login you choose your username, swipe your finger and the PC verifies it against the one you scanned last time. If it matches then the computer logs you in.</p>
What [...]]]></description>
			<content:encoded><![CDATA[<h1>How fingerprint readers work</h1>
<h3>The user sees</h3>
<p>You register your fingerprint using the built in reader and it saves it as your password. Next time you go to login you choose your username, swipe your finger and the PC verifies it against the one you scanned last time. If it matches then the computer logs you in.</p>
<h3>What actually happens</h3>
<ol>
<li>You open up the fingerprint reader application on your laptop, it adds hooks into the Windows login system (Credential Providers).</li>
<li>You scan in one or more fingers and register them to your account.</li>
<li>The application stores the fingerprints for later use, some will even <a href="http://www.pcworld.com/article/124978/researcher_hacks_microsoft_fingerprint_reader.html">store them unencrypted</a>.</li>
<li>When the user goes to login next time they select their username and scans a finger.</li>
<li>The fingerprint reader takes the scan and compares it to the previous scan</li>
<li>If the scan matches one of the stored scans then the user is authenticated</li>
</ol>
<h1>Why its not secure</h1>
<p>How often do you write down your password? If you do where would you leave it? Now think about your fingerprint. Where would you leave your fingerprint? In general people don&#8217;t constantly where gloves and end up leaving fingerprints all over the place, on glasses, door handles, keyboards, touch screens and mobiles. It is a little bit harder to copy a fingerprint but security by obscurity is not an excuse. So it can be argued that a password is more secure (in that its harder to obtain) than a fingerprint.</p>
<p>Most fingerprint authentications allow you to use either your fingerprint, or your password. This effectively doubles the possible attack vectors for trying to get into the system. A malicious attacker can now either use a dictionary attack against your password, a fingerprint based attack against the fingerprint reader, or look for holes in either system.</p>
<h1>Why it may actually endanger you</h1>
<p>Do you know how the fingerprint reader is storing your fingerprints? Is it storing them as bitmaps, as a collection of swirls and whorls or as a md5 hash or some key identifiable features? If you can&#8217;t answer that question with 100% certainty then you should be concerned. If someone managed to hack your machine and retrieve bitmaps of your fingerprints then they could use them to open any other fingerprint locks you have, or implicate you in a crime.</p>
<p>Finally if someone is determined enough to break a law to hack your computer they could simply cut off your fingers to gain access to your PC. Of course if the fingerprint sensor has a warmth sensor they might need to microwave them first. I would hope though that you keep something that sensitive or valuable under all sorts on encryption and armed guards.</p>
<p>Don&#8217;t rely on fingerprint readers for added security, that is quite simply not the case. Fingerprint readers are primarily for convenience, and they could put your security and your wellbeing in danger.</p>
<p><strong>Random Thought:</strong> What is this obsession with altering perfectly fine machines to remove an component that never bothers anyone? Dyson has the bladeless fan, and recently we&#8217;re seeing the spokeless bike. Have you ever looked at a fan and said: &#8220;Those blades really make that fan so annoying!&#8221;?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/02/fingerprint-readers-and-pc-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Writing a Daemon in C</title>
		<link>http://www.danielhall.me/2010/01/writing-a-daemon-in-c/</link>
		<comments>http://www.danielhall.me/2010/01/writing-a-daemon-in-c/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 12:14:35 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Daemon]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Unix]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=466</guid>
		<description><![CDATA[What is a Daemon?
<p>A daemon is a program that runs in the background. A daemon will usually be started at system startup and end at system shutdown. The exceptions to this rule are programs like the Bluetooth SDP daemon, which is activated when a new Bluetooth HCI is found,, and ends when it is removed. [...]]]></description>
			<content:encoded><![CDATA[<h2>What is a Daemon?</h2>
<p>A daemon is a program that runs in the background. A daemon will usually be started at system startup and end at system shutdown. The exceptions to this rule are programs like the Bluetooth SDP daemon, which is activated when a new Bluetooth HCI is found,, and ends when it is removed. Daemons run transparently and do not normally interact with the user directly.</p>
<p>Daemons start as ordinary processes but they eventually &#8216;fork and die&#8217; to start running in the background. Some daemons do only the &#8216;fork and die&#8217; step but ignore other important steps. Here is a list of what a daemon should do:</p>
<ol>
<li>Fork to create a child, and exit the parent process.</li>
<li>Change the umask so that we aren&#8217;t relying on the one set in the parent.</li>
<li>Open logs to write to in the case of an error.</li>
<li>Create a new session id and detach from the current session.</li>
<li>Change the working directory to somewhere that won&#8217;t get unmounted.</li>
<li>Close STDIN, STDOUT and STDERR.</li>
</ol>
<p>These steps ensure that our association with the calling environment is destroyed and our daemon is now free to run as a completely separate process.</p>
<p>Lastly before writing the daemon you should make sure the code is written securely and in a way that fails gracefully. If your daemon crashes it will not be able to prompt the user about what action to take. The user may not even notice until it is too late.</p>
<h2>Forking a child process</h2>
<p>In Unix fork() is the only system call with two return values. When you call fork a child process is created which is a near copy of its parent (some things will be different in the child eg. process id). The fork command then returns a 0 in the child and the childs process id in the parent, on failure a -1 is sent to the parent. Generally a program will then check whether it is the child or parent by these return values (just like in movies when a cloned character will check to see if he has a belly button and hence is the original). Here is a snippet of code to do this:</p>
<pre class="brush: cpp;">
pid_t pid;

/* Clone ourselves to make a child */
pid = fork(); 

/* If the pid is less than zero,
   something went wrong when forking */
if (pid &lt; 0) {
    exit(EXIT_FAILURE);
}

/* If the pid we got back was greater
   than zero, then the clone was
   successful and we are the parent. */
if (pid &gt; 0) {
    exit(EXIT_SUCCESS);
}

/* If execution reaches this point we are the child */
</pre>
<h2>Changing the umask</h2>
<p>Because we are a clone of our parent we&#8217;ve inherited its umask. This means the child doesn&#8217;t know what permissions files will end up with when it tries to create them. We do this by simply calling umask like this:</p>
<pre class="brush: cpp;">
/* Set the umask to zero */
umask(0);
</pre>
<h2>Open logs to write to</h2>
<p>This part can be done in several different ways. You could open text files, log to a database or use syslog. The method I&#8217;m going to demonstrate here is to log using syslog. Syslog sends your log messages to a system wide logger, where they can be configured to be written to a file, send to a network server or filtered away entirely.</p>
<pre class="brush: cpp;">
/* Open a connection to the syslog server */
openlog(argv[0],LOG_NOWAIT|LOG_PID,LOG_USER); 

/* Sends a message to the syslog daemon */
syslog(LOG_NOTICE, &quot;Successfully started daemon\n&quot;); 

/* this is optional and only needs to be done when your daemon exits */
closelog();
</pre>
<h2>Create a new session id</h2>
<p>Each process on a Unix system is a member of a process group (or session). The id of each group is the process id of its owner. When we forked from our parent earlier we will have inherited its process group, and our process group leader will still be its parent process. We want to create our own process group and become our own process leader otherwise we will look like an orphan. We can do this easily as follows:</p>
<pre class="brush: cpp;">
pid_t sid;

/* Try to create our own process group */
sid = setsid();
if (sid &lt; 0) {
    syslog(LOG_ERR, &quot;Could not create process group\n&quot;);
    exit(EXIT_FAILURE);
}
</pre>
<h2>Changing the working directory</h2>
<p>At the moment we have the working directory we inherited from our parent. This working directory could be a network mount, a removable drive or somewhere the administrator may want to unmount at some point. To unmount any of these the system will have to kill any processes still using them, which would be unfortunate for our daemon. For this reason we set our working directory to the root directory, which we are sure will always exist and can&#8217;t be unmounted.</p>
<pre class="brush: cpp;">
/* Change the current working directory */
if ((chdir(&quot;/&quot;)) &lt; 0) {
    syslog(LOG_ERR, &quot;Could not change working directory to /\n&quot;);
    exit(EXIT_FAILURE);
}
</pre>
<h2>Closing the standard file descriptors</h2>
<p>A daemon doesn&#8217;t interact with the user directly it has no use for STDIN, STDOUT and STDERR and we really have no idea where these are connected or where anything we write to them will end up. As these file descriptors are not required and effectively useless we should close them to save some system resources and prevent any related security problems. We close these descriptors like this:</p>
<pre class="brush: cpp;">
/* Close the standard file descriptors */
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
</pre>
<h2>Writing the payload</h2>
<p>Now you have a C program that is capable of becoming a daemon, but its a pretty useless daemon if it exits immediately. Payload code is really up to you to design. I&#8217;ll offer you a few tips on designing your payload.</p>
<ul>
<li>Put your payload in a loop. Generally in a daemon you want to perform the same action over and over again until you&#8217;re killed. If you have to cleanup (such as closing syslog) when the daemon is about to be killed you should add an exit clause that will be activated by a SIGTERM signal handler.</li>
<li>Make your code as fast an efficient as possible. This is something you should do with any program, but with daemons it is important that you do not hamper the performance of the rest of the system. This is especially true if you&#8217;re going to be running this daemon on desktop systems.</li>
<li>Be aware that your code may be preempted very often. As your daemon is going to be running for the amount of time the system is up, it is likely that its execution will be preempted.</li>
<li>Be paranoid about security. Daemons are common attack vectors and can be used to gain privileged access to a system. You should consider dropping any privileges that you don&#8217;t require.</li>
</ul>
<h2>Conclusion</h2>
<p>So if we take all the code I&#8217;ve mentioned in this post and put it all together you have a simple daemon. You can download the source from the link here: <a href='http://www.danielhall.me/wp-content/uploads/2010/01/daemon.c'>daemon.c</a>.<br />
If your daemon is only going to be run on Linux and not on a System V style system such as Solaris you can use the <a href="http://www.manpagez.com/man/3/daemon/">daemon</a> function to do a lot of this work for you.</p>
<h2>References</h2>
<p><a href="http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html">Linux Daemon Writing HOWTO in C</a><br />
<a href="http://blog.emptycrate.com/node/219">Linux Daemon writing in C++</a></p>
<p><strong>Random Thought:</strong> It appears the <a href="http://objectiveministries.org/creation/propaganda.html#">devil uses a Unix</a> based OS, probably OSX.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2010/01/writing-a-daemon-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Paramaterized Java Classes</title>
		<link>http://www.danielhall.me/2009/10/paramaterized-java-classes/</link>
		<comments>http://www.danielhall.me/2009/10/paramaterized-java-classes/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 03:01:22 +0000</pubDate>
		<dc:creator>Daniel</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[HOWTO]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Type Safety]]></category>

		<guid isPermaLink="false">http://www.danielhall.me/?p=364</guid>
		<description><![CDATA[<p>One of the biggest features of Java 1.5 was generics. In particular all the collection classes had been extended to use parametrized classes. Normally the collection classes accepted and returned Objects which is the class all other Java classes descend from. Unfortunately this meant that you had to cast everything you got back out of [...]]]></description>
			<content:encoded><![CDATA[<p>One of the biggest features of Java 1.5 was generics. In particular all the collection classes had been extended to use parametrized classes. Normally the collection classes accepted and returned Objects which is the class all other Java classes descend from. Unfortunately this meant that you had to cast everything you got back out of a collection to what you expected it to be. and until you did you would only be able to call methods that were provided by Object. You also had to be ready to catch an exception in case the class could not be cast because it was the wrong object.</p>
<p>Generics and parametrized classes allow Java programmers to place a type on a class and have that type inherited by its methods. For example you can now declare an ArrayList class with a type String. This alters the ArrayList class so that its add method now only accepts objects of type String, the get method now also returns objects of type String. This makes everything type safe which means you don&#8217;t have to cast anything and your code won&#8217;t compile if you try to put something in the ArrayList that doesn&#8217;t match its class.</p>
<p>Java uses parametrized classes to build its collections and you&#8217;ll want to use them too if you&#8217;re making your own collection class. For example if you were implementing a stack, a queue or a multi-priority FIFO queue are good cases for parametrized classes. Be careful though of the lure parametrized classes can have. They are not a replacement for polymorphism and shouldn&#8217;t be used when polymorphism would make more sense. For example if your multi-priority queue gets the priority out of the object itself then you&#8217;d need an interface that provides a method to get the priority. Then your class will only be able to accept items that implement that interface, which makes sense in this case as we need to priority to be able to store it.</p>
<p>A parametrized class is really simple to use. Here is an example implementation of a stack collection backed by an ArrayList:</p>
<pre class="brush: java;">import java.util.ArrayList;
import java.util.Collection;

/**
 * This class acts as a stack. Items can be 'pushed' which adds them to the top
 * of the stack. items can also be 'popped' which removes and returns the top
 * item on the stack and removes it. This means only the most recently added
 * item is available at the current time. To get to older items you need to
 * first remove the others.
 *
 * Note: Java already has a stack object that should probably be used in
 *       preference to this one. This is only an example implementation.
 *
 * @author Daniel Hall &lt;daniel@danielhall.me&gt;
 *
 * @param &lt;T&gt; The type of items that can be stored in the Stack.
 */
public class Stack&lt;T&gt; {
	/* Uses the same type as this class to store the items */
	private ArrayList&lt;T&gt; array = new ArrayList&lt;T&gt;();

	/**
	 * Creates a Stack containing items already in a collection. The collection
	 * must have the same parameterized type as this class to ensure that we get
	 * the right objects.
	 * @param c The Collection to initialize with
	 */
	public Stack(Collection&lt;T&gt; c) {
		array.addAll(c);
	}

	/**
	 * Creates an empty Stack object
	 */
	public Stack() {

	}

	/**
	 * Adds an item to the top of the stack.
	 * @param item The item which will be added to the top of the stack.
	 */
	public void push(T item) {
		array.add(item);
	}

	/**
	 * Removes the first item from the stack
	 * @return The item that was on the top of the stack.
	 */
	public T pop() {
		/* This gets the size so we don't have to do it twice. */
		int count = array.size();

		/* If the stack is empty return null, note that the Java implementation
		 * of stack throws an Exception instead.
		 */
		if (count == 0) {
			return null;
		}

		/* Remove the last added object (which will have index count - 1) */
		return array.remove(count - 1);
	}
}</pre>
<p><strong>Random thought: </strong><a href="http://www.cse.unsw.edu.au/JohnLions/">John Lions</a> wrote a book about the Unix source code, in the seventies, which because it also included some code, was blocked from being published until 1996.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.danielhall.me/2009/10/paramaterized-java-classes/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
