162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * fs/sharefs/authentication.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#ifndef AUTHENTICATION_H 862306a36Sopenharmony_ci#define AUTHENTICATION_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "sharefs.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define OID_ROOT 0 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define SHAREFS_PERM_MASK 0x000F 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define SHAREFS_PERM_FIX 0 1762306a36Sopenharmony_ci#define SHAREFS_PERM_MNT 1 1862306a36Sopenharmony_ci#define SHAREFS_PERM_DFS 2 1962306a36Sopenharmony_ci#define SHAREFS_PERM_OTHER 3 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define SHAREFS_READ_DIR "r" 2262306a36Sopenharmony_ci#define SHAREFS_READWRITE_DIR "rw" 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define BASE_USER_RANGE 200000 /* offset for uid ranges for each user */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define SHAREFS_DIR_TYPE_MASK 0x00F0 2862306a36Sopenharmony_ci#define SHAREFS_DIR_TYPE_READONLY 0x0010 2962306a36Sopenharmony_ci#define SHAREFS_DIR_TYPE_READWRITE 0x0020 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define SHAREFS_PERM_READONLY_DIR 00550 3262306a36Sopenharmony_ci#define SHAREFS_PERM_READONLY_FILE 00440 3362306a36Sopenharmony_ci#define SHAREFS_PERM_READWRITE_DIR 00550 3462306a36Sopenharmony_ci#define SHAREFS_PERM_READWRITE_FILE 00660 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciextern int get_bid_config(const char *bname); 3762306a36Sopenharmony_ciextern int __init sharefs_init_configfs(void); 3862306a36Sopenharmony_ciextern void sharefs_exit_configfs(void); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_civoid sharefs_root_inode_perm_init(struct inode *root_inode); 4162306a36Sopenharmony_civoid fixup_perm_from_level(struct inode *dir, struct dentry *dentry); 4262306a36Sopenharmony_ci#ifdef CONFIG_SHAREFS_SUPPORT_OVERRIDE 4362306a36Sopenharmony_ciconst struct cred *sharefs_override_file_fsids(struct inode *dir, 4462306a36Sopenharmony_ci __u16 *_perm); 4562306a36Sopenharmony_civoid sharefs_revert_fsids(const struct cred *old_cred); 4662306a36Sopenharmony_ci#endif 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic inline bool is_read_only_auth(__u16 perm) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci return (perm & SHAREFS_DIR_TYPE_MASK) == SHAREFS_DIR_TYPE_READONLY; 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic inline bool is_read_write_auth(__u16 perm) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci return (perm & SHAREFS_DIR_TYPE_MASK) == SHAREFS_DIR_TYPE_READWRITE; 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic inline void sharefs_set_read_perm(struct inode *inode) 5962306a36Sopenharmony_ci{ 6062306a36Sopenharmony_ci if (S_ISDIR(inode->i_mode)) 6162306a36Sopenharmony_ci inode->i_mode = (inode->i_mode & S_IFMT) | SHAREFS_PERM_READONLY_DIR; 6262306a36Sopenharmony_ci else 6362306a36Sopenharmony_ci inode->i_mode = (inode->i_mode & S_IFMT) | SHAREFS_PERM_READONLY_FILE; 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic inline void sharefs_set_read_write_perm(struct inode *inode) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci if (S_ISDIR(inode->i_mode)) 6962306a36Sopenharmony_ci inode->i_mode = (inode->i_mode & S_IFMT) | SHAREFS_PERM_READWRITE_DIR; 7062306a36Sopenharmony_ci else 7162306a36Sopenharmony_ci inode->i_mode = (inode->i_mode & S_IFMT) | SHAREFS_PERM_READWRITE_FILE; 7262306a36Sopenharmony_ci} 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic inline int get_bundle_uid(struct sharefs_sb_info *sbi, const char *bname) 7562306a36Sopenharmony_ci{ 7662306a36Sopenharmony_ci return sbi->user_id * BASE_USER_RANGE + get_bid_config(bname); 7762306a36Sopenharmony_ci} 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#endif //_AUTHENTICATION_H_