<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -266,7 +266,7 @@ The main text of this comment, formatted in C&lt;$file_format&gt;.
 
 =item userid
 
-The (8-byte) &quot;nice_id&quot; of the comment poster.
+The (8-byte) id of the comment poster.
 
 =item format
 </diff>
      <filename>lib/Angerwhale/Content/Filesystem/Item.pm</filename>
    </modified>
    <modified>
      <diff>@@ -14,13 +14,11 @@ Adds author information.
 sub filter {
     return
       sub {
-          my $self = shift;
-          my $context = shift;
-          my $item = shift;
+          my ( $self, $context, $item ) = @_;
 
           my $id = $item-&gt;metadata-&gt;{raw_author} = $item-&gt;metadata-&gt;{author};
           my $author = eval {
-              $context-&gt;model('UserStore')-&gt;get_user_by_nice_id($id)
+              $context-&gt;model('UserStore')-&gt;get_user_by_id($id)
                 if $id;
           };
           $author ||= Angerwhale::User::Anonymous-&gt;new;</diff>
      <filename>lib/Angerwhale/Content/Filter/Author.pm</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 
 package Angerwhale::Content::Filter::PGP;
 use Angerwhale::Signature;
-use Crypt::OpenPGP;
+use Crypt::GpgME;
 use Encode;
 use strict;
 use warnings;
@@ -21,9 +21,7 @@ appropriately.
 sub filter {
     return 
       sub {
-          my $self = shift;
-          my $context = shift;
-          my $item = shift;
+          my ( $self, $context, $item ) = @_;
 
           my $text;
           eval {
@@ -42,23 +40,16 @@ sub filter {
               return $item; # we're done.  nothing to do.
           }
 
-          if($item-&gt;metadata-&gt;{raw_author} &amp;&amp;
-             $item-&gt;metadata-&gt;{signed} eq 'yes'){
+          if($item-&gt;metadata-&gt;{raw_author} &amp;&amp; $item-&gt;metadata-&gt;{signed} eq 'yes') {
               # signature is cached, so restore user without checking sig
-              $item-&gt;metadata-&gt;{author} = 
-                $context-&gt;model('UserStore')-&gt;
-                  get_user_by_nice_id($item-&gt;metadata-&gt;{raw_author});
-
-              $item-&gt;metadata-&gt;{signor} =
-                pack( &quot;H*&quot;, $item-&gt;metadata-&gt;{raw_author});
+              $item-&gt;metadata-&gt;{author} = $context-&gt;model('UserStore')-&gt;get_user_by_id($item-&gt;metadata-&gt;{raw_author});
+              $item-&gt;metadata-&gt;{signor} = $item-&gt;metadata-&gt;{raw_author};
           }
           else {
               # no cached signature, check the signature
-              my $author =
-                get_user_signature($item-&gt;metadata-&gt;{raw_text},
-                                   $context-&gt;model('UserStore'));
+              my $author = get_user_signature($item-&gt;metadata-&gt;{raw_text});
               
-              if(!$author){
+              if(!$author) {
                   # bad signature!
                   $item-&gt;metadata-&gt;{author} = Angerwhale::User::Anonymous-&gt;new;
               }
@@ -66,14 +57,11 @@ sub filter {
                   # good signature
                   # cache the signature so we don't have to verify again
                   $item-&gt;store_attribute('signed', 'yes');
-                  $item-&gt;store_attribute('author',  unpack( &quot;H*&quot;, $author));
+                  $item-&gt;store_attribute('author', $author);
                   $item-&gt;metadata-&gt;{raw_author} = $item-&gt;metadata-&gt;{author};
                   
                   # setup the &quot;inflated&quot; author
-                  $item-&gt;metadata-&gt;{author} =
-                    $context-&gt;model('UserStore')-&gt;
-                      get_user_by_real_id($author);
-
+                  $item-&gt;metadata-&gt;{author} = $context-&gt;model('UserStore')-&gt;get_user_by_id($author);
                   $item-&gt;metadata-&gt;{signor} = $author;
               }
           }
@@ -89,18 +77,12 @@ Returns keyid of signature, or false if the signature is invalid.
 =cut
 
 sub get_user_signature {
-    my ($message, $userstore) = @_;
-    my $keyserver = $userstore-&gt;keyserver;
-    my $pgp       = Crypt::OpenPGP-&gt;new(
-                                        KeyServer       =&gt; $keyserver,
-                                        AutoKeyRetrieve =&gt; 1
-                                       );
-    
-    my ( $id, $sig ) = $pgp-&gt;verify( Signature =&gt; $message );
+    my $message = shift;
+
+    my ( $result, $plain ) = eval { Crypt::GpgME-&gt;new-&gt;verify( $message ) };
     
-    die $pgp-&gt;errstr    if !defined $id;
-    return $sig-&gt;key_id if $id;
-    return 0;    # otherwise
+    die &quot;$@&quot; if !defined $plain or $@;
+    return $plain ? lc($result-&gt;{signatures}-&gt;[0]-&gt;{fpr}) : 0;
 }
 
 1;</diff>
      <filename>lib/Angerwhale/Content/Filter/PGP.pm</filename>
    </modified>
    <modified>
      <diff>@@ -145,7 +145,7 @@ sub post : Local {
         my $captcha = $c-&gt;request-&gt;param('captcha');
 
         my $user = $c-&gt;stash-&gt;{user};
-        my $uid  = $user-&gt;nice_id if ( $user &amp;&amp; $user-&gt;can('nice_id') );
+        my $uid  = $user-&gt;id if ( $user &amp;&amp; $user-&gt;can('id') );
         my $comment = $c-&gt;model('Articles')-&gt;preview({ title  =&gt; $title,
                                                        body   =&gt; $body,
                                                        type   =&gt; $type,</diff>
      <filename>lib/Angerwhale/Controller/Comments.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,7 +4,7 @@ use strict;
 use warnings;
 use base 'Catalyst::Controller';
 use Angerwhale::Challenge;
-use Crypt::OpenPGP;
+use Crypt::GpgME;
 use YAML::Syck;
 
 # XXX: HACK, HACK, HACK ... !
@@ -61,22 +61,18 @@ sub process : Local {
         $c-&gt;detach();
     }
 
-    my $pgp = Crypt::OpenPGP-&gt;new(
-        KeyServer       =&gt; $keyserver,
-        AutoKeyRetrieve =&gt; 1
-    );
-    my ( $long_id, $sig ) = $pgp-&gt;verify( Signature =&gt; $input );
-    if ( !$nonce_data || !$sig ) {
+    my ( $result, $plain ) = Crypt::GpgME-&gt;new-&gt;verify( $input );
+
+    if ( !$nonce_data || !$plain ) {
         $c-&gt;flash( error =&gt; 'There was a problem verifying the signature.' );
         $c-&gt;res-&gt;redirect( $c-&gt;uri_for('/login') );
         $c-&gt;detach();
     }
 
-    my $sig_ok      = $sig &amp;&amp; $long_id;
-    my $key_id      = $sig-&gt;key_id;
-    my $nice_key_id = &quot;0x&quot; . substr( unpack( &quot;H*&quot;, $key_id ), -8, 8 );
+    my $sig_ok      = $result &amp;&amp; $plain;
+    my $id      = $result-&gt;{signatures}-&gt;[0]-&gt;{fpr};
 
-    $c-&gt;log-&gt;debug(&quot;keyid $nice_key_id ($long_id) is presumably logging in&quot;);
+    $c-&gt;log-&gt;debug(&quot;keyid $id is presumably logging in&quot;);
 
     eval {
         my $challenge = Load($nonce_data)
@@ -85,9 +81,9 @@ sub process : Local {
         $c-&gt;session-&gt;{nonce} = undef;
 
         my $nonce_ok = ( $nonce == $challenge );
-        $c-&gt;log-&gt;debug(&quot;$nice_key_id: nonce verified OK (was $challenge)&quot;)
+        $c-&gt;log-&gt;debug(&quot;$id: nonce verified OK (was $challenge)&quot;)
           if $nonce_ok;
-        $c-&gt;log-&gt;debug(&quot;$nice_key_id: Signature was valid&quot;)
+        $c-&gt;log-&gt;debug(&quot;$id: Signature was valid&quot;)
           if $sig_ok;
 
         die &quot;bad nonce&quot; if !$nonce_ok;
@@ -95,14 +91,14 @@ sub process : Local {
     };
 
     if ($@) {
-        $c-&gt;log-&gt;debug(&quot;Failed login for $nice_key_id: $@&quot;);
-        $c-&gt;response-&gt;body(&quot;You cheating scum!  You are NOT $nice_key_id!&quot;);
+        $c-&gt;log-&gt;debug(&quot;Failed login for $id: $@&quot;);
+        $c-&gt;response-&gt;body(&quot;You cheating scum!  You are NOT $id!&quot;);
         return;
     }
 
     my $user;
     eval {
-        $user = $c-&gt;model('UserStore')-&gt;get_user_by_real_id($key_id);
+        $user = $c-&gt;model('UserStore')-&gt;get_user_by_id($id);
         $c-&gt;model('UserStore')-&gt;refresh_user($user);
     };
     if ($@) {
@@ -117,7 +113,7 @@ sub process : Local {
 
     $c-&gt;session-&gt;{user} = $user;
     $c-&gt;log-&gt;debug(
-        &quot;successful login for &quot; . $user-&gt;fullname . &quot;($nice_key_id)&quot; );
+        &quot;successful login for &quot; . $user-&gt;fullname . &quot;($id)&quot; );
     $c-&gt;flash( message =&gt; &quot;You are now logged in as &quot;. $user-&gt;fullname );
     $c-&gt;response-&gt;redirect( $c-&gt;uri_for('/') );
 }</diff>
      <filename>lib/Angerwhale/Controller/Login.pm</filename>
    </modified>
    <modified>
      <diff>@@ -45,12 +45,12 @@ Return information about the current user
 
 sub current : Local {
     my ( $self, $c ) = @_;
-    my $user = $c-&gt;stash-&gt;{user}; # XXX: user
+    my $user = $c-&gt;stash-&gt;{user};
 
     $user = Angerwhale::User::Anonymous-&gt;new if !$user;
 
     $c-&gt;{stash} = {};
-    $c-&gt;stash-&gt;{user_id}  = $user-&gt;nice_id;
+    $c-&gt;stash-&gt;{user_id}  = $user-&gt;id;
     $c-&gt;stash-&gt;{fullname} = $user-&gt;fullname;
     $c-&gt;stash-&gt;{email}    = $user-&gt;email;
     $c-&gt;stash-&gt;{login_uri}= q{}.$c-&gt;uri_for('/login');</diff>
      <filename>lib/Angerwhale/Controller/Users.pm</filename>
    </modified>
    <modified>
      <diff>@@ -7,8 +7,6 @@ use YAML::Syck qw(LoadFile DumpFile);
 use Angerwhale::User;
 use File::Slurp qw(read_file write_file);
 use Carp;
-use Crypt::OpenPGP::KeyRing;
-use Crypt::OpenPGP::KeyServer;
 
 =head1 NAME
 
@@ -18,10 +16,6 @@ Angerwhale::Model::UserStore - Manages Blog users.
 
 Keeps track of the blog's users.
 
-    my $pgp_id = &quot;cafebabe&quot;;
-    my $user   = $c-&gt;model('UserStore')-&gt;get_user_by_nice_id($pgp_id);
-    print &quot;$pgp_id is &quot;. $user-&gt;fullname;
-
 See also L&lt;Angerwhale::User|Angerwhale::User&gt;.  Note that users are cached; they
 are refreshed from the keyserver according to the config's
 C&lt;update_interval&gt; in seconds.  Defaults to one hour.
@@ -54,9 +48,6 @@ Called by Catalyst to create and initialize userstore.
 
 =cut
 
-# XXX: TODO: allow for storing duplicate keyids.  keyids don't have to
-# be unique.
-
 sub new {
     my ( $self, $c ) = @_;
     $self = $self-&gt;next::method(@_);
@@ -79,58 +70,33 @@ sub new {
     return $self;
 }
 
-=head2 create_user_by_real_id
-
-=head2 create_user_by_nice_id
+=head2 create_user_by_id
 
-Creates a new user in the user store (by the OpenPGP keyid &quot;cafebabe&quot;
-[nice] or the Crypt::OpenPGP representation of that number [real]).
+Creates a new user in the user store
 Returns the C&lt;Angerwhale::User&gt; on success, exception on failure.
 
 =cut
 
-sub create_user_by_real_id {
-    my $self    = shift;
-    my $real_id = shift;
-    my $nice_id = unpack( 'H*', $real_id );
-
-    return $self-&gt;create_user_by_nice_id($nice_id);
-}
-
-sub create_user_by_nice_id {
-    my $self    = shift;
-    my $nice_id = shift;
-    return $self-&gt;get_user_by_nice_id($nice_id);
+sub create_user_by_id {
+    my ( $self, $id ) = @_;
+    return $self-&gt;get_user_by_id($id);
 }
 
-=head2 get_user_by_real_id
-
-=head2 get_user_by_nice_id
+=head2 get_user_by_id
 
 Retrieves the user, creating it if necessary.
 
 =cut
 
-sub get_user_by_real_id {
-    my $self    = shift;
-    my $real_id = shift;
-    my $nice_id = unpack( 'H*', $real_id );
-
-    return $self-&gt;get_user_by_nice_id($nice_id);
-}
-
-sub get_user_by_nice_id {
-    my $self    = shift;
-    my $nice_id = shift;
-    my $real_id = pack( 'H*', $nice_id );
+sub get_user_by_id {
+    my ( $self, $id ) = @_;
 
     my $dir          = $self-&gt;{users};
-    my $base         = &quot;$dir/$nice_id&quot;;
+    my $base         = &quot;$dir/$id&quot;;
     my $user         = {};
     my $last_updated = 0;
 
-    $user-&gt;{nice_id} = $nice_id;
-    eval { $user-&gt;{public_key}  = read_file(&quot;$base/key&quot;) };
+    $user-&gt;{id} = $id;
     eval { $user-&gt;{fullname}    = read_file(&quot;$base/fullname&quot;) };
     eval { $user-&gt;{fingerprint} = read_file(&quot;$base/fingerprint&quot;) };
     eval { $user-&gt;{email}       = read_file(&quot;$base/email&quot;) };
@@ -142,7 +108,6 @@ sub get_user_by_nice_id {
     eval { _user_ok($user); };
 
     if ( !$@ &amp;&amp; !$outdated ) {
-
         # refreshed OK
         return $user;
     }
@@ -150,7 +115,6 @@ sub get_user_by_nice_id {
     # create a user if the data was bad
     # or it's time to update
     eval {
-        delete $user-&gt;{public_key};
         delete $user-&gt;{fullname};
         delete $user-&gt;{fingerprint};
         delete $user-&gt;{email};
@@ -159,7 +123,7 @@ sub get_user_by_nice_id {
         _user_ok($user);
     };
 
-    warn &quot;could not refresh or retrieve user 0x$nice_id: $@&quot; if $@;
+    warn &quot;could not refresh or retrieve user $id: $@&quot; if $@;
     die &quot;user isnta a user&quot; if !$user-&gt;isa('Angerwhale::User');
     
     return $user;
@@ -168,9 +132,8 @@ sub get_user_by_nice_id {
 sub _user_ok {
     my $user = shift;
     die &quot;no name&quot;        if !$user-&gt;fullname;
-    die &quot;no key&quot;         if !$user-&gt;public_key;
     die &quot;no email&quot;       if !$user-&gt;email;
-    die &quot;no fingerprint&quot; if !$user-&gt;key_fingerprint;
+    die &quot;no fingerprint&quot; if !$user-&gt;id;
     return 1;
 }
 
@@ -181,8 +144,7 @@ Refresh the user's details from the keyserver
 =cut
 
 sub refresh_user {
-    my $self = shift;
-    my $user = shift;
+    my ( $self, $user ) = @_;
 
     $user-&gt;refresh;
     $self-&gt;store_user($user);
@@ -197,26 +159,23 @@ offline.
 
 =cut
 
-# stores by nice id
 sub store_user {
-    my $self = shift;
-    my $user = shift;
+    my ( $self, $user ) = @_;
 
     my $dir = $self-&gt;{users};
-    my $uid = $user-&gt;nice_id;
+    my $uid = $user-&gt;id;
 
     my $base = &quot;$dir/$uid&quot;;
-    mkdir $base                                      if !-d $base;
+    mkdir $base                                  if !-d $base;
     die &quot;couldn't create userdir $base for $uid&quot; if !-d $base;
     eval {
-        write_file( &quot;$base/key&quot;,          $user-&gt;public_key );
         write_file( &quot;$base/fullname&quot;,     $user-&gt;fullname );
-        write_file( &quot;$base/fingerprint&quot;,  $user-&gt;key_fingerprint );
+        write_file( &quot;$base/fingerprint&quot;,  $user-&gt;id );
         write_file( &quot;$base/email&quot;,        $user-&gt;email );
         write_file( &quot;$base/last_updated&quot;, time() );
     };
     if ($@) {
-        die &quot;Error writing user: $!&quot;;
+        die &quot;Error writing user: $@&quot;;
     }
 
     return 1;
@@ -229,10 +188,10 @@ Returns the time of the most recent refresh of all users.
 =cut
 
 sub last_updated {
-    my $self = shift;
-    my $user = shift;
+    my ( $self, $user ) = @_;
+
     my $dir  = $self-&gt;{users};
-    my $uid  = $user-&gt;nice_id;
+    my $uid  = $user-&gt;id;
     my $base = &quot;$dir/$uid&quot;;
 
     my $updated;
@@ -249,13 +208,14 @@ about.  The users are refreshed if they've expired.
 
 sub users {
     my $self = shift;
+
     my $dir  = $self-&gt;{users};
     my @users;
     opendir( my $dirhandle, $dir ) or die &quot;Couldn't open $dir for reading&quot;;
     while ( my $uid = readdir $dirhandle ) {
         next if $uid =~ /^[.][.]?$/;    # .. and . aren't users :)
         eval {
-            my $user = $self-&gt;get_user_by_nice_id($uid);
+            my $user = $self-&gt;get_user_by_id($uid);
             push @users, $user;
         };
     }</diff>
      <filename>lib/Angerwhale/Model/UserStore.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,8 +4,7 @@
 package Angerwhale::Signature;
 use strict;
 use warnings;
-use Crypt::OpenPGP;
-use Crypt::OpenPGP::Message;
+use Crypt::GpgME;
 use Angerwhale::User::Anonymous;
 use File::Attributes qw(get_attribute set_attribute);
 use Carp;
@@ -22,8 +21,8 @@ signed.
 
 sub signor {
     my $self = shift;
-    my ( $data, $sig ) = $self-&gt;_signed_text( $self-&gt;raw_text(1) );
-    return $sig-&gt;key_id;
+    my ( $result, $plain ) = $self-&gt;_signed_text( $self-&gt;raw_text(1) );
+    return lc($result-&gt;{signatures}-&gt;[0]-&gt;{fpr});
 }
 
 =head2 signed
@@ -61,7 +60,6 @@ sub signed {
 
     my $result = eval {
 
-        # XXX: Crypt::OpenPGP is really really slow, so cache the result
         my $signed = $self-&gt;_cached_signature;
 
         if ( defined $signed &amp;&amp; $signed eq &quot;yes&quot; ) {
@@ -82,36 +80,26 @@ sub signed {
             die &quot;Bad signature&quot;;
         }
     };
-    if ($@) {
-
-        #&quot;Problem checking signature on &quot;. $self-&gt;uri. &quot;: $@&quot;;
-        return 0;
-    }
 
+    return 0 if $@;
     return $result;
 }
 
 =head2 _check_signature($message)
 
-Checks the OpenPGP signature on $message.  Returns the real (binary)
-key id if the signature is valid.  Raises an exception on error.
-
-B&lt;Warning: slow.&gt;  It is best to cache the result, if possible.
+Checks the pgp signature on $message.  Returns the fingerprint
+if the signature is valid.  Raises an exception on error.
 
 =cut
 
 sub _check_signature {
     my ( $self, $message ) = @_;
-    my $keyserver = $self-&gt;userstore-&gt;keyserver;
-    my $pgp       = Crypt::OpenPGP-&gt;new(
-        KeyServer       =&gt; $keyserver,
-        AutoKeyRetrieve =&gt; 1
-    );
-    my ( $id, $sig ) = $pgp-&gt;verify( Signature =&gt; $message );
-
-    die $pgp-&gt;errstr    if !defined $id;
-    return $sig-&gt;key_id if $id;
-    return 0;    # otherwise
+
+    my ( $result, $plain ) = eval { Crypt::GpgME-&gt;new-&gt;verify( $message ) };
+
+    die &quot;$@&quot; if !defined $plain or $@;
+
+    return $plain ? lc($result-&gt;{signatures}-&gt;[0]-&gt;{fpr}) : 0;
 }
 
 =head2 signed_text($message)
@@ -119,41 +107,20 @@ sub _check_signature {
 Given PGP-signed $message, returns the plaintext of that message.
 Throws an exception on error.
 
-In array context, returns an list (data, signature), where data is a
-Crypt::OpenPGP::PlainText and signature isa Crypt::OpenPGP::Signature
-ora Crypt::OpenPGP::OnePassSig.
+In array context, returns an list (plain, result), where plain is a
+plaintext representtion of $message and result is a hash containing
+signature information
 
 =cut
 
 sub _signed_text {
     my ( $self, $message ) = @_;
-    my ( $data, $sig );
-    
-    my $msg = Crypt::OpenPGP::Message-&gt;new( Data =&gt; $message )
-      or croak &quot;Reading message failed: &quot; . Crypt::OpenPGP::Message-&gt;errstr;
-
-    my @pieces = $msg-&gt;pieces;
-    if ( ref( $pieces[0] ) eq 'Crypt::OpenPGP::Compressed' ) {
-        $data = $pieces[0]-&gt;decompress
-          or die &quot;Decompression error: &quot; . $pieces[0]-&gt;errstr;
-        $msg = Crypt::OpenPGP::Message-&gt;new( Data =&gt; $data )
-          or die &quot;Reading decompressed data failed: &quot;
-          . Crypt::OpenPGP::Message-&gt;errstr;
-        @pieces = $msg-&gt;pieces;
-    }
-
-    if ( ref( $pieces[0] ) eq 'Crypt::OpenPGP::OnePassSig' ) {
-        ( $data, $sig ) = @pieces[ 1, 2 ];
-    }
-    elsif ( ref( $pieces[0] ) eq 'Crypt::OpenPGP::Signature' ) {
-        ( $sig, $data ) = @pieces[ 0, 1 ];
-    }
-    else {
-        croak &quot;unable to read signature&quot;;
-    }
-
-    return ( $data, $sig ) if wantarray;
-    return $data-&gt;{data};    # otherwise, just the data
+
+    my ( $result, $plain ) = eval { Crypt::GpgME-&gt;new-&gt;verify( $message ) };
+
+    croak &quot;$@&quot; if !defined $plain or $@;
+
+    return wantarray ? ( $plain, $result ) : $plain;
 }
 
 =head1 _cached_signature
@@ -185,11 +152,9 @@ sub _cache_signature {
 # and base the author on the signature
 
 sub _fix_author {
-    my $self        = shift;
-    my $id          = shift;
-    my $nice_key_id = unpack( &quot;H*&quot;, $id );
+    my ( $self, $id ) = @_;
 
-    set_attribute( $self-&gt;location, 'author', $nice_key_id );
+    set_attribute( $self-&gt;location, 'author', $id );
 }
 
 1;</diff>
      <filename>lib/Angerwhale/Signature.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,8 +4,7 @@
 package Angerwhale::User;
 use strict;
 use warnings;
-use Crypt::OpenPGP::KeyServer;
-use Crypt::OpenPGP::KeyRing;
+use Crypt::GpgME;
 use Carp;
 
 =head1 SYNOPSIS
@@ -24,20 +23,7 @@ the binary representation of that integer as a string of eight bytes)
 
 sub id {
     my $self = shift;
-    my $id = pack( 'H*', $self-&gt;nice_id );
-}
-
-=head2 nice_id
-
-Returns the ID of the key as a 64-bit hexadecimal representation
-(i.e. 0x0f00b412cafebabe).  The last four octets are what users think
-the OpenPGP key id is.
-
-=cut
-
-sub nice_id {
-    my $self = shift;
-    return $self-&gt;{nice_id};
+    return $self-&gt;{id};
 }
 
 =head2 _keyserver
@@ -54,60 +40,6 @@ sub _keyserver {
     return $self-&gt;{keyserver};
 }
 
-=head2 key
-
-Returns the Crypt::OpenPGP::Keyblock representing the user's public
-key.
-
-B&lt;NOTE&gt;: Using this causes crashes, at least on my system during
-testing.  Be careful.
-
-=cut
-
-sub key {
-    my $self = shift;
-    my $ks   = Crypt::OpenPGP::KeyServer-&gt;new( Server =&gt; $self-&gt;_keyserver );
-    my $kb   = $ks-&gt;find_keyblock_by_keyid( $self-&gt;id );
-
-    # try to get the key if we don't have it
-
-    if ( !$kb ) {
-        carp &quot;No public key found for &quot; . $self-&gt;nice_id;
-    }
-
-    return $kb;
-}
-
-=head2 public_key
-
-Returns the ACSII-armoured OpenPGP public key block.
-
-=cut
-
-sub public_key {
-    my $self = shift;
-    my $key  = shift;
-
-    return $self-&gt;{public_key} if $self-&gt;{public_key};
-    return $key-&gt;save_armoured;
-}
-
-=head2 key_fingerprint
-
-Returns the 160-bit key fingerprint as a lowercase hex string.  (Same
-as what keyservers and GPG call the fingerprint.)
-
-=cut
-
-sub key_fingerprint {
-    my $self = shift;
-    my $key  = shift;
-    return $self-&gt;{fingerprint} if $self-&gt;{fingerprint};
-
-    my $signer = $key-&gt;signing_key;
-    return unpack 'H*', $signer-&gt;fingerprint;
-}
-
 =head2 fullname
 
 Returns the full name associated with the primary UID.
@@ -115,19 +47,14 @@ Returns the full name associated with the primary UID.
 =cut
 
 sub fullname {
-    my $self = shift;
-    my $key  = shift;
+    my ( $self, $id ) = @_;
+
     return $self-&gt;{fullname} if $self-&gt;{fullname};
 
-    my $name = eval {
-        my @uids = @{ $key-&gt;{pkt}-&gt;{'Crypt::OpenPGP::UserID'} };
-        my $uid = $uids[0]-&gt;id;    # XXX: best idea?
-        $uid =~ s/\s*&lt;.+&gt;\s*//g;
-        $uid =~ s/\s*[(].+[)]\s*//g;
-        return ( $self-&gt;{fullname} = $uid );
-    };
-    return &quot;Unknown Name&quot; if ($@);
-    return $name;
+    $id ||= $self-&gt;{id};
+    my $name = eval { return ( $self-&gt;{fullname} = [grep { !$_-&gt;{invalid} &amp;&amp; !$_-&gt;{revoked} } Crypt::GpgME-&gt;new-&gt;get_key($id)-&gt;uids]-&gt;[0]-&gt;{name} ) };
+
+    return $@ ? 'Unknown Name' : $name;
 }
 
 =head2 email
@@ -137,14 +64,14 @@ Returns the e-mail address associated with the primary UID.
 =cut
 
 sub email {
-    my $self = shift;
-    my $key  = shift;
+    my ( $self, $id ) = @_;
+
     return $self-&gt;{email} if defined $self-&gt;{email};
 
-    my @uids = @{ $key-&gt;{pkt}-&gt;{&quot;Crypt::OpenPGP::UserID&quot;} };
-    my $uid  = $uids[0]-&gt;id;                                   # XXX: best idea?
-    $uid =~ s/&lt;(.+)&gt;//g;
-    return $1;
+    $id ||= $self-&gt;{id};
+    my $email = eval { return ( $self-&gt;{email} = [grep { !$_-&gt;{invalid} &amp;&amp; !$_-&gt;{revoked} } Crypt::GpgME-&gt;new-&gt;get_key($id)-&gt;uids]-&gt;[0]-&gt;{email} ) };
+
+    return $@ ? 'Unknown Email' : $email;
 }
 
 =head2 photo
@@ -164,16 +91,13 @@ Refreshes the key from the network.
 =cut
 
 sub refresh {
-
-    # doesn't do anything anymore
     my $self = shift;
-    my $key  = $self-&gt;key;    # throws a good error on E_KEYNOTFOUND
-    $self-&gt;{public_key}  = $self-&gt;public_key($key);
-    $self-&gt;{fullname}    = $self-&gt;fullname($key);
-    $self-&gt;{email}       = $self-&gt;email($key);
-    $self-&gt;{fingerprint} = $self-&gt;key_fingerprint($key);
 
-    #    $self-&gt;{photo} = $self-&gt;photo($key);
+    my $id  = $self-&gt;id;
+    $self-&gt;{fullname}    = $self-&gt;fullname($id);
+    $self-&gt;{email}       = $self-&gt;email($id);
+    $self-&gt;{fingerprint} = $self-&gt;id;
+#    $self-&gt;{photo} = $self-&gt;photo($id);
 }
 
 # only for testing
@@ -181,7 +105,7 @@ sub _new {
     my ( $class, $id ) = @_;
     my $user = {};
     die 'specify id' if !$id;
-    $user-&gt;{nice_id} = unpack( 'H*', $id );
+    $user-&gt;{id} = $id;
     $user = bless $user, $class;
     $user-&gt;_keyserver('stinkfoot.org');
     $user-&gt;refresh;</diff>
      <filename>lib/Angerwhale/User.pm</filename>
    </modified>
    <modified>
      <diff>@@ -20,10 +20,6 @@ User that is un authenticated, like slashdot's Anonymous Coward.
 
 Create a new user
 
-=head2 nice_id
-
-0
-
 =head2 id
 
 0
@@ -45,10 +41,6 @@ sub new {
     return bless $self, $class;
 }
 
-sub nice_id {
-    return 0;
-}
-
 sub id {
     return 0;
 }</diff>
      <filename>lib/Angerwhale/User/Anonymous.pm</filename>
    </modified>
    <modified>
      <diff>@@ -101,7 +101,7 @@ sub serialize_item {
     $data-&gt;{author} = {
         name  =&gt; $author-&gt;fullname,
         email =&gt; $author-&gt;email,
-        keyid =&gt; $author-&gt;nice_id,
+        keyid =&gt; $author-&gt;id,
     };
 
     $data-&gt;{title}    = $item-&gt;title;</diff>
      <filename>lib/Angerwhale/View/Feed.pm</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>e7fbe33ce9b4de4b89735f2d9fc15d5aaed6bd77</id>
    </parent>
  </parents>
  <author>
    <name>arcanez</name>
    <email>justin.d.hunter@gmail.com</email>
  </author>
  <url>http://github.com/arcanez/angerwhale/commit/5180f75e250d2c2106aa946bcac2854975557559</url>
  <id>5180f75e250d2c2106aa946bcac2854975557559</id>
  <committed-date>2009-05-03T00:08:50-07:00</committed-date>
  <authored-date>2009-05-03T00:08:50-07:00</authored-date>
  <message>move from Crypt::OpenPGP to Crypt::GpgME

** CAVEAT **
.users are stored against their fingerprint instead of $real_id or $nice_id
you can remove your .users directory (and any .attributes in posts) and it should regenerate them
downside is you will lose tags, but a perl -p -i -e could search/replace the old 'id' to the new one</message>
  <tree>342b106cd7923bf9bf216532f540becff6a7c4c7</tree>
  <committer>
    <name>arcanez</name>
    <email>justin.d.hunter@gmail.com</email>
  </committer>
</commit>
