[refactor] Client-side permission handling