From: Hui Yiqun <huiyiqun@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, pickfire@riseup.net, peff@peff.net,
Hui Yiqun <huiyiqun@gmail.com>
Subject: [PATCH/RFC/GSoC 1/3] path.c: implement xdg_runtime_dir()
Date: Wed, 16 Mar 2016 18:07:43 +0800 [thread overview]
Message-ID: <1458122865-29447-1-git-send-email-huiyiqun@gmail.com> (raw)
In-Reply-To: <CAKqreux4aYhXTE9kUHKoKCJ2-4KDWyi58ioCm-CWqXhUYCtEEw@mail.gmail.com>
this function does the following:
1. if $XDG_RUNTIME_DIR is non-empty, `$XDG_RUNTIME_DIR/git` is used in next
step, otherwise `/tmp/git-$uid` is taken.
2. ensure that above directory does exist. what's more, it must has correct
permission and ownership.
3. a newly allocated string consisting of the path of above directory and
$filename is returned.
Under following situation, NULL will be returned:
+ the directory mentioned in step 1 exists but have wrong permission or
ownership.
+ the directory or its parent cannot be created.
Notice:
+ the caller is responsible for deallocating the returned string.
Signed-off-by: Hui Yiqun <huiyiqun@gmail.com>
---
cache.h | 23 +++++++++++++++++++++++
path.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 82 insertions(+)
diff --git a/cache.h b/cache.h
index b829410..e640a54 100644
--- a/cache.h
+++ b/cache.h
@@ -999,6 +999,29 @@ extern int is_ntfs_dotgit(const char *name);
*/
extern char *xdg_config_home(const char *filename);
+/**
+ * this function does the following:
+ *
+ * 1. if $XDG_RUNTIME_DIR is non-empty, `$XDG_RUNTIME_DIR/git` is used in next
+ * step, otherwise `/tmp/git-$uid` is taken.
+ * 2. ensure that above directory does exist. what's more, it must has correct
+ * permission and ownership.
+ * 3. a newly allocated string consisting of the path of above directory and
+ * $filename is returned.
+ *
+ * Under following situation, NULL will be returned:
+ *
+ * + the directory mentioned in step 1 exists but have wrong permission or
+ * ownership.
+ * + the directory or its parent cannot be created.
+ *
+ * Notice:
+ *
+ * + the caller is responsible for deallocating the returned string.
+ *
+ */
+extern char *xdg_runtime_dir(const char *filename);
+
/* object replacement */
#define LOOKUP_REPLACE_OBJECT 1
#define LOOKUP_UNKNOWN_OBJECT 2
diff --git a/path.c b/path.c
index 8b7e168..2deecb3 100644
--- a/path.c
+++ b/path.c
@@ -5,6 +5,7 @@
#include "strbuf.h"
#include "string-list.h"
#include "dir.h"
+#include "git-compat-util.h"
static int get_st_mode_bits(const char *path, int *mode)
{
@@ -1193,6 +1194,64 @@ char *xdg_config_home(const char *filename)
return NULL;
}
+char *xdg_runtime_dir(const char *filename)
+{
+ char *runtime_dir, *git_runtime_dir;
+ struct stat st;
+ uid_t uid = getuid();
+
+ assert(filename);
+ runtime_dir = getenv("XDG_RUNTIME_DIR");
+ if (runtime_dir && *runtime_dir)
+ git_runtime_dir = mkpathdup("%s/git/", runtime_dir);
+ else
+ git_runtime_dir = mkpathdup("/tmp/git-%d", uid);
+
+ if (!lstat(git_runtime_dir, &st)) {
+ /*
+ * As described in XDG base dir spec[1], the subdirectory
+ * under $XDG_RUNTIME_DIR or its fallback MUST be owned by
+ * the user, and its unix access mode MUST be 0700.
+ *
+ * Calling chmod or chown silently may cause security
+ * problem if somebody chdir to it, sleep, and then, try
+ * to open our protected runtime cache or socket.
+ * So we just put warning and left it to user to solve.
+ *
+ * [1]https://specifications.freedesktop.org/basedir-spec/
+ * basedir-spec-latest.html
+ */
+ if ((st.st_mode & 0777) != S_IRWXU) {
+ fprintf(stderr,
+ "permission of runtime directory '%s' "
+ "MUST be 0700 instead of 0%o\n",
+ git_runtime_dir, (st.st_mode & 0777));
+ return NULL;
+ } else if (st.st_uid != uid) {
+ fprintf(stderr,
+ "owner of runtime directory '%s' "
+ "MUST be %d instead of %d\n",
+ git_runtime_dir, uid, st.st_uid);
+ return NULL;
+ }
+ /* TODO: check whether git_runtime_dir is an directory */
+ } else {
+ if (safe_create_leading_directories_const(git_runtime_dir) < 0) {
+ fprintf(stderr,
+ "unable to create directories for '%s'\n",
+ git_runtime_dir);
+ return NULL;
+ }
+ if (mkdir(git_runtime_dir, 0700) < 0) {
+ fprintf(stderr,
+ "unable to mkdir '%s'\n", git_runtime_dir);
+ return NULL;
+ }
+ }
+ free(git_runtime_dir);
+ return mkpathdup("%s/%s", git_runtime_dir, filename);
+}
+
GIT_PATH_FUNC(git_path_cherry_pick_head, "CHERRY_PICK_HEAD")
GIT_PATH_FUNC(git_path_revert_head, "REVERT_HEAD")
GIT_PATH_FUNC(git_path_squash_msg, "SQUASH_MSG")
--
2.7.2
next prev parent reply other threads:[~2016-03-16 10:08 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-14 14:47 [GSOC] Microproject "Move ~/.git-credential-cache to ~/.config/git" 惠轶群
2016-03-14 15:42 ` Junio C Hamano
2016-03-14 19:53 ` 惠轶群
2016-03-14 20:33 ` Junio C Hamano
2016-03-15 1:32 ` 惠轶群
2016-03-15 2:14 ` Your friend
[not found] ` <CAKqreux-m3yHVsEQXdf+8vMNZwC0UCMBWnzbaqYJbdEEM14qiQ@mail.gmail.com>
2016-03-15 5:56 ` Ivan Tham
2016-03-15 3:13 ` Jeff King
[not found] ` <CAKqreuwv+RRziS-NcaLYZYUN0_KrfgZSe6wp0wGBza4q3_x8RA@mail.gmail.com>
2016-03-15 19:21 ` Jeff King
2016-03-16 10:45 ` 惠轶群
2016-03-16 10:07 ` Hui Yiqun [this message]
2016-03-16 10:07 ` [PATCH/RFC/GSoC 2/3] git-credential-cache: put socket to xdg-compatible path Hui Yiqun
2016-03-17 10:26 ` 惠轶群
2016-03-16 10:07 ` [PATCH/RFC/GSoC 3/3] t0301: test credential-cache support of XDG_RUNTIME_DIR Hui Yiqun
2016-03-16 16:17 ` Junio C Hamano
2016-03-16 16:40 ` 惠轶群
2016-03-16 16:55 ` Jeff King
2016-03-16 17:24 ` Junio C Hamano
2016-03-17 3:59 ` 谭俊浩
2016-03-17 8:12 ` Junio C Hamano
2016-03-17 10:10 ` 惠轶群
2016-03-17 9:45 ` 惠轶群
2016-03-16 17:15 ` Jeff King
2016-03-18 4:35 ` 惠轶群
[not found] ` <CAKqreuw7Am_wZQjYYjvsxx0Ccr4OOwoF=EnLvMTK9jxeBUFv5Q@mail.gmail.com>
2016-03-18 5:00 ` Jeff King
2016-03-18 5:11 ` 惠轶群
2016-03-18 6:02 ` 惠轶群
2016-03-18 6:12 ` [PATCH] credential-cache--daemon: clarify "exit" action semantics Jeff King
2016-03-16 17:06 ` [PATCH/RFC/GSoC 1/3] path.c: implement xdg_runtime_dir() Jeff King
2016-03-17 10:20 ` 惠轶群
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1458122865-29447-1-git-send-email-huiyiqun@gmail.com \
--to=huiyiqun@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=pickfire@riseup.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).