<?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>coder . cl &#187; sysadmin</title>
	<atom:link href="http://coder.cl/category/sysadmin/feed/" rel="self" type="application/rss+xml" />
	<link>http://coder.cl</link>
	<description>web developer &#38; system programmer</description>
	<lastBuildDate>Tue, 15 May 2012 10:46:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>spam detection, phase 1</title>
		<link>http://coder.cl/2011/04/spam-detection-phase-1/</link>
		<comments>http://coder.cl/2011/04/spam-detection-phase-1/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 21:13:13 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=1446</guid>
		<description><![CDATA[Is very tedious to see you electronic mailboxes to be filled with spam. If you are a web-master or system administrator, you will see that the web site that you are administrating, is usually scrapped by bot software seeking for certain URLs and electronic mail addresses. That is probably the highest origin of the SPAM [...]]]></description>
			<content:encoded><![CDATA[<p>Is very tedious to see you electronic mailboxes to be filled with spam. If you are a web-master or system administrator, you will see that the web site that you are administrating, is usually scrapped by bot software seeking for certain URLs and electronic mail addresses. That is probably the highest origin of the SPAM on the internet. You know that SPAM is, and this experiment should work only with those SPAM that are related to electronic internet email.</p>
<p><span id="more-1446"></span></p>
<blockquote><p>
Spam is the use of electronic messaging systems (including most broadcast media, digital delivery systems) to send unsolicited bulk messages indiscriminately. While the most widely recognized form of spam is e-mail spam, the term is applied to similar abuses in other media: instant messaging spam, Usenet newsgroup spam, Web search engine spam, spam in blogs, wiki spam, online classified ads spam, mobile phone messaging spam, Internet forum spam, junk fax transmissions, social networking spam, television advertising and file sharing network spam.
</p></blockquote>
<p>This experiment requires a fake electronic mail account, a well known internet domain &mdash; which is subject of constant web scrapping seeking for electronic mails &mdash; and the proper software development tools, something flexible like Linux, rather than those very closed platforms like Windows. If your domain is subject of spam: <i>&ldquo;Send the same message indiscriminately to (large numbers of recipients) on the Internet&rdquo;</i>, this experiment probably will solve your common problems with SPAM and will let you build the proper filters on your SPAM filter daemon or service.</p>
<p>Start creating the fake account. For example <a href='mailto:spam-booby@example.org' title='Fake E-Mail for SPAM'><i>spam-booby@example.org</i></a>. This email address will be scrapped by those internet bots that are seeking for email addresses. Create a fake email client, to review and fetch that folder, that will be seriously affected by those SPAM bots. On your well known domain site, for example <a href='http://www.example.org/' title='Fake Domain for SPAM'>www.example.org</a>, put your fake email address that will be subject of web scrapping in a hidden HTML anchor element:</p>
<pre class="brush: html;">
&lt;a href='mailto:spam-booby@example.org'
   style='display:none;'
   title='just fall here fu**ing bot'&gt;
  spam-booby@example.org
&lt;/a&gt;
&lt;a href='mailto:spam-booby@example.org'
   style='visibility:hidden;'
   title='just fall here fu**ing bot'&gt;
  spam-booby@example.org
&lt;/a&gt;
</pre>
<p>Those mail links will not be displayed on the web browser of your customers, so, you will be safe, but those bots are not smart enough to process the <tt>visibility: hidden</tt> or <tt>display: none</tt> CSS properties. If those bots are smart enough to process that CSS property, well, just use some JavaScript trick to hide them, for example with jQuery that should be like:</p>
<pre class="brush: html;">
&lt;a href='mailto:spam-booby@example.org'
   class='please-hide-me'
   title='just fall here fu**ing bot'&gt;
  spam-booby@example.org
&lt;/a&gt;

&lt;script type='text/javascript'&gt;&lt;--//
$(document).ready(function () {
    $('a.please-hide-me').hide();
});
//--&gt;&lt;/script&gt;
</pre>
<p>That will ensure that those email links will be hidden for your customers using a real browser. Wait one week, and you will be collecting SPAM on the fake <a href='mailto:spam-booby@example.org' title='send it here fu**ing bot'>spam-booby@example.org</a> email account. Also, I know that those spam bot constructors are so bad software developers that will not consider the <a href='http://tools.ietf.org/html/rfc2606'>RFC2606</a> referring to example domains, and will use the email addresses on the present article in their spamming tasks.</p>
<p>This is the first phase, on the second phase, I will try to process the collected data from those captured emails. I will begin this experiment with certain domain, and I hope that you will enjoy the results. For the second phase I&#8217;ve chosen Python as primary language, and some tools to download and fetch the email from the fake account, some Bayesian filter classifiers and certain key/value database to speed-up the mail processing functions. I&#8217;ve started collecting data from today :)</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2011. |
<a href="http://coder.cl/2011/04/spam-detection-phase-1/">Permalink</a> |
<a href="http://coder.cl/2011/04/spam-detection-phase-1/#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2011/04/spam-detection-phase-1/&title=spam detection, phase 1">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2011/04/spam-detection-phase-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>emacs as python ide</title>
		<link>http://coder.cl/2010/09/emacs-as-python-ide/</link>
		<comments>http://coder.cl/2010/09/emacs-as-python-ide/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 19:53:45 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=951</guid>
		<description><![CDATA[Emacs is a powerful text editor. It has an embedded List dialect interpreter, called Emacs-Lisp and it has many extensions &#8212; called Emacs Modes &#8212; to work in various tasks, from programming tasks, IRC clients, MUAs and time organizing tasks. Many people says that Emacs works likely an Operating System, since it has a lot [...]]]></description>
			<content:encoded><![CDATA[<p>Emacs is a powerful text editor. It has an embedded List dialect interpreter, called Emacs-Lisp and it has many extensions &mdash; called Emacs Modes &mdash; to work in various tasks, from <i>programming</i> tasks, <i>IRC clients</i>, <i>MUAs</i> and <i>time organizing tasks</i>. Many people says that Emacs works likely an Operating System, since it has a lot of applications mounted on top of Emacs Lisp. Python Mode (python-mode) in emacs has been extended and it can be used with various tools, turning your Emacs editor in a powerful IDE to work with Python.</p>
<p><span id="more-951"></span></p>
<p><br/></p>
<h3>python-mode</h3>
<p>Emacs is configured through the Lisp dialect Emacs-Lisp. Core configuration directives are processed from the <tt>~/.emacs</tt> file. To enable the <i>python-mode</i>, you just need to load the python-mode each time that your Emacs editor opens a Python file.</p>
<pre class="brush: lisp;">

;;; auto load python-mode
(autoload 'python-mode "python-mode" "Mode for editing Python source files")

;;; enable python-mode on .py files
(setq auto-mode-alist
      (append '(("\.py" . python-mode)
                ) auto-mode-alist))

;; auto font lock mode
(defvar font-lock-auto-mode-list
  (list 'python-mode))
</pre>
<p>Also i known that each Emacs Mode, has some hooks, and <i>python-mode</i> isn&#8217;t an exception. To customize the <i>python-mode</i> you can use the <i>python-mode-hook</i> variable:</p>
<pre class="brush: lisp;">

(add-hook 'python-mode-hook 'dmw-python-mode-hook)
</pre>
<p>Where, in this case, <i>dmw-python-mode-hook</i> is a symbol pointing to a function called <i>dmw-python-mode-hook</i>:</p>
<pre class="brush: lisp;">

;; python mode hook
(defun dmw-python-mode-hook ()
  (load "py-mode-ext")
  (load "pyp")
  (require 'pycomplete)
  (setq py-indent-offset 4)
  (setq py-smart-indentation t)
  (setq py-continuation-offset 4)
  (setq indent-tabs-mode nil)
  (setq py-pychecker-command "~/bin/pylint_etc_wrapper.py")
  (setq py-pychecker-command-args (quote ("")))
  (autoload 'pymacs-load "pymacs" nil t)
  (autoload 'pymacs-eval "pymacs" nil t)
  (autoload 'pymacs-apply "pymacs")
  (autoload 'pymacs-call "pymacs")
  (setq interpreter-mode-alist(cons '("python" . python-mode)
                                    interpreter-mode-alist))
  (eldoc-mode 1)
  (define-key py-mode-map [f12] 'pyp)
  (define-key py-mode-map "C-cC-w" (lambda ()
                                       (interactive)
                                       (command-execute 'py-pychecker-run)))
  (define-key py-mode-map [C-S-iso-lefttab] 'py-complete)
  )
</pre>
<p><br/></p>
<h3>python-mode-hook</h3>
<p>This python-mode-hook function or hook function, enables a series of features for you python-mode. First, it loads <tt>py-mode-ext</tt> and <tt>pyp</tt>, and also loads <tt>pycomplete</tt>. Those tools are part of the <a href="http://page.sourceforge.net/">PAGE &#8211; Python Automatic GUI Generator</a> package. <tt>py-mode-ext</tt> adds some nice functions and commands, like <tt>py-call-pdb</tt>, to begin debugging Python. <tt>pyp</tt> adds a command/function that prints the current expression, or prompts for an expression to print, with the complete code hierarchy as prefix:</p>
<pre class="brush: python;">

def main():
    if len(sys.argv) != 3:
        print &quot;No dialup numbern&quot;
    txtmsg = sys.argv[2]
    number = sys.argv[1]
    number = number.strip()
    for n in [' ', '+', '(', ')', &quot;s&quot;, &quot;t&quot;, '-']:
        number = number.replace(n, &quot;&quot;);
    number = '+' + number
    skype = Skype4Py.Skype()
    skype.Attach()
    ### this line was generated with the pyp
    ### command that has the line
    ### (define-key py-mode-map [f12] 'pyp) on the
    ### python-mode-hook
    print 'main: skype =', skype    # dmw   pyp
    message = skype.CreateSms(Skype4Py.smsMessageTypeOutgoing, number)
    message.Body = txtmsg
    message.Send()
</pre>
<p>Finally the <tt>pycomplete</tt> module has a very nice tool to enable Python auto-completion. For example the following code:</p>
<pre class="brush: python;">

class ParentObject:
    parent1 = None
    parent2 = None
    parent3 = None
    def __init__(self, m1, m2, m3):
        self.parent1 = m1
        self.parent2 = m2
    def child(self, m1, m2, m3):
        self.parent3 = ChildObject(m1, m2, m3)
    def nested(self, m1, m2, m3):
        self.parent3.child4 = NestedChild(m1, m2, m3)
    def subnested(self, m1):
        self.parent3.child4.nested4 = SubNestedChild(m1)
        ### here I press ctrl + s + tab
        ### this will run py-complete as the line
        ### (define-key py-mode-map [C-S-iso-lefttab] 'py-complete)
        ### is defined on the python-mode-hook
        str&lt;Ctrl+S+Tab&gt;
    def __repr__(self):
        return &quot;n-> &quot; + repr(self.__dict__)
</pre>
<p>This will display a window as follows &mdash; where you just need to press <i>mouse-2</i> or the middle button on your mouse to select one completion:</p>
<div class="figure">
<a href="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2010/09/python-completions.jpg" target="_blank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2010/09/python-completions.jpg" border="0" /></a>
</div>
<p><br/></p>
<h3>pychecker</h3>
<p>Python static checkers are cool, also are tools that you must use in your daily Python programming tasks. For example, on the <a href="http://www.emacswiki.org">Emacs Wiki</a>, you can find <a href="http://www.emacswiki.org/emacs/PythonProgrammingInEmacs">this article</a> about using Emacs as Python IDE. There I&#8217;ve found the <a href="http://bitbucket.org/tavisrudd/pylint_etc_wrapper.py/src/tip/pylint_etc_wrapper.py">pylint_etc_wrapper.py</a> script, which runs three Python static checkers at once: pylint, pychecker, pyflakes and pep8. Running the pychecker script using the <tt>ctrl + c</tt><tt>ctrl + w</tt> key sequence, you will obtain a window similar to the next one, will errors reported from those tools:</p>
<div class="figure">
<a href="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2010/09/pychecker.jpg" target="_blank"><img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2010/09/pychecker.jpg" border="0" /></a>
</div>
<p>I hope that you will enjoy <a href="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)">hacking</a> Python from <a href="http://en.wikipedia.org/wiki/Emacs">Emacs</a>, it&#8217;s a great editor. Also you can use the <a href="http://ecb.sourceforge.net/">Emacs Code Browser</a> with Python, I hope that you can find it very interesting.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2010. |
<a href="http://coder.cl/2010/09/emacs-as-python-ide/">Permalink</a> |
<a href="http://coder.cl/2010/09/emacs-as-python-ide/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2010/09/emacs-as-python-ide/&title=emacs as python ide">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2010/09/emacs-as-python-ide/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>function prototypes and references in perl</title>
		<link>http://coder.cl/2010/08/function-prototypes-and-references-in-perl/</link>
		<comments>http://coder.cl/2010/08/function-prototypes-and-references-in-perl/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 23:33:49 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[development]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=870</guid>
		<description><![CDATA[Some people is considering Perl as a non-friendly language, but in my opinion is a powerful language, not only for its capacity to do text-processing, it also has a lot of modules and extensions which makes it a language of choice for a wide variety of applications. I prefer to code Perl using strict and [...]]]></description>
			<content:encoded><![CDATA[<p>Some people is considering <a href='http://www.perl.org/'>Perl</a> as a non-friendly language, but in my opinion is a powerful language, not only for its capacity to do text-processing, it also has a lot of modules and extensions which makes it a language of choice for a wide variety of applications. I prefer to code <strong>Perl</strong> using <i>strict</i> and function prototypes, so it looks more clean and elegant. Also it supports <i>lambdas</i> for some tasks. Let&#8217;s take look on prototypes and references. You will find interesting topics reading <strong>perlsub(1)</strong> and <strong>perlref(1)</strong>.</p>
<p><span id="more-870"></span></p>
<p>On the Perl language, prototypes usually are absent, since are not required. you just create a function &mdash; anonymous or not &mdash; by writing <i>subs</i>:</p>
<pre class='brush: perl;'>
sub hello_world {
    return "hello world";
}
</pre>
<p>The principle of perl subs, is that you call them with an <i>unique argument</i> and that argument is a list, so that&#8217;s why calling functions in perl do not require the form <i>function(arg1, arg2, arg3)</i>. For example you can call the <tt>hello_world</tt> function with four different forms:</p>
<pre class='brush: perl;'>
print hello_world;        # the mos common form
print &amp;hello_world;       # code reference style
print hello_world();      # the c derived form without arguments
print &amp;hello_world();     # code reference style form without arguments
</pre>
<blockquote><p>
Like many languages, Perl provides for user-defined subroutines. These may be located anywhere in the main program, loaded in from other files via the <tt>do</tt>, <tt>require</tt>, or <tt>use</tt> keywords, or generated on the fly using <tt>eval</tt> or anonymous subroutines. You can even call a function indirectly using a variable containing its name or a CODE reference.
</p></blockquote>
<p>The last two ones are just indicating that <i>the argument list is empty</i>. Have you tried to pass an array or list as argument?</p>
<pre class='brush: perl;'>
sub hello_who {
    my ($who) = @_;
    print &quot;hello ${who}n&quot;;
}
my @nekos = ('neko', 'core', 'test');
hello_who 'neko';
hello_who @nekos;
hello_who (@nekos);
</pre>
<p>The code above will just print <i>&quot;hello neko&quot;</i> three times, since the argument handling is just requesting the first argument, and it&#8217;s equivalent to call <tt>my $who = shift;</tt>. So, to pass an array or list as argument, you need to pass its reference &mdash; which is handled internally as <i>scalar type</i> in perl:</p>
<pre class='brush: perl;'>
sub hello_who_iterator($) {
    my ($who) = @_;
    foreach my $i (@{$who}) {
        print &quot;hello ${i}n&quot;;
    }
}
my @nekos = ('neko', 'core', 'test');
hello_who_iterator @nekos;
hello_who_iterator @nekos, "hola";
</pre>
<p>The prototyped function above will allow you to handle one argument as reference and ignore the remaining argument, if any. The same happens to <i>hashes</i>, so you can pass three references without problems:</p>
<pre class='brush: perl;'>
sub hello_world_three($$$) {
    my ($a, $h, $s) = @_;
    my @hello_l;
    foreach my $i (@{$a}) {
        if ($h-&gt;{$i}) {
            push @hello_l, &quot;Hello &quot;.$s.' '.$i.' '.$h-&gt;{$i};
        }
    }
    return join(&quot;n", @hello_l).&quot;n&quot;;
}
my %saludos = ('Juan' => 'el "Gato"',
               'Pedro' => 'el "Epidemia"',
               'Diego' => 'el "Conejo"',);
my @saludar_a = ('Juan', 'Pedro');
print hello_world_three(@saludar_a, %saludos, 'Mr.');
</pre>
<p>But what happens if I pass directly those three arguments, without using their references? The example above will print the following text:</p>
<pre>
Hello Mr. Juan el &quot;Gato&quot;
Hello Mr. Pedro el &quot;Epidemia&quot;
</pre>
<p>If we replace the code to catch directly those arguments, and not their references, we will not get the same result and the function will not do anything&#8230;</p>
<pre class='brush: perl;'>
sub hello_world_three {
    my (@a, %h, $s) = @_;
    my @hello_l;
    foreach my $i (@a) {
        if ($h{$i}) {
            push @hello_l, &quot;Hello &quot;.$s.' '.$i.' '.$h{$i};
        }
    }
    return join(&quot;n&quot;, @hello_l).&quot;n&quot;;
}
my %saludos = ('Juan' => 'el "Gato"',
               'Pedro' => 'el "Epidemia"',
               'Diego' => 'el "Conejo"',);
my @saludar_a = ('Juan', 'Pedro');
print hello_world_three(@saludar_a, %saludos, 'Mr.');
</pre>
<p>The example above applies the <i>shift</i> function to the first argument, so the function just receives the <tt>@saludar_a</tt> argument, so <tt>%h</tt> and <tt>$s</tt> arguments will be empty. If you want to pass an array or a hash to a function, you must do it by passing their reference.</p>
<blockquote><p>
Any arguments passed in show up in the array @_. Therefore, if you called a function with two arguments, those would be stored in $_[0] and $_[1]. The array @_ is a local array, but its elements are aliases for the actual scalar parameters.  In particular, if an element $_[0] is updated, the corresponding argument is updated (or an error occurs if it is not updatable). If an argument is an array or hash element which did not exist when the function was called, that element is created only when (and if) it is modified or a reference to it is taken. (Some earlier versions of Perl created the element whether or not the element was assigned to.) Assigning to the whole array @_ removes that aliasing, and does not update any arguments.
</p></blockquote>
<p><br/></p>
<h3>references</h3>
<ul>
<li><strong>perlsub(1)</strong></li>
<li><strong>perlref(1)</strong></li>
</ul>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2010. |
<a href="http://coder.cl/2010/08/function-prototypes-and-references-in-perl/">Permalink</a> |
<a href="http://coder.cl/2010/08/function-prototypes-and-references-in-perl/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2010/08/function-prototypes-and-references-in-perl/&title=function prototypes and references in perl">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2010/08/function-prototypes-and-references-in-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>configuring snmptrapd</title>
		<link>http://coder.cl/2010/07/configuring-snmptrapd/</link>
		<comments>http://coder.cl/2010/07/configuring-snmptrapd/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 23:28:27 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=703</guid>
		<description><![CDATA[snmptrapd(8) is a SNMP trap daemon, in other words, it captures SNMP notifications from the network and similar devices. In this post I will try to explain how to configure this daemon to allow a network server to process SNMP traps using both, embeded perl handlers for snmptrapd(8) and plain standard input &#8212; or stdin [...]]]></description>
			<content:encoded><![CDATA[<p><strong>snmptrapd(8)</strong> is a SNMP trap daemon, in other words, it captures SNMP notifications from the network and similar devices. In this post I will try to explain how to configure this daemon to allow a network server to process SNMP traps using both, embeded perl handlers for <strong>snmptrapd(8)</strong> and plain standard input &mdash; or <i>stdin</i> &mdash; handlers.</p>
<p><span id="more-703"></span></p>
<p></p>
<h3>daemon configuration</h3>
<p>The daemon is quite easy to configure, you must setup the <strong>snmptrapd.conf(5snmp)</strong> file. For this configuration, you must read your desired configuration options, such as <i>logging</i> and <i>execution</i>. For example if we have a <i>community</i> called <i>inetsnmp</i>, we can configure the file to allow traps from that community and also configure a trap handler written in perl.</p>
<pre class="brush: bash;">

# configure inetsnmp community to allow logging,
# execution of handlers and network traffic.
authCommunity   log,execute,net         inetsnmp

# perl embeded handler.
perl do "/usr/share/snmp/handler/trapdembed.pl"
</pre>
<p>This configuration is not enough, the <strong>snmptrapd(8)</strong> daemon uses <strong>hosts.allow(5)</strong> facility, so we need to add the proper rule in that file:</p>
<pre class="brush: bash;">

snmptrapd : 192.168.100.0/255.255.255.0 : allow
snmptrapd : 10.10.10.0/255.255.255.0 : allow
</pre>
<p></p>
<h3>the embeded perl handler</h3>
<pre class="brush: perl;">
#!/usr/bin/perl -w
#

# strict perl is better
use strict;
use FileHandle;
use Data::Dumper;
use NetSNMP::TrapReceiver;

# we create a sample/demo log file...
my $log = FileHandle-&gt;new(&quot;/var/log/snmptrapsample.log&quot;, &quot;a+&quot;) ||
    die &quot;Failed to open log file&quot;;

# how we process an SNMP variable
sub process_var {
    my ($var) = @_;
    my %res;
    my $name = &quot;$var-&gt;[0]&quot;;
    my ($vt, $vv) = split /: /, &quot;$var-&gt;[1]&quot;;
    $res{'oid'} = $name;
    $res{'type'} = $vt;
    $res{'value'} = $vv;
    return %res;
}

# our default receiver
sub default_receiver {
    my ($pdu, $ivars) = @_;
    my %vars;
    $log-&gt;print(Dumper($pdu));
    foreach my $k (@{$_[1]}) {
        $vars{$k-&gt;[0]} = process_var($k);
    }
    $log-&gt;print(Dumper(%vars));
    $log-&gt;flush;
}

# every OIDs pass through the default_receiver
NetSNMP::TrapReceiver::register(&quot;all&quot;, &amp;default_receiver) ||
    die &quot;Failed to laod Sample Trap Receivern&quot;;

# status message...
print STDERR &quot;Loaded Sample Trap Receivern&quot;;
</pre>
<p>This <strong>perl(1)</strong> handler will allow you basically to create a handler which is capable to process SNMP notifications creating two main variables on the handler itself <i>$pdu</i> which is the reference to the <i>%pdu</i> hash and <i>%vars</i> hash. Both hashes contains the proper data to process the request as you want:</p>
<pre class="brush: perl;">

%pdu = {
    'notificationtype' =&gt; 'TRAP',
    'receivedfrom' =&gt; 'UDP: [10.10.10.1]:53951-&gt;[192.168.100.5]',
    'version' =&gt; 1,
    'errorstatus' =&gt; 0,
    'messageid' =&gt; 0,
    'community' =&gt; 'public',
    'transactionid' =&gt; 1,
    'errorindex' =&gt; 0,
    'requestid' =&gt; 1012897136
};

%vars = {
    'IF-MIB::ifDescr' =&gt; {
        'value' =&gt; 'eth0',
        'type' =&gt; 'STRING',
        'oid' =&gt; 'IF-MIB::ifDescr'
    },
    'IF-MIB::ifAdminStatus.1' =&gt; {
        'value' =&gt; '1',
        'type' =&gt; 'INTEGER',
        'oid' =&gt; 'IF-MIB::ifAdminStatus.1'
    },
    'DISMAN-EVENT-MIB::sysUpTimeInstance' =&gt; {
        'value' =&gt; '(0) 0:00:00.00',
        'type' =&gt; 'Timeticks',
        'oid' =&gt; 'DISMAN-EVENT-MIB::sysUpTimeInstance'
    },
    'IF-MIB::ifIndex.1' =&gt; {
        'value' =&gt; '1',
        'type' =&gt; 'INTEGER',
        'oid' =&gt; 'IF-MIB::ifIndex.1'
    },
    'SNMPv2-MIB::snmpTrapOID.0' =&gt; {
        'value' =&gt; 'IF-MIB::linkUp',
        'type' =&gt; 'OID',
        'oid' =&gt; 'SNMPv2-MIB::snmpTrapOID.0'
    },
    'IF-MIB::ifOperStatus.1' =&gt; {
        'value' =&gt; '1',
        'type' =&gt; 'INTEGER',
        'oid' =&gt; 'IF-MIB::ifOperStatus.1'
    }
};
</pre>
<p>Where each OID or variable, can be treated by using the <strong>NetSNMP::OID</strong> package. Fora <i>stdin</i> handler, if you don&#8217;t know about <strong>perl(1)</strong>, the difference is made on the <strong>snmptrapd.conf(5snmp)</strong> file, instead of configuring a global perl script which itself registers which OIDs will handle, you need to configure a global trap handler or each handler for each OID that you want to handle:</p>
<pre class="brush: bash;">

# configure inetsnmp community to allow logging,
# execution of handlers and network traffic.
authCommunity   log,execute,net         inetsnmp

traphandle     default           /usr/share/snmp/handler/defaultstding.py   default
traphandle     IF-MIB::linkUp    /usr/share/snmp/handler/ifuphandler.py     up
</pre>
<p>This will make your script or application to receive the OID data from <i>stdin</i> as follows:</p>
<pre>
router
UDP: [10.10.10.1]:37745->[192.168.100.5]
DISMAN-EVENT-MIB::sysUpTimeInstance 0:0:00:00.00
SNMPv2-MIB::snmpTrapOID.0 IF-MIB::linkUp
IF-MIB::ifIndex.1 1
IF-MIB::ifAdminStatus.1 up
IF-MIB::ifOperStatus.1 up
IF-MIB::ifDescr eth0
</pre>
<p>And also will require that you will enable in some manner the processing of that data as <i>plain text</i>.</p>
<p>Good luck configuring SNMP traps :)</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2010. |
<a href="http://coder.cl/2010/07/configuring-snmptrapd/">Permalink</a> |
<a href="http://coder.cl/2010/07/configuring-snmptrapd/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2010/07/configuring-snmptrapd/&title=configuring snmptrapd">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2010/07/configuring-snmptrapd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>integrating kontact and skype</title>
		<link>http://coder.cl/2010/02/integrating-kontact-and-skype/</link>
		<comments>http://coder.cl/2010/02/integrating-kontact-and-skype/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 01:53:25 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=627</guid>
		<description><![CDATA[Kontact is my default PIM application. On its configuration we can setup a phone calling program, such as ekiga, skype and others, it just requires a small script, like the one bellow, which I have integrated with KPilot, so I can manage my contacts centered and synchronized. #!/usr/bin/env python # skype_call.py import sys import Skype4Py [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://userbase.kde.org/Kontact'>Kontact</a> is my default PIM application. On its configuration we can setup a phone calling program, such as ekiga, skype and others, it just requires a small script, like the one bellow, which I have integrated with <a href='http://cvs.codeyard.net/kpilot/'>KPilot</a>, so I can manage my contacts centered and synchronized.</p>
<p><span id="more-627"></span></p>
<pre class="brush: python;">
#!/usr/bin/env python
# skype_call.py
import sys
import Skype4Py

def main():
    if len(sys.argv) != 2:
        print "No dialup numbern"
    number = sys.argv[1]
    number = number.strip()
    for n in [' ', '+', '(', ')', &quot;s&quot;, &quot;t&quot;, '-']:
        number = number.replace(n, &quot;&quot;);
    number = '+' + number
    print number, &quot;n&quot;
    skype = Skype4Py.Skype()
    skype.Attach()
    skype.PlaceCall(number)

if __name__ == '__main__':
    main()
</pre>
<p>Then, on the Kontact configuration, on the address book settings, we configure the path to our script, called <i>skype_call.py</i>, in this case located at my home directory, on my personal scripts folder.</p>
<div class="figure"><a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2010/02/kontact-configuration.jpg' alt='Kontact Configuration' title='Kontact Configuration' target='_blank'><img border='0' alt='Kontact Configuration' title='Kontact Configuration' src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2010/02/kontact-configuration.jpg' style='text-align: center; border: 2px solid #000;'></a></div>
<p>One time configured contact, you can call your contacts just by clicking on their phone numbers. Remember that skype needs the format <i>+country_code&mdash;area_code&mdash;phone_number</i>, like <i>+56 (2) 555 55 55</i>.</p>
<div class="figure"><a href='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2010/02/kontact-calling.jpg' alt='Contact Calling' title='Contact Calling' target='_blank'><img border='0' alt='Contact Calling' title='Contact Calling' src='http://coder.cl.qfl.wpcdn.arcostream.com/uploads/2010/02/kontact-calling.jpg' style='text-align: center; border: 2px solid #000;'></a></div>
<p>Happy internet calling ;)</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2010. |
<a href="http://coder.cl/2010/02/integrating-kontact-and-skype/">Permalink</a> |
<a href="http://coder.cl/2010/02/integrating-kontact-and-skype/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2010/02/integrating-kontact-and-skype/&title=integrating kontact and skype">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2010/02/integrating-kontact-and-skype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gmail with fixed font</title>
		<link>http://coder.cl/2009/09/gmail-with-fixed-font/</link>
		<comments>http://coder.cl/2009/09/gmail-with-fixed-font/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 20:16:45 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=241</guid>
		<description><![CDATA[On a post from Leo Soto, he explains how to setup Gmail under Firefox with fixed with fonts or monospaced fonts. I&#8217;ve extended that trick to allow the same behaviour under many Google products. I&#8217;m currently using it to display fixed with fonts in Gmail and Google Groups, for both on the message body and [...]]]></description>
			<content:encoded><![CDATA[<p>On a post from <a href="http://blog.leosoto.com/">Leo Soto</a>, he explains <a href="http://blog.leosoto.com/2009/03/fixed-width-font-on-gmail-again.html">how to</a> setup <a href="http://mail.google.com/">Gmail</a> under <a href="http://www.mozilla.org/">Firefox</a> with fixed with fonts or monospaced fonts. I&#8217;ve extended that trick to allow the same behaviour under many Google products. I&#8217;m currently using it to display fixed with fonts in <a href="http://mail.google.com/">Gmail</a> and <a href="http://groups.google.com/">Google Groups</a>, for both on the message body and text editor.</p>
<p><span id="more-241"></span></p>
<p>My current fragment of my <i>userContent.css</i>, located at my profile directory for Firefox, usually <i>~/.mozilla -&gt; firefox -&gt; <b>profile_name</b> -&gt; chrome</i>, is as follows:</p>
<pre name="code" class="css" cols="80" rows="43">
/* gmail fonts */
@-moz-document domain(mail.google.com)
{
    .gs .ii, textarea.dV {
        font-family: "Lucida Sans Typewriter" !important;
        font-size: 8pt !important;
    }

    .editable , .editable * {
        font-family: "Lucida Sans Typewriter" !important;
        font-size: 8pt !important;
    }

    .tr-field, .editable * {
        font-family: "Lucida Sans Typewriter" !important;
        font-size: 8pt !important;
    }

}

/* google groups fonts */
@-moz-document domain(groups.google.com)
{
    textarea, textarea * {
        font-family: "Lucida Sans Typewriter" !important;
        font-size: 8pt !important;
    }

    textarea.wdth100, textarea.wdth100 * {
        font-family: "Lucida Sans Typewriter" !important;
        font-size: 8pt !important;
    }

    textarea.padall5, textarea.padall5 * {
        font-family: "Lucida Sans Typewriter" !important;
        font-size: 8pt !important;
    }
}
</pre>
<p>Editing mail in fixed with fonts is great, mainly for code an similar tasks. The problem with variable with fonts is the fact that you can not setup the proper spacing or line with in chars while you are trying to preserve the <a href="http://en.wikipedia.org/wiki/Netiquete">Netiquete</a>. Sorry, and you can call me <i>old</i>, but I still think that those rules must apply to electronic communications. Also, the Netiquete was standarized: <a href="http://www.faqs.org/rfcs/rfc1855.html"><i>&quot;RFC1855 &#8211; Netiquette Guidelines&quot;</i></a>.</p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2009. |
<a href="http://coder.cl/2009/09/gmail-with-fixed-font/">Permalink</a> |
<a href="http://coder.cl/2009/09/gmail-with-fixed-font/#comments">3 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2009/09/gmail-with-fixed-font/&title=gmail with fixed font">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2009/09/gmail-with-fixed-font/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>identifying phishing email</title>
		<link>http://coder.cl/2009/09/identifying-phishing-email/</link>
		<comments>http://coder.cl/2009/09/identifying-phishing-email/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 02:49:34 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[rants]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=234</guid>
		<description><![CDATA[Phishing is a criminal activity. I&#8217;ve recently received an electronic mail with one of those phishing attempts. Surely I&#8217;ve ignored since I know how to read the electronic mail headers and some other useful information that comes in electronic mails. The Wikipedia refers to it as: In the field of computer security, phishing is the [...]]]></description>
			<content:encoded><![CDATA[<p><!--:en-->
<p><i>Phishing</i> is a criminal activity. I&#8217;ve recently received an electronic mail with one of those <i>phishing</i> attempts. Surely I&#8217;ve ignored since I know how to read the electronic mail headers and some other useful information that comes in electronic mails. The Wikipedia refers to it as:</p>
<blockquote><p>
In the field of computer security, phishing is the criminally fraudulent process of attempting to acquire sensitive information such as usernames, passwords and credit card details by masquerading as a trustworthy entity in an electronic communication.
</p></blockquote>
<p><!--:--><span id="more-234"></span><!--:en--></p>
<p>This time &mdash; I usually receive those electronic mails &mdash; I&#8217;ve received an <i>important announcement</i> from a Chilean bank, but really it was a <i>phishing attempt</i>. How do I know that? It appears to be quiet real, but what is behind all those pretty and trustful words?</p>
<div class="figure">
<img src="http://coder.cl.qfl.wpcdn.arcostream.com/uploads//2009/09/phishing-mail.png" alt="phishing message" title="phishing message" style="border:2px solid #000;" />
</div>
<p>The electronic have a <i>plain text format</i>. Yes! is not a binary format like <i>Micro$oft Word</i> or another kind of electronic format. This format has standard basis from the <a href="http://tools.ietf.org/html/rfc5322">RFC 5322</a>, and looks pretty similar on every message you sent and you receive. As the RFC 5322 standarizes the message format, the message format is as follows:</p>
<blockquote><p>
A message consists of header fields, optionally followed by a message body.  Lines in a message MUST be a maximum of 998 characters excluding the CRLF, but it is RECOMMENDED that lines be limited to 78 characters excluding the CRLF.  (See section 2.1.1 for explanation.) In a message body, though all of the characters listed in the text rule MAY be used, the use of US-ASCII control characters (values 1 through 8, 11, 12, and 14 through 31) is discouraged since their interpretation by receivers for display is not guaranteed.
</p></blockquote>
<p>Well, <i>message headers</i> are an important task while we are examining the message. You can view the original message by saving your email as plain text and looking at it with any text editor. Find a menu with <i>View Source</i>, <i>View Message Source</i>, <i>View Raw Message</i>, <i>Save As (&#8230;plain text)</i>, and similar options to take a look on the message source. Well, this <i>phishing</i> mail has some interesting headers, such as the <b>Received</b> header, which indicates how the mail message was received by <b>MX servers</b> or <b>mail servers</b>:</p>
<pre>
Received: (qmail 12145 invoked by uid 1552); 14 Sep 2009 08:38:10 -0000
Received: from virtual1.webair.com (virtual1.webair.com [216.130.161.111])
    by mail07.ifxnetworks.com with SMTP id 9f9zhdib52zaavt9vaiekajna6;
    for dmw@unete.cl;
    Mon, 14 Sep 2009 08:38:10 +0000 (GMT)
    (envelope-from monitor@santander.cl)
Received-SPF: None; receiver=mail07.ifxnetworks.com;
    client-ip=216.130.161.111; envelope-from=&lt;monitor@santander.cl&gt;;
    helo=virtual1.webair.com
X-Avenger: version=0.7.9; receiver=mail07.ifxnetworks.com;
    client-ip=216.130.161.111; client-port=2914;
    syn-fingerprint=32768:58:1:60:M1380,N,W0,N,N,T FreeBSD 4.8-5.1 (or MacOS
    X); data-bytes=0
</pre>
<p>My electronic mail address which received the <i>phishing mail</i>, is hosted at <i>IFX Networks</i>, so the final receiver &mdash; from top to bottom &mdash; was the <i>****.ifxnetworks.com</i> server. Electronic mail routes can be longer that this one, but you can read as final receiver from top to the initial receiver to bottom. WOW! What a surprise!, the initial client is <i>216.130.161.111</i>, let see from where comes that IP address&#8230;</p>
<pre>
[www@quake ~]$ geoiplookup 216.130.161.111
GeoIP Country Edition: US, United States

[www@quake ~]$ nslookup 216.130.161.111
Server:         200.62.2.180
Address:        200.62.2.180#53

Non-authoritative answer:
111.161.130.216.in-addr.arpa    name = virtual1.webair.com.
</pre>
<p>WOW!, the client comes from <b>USA</b>, not a Chilean sender! and matches with <i>Spam Filter</i> receiver at IFX: <i>helo=virtual1.webair.com</i>. Why a Chilean bank wants to send an important advice from foreign servers? it smells like pure <i>phishing</i>. Now let me see what are indicating the NIC servers from that domain:</p>
<pre>
[www@quake ~]$ whois webair.com

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.

WEBAIR.COM.<b>BR</b>.GAROTAEXECUTIVO.COM
WEBAIR.COM
</pre>
<p>Hhhmmm&#8230; looks like a Brazilian domain ;). Looking at the real entry: <i>GAROTAEXECUTIVO.COM</i>.</p>
<pre>
Registrant:
   Executivo
   Rua: Executivo 3333
   Sao Paulo, Sao Paulo  01313000
   BR

   Registrar: DOTSTER
   Domain Name: GAROTAEXECUTIVO.COM
      Created on: 24-OCT-07
      Expires on: 24-OCT-09
      Last Updated on: 04-OCT-08

   Administrative, Technical Contact:
      Club, Executivo  postmaster@postmaster.com
      Executivo
      Rua: Executivo 3333
      Sao Paulo, Sao Paulo  01313000
      BR
      551122334455
</pre>
<p>Yeah! it&#8217;s a Brazilian one! Now, looking for all those URLs to make me fall in the fraudulent activity of <i>phishing</i>, where I&#8217;ve found three interesting URLs:</p>
<ul>
<li><b>hxxp://www.santander.cl/estilos/2008_08/bitmaps/santander.gif</b><br/>WOW!, it points to an image at the Chilean bank &mdash; I&#8217;ve replaced the t for x intentionally &mdash; and surely this will make some believe some people that the electronic mail is quiet real.</li>
<li><b>hxxps://www.officebanking.cl/images/porque.gif</b><br/>WOW!, it points to an URL of the same bank but using the HTTPS protocol, this will make a possible client to believe that is pointing to the real bank, since many email clients asks for the site certificate. Interesting.</li>
<li><b>hxxp://www.fpfa.esp.br/imagens/campeoes/st2.php</b><br/>WOW!, the full URL to the phishing site! I&#8217;ve not opened the URL, and I don&#8217;t know what is behind it :B</li>
</ul>
<p>The piece of code with the link to the phishing web site in the body of the message:</p>
<pre>
&lt;span class=&quot;style10&quot;&gt;
                                            &lt;a target=&quot;_blank&quot;
href=&quot;http://www.fpfa.esp.br/imagens/campeoes/st2.php&quot;&gt;
                        &lt;img
src=&quot;https://www.officebanking.cl/images/ingresar.gif&quot;
align=&quot;middle&quot; border=&quot;0&quot; width=&quot;65&quot;
height=&quot;21&quot;&gt;&lt;/a&gt;&lt;/span&gt;
</pre>
<h3>conclusions</h3>
<ul>
<li>You can not trust in banking electronic mail until you strongly verify the electronic mail.</li>
<li>You can not enter any site with your financial institution logos without verifying the URL bar.</li>
<li>Google permits to download the message source.</li>
<li>Use a good electronic mail client, for example <a href="http://www.mozillamessaging.com/en-US/thunderbird/">Thunderbird</a> has good advices on <i>spam</i> and <i>phishing</i>.</li>
<li>Certainly the <i>www.fpfa.esp.br</i> site was <a href="http://www.catb.org/jargon/html/C/cracker.html">cracked</a>, and was used for phishing activities, and I&#8217;ve blocked it in my browser.</li>
<li>Those <i>virtual1.webair.com</i> servers are widely opened to be used by <a href="http://en.wikipedia.org/wiki/E-mail_spam">spammers</a>, and I&#8217;ve added them to my blacklist.</li>
</ul>
<p><!--:--></p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2009. |
<a href="http://coder.cl/2009/09/identifying-phishing-email/">Permalink</a> |
<a href="http://coder.cl/2009/09/identifying-phishing-email/#comments">One comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2009/09/identifying-phishing-email/&title=identifying phishing email">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2009/09/identifying-phishing-email/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>securing apache 2.x</title>
		<link>http://coder.cl/2009/07/protecting-apache-2x/</link>
		<comments>http://coder.cl/2009/07/protecting-apache-2x/#comments</comments>
		<pubDate>Thu, 16 Jul 2009 16:21:33 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=82</guid>
		<description><![CDATA[This is not a security guide for Apache HTTP Server. Instead is a small guide that can be used as reference to protect some aspects of how the applications and pages are served. For security guides, you must look at other places. Well, I hope this approach would help a little in your administration tasks. [...]]]></description>
			<content:encoded><![CDATA[<p><!--:en-->
<p>This is not a <i>security guide</i> for <a href="http://httpd.apache.org/">Apache</a> HTTP Server. Instead is a small guide that can be used as reference to protect some aspects of <i>how the applications and pages are served</i>. For security guides, you must look at other places. Well, I hope this approach would help a little in your administration tasks. <i>All examples are not a copy/paste rules, you must think on them</i>. I&#8217;ll never give you recipes&#8230; you always must think.</p>
<p><!--:--><span id="more-82"></span><!--:en--></p>
<p></p>
<h3>anonymous version</h3>
<p>In <a href="http://httpd.apache.org/docs/2.0/">Apache 2.X</a> you can avoid of showing the server version and installed extensions, such as <i>mod_php</i>, <i>mod_perl</i> and others. This is an easy task, just add the both next directives &mdash; search for them and change their value.</p>
<pre>
#
# This hides the server signature on error pages.
# This means that the server version is not shown
# on error pages.
#
<a href="http://httpd.apache.org/docs/2.0/mod/core.html#serversignature">ServerSignature</a> Off

#
# This will hide the server version and installed
# modules on the response headers.
#
<a href="http://httpd.apache.org/docs/2.0/mod/core.html#servertokens">ServerTokens</a> Prod
</pre>
<p></p>
<h3>limit requests</h3>
<p><a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a> is a good option to setup some filters on your server. If you enable this module, you can filter the <a href="http://en.wikipedia.org/wiki/Request_method##Request_methods">request method</a> and certain <a href="http://en.wikipedia.org/wiki/Common_Gateway_Interface">CGI enabled URLs</a>.</p>
<h4>mod_rewrite filters</h4>
<p>If you serve <i>dynamic web pages</i> using some module as <i>mod_perl</i> or <i>mod_php</i>, you can filter only the used methods on your application, in example: <tt>HEAD</tt>, <tt>OPTIONS</tt>, <tt>GET</tt> and <tt>POST</tt>, and disable other methods, such as <tt>TRACE</tt> or <a href="http://en.wikipedia.org/wiki/WebDAV">WebDAV</a> methods.</p>
<pre>
#
# this rule will block all request that differs from HEAD, OPTIONS,
# GET and POST
#
&lt;IfModule mod_rewrite.c&gt;
    RewriteCond     %{REQUEST_METHOD}       !^(HEAD|OPTIONS|GET|POST)$
    RewriteRule     (.*)                    [F,NS]
&lt;/IfModule&gt;
</pre>
<p>You can build a better <i>request block</i> using directories, in example over upload directories.</p>
<pre>
#
# this rule will block every request method that differs from HEAD,
# OPTIONS and GET. also it will block any request in files that do
# not have the extensions jpg, png and gif. It also works with image
# directories ;)
#
&lt;IfModule mod_rewrite.c&gt;
&lt;Directory "/var/www/site1/upload"&gt;
    RewriteCond     %{REQUEST_METHOD}       !^(HEAD|OPTIONS|GET)$       [OR]
    RewriteCond     %{REQUEST_FILENAME}     !^.*.(jpg|png|gif)$
    RewriteRule     (.*)                    [F,NS]
&lt;/Directory&gt;
&lt;/IfModule&gt;
</pre>
<p>You can play a lot with all those <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond">RewriteCond</a> and <a href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewriterule">RewriteRule</a>. Also, you can block unwanted scripts, in example, if you are using <tt>PHP</tt> as your unique <i>dynamic language</i> to display your <i>dynamic pages</i>, you do not need to allow any <i>Perl</i> or <i>Python</i> scripts, you can block all other scripts that are unwanted on your site.</p>
<pre>
#
# this one will allow only PHP scripts, and also
# HTML pages and JavaScript
#
&lt;IfModule mod_rewrite.c&gt;
&lt;Directory "/var/www/site1/"&gt;
    RewriteCond     %{REQUEST_METHOD}       !^(HEAD|OPTIONS|GET|POST)$       [OR]
    RewriteCond     %{REQUEST_FILENAME}     !^.*.(php|html|htm|js)$
    RewriteRule     (.*)                    [F,NS]
&lt;/Directory&gt;
&lt;/IfModule&gt;
</pre>
<p>And yet, there are a lot of useful rules that you can apply, just think on them to fit your needs. Well, also you can enable <i>Apache</i> to allow only preprocessed URLs, in example if you are using some kind of wrapper to deny <i>direct access</i> to all PHP scripts, why, because our application is a <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</a> based application.</p>
<pre>
#
# we deny access to all kind of scripts on our system
#
&lt;IfModule mod_rewrite.c&gt;
&lt;Directory "/var/www/site1/"&gt;
    RewriteCond     %{REQUEST_METHOD}       !^(HEAD|OPTIONS|GET|POST)$          [OR]
    RewriteCond     %{SCRIPT_FILENAME}      !^.*.(jpg|png|gif|html|htm|js)$    [OR]
    RewriteCond     %{REQUEST_FILENAME}     ^.*.(py|pl|cgi|php|php3|shtml)$
    RewriteRule     (.*)                    [F,NS]
#
# we allow jpg, png, gif, js and html
#
    RewriteCond     %{SCRIPT_FILENAME}      !^.*.(jpg|png|gif|html|htm|js)$    [OR]
    RewriteRule     (.*)                    $1                                  [PT]

#
# and then we redirect all requests to the /index.php script ;)
# possibly the main controller on our application
#
    RewriteCond     %{REQUEST_METHOD}       !^(HEAD|OPTIONS|GET|POST)$
    RewriteRule     (.*)                    /index.php?$1                       [PT]
&lt;/Directory&gt;
&lt;/IfModule&gt;
</pre>
<p>You can play a lot with <i>mod_rewrite</i> rules and customize your application to allow users to have <i>normal</i> and <i>browser based</i> access to your application.</p>
<p></p>
<h4>limit by location</h4>
<p>Two helpful directives are <a href="http://httpd.apache.org/docs/2.0/mod/core.html#limit">Limit</a> and <a href="http://httpd.apache.org/docs/2.0/mod/core.html#limitexcept">LimitExcept</a>. Those directives can allow you to limit the request method for certain <a href="http://httpd.apache.org/docs/2.0/mod/core.html#location">Location</a>.</p>
<pre>
#
# this will block other request method
# than HEAD GET POST OPTIONS, under Location
#
&lt;Location /&gt;
    &lt;Limit HEAD GET POST OPTIONS&gt;
        Order allow,deny
        Allow from all
    &lt;/Limit&gt;
    &lt;LimitExcept HEAD GET POST OPTIONS&gt;
        Order deny,allow
        Deny from all
    &lt;/LimitExcept&gt;
&lt;/Location&gt;
</pre>
<p></p>
<h3>third party modules</h3>
<p>Well here you have a list of modules that you can use. All of them will help you on protecting your application</p>
<ul>
<li><a href="http://www.modsecurity.org/">mod_security</a></li>
<li><a href="http://www.zdziarski.com/projects/mod_evasive/">mod_evasive</a></li>
<li><a href="http://software.othello.ch/mod_clamav/">mod_clamav</a></li>
</ul>
<p></p>
<h3>disable unused modules</h3>
<p>Make deep review on how many modules are you using. If you are not using certain module, just remove it from your configuration. In example, many sites have enabled the <i>dav_module</i> and <i>dav_fs_module</i>, when they really don&#8217;t need them. This will reduce all possible bugs that can be remotely attacked and will reduce the memory and processor usage ;)</p>
<p></p>
<h3>on what can&#8217;t help?</h3>
<p>Surely, there a lot of <i>&quot;responsibility of the user&quot;</i> issues on those those modules and rules can not help. In example, weak passwords, buggy applications, weak validations and wrong handled user privileges.</p>
<p>I&#8217;ve found an interesting paper on this topic, about the <i>user authentication</i> issue. It&#8217;s written by <a href="http://www.mit.edu/">MIT</a> researchers. Here is the <i>abstract</i> bellow.</p>
<blockquote><p>
Client authentication has been a continuous source of problems on the Web. Although many well studied techniques exist for authentication, Web sites continue to use extremely weak authentication schemes, especially in non enterprise environments such as store fronts. These weaknesses often result from careless use of authenticators within Web cookies. Of the twenty seven sites we investigated, we weakened the client authentication on two systems, gained unauthorized access on eight, and extracted the secret key used to mint authenticators from one.</p></blockquote>
<blockquote><p>
We provide a description of the limitations, requirements, and security models specific to Web client authentication. This includes the introduction of the interrogative adversary, a surprisingly powerful adversary that can adaptively query a Web site.</p></blockquote>
<blockquote><p>
We propose a set of hints for designing a secure client authentication scheme. Using these hints, we present the design and analysis of a simple authentication scheme secure against forgeries by the interrogative adversary. In conjunction with SSL, our scheme is secure against forgeries by the active adversary.</p></blockquote>
<p>And here is the link to <a href="http://pdos.csail.mit.edu/papers/webauth:tr.pdf">download it</a>. I hope that all of those topics would help on your <i>Web Site</i> maintenance and development&#8230; And yet I know that I don&#8217;t cover some other issues, but that&#8217;s because I know that you can search for <i>proper research</i> and do <i>security labs</i> on your application ;)</p>
<p><!--:--></p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2009. |
<a href="http://coder.cl/2009/07/protecting-apache-2x/">Permalink</a> |
<a href="http://coder.cl/2009/07/protecting-apache-2x/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2009/07/protecting-apache-2x/&title=securing apache 2.x">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2009/07/protecting-apache-2x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>easy web services with pyxser</title>
		<link>http://coder.cl/2009/05/pyxser-10r-and-webservices/</link>
		<comments>http://coder.cl/2009/05/pyxser-10r-and-webservices/#comments</comments>
		<pubDate>Mon, 11 May 2009 03:37:27 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[pyxser]]></category>
		<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=76</guid>
		<description><![CDATA[Working with Web Services is not an easy task. We must know about XML, WSDL and some other technologies and also the framework that we are using. In this article I will try to demonstrate how easy is the task of sending objects through Web Services. First of all I&#8217;m using SOAPpy as my Web [...]]]></description>
			<content:encoded><![CDATA[<p><!--:en-->
<p>Working with <i>Web Services</i> is not an easy task. We must know about <b>XML</b>, <b>WSDL</b> and some other technologies and also the framework that we are using. In this article I will try to demonstrate how easy is the task of sending objects through <i>Web Services</i>. First of all I&#8217;m using <a href='http://soapy.sourceforge.net/'>SOAPpy</a> as my <i>Web Services</i> framework and the second element in the recipe is <a href='http://coder.cl/software/pyxser/'>pyxser</a> my Python-Object to XML serializer and deserializer.</p>
<p><!--:--><span id="more-76"></span><!--:en--></p>
<p>A single web service that should receive an <i>XML string</i>, now can convert that input into a <i>Python Object</i>. Let&#8217;s see the server code under <i>SOAPpy</i> framework ;)</p>
<pre class="brush: python;" cols="80" rows="43">
#!/usr/bin/env python
#
#
import pyxser as ser
from testpkg.sample import *
import SOAPpy

def hello(request):
    ### so we take the input string as xml and we deserialize it
    req = ser.unserialize(obj = request, enc = &quot;ascii&quot;)
    ### we create a response object
    reqo = TestAnotherObject()
    ### we assign equal .first_element properties
    reqo.first_element = req.first_element
    ### we set a custom .second_element property
    reqo.second_element = &quot;client&quot;
    ### we serialize the response object
    rep = ser.serialize(obj = reqo, enc = &quot;ascii&quot;, depth = 0)
    ### we return back the response object as xml string
    return rep

### create the server
server = SOAPpy.Server.SOAPServer((&quot;localhost&quot;, 8888))
### register the hello function
server.registerFunction(hello)

print &quot;Starting server...&quot;
### and let server run...
server.serve_forever()
</pre>
<p>The code above show a single server with one operation <i>hello()</i>. The <b>pyxser</b> serializer can not serialize/deserialize classes declared in the <i>__main__</i> module. So we declare a class in an external module <i>testpkg.sample</i> with the code bellow.</p>
<pre class="brush: python;" cols="80" rows="43">
__all__ = [
    'TestAnotherObject']

class TestAnotherObject:
    first_element = &quot;123&quot;
    second_element = &quot;456&quot;
    def __str__(self):
        return repr(self.__dict__)
    def __repr__(self):
        return repr(self.__dict__)
</pre>
<p>This module contains our serialization target <i>data transfer object</i>. Now, at the client side, we have a complete support to send and receive objects using pyxser ;).</p>
<pre class="brush: python;" cols="80" rows="43">
#!/usr/bin/env python
#
#
#

import pyxser as ser
import sys, httplib
from testpkg.sample import *
import SOAPpy

HELLOWS_NS = &quot;http://localhost/hellows/&quot;

def GetHello():
    ### we create a request object
    reqo = TestAnotherObject()
    ### we set the object properties as we need
    reqo.first_element = &quot;client&quot;
    reqo.second_element = &quot;server&quot;
    ### we serialize the object using pyxser
    hstr = ser.serialize(obj = reqo, enc = &quot;ascii&quot;, depth = 0)
    ### we create a SOAP proxy to our server
    server = SOAPpy.SOAPProxy(&quot;http://localhost:8888/&quot;)
    ### we call the server method and we get the xml string
    resp = server.hello(hstr)
    ### we convert the response xml into a python object and
    ### return it!
    return ser.unserialize(obj = resp, enc = &quot;ascii&quot;)

if __name__ == &quot;__main__&quot;:
    ### then we can manipulate the object easily
    newobj = GetHello()
    print newobj.first_element[0:2]
</pre>
<p>We can do more expertize work with pyxser. You can try using <i>WSDL</i>, and importing the complete pyxser 1.0 XML Schema as follows&#8230;</p>
<pre class="brush: xml;" cols="80" rows="43">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;
&lt;wsdl:definitions xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot;
        xmlns:tns=&quot;http://www.example.org/Hello/&quot;
        xmlns:wsdl=&quot;http://schemas.xmlsoap.org/wsdl/&quot;
        xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;
        xmlns:pyxs=&quot;http://projects.coder.cl/pyxser/model/&quot; name=&quot;Hello&quot;
        targetNamespace=&quot;http://www.example.org/Hello/&quot;&gt;
        &lt;wsdl:types&gt;
                &lt;xsd:schema targetNamespace=&quot;http://www.example.org/Hello/&quot;
                        xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot;
                        xmlns:tns=&quot;http://www.example.org/Hello/&quot;
                        xmlns:wsdl=&quot;http://schemas.xmlsoap.org/wsdl/&quot;
                        xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;
                        xmlns:pyxs=&quot;http://projects.coder.cl/pyxser/model/&quot;&gt;
                        &lt;xsd:import
                                namespace=&quot;http://projects.coder.cl/pyxser/model/&quot;
                                schemaLocation=&quot;pyxser-1.0.xsd&quot; /&gt;
                        &lt;xsd:element name=&quot;obj&quot; /&gt;
                &lt;/xsd:schema&gt;
        &lt;/wsdl:types&gt;
        &lt;wsdl:message name=&quot;HelloRequest&quot;&gt;
                &lt;wsdl:part element=&quot;tns:obj&quot; name=&quot;request&quot; /&gt;
        &lt;/wsdl:message&gt;
        &lt;wsdl:message name=&quot;HelloResponse&quot;&gt;
                &lt;wsdl:part element=&quot;tns:obj&quot; name=&quot;response&quot; /&gt;
        &lt;/wsdl:message&gt;
        &lt;wsdl:portType name=&quot;Hello&quot;&gt;
                &lt;wsdl:operation name=&quot;Hello&quot;&gt;
                        &lt;wsdl:input message=&quot;tns:HelloRequest&quot; /&gt;
                        &lt;wsdl:output message=&quot;tns:HelloResponse&quot; /&gt;
                &lt;/wsdl:operation&gt;
        &lt;/wsdl:portType&gt;
        &lt;wsdl:binding name=&quot;HelloSOAP&quot; type=&quot;tns:Hello&quot;&gt;
                &lt;soap:binding style=&quot;document&quot;
                        transport=&quot;http://schemas.xmlsoap.org/soap/http&quot; /&gt;
                &lt;wsdl:operation name=&quot;Hello&quot;&gt;
                        &lt;soap:operation
                                soapAction=&quot;http://www.example.org/Hello/Hello&quot; /&gt;
                        &lt;wsdl:input&gt;
                                &lt;soap:body use=&quot;literal&quot; /&gt;
                        &lt;/wsdl:input&gt;
                        &lt;wsdl:output&gt;
                                &lt;soap:body use=&quot;literal&quot; /&gt;
                        &lt;/wsdl:output&gt;
                &lt;/wsdl:operation&gt;
        &lt;/wsdl:binding&gt;
        &lt;wsdl:service name=&quot;Hello&quot;&gt;
                &lt;wsdl:port binding=&quot;tns:HelloSOAP&quot; name=&quot;HelloSOAP&quot;&gt;
                        &lt;soap:address location=&quot;http://www.example.org/&quot; /&gt;
                &lt;/wsdl:port&gt;
        &lt;/wsdl:service&gt;
&lt;/wsdl:definitions&gt;
</pre>
<p>So we can use integrate our Python web services by calling with other platforms and let the other platforms know the pyxser serialization model to allow us to develop more complex Web Services&#8230;</p>
<p>Certainly the pyxser package comes with with both standard and C14N XML schemas, and both standard and C14N XML DTDs &mdash; or document type definitions &mdash; so you can use them in your Web Services development.</p>
<p><!--:--></p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2009. |
<a href="http://coder.cl/2009/05/pyxser-10r-and-webservices/">Permalink</a> |
<a href="http://coder.cl/2009/05/pyxser-10r-and-webservices/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2009/05/pyxser-10r-and-webservices/&title=easy web services with pyxser">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2009/05/pyxser-10r-and-webservices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>i&#8217;ve changed my gpg keys&#8230;</title>
		<link>http://coder.cl/2009/02/ive-changed-my-gpg-keys/</link>
		<comments>http://coder.cl/2009/02/ive-changed-my-gpg-keys/#comments</comments>
		<pubDate>Fri, 20 Feb 2009 13:08:17 +0000</pubDate>
		<dc:creator>dmw</dc:creator>
				<category><![CDATA[projects]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://coder.cl/?p=60</guid>
		<description><![CDATA[I&#8217;ve changed my GPG keys. Take the new ones&#8230; -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Key Type:...........RSA Key Length:.........4096 Signing Algorithm:..SHA512 Cipher Algorithm:...AES-256 Entropy Used:.......HW-RNG Passphrase Length:..25-up chars Valid Keys: pub 4096R/98E0EE4D 2009-02-20 uid Daniel Molina Wegener (Developer) pub 4096R/67B3A7BB 2009-02-20 uid Daniel Molina Wegener (Developer) pub 4096R/8F9B167B 2009-02-20 uid Daniel Molina Wegener (Developer) Revoked [...]]]></description>
			<content:encoded><![CDATA[<p><!--:en-->
<p>I&#8217;ve changed my GPG keys. Take the new ones&#8230;</p>
<p><!--:--><span id="more-60"></span><!--:en--></p>
<pre>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

Key Type:...........RSA
Key Length:.........4096
Signing Algorithm:..SHA512
Cipher Algorithm:...AES-256
Entropy Used:.......HW-RNG
Passphrase Length:..25-up chars

Valid Keys:
pub   4096R/98E0EE4D 2009-02-20
uid                  Daniel Molina Wegener (Developer)

pub   4096R/67B3A7BB 2009-02-20
uid                  Daniel Molina Wegener (Developer)

pub   4096R/8F9B167B 2009-02-20
uid                  Daniel Molina Wegener (Developer)

Revoked Keys:
pub   4096R/A8F10DE3 2009-02-18 [revocada: 2009-02-20]
uid                  Daniel Molina Wegener (Developer)

pub   1024D/32C7B9FA 2009-02-18 [revocada: 2009-02-20]
uid                  Daniel Molina Wegener (Developer)

pub   4096R/DF22B3AF 2009-02-18 [revocada: 2009-02-20]
uid                  Daniel Molina Wegener (Developer)

pub   1024D/4B0608C4 2007-02-06 [revocada: 2009-02-18]
uid                  Daniel Molina Wegener (Developer)
uid                  [jpeg image of size 2663]

pub   1024D/41696C3C 2007-02-06 [revocada: 2009-02-18]
uid                  Daniel Molina Wegener (Developer)
uid                  [jpeg image of size 2663]

pub   1024D/F5CEDD61 2007-10-27 [revocada: 2009-02-18]
uid                  Daniel Molina Wegener (Developer)
uid                  [jpeg image of size 2997]

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iQIcBAEBCgAGBQJJn3Q1AAoJEHxqfq6Y4O5NjF4QAJF2Nnnnb2rPP7Oy++U3hF3u
Tud8Yx2wLjSHCb94pM0AYgi/bVFYBQhUx0tN1TDx/WcsXpbkYvVMiV+4z/IjyL2P
zdFqSFp9igE3daYc4ScmrUY0bw+A/ZS5mcgNE2zKuPKD4Vu8rLwpf4JfJ5BKy/Mo
u8QIQNECOSJcPCZn4HQZA07CZcyRpGnCeDQVxiUQtpJSmSHEVoyiCMd3jMxDxYVH
glby39MXjKE1tnlYeC6DqV7bdGnATYrRoaTfRtowj/XRDmOtg117exTCkBQ5FYLd
oUXKxkSimUIlqLtTfLv+DCJDD0x1m5OCAQjXhtgjcCx1uzOdojpR40+/3dyaNKz4
SJ/Yf69fNnk2/TAikSMyrojZ5aZuAHY4XV6RUtqPbv2mmdLNoEBbQE8hSG+Bd0cm
Wf5/twfRl+85jvaa5niJZEBMJM8Y3leo++3lJQnlkrXMgJD4AFzCMU0V7c6iMCsQ
TVxPOkQT/ZPSWIv37dhEhJTekPVKrBxlhzY/Wii91Zrm08LDRz6CHPCRcyl8r9Gc
PJ2DTPOoWnLDSku56TFLCMPquTlHFgut76Uh+lIr1Gp6xX0XnoYTr279YRQL1JsD
JCrv4fhy3Q/WSbfYKhuV2x6ECST7WUK3GCbYlK20YDQS/0kkwbuGzX/dzwPOezdG
VjBUtFIMGwwOJWM3Rj7p
=yksm
-----END PGP SIGNATURE-----
</pre>
<p><!--:--></p>
<hr />
<p><small>© dmw for <a href="http://coder.cl">coder . cl</a>, 2009. |
<a href="http://coder.cl/2009/02/ive-changed-my-gpg-keys/">Permalink</a> |
<a href="http://coder.cl/2009/02/ive-changed-my-gpg-keys/#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://coder.cl/2009/02/ive-changed-my-gpg-keys/&title=i&#8217;ve changed my gpg keys&#8230;">del.icio.us</a>
<br/>
Post tags: <br/>
<br/>
<a href='http://creativecommons.org/licenses/by-nc-sa/3.0/' title='Creative Commons'><img src="http://coder.cl.qfl.wpcdn.arcostream.com/images/creative-commons.png" alt="Creative Commons"> Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)</a>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://coder.cl/2009/02/ive-changed-my-gpg-keys/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for ( 2e96b290f6c5ccd2bc6830557c0aba6e coder.cl/category/sysadmin/feed/ ) in 0.53693 seconds, on May 18th, 2012 at 12:22 pm UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 25th, 2012 at 12:22 pm UTC -->
