服务器插件用于管理 SASL 协商的服务器端。服务器插件通常随对应的客户机插件一同打包。服务器插件包含一种或多种服务器端 SASL 机制。每种 SASL 服务器机制都支持验证、完整性和保密性(后两者是可选的)。每种机制都提供有关该机制的功能的信息:
最大 SSF
最大安全标志
插件功能
用于使用插件的回调和提示 ID
服务器插件必须导出 sasl_server_plug_init()。libsasl 将调用 sasl_server_plug_init() 来初始化服务器的插件。插件将返回 sasl_server_plug_t 结构。sasl_server_plug_t 将为 libsasl 提供以下用于调用机制的入口点:
mech_new()-服务器通过调用 sasl_server_start()(使用 mech_new())来启动连接。mech_new() 将执行特定于机制的初始化。如有必要,mech_new() 将分配连接上下文。
mech_step()-mech_step() 可通过 sasl_server_start() 和 sasl_server_step() 来进行调用。调用 mech_new() 后,mech_step() 将对服务器端执行验证。如果验证成功,mech_step() 将返回 SASL_OK。如果需要更多数据,则将返回 SASL_CONTINUE。如果验证失败,则将返回 SASL 错误代码。如果出现错误,则将调用 seterror()。如果验证成功,则 mech_step() 必须返回包含相关安全层信息和回调的 sasl_out_params_t 结构。canon_user() 函数是此结构的一部分。服务器收到验证和授权 ID 时,必须调用 canon_user()。调用 canon_user() 函数将导致 propctx 被填充。标准化验证之前,应执行所有必需的辅助属性请求。标准化验证后,应执行授权 ID 查找。
返回 SASL_OK 之前,mech_step() 函数必须填充所有相关的 sasl_out_params_t 字段。这些字段可以执行以下函数:
doneflag-指示完整的交换
maxoutbuf-指示安全层的最大输出大小
mech_ssf-为安全层提供 SSF
encode()-由 sasl_encode()、sasl_encodev() 和 sasl_decode() 进行调用
decode()-由 sasl_encode()、sasl_encodev() 和 sasl_decode() 进行调用
encode_context()-由 sasl_encode()、sasl_encodev() 和 sasl_decode() 进行调用
decode_context()-由 sasl_encode()、sasl_encodev() 和 sasl_decode() 进行调用
mech_dispose()-mech_dispose() 是在安全关闭上下文时进行调用的。mech_dispose() 由 sasl_dispose() 进行调用。
mech_free()-mech_free() 是在 libsasl 关闭时进行调用的。插件的所有其余全局状态都是通过 mech_free() 释放的。
setpass() 可以设置用户口令。setpass() 使机制可以具有内部口令。
mech_avail() 由 sasl_listmech() 进行调用,目的是检查机制是否可用于给定用户。mech_avail() 可以创建新的上下文,进而避免对 mech_new() 的调用。只要性能不受影响,就应使用此方法创建上下文。