|
@@ -134,33 +134,38 @@ static size_t nfs_parse_server_name(char *string, size_t len,
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * nfs_find_best_sec - Find a security mechanism supported locally
|
|
|
+ * @flavors: List of security tuples returned by SECINFO procedure
|
|
|
+ *
|
|
|
+ * Return the pseudoflavor of the first security mechanism in
|
|
|
+ * "flavors" that is locally supported. Return RPC_AUTH_UNIX if
|
|
|
+ * no matching flavor is found in the array. The "flavors" array
|
|
|
+ * is searched in the order returned from the server, per RFC 3530
|
|
|
+ * recommendation.
|
|
|
+ */
|
|
|
rpc_authflavor_t nfs_find_best_sec(struct nfs4_secinfo_flavors *flavors)
|
|
|
{
|
|
|
- struct gss_api_mech *mech;
|
|
|
- struct xdr_netobj oid;
|
|
|
+ rpc_authflavor_t pseudoflavor;
|
|
|
+ struct nfs4_secinfo4 *secinfo;
|
|
|
unsigned int i;
|
|
|
- rpc_authflavor_t pseudoflavor = RPC_AUTH_UNIX;
|
|
|
|
|
|
for (i = 0; i < flavors->num_flavors; i++) {
|
|
|
- struct nfs4_secinfo4 *flavor = &flavors->flavors[i];
|
|
|
-
|
|
|
- if (flavor->flavor == RPC_AUTH_NULL || flavor->flavor == RPC_AUTH_UNIX) {
|
|
|
- pseudoflavor = flavor->flavor;
|
|
|
- break;
|
|
|
- } else if (flavor->flavor == RPC_AUTH_GSS) {
|
|
|
- oid.len = flavor->flavor_info.oid.len;
|
|
|
- oid.data = flavor->flavor_info.oid.data;
|
|
|
- mech = gss_mech_get_by_OID(&oid);
|
|
|
- if (!mech)
|
|
|
- continue;
|
|
|
- pseudoflavor = gss_svc_to_pseudoflavor(mech,
|
|
|
- flavor->flavor_info.service);
|
|
|
- gss_mech_put(mech);
|
|
|
+ secinfo = &flavors->flavors[i];
|
|
|
+
|
|
|
+ switch (secinfo->flavor) {
|
|
|
+ case RPC_AUTH_NULL:
|
|
|
+ case RPC_AUTH_UNIX:
|
|
|
+ case RPC_AUTH_GSS:
|
|
|
+ pseudoflavor = rpcauth_get_pseudoflavor(secinfo->flavor,
|
|
|
+ &secinfo->flavor_info);
|
|
|
+ if (pseudoflavor != RPC_AUTH_MAXFLAVOR)
|
|
|
+ return pseudoflavor;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return pseudoflavor;
|
|
|
+ return RPC_AUTH_UNIX;
|
|
|
}
|
|
|
|
|
|
static rpc_authflavor_t nfs4_negotiate_security(struct inode *inode, struct qstr *name)
|