anchor.diff:                [Name, Reason]),
               Error
       end.
  +
  +%% @doc
  +-spec compare_password(Encrypted :: encrypted_password(),
  +                       ClearPassword :: nonempty_string()) ->
  +                              boolean().
  +compare_password(Encrypted, ClearPassword)
  + when is_binary(Encrypted) ->
  +    %% legacy encrypted password
  +    Encrypted == crypto:sha(ClearPassword);
  +compare_password({sha, Salt, Encrypted}, ClearPassword) ->
  +    Encrypted == crypto:sha([Salt, ClearPassword]).
   
   %% @doc Fetch the user properties from the database.
   -spec getprops(Name :: name()) ->
  
positive.code:         {style, StyleID :: atom()} |
          {jid, string()} |
          {games, [echessd_game:id()]}.
  
  -type info_item_key() ::
          password | created | login | fullname | timezone |
  
negative.code: -spec check_property_(InfoItem :: info_item()) -> Value :: any().
  check_property_({password, V}) when is_binary(V) ->
      V;
  check_property_({password, {Algo, Salt, Encrypted} = V})
    when is_atom(Algo), is_binary(Salt), is_binary(Encrypted) ->
      V;
  check_property_({password, V}) when is_list(V) ->
      true = is_string(V),
      Salt = crypto:rand_bytes(4),
      {sha, Salt, crypto:sha([Salt, V])};
  check_property_({created, V}) when ?is_now(V) ->
      V;
  check_property_({games, V}) ->
  