diff --git a/Makefile-ostree.am b/Makefile-ostree.am index d2641cb4..9f2119dc 100644 --- a/Makefile-ostree.am +++ b/Makefile-ostree.am @@ -80,7 +80,9 @@ ostree_SOURCES += \ ostree_SOURCES += \ src/ostree/ot-remote-builtins.h \ src/ostree/ot-remote-builtin-add.c \ + src/ostree/ot-remote-builtin-add-cookie.c \ src/ostree/ot-remote-builtin-delete.c \ + src/ostree/ot-remote-builtin-delete-cookie.c \ src/ostree/ot-remote-builtin-gpg-import.c \ src/ostree/ot-remote-builtin-list.c \ src/ostree/ot-remote-builtin-list-cookies.c \ diff --git a/src/ostree/ot-builtin-remote.c b/src/ostree/ot-builtin-remote.c index 9ac03173..31924eb1 100644 --- a/src/ostree/ot-builtin-remote.c +++ b/src/ostree/ot-builtin-remote.c @@ -33,7 +33,9 @@ typedef struct { static OstreeRemoteCommand remote_subcommands[] = { { "add", ot_remote_builtin_add }, + { "add-cookie", ot_remote_builtin_add_cookie }, { "delete", ot_remote_builtin_delete }, + { "delete-cookie", ot_remote_builtin_delete_cookie }, { "show-url", ot_remote_builtin_show_url }, { "list", ot_remote_builtin_list }, { "list-cookies", ot_remote_builtin_list_cookies }, diff --git a/src/ostree/ot-remote-builtin-add-cookie.c b/src/ostree/ot-remote-builtin-add-cookie.c new file mode 100644 index 00000000..439e7503 --- /dev/null +++ b/src/ostree/ot-remote-builtin-add-cookie.c @@ -0,0 +1,84 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2015 Red Hat, Inc. + * Copyright (C) 2016 Sjoerd Simons + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "otutil.h" + +#include "ot-main.h" +#include "ot-remote-builtins.h" +#include "ostree-repo-private.h" + + +static GOptionEntry option_entries[] = { + { NULL } +}; + +gboolean +ot_remote_builtin_add_cookie (int argc, char **argv, GCancellable *cancellable, GError **error) +{ + GOptionContext *context; + glnx_unref_object OstreeRepo *repo = NULL; + const char *remote_name; + const char *domain; + const char *path; + const char *cookie_name; + const char *value; + g_autofree char *jar_path = NULL; + g_autofree char *cookie_file = NULL; + glnx_unref_object SoupCookieJar *jar = NULL; + SoupCookie *cookie; + + context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME VALUE - Add a cookie to remote"); + + if (!ostree_option_context_parse (context, option_entries, &argc, &argv, + OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + return FALSE; + + if (argc < 6) + { + ot_util_usage_error (context, "NAME, DOMAIN, PATH, COOKIE_NAME and VALUE must be specified", error); + return FALSE; + } + + remote_name = argv[1]; + domain = argv[2]; + path = argv[3]; + cookie_name = argv[4]; + value = argv[5]; + + cookie_file = g_strdup_printf ("%s.cookies.txt", remote_name); + jar_path = g_build_filename (g_file_get_path (repo->repodir), cookie_file, NULL); + + jar = soup_cookie_jar_text_new (jar_path, FALSE); + + /* Pick a silly long expire time, we're just storing the cookies in the + * jar and on pull the jar is read-only so expiry has little actual value */ + cookie = soup_cookie_new (cookie_name, value, domain, path, + SOUP_COOKIE_MAX_AGE_ONE_YEAR * 25); + + /* jar takes ownership of cookie */ + soup_cookie_jar_add_cookie (jar, cookie); + + return TRUE; +} diff --git a/src/ostree/ot-remote-builtin-delete-cookie.c b/src/ostree/ot-remote-builtin-delete-cookie.c new file mode 100644 index 00000000..9f05a564 --- /dev/null +++ b/src/ostree/ot-remote-builtin-delete-cookie.c @@ -0,0 +1,96 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2015 Red Hat, Inc. + * Copyright (C) 2016 Sjoerd Simons + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "otutil.h" + +#include "ot-main.h" +#include "ot-remote-builtins.h" +#include "ostree-repo-private.h" + + +static GOptionEntry option_entries[] = { + { NULL } +}; + +gboolean +ot_remote_builtin_delete_cookie (int argc, char **argv, GCancellable *cancellable, GError **error) +{ + GOptionContext *context; + glnx_unref_object OstreeRepo *repo = NULL; + const char *remote_name; + const char *domain; + const char *path; + const char *cookie_name; + g_autofree char *jar_path = NULL; + g_autofree char *cookie_file = NULL; + glnx_unref_object SoupCookieJar *jar = NULL; + GSList *cookies; + gboolean found = FALSE; + + context = g_option_context_new ("NAME DOMAIN PATH COOKIE_NAME- Remote one cookie from remote"); + + if (!ostree_option_context_parse (context, option_entries, &argc, &argv, + OSTREE_BUILTIN_FLAG_NONE, &repo, cancellable, error)) + return FALSE; + + if (argc < 5) + { + ot_util_usage_error (context, "NAME, DOMAIN, PATH and COOKIE_NAME must be specified", error); + return FALSE; + } + + remote_name = argv[1]; + domain = argv[2]; + path = argv[3]; + cookie_name = argv[4]; + + cookie_file = g_strdup_printf ("%s.cookies.txt", remote_name); + jar_path = g_build_filename (g_file_get_path (repo->repodir), cookie_file, NULL); + + jar = soup_cookie_jar_text_new (jar_path, FALSE); + cookies = soup_cookie_jar_all_cookies (jar); + + while (cookies != NULL) + { + SoupCookie *cookie = cookies->data; + + if (!strcmp (domain, soup_cookie_get_domain (cookie)) && + !strcmp (path, soup_cookie_get_path (cookie)) && + !strcmp (cookie_name, soup_cookie_get_name (cookie))) + { + soup_cookie_jar_delete_cookie (jar, cookie); + + found = TRUE; + } + + soup_cookie_free (cookie); + cookies = g_slist_delete_link (cookies, cookies); + } + + if (!found) + g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Cookie not found in jar"); + + return found; +} diff --git a/src/ostree/ot-remote-builtins.h b/src/ostree/ot-remote-builtins.h index a725752c..289e2e0d 100644 --- a/src/ostree/ot-remote-builtins.h +++ b/src/ostree/ot-remote-builtins.h @@ -25,7 +25,9 @@ G_BEGIN_DECLS gboolean ot_remote_builtin_add (int argc, char **argv, GCancellable *cancellable, GError **error); +gboolean ot_remote_builtin_add_cookie (int argc, char **argv, GCancellable *cancellable, GError **error); gboolean ot_remote_builtin_delete (int argc, char **argv, GCancellable *cancellable, GError **error); +gboolean ot_remote_builtin_delete_cookie (int argc, char **argv, GCancellable *cancellable, GError **error); gboolean ot_remote_builtin_gpg_import (int argc, char **argv, GCancellable *cancellable, GError **error); gboolean ot_remote_builtin_list (int argc, char **argv, GCancellable *cancellable, GError **error); gboolean ot_remote_builtin_list_cookies (int argc, char **argv, GCancellable *cancellable, GError **error);