/*--微小的XMPP客户端——txmppc从stdin读取命令并打印到stdout。它是用于命令行或自动化的KISS客户端。超出范围:花名册->;有一个状态列表->;没有名称(别名)、组或订阅状态MUC管理->;基本工作:加入(使用密码)、写入和离开->;没有管理、邀请、注册、迪斯科。。。没有迪斯科舞厅、书签、pubsub、vcard、文件、语音。。。OMEMO-加密很好,但对于一个小客户端来说太复杂了:有一个库(https://github.com/gkdr/libomemo)和亵渎有一个很好的实现,但omemo的代码比txmppc大5倍->;亵渎(tui-OMEMO、OTR和PGP及插件)>;https://profanity-im.github.io/(c使用libstrophe)——>;poezio(tui-欧米莫和OTR)>;https://poez.io/(python使用slixmpp lib)>;mcabber(tui——没有OMEMO,但有OTR和PGP,外部脚本+fifo)——>;https://mcabber.com/(c)使用lib loudmouth->;https://github.com/mcabber/loudmouth)——>;xmppc(cli,它可以发送消息(聊天+PGP),监视和查询一些数据)->;https://codeberg.org/Anoxinon_e.V./xmppc(c使用libstrophe)——>;smplxmpp->;https://codeberg.org/tropf/smplxmpp(c++使用gloox库)——>;freetalk->;https://www.gnu.org/software/freetalk/(c)使用loudmouth)>;jj(创建文件系统(fifo)结构)>;https://23.fi/jj/(c使用loudmouth)构建:仅取决于libstophe>;gcc txmppc。c-lstrophe-o txmppcStatic编译(musl)>;gcc txmppc。c-lstrophe-lc-lssl-lcrypto-lexpat-static-o txmppc_static(取决于libstrophe,它可以是xml2而不是expat和/或gnutls而不是openssl)可选:>;strip txmppc_staticUse:[echo";命令jid消息";|]txmppc[_static]<;jid>&书信电报;通过>;[<;服务器>;[(:|=)<;端口>;]-jid和密码是必需的-可选的是服务器的第三个参数(和:port或=port->;如果tls启动(自签名证书)失败则忽略)。txmppc记录向stdout输入消息并从stdin读取命令-仅作为瘦客户端启动:>;txmppc-发送单个消息:>;echo和#34;[mM]jid消息";|txmppc->;txmppc执行命令并退出(在stdin关闭时)-对命令使用fifo:>;tail-f fifo | txmppc->;从fifo执行命令并打印到标准输出>;echo和#34;q">>;先进先出!尾巴仍然会等待——所以它不会';t出口->;发送另一行-tmux水平拆分+rlwrap客户端示例:(mkfifo-fifo;echo";[email protected]" >>;jid_文件)90%窗格>;一边读台词;打印F';%s:>;%s\n和#39"$(日期和#34;+%Y-%m-%d%H:%m和#34;)" "${line}">&;2.printf';%s\n和#39"${line}";;测试";q";="${line}"&&;打破完成<;fifo | txmppc JID PASS |读线时;打印F';%s:%s\n'"$(日期和#34;+%Y-%m-%d%H:%m和#34;)" "${line}";;完成10%窗格>;rlwrap-s-10-H/dev/null-b"" -f jid#U文件awk和#39;{print}/^q$/{exit}'>>;先进先出->;通过10行历史记录(未保存)和fid_文件中的jid完成,读取行编辑,输出将有一个日期前缀->;提示:在这种情况下,fifo可以';不能用于其他进程,因为发送EOF将结束客户端。命令:j[muc[密码]]->;加入多用户会议(无muc和#34;加入和#34;状态更改-默认打开)J muc[密码]->;加入多用户会议-无历史记录[muc]->;离开多用户会议(无muc和#34;离开和#34;状态更改)[m]jid[message]->;向jid发送(聊天)信息(无信息进入多行模式)h jid信息->;将标题消息发送到jidn jid消息->;将正常消息发送至jidM muc_jid消息->;向多用户会议发送(groupchat)消息(如果不在muc中,它将被加入并离开)。[信息]->;将(聊天|标题|正常|群组聊天)消息发送到最后一个jid(无消息进入多行模式)p[[优先级]状态]->;优先顺序:-128/127,出席:在[fline]| aw[ay]| ch[at]| dn[d]| xa->;不带arg:显示状态列表;无优先级:仅更改状态yp[jid[priority]状态[status]]->;向jid发送状态,额外状态:订阅|订阅|取消订阅|取消订阅->;无arg显示状态列表,包括不可用/离线Q->;结束/退出节->;发送原始节(无效数据可能导致XMPP服务器立即终止流)R[key]->;显示原始(消息、iq.result)节,如果它包含键-禁用而没有键->"<" (将匹配每一节),";智商""信息""碳""openpgp""[email protected]", ... (要查看使用-DDEBUG编译的每一节,它将启用libstrophe XMPP_LEVEL_DEBUG)输出:i->;infoI->;信息离线,失去连接P->;在场(使用j/l命令更改加入/离开状态)P->;状态列表M->;信息聊天(";m from:message";,如果碳来自self";m->;to:message";)n->;消息正常H->;消息标题M->;信息多->;消息muc historyr->;原始信息节->;错误w->;警告-命令错误->;(标准)启动错误->;将退出加密:-可以发送PGP加密消息(发送原始节):>;BASE64_OPENPGP_MESSAGE=$(echo和#34;MESSAGE和#34;|gpg | BASE64)和#34>;echo和#34;r<;致=';[email protected]'>&书信电报;openpgp xmlns=';urn:xmpp:openpgp:0'>${BASE64_OPENPGP_MESSAGE}</openpgp></信息>" | txmppc(节必须在一行中,可能由其他客户端支持:https://xmpp.org/extensions/xep-0373.html)->;请注意,大多数客户已经实施了过时的:https://xmpp.org/extensions/xep-0027.html->;用于接收原始消息节过滤(";R opengpg";)这是一种选择。-一种不符合XMPP的方式,如果两个客户端都使用txmppc,则可以使用任何加密编写脚本。年龄示例(不要使用受密码保护的密钥):发件人:>;加密消息="$(printf和#39;message和#39;age-r age1rredc3g8dfachch0d6gzt5katx3tsfesz35zc6jn3fl23jrfmq027uuuu9 | base64-w0)和#34>;printf和#39;[email protected]:%s'"${ENCRYPTED_MESSAGE}";|txmppc接收器:>;txmppc |读线时;做加密的_消息="${line#*MYCRYPT:}";如果[";${line}";=";${ENCRYPTED#MESSAGE}";];然后printf';%s\n和#39"${line}";else MESSAGE="$(printf';%s';";${ENCRYPTED#u MESSAGE}";| base64-d | age-d-i juliet.key)";printf';%s%s\n'"${line%MYCRYPT:}""${MESSAGE}";fi Donelices:https://holmeinbuch.de/repo/txmppc/ - matthias@Copyright(c)ISC License特此授予出于任何目的使用、复制、修改和/或分发本软件的许可,无论是否收费,前提是上述版权声明和本许可声明出现在所有副本中。软件提供";原样";作者否认与本软件有关的所有保证,包括所有关于适销性和适用性的暗示保证。在任何情况下,作者均不对因使用或执行本软件而产生的或与之相关的任何特殊、直接、间接或后果性损害或因使用、数据或利润损失而导致的任何损害负责,无论是在合同诉讼、疏忽或其他侵权诉讼中*/#包括<;ctype。h>#包括<;斯特迪奥。h>#包括<;stdlib。h>#包括<;一串h>#包括<;信号h>#包括<;系统/选择。h>#包括<;时间h>#包括<;unistd。h>;//https://www.rfc-editor.org/rfc/rfc6120-核心//https://www.rfc-editor.org/rfc/rfc6121-即时通讯+状态#包括<;斯特罗弗。h>;静态无符号短忽略证书失败=0;静态短路重新连接=1;//https://www.rfc-editor.org/rfc/rfc6120->;4.6.4检查方法的使用:建议每5分钟不超过一次#定义PING_间隔60静态字符PING_id[32]#定义BUFIN_MAX 4096//https://www.rfc-editor.org/rfc/rfc6121->;唐';t干扰优先级,负数可能得不到消息静态短连接优先级=0;静态无符号短显示\存在\状态\更改=1#定义存在;定义存在;定义存在;定义存在;定义存在。JID)JID)JID)最大静态字符。静态字符表示。类型[10][[13][[10][[13]={35;34;离线;离线;离线和34;34;34;在线和34;在线和34;在线和34;在线和34;在线和34;在线和34;在线和34;34;34;34;以及以及以及以及以及以及(35;34;34;34;在线和34;在线;34;34;34;34;34;34;34;34;34;在线和,以及以及以及,以及以及,以及以及以及以及以及,以及以及以及以及以及以及,34;在线;34;34;34;34;34;34;34;34;34;34;在线和,以及,以及,以及,以及,以及,以及,以及,以及,以及以及,以及,以及以及,以及以及以及以及,以及以及以及以及,以及以及以及以及以及以及,34;34;34;34;34;34#34;取消订阅";,";取消订阅";}#定义状态_离线0#定义状态_在线1#定义状态_在线_MUC-1#定义状态_在线_MUC-NO _历史-101#定义状态_离线_MUC-100//https://www.rfc-editor.org/rfc/rfc7622-地址(jid)#定义jid_MAX 3071+1上次发送的静态字符_类型_jid[1+jid_MAX];struct list_node{char jid[jid_MAX];短存在;短优先级;struct list_node*next;};静态结构列表节点*jid\u list=NULL;//https://xmpp.org/extensions/xep-0172.html-尼克->;昵称长度未定义//https://xmpp.org/extensions/xep-0045.html-muc->;昵称是jid的资源部分#定义NICK_MAX 1023+1静态字符NICK[NICK_MAX];静态短多_线=0#定义SHOW_RAW_STANZA_MAX 32静态字符SHOW_RAW_STANZA[SHOW_RAW_STANZA_MAX];无符号短截取开始位置(char*buf,unsigned short start_pos){unsigned short buf_len=(unsigned short)strlen(&;buf[start_pos])+start_pos for(unsigned short i=start_pos;i<;buf_len;i++){if(!isspace(buf[i]){return i;}返回buf_len;}void update_jid_list(const char*jid,short presence,short priority){struct list_node*list_before=NULL;struct list_node*list_current=jid_list;struct list_node*list_new=NULL;size_jid_len=strlen(jid);而(list_current){int jid_match=strnmp(jid,list_current->;jid,jidlen);if(jid_match==0){(presence==presence\u OFFLINE\u MUC){//remove jid,将MUC从列表中删除//如果self离开MUC,则使用裸jid->;删除每个MUC条目,而(list\u current&;strncmp(jid,list\u current->;jid\u len)==0){if(list\u before){list\u before->;next=list\u current->;next;free(list\u current); list_current=list_before->;下一步;}否则{jid_list=l
......