bool change_to_user(connection_struct *conn, uint64_t vuid) { struct user_struct *vuser; int snum = SNUM(conn); if (!conn) { DEBUG(2,("Connection not open\n")); return(False); } vuser = get_valid_user_struct(conn->sconn, vuid); if ((current_user.conn == conn) && (vuser != NULL) && (current_user.vuid == vuid) && (current_user.ut.uid == vuser->session_info->unix_token->uid)) { DEBUG(4,("Skipping user change - already " "user\n")); return(True); } if (vuser == NULL) { /* Invalid vuid sent */ DEBUG(2,("Invalid vuid %llu used on share %s.\n", (unsigned long long)vuid, lp_servicename(talloc_tos(), snum))); return false; } return change_to_user_internal(conn, vuser->session_info, vuid); }
bool change_to_user(connection_struct *conn, uint16_t vuid) { const struct auth_serversupplied_info *session_info = NULL; user_struct *vuser; int snum = SNUM(conn); if (!conn) { DEBUG(2,("Connection not open\n")); return(False); } vuser = get_valid_user_struct(conn->sconn, vuid); /* * We need a separate check in security=share mode due to vuid * always being UID_FIELD_INVALID. If we don't do this then * in share mode security we are *always* changing uid's between * SMB's - this hurts performance - Badly. */ if((lp_security() == SEC_SHARE) && (current_user.conn == conn) && (current_user.ut.uid == conn->session_info->utok.uid)) { DEBUG(4,("Skipping user change - already " "user\n")); return(True); } else if ((current_user.conn == conn) && (vuser != NULL) && (current_user.vuid == vuid) && (current_user.ut.uid == vuser->session_info->utok.uid)) { DEBUG(4,("Skipping user change - already " "user\n")); return(True); } session_info = vuser ? vuser->session_info : conn->session_info; if (session_info == NULL) { /* Invalid vuid sent - even with security = share. */ DEBUG(2,("Invalid vuid %d used on " "share %s.\n", vuid, lp_servicename(snum) )); return false; } /* security = share sets force_user. */ if (!conn->force_user && vuser == NULL) { DEBUG(2,("Invalid vuid used %d in accessing " "share %s.\n", vuid, lp_servicename(snum) )); return False; } return change_to_user_internal(conn, session_info, vuid); }
bool change_to_user_by_session(connection_struct *conn, const struct auth_serversupplied_info *session_info) { SMB_ASSERT(conn != NULL); SMB_ASSERT(session_info != NULL); if ((current_user.conn == conn) && (current_user.ut.uid == session_info->utok.uid)) { DEBUG(7, ("Skipping user change - already user\n")); return true; } return change_to_user_internal(conn, session_info, UID_FIELD_INVALID); }