<?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"
	>

<channel>
	<title>Fotinakis.com Blog</title>
	<atom:link href="http://fotinakis.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://fotinakis.com/blog</link>
	<description></description>
	<pubDate>Fri, 13 Jun 2008 02:44:59 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6-bleeding2</generator>
	<language>en</language>
			<item>
		<title>Google I/O 2008 Pageview Limit Exceeded</title>
		<link>http://fotinakis.com/blog/2008.06.12/google-io-2008-pageview-limit-exceeded/</link>
		<comments>http://fotinakis.com/blog/2008.06.12/google-io-2008-pageview-limit-exceeded/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 20:15:58 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Google]]></category>

		<category><![CDATA[Humor]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[conference]]></category>

		<category><![CDATA[googleio]]></category>

		<category><![CDATA[io2008]]></category>

		<category><![CDATA[videos]]></category>

		<guid isPermaLink="false">http://fotinakis.com/blog/?p=28</guid>
		<description><![CDATA[Ok ... now this is just funny. Quick disclaimer: I love Google. And not just in some nebulous, fanboy way. Through my work with Utah State University I've been able to meet and work with some of the brilliant engineers who work there and I greatly respect the work they are doing for the open [...]]]></description>
			<content:encoded><![CDATA[<p>Ok ... now this is just funny. Quick disclaimer: I love Google. And not just in some nebulous, fanboy way. Through my work with Utah State University I've been able to meet and work with some of the brilliant engineers who work there and I greatly respect the work they are doing for the open web. I also went to Google I/O 2008 and had an incredible time at the conference. I've been waiting for the videos to be posted online so that I could create some posts and link to the actual session videos. They just came up! At least, for a moment.</p>
<p>I just got an email saying "Thanks for joining us at Google I/O" and a link to the <a href="http://sites.google.com/site/io/">videos of all the sessions</a>, hosted on a Google Sites page. I was able to view a couple of the videos, and then...</p>
<p style="text-align: center;"><img class="aligncenter" title="Google IO pwnd" src="http://fotinakis.com/blog/wp-content/uploads/google_io_pwnd.png" alt="Google IO pwnd" /></p>
<p style="text-align: left;"><strong>Google exceeded their own page limit.</strong> Awesome.<br />
I'm sure they'll get it fixed soon, but the irony is unbeatable.</p>
]]></content:encoded>
			<wfw:commentRss>http://fotinakis.com/blog/2008.06.12/google-io-2008-pageview-limit-exceeded/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Apple Mail and Gmail IMAP: &#8220;Invalid Credentials&#8221; Fix</title>
		<link>http://fotinakis.com/blog/2008.06.01/apple-mail-and-gmail-imap-invalid-credentials-fix/</link>
		<comments>http://fotinakis.com/blog/2008.06.01/apple-mail-and-gmail-imap-invalid-credentials-fix/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 04:34:27 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://fotinakis.com/blog/?p=24</guid>
		<description><![CDATA[For anyone else out there trying to set up Apple Mail to check their Gmail account and getting an "Invalid credentials" error:
You may need to unlock CAPTCHA for your Gmail account:
https://www.google.com/accounts/UnlockCaptcha
Just go to that page, fill out your information and everything should work. I'm not sure if there are larger ramifications of doing this, but [...]]]></description>
			<content:encoded><![CDATA[<p>For anyone else out there trying to set up Apple Mail to check their Gmail account and getting an "Invalid credentials" error:</p>
<p>You may need to unlock CAPTCHA for your Gmail account:<br />
<a href="https://www.google.com/accounts/UnlockCaptcha">https://www.google.com/accounts/UnlockCaptcha</a></p>
<p>Just go to that page, fill out your information and everything should work. I'm not sure if there are larger ramifications of doing this, but I suspect it's not much of an issue. Any ideas on the security implications? Reading around on Google Groups and the Apple Forums it also seems like this issue may also affect the iPhone as well. I hope this helps if you're having that issue.</p>
]]></content:encoded>
			<wfw:commentRss>http://fotinakis.com/blog/2008.06.01/apple-mail-and-gmail-imap-invalid-credentials-fix/feed/</wfw:commentRss>
		</item>
		<item>
		<title>uNUI - Building a Multi-touch Table</title>
		<link>http://fotinakis.com/blog/2008.04.06/unui/</link>
		<comments>http://fotinakis.com/blog/2008.04.06/unui/#comments</comments>
		<pubDate>Sun, 06 Apr 2008 17:00:41 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Multi-touch]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[FTIR]]></category>

		<category><![CDATA[interface design]]></category>

		<category><![CDATA[NUI Group]]></category>

		<guid isPermaLink="false">http://fotinakis.com/blog/?p=17</guid>
		<description><![CDATA[My newest project: breaking interface boundaries. A couple of my friends at work and I have decided to build a multi-touch table based on the technique of frustrated total internal reflection (FTIR). This can be described by a diagram easier than words, so here we go:

Graphic from Tim Roth's Multi-touch Dev Blog

This design for multi-touch [...]]]></description>
			<content:encoded><![CDATA[<p>My newest project: breaking interface boundaries. A couple of my friends at work and I have decided to build a multi-touch table based on the technique of frustrated total internal reflection (FTIR). This can be described by a diagram easier than words, so here we go:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-23" title="FTIR Diagram" src="http://fotinakis.com/blog/wp-content/uploads/ftir_diagram.png" alt="" width="589" height="377" /><br />
Graphic from Tim Roth's <a title="Tim Roth's Blog" href="http://iad.projects.zhdk.ch/multitouch/">Multi-touch Dev Blog</a><a title="180" href="http://www.timroth.de/180/page5/page5.html"><br />
</a></p>
<p>This design for multi-touch interfaces has been popularized by <a title="Jeff Han FTIR Multi-touch" href="http://cs.nyu.edu/~jhan/ftirtouch/index.html">Jeff Han</a>, a researcher from NYU. Infrared LEDs are placed around two sides of a sheet of acrylic, causing the IR light to be reflected within it. Then, when a finger or object touches it, the light is "frustrated" and refracts off of the object and out of the acrylic. An IR camera below the screen then sees this as a blob of IR light which can be interpreted by a computer for recognition of gestures, touches, and movement.</p>
<p><a href="http://unui.org"><img class="alignleft size-full wp-image-20" style="float: left;" title="uNUI" src="http://fotinakis.com/blog/wp-content/uploads/unui.png" alt="" width="202" height="111" /></a>This is a very exciting and fun project with which to be involved. The potential is amazing—multi-touch interfaces are the next paradigm in computing and will replace standard keyboard and mouse input in the relatively near future. My friends and I decided to document our progress as we build our devices and software, so we created the <a title="uNUI Group" href="http://unui.org">uNUI Group</a> site as an extension of the <a href="http://nuigroup.com">NUI Group</a> community. Check out the <a title="uNUI Resources" href="http://unui.org/resources">Resources</a> page for links, blogs and videos about what we and the community are doing—we'd also love to hear your <a href="http://unui.org/contact">feedback</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://fotinakis.com/blog/2008.04.06/unui/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Python XML-RPC Client with Cookie Handling and SSL</title>
		<link>http://fotinakis.com/blog/2008.03.09/cookies-xmlrpc-and-ssl/</link>
		<comments>http://fotinakis.com/blog/2008.03.09/cookies-xmlrpc-and-ssl/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 21:33:19 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Python]]></category>

		<category><![CDATA[Security]]></category>

		<category><![CDATA[cherrypy]]></category>

		<category><![CDATA[cookies]]></category>

		<category><![CDATA[https]]></category>

		<category><![CDATA[ssl]]></category>

		<category><![CDATA[transport]]></category>

		<guid isPermaLink="false">http://fotinakis.com/blog/2008.03.09/cookies-xmlrpc-and-ssl/</guid>
		<description><![CDATA[The following is an adaptation of Vaibhav Bhatia's cookie-handling XML-RPC client (text source) with a few changes to implement SSL for HTTPS transport in place of the basic HTTP transport.
This was  done specifically for use with CherryPy sessions so that the XML-RPC client (the server proxy object) could be stored in a session variable, [...]]]></description>
			<content:encoded><![CDATA[<p>The following is an adaptation of Vaibhav Bhatia's <a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/501148">cookie-handling XML-RPC client</a> (<a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/501148/index_txt">text source</a>) with a few changes to implement SSL for HTTPS transport in place of the basic HTTP transport.</p>
<p>This was  done specifically for use with <a href="http://www.cherrypy.org">CherryPy</a> sessions so that the XML-RPC client (the server proxy object) could be stored in a session variable, giving each user an individual client and thus allowing webservice permissions to be handled on a per-user basis (without having to authenticate and determine permissions on every webservice method invocation). To do this, make sure that you're storing CherryPy sessions <a href="http://cherrypy.org/wiki/CherryPySessions">in memory</a>, not in a file, and then create the proxy object (sorry for the gigantic class name):</p>
<pre class="python">cherrypy.<span style="color: black;">session</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'proxy'</span><span style="color: black;">&#93;</span> = \
	<span style="color: #dc143c;">xmlrpclib</span>.<span style="color: black;">ServerProxy</span><span style="color: black;">&#40;</span>url, transport=CookieAuthXMLRPCSafeTransport<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre>
<h4>xmlrpcclient.py</h4>
<pre class="python"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">base64</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">xmlrpclib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">cookielib</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> CookieAuthXMLRPCSafeTransport<span style="color: black;">&#40;</span><span style="color: #dc143c;">xmlrpclib</span>.<span style="color: black;">SafeTransport</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot; xmlrpclib.Transport that sends HTTPS Authentication&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
    user_agent = <span style="color: #483d8b;">'*py*'</span>
    credentials = <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    cookiefile = <span style="color: #483d8b;">'cookies.lwp'</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send_basic_auth<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, connection<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Include HTTPS Authentication data in a header&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
        auth = <span style="color: #dc143c;">base64</span>.<span style="color: black;">encodestring</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;%s:%s&quot;</span>%<span style="color: #008000;">self</span>.<span style="color: black;">credentials</span><span style="color: black;">&#41;</span>.<span style="color: black;">strip</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        auth = <span style="color: #483d8b;">'Basic %s'</span> %<span style="color: black;">&#40;</span>auth,<span style="color: black;">&#41;</span>
        connection.<span style="color: black;">putheader</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Authorization'</span>,auth<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> send_cookie_auth<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, connection<span style="color: black;">&#41;</span>:
        <span style="color: #483d8b;">&quot;&quot;</span><span style="color: #483d8b;">&quot;Include Cookie Authentication data in a header&quot;</span><span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
        cj = <span style="color: #dc143c;">cookielib</span>.<span style="color: black;">LWPCookieJar</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        cj.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cookiefile</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> cookie <span style="color: #ff7700;font-weight:bold;">in</span> cj:
            <span style="color: #ff7700;font-weight:bold;">if</span> cookie.<span style="color: black;">name</span> == <span style="color: #483d8b;">'session_id'</span>:
                uuidstr = cookie.<span style="color: black;">value</span>
            connection.<span style="color: black;">putheader</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Cookie&quot;</span>,cookie.<span style="color: black;">name</span>+<span style="color: #483d8b;">'='</span>+cookie.<span style="color: black;">value</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">## override the send_host hook to also send authentication info</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> send_host<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, connection, host<span style="color: black;">&#41;</span>:
        <span style="color: #dc143c;">xmlrpclib</span>.<span style="color: black;">SafeTransport</span>.<span style="color: black;">send_host</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, connection, host<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cookiefile</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">send_cookie_auth</span><span style="color: black;">&#40;</span>connection<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">self</span>.<span style="color: black;">credentials</span> != <span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">send_basic_auth</span><span style="color: black;">&#40;</span>connection<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> request<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, host, handler, request_body, verbose=<span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
        <span style="color: #808080; font-style: italic;"># dummy request class for extracting cookies</span>
        <span style="color: #ff7700;font-weight:bold;">class</span> CookieRequest<span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># dummy response class for extracting cookies</span>
        <span style="color: #ff7700;font-weight:bold;">class</span> CookieResponse:
            <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, headers<span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">headers</span> = headers
            <span style="color: #ff7700;font-weight:bold;">def</span> info<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">headers</span> 
&nbsp;
        crequest = CookieRequest<span style="color: black;">&#40;</span><span style="color: #483d8b;">'https://'</span>+host+<span style="color: #483d8b;">'/'</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># issue XML-RPC request</span>
        h = <span style="color: #008000;">self</span>.<span style="color: black;">make_connection</span><span style="color: black;">&#40;</span>host<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> verbose:
            h.<span style="color: black;">set_debuglevel</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">send_request</span><span style="color: black;">&#40;</span>h, handler, request_body<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">send_host</span><span style="color: black;">&#40;</span>h, host<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">send_user_agent</span><span style="color: black;">&#40;</span>h<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># creating a cookie jar for my cookies</span>
        cj = <span style="color: #dc143c;">cookielib</span>.<span style="color: black;">LWPCookieJar</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">send_content</span><span style="color: black;">&#40;</span>h, request_body<span style="color: black;">&#41;</span>
&nbsp;
        errcode, errmsg, headers = h.<span style="color: black;">getreply</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        cresponse = CookieResponse<span style="color: black;">&#40;</span>headers<span style="color: black;">&#41;</span>
        cj.<span style="color: black;">extract_cookies</span><span style="color: black;">&#40;</span>cresponse, crequest<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>cj<span style="color: black;">&#41;</span> &amp;gt; <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #008000;">self</span>.<span style="color: black;">cookiefile</span> != <span style="color: #008000;">None</span>:
            cj.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">cookiefile</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> errcode != <span style="color: #ff4500;">200</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #dc143c;">xmlrpclib</span>.<span style="color: black;">ProtocolError</span><span style="color: black;">&#40;</span>
                host + handler,
                errcode, errmsg,
                headers
                <span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">verbose</span> = verbose
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">parse_response</span><span style="color: black;">&#40;</span>h.<span style="color: black;">getfile</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://fotinakis.com/blog/2008.03.09/cookies-xmlrpc-and-ssl/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Secure Screen Sharing in OS X Leopard Through SSH Tunneling</title>
		<link>http://fotinakis.com/blog/2008.02.13/secure-mac-screen-sharing/</link>
		<comments>http://fotinakis.com/blog/2008.02.13/secure-mac-screen-sharing/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 22:28:03 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Apple]]></category>

		<category><![CDATA[Networking]]></category>

		<category><![CDATA[OS X]]></category>

		<category><![CDATA[Open Source]]></category>

		<category><![CDATA[Security]]></category>

		<category><![CDATA[leopard]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[remote desktop]]></category>

		<category><![CDATA[screen sharing]]></category>

		<category><![CDATA[ssh]]></category>

		<category><![CDATA[vnc]]></category>

		<guid isPermaLink="false">http://fotinakis.com/blog/2008.02.13/secure-screen-sharing-in-os-x-leopard-through-ssh-tunneling/</guid>
		<description><![CDATA[Here's a quick tutorial on how to secure the Screen Sharing application in Leopard by tunneling your connection through an encrypted SSH channel.
The new Screen Sharing application is basically just glorified VNC, but it does come with some nice features (dual-screen view, for example). However, just turning on the service will open up a couple [...]]]></description>
			<content:encoded><![CDATA[<p>Here's a quick tutorial on how to secure the Screen Sharing application in Leopard by tunneling your connection through an encrypted SSH channel.</p>
<p>The new Screen Sharing application is basically just glorified VNC, but it does come with some nice features (dual-screen view, for example). However, just turning on the service will open up a couple of ports that may expose your system to exploitation.</p>
<p><img src="http://fotinakis.com/blog/wp-content/uploads/2008/02/waterroof_menu.jpg" alt="WaterRoof Menu" align="left" />First, we'll want to lock down your firewall. Leopard comes with two firewalls: <code>ipfw</code> (ipfirewall—the underlying Unix firewall) and an application layer firewall (the one that pops up sometimes and asks if you want to allow an application to accept incoming connections). You can manage the application layer firewall through System Preferences &gt; Security &gt; Firewall, but in order to block some ports we'll need to set up some rules through <code>ipfw</code>. In order to do this, you can either learn the shell syntax (which isn't terribly complicated) or use a GUI app to interface with it. I chose to use <a href="http://www.hanynet.com/waterroof/">WaterRoof</a>—a frontend open-source GUI for <code>ipfw</code>.</p>
<p>Once you have downloaded WaterRoof, run the application and click on <b>Static Rules</b>. Click the <b>+</b> icon to add a new rule, and use the following information:</p>
<p><b>Protocol:</b> IP<br />
<b>Rule Action:</b> Deny<br />
<b>Source: </b>not me<br />
<b>Port or range:</b> (leave blank)<br />
<b>Destination address, subnet, or network: </b>me<br />
<b>Port or range:</b> 5900<br />
<b>In, Out, or In/Out:</b> Select the <b>In</b> radio button</p>
<p>This will block port 5900, the default VNC listening port that is opened when you start Screen Sharing. Also, you'll want to block port 88 unless you are using Kerberos for authentication (I believe this is also opened by Screen Sharing and a couple of other apps). Add a new rule and use the same above parameters, but use incoming port 88 instead of 5900.</p>
<h4>You should now have two new rules in your table:</h4>
<pre>deny ip from not me to me dst-port 5900 in
deny ip from not me to me dst-port 88 in</pre>
<p>Click <b>Tools &gt; Rules Configuration &gt; Save to startup configuration</b>. Then, click <b>Tools &gt; Startup Script &gt; Install Startup Script</b>. This will make these new rules persist when you restart (otherwise, the system will reset to defaults on the next restart).</p>
<p>Open up Terminal and edit your <b><code>/etc/sshd_config</code></b> file with your favorite editor. In order to enable port forwarding add this line to the end of the file:</p>
<pre>GatewayPorts yes</pre>
<p>Now, open <b>System Preferences &gt; Sharing</b> and enable the <b>Screen Sharing</b> and <b>Remote Login</b> services.</p>
<h4>On your other Mac...</h4>
<p>Now, from your client computer, open up <b>Terminal</b> and run the following (for reasoning, see the LifeHacker article <a href="http://lifehacker.com/software/remote-control/add-more-functionality-to-leopards-screen-sharing-334759.php">Add More Functionality to Leopard's Screen Sharing</a>):</p>
<pre>defaults write com.apple.ScreenSharing ShowBonjourBrowser_Debug 1</pre>
<p>and (to enable quality control settings)...</p>
<pre>defaults write com.apple.ScreenSharing \
'NSToolbar Configuration ControlToolbar' -dict-add 'TB Item Identifiers' \
'(Scale,Control,Share,Curtain,Capture,FullScreen,GetClipboard,SendClipboard,Quality)'</pre>
<h4>Finally...</h4>
<p>Now, any time you want to securely connect to your Mac, all you have to do is type the following in Terminal:</p>
<pre>ssh <b>username</b>@<b>ip_address_or_hostname</b> -L 5900:localhost:5900</pre>
<p><img src="http://fotinakis.com/blog/wp-content/uploads/2008/02/mac_screensharing2.jpg" alt="Leopard Screen Sharing Application Window" align="right" />The -L flag is the key to all this—it enables local port forwarding and specifies that anything that happens on the specified local port will be forwarded to the given remote host and port (see the man page for more info). The format of the -L option is <b>port:host:hostport</b> so the first 5900 is your local client port, the next option is the host to which to forward, and the third is the remote port. It's slightly confusing at first, but this localhost isn't the client you're connecting from, it is the remote computer to which you are connecting—it means that when the remote host gets forwarded data, it won't pass it on to some other host.</p>
<p>Now, leave that terminal window open and open up <b>/System/Library/CoreServices/Screen Sharing.app</b> (you can drag it to your dock).</p>
<p>In the connect field, type <b>localhost:0 </b>(don't forget the :0). The last part is important because it means to connect to display zero, which translates to port 5900 in VNC land and, for some reason, Leopard will tell you that "You cannot share your own computer" if you type in just localhost (though, you actually can by enabling Screen Sharing and typing that same host, it just creates an pseudo-infinite loop of VNC windows).</p>
<p>Once you type in your username and password, you're done! You can now control your computer remotely through Leopard's Screen Sharing app over a tunneled SSH connection. Here's an example of the Screen Sharing interface (notice the nice dual-monitor support):</p>
<p><img src="http://fotinakis.com/blog/wp-content/uploads/2008/02/mac_screensharing.jpg" alt="Leopard Screen Sharing" /></p>
<p>Also, because Screen Sharing uses VNC as its base protocol you can interface with your Mac from any Linux, Mac, or Windows VNC client by port forwarding in the same way (on Windows, you'll have to use an SSH client like <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a>) and connecting to localhost port 5900 with any standard VNC client.</p>
]]></content:encoded>
			<wfw:commentRss>http://fotinakis.com/blog/2008.02.13/secure-mac-screen-sharing/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dirty business: Network Solutions domain registration</title>
		<link>http://fotinakis.com/blog/2008.01.20/dirty-business-network-solutions-domain-registration/</link>
		<comments>http://fotinakis.com/blog/2008.01.20/dirty-business-network-solutions-domain-registration/#comments</comments>
		<pubDate>Sun, 20 Jan 2008 21:35:15 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Business]]></category>

		<category><![CDATA[Networking]]></category>

		<guid isPermaLink="false">http://fotinakis.com/blog/2008.01.20/dirty-business-network-solutions-domain-registration/</guid>
		<description><![CDATA[When a company employs questionable tactics in its business practices, it is many times appropriate to chagrin it publicly in order to make others aware. In that vein, I would simply like to spread the news that Network Solutions (a company who used to be the only registrar of .com's and other domains) has begun [...]]]></description>
			<content:encoded><![CDATA[<p>When a company employs questionable tactics in its business practices, it is many times appropriate to chagrin it publicly in order to make others aware. In that vein, I would simply like to spread the news that <a href="http://www.networksolutions.com">Network Solutions</a> (a company who used to be the only registrar of .com's and other domains) has begun a very questionable tactic of automatically registering any domain that is searched for on its site.</p>
<p>TechCrunch's Michael Arrington <a href="http://www.techcrunch.com/2008/01/10/network-solutions-using-questionable-tactic-to-sell-more-domain-names/">writes</a>, "So far they’ve registered over 72,000 domain names based on user searches. ... This isn’t costing the company anything, either. Registrars are permitted to register domains for five days without paying any fees to the domain name registry."  After the five day period, they likely delete the domain in order to not pay for its actual registration. This five-day leniency was meant to allow registrars to efficiently deal with credit card fraud, but "the fact that Network Solution is using the grace period to stop users from going to competitors is well outside of the original reasons for the rule."</p>
<p>Though <a href="http://en.wikipedia.org/wiki/Domain_tasting">domain tasting</a> is not in any way new, this seems to be a twist on the already abused grace period—one that I hope doesn't become commonplace and isn't copied by other registrars.</p>
<p>For more information, see the article on <a href="http://www.domainnamenews.com/featured/domain-registrar-network-solutions-front-running-on-whois-searches/1359">Domain Name News</a> or the <a href="http://www.techcrunch.com/2008/01/10/network-solutions-using-questionable-tactic-to-sell-more-domain-names/">TechCrunch article</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://fotinakis.com/blog/2008.01.20/dirty-business-network-solutions-domain-registration/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Networking Via Carrier Pigeon</title>
		<link>http://fotinakis.com/blog/2007.12.31/networking-via-carrier-pigeon/</link>
		<comments>http://fotinakis.com/blog/2007.12.31/networking-via-carrier-pigeon/#comments</comments>
		<pubDate>Mon, 31 Dec 2007 21:34:58 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Humor]]></category>

		<category><![CDATA[Networking]]></category>

		<category><![CDATA[Open Source]]></category>

		<guid isPermaLink="false">http://fotinakis.com/blog/?p=7</guid>
		<description><![CDATA[Let me just trace where this is coming from for you: while laughing again at an XKCD comic, I was led to Google the name "Eric S. Raymond" (the references to Richard Stallman and Linus Torvalds I got, but I didn't know much about ESR), which then led me to his home page and then [...]]]></description>
			<content:encoded><![CDATA[<p>Let me just trace where this is coming from for you: while laughing again at an <a href="http://xkcd.com/225/">XKCD comic</a>, I was led to Google the name "Eric S. Raymond" (the references to Richard Stallman and Linus Torvalds I got, but I didn't know much about ESR), which then led me to his home page and then to the <a href="http://www.catb.org/~esr/jargon/">Jargon file</a> (a classic collection of terms and information on hacker culture) and to the <a href="http://www.catb.org/~esr/jargon/html/meaning-of-hack.html">Meaning of Hack</a> section.</p>
<p>This story is probably well-known to many seasoned hackers, but it gave me a good laugh:</p>
<blockquote><p>1990's addition to the hallowed tradition of April Fool RFCs was <a href="http://www.faqs.org/rfcs/rfc1149.html">RFC 1149</a>, <em>A Standard for the Transmission of IP Datagrams on Avian Carriers</em>.  This sketched a method for transmitting IP packets via carrier pigeons.</p>
<p>Eleven years later, on 28 April 2001, the Bergen Linux User's Group successfully demonstrated CPIP (Carrier Pigeon IP) between two Linux machines running on opposite sides of a small mountain in Bergen, Norway.  Their network stack used printers to hex-dump packets onto paper, pigeons to transport the paper, and OCR software to read the dumps at the other end and feed them to the receiving machine's network layer.</p>
<p>Here is the actual log of the ping command they successfully executed. Note the exceptional packet times.</p>
<pre>Script started on Sat Apr 28 11:24:09 2001
vegard@gyversalen:~$ /sbin/ifconfig tun0
tun0      Link encap:Point-to-Point Protocol
          inet addr:10.0.3.2  P-t-P:10.0.3.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:150  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0
          RX bytes:88 (88.0 b)  TX bytes:168 (168.0 b)

vegard@gyversalen:~$ ping -i 450 10.0.3.1
PING 10.0.3.1 (10.0.3.1): 56 data bytes
64 bytes from 10.0.3.1: icmp_seq=0 ttl=255 time=6165731.1 ms
64 bytes from 10.0.3.1: icmp_seq=4 ttl=255 time=3211900.8 ms
64 bytes from 10.0.3.1: icmp_seq=2 ttl=255 time=5124922.8 ms
64 bytes from 10.0.3.1: icmp_seq=1 ttl=255 time=6388671.9 ms

— 10.0.3.1 ping statistics —
9 packets transmitted, 4 packets received, 55% packet loss
round-trip min/avg/max = 3211900.8/5222806.6/6388671.9 ms
vegard@gyversalen:~$ exit

Script done on Sat Apr 28 14:14:28 2001</pre>
<p>A web page documenting the event, with pictures, is at <a href="http://www.blug.linux.no/rfc1149/" target="_top">http://www.blug.linux.no/rfc1149/</a>. In the finest Internet tradition, all software involved was open-source; the custom parts are available for download from the site.</p></blockquote>
<blockquote><p>While all acknowledged the magnitude of this achievement, some debate ensued over whether BLUG's implementation was properly conformant to the RFC. It seems they had not used the duct tape specified in 1149 to attach messages to pigeon legs, but instead employed other methods less objectionable to the pigeons.  The debate was properly resolved when it was pointed out that the duct-tape specification was not prefixed by a MUST, and was thus a recommendation rather than a requirement.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://fotinakis.com/blog/2007.12.31/networking-via-carrier-pigeon/feed/</wfw:commentRss>
		</item>
		<item>
		<title>My Canvas</title>
		<link>http://fotinakis.com/blog/2007.12.30/my-canvas/</link>
		<comments>http://fotinakis.com/blog/2007.12.30/my-canvas/#comments</comments>
		<pubDate>Mon, 31 Dec 2007 01:50:19 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
		
		<category><![CDATA[Rambling]]></category>

		<guid isPermaLink="false">http://fotinakis.com/blog/?p=3</guid>
		<description><![CDATA[Welcome to my little corner of the web. I'm currently majoring in computer science and minoring in music at Utah State University while working for the Programming and Design Team in USU's Department of Information Technology. Most of the time work seems to be full-time and school is the side job, but reality sometimes reminds [...]]]></description>
			<content:encoded><![CDATA[<p>Welcome to my little corner of the web. I'm currently majoring in computer science and minoring in music at <a href="http://www.usu.edu">Utah State University</a> while working for the Programming and Design Team in USU's <a href="http://it.usu.edu/">Department of Information Technology</a>. Most of the time work seems to be full-time and school is the side job, but reality sometimes reminds me that this is not exactly the case. Don't get me wrong though—school is important and has taught me much, but working on the PAD team has taught me more about computers and even about life than I have ever learned in a classroom.  It's exciting to be integrated into a team that deals with projects from every facet of a University and hence from innumerable facets of technology.</p>
<p>Hopefully, I'll share a piece of this here that you may stumble across while perusing the interwebs and it might serve a good purpose for you. That's the ideal situation though—there's much potential for it turning into me rambling about topics that may only interest a few people. But, to those few, welcome! <img src='http://fotinakis.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://fotinakis.com/blog/2007.12.30/my-canvas/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
