Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
git2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
git2
Commits
e4eabb03
Commit
e4eabb03
authored
Apr 11, 2022
by
Edward Thomson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fs_path: mock ownership checks
Provide a mock for file ownership for testability.
parent
62d492de
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
56 additions
and
0 deletions
+56
-0
src/path.c
+42
-0
src/path.h
+14
-0
No files found.
src/path.c
View file @
e4eabb03
...
@@ -2024,6 +2024,13 @@ done:
...
@@ -2024,6 +2024,13 @@ done:
return
supported
;
return
supported
;
}
}
static
git_path__mock_owner_t
mock_owner
=
GIT_PATH_MOCK_OWNER_NONE
;
void
git_path__set_owner
(
git_path__mock_owner_t
owner
)
{
mock_owner
=
owner
;
}
#ifdef GIT_WIN32
#ifdef GIT_WIN32
static
PSID
*
sid_dup
(
PSID
sid
)
static
PSID
*
sid_dup
(
PSID
sid
)
{
{
...
@@ -2116,6 +2123,11 @@ int git_path_owner_is_current_user(bool *out, const char *path)
...
@@ -2116,6 +2123,11 @@ int git_path_owner_is_current_user(bool *out, const char *path)
PSID
owner_sid
=
NULL
,
user_sid
=
NULL
;
PSID
owner_sid
=
NULL
,
user_sid
=
NULL
;
int
error
=
-
1
;
int
error
=
-
1
;
if
(
mock_owner
)
{
*
out
=
(
mock_owner
==
GIT_PATH_MOCK_OWNER_CURRENT_USER
);
return
0
;
}
if
((
error
=
file_owner_sid
(
&
owner_sid
,
path
))
<
0
||
if
((
error
=
file_owner_sid
(
&
owner_sid
,
path
))
<
0
||
(
error
=
current_user_sid
(
&
user_sid
))
<
0
)
(
error
=
current_user_sid
(
&
user_sid
))
<
0
)
goto
done
;
goto
done
;
...
@@ -2133,6 +2145,11 @@ int git_path_owner_is_system(bool *out, const char *path)
...
@@ -2133,6 +2145,11 @@ int git_path_owner_is_system(bool *out, const char *path)
{
{
PSID
owner_sid
;
PSID
owner_sid
;
if
(
mock_owner
)
{
*
out
=
(
mock_owner
==
GIT_PATH_MOCK_OWNER_SYSTEM
);
return
0
;
}
if
(
file_owner_sid
(
&
owner_sid
,
path
)
<
0
)
if
(
file_owner_sid
(
&
owner_sid
,
path
)
<
0
)
return
-
1
;
return
-
1
;
...
@@ -2148,6 +2165,12 @@ int git_path_owner_is_system_or_current_user(bool *out, const char *path)
...
@@ -2148,6 +2165,12 @@ int git_path_owner_is_system_or_current_user(bool *out, const char *path)
PSID
owner_sid
=
NULL
,
user_sid
=
NULL
;
PSID
owner_sid
=
NULL
,
user_sid
=
NULL
;
int
error
=
-
1
;
int
error
=
-
1
;
if
(
mock_owner
)
{
*
out
=
(
mock_owner
==
GIT_PATH_MOCK_OWNER_SYSTEM
||
mock_owner
==
GIT_PATH_MOCK_OWNER_CURRENT_USER
);
return
0
;
}
if
(
file_owner_sid
(
&
owner_sid
,
path
)
<
0
)
if
(
file_owner_sid
(
&
owner_sid
,
path
)
<
0
)
goto
done
;
goto
done
;
...
@@ -2200,18 +2223,37 @@ static int path_owner_is(bool *out, const char *path, uid_t *uids, size_t uids_l
...
@@ -2200,18 +2223,37 @@ static int path_owner_is(bool *out, const char *path, uid_t *uids, size_t uids_l
int
git_path_owner_is_current_user
(
bool
*
out
,
const
char
*
path
)
int
git_path_owner_is_current_user
(
bool
*
out
,
const
char
*
path
)
{
{
uid_t
userid
=
geteuid
();
uid_t
userid
=
geteuid
();
if
(
mock_owner
)
{
*
out
=
(
mock_owner
==
GIT_PATH_MOCK_OWNER_CURRENT_USER
);
return
0
;
}
return
path_owner_is
(
out
,
path
,
&
userid
,
1
);
return
path_owner_is
(
out
,
path
,
&
userid
,
1
);
}
}
int
git_path_owner_is_system
(
bool
*
out
,
const
char
*
path
)
int
git_path_owner_is_system
(
bool
*
out
,
const
char
*
path
)
{
{
uid_t
userid
=
0
;
uid_t
userid
=
0
;
if
(
mock_owner
)
{
*
out
=
(
mock_owner
==
GIT_PATH_MOCK_OWNER_SYSTEM
);
return
0
;
}
return
path_owner_is
(
out
,
path
,
&
userid
,
1
);
return
path_owner_is
(
out
,
path
,
&
userid
,
1
);
}
}
int
git_path_owner_is_system_or_current_user
(
bool
*
out
,
const
char
*
path
)
int
git_path_owner_is_system_or_current_user
(
bool
*
out
,
const
char
*
path
)
{
{
uid_t
userids
[
2
]
=
{
geteuid
(),
0
};
uid_t
userids
[
2
]
=
{
geteuid
(),
0
};
if
(
mock_owner
)
{
*
out
=
(
mock_owner
==
GIT_PATH_MOCK_OWNER_SYSTEM
||
mock_owner
==
GIT_PATH_MOCK_OWNER_CURRENT_USER
);
return
0
;
}
return
path_owner_is
(
out
,
path
,
userids
,
2
);
return
path_owner_is
(
out
,
path
,
userids
,
2
);
}
}
...
...
src/path.h
View file @
e4eabb03
...
@@ -722,6 +722,20 @@ int git_path_normalize_slashes(git_buf *out, const char *path);
...
@@ -722,6 +722,20 @@ int git_path_normalize_slashes(git_buf *out, const char *path);
bool
git_path_supports_symlinks
(
const
char
*
dir
);
bool
git_path_supports_symlinks
(
const
char
*
dir
);
typedef
enum
{
GIT_PATH_MOCK_OWNER_NONE
=
0
,
/* do filesystem lookups as normal */
GIT_PATH_MOCK_OWNER_SYSTEM
=
1
,
GIT_PATH_MOCK_OWNER_CURRENT_USER
=
2
,
GIT_PATH_MOCK_OWNER_OTHER
=
3
}
git_path__mock_owner_t
;
/**
* Sets the mock ownership for files; subsequent calls to
* `git_path_owner_is_*` functions will return this data until cleared
* with `GIT_PATH_MOCK_OWNER_NONE`.
*/
void
git_path__set_owner
(
git_path__mock_owner_t
owner
);
/**
/**
* Verify that the file in question is owned by an administrator or system
* Verify that the file in question is owned by an administrator or system
* account.
* account.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment