【问题标题】:Erlang case expression not returning valueErlang case 表达式不返回值
【发布时间】:2016-07-28 16:00:39
【问题描述】:

下面是我用来解密一些之前加密的 XML 的代码 sn-p。如果没有加密(明文),那我就不用解密处理了,想原样返回。

它根本没有返回任何东西。请帮助我使它工作。

更新代码:

pop_offline_messages(Ls, LUser, LServer, odbc) ->
    EUser = ejabberd_odbc:escape(LUser),
    case odbc_queries:get_and_del_spool_msg_t(LServer,
                          EUser)
    of
      {atomic, {selected, [<<"username">>, <<"xml">>], Rs}} ->
      Ls ++
        lists:flatmap(fun ([_, XML]) ->
        ?INFO_MSG("decrypted message from mod_offline ~p ",[XML]),

       Top = case str:str(XML, <<"message">>) of
       Top >= 1 -> XML;
       Top == 0 -> crypto:aes_cfb_128_decrypt(<<"abcdefghabcdefgh">>,<<"12345678abcdefgh">>,base64:decode(XML))
    end,  
           case xml_stream:parse_element(XML) of
                    {error, _Reason} ->
                                          [];
                    El ->
                                          case offline_msg_to_route(LServer, El) of
                                              error ->
                                                  [];
                                              RouteMsg ->
                                                  [RouteMsg]
                                          end
                  end
              end,
              Rs);
      _ -> Ls
    end;

【问题讨论】:

  • 你能举一个应该被解密的输入数据的例子吗?
  • 我在crypto 文档中没有看到这个crypto:aes_cfb_128_decrypt/3 函数? erlang.org/doc/man/crypto_app.html
  • str:str/2 是做什么的?返回什么值?某些东西总是返回。
  • 您可能只是未能将结果分配给变量吗?从末尾的,来看,它不是函数中的最后一个表达式。
  • 您需要更精确:它会卡住吗?它是否返回一个空值?它会触发错误/异常/退出吗?

标签: encryption erlang xmpp aes ejabberd


【解决方案1】:

如果它“不返回任何东西”,要么是因为你没有执行它,要么是因为你没有存储结果。我建议您将代码更改为:

Result = case str:str(XML, <<"message">>) of
      1 -> XML;
      _ -> crypto:aes_cfb_128_decrypt(<<"abcdefghabcdefgh">>,<<"12345678abcdefgh">>,base64:decode(XML))
    end,
io:format("~p~n",[result]),
...

因为现在这个sn-p版本,没有用到case的结果,所以一评估就丢失了。

【讨论】:

  • 我尝试了你上面建议的存储结果,但现在我遇到了错误错误
  • **错误 **: {badmatch,\n111111111\njabber.org/protocol/chatstates'>\n\n离线存储">>},[{mod_offline, '-pop_offline_messages/4-fun-5-',2,[{file,"src/mod_offline.erl"},{line,464}]},{lists,flatmap,2,[{file,"lists.erl "},{line,1248}]},{mod_offline,pop_offline_messages,4,[{file,"src/mod_offline.erl"},{line,461}]}
  • 很难说,你有一个模块mod_offline,第464行返回值与你使用的模式不匹配(返回值为二进制字符串)
  • 这里收到的 Xml 可能是加密/纯文本,我正在检查它是否加密而不是在返回之前解密,如果是纯文本而不是原样返回。
猜你喜欢
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多