• coturn源码之SASLprep()函数


    RFC4013文档定义了准备国际化用户名和密码的规则,为了简化和简化实现,为用户名和密码定义了一个算法。本质上就是按照一个规则对输入字符串进行规范化输出,更多规范化规则可以参考RFC3454:Preparation of Internationalized Strings ("stringprep"),而RFC4013仅仅视为了用户名和密码定义了一个相同的规范化算法。

    
    
    /* We support only basic ASCII table */
    int SASLprep(uint8_t *s){
        if(s) {
            uint8_t *strin = s;
            uint8_t *strout = s;
            for(;;) {
                uint8_t c = *strin;
                if(!c) {
                    *strout=0;
                    break;
                }
    
                switch(c) {
                case 0xAD:
                    ++strin;
                    break;
                case 0xA0:
                case 0x20:
                    *strout=0x20;
                    ++strout;
                    ++strin;
                    break;
                case 0x7F:
                    return -1;
                default:
                    if(c<0x1F)
                        return -1;
                    if(c>=0x80 && c<=0x9F)
                        return -1;
                    *strout=c;
                    ++strout;
                    ++strin;
                };
            }
        }
    
        return 0;
    }

    对RFC4013文档的兴趣来源于对coturn源码的阅读,上面这个函数SASLprep()就是校验一个字符串是否符合RFC4013的文档规范,但正如它所注释的那样,这个代码仅仅实现了规范的一部分。

    但是,这份代码确是错误的,这三行代码*strout=0; *strout=0x20; *strout=c;赋值错误,因为右值(*strout)不允许被赋值,代码本意应该是让对应地址处的内容重写!

    参考文档:RFC4013、RFC3454。

  • 相关阅读:
    ubuntu故障处理
    最全http状态码
    go故障排查集锦
    docker知识11---docker service
    docker知识10---docker secret
    windows安装mysql
    信息收集
    模块
    Django:中间件
    Django:ORM单表操作
  • 原文地址:https://www.cnblogs.com/iuyy/p/13456814.html
Copyright © 2020-2023  润新知