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_