diff options
author | Niels De Graef <nielsdegraef@gmail.com> | 2022-04-09 11:04:57 +0000 |
---|---|---|
committer | Niels De Graef <nielsdegraef@gmail.com> | 2022-04-09 11:04:57 +0000 |
commit | 464faa55541d4054fa4c73910857090d4fb83e7a (patch) | |
tree | e6cd6e3fe8cb74a3b2acda8fe3e3eff83da34250 | |
parent | 029faac47f9c440dc7feb436a8c00ea44b91a3de (diff) | |
parent | c70dd86775d37627964657c094cfbb0caa0415e1 (diff) | |
download | gcr-464faa55541d4054fa4c73910857090d4fb83e7a.tar.gz |
Merge branch 'main' into 'master'
Create gcr4
Closes #53
See merge request GNOME/gcr!82
288 files changed, 3617 insertions, 24360 deletions
diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..d12b075 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: 2021 The GCR Authors +# SPDX-License-Identifier: CC0-1.0 + +root = true + +[*] +charset = utf-8 +end_of_line = lf +trim_trailing_whitespace = true + +[*.[ch]] +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true +tab_width = 8 + +[meson.build] +indent_size = 2 +indent_style = space + diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 91999cd..0d6f57c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ stages: - deploy variables: - DEPENDENCIES: dbus-daemon diffutils gcc gi-docgen libsecret-devel meson ninja-build openssh openssh-clients python redhat-rpm-config systemd-devel + DEPENDENCIES: dbus-daemon diffutils gcc gi-docgen libsecret-devel meson ninja-build openssh openssh-clients python redhat-rpm-config systemd-devel gtk4-devel fedora:Werror: image: fedora:latest @@ -86,14 +86,23 @@ fedora:coverage: pages: stage: deploy only: - - master + - main needs: ['fedora:coverage'] + before_script: + - dnf upgrade -y + - dnf install -y curl unzip script: - mkdir public + - 'curl --location --output gcr-3.zip "https://gitlab.gnome.org/api/v4/projects/${CI_PROJECT_ID}/jobs/artifacts/gcr-3-41/download?job=fedora:coverage&job_token=${CI_JOB_TOKEN}"' + - unzip -q gcr-3.zip -d gcr-3 + - mv gcr-3/_build/docs/gck/gck-1 public/gck-1 + - mv gcr-3/_build/docs/gcr/gcr-3 public/gcr-3 + - mv gcr-3/_build/docs/ui/gcr-ui-3 public/gcr-ui-3 - mv _build/meson-logs/coveragereport public/coverage - - mv _build/docs/gck/gck-1 public/gck-1 - - mv _build/docs/gcr/gcr-3 public/gcr-3 - - mv _build/docs/ui/gcr-ui-3 public/gcr-ui-3 + - mv _build/docs/gck/gck-2 public/gck-2 + - mv _build/docs/gcr/gcr-4 public/gcr-4 + - mv _build/docs/gcr-gtk3/gcr-4-gtk3 public/gcr-4-gtk3 + - mv _build/docs/gcr-gtk4/gcr-4-gtk4 public/gcr-4-gtk4 artifacts: when: on_success paths: @@ -33,6 +33,13 @@ The documentation for GCR and GCK is built using [gi-docgen]. You can find the nightly documentation at: +* Gck: https://gnome.pages.gitlab.gnome.org/gcr/gck-2/ +* Gcr: https://gnome.pages.gitlab.gnome.org/gcr/gcr-4/ +* GcrGtk4: https://gnome.pages.gitlab.gnome.org/gcr/gcr-4-gtk4/ +* GcrGtk3: https://gnome.pages.gitlab.gnome.org/gcr/gcr-4-gtk3/ + +You can find the older GCR documentation at: + * Gck: https://gnome.pages.gitlab.gnome.org/gcr/gck-1/ * Gcr: https://gnome.pages.gitlab.gnome.org/gcr/gcr-3/ * GcrUI: https://gnome.pages.gitlab.gnome.org/gcr/gcr-ui-3/ diff --git a/docs/gck/pkcs11-links.md b/docs/gck/pkcs11-links.md index ad89d6c..ee62924 100644 --- a/docs/gck/pkcs11-links.md +++ b/docs/gck/pkcs11-links.md @@ -17,8 +17,8 @@ A PKCS#11 URI can always resolve to more than one object, token or module. A PKCS#11 URI that refers to a token, would (when used in a context that expects objects) refer to all the token on that module. -To parse a PKCS#11 URI, use the [func@uri_parse] function passing in the type of -context in which you're using the URI. To build a URI, use the [func@uri_build] +To parse a PKCS#11 URI, use the [func@Gck.UriData.parse] function passing in the type of +context in which you're using the URI. To build a URI, use the [method@Gck.UriData.build] function. In most cases, the parsing or building of URIs is already handled for you in the diff --git a/docs/ui/gcr-ui.toml.in b/docs/gcr-gtk3/gcr-gtk3.toml.in index 6f5f4da..6f5f4da 100644 --- a/docs/ui/gcr-ui.toml.in +++ b/docs/gcr-gtk3/gcr-gtk3.toml.in diff --git a/docs/ui/images/certificate-widget.png b/docs/gcr-gtk3/images/certificate-widget.png Binary files differindex e3c9158..e3c9158 100644 --- a/docs/ui/images/certificate-widget.png +++ b/docs/gcr-gtk3/images/certificate-widget.png diff --git a/docs/ui/images/combo-selector.png b/docs/gcr-gtk3/images/combo-selector.png Binary files differindex 073f483..073f483 100644 --- a/docs/ui/images/combo-selector.png +++ b/docs/gcr-gtk3/images/combo-selector.png diff --git a/docs/ui/images/import-button.png b/docs/gcr-gtk3/images/import-button.png Binary files differindex 9166bb8..9166bb8 100644 --- a/docs/ui/images/import-button.png +++ b/docs/gcr-gtk3/images/import-button.png diff --git a/docs/ui/images/key-widget.png b/docs/gcr-gtk3/images/key-widget.png Binary files differindex db3a371..db3a371 100644 --- a/docs/ui/images/key-widget.png +++ b/docs/gcr-gtk3/images/key-widget.png diff --git a/docs/ui/images/list-selector.png b/docs/gcr-gtk3/images/list-selector.png Binary files differindex 7f9c688..7f9c688 100644 --- a/docs/ui/images/list-selector.png +++ b/docs/gcr-gtk3/images/list-selector.png diff --git a/docs/ui/images/tree-selector.png b/docs/gcr-gtk3/images/tree-selector.png Binary files differindex 7bcd1a1..7bcd1a1 100644 --- a/docs/ui/images/tree-selector.png +++ b/docs/gcr-gtk3/images/tree-selector.png diff --git a/docs/ui/images/viewer-widget.png b/docs/gcr-gtk3/images/viewer-widget.png Binary files differindex 1933e04..1933e04 100644 --- a/docs/ui/images/viewer-widget.png +++ b/docs/gcr-gtk3/images/viewer-widget.png diff --git a/docs/ui/meson.build b/docs/gcr-gtk3/meson.build index 3666f0d..fdb818b 100644 --- a/docs/ui/meson.build +++ b/docs/gcr-gtk3/meson.build @@ -1,9 +1,9 @@ -gcr_ui_content_files = [ +gcr_gtk3_content_files = [ 'widget-gallery.md', ] -gcr_ui_toml = configure_file( - input: 'gcr-ui.toml.in', +gcr_gtk3_toml = configure_file( + input: 'gcr-gtk3.toml.in', output: '@BASENAME@', configuration: { 'GCR_VERSION': gcr_api_version, @@ -11,9 +11,9 @@ gcr_ui_toml = configure_file( }, ) -gcr_ui_docs = custom_target('gcr-ui-docs', - input: gcr_ui_gir[0], - output: gcr_ui_basename, +gcr_gtk3_docs = custom_target('gcr-gtk3-docs', + input: gcr_gtk3_gir[0], + output: gcr_gtk3_basename, command: [ gi_docgen, 'generate', @@ -21,13 +21,13 @@ gcr_ui_docs = custom_target('gcr-ui-docs', '--fatal-warnings', '--add-include-path=@0@'.format(build_root / 'gck'), '--add-include-path=@0@'.format(build_root / 'gcr'), - '--config', gcr_ui_toml, + '--config', gcr_gtk3_toml, '--output-dir=@OUTPUT@', '--no-namespace-dir', '--content-dir=@0@'.format(meson.current_source_dir()), '@INPUT@', ], - depend_files: [ gcr_ui_toml, gcr_ui_content_files ], + depend_files: [ gcr_gtk3_toml, gcr_gtk3_content_files ], depends: [ gck_gir[0], gcr_gir[0] ], build_by_default: true, install: true, diff --git a/docs/ui/widget-gallery.md b/docs/gcr-gtk3/widget-gallery.md index 27e1e90..27e1e90 100644 --- a/docs/ui/widget-gallery.md +++ b/docs/gcr-gtk3/widget-gallery.md diff --git a/docs/gcr-gtk4/gcr-gtk4.toml.in b/docs/gcr-gtk4/gcr-gtk4.toml.in new file mode 100644 index 0000000..a42e5fb --- /dev/null +++ b/docs/gcr-gtk4/gcr-gtk4.toml.in @@ -0,0 +1,44 @@ +[library] +namespace = "GcrGtk" +version = "@GCR_VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/gcr/" +repository_url = "https://gitlab.gnome.org/GNOME/gcr.git" +authors = "GCR contributors" +license = "LGPL-2.0-or-later" +description = "Library providing GTK widgets for high level crypto" +dependencies = [ "GObject-2.0", "Gio-2.0", "Gtk-4.0", "Gck-@GCK_VERSION@", "Gcr-@GCR_VERSION@" ] +devhelp = true +search_index = true + + [dependencies."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://developer.gnome.org/gobject/stable" + + [dependencies."Gio-2.0"] + name = "Gio" + description = "GObject interfaces and objects" + docs_url = "https://developer.gnome.org/gio/stable" + + [dependencies."Gtk-4.0"] + name = "Gtk" + description = "The GTK UI toolkit" + docs_url = "https://docs.gtk.org/gtk4/" + + [dependencies."Gck-@GCK_VERSION@"] + name = "Gck" + description = "GObject bindings for PKCS#11" + docs_url = "https://gnome.pages.gitlab.gnome.org/gcr/gck-@GCK_VERSION@" + + [dependencies."Gcr-@GCR_VERSION@"] + name = "Gcr" + description = "GObject library for high level crypto parsing" + docs_url = "https://gnome.pages.gitlab.gnome.org/gcr/gcr-@GCR_VERSION@" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[source-location] +base_url = "https://gitlab.gnome.org/GNOME/gcr/-/blob/master/" diff --git a/docs/gcr-gtk4/meson.build b/docs/gcr-gtk4/meson.build new file mode 100644 index 0000000..d3f34eb --- /dev/null +++ b/docs/gcr-gtk4/meson.build @@ -0,0 +1,31 @@ +gcr_gtk4_toml = configure_file( + input: 'gcr-gtk4.toml.in', + output: '@BASENAME@', + configuration: { + 'GCR_VERSION': gcr_api_version, + 'GCK_VERSION': gck_api_version, + }, +) + +gcr_gtk4_docs = custom_target('gcr-gtk4-docs', + input: gcr_gtk4_gir[0], + output: gcr_gtk4_basename, + command: [ + gi_docgen, + 'generate', + '--quiet', + '--fatal-warnings', + '--add-include-path=@0@'.format(build_root / 'gck'), + '--add-include-path=@0@'.format(build_root / 'gcr'), + '--config', gcr_gtk4_toml, + '--output-dir=@OUTPUT@', + '--no-namespace-dir', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT@', + ], + depend_files: [ gcr_gtk4_toml ], + depends: [ gck_gir[0], gcr_gir[0] ], + build_by_default: true, + install: true, + install_dir: get_option('datadir') / 'doc', +) diff --git a/docs/gcr/gcr-base.toml.in b/docs/gcr/gcr.toml.in index 1b89810..1b89810 100644 --- a/docs/gcr/gcr-base.toml.in +++ b/docs/gcr/gcr.toml.in diff --git a/docs/gcr/meson.build b/docs/gcr/meson.build index d80b7c7..b7a33fb 100644 --- a/docs/gcr/meson.build +++ b/docs/gcr/meson.build @@ -1,11 +1,11 @@ -gcr_base_content_files = [ +gcr_content_files = [ 'non-pageable-memory.md', 'pkcs11-configuration.md', 'trust-store.md', ] -gcr_base_toml = configure_file( - input: 'gcr-base.toml.in', +gcr_toml = configure_file( + input: 'gcr.toml.in', output: '@BASENAME@', configuration: { 'GCR_VERSION': gcr_api_version, @@ -13,7 +13,7 @@ gcr_base_toml = configure_file( }, ) -gcr_base_docs = custom_target('gcr-docs', +gcr_docs = custom_target('gcr-docs', input: gcr_gir[0], output: gcr_basename, command: [ @@ -22,13 +22,13 @@ gcr_base_docs = custom_target('gcr-docs', '--quiet', '--fatal-warnings', '--add-include-path=@0@'.format(build_root / 'gck'), - '--config', gcr_base_toml, + '--config', gcr_toml, '--output-dir=@OUTPUT@', '--no-namespace-dir', '--content-dir=@0@'.format(meson.current_source_dir()), '@INPUT@', ], - depend_files: [ gcr_base_toml, gcr_base_content_files ], + depend_files: [ gcr_toml, gcr_content_files ], depends: [ gck_gir[0] ], build_by_default: true, install: true, diff --git a/docs/meson.build b/docs/meson.build index b90095c..3ae63b0 100644 --- a/docs/meson.build +++ b/docs/meson.build @@ -2,11 +2,19 @@ gi_docgen = find_program('gi-docgen') subdir('gck') subdir('gcr') -subdir('ui') +gtk_docs_targets = [] +if get_option('gtk3') + subdir('gcr-gtk3') + gtk_docs_targets += gcr_gtk3_docs +endif +if get_option('gtk4') + subdir('gcr-gtk4') + gtk_docs_targets += gcr_gtk4_docs +endif # Create a pseudo target that build all docs at once alias_target('docs', gck_docs, - gcr_base_docs, - gcr_ui_docs, + gcr_docs, + gtk_docs_targets, ) diff --git a/gck/Gck-1.metadata b/gck/Gck-1.metadata index 213a679..90493c2 100644 --- a/gck/Gck-1.metadata +++ b/gck/Gck-1.metadata @@ -8,6 +8,9 @@ Attribute .length skip=true .value skip=true +Attributes + .new_empty skip=false sentinel="GCK_INVALID" + Enumerator .set_object_type_full name="set_object_type" diff --git a/gck/gck-attributes.c b/gck/gck-attributes.c index 33044a7..3ba9be1 100644 --- a/gck/gck-attributes.c +++ b/gck/gck-attributes.c @@ -48,14 +48,10 @@ G_STATIC_ASSERT (sizeof (GckAttribute) == sizeof (CK_ATTRIBUTE)); -#define STATE_LOCKED 1 -#define STATE_FLOATING 8 - struct _GckAttributes { GckAttribute *data; gulong count; gint refs; - gint state; }; typedef struct { @@ -238,7 +234,7 @@ gck_builder_ref (GckBuilder *builder) /** * gck_builder_unref: - * @builder: the builder + * @builder: (transfer full): the builder * * Unreferences a builder. If this was the last reference then the builder * is freed. @@ -247,7 +243,7 @@ gck_builder_ref (GckBuilder *builder) * stack. */ void -gck_builder_unref (gpointer builder) +gck_builder_unref (GckBuilder *builder) { GckRealBuilder *real = (GckRealBuilder *)builder; @@ -1266,19 +1262,17 @@ gck_builder_find_date (GckBuilder *builder, } /** - * gck_builder_steal: + * gck_builder_end: * @builder: the builder * * Take the attributes that have been built in the #GckBuilder. The builder * will no longer contain any attributes after this function call. * - * The returned set of attributes is a full reference, not floating. - * - * Returns: (transfer full): the stolen attributes, which should be freed with + * Returns: (transfer full): the attributes, which should be freed with * gck_attributes_unref() */ GckAttributes * -gck_builder_steal (GckBuilder *builder) +gck_builder_end (GckBuilder *builder) { GckRealBuilder *real = (GckRealBuilder *)builder; GckAttributes *attrs; @@ -1305,39 +1299,6 @@ gck_builder_steal (GckBuilder *builder) } /** - * gck_builder_end: - * @builder: the builder - * - * Complete the #GckBuilder, and return the attributes contained in the builder. - * The #GckBuilder will be cleared after this function call, and it is no - * longer necessary to use [method@Builder.clear] on it, although it is also - * permitted. The builder may be used again to build another set of attributes - * after this function call. - * - * The returned set of attributes is floating, and should either be passed to - * another gck library function which consumes this floating reference, or if - * you wish to keep these attributes around you should ref them with - * gck_attributes_ref_sink() and unref them later with gck_attributes_unref(). - * - * Returns: (transfer none): a floating reference to the attributes created - * in the builder - */ -GckAttributes * -gck_builder_end (GckBuilder *builder) -{ - GckRealBuilder *real = (GckRealBuilder *)builder; - GckAttributes *attrs; - - g_return_val_if_fail (builder != NULL, NULL); - - attrs = gck_builder_steal (builder); - attrs->state |= STATE_FLOATING; - - g_assert (real->array == NULL); - return attrs; -} - -/** * gck_builder_clear: * @builder: the builder * @@ -2032,13 +1993,6 @@ gck_attribute_hash (gconstpointer attr) G_DEFINE_BOXED_TYPE (GckAttributes, gck_attributes, gck_attributes_ref, gck_attributes_unref) -GType -gck_attributes_get_boxed_type (void) -{ - /* Deprecated version */ - return gck_attributes_get_type (); -} - /** * gck_attributes_new_empty: * @first_type: the first empty attribute type @@ -2048,12 +2002,7 @@ gck_attributes_get_boxed_type (void) * * Terminate the argument list with [const@INVALID]. * - * The returned set of attributes is floating, and should either be passed to - * another gck library function which consumes this floating reference, or if - * you wish to keep these attributes around you should ref them with - * gck_attributes_ref_sink() and unref them later with gck_attributes_unref(). - * - * Returns: (transfer none): a floating reference to an empty set of attributes + * Returns: (transfer full): a reference to an empty set of attributes **/ GckAttributes * gck_attributes_new_empty (gulong first_type, @@ -2237,45 +2186,6 @@ gck_attributes_ref (GckAttributes *attrs) } /** - * gck_attributes_ref_sink: - * @attrs: an attribute array - * - * #GckAttributes uses a floating reference count system. [method@Builder.end] - * and [ctor@Attributes.new_empty] both return floating references. - * - * Calling this function on a `GckAttributes` with a floating - * reference will convert the floating reference into a full reference. - * Calling this function on a non-floating `GckAttributes` results - * in an additional normal reference being added. - * - * In other words, if the @attrs is floating, then this call "assumes - * ownership" of the floating reference, converting it to a normal - * reference. If the @attrs is not floating, then this call adds a - * new normal reference increasing the reference count by one. - * - * All Gck library functions that assume ownership of floating references - * are documented as such. Essentially any Gck function that performs - * an operation using a #GckAttributes argument rather than operating on the - * attributes themselves, will accept a floating reference. - * - * Returns: (transfer full): the referenced attributes - */ -GckAttributes * -gck_attributes_ref_sink (GckAttributes *attrs) -{ - g_return_val_if_fail (attrs, NULL); - g_bit_lock (&attrs->state, STATE_LOCKED); - - if (~attrs->state & STATE_FLOATING) - gck_attributes_ref (attrs); - else - attrs->state &= ~STATE_FLOATING; - - g_bit_unlock (&attrs->state, STATE_LOCKED); - return attrs; -} - -/** * gck_attributes_unref: * @attrs: (nullable) (type Gck.Attributes) (transfer full): An attribute array * @@ -2810,345 +2720,15 @@ gck_attributes_to_string (GckAttributes *attrs) /** * gck_attributes_new: - * @reserved: Should be set to always be [const@INVALID] * * Create a new empty `GckAttributes` array. * - * The returned set of attributes is floating, and should either be passed to - * another gck library function which consumes this floating reference, or if - * you wish to keep these attributes around you should ref them with - * gck_attributes_ref_sink() and unref them later with gck_attributes_unref(). - * - * Returns: (transfer none): a floating reference to the new attributes array; + * Returns: (transfer full): a reference to the new attributes array; * when done with the array release it with gck_attributes_unref(). **/ GckAttributes * -gck_attributes_new (gulong reserved) +gck_attributes_new (void) { GckBuilder builder = GCK_BUILDER_INIT; return gck_builder_end (&builder); } - -/** - * gck_attributes_new_full: (skip) - * @allocator: memory allocator for attribute data, or %NULL for default - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.set_all] instead. - * - * Returns: returns %NULL - **/ -GckAttributes * -gck_attributes_new_full (GckAllocator allocator) -{ - g_warning ("gck_attributes_new_full() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_add: - * @attrs: the attributes array to add to - * @attr: the attribute to add - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.set_all] instead. - * - * Returns: (transfer none): returns %NULL - **/ -GckAttribute * -gck_attributes_add (GckAttributes *attrs, - GckAttribute *attr) -{ - g_warning ("gck_attributes_add() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_set: - * @attrs: attributes array to add to - * @attr: attribute to set - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.set_data] instead. - **/ -void -gck_attributes_set (GckAttributes *attrs, - GckAttribute *attr) -{ - g_warning ("gck_attributes_set() is no no longer supported"); -} - -/** - * gck_attributes_add_data: - * @attrs: The attributes array to add to. - * @attr_type: The type of attribute to add. - * @value: (array length=length): the raw memory of the attribute value - * @length: The length of the attribute value. - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.add_data] instead. - * - * Returns: (transfer none): returns %NULL - **/ -GckAttribute * -gck_attributes_add_data (GckAttributes *attrs, - gulong attr_type, - const guchar *value, - gsize length) -{ - g_warning ("gck_attributes_add_data() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_add_invalid: - * @attrs: The attributes array to add to. - * @attr_type: The type of attribute to add. - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.add_invalid] instead - * - * Returns: (transfer none): returns %NULL - **/ -GckAttribute * -gck_attributes_add_invalid (GckAttributes *attrs, - gulong attr_type) -{ - g_warning ("gck_attributes_add_invalid() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_add_empty: - * @attrs: The attributes array to add. - * @attr_type: The type of attribute to add. - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.add_empty] instead. - * - * Returns: (transfer none): returns %NULL - **/ -GckAttribute * -gck_attributes_add_empty (GckAttributes *attrs, - gulong attr_type) -{ - g_warning ("gck_attributes_add_empty() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_add_boolean: - * @attrs: the attributes array to add to - * @attr_type: the type of attribute to add - * @value: the boolean value to add - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.add_boolean] instead. - * - * Returns: (transfer none): returns %NULL - **/ -GckAttribute * -gck_attributes_add_boolean (GckAttributes *attrs, - gulong attr_type, - gboolean value) -{ - g_warning ("gck_attributes_add_boolean() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_set_boolean: - * @attrs: the attributes - * @attr_type: the type of attribute to set - * @value: boolean value to set - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.set_boolean] instead. - */ -void -gck_attributes_set_boolean (GckAttributes *attrs, - gulong attr_type, - gboolean value) -{ - g_warning ("gck_attributes_set_boolean() is no no longer supported"); - -} - -/** - * gck_attributes_add_string: - * @attrs: the attributes array to add to - * @attr_type: the type of attribute to add - * @value: the null terminated string value to add - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.add_string] instead. - * - * Returns: (transfer none): returns %NULL - **/ -GckAttribute * -gck_attributes_add_string (GckAttributes *attrs, - gulong attr_type, - const gchar *value) -{ - g_warning ("gck_attributes_add_string() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_set_string: - * @attrs: the attributes - * @attr_type: the type of attribute to set - * @value: null terminated string value to set - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.set_string] instead. - */ -void -gck_attributes_set_string (GckAttributes *attrs, - gulong attr_type, - const gchar *value) -{ - g_warning ("gck_attributes_set_string() is no no longer supported"); -} - -/** - * gck_attributes_add_date: - * @attrs: the attributes array to add to - * @attr_type: the type of attribute to add - * @value: the GDate value to add - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.add_date] instead. - * - * Returns: (transfer none): returns %NULL - **/ -GckAttribute * -gck_attributes_add_date (GckAttributes *attrs, - gulong attr_type, - const GDate *value) -{ - g_warning ("gck_attributes_add_date() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_set_date: - * @attrs: the attributes - * @attr_type: the type of attribute to set - * @value: date value to set - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.set_date] instead. - */ -void -gck_attributes_set_date (GckAttributes *attrs, - gulong attr_type, - const GDate *value) -{ - g_warning ("gck_attributes_set_date() is no no longer supported"); -} - -/** - * gck_attributes_add_ulong: - * @attrs: the attributes array to add to - * @attr_type: the type of attribute to add - * @value: the gulong value to add - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.add_ulong] instead. - * - * Returns: (transfer none): returns %NULL - **/ -GckAttribute * -gck_attributes_add_ulong (GckAttributes *attrs, - gulong attr_type, - gulong value) -{ - g_warning ("gck_attributes_add_ulong() is no no longer supported"); - return NULL; -} - -/** - * gck_attributes_set_ulong: - * @attrs: the attributes - * @attr_type: the type of attribute to set - * @value: gulong value to set - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.set_ulong] instead. - */ -void -gck_attributes_set_ulong (GckAttributes *attrs, - gulong attr_type, - gulong value) -{ - g_warning ("gck_attributes_set_ulong() is no no longer supported"); -} - -/** - * gck_attributes_add_all: - * @attrs: a set of attributes - * @from: attributes to add - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.add_all] instead. - */ -void -gck_attributes_add_all (GckAttributes *attrs, - GckAttributes *from) -{ - g_warning ("gck_attributes_add_all() is no no longer supported"); -} - -/** - * gck_attributes_set_all: - * @attrs: set of attributes - * @from: attributes to add - * - * #GckAttributes are now immutable. This method no longer does anything. - * - * Deprecated: 3.4: Use [method@Builder.set_all] instead. - */ -void -gck_attributes_set_all (GckAttributes *attrs, - GckAttributes *from) -{ - g_warning ("gck_attributes_set_all() is no no longer supported"); -} - -/** - * gck_attributes_dup: - * @attrs: set of attributes to copy - * - * #GckAttributes are now immutable, and can be used in mulitple places. - * - * Deprecated: 3.4: Use gck_attributes_ref() or [method@Builder.add_all] instead. - * - * Returns: (transfer none): a new floating #GckAttributes - */ -GckAttributes * -gck_attributes_dup (GckAttributes *attrs) -{ - GckBuilder builder = GCK_BUILDER_INIT; - - if (attrs == NULL) - return NULL; - - gck_builder_add_all (&builder, attrs); - return gck_builder_end (&builder); -} diff --git a/gck/gck-deprecated.h b/gck/gck-deprecated.h deleted file mode 100644 index 029ab7e..0000000 --- a/gck/gck-deprecated.h +++ /dev/null @@ -1,130 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* gck-deprecated.h - the GObject PKCS#11 wrapper library - - Copyright (C) 2011 Stefan Walter - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#ifndef GCK_DEPRECATED_H -#define GCK_DEPRECATED_H - -#include "gck.h" - -G_BEGIN_DECLS - -#ifndef GCK_DISABLE_DEPRECATED - -typedef GArray GckMechanisms; - -G_DEPRECATED_FOR(g_array_free) -#define gck_mechanisms_free(a) (g_array_free (a, TRUE)) - -#define CKR_GCK_MODULE_PROBLEM GCK_ERROR_MODULE_PROBLEM - -G_DEPRECATED_FOR(gck_error_get_quark) -GQuark gck_get_error_quark (void); - -G_DEPRECATED_FOR(gck_uri_error_get_quark) -GQuark gck_uri_get_error_quark (void); - -#define GCK_URI_BAD_PREFIX GCK_URI_BAD_SCHEME - -G_DEPRECATED_FOR(gck_attributes_get_type) -GType gck_attributes_get_boxed_type (void) G_GNUC_CONST; - -G_DEPRECATED_FOR(gck_builder_set_all) -GckAttributes * gck_attributes_new_full (GckAllocator allocator); - -G_DEPRECATED_FOR(gck_builder_set_all) -GckAttribute * gck_attributes_add (GckAttributes *attrs, - GckAttribute *attr); - -G_DEPRECATED_FOR(gck_builder_set_all) -void gck_attributes_add_all (GckAttributes *attrs, - GckAttributes *from); - -G_DEPRECATED_FOR(gck_builder_add_data) -GckAttribute * gck_attributes_add_data (GckAttributes *attrs, - gulong attr_type, - const guchar *value, - gsize length); - -G_DEPRECATED_FOR(gck_builder_add_invalid) -GckAttribute * gck_attributes_add_invalid (GckAttributes *attrs, - gulong attr_type); - -G_DEPRECATED_FOR(gck_builder_add_empty) -GckAttribute * gck_attributes_add_empty (GckAttributes *attrs, - gulong attr_type); - -G_DEPRECATED_FOR(gck_builder_add_boolean) -GckAttribute* gck_attributes_add_boolean (GckAttributes *attrs, - gulong attr_type, - gboolean value); - -G_DEPRECATED_FOR(gck_builder_add_string) -GckAttribute* gck_attributes_add_string (GckAttributes *attrs, - gulong attr_type, - const gchar *value); - -G_DEPRECATED_FOR(gck_builder_add_date) -GckAttribute* gck_attributes_add_date (GckAttributes *attrs, - gulong attr_type, - const GDate *value); - -G_DEPRECATED_FOR(gck_builder_add_ulong) -GckAttribute* gck_attributes_add_ulong (GckAttributes *attrs, - gulong attr_type, - gulong value); - -G_DEPRECATED_FOR(gck_builder_set_data) -void gck_attributes_set (GckAttributes *attrs, - GckAttribute *attr); - -G_DEPRECATED_FOR(gck_builder_set_boolean) -void gck_attributes_set_boolean (GckAttributes *attrs, - gulong attr_type, - gboolean value); - -G_DEPRECATED_FOR(gck_builder_set_ulong) -void gck_attributes_set_ulong (GckAttributes *attrs, - gulong attr_type, - gulong value); - -G_DEPRECATED_FOR(gck_builder_set_string) -void gck_attributes_set_string (GckAttributes *attrs, - gulong attr_type, - const gchar *value); - -G_DEPRECATED_FOR(gck_builder_set_date) -void gck_attributes_set_date (GckAttributes *attrs, - gulong attr_type, - const GDate *value); - -G_DEPRECATED_FOR(gck_builder_set_all) -void gck_attributes_set_all (GckAttributes *attrs, - GckAttributes *from); - -G_DEPRECATED_FOR(gck_attributes_ref or gck_builder_add_all) -GckAttributes * gck_attributes_dup (GckAttributes *attrs); - -#endif /* GCK_DISABLE_DEPRECATED */ - -G_END_DECLS - -#endif /* GCK_H */ diff --git a/gck/gck-enumerator.c b/gck/gck-enumerator.c index c1b82ee..902e756 100644 --- a/gck/gck-enumerator.c +++ b/gck/gck-enumerator.c @@ -96,8 +96,10 @@ struct _GckEnumeratorState { GQueue *results; }; -struct _GckEnumeratorPrivate { - GMutex *mutex; +struct _GckEnumerator { + GObject parent; + + GMutex mutex; GckEnumeratorState *the_state; GTlsInteraction *interaction; GType object_type; @@ -107,7 +109,7 @@ struct _GckEnumeratorPrivate { GckEnumerator *chained; }; -G_DEFINE_TYPE_WITH_PRIVATE (GckEnumerator, gck_enumerator, G_TYPE_OBJECT); +G_DEFINE_TYPE (GckEnumerator, gck_enumerator, G_TYPE_OBJECT); static gpointer state_modules (GckEnumeratorState *args, gboolean forward); @@ -357,7 +359,6 @@ state_slot (GckEnumeratorState *args, gboolean forward) static gpointer state_session (GckEnumeratorState *args, gboolean forward) { - GTlsInteraction *interaction; CK_RV rv; g_assert (args->funcs); @@ -373,17 +374,9 @@ state_session (GckEnumeratorState *args, gboolean forward) return state_find; } - /* Compatibility, hook into GckModule signals if no interaction set */ - if (args->interaction) - interaction = g_object_ref (args->interaction); - else - interaction = _gck_interaction_new (args->slot); - rv = _gck_session_authenticate_token (args->funcs, gck_session_get_handle (args->session), - args->slot, interaction, NULL); - - g_object_unref (interaction); + args->slot, args->interaction, NULL); if (rv != CKR_OK) g_message ("couldn't authenticate when enumerating: %s", gck_message_from_rv (rv)); @@ -393,8 +386,7 @@ state_session (GckEnumeratorState *args, gboolean forward) /* Session to slot state */ } else { - g_object_unref (args->session); - args->session = NULL; + g_clear_object (&args->session); return state_slot; } } @@ -524,7 +516,7 @@ state_results (GckEnumeratorState *args, rv = (args->funcs->C_GetAttributeValue) (session, result->handle, template, n_template); } - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); if (GCK_IS_GET_ATTRIBUTE_RV_OK (rv)) { gchar *string = gck_attributes_to_string (attrs); @@ -552,13 +544,11 @@ state_results (GckEnumeratorState *args, static void gck_enumerator_init (GckEnumerator *self) { - self->pv = gck_enumerator_get_instance_private (self); - self->pv->mutex = g_new0 (GMutex, 1); - g_mutex_init (self->pv->mutex); - self->pv->the_state = g_new0 (GckEnumeratorState, 1); - self->pv->object_type = GCK_TYPE_OBJECT; - self->pv->object_class = g_type_class_ref (self->pv->object_type); - g_assert (self->pv->object_class); + g_mutex_init (&self->mutex); + self->the_state = g_new0 (GckEnumeratorState, 1); + self->object_type = GCK_TYPE_OBJECT; + self->object_class = g_type_class_ref (self->object_type); + g_assert (self->object_class); } static void @@ -625,16 +615,15 @@ gck_enumerator_finalize (GObject *obj) { GckEnumerator *self = GCK_ENUMERATOR (obj); - g_assert (self->pv->interaction == NULL); + g_assert (self->interaction == NULL); - g_assert (self->pv->the_state != NULL); - cleanup_state (self->pv->the_state); - g_free (self->pv->the_state); + g_assert (self->the_state != NULL); + cleanup_state (self->the_state); + g_free (self->the_state); - g_mutex_clear (self->pv->mutex); - g_free (self->pv->mutex); - g_type_class_unref (self->pv->object_class); - g_free (self->pv->attr_types); + g_mutex_clear (&self->mutex); + g_type_class_unref (self->object_class); + g_free (self->attr_types); G_OBJECT_CLASS (gck_enumerator_parent_class)->finalize (obj); } @@ -690,7 +679,7 @@ created_enumerator (GckUriData *uri_data, { gchar *attrs, *uri; attrs = uri_data->attributes ? gck_attributes_to_string (uri_data->attributes) : NULL; - uri = uri_data ? gck_uri_build (uri_data, GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE) : NULL; + uri = uri_data ? gck_uri_data_build (uri_data, GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE) : NULL; g_debug ("for = %s, tokens = %s, objects = %s", type, uri, attrs); g_free (attrs); g_free (uri); @@ -705,7 +694,7 @@ _gck_enumerator_new_for_modules (GList *modules, GckEnumeratorState *state; self = g_object_new (GCK_TYPE_ENUMERATOR, NULL); - state = self->pv->the_state; + state = self->the_state; state->session_options = session_options; @@ -727,7 +716,7 @@ _gck_enumerator_new_for_slots (GList *slots, GckEnumeratorState *state; self = g_object_new (GCK_TYPE_ENUMERATOR, NULL); - state = self->pv->the_state; + state = self->the_state; state->session_options = session_options; @@ -749,7 +738,7 @@ _gck_enumerator_new_for_session (GckSession *session, GckModule *module; self = g_object_new (GCK_TYPE_ENUMERATOR, NULL); - state = self->pv->the_state; + state = self->the_state; state->session = g_object_ref (session); state->modules = NULL; @@ -827,11 +816,11 @@ gck_enumerator_get_object_type (GckEnumerator *self) g_return_val_if_fail (GCK_IS_ENUMERATOR (self), 0); - g_mutex_lock (self->pv->mutex); + g_mutex_lock (&self->mutex); - result = self->pv->object_type; + result = self->object_type; - g_mutex_unlock (self->pv->mutex); + g_mutex_unlock (&self->mutex); return result; } @@ -887,23 +876,23 @@ gck_enumerator_set_object_type_full (GckEnumerator *self, klass = g_type_class_ref (object_type); - g_mutex_lock (self->pv->mutex); + g_mutex_lock (&self->mutex); - if (self->pv->object_type) - g_type_class_unref (self->pv->object_class); - self->pv->object_type = object_type; - self->pv->object_class = klass; + if (self->object_type) + g_type_class_unref (self->object_class); + self->object_type = object_type; + self->object_class = klass; - g_free (self->pv->attr_types); - self->pv->attr_types = NULL; - self->pv->attr_count = 0; + g_free (self->attr_types); + self->attr_types = NULL; + self->attr_count = 0; if (attr_types) { - self->pv->attr_types = g_memdup (attr_types, sizeof (gulong) * attr_count); - self->pv->attr_count = attr_count; + self->attr_types = g_memdup (attr_types, sizeof (gulong) * attr_count); + self->attr_count = attr_count; } - g_mutex_unlock (self->pv->mutex); + g_mutex_unlock (&self->mutex); } /** @@ -922,12 +911,12 @@ gck_enumerator_get_chained (GckEnumerator *self) g_return_val_if_fail (GCK_IS_ENUMERATOR (self), NULL); - g_mutex_lock (self->pv->mutex); + g_mutex_lock (&self->mutex); - if (self->pv->chained) - chained = g_object_ref (self->pv->chained); + if (self->chained) + chained = g_object_ref (self->chained); - g_mutex_unlock (self->pv->mutex); + g_mutex_unlock (&self->mutex); return chained; } @@ -949,14 +938,14 @@ gck_enumerator_set_chained (GckEnumerator *self, g_return_if_fail (GCK_IS_ENUMERATOR (self)); g_return_if_fail (chained == NULL || GCK_IS_ENUMERATOR (chained)); - g_mutex_lock (self->pv->mutex); + g_mutex_lock (&self->mutex); - old_chained = self->pv->chained; + old_chained = self->chained; if (chained) g_object_ref (chained); - self->pv->chained = chained; + self->chained = chained; - g_mutex_unlock (self->pv->mutex); + g_mutex_unlock (&self->mutex); if (old_chained) g_object_unref (old_chained); @@ -979,12 +968,12 @@ gck_enumerator_get_interaction (GckEnumerator *self) g_return_val_if_fail (GCK_IS_ENUMERATOR (self), NULL); - g_mutex_lock (self->pv->mutex); + g_mutex_lock (&self->mutex); - if (self->pv->interaction) - result = g_object_ref (self->pv->interaction); + if (self->interaction) + result = g_object_ref (self->interaction); - g_mutex_unlock (self->pv->mutex); + g_mutex_unlock (&self->mutex); return result; } @@ -1005,16 +994,16 @@ gck_enumerator_set_interaction (GckEnumerator *self, g_return_if_fail (GCK_IS_ENUMERATOR (self)); g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); - g_mutex_lock (self->pv->mutex); + g_mutex_lock (&self->mutex); - if (interaction != self->pv->interaction) { - previous = self->pv->interaction; - self->pv->interaction = interaction; + if (interaction != self->interaction) { + previous = self->interaction; + self->interaction = interaction; if (interaction) g_object_ref (interaction); } - g_mutex_unlock (self->pv->mutex); + g_mutex_unlock (&self->mutex); g_clear_object (&previous); g_object_notify (G_OBJECT (self), "interaction"); @@ -1027,7 +1016,7 @@ check_out_enumerator_state (GckEnumerator *self) GTlsInteraction *old_interaction = NULL; gpointer old_object_class = NULL; GckEnumeratorState *chained_state = NULL; - GckObjectCacheIface *object_iface; + GckObjectCacheInterface *object_iface; GckEnumerator *chained; chained = gck_enumerator_get_chained (self); @@ -1036,35 +1025,35 @@ check_out_enumerator_state (GckEnumerator *self) g_object_unref (chained); } - g_mutex_lock (self->pv->mutex); + g_mutex_lock (&self->mutex); - if (self->pv->the_state) { - state = self->pv->the_state; - self->pv->the_state = NULL; + if (self->the_state) { + state = self->the_state; + self->the_state = NULL; state->enumerator = g_object_ref (self); g_assert (state->chained == NULL); state->chained = chained_state; old_interaction = state->interaction; - if (self->pv->interaction) - state->interaction = g_object_ref (self->pv->interaction); + if (self->interaction) + state->interaction = g_object_ref (self->interaction); else state->interaction = NULL; old_object_class = state->object_class; /* Must already be holding a reference, state also holds a ref */ - state->object_type = self->pv->object_type; + state->object_type = self->object_type; state->object_class = g_type_class_peek (state->object_type); - g_assert (state->object_class == self->pv->object_class); + g_assert (state->object_class == self->object_class); object_iface = g_type_interface_peek (state->object_class, GCK_TYPE_OBJECT_CACHE); - if (self->pv->attr_types) { - state->attr_types = self->pv->attr_types; - state->attr_count = self->pv->attr_count; + if (self->attr_types) { + state->attr_types = self->attr_types; + state->attr_count = self->attr_count; } else if (object_iface && object_iface->default_types) { state->attr_types = object_iface->default_types; state->attr_count = object_iface->n_default_types; @@ -1073,7 +1062,7 @@ check_out_enumerator_state (GckEnumerator *self) g_type_class_ref (state->object_type); } - g_mutex_unlock (self->pv->mutex); + g_mutex_unlock (&self->mutex); if (state == NULL) g_warning ("this enumerator is already running a next operation"); @@ -1096,15 +1085,15 @@ check_in_enumerator_state (GckEnumeratorState *state) g_assert (GCK_IS_ENUMERATOR (state->enumerator)); self = state->enumerator; - g_mutex_lock (self->pv->mutex); + g_mutex_lock (&self->mutex); state->enumerator = NULL; - g_assert (self->pv->the_state == NULL); - self->pv->the_state = state; + g_assert (self->the_state == NULL); + self->the_state = state; chained = state->chained; state->chained = NULL; - g_mutex_unlock (self->pv->mutex); + g_mutex_unlock (&self->mutex); /* matches ref in check_in */ g_object_unref (self); diff --git a/gck/gck-interaction.c b/gck/gck-interaction.c deleted file mode 100644 index 3567a52..0000000 --- a/gck/gck-interaction.c +++ /dev/null @@ -1,176 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* gck-interaction.c - the GObject PKCS#11 wrapper library - - Copyright (C) 2011 Collabora Ltd - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#include "config.h" - -#include "gck-private.h" - -#include <string.h> - -#define GCK_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCK_TYPE_INTERACTION, GckInteraction)) -#define GCK_IS_INTERACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCK_TYPE_INTERACTION)) -#define GCK_INTERACTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCK_TYPE_INTERACTION, GckInteractionClass)) - -typedef struct _GckInteractionClass GckInteractionClass; - -struct _GckInteraction { - GTlsInteraction interaction; - GckModule *module; -}; - -struct _GckInteractionClass { - GTlsInteractionClass parent; -}; - -enum { - PROP_0, - PROP_MODULE -}; - -G_DEFINE_TYPE (GckInteraction, _gck_interaction, G_TYPE_TLS_INTERACTION); - -static void -_gck_interaction_init (GckInteraction *self) -{ - -} - -static void -_gck_interaction_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GckInteraction *self = GCK_INTERACTION (obj); - - switch (prop_id) { - case PROP_MODULE: - g_value_set_object (value, self->module); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gck_interaction_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GckInteraction *self = GCK_INTERACTION (obj); - - switch (prop_id) { - case PROP_MODULE: - g_return_if_fail (self->module == NULL); - self->module = g_value_dup_object (value); - g_return_if_fail (self->module != NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gck_interaction_dispose (GObject *obj) -{ - GckInteraction *self = GCK_INTERACTION (obj); - - g_clear_object (&self->module); - - G_OBJECT_CLASS (_gck_interaction_parent_class)->dispose (obj); -} - -static GTlsInteractionResult -_gck_interaction_ask_password (GTlsInteraction *interaction, - GTlsPassword *password, - GCancellable *cancellable, - GError **error) -{ - GckInteraction *self = GCK_INTERACTION (interaction); - gchar *value = NULL; - gboolean ret = FALSE; - GckSlot *token; - GckObject *key; - - if (!self->module) - return G_TLS_INTERACTION_UNHANDLED; - - token = gck_password_get_token (GCK_PASSWORD (password)); - if (token != NULL) { - g_signal_emit_by_name (self->module, "authenticate-slot", token, - g_tls_password_get_description (password), - &value, &ret); - g_object_unref (token); - - } else { - key = gck_password_get_key (GCK_PASSWORD (password)); - g_return_val_if_fail (GCK_IS_OBJECT (key), G_TLS_INTERACTION_UNHANDLED); - - g_signal_emit_by_name (self->module, "authenticate-object", key, - g_tls_password_get_description (password), - &value, &ret); - g_object_unref (key); - } - - if (ret) { - g_tls_password_set_value_full (password, (guchar *)value, -1, g_free); - return G_TLS_INTERACTION_HANDLED; - } else { - return G_TLS_INTERACTION_UNHANDLED; - } -} - -static void -_gck_interaction_class_init (GckInteractionClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass); - - object_class->get_property = _gck_interaction_get_property; - object_class->set_property = _gck_interaction_set_property; - object_class->dispose = _gck_interaction_dispose; - - interaction_class->ask_password = _gck_interaction_ask_password; - - g_object_class_install_property (object_class, PROP_MODULE, - g_param_spec_object ("module", "Module", "PKCS11 Module", - GCK_TYPE_MODULE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); -} - -GTlsInteraction * -_gck_interaction_new (gpointer token_or_key) -{ - GTlsInteraction *result; - GModule *module = NULL; - - g_return_val_if_fail (GCK_IS_SLOT (token_or_key) || - GCK_IS_OBJECT (token_or_key), NULL); - - g_object_get (token_or_key, "module", &module, NULL); - result = g_object_new (GCK_TYPE_INTERACTION, "module", module, NULL); - g_object_unref (module); - - return result; -} diff --git a/gck/gck-misc.c b/gck/gck-misc.c index e2fbbf8..ef8a19b 100644 --- a/gck/gck-misc.c +++ b/gck/gck-misc.c @@ -101,27 +101,7 @@ EGG_SECURE_DEFINE_GLIB_GLOBALS (); * * The error domain for gck library errors. */ - -GQuark -gck_get_error_quark (void) -{ - /* This is the deprecated version */ - return gck_error_get_quark (); -} - -GQuark -gck_error_get_quark (void) -{ - static GQuark domain = 0; - static size_t quark_inited = 0; - - if (g_once_init_enter (&quark_inited)) { - domain = g_quark_from_static_string ("gck-error"); - g_once_init_leave (&quark_inited, 1); - } - - return domain; -} +G_DEFINE_QUARK(GckError, gck_error) /** * gck_message_from_rv: diff --git a/gck/gck-mock.c b/gck/gck-mock.c index 50a033c..bd61ed0 100644 --- a/gck/gck-mock.c +++ b/gck/gck-mock.c @@ -150,6 +150,14 @@ insert_template (guint handle, GckAttributes *template) the_objects_list = g_slist_append (the_objects_list, data); } +/** + * gck_mock_module_add_object: + * @attrs: (transfer full): + * + * Insert the @attrsin the mock module + * + * Returns: a #CK_OBJECT_HANDLE + */ CK_OBJECT_HANDLE gck_mock_module_add_object (GckAttributes *attrs) { @@ -163,13 +171,12 @@ gck_mock_module_add_object (GckAttributes *attrs) handle = ++unique_identifier; if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token)) { g_return_val_if_fail (token == TRUE, 0); - gck_attributes_ref_sink (attrs); } else { gck_builder_init (&builder); gck_builder_add_except (&builder, attrs, CKA_TOKEN, GCK_INVALID); gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE); gck_attributes_unref (attrs); - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); } insert_template (handle, attrs); @@ -279,9 +286,6 @@ replace_attributes (GckAttributes *atts, CK_ATTRIBUTE_PTR set; gulong *types; - if (!n_attrs) - return gck_attributes_ref_sink (atts); - gck_builder_init (&builder); types = g_new0 (gulong, n_attrs); for (i = 0; i < n_attrs; ++i) { @@ -291,7 +295,7 @@ replace_attributes (GckAttributes *atts, } gck_builder_add_exceptv (&builder, atts, types, n_attrs); g_free (types); - return gck_attributes_ref_sink (gck_builder_end (&builder)); + return gck_builder_end (&builder); } void @@ -354,8 +358,7 @@ gck_mock_C_Initialize (CK_VOID_PTR pInitArgs) gck_builder_init (&builder); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); gck_builder_add_string (&builder, CKA_LABEL, "TEST LABEL"); - insert_template (2, - gck_attributes_ref_sink (gck_builder_end (&builder))); + insert_template (2, gck_builder_end (&builder)); /* Private capitalize key */ value = CKM_MOCK_CAPITALIZE; @@ -369,8 +372,7 @@ gck_mock_C_Initialize (CK_VOID_PTR pInitArgs) gck_builder_add_boolean (&builder, CKA_DERIVE, CK_TRUE); gck_builder_add_string (&builder, CKA_VALUE, "value"); gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique1"); - insert_template (PRIVATE_KEY_CAPITALIZE, - gck_attributes_ref_sink (gck_builder_end (&builder))); + insert_template (PRIVATE_KEY_CAPITALIZE, gck_builder_end (&builder)); /* Public capitalize key */ value = CKM_MOCK_CAPITALIZE; @@ -393,8 +395,7 @@ gck_mock_C_Initialize (CK_VOID_PTR pInitArgs) gck_builder_add_boolean (&builder, CKA_ALWAYS_AUTHENTICATE, CK_TRUE); gck_builder_add_string (&builder, CKA_VALUE, "value"); gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique3"); - insert_template (PRIVATE_KEY_PREFIX, - gck_attributes_ref_sink (gck_builder_end (&builder))); + insert_template (PRIVATE_KEY_PREFIX, gck_builder_end (&builder)); /* Private prefix key */ value = CKM_MOCK_PREFIX; @@ -405,8 +406,7 @@ gck_mock_C_Initialize (CK_VOID_PTR pInitArgs) gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_FALSE); gck_builder_add_string (&builder, CKA_VALUE, "value"); gck_builder_add_string (&builder, CKA_GNOME_UNIQUE, "unique4"); - insert_template (PUBLIC_KEY_PREFIX, - gck_attributes_ref_sink (gck_builder_end (&builder))); + insert_template (PUBLIC_KEY_PREFIX, gck_builder_end (&builder)); logged_in = FALSE; initialized = TRUE; @@ -905,7 +905,7 @@ gck_mock_C_CreateObject (CK_SESSION_HANDLE hSession, CK_ATTRIBUTE_PTR pTemplate, for (i = 0; i < ulCount; ++i) gck_builder_add_data (&builder, pTemplate[i].type, pTemplate[i].pValue, pTemplate[i].ulValueLen); - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); if (gck_attributes_find_boolean (attrs, CKA_PRIVATE, &priv) && priv) { if (!logged_in) { gck_attributes_unref (attrs); @@ -1639,7 +1639,7 @@ gck_mock_unsupported_C_GenerateKeyPair (CK_SESSION_HANDLE hSession, CK_MECHANISM pPublicKeyTemplate[i].pValue, pPublicKeyTemplate[i].ulValueLen); *phPublicKey = ++unique_identifier; - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token) g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPublicKey), attrs); else @@ -1652,7 +1652,7 @@ gck_mock_unsupported_C_GenerateKeyPair (CK_SESSION_HANDLE hSession, CK_MECHANISM pPrivateKeyTemplate[i].pValue, pPrivateKeyTemplate[i].ulValueLen); *phPrivateKey = ++unique_identifier; - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token) g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phPrivateKey), attrs); else @@ -1754,7 +1754,7 @@ gck_mock_unsupported_C_UnwrapKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR p pTemplate[i].pValue, pTemplate[i].ulValueLen); *phKey = ++unique_identifier; - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); if (gck_attributes_find_boolean (attrs, CKA_TOKEN, &token) && token) g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), attrs); else @@ -1802,7 +1802,7 @@ gck_mock_unsupported_C_DeriveKey (CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR p pTemplate[i].ulValueLen); gck_builder_add_all (&builder, attrs); *phKey = ++unique_identifier; - copy = gck_attributes_ref_sink (gck_builder_end (&builder)); + copy = gck_builder_end (&builder); if (gck_attributes_find_boolean (copy, CKA_TOKEN, &token) && token) g_hash_table_insert (the_objects, GUINT_TO_POINTER (*phKey), copy); else diff --git a/gck/gck-module.c b/gck/gck-module.c index a50f78d..a3ecd46 100644 --- a/gck/gck-module.c +++ b/gck/gck-module.c @@ -77,13 +77,7 @@ enum { PROP_FUNCTIONS }; -enum { - AUTHENTICATE_SLOT, - AUTHENTICATE_OBJECT, - LAST_SIGNAL -}; - -struct _GckModulePrivate { +typedef struct { gchar *path; gboolean initialized; CK_FUNCTION_LIST_PTR funcs; @@ -91,32 +85,17 @@ struct _GckModulePrivate { /* Modified atomically */ gint finalized; -}; +} GckModulePrivate; G_DEFINE_TYPE_WITH_PRIVATE (GckModule, gck_module, G_TYPE_OBJECT); -static guint signals[LAST_SIGNAL] = { 0 }; - /* ---------------------------------------------------------------------------- * OBJECT */ -static gboolean -gck_module_real_authenticate_slot (GckModule *module, GckSlot *self, gchar *label, gchar **password) -{ - return FALSE; -} - -static gboolean -gck_module_real_authenticate_object (GckModule *module, GckObject *object, gchar *label, gchar **password) -{ - return FALSE; -} - static void gck_module_init (GckModule *self) { - self->pv = gck_module_get_instance_private (self); } static void @@ -140,16 +119,17 @@ gck_module_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { GckModule *self = GCK_MODULE (obj); + GckModulePrivate *priv = gck_module_get_instance_private (self); /* Only allowed during initialization */ switch (prop_id) { case PROP_PATH: - g_return_if_fail (!self->pv->path); - self->pv->path = g_value_dup_string (value); + g_return_if_fail (!priv->path); + priv->path = g_value_dup_string (value); break; case PROP_FUNCTIONS: - g_return_if_fail (!self->pv->funcs); - self->pv->funcs = g_value_get_pointer (value); + g_return_if_fail (!priv->funcs); + priv->funcs = g_value_get_pointer (value); break; } } @@ -158,20 +138,21 @@ static void gck_module_dispose (GObject *obj) { GckModule *self = GCK_MODULE (obj); + GckModulePrivate *priv = gck_module_get_instance_private (self); gboolean finalize = FALSE; CK_RV rv; - if (self->pv->initialized && self->pv->funcs) { - if (g_atomic_int_compare_and_exchange (&self->pv->finalized, 0, 1)) + if (priv->initialized && priv->funcs) { + if (g_atomic_int_compare_and_exchange (&priv->finalized, 0, 1)) finalize = TRUE; } /* Must be careful when accessing funcs */ if (finalize) { - rv = p11_kit_module_finalize (self->pv->funcs); + rv = p11_kit_module_finalize (priv->funcs); if (rv != CKR_OK) { g_warning ("C_Finalize on module '%s' failed: %s", - self->pv->path, gck_message_from_rv (rv)); + priv->path, gck_message_from_rv (rv)); } } @@ -182,13 +163,12 @@ static void gck_module_finalize (GObject *obj) { GckModule *self = GCK_MODULE (obj); + GckModulePrivate *priv = gck_module_get_instance_private (self); - if (self->pv->initialized && self->pv->funcs) - p11_kit_module_release (self->pv->funcs); - self->pv->funcs = NULL; + if (priv->initialized && priv->funcs) + g_clear_pointer (&priv->funcs, p11_kit_module_release); - g_free (self->pv->path); - self->pv->path = NULL; + g_clear_pointer (&priv->path, g_free); G_OBJECT_CLASS (gck_module_parent_class)->finalize (obj); } @@ -205,9 +185,6 @@ gck_module_class_init (GckModuleClass *klass) gobject_class->dispose = gck_module_dispose; gobject_class->finalize = gck_module_finalize; - klass->authenticate_object = gck_module_real_authenticate_object; - klass->authenticate_slot = gck_module_real_authenticate_slot; - /** * GckModule:path: * @@ -231,38 +208,6 @@ gck_module_class_init (GckModuleClass *klass) g_object_class_install_property (gobject_class, PROP_FUNCTIONS, g_param_spec_pointer ("functions", "Function List", "PKCS11 Function List", G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - - /** - * GckModule::authenticate-slot: - * @module: The module - * @slot: The slot to be authenticated. - * @string: A displayable label which describes the object. - * @password: A gchar** where a password should be returned. - * - * Use gck_session_set_interaction() instead of connecting to this signal. - * - * Deprecated: Since 3.4 - */ - signals[AUTHENTICATE_SLOT] = g_signal_new ("authenticate-slot", GCK_TYPE_MODULE, - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GckModuleClass, authenticate_slot), - g_signal_accumulator_true_handled, NULL, _gck_marshal_BOOLEAN__OBJECT_STRING_POINTER, - G_TYPE_BOOLEAN, 3, GCK_TYPE_SLOT, G_TYPE_STRING, G_TYPE_POINTER); - - /** - * GckModule::authenticate-object: - * @module: The module. - * @object: The object to be authenticated. - * @label: A displayable label which describes the object. - * @password: A gchar** where a password should be returned. - * - * Use gck_session_set_interaction() instead of connecting to this signal. - * - * Deprecated: Since 3.4 - */ - signals[AUTHENTICATE_OBJECT] = g_signal_new ("authenticate-object", GCK_TYPE_MODULE, - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GckModuleClass, authenticate_object), - g_signal_accumulator_true_handled, NULL, _gck_marshal_BOOLEAN__OBJECT_STRING_POINTER, - G_TYPE_BOOLEAN, 3, GCK_TYPE_OBJECT, G_TYPE_STRING, G_TYPE_POINTER); } G_DEFINE_BOXED_TYPE (GckModuleInfo, gck_module_info, @@ -300,9 +245,9 @@ gck_module_info_free (GckModuleInfo *module_info) { if (!module_info) return; - g_free (module_info->library_description); - g_free (module_info->manufacturer_id); - g_free (module_info); + g_clear_pointer (&module_info->library_description, g_free); + g_clear_pointer (&module_info->manufacturer_id, g_free); + g_clear_pointer (&module_info, g_free); } typedef struct { @@ -317,19 +262,21 @@ perform_initialize (Initialize *args) { CK_FUNCTION_LIST_PTR funcs; GckModule *result; + GckModulePrivate *priv; CK_RV rv; funcs = p11_kit_module_load (args->path, P11_KIT_MODULE_CRITICAL); if (funcs == NULL) { - g_set_error (&args->error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM, + g_set_error (&args->error, GCK_ERROR, (int)GCK_ERROR_MODULE_PROBLEM, _("Error loading PKCS#11 module: %s"), p11_kit_message ()); - return CKR_GCK_MODULE_PROBLEM; + return GCK_ERROR_MODULE_PROBLEM; } result = g_object_new (GCK_TYPE_MODULE, "functions", funcs, "path", args->path, NULL); + priv = gck_module_get_instance_private (result); /* Now initialize the module */ rv = p11_kit_module_initialize (funcs); @@ -342,7 +289,7 @@ perform_initialize (Initialize *args) return rv; } - result->pv->initialized = TRUE; + priv->initialized = TRUE; args->result = result; return CKR_OK; } @@ -476,14 +423,15 @@ GckModule* _gck_module_new_initialized (CK_FUNCTION_LIST_PTR funcs) { GckModule *module = gck_module_new (funcs); - module->pv->initialized = TRUE; /* As if we initialized it */ + GckModulePrivate *priv = gck_module_get_instance_private (module); + priv->initialized = TRUE; /* As if we initialized it */ return module; } /** * gck_module_equal: - * @module1: (type Gck.Module): a pointer to the first #GckModule - * @module2: (type Gck.Module): a pointer to the second #GckModule + * @module1: a first #GckModule + * @module2: a second #GckModule * * Checks equality of two modules. Two GckModule objects can point to the same * underlying PKCS#11 module. @@ -492,19 +440,18 @@ _gck_module_new_initialized (CK_FUNCTION_LIST_PTR funcs) * %FALSE if either is not a GckModule. **/ gboolean -gck_module_equal (gconstpointer module1, gconstpointer module2) +gck_module_equal (GckModule *module1, GckModule *module2) { - GckModule *mod1, *mod2; + GckModulePrivate *priv1 = gck_module_get_instance_private (module1); + GckModulePrivate *priv2 = gck_module_get_instance_private (module2); if (module1 == module2) return TRUE; + if (!GCK_IS_MODULE (module1) || !GCK_IS_MODULE (module2)) return FALSE; - mod1 = GCK_MODULE (module1); - mod2 = GCK_MODULE (module2); - - return mod1->pv->funcs == mod2->pv->funcs; + return priv1->funcs == priv2->funcs; } /** @@ -519,13 +466,13 @@ gck_module_equal (gconstpointer module1, gconstpointer module2) * Return value: An integer that can be used as a hash value, or 0 if invalid. **/ guint -gck_module_hash (gconstpointer module) +gck_module_hash (GckModule *module) { - GckModule *self; + GckModulePrivate *priv = gck_module_get_instance_private (module); g_return_val_if_fail (GCK_IS_MODULE (module), 0); - self = GCK_MODULE (module); - return g_direct_hash (self->pv->funcs); + + return g_direct_hash (priv->funcs); } GckModuleInfo* @@ -577,14 +524,15 @@ _gck_module_info_to_pkcs11 (GckModuleInfo* module_info, CK_INFO_PTR info) GckModuleInfo* gck_module_get_info (GckModule *self) { + GckModulePrivate *priv = gck_module_get_instance_private (self); CK_INFO info; CK_RV rv; g_return_val_if_fail (GCK_IS_MODULE (self), NULL); - g_return_val_if_fail (self->pv->funcs, NULL); + g_return_val_if_fail (priv->funcs, NULL); memset (&info, 0, sizeof (info)); - rv = (self->pv->funcs->C_GetInfo (&info)); + rv = (priv->funcs->C_GetInfo (&info)); if (rv != CKR_OK) { g_warning ("couldn't get module info: %s", gck_message_from_rv (rv)); return NULL; @@ -606,15 +554,16 @@ gck_module_get_info (GckModule *self) GList* gck_module_get_slots (GckModule *self, gboolean token_present) { + GckModulePrivate *priv = gck_module_get_instance_private (self); CK_SLOT_ID_PTR slot_list; CK_ULONG count, i; GList *result; CK_RV rv; g_return_val_if_fail (GCK_IS_MODULE (self), NULL); - g_return_val_if_fail (self->pv->funcs, NULL); + g_return_val_if_fail (priv->funcs, NULL); - rv = (self->pv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, NULL, &count); + rv = (priv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, NULL, &count); if (rv != CKR_OK) { g_warning ("couldn't get slot count: %s", gck_message_from_rv (rv)); return NULL; @@ -624,7 +573,7 @@ gck_module_get_slots (GckModule *self, gboolean token_present) return NULL; slot_list = g_new (CK_SLOT_ID, count); - rv = (self->pv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, slot_list, &count); + rv = (priv->funcs->C_GetSlotList) (token_present ? CK_TRUE : CK_FALSE, slot_list, &count); if (rv != CKR_OK) { g_warning ("couldn't get slot list: %s", gck_message_from_rv (rv)); g_free (slot_list); @@ -654,8 +603,11 @@ gck_module_get_slots (GckModule *self, gboolean token_present) const gchar* gck_module_get_path (GckModule *self) { + GckModulePrivate *priv = gck_module_get_instance_private (self); + g_return_val_if_fail (GCK_IS_MODULE (self), NULL); - return self->pv->path; + + return priv->path; } /** @@ -669,8 +621,11 @@ gck_module_get_path (GckModule *self) CK_FUNCTION_LIST_PTR gck_module_get_functions (GckModule *self) { + GckModulePrivate *priv = gck_module_get_instance_private (self); + g_return_val_if_fail (GCK_IS_MODULE (self), NULL); - return self->pv->funcs; + + return priv->funcs; } /** diff --git a/gck/gck-modules.c b/gck/gck-modules.c index 97d7f01..71a6ed9 100644 --- a/gck/gck-modules.c +++ b/gck/gck-modules.c @@ -56,9 +56,9 @@ perform_initialize_registered (InitializeRegistered *args) modules = p11_kit_modules_load_and_initialize (0); if (modules == NULL) { - g_set_error (&args->error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM, + g_set_error (&args->error, GCK_ERROR, (int)GCK_ERROR_MODULE_PROBLEM, _("Couldn’t initialize registered PKCS#11 modules: %s"), p11_kit_message ()); - return CKR_GCK_MODULE_PROBLEM; + return GCK_ERROR_MODULE_PROBLEM; } for (funcs = modules; *funcs; ++funcs) { @@ -195,8 +195,6 @@ gck_modules_get_slots (GList *modules, gboolean token_present) * * This call will not block but will return an enumerator immediately. * - * If the @attrs [struct@Attributes] is floating, it is consumed. - * * Return value: (transfer full): A new enumerator, which should be released * with g_object_unref(). **/ @@ -210,7 +208,7 @@ gck_modules_enumerate_objects (GList *modules, g_return_val_if_fail (attrs, NULL); uri_data = gck_uri_data_new (); - uri_data->attributes = gck_attributes_ref_sink (attrs); + uri_data->attributes = gck_attributes_ref (attrs); return _gck_enumerator_new_for_modules (modules, session_options, uri_data); } @@ -231,7 +229,7 @@ tokens_for_uri (GList *modules, GckUriFlags flags; flags = GCK_URI_FOR_OBJECT_ON_TOKEN_AND_MODULE | GCK_URI_FOR_MODULE_WITH_VERSION; - uri_data = gck_uri_parse (uri, flags, error); + uri_data = gck_uri_data_parse (uri, flags, error); if (uri_data == NULL) return NULL; @@ -418,7 +416,7 @@ gck_modules_enumerate_uri (GList *modules, g_return_val_if_fail (uri != NULL, NULL); - uri_data = gck_uri_parse (uri, GCK_URI_FOR_ANY, error); + uri_data = gck_uri_data_parse (uri, GCK_URI_FOR_ANY, error); if (uri_data == NULL) return NULL; diff --git a/gck/gck-object-cache.c b/gck/gck-object-cache.c index d86867d..2154867 100644 --- a/gck/gck-object-cache.c +++ b/gck/gck-object-cache.c @@ -37,7 +37,7 @@ */ /** - * GckObjectCacheIface: + * GckObjectCacheInterface: * @interface: parent interface * @default_types: (array length=n_default_types): attribute types that an * enumerator should retrieve @@ -53,26 +53,19 @@ * cache. It must be thread safe. */ -typedef GckObjectCacheIface GckObjectCacheInterface; G_DEFINE_INTERFACE (GckObjectCache, gck_object_cache, GCK_TYPE_OBJECT); static void -gck_object_cache_default_init (GckObjectCacheIface *iface) +gck_object_cache_default_init (GckObjectCacheInterface *iface) { - static size_t initialized = 0; - if (g_once_init_enter (&initialized)) { - - /** - * GckObjectCache:attributes: - * - * The attributes cached on this object. - */ - g_object_interface_install_property (iface, - g_param_spec_boxed ("attributes", "Attributes", "PKCS#11 Attributes", - GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_once_init_leave (&initialized, 1); - } + /** + * GckObjectCache:attributes: + * + * The attributes cached on this object. + */ + g_object_interface_install_property (iface, + g_param_spec_boxed ("attributes", "Attributes", "PKCS#11 Attributes", + GCK_TYPE_ATTRIBUTES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } /** @@ -98,9 +91,6 @@ gck_object_cache_get_attributes (GckObjectCache *object) * @attrs: (nullable): the attributes to set * * Sets the attributes cached on this object. - * - * If the @attrs #GckAttributes is floating, it is consumed. - * */ void gck_object_cache_set_attributes (GckObjectCache *object, @@ -108,9 +98,7 @@ gck_object_cache_set_attributes (GckObjectCache *object, { g_return_if_fail (GCK_IS_OBJECT_CACHE (object)); - gck_attributes_ref_sink (attrs); g_object_set (object, "attributes", attrs, NULL); - gck_attributes_unref (attrs); } /** @@ -122,24 +110,20 @@ gck_object_cache_set_attributes (GckObjectCache *object, * already present in the cache it will be overridden by this value. * * This will be done in a thread-safe manner. - * - * If the @attrs #GckAttributes is floating, it is consumed. */ void gck_object_cache_fill (GckObjectCache *object, GckAttributes *attrs) { - GckObjectCacheIface *iface; + GckObjectCacheInterface *iface; g_return_if_fail (GCK_IS_OBJECT_CACHE (object)); g_return_if_fail (attrs != NULL); - iface = GCK_OBJECT_CACHE_GET_INTERFACE (object); + iface = GCK_OBJECT_CACHE_GET_IFACE (object); g_return_if_fail (iface->fill != NULL); - gck_attributes_ref_sink (attrs); (iface->fill) (object, attrs); - gck_attributes_unref (attrs); } /** @@ -164,7 +148,7 @@ gck_object_cache_update (GckObjectCache *object, GCancellable *cancellable, GError **error) { - GckObjectCacheIface *iface; + GckObjectCacheInterface *iface; GckAttributes *attrs; g_return_val_if_fail (GCK_IS_OBJECT_CACHE (object), FALSE); @@ -172,7 +156,7 @@ gck_object_cache_update (GckObjectCache *object, g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - iface = GCK_OBJECT_CACHE_GET_INTERFACE (object); + iface = GCK_OBJECT_CACHE_GET_IFACE (object); if (attr_types == NULL) { attr_types = iface->default_types; @@ -240,14 +224,14 @@ gck_object_cache_update_async (GckObjectCache *object, GAsyncReadyCallback callback, gpointer user_data) { - GckObjectCacheIface *iface; + GckObjectCacheInterface *iface; GTask *task; g_return_if_fail (GCK_IS_OBJECT_CACHE (object)); g_return_if_fail (attr_types != NULL || n_attr_types == 0); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - iface = GCK_OBJECT_CACHE_GET_INTERFACE (object); + iface = GCK_OBJECT_CACHE_GET_IFACE (object); if (attr_types == NULL) { attr_types = iface->default_types; diff --git a/gck/gck-object.c b/gck/gck-object.c index 284b1f3..da07bf8 100644 --- a/gck/gck-object.c +++ b/gck/gck-object.c @@ -61,11 +61,11 @@ enum { PROP_HANDLE }; -struct _GckObjectPrivate { +typedef struct { GckModule *module; GckSession *session; CK_OBJECT_HANDLE handle; -}; +} GckObjectPrivate; G_DEFINE_TYPE_WITH_PRIVATE (GckObject, gck_object, G_TYPE_OBJECT); @@ -76,7 +76,6 @@ G_DEFINE_TYPE_WITH_PRIVATE (GckObject, gck_object, G_TYPE_OBJECT); static void gck_object_init (GckObject *self) { - self->pv = gck_object_get_instance_private (self); } static void @@ -103,25 +102,24 @@ gck_object_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { GckObject *self = GCK_OBJECT (obj); + GckObjectPrivate *priv = gck_object_get_instance_private (self); /* The sets to data below are only allowed during construction */ switch (prop_id) { case PROP_MODULE: - g_return_if_fail (!self->pv->module); - self->pv->module = g_value_get_object (value); - g_return_if_fail (self->pv->module); - g_object_ref (self->pv->module); + g_return_if_fail (!priv->module); + priv->module = g_value_dup_object (value); + g_return_if_fail (priv->module); break; case PROP_SESSION: - g_return_if_fail (!self->pv->session); - self->pv->session = g_value_get_object (value); - g_return_if_fail (self->pv->session); - g_object_ref (self->pv->session); + g_return_if_fail (!priv->session); + priv->session = g_value_dup_object (value); + g_return_if_fail (priv->session); break; case PROP_HANDLE: - g_return_if_fail (!self->pv->handle); - self->pv->handle = g_value_get_ulong (value); + g_return_if_fail (!priv->handle); + priv->handle = g_value_get_ulong (value); break; } } @@ -130,16 +128,11 @@ static void gck_object_finalize (GObject *obj) { GckObject *self = GCK_OBJECT (obj); + GckObjectPrivate *priv = gck_object_get_instance_private (self); - if (self->pv->session) - g_object_unref (self->pv->session); - self->pv->session = NULL; - - if (self->pv->module) - g_object_unref (self->pv->module); - self->pv->module = NULL; - - self->pv->handle = 0; + g_clear_object (&priv->session); + g_clear_object (&priv->module); + priv->handle = 0; G_OBJECT_CLASS (gck_object_parent_class)->finalize (obj); } @@ -256,8 +249,8 @@ gck_objects_from_handle_array (GckSession *session, /** * gck_object_equal: - * @object1: (type Gck.Object): a pointer to the first #GckObject - * @object2: (type Gck.Object): a pointer to the second #GckObject + * @object1: a pointer to the first #GckObject + * @object2: a pointer to the second #GckObject * * Checks equality of two objects. Two GckObject objects can point to the same * underlying PKCS#11 object. @@ -266,9 +259,10 @@ gck_objects_from_handle_array (GckSession *session, * %FALSE if either is not a GckObject. **/ gboolean -gck_object_equal (gconstpointer object1, gconstpointer object2) +gck_object_equal (GckObject *object1, GckObject *object2) { - GckObject *obj1, *obj2; + GckObjectPrivate *priv1 = gck_object_get_instance_private (object1); + GckObjectPrivate *priv2 = gck_object_get_instance_private (object2); GckSlot *slot1, *slot2; gboolean ret; @@ -277,13 +271,10 @@ gck_object_equal (gconstpointer object1, gconstpointer object2) if (!GCK_IS_OBJECT (object1) || !GCK_IS_OBJECT (object2)) return FALSE; - obj1 = GCK_OBJECT (object1); - obj2 = GCK_OBJECT (object2); + slot1 = gck_session_get_slot (priv1->session); + slot2 = gck_session_get_slot (priv2->session); - slot1 = gck_session_get_slot (obj1->pv->session); - slot2 = gck_session_get_slot (obj2->pv->session); - - ret = obj1->pv->handle == obj2->pv->handle && + ret = priv1->handle == priv2->handle && gck_slot_equal (slot1, slot2); g_object_unref (slot1); @@ -304,18 +295,17 @@ gck_object_equal (gconstpointer object1, gconstpointer object2) * Return value: An integer that can be used as a hash value, or 0 if invalid. **/ guint -gck_object_hash (gconstpointer object) +gck_object_hash (GckObject *object) { - GckObject *self; + GckObjectPrivate *priv = gck_object_get_instance_private (object); GckSlot *slot; guint hash; g_return_val_if_fail (GCK_IS_OBJECT (object), 0); - self = GCK_OBJECT (object); - slot = gck_session_get_slot (self->pv->session); + slot = gck_session_get_slot (priv->session); - hash = _gck_ulong_hash (&self->pv->handle) ^ + hash = _gck_ulong_hash (&priv->handle) ^ gck_slot_hash (slot); g_object_unref (slot); @@ -335,8 +325,11 @@ gck_object_hash (gconstpointer object) gulong gck_object_get_handle (GckObject *self) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); + g_return_val_if_fail (GCK_IS_OBJECT (self), (CK_OBJECT_HANDLE)-1); - return self->pv->handle; + + return priv->handle; } /** @@ -350,9 +343,12 @@ gck_object_get_handle (GckObject *self) GckModule * gck_object_get_module (GckObject *self) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); - g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL); - return g_object_ref (self->pv->module); + g_return_val_if_fail (GCK_IS_MODULE (priv->module), NULL); + + return g_object_ref (priv->module); } @@ -372,9 +368,12 @@ gck_object_get_module (GckObject *self) GckSession * gck_object_get_session (GckObject *self) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); + g_return_val_if_fail (GCK_IS_OBJECT (self), NULL); - g_return_val_if_fail (GCK_IS_SESSION (self->pv->session), NULL); - return g_object_ref (self->pv->session); + g_return_val_if_fail (GCK_IS_SESSION (priv->session), NULL); + + return g_object_ref (priv->session); } /* -------------------------------------------------------------------------------------- @@ -407,14 +406,15 @@ perform_destroy (Destroy *args) gboolean gck_object_destroy (GckObject *self, GCancellable *cancellable, GError **error) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); Destroy args = { GCK_ARGUMENTS_INIT, 0 }; g_return_val_if_fail (GCK_IS_OBJECT (self), FALSE); - g_return_val_if_fail (GCK_IS_SESSION (self->pv->session), FALSE); + g_return_val_if_fail (GCK_IS_SESSION (priv->session), FALSE); g_return_val_if_fail (!error || !*error, FALSE); - args.object = self->pv->handle; - return _gck_call_sync (self->pv->session, perform_destroy, NULL, &args, cancellable, error); + args.object = priv->handle; + return _gck_call_sync (priv->session, perform_destroy, NULL, &args, cancellable, error); } /** @@ -431,15 +431,16 @@ void gck_object_destroy_async (GckObject *self, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); GckCall *call; Destroy* args; g_return_if_fail (GCK_IS_OBJECT (self)); - g_return_if_fail (GCK_IS_SESSION (self->pv->session)); + g_return_if_fail (GCK_IS_SESSION (priv->session)); - call = _gck_call_async_prep (self->pv->session, perform_destroy, NULL, sizeof (*args), NULL); + call = _gck_call_async_prep (priv->session, perform_destroy, NULL, sizeof (*args), NULL); args = _gck_call_get_arguments (call); - args->object = self->pv->handle; + args->object = priv->handle; _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -503,14 +504,13 @@ free_set_attributes (SetAttributes *args) * * Set PKCS#11 attributes on an object. This call may block for an indefinite period. * - * If the @attrs #GckAttributes is floating, it is consumed. - * * Return value: Whether the call was successful or not. **/ gboolean gck_object_set (GckObject *self, GckAttributes *attrs, GCancellable *cancellable, GError **error) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); SetAttributes args; gboolean ret = FALSE; @@ -520,13 +520,9 @@ gck_object_set (GckObject *self, GckAttributes *attrs, memset (&args, 0, sizeof (args)); args.attrs = attrs; - args.object = self->pv->handle; - - gck_attributes_ref_sink (attrs); - - ret = _gck_call_sync (self->pv->session, perform_set_attributes, NULL, &args, cancellable, error); + args.object = priv->handle; - gck_attributes_unref (attrs); + ret = _gck_call_sync (priv->session, perform_set_attributes, NULL, &args, cancellable, error); return ret; } @@ -541,25 +537,24 @@ gck_object_set (GckObject *self, GckAttributes *attrs, * * Set PKCS#11 attributes on an object. This call will return * immediately and completes asynchronously. - * - * If the @attrs #GckAttributes is floating, it is consumed. **/ void gck_object_set_async (GckObject *self, GckAttributes *attrs, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); GckCall *call; SetAttributes *args; g_return_if_fail (GCK_IS_OBJECT (self)); g_return_if_fail (attrs != NULL); - call = _gck_call_async_prep (self->pv->session, perform_set_attributes, + call = _gck_call_async_prep (priv->session, perform_set_attributes, NULL, sizeof (*args), free_set_attributes); args = _gck_call_get_arguments (call); - args->attrs = gck_attributes_ref_sink (attrs); - args->object = self->pv->handle; + args->attrs = gck_attributes_ref (attrs); + args->object = priv->handle; _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -706,6 +701,7 @@ gck_object_get_full (GckObject *self, GCancellable *cancellable, GError **error) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); GetAttributes args; gboolean ret; guint i; @@ -719,12 +715,12 @@ gck_object_get_full (GckObject *self, for (i = 0; i < n_attr_types; ++i) gck_builder_add_empty (&args.builder, attr_types[i]); - args.object = self->pv->handle; + args.object = priv->handle; - ret = _gck_call_sync (self->pv->session, perform_get_attributes, NULL, &args, cancellable, error); + ret = _gck_call_sync (priv->session, perform_get_attributes, NULL, &args, cancellable, error); if (ret) { - return gck_attributes_ref_sink (gck_builder_end (&args.builder)); + return gck_builder_end (&args.builder); } else { gck_builder_clear (&args.builder); return NULL; @@ -755,13 +751,14 @@ gck_object_get_async (GckObject *self, GAsyncReadyCallback callback, gpointer user_data) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); GckCall *call; GetAttributes *args; guint i; g_return_if_fail (GCK_IS_OBJECT (self)); - call = _gck_call_async_prep (self->pv->session, perform_get_attributes, + call = _gck_call_async_prep (priv->session, perform_get_attributes, NULL, sizeof (*args), free_get_attributes); args = _gck_call_get_arguments (call); @@ -769,7 +766,7 @@ gck_object_get_async (GckObject *self, for (i = 0; i < n_attr_types; ++i) gck_builder_add_empty (&args->builder, attr_types[i]); - args->object = self->pv->handle; + args->object = priv->handle; _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -802,7 +799,7 @@ gck_object_get_finish (GckObject *self, GAsyncResult *result, GError **error) if (!_gck_call_basic_finish (result, error)) return NULL; - return gck_attributes_ref_sink (gck_builder_end (&args->builder)); + return gck_builder_end (&args->builder); } /* --------------------------------------------------------------------------------- @@ -913,6 +910,7 @@ guchar * gck_object_get_data_full (GckObject *self, gulong attr_type, GckAllocator allocator, GCancellable *cancellable, gsize *n_data, GError **error) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); GetAttributeData args; gboolean ret; @@ -925,10 +923,10 @@ gck_object_get_data_full (GckObject *self, gulong attr_type, GckAllocator alloca memset (&args, 0, sizeof (args)); args.allocator = allocator; - args.object = self->pv->handle; + args.object = priv->handle; args.type = attr_type; - ret = _gck_call_sync (self->pv->session, perform_get_attribute_data, NULL, &args, cancellable, error); + ret = _gck_call_sync (priv->session, perform_get_attribute_data, NULL, &args, cancellable, error); /* Free any value if failed */ if (!ret) { @@ -959,6 +957,7 @@ gck_object_get_data_async (GckObject *self, gulong attr_type, GckAllocator alloc GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); GckCall *call; GetAttributeData *args; @@ -967,12 +966,12 @@ gck_object_get_data_async (GckObject *self, gulong attr_type, GckAllocator alloc if (!allocator) allocator = g_realloc; - call = _gck_call_async_prep (self->pv->session, perform_get_attribute_data, + call = _gck_call_async_prep (priv->session, perform_get_attribute_data, NULL, sizeof (*args), free_get_attribute_data); args = _gck_call_get_arguments (call); args->allocator = allocator; - args->object = self->pv->handle; + args->object = priv->handle; args->type = attr_type; _gck_call_async_ready_go (call, self, cancellable, callback, user_data); @@ -1073,6 +1072,7 @@ gboolean gck_object_set_template (GckObject *self, gulong attr_type, GckAttributes *attrs, GCancellable *cancellable, GError **error) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); set_template_args args; gboolean ret = FALSE; @@ -1083,13 +1083,9 @@ gck_object_set_template (GckObject *self, gulong attr_type, GckAttributes *attrs memset (&args, 0, sizeof (args)); args.attrs = attrs; args.type = attr_type; - args.object = self->pv->handle; - - gck_attributes_ref_sink (attrs); - - ret = _gck_call_sync (self->pv->session, perform_set_template, NULL, &args, cancellable, error); + args.object = priv->handle; - gck_attributes_unref (attrs); + ret = _gck_call_sync (priv->session, perform_set_template, NULL, &args, cancellable, error); return ret; } @@ -1115,19 +1111,20 @@ gck_object_set_template_async (GckObject *self, gulong attr_type, GckAttributes GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); GckCall *call; set_template_args *args; g_return_if_fail (GCK_IS_OBJECT (self)); g_return_if_fail (attrs); - call = _gck_call_async_prep (self->pv->session, perform_set_template, + call = _gck_call_async_prep (priv->session, perform_set_template, NULL, sizeof (*args), free_set_template); args = _gck_call_get_arguments (call); - args->attrs = gck_attributes_ref_sink (attrs); + args->attrs = gck_attributes_ref (attrs); args->type = attr_type; - args->object = self->pv->handle; + args->object = priv->handle; _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -1236,6 +1233,7 @@ GckAttributes * gck_object_get_template (GckObject *self, gulong attr_type, GCancellable *cancellable, GError **error) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); get_template_args args; gboolean ret; @@ -1243,10 +1241,10 @@ gck_object_get_template (GckObject *self, gulong attr_type, g_return_val_if_fail (!error || !*error, NULL); memset (&args, 0, sizeof (args)); - args.object = self->pv->handle; + args.object = priv->handle; args.type = attr_type; - ret = _gck_call_sync (self->pv->session, perform_get_template, NULL, &args, cancellable, error); + ret = _gck_call_sync (priv->session, perform_get_template, NULL, &args, cancellable, error); /* Free any value if failed */ if (!ret) { @@ -1254,7 +1252,7 @@ gck_object_get_template (GckObject *self, gulong attr_type, return NULL; } - return gck_attributes_ref_sink (gck_builder_end (&args.builder)); + return gck_builder_end (&args.builder); } /** @@ -1275,16 +1273,17 @@ gck_object_get_template_async (GckObject *self, gulong attr_type, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { + GckObjectPrivate *priv = gck_object_get_instance_private (self); GckCall *call; get_template_args *args; g_return_if_fail (GCK_IS_OBJECT (self)); - call = _gck_call_async_prep (self->pv->session, perform_get_template, + call = _gck_call_async_prep (priv->session, perform_get_template, NULL, sizeof (*args), free_get_template); args = _gck_call_get_arguments (call); - args->object = self->pv->handle; + args->object = priv->handle; args->type = attr_type; _gck_call_async_ready_go (call, self, cancellable, callback, user_data); @@ -1316,5 +1315,5 @@ gck_object_get_template_finish (GckObject *self, GAsyncResult *result, return NULL; args = _gck_call_async_result_arguments (result, get_template_args); - return gck_attributes_ref_sink (gck_builder_end (&args->builder)); + return gck_builder_end (&args->builder); } diff --git a/gck/gck-password.c b/gck/gck-password.c index 13bb8f9..3c102e0 100644 --- a/gck/gck-password.c +++ b/gck/gck-password.c @@ -53,17 +53,18 @@ enum { PROP_KEY }; -struct _GckPasswordPrivate { +struct _GckPassword { + GTlsPassword parent_instance; + gboolean for_token; gpointer token_or_key; }; -G_DEFINE_TYPE_WITH_PRIVATE (GckPassword, gck_password, G_TYPE_TLS_PASSWORD); +G_DEFINE_TYPE (GckPassword, gck_password, G_TYPE_TLS_PASSWORD); static void gck_password_init (GckPassword *self) { - self->pv = gck_password_get_instance_private (self); } static void @@ -73,8 +74,8 @@ gck_password_constructed (GObject *obj) G_OBJECT_CLASS (gck_password_parent_class)->constructed (obj); - g_return_if_fail (GCK_IS_SLOT (self->pv->token_or_key) || - GCK_IS_OBJECT (self->pv->token_or_key)); + g_return_if_fail (GCK_IS_SLOT (self->token_or_key) || + GCK_IS_OBJECT (self->token_or_key)); } static void @@ -116,17 +117,17 @@ gck_password_set_property (GObject *obj, case PROP_TOKEN: object = g_value_dup_object (value); if (object != NULL) { - g_assert (self->pv->token_or_key == NULL); - self->pv->token_or_key = object; - self->pv->for_token = TRUE; + g_assert (self->token_or_key == NULL); + self->token_or_key = object; + self->for_token = TRUE; } break; case PROP_KEY: object = g_value_dup_object (value); if (object != NULL) { - g_assert (self->pv->token_or_key == NULL); - self->pv->token_or_key = object; - self->pv->for_token = FALSE; + g_assert (self->token_or_key == NULL); + self->token_or_key = object; + self->for_token = FALSE; } break; default: @@ -140,7 +141,7 @@ gck_password_finalize (GObject *obj) { GckPassword *self = GCK_PASSWORD (obj); - g_clear_object (&self->pv->token_or_key); + g_clear_object (&self->token_or_key); G_OBJECT_CLASS (gck_password_parent_class)->finalize (obj); } @@ -198,10 +199,10 @@ GckModule * gck_password_get_module (GckPassword *self) { g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL); - if (self->pv->for_token) - return gck_slot_get_module (self->pv->token_or_key); + if (self->for_token) + return gck_slot_get_module (self->token_or_key); else - return gck_object_get_module (self->pv->token_or_key); + return gck_object_get_module (self->token_or_key); } /** @@ -218,10 +219,10 @@ GckSlot * gck_password_get_token (GckPassword *self) { g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL); - if (!self->pv->for_token) + if (!self->for_token) return NULL; - g_return_val_if_fail (GCK_IS_SLOT (self->pv->token_or_key), NULL); - return g_object_ref (self->pv->token_or_key); + g_return_val_if_fail (GCK_IS_SLOT (self->token_or_key), NULL); + return g_object_ref (self->token_or_key); } /** @@ -238,8 +239,8 @@ GckObject * gck_password_get_key (GckPassword *self) { g_return_val_if_fail (GCK_IS_PASSWORD (self), NULL); - if (self->pv->for_token) + if (self->for_token) return NULL; - g_return_val_if_fail (GCK_IS_OBJECT (self->pv->token_or_key), NULL); - return g_object_ref (self->pv->token_or_key); + g_return_val_if_fail (GCK_IS_OBJECT (self->token_or_key), NULL); + return g_object_ref (self->token_or_key); } diff --git a/gck/gck-private.h b/gck/gck-private.h index 6c4117c..93731d6 100644 --- a/gck/gck-private.h +++ b/gck/gck-private.h @@ -122,20 +122,6 @@ void _gck_password_update (GckPassword *self, gboolean request_retry); /* ---------------------------------------------------------------------------- - * INTERACTION - */ - -#define GCK_TYPE_INTERACTION (_gck_interaction_get_type ()) -#define GCK_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_INTERACTION, GckInteraction)) -#define GCK_IS_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_INTERACTION)) - -typedef struct _GckInteraction GckInteraction; - -GType _gck_interaction_get_type (void) G_GNUC_CONST; - -GTlsInteraction * _gck_interaction_new (gpointer token_or_key); - -/* ---------------------------------------------------------------------------- * CALL */ diff --git a/gck/gck-session.c b/gck/gck-session.c index 4c5fe08..29ef89e 100644 --- a/gck/gck-session.c +++ b/gck/gck-session.c @@ -74,7 +74,7 @@ enum { PROP_APP_DATA }; -struct _GckSessionPrivate { +typedef struct { /* Not modified after construct/init */ GckSlot *slot; CK_SESSION_HANDLE handle; @@ -83,10 +83,10 @@ struct _GckSessionPrivate { gpointer app_data; /* Changable data locked by mutex */ - GMutex *mutex; + GMutex mutex; GTlsInteraction *interaction; gboolean discarded; -}; +} GckSessionPrivate; static void gck_session_initable_iface (GInitableIface *iface); @@ -132,9 +132,8 @@ gck_session_real_discard_handle (GckSession *self, CK_OBJECT_HANDLE handle) static void gck_session_init (GckSession *self) { - self->pv = gck_session_get_instance_private (self); - self->pv->mutex = g_new0 (GMutex, 1); - g_mutex_init (self->pv->mutex); + GckSessionPrivate *priv = gck_session_get_instance_private (self); + g_mutex_init (&priv->mutex); } static void @@ -170,31 +169,32 @@ gck_session_set_property (GObject *obj, guint prop_id, const GValue *value, GParamSpec *pspec) { GckSession *self = GCK_SESSION (obj); + GckSessionPrivate *priv = gck_session_get_instance_private (self); /* Only valid calls are from constructor */ switch (prop_id) { case PROP_HANDLE: - g_return_if_fail (!self->pv->handle); - self->pv->handle = g_value_get_ulong (value); + g_return_if_fail (!priv->handle); + priv->handle = g_value_get_ulong (value); break; case PROP_INTERACTION: gck_session_set_interaction (self, g_value_get_object (value)); break; case PROP_SLOT: - g_return_if_fail (!self->pv->slot); - self->pv->slot = g_value_dup_object (value); - g_return_if_fail (self->pv->slot); + g_return_if_fail (!priv->slot); + priv->slot = g_value_dup_object (value); + g_return_if_fail (priv->slot); break; case PROP_OPTIONS: - g_return_if_fail (!self->pv->options); - self->pv->options = g_value_get_flags (value); + g_return_if_fail (!priv->options); + priv->options = g_value_get_flags (value); break; case PROP_OPENING_FLAGS: - self->pv->opening_flags = g_value_get_ulong (value); + priv->opening_flags = g_value_get_ulong (value); break; case PROP_APP_DATA: - self->pv->app_data = g_value_get_pointer (value); + priv->app_data = g_value_get_pointer (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); @@ -206,28 +206,30 @@ static void gck_session_constructed (GObject *obj) { GckSession *self = GCK_SESSION (obj); + GckSessionPrivate *priv = gck_session_get_instance_private (self); G_OBJECT_CLASS (gck_session_parent_class)->constructed (obj); - self->pv->opening_flags |= CKF_SERIAL_SESSION; - if (self->pv->options & GCK_SESSION_READ_WRITE) - self->pv->opening_flags |= CKF_RW_SESSION; + priv->opening_flags |= CKF_SERIAL_SESSION; + if (priv->options & GCK_SESSION_READ_WRITE) + priv->opening_flags |= CKF_RW_SESSION; } static void gck_session_dispose (GObject *obj) { GckSession *self = GCK_SESSION (obj); + GckSessionPrivate *priv = gck_session_get_instance_private (self); gboolean discard = FALSE; gboolean handled; g_return_if_fail (GCK_IS_SESSION (self)); - if (self->pv->handle != 0) { - g_mutex_lock (self->pv->mutex); - discard = !self->pv->discarded; - self->pv->discarded = TRUE; - g_mutex_unlock (self->pv->mutex); + if (priv->handle != 0) { + g_mutex_lock (&priv->mutex); + discard = !priv->discarded; + priv->discarded = TRUE; + g_mutex_unlock (&priv->mutex); } if (discard) { @@ -236,7 +238,7 @@ gck_session_dispose (GObject *obj) * handle. This allows any necessary session reuse to work. */ - g_signal_emit_by_name (self, "discard-handle", self->pv->handle, &handled); + g_signal_emit_by_name (self, "discard-handle", priv->handle, &handled); g_return_if_fail (handled); } @@ -247,14 +249,14 @@ static void gck_session_finalize (GObject *obj) { GckSession *self = GCK_SESSION (obj); + GckSessionPrivate *priv = gck_session_get_instance_private (self); - g_assert (self->pv->handle == 0 || self->pv->discarded); + g_assert (priv->handle == 0 || priv->discarded); - g_clear_object (&self->pv->interaction); - g_clear_object (&self->pv->slot); + g_clear_object (&priv->interaction); + g_clear_object (&priv->slot); - g_mutex_clear (self->pv->mutex); - g_free (self->pv->mutex); + g_mutex_clear (&priv->mutex); G_OBJECT_CLASS (gck_session_parent_class)->finalize (obj); } @@ -384,7 +386,6 @@ free_open_session (OpenSession *args) static CK_RV perform_open_session (OpenSession *args) { - GTlsInteraction *interaction; CK_RV rv = CKR_OK; /* First step, open session */ @@ -396,16 +397,8 @@ perform_open_session (OpenSession *args) if (rv != CKR_OK || !args->auto_login) return rv; - /* Compatibility, hook into GckModule signals if no interaction set */ - if (args->interaction) - interaction = g_object_ref (args->interaction); - else - interaction = _gck_interaction_new (args->slot); - rv = _gck_session_authenticate_token (args->base.pkcs11, args->session, - args->slot, interaction, NULL); - - g_object_unref (interaction); + args->slot, args->interaction, NULL); return rv; } @@ -416,31 +409,32 @@ gck_session_initable_init (GInitable *initable, GError **error) { GckSession *self = GCK_SESSION (initable); + GckSessionPrivate *priv = gck_session_get_instance_private (self); OpenSession args = { GCK_ARGUMENTS_INIT, 0, }; GckModule *module = NULL; gboolean ret = FALSE; gboolean want_login; - want_login = (self->pv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER; + want_login = (priv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER; /* Already have a session setup? */ - if (self->pv->handle && !want_login) + if (priv->handle && !want_login) return TRUE; g_object_ref (self); module = gck_session_get_module (self); /* Open a new session */ - args.slot = self->pv->slot; - args.app_data = self->pv->app_data; + args.slot = priv->slot; + args.app_data = priv->app_data; args.notify = NULL; - args.session = self->pv->handle; - args.flags = self->pv->opening_flags; - args.interaction = self->pv->interaction ? g_object_ref (self->pv->interaction) : NULL; + args.session = priv->handle; + args.flags = priv->opening_flags; + args.interaction = priv->interaction ? g_object_ref (priv->interaction) : NULL; args.auto_login = want_login; - if (_gck_call_sync (self->pv->slot, perform_open_session, NULL, &args, cancellable, error)) { - self->pv->handle = args.session; + if (_gck_call_sync (priv->slot, perform_open_session, NULL, &args, cancellable, error)) { + priv->handle = args.session; ret = TRUE; } @@ -465,34 +459,35 @@ gck_session_initable_init_async (GAsyncInitable *initable, gpointer user_data) { GckSession *self = GCK_SESSION (initable); + GckSessionPrivate *priv = gck_session_get_instance_private (self); OpenSession *args; gboolean want_login; GckCall *call; g_object_ref (self); - call = _gck_call_async_prep (self->pv->slot, perform_open_session, NULL, + call = _gck_call_async_prep (priv->slot, perform_open_session, NULL, sizeof (*args), free_open_session); args = _gck_call_get_arguments (call); - want_login = (self->pv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER; - args->session = self->pv->handle; + want_login = (priv->options & GCK_SESSION_LOGIN_USER) == GCK_SESSION_LOGIN_USER; + args->session = priv->handle; _gck_call_async_ready (call, self, cancellable, callback, user_data); /* Already have a session setup? */ - if (self->pv->handle && !want_login) { + if (priv->handle && !want_login) { _gck_call_async_short (call, CKR_OK); g_object_unref (self); return; } - args->app_data = self->pv->app_data; + args->app_data = priv->app_data; args->notify = NULL; - args->slot = g_object_ref (self->pv->slot); - args->interaction = self->pv->interaction ? g_object_ref (self->pv->interaction) : NULL; + args->slot = g_object_ref (priv->slot); + args->interaction = priv->interaction ? g_object_ref (priv->interaction) : NULL; args->auto_login = want_login; - args->flags = self->pv->opening_flags; + args->flags = priv->opening_flags; _gck_call_async_go (call); g_object_unref (self); @@ -504,6 +499,7 @@ gck_session_initable_init_finish (GAsyncInitable *initable, GError **error) { GckSession *self = GCK_SESSION (initable); + GckSessionPrivate *priv = gck_session_get_instance_private (self); gboolean ret = FALSE; g_object_ref (self); @@ -513,7 +509,7 @@ gck_session_initable_init_finish (GAsyncInitable *initable, if (_gck_call_basic_finish (result, error)) { args = _gck_call_async_result_arguments (result, OpenSession); - self->pv->handle = args->session; + priv->handle = args->session; ret = TRUE; } } @@ -618,8 +614,11 @@ gck_session_from_handle (GckSlot *slot, gulong gck_session_get_handle (GckSession *self) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); + g_return_val_if_fail (GCK_IS_SESSION (self), (CK_SESSION_HANDLE)-1); - return self->pv->handle; + + return priv->handle; } /** @@ -633,8 +632,11 @@ gck_session_get_handle (GckSession *self) GckModule * gck_session_get_module (GckSession *self) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); - return gck_slot_get_module (self->pv->slot); + + return gck_slot_get_module (priv->slot); } /** @@ -648,9 +650,12 @@ gck_session_get_module (GckSession *self) GckSlot * gck_session_get_slot (GckSession *self) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); - g_return_val_if_fail (GCK_IS_SLOT (self->pv->slot), NULL); - return g_object_ref (self->pv->slot); + g_return_val_if_fail (GCK_IS_SLOT (priv->slot), NULL); + + return g_object_ref (priv->slot); } /** @@ -665,6 +670,7 @@ gck_session_get_slot (GckSession *self) GckSessionInfo* gck_session_get_info (GckSession *self) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); GckSessionInfo *sessioninfo; CK_FUNCTION_LIST_PTR funcs; CK_SESSION_INFO info; @@ -680,7 +686,7 @@ gck_session_get_info (GckSession *self) g_return_val_if_fail (funcs, NULL); memset (&info, 0, sizeof (info)); - rv = (funcs->C_GetSessionInfo) (self->pv->handle, &info); + rv = (funcs->C_GetSessionInfo) (priv->handle, &info); g_object_unref (module); @@ -709,6 +715,7 @@ gck_session_get_info (GckSession *self) gulong gck_session_get_state (GckSession *self) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); CK_FUNCTION_LIST_PTR funcs; CK_SESSION_INFO info; GckModule *module; @@ -723,7 +730,7 @@ gck_session_get_state (GckSession *self) g_return_val_if_fail (funcs, 0); memset (&info, 0, sizeof (info)); - rv = (funcs->C_GetSessionInfo) (self->pv->handle, &info); + rv = (funcs->C_GetSessionInfo) (priv->handle, &info); g_object_unref (module); @@ -746,8 +753,11 @@ gck_session_get_state (GckSession *self) GckSessionOptions gck_session_get_options (GckSession *self) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); + g_return_val_if_fail (GCK_IS_SESSION (self), 0); - return self->pv->options; + + return priv->options; } /** @@ -762,10 +772,12 @@ gck_session_get_options (GckSession *self) GTlsInteraction * gck_session_get_interaction (GckSession *self) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); + g_return_val_if_fail (GCK_IS_SESSION (self), NULL); - if (self->pv->interaction) - return g_object_ref (self->pv->interaction); + if (priv->interaction) + return g_object_ref (priv->interaction); return NULL; } @@ -782,22 +794,14 @@ void gck_session_set_interaction (GckSession *self, GTlsInteraction *interaction) { - GTlsInteraction *previous; + GckSessionPrivate *priv = gck_session_get_instance_private (self); + g_return_if_fail (GCK_IS_SESSION (self)); g_return_if_fail (interaction == NULL || G_IS_TLS_INTERACTION (interaction)); - if (interaction) - g_object_ref (interaction); - - g_mutex_lock (self->pv->mutex); - - previous = self->pv->interaction; - self->pv->interaction = interaction; - - g_mutex_unlock (self->pv->mutex); - - if (previous) - g_object_unref (previous); + g_mutex_lock (&priv->mutex); + g_set_object (&priv->interaction, interaction); + g_mutex_unlock (&priv->mutex); } /** @@ -1224,6 +1228,7 @@ gck_session_login_interactive (GckSession *self, GCancellable *cancellable, GError **error) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); Interactive args = { GCK_ARGUMENTS_INIT, interaction, cancellable, NULL, }; g_return_val_if_fail (GCK_IS_SESSION (self), FALSE); @@ -1234,7 +1239,7 @@ gck_session_login_interactive (GckSession *self, /* TODO: For now this is all we support */ g_return_val_if_fail (user_type == CKU_USER, FALSE); - args.token = self->pv->slot; + args.token = priv->slot; return _gck_call_sync (self, perform_interactive, NULL, &args, cancellable, error); } @@ -1259,6 +1264,7 @@ gck_session_login_interactive_async (GckSession *self, GAsyncReadyCallback callback, gpointer user_data) { + GckSessionPrivate *priv = gck_session_get_instance_private (self); Interactive* args; GckCall *call; @@ -1274,7 +1280,7 @@ gck_session_login_interactive_async (GckSession *self, args->cancellable = cancellable ? g_object_ref (cancellable) : NULL; args->interaction = interaction ? g_object_ref (interaction) : NULL; - args->token = g_object_ref (self->pv->slot); + args->token = g_object_ref (priv->slot); _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -1410,8 +1416,6 @@ perform_create_object (CreateObject *args) * Create a new PKCS#11 object. This call may block for an * indefinite period. * - * If the @attrs #GckAttributes is floating, it is consumed. - * * Returns: (transfer full): the newly created object or %NULL if an error occurred **/ GckObject * @@ -1424,9 +1428,7 @@ gck_session_create_object (GckSession *self, GckAttributes *attrs, g_return_val_if_fail (GCK_IS_SESSION (self), NULL); g_return_val_if_fail (attrs != NULL, NULL); - gck_attributes_ref_sink (attrs); ret = _gck_call_sync (self, perform_create_object, NULL, &args, cancellable, error); - gck_attributes_unref (attrs); if (!ret) return NULL; @@ -1461,7 +1463,7 @@ gck_session_create_object_async (GckSession *self, GckAttributes *attrs, g_return_if_fail (attrs); - args->attrs = gck_attributes_ref_sink (attrs); + args->attrs = gck_attributes_ref (attrs); _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -1578,8 +1580,6 @@ perform_find_objects (FindObjects *args) * Find the objects matching the passed attributes. This call may * block for an indefinite period. * - * If @match is a floating reference, it is consumed. - * * Returns: (transfer full) (array length=n_handles) (nullable): a list of * the matching objects, which may be empty **/ @@ -1599,13 +1599,11 @@ gck_session_find_handles (GckSession *self, g_return_val_if_fail (n_handles != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - gck_attributes_ref_sink (match); if (_gck_call_sync (self, perform_find_objects, NULL, &args, cancellable, error)) { results = args.objects; *n_handles = args.n_objects; args.objects = NULL; } - gck_attributes_unref (match); g_free (args.objects); return results; @@ -1641,7 +1639,7 @@ gck_session_find_handles_async (GckSession *self, call = _gck_call_async_prep (self, perform_find_objects, NULL, sizeof (*args), free_find_objects); args = _gck_call_get_arguments (call); - args->attrs = gck_attributes_ref_sink (match); + args->attrs = gck_attributes_ref (match); _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -1786,8 +1784,6 @@ gck_session_find_objects_finish (GckSession *self, * * Setup an enumerator for listing matching objects available via this session. * - * If @match is a floating reference, it is consumed. - * * This call will not block but will return an enumerator immediately. * * Returns: (transfer full): a new enumerator @@ -1801,7 +1797,7 @@ gck_session_enumerate_objects (GckSession *session, g_return_val_if_fail (match != NULL, NULL); uri_data = gck_uri_data_new (); - uri_data->attributes = gck_attributes_ref_sink (match); + uri_data->attributes = gck_attributes_ref (match); return _gck_enumerator_new_for_session (session, uri_data); } @@ -1822,8 +1818,8 @@ typedef struct _GenerateKeyPair { static void free_generate_key_pair (GenerateKeyPair *args) { - gck_attributes_unref (args->public_attrs); - gck_attributes_unref (args->private_attrs); + g_clear_pointer (&args->public_attrs, gck_attributes_unref); + g_clear_pointer (&args->private_attrs, gck_attributes_unref); g_free (args); } @@ -1889,9 +1885,6 @@ gck_session_generate_key_pair (GckSession *self, gulong mech_type, * Generate a new key pair of public and private keys. This call may block for an * indefinite period. * - * If @public_attrs and/or @private_attrs is a floating reference, it is - * consumed. - * * Return value: %TRUE if the operation succeeded. **/ gboolean @@ -1915,14 +1908,8 @@ gck_session_generate_key_pair_full (GckSession *self, /* Shallow copy of the mechanism structure */ memcpy (&args.mechanism, mechanism, sizeof (args.mechanism)); - gck_attributes_ref_sink (public_attrs); - gck_attributes_ref_sink (private_attrs); - ret = _gck_call_sync (self, perform_generate_key_pair, NULL, &args, cancellable, error); - gck_attributes_unref (private_attrs); - gck_attributes_unref (public_attrs); - if (!ret) return FALSE; @@ -1970,8 +1957,8 @@ gck_session_generate_key_pair_async (GckSession *self, GckMechanism *mechanism, /* Shallow copy of the mechanism structure */ memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); - args->public_attrs = gck_attributes_ref_sink (public_attrs); - args->private_attrs = gck_attributes_ref_sink (private_attrs); + args->public_attrs = gck_attributes_ref (public_attrs); + args->private_attrs = gck_attributes_ref (private_attrs); _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -2029,7 +2016,7 @@ typedef struct _WrapKey { static void free_wrap_key (WrapKey *args) { - g_free (args->result); + g_clear_pointer (&args->result, g_free); g_free (args); } @@ -2220,7 +2207,7 @@ typedef struct _UnwrapKey { static void free_unwrap_key (UnwrapKey *args) { - gck_attributes_unref (args->attrs); + g_clear_pointer (&args->attrs, gck_attributes_unref); g_free (args); } @@ -2255,8 +2242,6 @@ perform_unwrap_key (UnwrapKey *args) * Unwrap a key from a byte stream. This call may block for an * indefinite period. * - * If @attrs is a floating reference, it is consumed. - * * Returns: (transfer full): the new unwrapped key or %NULL if the * operation failed **/ @@ -2288,8 +2273,6 @@ gck_session_unwrap_key (GckSession *self, * Unwrap a key from a byte stream. This call may block for an * indefinite period. * - * If @attrs is a floating reference, it is consumed. - * * Returns: (transfer full): the new unwrapped key or %NULL if the operation * failed **/ @@ -2317,12 +2300,8 @@ gck_session_unwrap_key_full (GckSession *self, g_object_get (wrapper, "handle", &args.wrapper, NULL); g_return_val_if_fail (args.wrapper != 0, NULL); - gck_attributes_ref_sink (attrs); - ret = _gck_call_sync (self, perform_unwrap_key, NULL, &args, cancellable, error); - gck_attributes_unref (attrs); - if (!ret) return NULL; @@ -2343,8 +2322,6 @@ gck_session_unwrap_key_full (GckSession *self, * * Unwrap a key from a byte stream. This call will * return immediately and complete asynchronously. - * - * If @attrs is a floating reference, it is consumed. **/ void gck_session_unwrap_key_async (GckSession *self, @@ -2374,7 +2351,7 @@ gck_session_unwrap_key_async (GckSession *self, /* Shallow copy of the mechanism structure */ memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); - args->attrs = gck_attributes_ref_sink (attrs); + args->attrs = gck_attributes_ref (attrs); args->input = input; args->n_input = n_input; @@ -2421,7 +2398,7 @@ typedef struct _DeriveKey { static void free_derive_key (DeriveKey *args) { - gck_attributes_unref (args->attrs); + g_clear_pointer (&args->attrs, gck_attributes_unref); g_free (args); } @@ -2478,8 +2455,6 @@ gck_session_derive_key (GckSession *self, GckObject *base, gulong mech_type, * Derive a key from another key. This call may block for an * indefinite period. * - * If the @attrs #GckAttributes is floating, it is consumed. - * * Returns: (transfer full): the new derived key or %NULL if the operation * failed **/ @@ -2501,12 +2476,8 @@ gck_session_derive_key_full (GckSession *self, GckObject *base, GckMechanism *me g_object_get (base, "handle", &args.key, NULL); g_return_val_if_fail (args.key != 0, NULL); - gck_attributes_ref_sink (attrs); - ret = _gck_call_sync (self, perform_derive_key, NULL, &args, cancellable, error); - gck_attributes_unref (attrs); - if (!ret) return NULL; @@ -2525,8 +2496,6 @@ gck_session_derive_key_full (GckSession *self, GckObject *base, GckMechanism *me * * Derive a key from another key. This call will * return immediately and complete asynchronously. - * - * If the @attrs #GckAttributes is floating, it is consumed. **/ void gck_session_derive_key_async (GckSession *self, GckObject *base, GckMechanism *mechanism, @@ -2550,7 +2519,7 @@ gck_session_derive_key_async (GckSession *self, GckObject *base, GckMechanism *m /* Shallow copy of the mechanism structure */ memcpy (&args->mechanism, mechanism, sizeof (args->mechanism)); - args->attrs = gck_attributes_ref_sink (attrs); + args->attrs = gck_attributes_ref (attrs); _gck_call_async_ready_go (call, self, cancellable, callback, user_data); } @@ -2611,7 +2580,6 @@ typedef struct _Crypt { static CK_RV perform_crypt (Crypt *args) { - GTlsInteraction *interaction; CK_RV rv; g_assert (args); @@ -2625,16 +2593,8 @@ perform_crypt (Crypt *args) if (rv != CKR_OK) return rv; - /* Compatibility, hook into GckModule signals if no interaction set */ - if (args->interaction) - interaction = g_object_ref (args->interaction); - else - interaction = _gck_interaction_new (args->key_object); - rv = _gck_session_authenticate_key (args->base.pkcs11, args->base.handle, - args->key_object, interaction, NULL); - - g_object_unref (interaction); + args->key_object, args->interaction, NULL); if (rv != CKR_OK) return rv; @@ -2655,8 +2615,8 @@ free_crypt (Crypt *args) g_clear_object (&args->interaction); g_clear_object (&args->key_object); - g_free (args->input); - g_free (args->result); + g_clear_pointer (&args->input, g_free); + g_clear_pointer (&args->result, g_free); g_free (args); } @@ -3135,7 +3095,6 @@ typedef struct _Verify { static CK_RV perform_verify (Verify *args) { - GTlsInteraction *interaction; CK_RV rv; /* Initialize the crypt operation */ @@ -3143,17 +3102,8 @@ perform_verify (Verify *args) if (rv != CKR_OK) return rv; - /* Compatibility, hook into GckModule signals if no interaction set */ - if (args->interaction) - interaction = g_object_ref (args->interaction); - else - interaction = _gck_interaction_new (args->key_object); - - rv = _gck_session_authenticate_key (args->base.pkcs11, args->base.handle, - args->key_object, interaction, NULL); - - g_object_unref (interaction); + args->key_object, args->interaction, NULL); if (rv != CKR_OK) return rv; @@ -3169,8 +3119,8 @@ free_verify (Verify *args) g_clear_object (&args->interaction); g_clear_object (&args->key_object); - g_free (args->input); - g_free (args->signature); + g_clear_pointer (&args->input, g_free); + g_clear_pointer (&args->signature, g_free); g_free (args); } diff --git a/gck/gck-slot.c b/gck/gck-slot.c index 8ec121e..b297629 100644 --- a/gck/gck-slot.c +++ b/gck/gck-slot.c @@ -46,12 +46,14 @@ enum { PROP_HANDLE }; -struct _GckSlotPrivate { +struct _GckSlot { + GObject parent_instance; + GckModule *module; CK_SLOT_ID handle; }; -G_DEFINE_TYPE_WITH_PRIVATE (GckSlot, gck_slot, G_TYPE_OBJECT); +G_DEFINE_TYPE (GckSlot, gck_slot, G_TYPE_OBJECT); /* ---------------------------------------------------------------------------- * OBJECT @@ -60,7 +62,6 @@ G_DEFINE_TYPE_WITH_PRIVATE (GckSlot, gck_slot, G_TYPE_OBJECT); static void gck_slot_init (GckSlot *self) { - self->pv = gck_slot_get_instance_private (self); } static void @@ -92,14 +93,13 @@ gck_slot_set_property (GObject *obj, guint prop_id, const GValue *value, switch (prop_id) { case PROP_MODULE: - g_assert (!self->pv->module); - self->pv->module = g_value_get_object (value); - g_assert (self->pv->module); - g_object_ref (self->pv->module); + g_assert (!self->module); + self->module = g_value_dup_object (value); + g_assert (self->module); break; case PROP_HANDLE: - g_assert (!self->pv->handle); - self->pv->handle = g_value_get_ulong (value); + g_assert (!self->handle); + self->handle = g_value_get_ulong (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); @@ -112,7 +112,7 @@ gck_slot_finalize (GObject *obj) { GckSlot *self = GCK_SLOT (obj); - g_clear_object (&self->pv->module); + g_clear_object (&self->module); G_OBJECT_CLASS (gck_slot_parent_class)->finalize (obj); } @@ -207,9 +207,9 @@ gck_slot_info_free (GckSlotInfo *slot_info) { if (!slot_info) return; - g_free (slot_info->slot_description); - g_free (slot_info->manufacturer_id); - g_free (slot_info); + g_clear_pointer (&slot_info->slot_description, g_free); + g_clear_pointer (&slot_info->manufacturer_id, g_free); + g_clear_pointer (&slot_info, g_free); } /** @@ -422,20 +422,15 @@ gck_mechanisms_check (GArray *mechanisms, ...) * %FALSE if either is not a GckSlot. **/ gboolean -gck_slot_equal (gconstpointer slot1, gconstpointer slot2) +gck_slot_equal (GckSlot *slot1, GckSlot *slot2) { - GckSlot *s1, *s2; - if (slot1 == slot2) return TRUE; if (!GCK_IS_SLOT (slot1) || !GCK_IS_SLOT (slot2)) return FALSE; - s1 = GCK_SLOT (slot1); - s2 = GCK_SLOT (slot2); - - return s1->pv->handle == s2->pv->handle && - gck_module_equal (s1->pv->module, s2->pv->module); + return slot1->handle == slot2->handle && + gck_module_equal (slot1->module, slot2->module); } /** @@ -450,16 +445,12 @@ gck_slot_equal (gconstpointer slot1, gconstpointer slot2) * Return value: An integer that can be used as a hash value, or 0 if invalid. **/ guint -gck_slot_hash (gconstpointer slot) +gck_slot_hash (GckSlot *slot) { - GckSlot *self; - g_return_val_if_fail (GCK_IS_SLOT (slot), 0); - self = GCK_SLOT (slot); - - return _gck_ulong_hash (&self->pv->handle) ^ - gck_module_hash (self->pv->module); + return _gck_ulong_hash (&slot->handle) ^ + gck_module_hash (slot->module); } /** @@ -493,7 +484,7 @@ gulong gck_slot_get_handle (GckSlot *self) { g_return_val_if_fail (GCK_IS_SLOT (self), (CK_SLOT_ID)-1); - return self->pv->handle; + return self->handle; } /** @@ -509,8 +500,8 @@ GckModule * gck_slot_get_module (GckSlot *self) { g_return_val_if_fail (GCK_IS_SLOT (self), NULL); - g_return_val_if_fail (GCK_IS_MODULE (self->pv->module), NULL); - return g_object_ref (self->pv->module); + g_return_val_if_fail (GCK_IS_MODULE (self->module), NULL); + return g_object_ref (self->module); } /** @@ -925,8 +916,6 @@ gck_slot_enumerate_objects (GckSlot *self, * * Setup an enumerator for listing matching objects on the slots. * - * If the @match #GckAttributes is floating, it is consumed. - * * This call will not block but will return an enumerator immediately. * * Returns: (transfer full): a new enumerator @@ -941,7 +930,7 @@ gck_slots_enumerate_objects (GList *slots, g_return_val_if_fail (match != NULL, NULL); uri_data = gck_uri_data_new (); - uri_data->attributes = gck_attributes_ref_sink (match); + uri_data->attributes = gck_attributes_ref (match); return _gck_enumerator_new_for_slots (slots, options, uri_data); } @@ -951,6 +940,7 @@ gck_slots_enumerate_objects (GList *slots, * gck_slot_open_session: * @self: The slot ot open a session on. * @options: The #GckSessionOptions to open a session with. + * @interaction: (nullable): The #GTlsInteraction to use, or %NULL. * @cancellable: An optional cancellation object, or %NULL. * @error: A location to return an error, or %NULL. * @@ -964,16 +954,18 @@ gck_slots_enumerate_objects (GList *slots, GckSession * gck_slot_open_session (GckSlot *self, GckSessionOptions options, + GTlsInteraction *interaction, GCancellable *cancellable, GError **error) { - return gck_slot_open_session_full (self, options, 0, NULL, NULL, cancellable, error); + return gck_slot_open_session_full (self, options, interaction, 0, NULL, NULL, cancellable, error); } /** * gck_slot_open_session_full: (skip) * @self: The slot to open a session on. * @options: The options to open the new session with. + * @interaction: (nullable): The #GTlsInteraction to use, or %NULL. * @pkcs11_flags: Additional raw PKCS#11 flags. * @app_data: Application data for notification callback. * @notify: PKCS#11 notification callback. @@ -990,6 +982,7 @@ gck_slot_open_session (GckSlot *self, GckSession * gck_slot_open_session_full (GckSlot *self, GckSessionOptions options, + GTlsInteraction *interaction, gulong pkcs11_flags, gpointer app_data, CK_NOTIFY notify, @@ -998,6 +991,7 @@ gck_slot_open_session_full (GckSlot *self, { return g_initable_new (GCK_TYPE_SESSION, cancellable, error, "options", options, + "interaction", interaction, "slot", self, "opening-flags", pkcs11_flags, "app-data", app_data, @@ -1008,6 +1002,7 @@ gck_slot_open_session_full (GckSlot *self, * gck_slot_open_session_async: * @self: The slot to open a session on. * @options: The options to open the new session with. + * @interaction: (nullable): The #GTlsInteraction to use, or %NULL. * @cancellable: Optional cancellation object, or %NULL. * @callback: Called when the operation completes. * @user_data: Data to pass to the callback. @@ -1020,11 +1015,12 @@ gck_slot_open_session_full (GckSlot *self, void gck_slot_open_session_async (GckSlot *self, GckSessionOptions options, + GTlsInteraction *interaction, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { - gck_slot_open_session_full_async (self, options, 0UL, NULL, NULL, cancellable, callback, user_data); + gck_slot_open_session_full_async (self, options, interaction, 0UL, NULL, NULL, cancellable, callback, user_data); } static void @@ -1049,6 +1045,7 @@ on_open_session_complete (GObject *source, * gck_slot_open_session_full_async: (skip) * @self: The slot to open a session on. * @options: Options to open the new session with. + * @interaction: (nullable): The #GTlsInteraction to use, or %NULL. * @pkcs11_flags: Additional raw PKCS#11 flags. * @app_data: Application data for notification callback. * @notify: PKCS#11 notification callback. @@ -1064,6 +1061,7 @@ on_open_session_complete (GObject *source, void gck_slot_open_session_full_async (GckSlot *self, GckSessionOptions options, + GTlsInteraction *interaction, gulong pkcs11_flags, gpointer app_data, CK_NOTIFY notify, @@ -1083,6 +1081,7 @@ gck_slot_open_session_full_async (GckSlot *self, cancellable, on_open_session_complete, g_steal_pointer (&task), "options", options, + "interaction", interaction, "slot", self, "opening-flags", pkcs11_flags, "app-data", app_data, diff --git a/gck/gck-uri.c b/gck/gck-uri.c index ba92715..e034ed5 100644 --- a/gck/gck-uri.c +++ b/gck/gck-uri.c @@ -96,22 +96,6 @@ * Error domain for URI errors. */ -/** - * GCK_URI_BAD_PREFIX: - * - * Use %GCK_URI_BAD_SCHEME instead. - * - * Deprecated: Since 3.2 - */ - -/** - * CKR_GCK_MODULE_PROBLEM: - * - * Use %GCK_ERROR_MODULE_PROBLEM instead. - * - * Deprecated: Since 3.4 - */ - #define URI_PREFIX "pkcs11:" #define N_URI_PREFIX 7 @@ -122,26 +106,7 @@ struct _GckUri { GckAttributes *attributes; }; -GQuark -gck_uri_get_error_quark (void) -{ - /* This is deprecated version */ - return gck_uri_error_get_quark (); -} - -GQuark -gck_uri_error_get_quark (void) -{ - static GQuark domain = 0; - static size_t quark_inited = 0; - - if (g_once_init_enter (&quark_inited)) { - domain = g_quark_from_static_string ("gck-uri-error"); - g_once_init_leave (&quark_inited, 1); - } - - return domain; -} +G_DEFINE_QUARK(GckUriError, gck_uri_error) /** * gck_uri_data_new: @@ -155,11 +120,11 @@ gck_uri_error_get_quark (void) GckUriData * gck_uri_data_new (void) { - return g_slice_new0 (GckUriData); + return g_new0 (GckUriData, 1); } /** - * gck_uri_parse: + * gck_uri_data_parse: * @string: the URI to parse. * @flags: the context in which the URI will be used. * @error: a #GError, or %NULL. @@ -174,7 +139,7 @@ gck_uri_data_new (void) * freed with gck_uri_data_free() */ GckUriData* -gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error) +gck_uri_data_parse (const gchar *string, GckUriFlags flags, GError **error) { GckUriData *uri_data = NULL; GckBuilder builder; @@ -231,7 +196,7 @@ gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error) gck_builder_init (&builder); for (i = 0; i < n_attrs; ++i) gck_builder_add_data (&builder, attrs[i].type, attrs[i].pValue, attrs[i].ulValueLen); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); } uri_data->any_unrecognized = p11_kit_uri_any_unrecognized (p11_uri); @@ -240,7 +205,7 @@ gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error) } /** - * gck_uri_build: + * gck_uri_data_build: * @uri_data: the info to build the URI from. * @flags: The context that the URI is for * @@ -250,7 +215,7 @@ gck_uri_parse (const gchar *string, GckUriFlags flags, GError **error) * Return value: a newly allocated string containing a PKCS#11 URI. */ gchar* -gck_uri_build (GckUriData *uri_data, GckUriFlags flags) +gck_uri_data_build (GckUriData *uri_data, GckUriFlags flags) { const GckAttribute *attr; P11KitUri *p11_uri = 0; @@ -321,13 +286,11 @@ gck_uri_data_copy (GckUriData *uri_data) void gck_uri_data_free (GckUriData *uri_data) { - if (uri_data) { - if (uri_data->attributes) - gck_attributes_unref (uri_data->attributes); - if (uri_data->module_info) - gck_module_info_free (uri_data->module_info); - if (uri_data->token_info) - gck_token_info_free (uri_data->token_info); - g_slice_free (GckUriData, uri_data); - } + if (!uri_data) + return; + + g_clear_pointer (&uri_data->attributes, gck_attributes_unref); + g_clear_pointer (&uri_data->module_info, gck_module_info_free); + g_clear_pointer (&uri_data->token_info, gck_token_info_free); + g_free (uri_data); } @@ -54,9 +54,9 @@ typedef enum { GCK_ERROR_MODULE_PROBLEM = (CKR_VENDOR_DEFINED | (GCK_VENDOR_CODE + 1)), } GckError; -#define GCK_ERROR (gck_error_get_quark ()) +#define GCK_ERROR (gck_error_quark ()) -GQuark gck_error_get_quark (void) G_GNUC_CONST; +GQuark gck_error_quark (void) G_GNUC_CONST; #define GCK_TYPE_LIST (gck_list_get_boxed_type ()) @@ -213,7 +213,7 @@ GckBuilder * gck_builder_new (GckBuilderFlags fla GckBuilder * gck_builder_ref (GckBuilder *builder); -void gck_builder_unref (gpointer builder); +void gck_builder_unref (GckBuilder *builder); void gck_builder_init (GckBuilder *builder); @@ -331,8 +331,6 @@ gboolean gck_builder_find_date (GckBuilder *builder gulong attr_type, GDate *value); -GckAttributes * gck_builder_steal (GckBuilder *builder); - GckAttributes * gck_builder_end (GckBuilder *builder); GckBuilder * gck_builder_copy (GckBuilder *builder); @@ -345,7 +343,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckBuilder, gck_builder_unref); GType gck_attributes_get_type (void) G_GNUC_CONST; -GckAttributes * gck_attributes_new (gulong reserved); +GckAttributes * gck_attributes_new (void); GckAttributes * gck_attributes_new_empty (gulong first_type, ...); @@ -376,8 +374,6 @@ gulong gck_attributes_count (GckAttributes *attr GckAttributes * gck_attributes_ref (GckAttributes *attrs); -GckAttributes * gck_attributes_ref_sink (GckAttributes *attrs); - void gck_attributes_unref (gpointer attrs); gboolean gck_attributes_contains (GckAttributes *attrs, @@ -429,22 +425,7 @@ void gck_module_info_free (GckModuleInfo *modul G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckModuleInfo, gck_module_info_free); #define GCK_TYPE_MODULE (gck_module_get_type()) -#define GCK_MODULE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_MODULE, GckModule)) -#define GCK_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_MODULE, GckModule)) -#define GCK_IS_MODULE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_MODULE)) -#define GCK_IS_MODULE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_MODULE)) -#define GCK_MODULE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_MODULE, GckModuleClass)) - -typedef struct _GckModuleClass GckModuleClass; -typedef struct _GckModulePrivate GckModulePrivate; - -struct _GckModule { - GObject parent; - - /*< private >*/ - GckModulePrivate *pv; - gpointer reserved[4]; -}; +G_DECLARE_DERIVABLE_TYPE (GckModule, gck_module, GCK, MODULE, GObject) struct _GckModuleClass { GObjectClass parent; @@ -457,8 +438,6 @@ struct _GckModuleClass { gpointer reserved[8]; }; -GType gck_module_get_type (void) G_GNUC_CONST; - GckModule* gck_module_new (CK_FUNCTION_LIST_PTR funcs); GckModule* gck_module_initialize (const gchar *path, @@ -473,10 +452,10 @@ void gck_module_initialize_async (const gchar *path GckModule * gck_module_initialize_finish (GAsyncResult *result, GError **error); -gboolean gck_module_equal (gconstpointer module1, - gconstpointer module2); +gboolean gck_module_equal (GckModule *module1, + GckModule *module2); -guint gck_module_hash (gconstpointer module); +guint gck_module_hash (GckModule *module); gboolean gck_module_match (GckModule *self, GckUriData *uri); @@ -530,39 +509,13 @@ GckEnumerator* gck_modules_enumerate_uri (GList *modules, GckSessionOptions session_options, GError **error); -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckModule, g_object_unref); - /* ------------------------------------------------------------------------ * ENUMERATOR */ #define GCK_TYPE_ENUMERATOR (gck_enumerator_get_type()) -#define GCK_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_ENUMERATOR, GckEnumerator)) -#define GCK_ENUMERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_ENUMERATOR, GckEnumerator)) -#define GCK_IS_ENUMERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_ENUMERATOR)) -#define GCK_IS_ENUMERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_ENUMERATOR)) -#define GCK_ENUMERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_ENUMERATOR, GckEnumeratorClass)) - -typedef struct _GckEnumeratorClass GckEnumeratorClass; -typedef struct _GckEnumeratorPrivate GckEnumeratorPrivate; - -struct _GckEnumerator { - GObject parent; - - /*< private >*/ - GckEnumeratorPrivate *pv; - gpointer reserved[2]; -}; - -struct _GckEnumeratorClass { - GObjectClass parent; - - /*< private >*/ - gpointer reserved[2]; -}; - -GType gck_enumerator_get_type (void) G_GNUC_CONST; +G_DECLARE_FINAL_TYPE (GckEnumerator, gck_enumerator, GCK, ENUMERATOR, GObject) GTlsInteraction * gck_enumerator_get_interaction (GckEnumerator *self); @@ -603,8 +556,6 @@ GList* gck_enumerator_next_finish (GckEnumerator *se GAsyncResult *result, GError **error); -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckEnumerator, g_object_unref); - /* ------------------------------------------------------------------------ * SLOT */ @@ -692,36 +643,12 @@ gboolean gck_mechanisms_check (GArray *mechanisms, G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckMechanismInfo, gck_mechanism_info_free); #define GCK_TYPE_SLOT (gck_slot_get_type()) -#define GCK_SLOT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_SLOT, GckSlot)) -#define GCK_SLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_SLOT, GckSlot)) -#define GCK_IS_SLOT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_SLOT)) -#define GCK_IS_SLOT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_SLOT)) -#define GCK_SLOT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_SLOT, GckSlotClass)) - -typedef struct _GckSlotClass GckSlotClass; -typedef struct _GckSlotPrivate GckSlotPrivate; - -struct _GckSlot { - GObject parent; - - /*< private >*/ - GckSlotPrivate *pv; - gpointer reserved[4]; -}; - -struct _GckSlotClass { - GObjectClass parent; - - /*< private >*/ - gpointer reserved[9]; -}; +G_DECLARE_FINAL_TYPE (GckSlot, gck_slot, GCK, SLOT, GObject) -GType gck_slot_get_type (void) G_GNUC_CONST; +gboolean gck_slot_equal (GckSlot *slot1, + GckSlot *slot2); -gboolean gck_slot_equal (gconstpointer slot1, - gconstpointer slot2); - -guint gck_slot_hash (gconstpointer slot); +guint gck_slot_hash (GckSlot *slot); gboolean gck_slot_match (GckSlot *self, GckUriData *uri); @@ -747,11 +674,13 @@ gboolean gck_slot_has_flags (GckSlot *self, GckSession* gck_slot_open_session (GckSlot *self, GckSessionOptions options, + GTlsInteraction *interaction, GCancellable *cancellable, GError **error); GckSession* gck_slot_open_session_full (GckSlot *self, GckSessionOptions options, + GTlsInteraction *interaction, gulong pkcs11_flags, gpointer app_data, CK_NOTIFY notify, @@ -760,12 +689,14 @@ GckSession* gck_slot_open_session_full (GckSlot *self, void gck_slot_open_session_async (GckSlot *self, GckSessionOptions options, + GTlsInteraction *interaction, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); void gck_slot_open_session_full_async (GckSlot *self, GckSessionOptions options, + GTlsInteraction *interaction, gulong pkcs11_flags, gpointer app_data, CK_NOTIFY notify, @@ -785,8 +716,6 @@ GckEnumerator* gck_slots_enumerate_objects (GList *slots, GckAttributes *match, GckSessionOptions options); -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckSlot, g_object_unref); - /* ------------------------------------------------------------------------ * SESSION */ @@ -811,22 +740,7 @@ void gck_session_info_free (GckSessionInfo *sess G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckSessionInfo, gck_session_info_free); #define GCK_TYPE_SESSION (gck_session_get_type()) -#define GCK_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_SESSION, GckSession)) -#define GCK_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_SESSION, GckSession)) -#define GCK_IS_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_SESSION)) -#define GCK_IS_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_SESSION)) -#define GCK_SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_SESSION, GckSessionClass)) - -typedef struct _GckSessionClass GckSessionClass; -typedef struct _GckSessionPrivate GckSessionPrivate; - -struct _GckSession { - GObject parent; - - /*< private >*/ - GckSessionPrivate *pv; - gpointer reserved[4]; -}; +G_DECLARE_DERIVABLE_TYPE (GckSession, gck_session, GCK, SESSION, GObject) struct _GckSessionClass { GObjectClass parent; @@ -837,8 +751,6 @@ struct _GckSessionClass { gpointer reserved[8]; }; -GType gck_session_get_type (void) G_GNUC_CONST; - GckSession * gck_session_from_handle (GckSlot *slot, gulong session_handle, GckSessionOptions options); @@ -1263,29 +1175,12 @@ GckObject* gck_session_derive_key_finish (GckSession *self, GAsyncResult *result, GError **error); -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckSession, g_object_unref); - /* ------------------------------------------------------------------------ * OBJECT */ #define GCK_TYPE_OBJECT (gck_object_get_type()) -#define GCK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GCK_TYPE_OBJECT, GckObject)) -#define GCK_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GCK_TYPE_OBJECT, GckObjectClass)) -#define GCK_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCK_TYPE_OBJECT)) -#define GCK_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GCK_TYPE_OBJECT)) -#define GCK_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GCK_TYPE_OBJECT, GckObjectClass)) - -typedef struct _GckObjectClass GckObjectClass; -typedef struct _GckObjectPrivate GckObjectPrivate; - -struct _GckObject { - GObject parent; - - /*< private >*/ - GckObjectPrivate *pv; - gpointer reserved[4]; -}; +G_DECLARE_DERIVABLE_TYPE (GckObject, gck_object, GCK, OBJECT, GObject) struct _GckObjectClass { GObjectClass parent; @@ -1294,8 +1189,6 @@ struct _GckObjectClass { gpointer reserved[8]; }; -GType gck_object_get_type (void) G_GNUC_CONST; - GckObject * gck_object_from_handle (GckSession *session, gulong object_handle); @@ -1303,10 +1196,10 @@ GList* gck_objects_from_handle_array (GckSession *session gulong *object_handles, gulong n_object_handles); -gboolean gck_object_equal (gconstpointer object1, - gconstpointer object2); +gboolean gck_object_equal (GckObject *object1, + GckObject *object2); -guint gck_object_hash (gconstpointer object); +guint gck_object_hash (GckObject *object); GckModule* gck_object_get_module (GckObject *self); @@ -1421,20 +1314,14 @@ GckAttributes* gck_object_get_template_finish (GckObject *self, GAsyncResult *result, GError **error); -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckObject, g_object_unref); - /* ------------------------------------------------------------------------ * OBJECT ATTRIBUTES */ -#define GCK_TYPE_OBJECT_CACHE (gck_object_cache_get_type ()) -#define GCK_OBJECT_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_OBJECT_CACHE, GckObjectCache)) -#define GCK_IS_OBJECT_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_OBJECT_CACHE)) -#define GCK_OBJECT_CACHE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCK_TYPE_OBJECT_CACHE, GckObjectCacheIface)) - -typedef struct _GckObjectCacheIface GckObjectCacheIface; +#define GCK_TYPE_OBJECT_CACHE gck_object_cache_get_type () +G_DECLARE_INTERFACE (GckObjectCache, gck_object_cache, GCK, OBJECT_CACHE, GckObject) -struct _GckObjectCacheIface { +struct _GckObjectCacheInterface { GTypeInterface interface; const gulong * default_types; @@ -1447,8 +1334,6 @@ struct _GckObjectCacheIface { gpointer reserved[6]; }; -GType gck_object_cache_get_type (void) G_GNUC_CONST; - GckAttributes * gck_object_cache_get_attributes (GckObjectCache *object); void gck_object_cache_set_attributes (GckObjectCache *object, @@ -1491,39 +1376,12 @@ GckAttributes * gck_object_cache_lookup_finish (GckObject *object, GAsyncResult *result, GError **error); -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckObjectCache, g_object_unref); - /* ------------------------------------------------------------------------ * PASSWORD */ #define GCK_TYPE_PASSWORD (gck_password_get_type ()) -#define GCK_PASSWORD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCK_TYPE_PASSWORD, GckPassword)) -#define GCK_PASSWORD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCK_TYPE_PASSWORD, GckPassword)) -#define GCK_IS_PASSWORD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCK_TYPE_PASSWORD)) -#define GCK_IS_PASSWORD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCK_TYPE_PASSWORD)) -#define GCK_PASSWORD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCK_TYPE_PASSWORD, GckPasswordClass)) - -typedef struct _GckPassword GckPassword; -typedef struct _GckPasswordClass GckPasswordClass; -typedef struct _GckPasswordPrivate GckPasswordPrivate; - -struct _GckPassword { - GTlsPassword parent; - - /*< private >*/ - GckPasswordPrivate *pv; - gpointer reserved[4]; -}; - -struct _GckPasswordClass { - GTlsPasswordClass parent; - - /*< private >*/ - gpointer reserved[4]; -}; - -GType gck_password_get_type (void) G_GNUC_CONST; +G_DECLARE_FINAL_TYPE (GckPassword, gck_password, GCK, PASSWORD, GTlsPassword) GckModule * gck_password_get_module (GckPassword *self); @@ -1531,8 +1389,6 @@ GckSlot * gck_password_get_token (GckPassword *self); GckObject * gck_password_get_key (GckPassword *self); -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckPassword, g_object_unref); - /* ---------------------------------------------------------------------------- * URI */ @@ -1570,16 +1426,16 @@ struct _GckUriData { gpointer dummy[4]; }; -#define GCK_URI_ERROR (gck_uri_error_get_quark ()) +#define GCK_URI_ERROR (gck_uri_error_quark ()) -GQuark gck_uri_error_get_quark (void) G_GNUC_CONST; +GQuark gck_uri_error_quark (void) G_GNUC_CONST; GckUriData* gck_uri_data_new (void); -gchar* gck_uri_build (GckUriData *uri_data, +gchar* gck_uri_data_build (GckUriData *uri_data, GckUriFlags flags); -GckUriData* gck_uri_parse (const gchar *string, +GckUriData* gck_uri_data_parse (const gchar *string, GckUriFlags flags, GError **error); @@ -1595,8 +1451,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (GckUriData, gck_uri_data_free); G_END_DECLS -#include "gck-deprecated.h" - #undef __GCK_INSIDE_HEADER__ #endif /* GCK_H */ diff --git a/gck/gck.symbols b/gck/gck.symbols index ae784c9..0bd62e5 100644 --- a/gck/gck.symbols +++ b/gck/gck.symbols @@ -55,7 +55,6 @@ gck_attributes_new gck_attributes_new_empty gck_attributes_new_full gck_attributes_ref -gck_attributes_ref_sink gck_attributes_set gck_attributes_set_all gck_attributes_set_boolean @@ -99,7 +98,6 @@ gck_builder_set_empty gck_builder_set_invalid gck_builder_set_string gck_builder_set_ulong -gck_builder_steal gck_builder_take_data gck_builder_unref gck_enumerator_get_chained diff --git a/gck/meson.build b/gck/meson.build index e461509..fa108ef 100644 --- a/gck/meson.build +++ b/gck/meson.build @@ -18,7 +18,6 @@ gck_sources_public = files( gck_sources_private = files( 'gck-call.c', - 'gck-interaction.c', ) gck_headers = files( @@ -57,7 +56,6 @@ gck_sources = [ gck_exported_headers = [ gck_headers, gck_version_h, - 'gck-deprecated.h', 'pkcs11.h', 'pkcs11n.h', 'pkcs11x.h', @@ -94,7 +92,8 @@ gck_lib = shared_library(gck_basename, link_args: gck_linkflags, link_depends: gck_symbolmap, include_directories: config_h_dir, - version: gck_soversion, + version: gck_version, + soversion: gck_soversion, install: true, ) diff --git a/gck/test-gck-crypto.c b/gck/test-gck-crypto.c index b7e2118..2bc535c 100644 --- a/gck/test-gck-crypto.c +++ b/gck/test-gck-crypto.c @@ -27,6 +27,7 @@ #include "gck/gck-test.h" #include "egg/egg-testing.h" +#include "egg/mock-interaction.h" #include <glib.h> @@ -54,6 +55,7 @@ setup (Test *test, gconstpointer unused) GError *err = NULL; GList *slots; GckSlot *slot; + GTlsInteraction *interaction; /* Successful load */ test->module = gck_module_initialize (_GCK_TEST_MODULE_PATH, NULL, &err); @@ -64,7 +66,7 @@ setup (Test *test, gconstpointer unused) slots = gck_module_get_slots (test->module, TRUE); g_assert_nonnull (slots); - test->session = gck_slot_open_session (slots->data, 0, NULL, &err); + test->session = gck_slot_open_session (slots->data, 0, NULL, NULL, &err); g_assert_no_error (err); g_assert_true (GCK_IS_SESSION (test->session)); g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session); @@ -74,6 +76,10 @@ setup (Test *test, gconstpointer unused) test->session_with_auth = gck_session_from_handle (slot, gck_session_get_handle (test->session), GCK_SESSION_AUTHENTICATE); g_signal_connect (test->session_with_auth, "discard-handle", G_CALLBACK (on_discard_handle_ignore), NULL); + interaction = mock_interaction_new ("booo"); + gck_session_set_interaction (test->session_with_auth, interaction); + g_object_unref (interaction); + g_assert_nonnull (test->session_with_auth); g_object_add_weak_pointer (G_OBJECT (test->session_with_auth), (gpointer *)&test->session_with_auth); @@ -109,12 +115,15 @@ find_key (GckSession *session, CK_ATTRIBUTE_TYPE method, CK_MECHANISM_TYPE mech) GckBuilder builder = GCK_BUILDER_INIT; GList *objects, *l; GckObject *object = NULL; + GckAttributes *attributes; CK_MECHANISM_TYPE_PTR mechs; gboolean match; gsize n_mechs; gck_builder_add_boolean (&builder, method, TRUE); - objects = gck_session_find_objects (session, gck_builder_end (&builder), NULL, NULL); + attributes = gck_builder_end (&builder); + objects = gck_session_find_objects (session, attributes, NULL, NULL); + gck_attributes_unref (attributes); g_assert_nonnull (objects); for (l = objects; l; l = g_list_next (l)) { @@ -144,11 +153,14 @@ static GckObject* find_key_with_value (GckSession *session, const gchar *value) { GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attributes; GList *objects; GckObject *object; gck_builder_add_string (&builder, CKA_VALUE, value); - objects = gck_session_find_objects (session, gck_builder_end (&builder), NULL, NULL); + attributes = gck_builder_end (&builder); + objects = gck_session_find_objects (session, attributes, NULL, NULL); + gck_attributes_unref (attributes); g_assert_nonnull (objects); object = g_object_ref (objects->data); @@ -178,18 +190,6 @@ check_key_with_value (GckSession *session, GckObject *key, CK_OBJECT_CLASS klass gck_attributes_unref (attrs); } -static gboolean -authenticate_object (GckSlot *module, GckObject *object, gchar *label, gchar **password) -{ - g_assert_true (GCK_IS_MODULE (module)); - g_assert_true (GCK_IS_OBJECT (object)); - g_assert_nonnull (password); - g_assert_null (*password); - - *password = g_strdup ("booo"); - return TRUE; -} - static void test_encrypt (Test *test, gconstpointer unused) { @@ -306,9 +306,6 @@ test_sign (Test *test, gconstpointer unused) guchar *output; gsize n_output; - /* Enable auto-login on this test->session, see previous test */ - g_signal_connect (test->module, "authenticate-object", G_CALLBACK (authenticate_object), NULL); - /* Find the right key */ key = find_key (test->session_with_auth, CKA_SIGN, CKM_MOCK_PREFIX); g_assert_nonnull (key); @@ -345,11 +342,14 @@ test_verify (Test *test, gconstpointer unused) GckMechanism mech = { CKM_MOCK_PREFIX, (guchar *)"my-prefix:", 10 }; GError *error = NULL; GAsyncResult *result = NULL; + GTlsInteraction *interaction; GckObject *key; gboolean ret; /* Enable auto-login on this session, shouldn't be needed */ - g_signal_connect (test->module, "authenticate-object", G_CALLBACK (authenticate_object), NULL); + interaction = mock_interaction_new ("booo"); + gck_session_set_interaction (test->session, interaction); + g_object_unref (interaction); /* Find the right key */ key = find_key (test->session, CKA_VERIFY, CKM_MOCK_PREFIX); @@ -408,9 +408,9 @@ test_generate_key_pair (Test *test, gconstpointer unused) gboolean ret; gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); - pub_attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + pub_attrs = gck_builder_end (&builder); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); - prv_attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + prv_attrs = gck_builder_end (&builder); /* Full One*/ ret = gck_session_generate_key_pair_full (test->session, &mech, pub_attrs, prv_attrs, @@ -540,7 +540,7 @@ test_unwrap_key (Test *test, gconstpointer unused) wrapper = find_key (test->session, CKA_UNWRAP, 0); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY); - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); /* Full One*/ unwrapped = gck_session_unwrap_key_full (test->session, wrapper, &mech, (const guchar *)"special", 7, attrs, NULL, &error); @@ -596,7 +596,7 @@ test_derive_key (Test *test, gconstpointer unused) wrapper = find_key (test->session, CKA_DERIVE, 0); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY); - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); /* Full One*/ derived = gck_session_derive_key_full (test->session, wrapper, &mech, attrs, NULL, &error); diff --git a/gck/test-gck-enumerator.c b/gck/test-gck-enumerator.c index e7ad139..4776ce5 100644 --- a/gck/test-gck-enumerator.c +++ b/gck/test-gck-enumerator.c @@ -230,6 +230,7 @@ test_enumerate_session (Test *test, gconstpointer unused) { GckBuilder builder = GCK_BUILDER_INIT; + GckAttributes *attributes; GckEnumerator *en; GError *error = NULL; GckSession *session; @@ -243,7 +244,9 @@ test_enumerate_session (Test *test, session = gck_session_open (slots->data, 0, NULL, NULL, &error); g_assert_no_error (error); - en = gck_session_enumerate_objects (session, gck_builder_end (&builder)); + attributes = gck_builder_end (&builder); + en = gck_session_enumerate_objects (session, attributes); + gck_attributes_unref (attributes); g_assert_true (GCK_IS_ENUMERATOR (en)); obj = gck_enumerator_next (en, NULL, &error); @@ -266,7 +269,7 @@ test_attribute_match (Test *test, gconstpointer unused) uri_data = gck_uri_data_new (); gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key"); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); en = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); g_assert_true (GCK_IS_ENUMERATOR (en)); @@ -280,8 +283,8 @@ test_attribute_match (Test *test, gconstpointer unused) } static void -test_authenticate_interaction (Test *test, - gconstpointer unused) +test_authenticate (Test *test, + gconstpointer unused) { GTlsInteraction *interaction; GTlsInteraction *check; @@ -317,54 +320,6 @@ test_authenticate_interaction (Test *test, g_assert_null (interaction); } -static gboolean -on_authenticate_token (GckModule *module, - GckSlot *slot, - gchar *label, - gchar **password, - gpointer unused) -{ - g_assert_true (unused == GUINT_TO_POINTER (35)); - g_assert_nonnull (password); - g_assert_null (*password); - g_assert_true (GCK_IS_MODULE (module)); - g_assert_true (GCK_IS_SLOT (slot)); - - *password = g_strdup ("booo"); - return TRUE; -} - -static void -test_authenticate_compat (Test *test, - gconstpointer unused) -{ - GckUriData *uri_data; - GError *error = NULL; - GckEnumerator *en; - GckObject *obj; - gulong sig; - - sig = g_signal_connect (test->modules->data, "authenticate-slot", - G_CALLBACK (on_authenticate_token), GUINT_TO_POINTER (35)); - - uri_data = gck_uri_data_new (); - en = _gck_enumerator_new_for_modules (test->modules, GCK_SESSION_LOGIN_USER, uri_data); - g_assert_true (GCK_IS_ENUMERATOR (en)); - g_object_add_weak_pointer (G_OBJECT (en), (gpointer *)&en); - - obj = gck_enumerator_next (en, NULL, &error); - g_assert_true (GCK_IS_OBJECT (obj)); - g_object_add_weak_pointer (G_OBJECT (obj), (gpointer *)&obj); - - g_object_unref (obj); - g_object_unref (en); - - g_signal_handler_disconnect (test->modules->data, sig); - - g_assert_null (obj); - g_assert_null (en); -} - static void test_token_match (Test *test, gconstpointer unused) { @@ -408,7 +363,7 @@ typedef struct { } MockObjectClass; GType mock_object_get_type (void) G_GNUC_CONST; -static void mock_object_cache_init (GckObjectCacheIface *iface); +static void mock_object_cache_init (GckObjectCacheInterface *iface); #define MOCK_TYPE_OBJECT (mock_object_get_type()) #define MOCK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), MOCK_TYPE_OBJECT, MockObject)) @@ -494,11 +449,11 @@ mock_object_fill (GckObjectCache *object, gck_builder_set_all (&builder, attrs); gck_attributes_unref (self->attrs); - self->attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + self->attrs = gck_builder_end (&builder); } static void -mock_object_cache_init (GckObjectCacheIface *iface) +mock_object_cache_init (GckObjectCacheInterface *iface) { iface->default_types = mock_attribute_types; iface->n_default_types = G_N_ELEMENTS (mock_attribute_types); @@ -576,18 +531,18 @@ test_chained (Test *test, uri_data = gck_uri_data_new (); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); one = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); uri_data = gck_uri_data_new (); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); two = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); gck_enumerator_set_chained (one, two); uri_data = gck_uri_data_new (); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); three = _gck_enumerator_new_for_modules (test->modules, 0, uri_data); gck_enumerator_set_chained (two, three); @@ -617,8 +572,7 @@ main (int argc, char **argv) g_test_add ("/gck/enumerator/next_n", Test, NULL, setup, test_next_n, teardown); g_test_add ("/gck/enumerator/next_async", Test, NULL, setup, test_next_async, teardown); g_test_add ("/gck/enumerator/session", Test, NULL, setup, test_enumerate_session, teardown); - g_test_add ("/gck/enumerator/authenticate-interaction", Test, NULL, setup, test_authenticate_interaction, teardown); - g_test_add ("/gck/enumerator/authenticate-compat", Test, NULL, setup, test_authenticate_compat, teardown); + g_test_add ("/gck/enumerator/authenticate", Test, NULL, setup, test_authenticate, teardown); g_test_add ("/gck/enumerator/attribute_match", Test, NULL, setup, test_attribute_match, teardown); g_test_add ("/gck/enumerator/token_match", Test, NULL, setup, test_token_match, teardown); g_test_add ("/gck/enumerator/attribute_get", Test, NULL, setup, test_attribute_get, teardown); diff --git a/gck/test-gck-module.c b/gck/test-gck-module.c index 91e7e4d..4ffdbc6 100644 --- a/gck/test-gck-module.c +++ b/gck/test-gck-module.c @@ -95,14 +95,14 @@ test_invalid_modules (Test *test, gconstpointer unused) /* Shouldn't be able to load modules */ invalid = gck_module_initialize ("blah-blah-non-existant", NULL, &error); - g_assert_error (error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM); + g_assert_error (error, GCK_ERROR, (int)GCK_ERROR_MODULE_PROBLEM); g_assert_null (invalid); g_clear_error (&error); /* Shouldn't be able to load any file successfully */ invalid = gck_module_initialize ("/usr/lib/libm.so", NULL, &error); - g_assert_error (error, GCK_ERROR, (int)CKR_GCK_MODULE_PROBLEM); + g_assert_error (error, GCK_ERROR, (int)GCK_ERROR_MODULE_PROBLEM); g_assert_null (invalid); g_clear_error (&error); @@ -126,7 +126,7 @@ test_module_equals_hash (Test *test, gconstpointer unused) g_assert_true (gck_module_equal (test->module, other)); /* TODO: Could do with another test for inequality */ - g_assert_false (gck_module_equal (test->module, obj)); + g_assert_false (gck_module_equal (test->module, (GckModule *) obj)); g_object_unref (other); g_object_unref (obj); diff --git a/gck/test-gck-modules.c b/gck/test-gck-modules.c index 1468b9b..96928da 100644 --- a/gck/test-gck-modules.c +++ b/gck/test-gck-modules.c @@ -67,10 +67,13 @@ test_enumerate_objects (Test *test, gconstpointer unused) GckBuilder builder = GCK_BUILDER_INIT; GError *error = NULL; GckEnumerator *en; + GckAttributes *attributes; GList *objects; gck_builder_add_string (&builder, CKA_LABEL, "Private Capitalize Key"); - en = gck_modules_enumerate_objects (test->modules, gck_builder_end (&builder), 0); + attributes = gck_builder_end (&builder); + en = gck_modules_enumerate_objects (test->modules, attributes, 0); + gck_attributes_unref (attributes); g_assert_true (GCK_IS_ENUMERATOR (en)); objects = gck_enumerator_next_n (en, -1, NULL, &error); @@ -114,7 +117,7 @@ test_token_for_uri_error (Test *test, gconstpointer unused) slot = gck_modules_token_for_uri (test->modules, "http://invalid.uri", &error); g_assert_null (slot); - g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SCHEME); g_error_free (error); } @@ -148,7 +151,7 @@ test_object_for_uri_error (Test *test, gconstpointer unused) object = gck_modules_object_for_uri (test->modules, "http://invalid.uri", 0, &error); g_assert_null (object); - g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SCHEME); g_error_free (error); } diff --git a/gck/test-gck-object.c b/gck/test-gck-object.c index 4741898..d75f970 100644 --- a/gck/test-gck-object.c +++ b/gck/test-gck-object.c @@ -60,7 +60,7 @@ setup (Test *test, gconstpointer unused) g_object_ref (test->slot); gck_list_unref_free (slots); - test->session = gck_slot_open_session (test->slot, 0, NULL, &err); + test->session = gck_slot_open_session (test->slot, 0, NULL, NULL, &err); g_assert_no_error (err); g_assert_true (GCK_IS_SESSION (test->session)); @@ -108,7 +108,7 @@ test_object_equals_hash (Test *test, gconstpointer unused) g_assert_true (gck_object_equal (test->object, test->object)); other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", GCK_MOCK_SLOT_TWO_ID, NULL); - other_session = gck_slot_open_session (other_slot, 0, NULL, &err); + other_session = gck_slot_open_session (other_slot, 0, NULL, NULL, &err); g_assert_no_error (err); g_assert_true (GCK_IS_SESSION (other_session)); other_object = gck_object_from_handle (other_session, gck_object_get_handle (test->object)); @@ -118,7 +118,7 @@ test_object_equals_hash (Test *test, gconstpointer unused) g_object_unref (other_object); obj = g_object_new (G_TYPE_OBJECT, NULL); - g_assert_false (gck_object_equal (test->object, obj)); + g_assert_false (gck_object_equal (test->object, (GckObject *) obj)); g_object_unref (obj); other_object = gck_object_from_handle (test->session, 383838); @@ -152,7 +152,7 @@ test_create_object (Test *test, gconstpointer unused) gck_builder_add_string (&builder, CKA_LABEL, "TEST LABEL"); gck_builder_add_boolean (&builder, CKA_TOKEN, CK_FALSE); gck_builder_add_data (&builder, CKA_VALUE, (const guchar *)"BLAH", 4); - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); object = gck_session_create_object (test->session, attrs, NULL, &err); g_assert_true (GCK_IS_OBJECT (object)); @@ -190,7 +190,7 @@ test_destroy_object (Test *test, gconstpointer unused) gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); gck_builder_add_string (&builder, CKA_LABEL, "TEST OBJECT"); gck_builder_add_boolean (&builder, CKA_TOKEN, CK_TRUE); - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); /* Using simple */ object = gck_session_create_object (test->session, attrs, NULL, &err); @@ -322,7 +322,9 @@ test_set_attributes (Test *test, gconstpointer unused) gck_builder_add_string (&builder, CKA_LABEL, "CHANGE TWO"); /* Full */ - ret = gck_object_set (test->object, gck_builder_end (&builder), NULL, &err); + attrs = gck_builder_end (&builder); + ret = gck_object_set (test->object, attrs, NULL, &err); + gck_attributes_unref (attrs); g_assert_no_error (err); g_assert_true (ret); attrs = gck_object_get (test->object, NULL, &err, CKA_CLASS, CKA_LABEL, GCK_INVALID); @@ -335,7 +337,9 @@ test_set_attributes (Test *test, gconstpointer unused) gck_builder_add_string (&builder, CKA_LABEL, "CHANGE THREE"); /* Async */ - gck_object_set_async (test->object, gck_builder_end (&builder), NULL, fetch_async_result, &result); + attrs = gck_builder_end (&builder); + gck_object_set_async (test->object, attrs, NULL, fetch_async_result, &result); + gck_attributes_unref (attrs); egg_test_wait_until (500); g_assert_nonnull (result); @@ -355,36 +359,47 @@ test_find_objects (Test *test, gconstpointer unused) { GckBuilder builder = GCK_BUILDER_INIT; GAsyncResult *result = NULL; + GckAttributes *attributes; GList *objects; GckObject *testobj; GError *err = NULL; gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); gck_builder_add_string (&builder, CKA_LABEL, "UNIQUE LABEL"); - testobj = gck_session_create_object (test->session, gck_builder_end (&builder), NULL, &err); + attributes = gck_builder_end (&builder); + testobj = gck_session_create_object (test->session, attributes, NULL, &err); + gck_attributes_unref (attributes); g_object_unref (testobj); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); gck_builder_add_string (&builder, CKA_LABEL, "OTHER LABEL"); - testobj = gck_session_create_object (test->session, gck_builder_end (&builder), NULL, &err); + attributes = gck_builder_end (&builder); + testobj = gck_session_create_object (test->session, attributes, NULL, &err); + gck_attributes_unref (attributes); g_object_unref (testobj); /* Simple, "TEST LABEL" */ gck_builder_add_string (&builder, CKA_LABEL, "UNIQUE LABEL"); - objects = gck_session_find_objects (test->session, gck_builder_end (&builder), NULL, &err); + attributes = gck_builder_end (&builder); + objects = gck_session_find_objects (test->session, attributes, NULL, &err); + gck_attributes_unref (attributes); g_assert_no_error (err); g_assert_cmpuint (g_list_length (objects), ==, 1); gck_list_unref_free (objects); /* Full, All */ - objects = gck_session_find_objects (test->session, gck_builder_end (&builder), NULL, &err); + attributes = gck_builder_end (&builder); + objects = gck_session_find_objects (test->session, attributes, NULL, &err); + gck_attributes_unref (attributes); g_assert_no_error (err); g_assert_cmpuint (g_list_length (objects), >, 1); gck_list_unref_free (objects); /* Async, None */ gck_builder_add_string (&builder, CKA_LABEL, "blah blah"); - gck_session_find_objects_async (test->session, gck_builder_end (&builder), NULL, fetch_async_result, &result); + attributes = gck_builder_end (&builder); + gck_session_find_objects_async (test->session, attributes, NULL, fetch_async_result, &result); + gck_attributes_unref (attributes); egg_test_wait_until (500); g_assert_nonnull (result); diff --git a/gck/test-gck-session.c b/gck/test-gck-session.c index 0a296df..055a92d 100644 --- a/gck/test-gck-session.c +++ b/gck/test-gck-session.c @@ -61,7 +61,7 @@ setup (Test *test, gconstpointer unused) gck_list_unref_free (slots); g_object_add_weak_pointer (G_OBJECT (test->slot), (gpointer *)&test->slot); - test->session = gck_slot_open_session (test->slot, 0, NULL, &err); + test->session = gck_slot_open_session (test->slot, 0, NULL, NULL, &err); g_assert_no_error (err); g_assert_true (GCK_IS_SESSION (test->session)); g_object_add_weak_pointer (G_OBJECT (test->session), (gpointer *)&test->session); @@ -127,14 +127,14 @@ test_open_close_session (Test *test, gconstpointer unused) GAsyncResult *result = NULL; GError *err = NULL; - sess = gck_slot_open_session (test->slot, 0, NULL, &err); + sess = gck_slot_open_session (test->slot, 0, NULL, NULL, &err); g_assert_no_error (err); g_assert_true (GCK_IS_SESSION (sess)); g_object_unref (sess); /* Test opening async */ - gck_slot_open_session_async (test->slot, 0, NULL, fetch_async_result, &result); + gck_slot_open_session_async (test->slot, 0, NULL, NULL, fetch_async_result, &result); egg_test_wait_until (500); g_assert_nonnull (result); @@ -418,19 +418,6 @@ test_login_interactive (Test *test, g_object_unref (interaction); } -static gboolean -authenticate_token (GckModule *module, GckSlot *slot, gchar *label, gchar **password, gpointer unused) -{ - g_assert_true (unused == GUINT_TO_POINTER (35)); - g_assert_nonnull (password); - g_assert_null (*password); - g_assert_true (GCK_IS_MODULE (module)); - g_assert_true (GCK_IS_SLOT (slot)); - - *password = g_strdup ("booo"); - return TRUE; -} - static void test_auto_login (Test *test, gconstpointer unused) { @@ -440,12 +427,13 @@ test_auto_login (Test *test, gconstpointer unused) GAsyncResult *result = NULL; GError *err = NULL; GckAttributes *attrs; + GTlsInteraction *test_interaction; gboolean ret; gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); gck_builder_add_string (&builder, CKA_LABEL, "TEST OBJECT"); gck_builder_add_boolean (&builder, CKA_PRIVATE, CK_TRUE); - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); /* Try to do something that requires a login */ object = gck_session_create_object (test->session, attrs, NULL, &err); @@ -454,8 +442,9 @@ test_auto_login (Test *test, gconstpointer unused) g_clear_error (&err); /* Setup for auto login */ - g_signal_connect (test->module, "authenticate-slot", G_CALLBACK (authenticate_token), GUINT_TO_POINTER (35)); - new_session = gck_slot_open_session (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, &err); + test_interaction = mock_interaction_new ("booo"); + new_session = gck_slot_open_session (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, test_interaction, NULL, &err); + g_object_unref (test_interaction); g_assert_no_error (err); g_assert_true (GCK_IS_SESSION (new_session)); @@ -473,10 +462,12 @@ test_auto_login (Test *test, gconstpointer unused) g_object_unref (new_session); /* Now try the same thing, but asyncronously */ - gck_slot_open_session_async (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, NULL, fetch_async_result, &result); + test_interaction = mock_interaction_new ("booo"); + gck_slot_open_session_async (test->slot, GCK_SESSION_READ_WRITE | GCK_SESSION_LOGIN_USER, test_interaction, NULL, fetch_async_result, &result); egg_test_wait_until (500); g_assert_nonnull (result); new_session = gck_slot_open_session_finish (test->slot, result, &err); + g_object_unref (test_interaction); g_assert_no_error (err); g_assert_true (GCK_IS_SESSION (new_session)); g_object_unref (result); diff --git a/gck/test-gck-slot.c b/gck/test-gck-slot.c index c314233..6d09c42 100644 --- a/gck/test-gck-slot.c +++ b/gck/test-gck-slot.c @@ -156,7 +156,7 @@ test_slot_equals_hash (Test *test, gconstpointer unused) g_object_unref (other_slot); obj = g_object_new (G_TYPE_OBJECT, NULL); - g_assert_false (gck_slot_equal (test->slot, obj)); + g_assert_false (gck_slot_equal (test->slot, (GckSlot *) obj)); g_object_unref (obj); other_slot = g_object_new (GCK_TYPE_SLOT, "module", test->module, "handle", 8909, NULL); @@ -182,7 +182,7 @@ test_slot_mechanisms (Test *test, gconstpointer unused) gck_mechanism_info_free (info); } - gck_mechanisms_free (mechs); + g_array_unref (mechs); } static void diff --git a/gck/test-gck-uri.c b/gck/test-gck-uri.c index bbfddda..1d76975 100644 --- a/gck/test-gck-uri.c +++ b/gck/test-gck-uri.c @@ -37,7 +37,7 @@ test_parse (void) GError *error = NULL; GckUriData *uri_data; - uri_data = gck_uri_parse ("pkcs11:", GCK_URI_FOR_MODULE, &error); + uri_data = gck_uri_data_parse ("pkcs11:", GCK_URI_FOR_MODULE, &error); g_assert_nonnull (uri_data); g_assert_no_error (error); @@ -57,9 +57,9 @@ test_parse_bad_scheme (void) GError *error = NULL; GckUriData *uri_data; - uri_data = gck_uri_parse ("http:\\example.com\test", GCK_URI_FOR_ANY, &error); + uri_data = gck_uri_data_parse ("http:\\example.com\test", GCK_URI_FOR_ANY, &error); g_assert_null (uri_data); - g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_PREFIX); + g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SCHEME); g_error_free (error); } @@ -70,7 +70,7 @@ test_parse_with_label (void) GckUriData *uri_data; gchar *value; - uri_data = gck_uri_parse ("pkcs11:object=Test%20Label", GCK_URI_FOR_ANY, &error); + uri_data = gck_uri_data_parse ("pkcs11:object=Test%20Label", GCK_URI_FOR_ANY, &error); g_assert_nonnull (uri_data); g_assert_nonnull (uri_data->attributes); @@ -91,7 +91,7 @@ test_parse_with_label_and_klass (void) gchar *value; gulong klass; - uri_data = gck_uri_parse ("pkcs11:object=Test%20Label;objecttype=cert", GCK_URI_FOR_ANY, &error); + uri_data = gck_uri_data_parse ("pkcs11:object=Test%20Label;objecttype=cert", GCK_URI_FOR_ANY, &error); g_assert_nonnull (uri_data); g_assert_nonnull (uri_data->attributes); @@ -115,7 +115,7 @@ test_parse_with_id (void) const GckAttribute *attr; GckUriData *uri_data; - uri_data = gck_uri_parse ("pkcs11:id=%54%45%53%54%00", GCK_URI_FOR_OBJECT, &error); + uri_data = gck_uri_data_parse ("pkcs11:id=%54%45%53%54%00", GCK_URI_FOR_OBJECT, &error); g_assert_nonnull (uri_data); g_assert_nonnull (uri_data->attributes); @@ -133,7 +133,7 @@ test_parse_with_bad_string_encoding (void) GError *error = NULL; GckUriData *uri_data; - uri_data = gck_uri_parse ("pkcs11:object=Test%", GCK_URI_FOR_OBJECT, &error); + uri_data = gck_uri_data_parse ("pkcs11:object=Test%", GCK_URI_FOR_OBJECT, &error); g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); g_error_free (error); @@ -144,7 +144,7 @@ test_parse_with_bad_binary_encoding (void) { GError *error = NULL; GckUriData *uri_data; - uri_data = gck_uri_parse ("pkcs11:id=%%", GCK_URI_FOR_ANY, &error); + uri_data = gck_uri_data_parse ("pkcs11:id=%%", GCK_URI_FOR_ANY, &error); g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); g_error_free (error); @@ -156,7 +156,7 @@ test_parse_with_token (void) GError *error = NULL; GckUriData *uri_data = NULL; - uri_data = gck_uri_parse ("pkcs11:token=Token%20Label;serial=3333;model=Deluxe;manufacturer=Me", + uri_data = gck_uri_data_parse ("pkcs11:token=Token%20Label;serial=3333;model=Deluxe;manufacturer=Me", GCK_URI_FOR_TOKEN, &error); g_assert_nonnull (uri_data); @@ -174,7 +174,7 @@ test_parse_with_token_bad_encoding (void) GError *error = NULL; GckUriData *uri_data; - uri_data = gck_uri_parse ("pkcs11:token=Token%", GCK_URI_FOR_TOKEN, &error); + uri_data = gck_uri_data_parse ("pkcs11:token=Token%", GCK_URI_FOR_TOKEN, &error); g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); g_error_free (error); @@ -186,7 +186,7 @@ test_parse_with_bad_syntax (void) GError *error = NULL; GckUriData *uri_data; - uri_data = gck_uri_parse ("pkcs11:token", GCK_URI_FOR_ANY, &error); + uri_data = gck_uri_data_parse ("pkcs11:token", GCK_URI_FOR_ANY, &error); g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_SYNTAX); g_error_free (error); @@ -198,7 +198,7 @@ test_parse_with_library (void) GError *error = NULL; GckUriData *uri_data = NULL; - uri_data = gck_uri_parse ("pkcs11:library-description=The%20Library;library-manufacturer=Me", + uri_data = gck_uri_data_parse ("pkcs11:library-description=The%20Library;library-manufacturer=Me", GCK_URI_FOR_MODULE, &error); g_assert_nonnull (uri_data); @@ -214,7 +214,7 @@ test_parse_with_library_bad_encoding (void) GError *error = NULL; GckUriData *uri_data; - uri_data = gck_uri_parse ("pkcs11:library-description=Library%", GCK_URI_FOR_MODULE, &error); + uri_data = gck_uri_data_parse ("pkcs11:library-description=Library%", GCK_URI_FOR_MODULE, &error); g_assert_null (uri_data); g_assert_error (error, GCK_URI_ERROR, GCK_URI_BAD_ENCODING); g_error_free (error); @@ -227,7 +227,7 @@ test_build_empty (void) gchar *uri; memset (&uri_data, 0, sizeof (uri_data)); - uri = gck_uri_build (&uri_data, 0); + uri = gck_uri_data_build (&uri_data, 0); g_assert_cmpstr (uri, ==, "pkcs11:"); g_free (uri); } @@ -246,10 +246,10 @@ test_build_with_token_info (void) uri_data.token_info->manufacturer_id = g_strdup ("Me"); uri_data.token_info->model = g_strdup ("Deluxe"); - uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); + uri = gck_uri_data_build (&uri_data, GCK_URI_FOR_TOKEN); g_assert_nonnull (uri); - check = gck_uri_parse (uri, GCK_URI_FOR_TOKEN, NULL); + check = gck_uri_data_parse (uri, GCK_URI_FOR_TOKEN, NULL); g_assert_nonnull (check); g_assert_nonnull (check->token_info); @@ -277,7 +277,7 @@ test_build_with_token_null_info (void) uri_data.token_info = g_new0 (GckTokenInfo, 1); uri_data.token_info->label = g_strdup ("The Label"); - uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); + uri = gck_uri_data_build (&uri_data, GCK_URI_FOR_TOKEN); g_assert_nonnull (uri); g_assert_true (g_str_has_prefix (uri, "pkcs11:")); @@ -299,7 +299,7 @@ test_build_with_token_empty_info (void) uri_data.token_info->label = g_strdup ("The Label"); uri_data.token_info->serial_number = g_strdup (""); - uri = gck_uri_build (&uri_data, GCK_URI_FOR_TOKEN); + uri = gck_uri_data_build (&uri_data, GCK_URI_FOR_TOKEN); g_assert_nonnull (uri); g_assert_true (g_str_has_prefix (uri, "pkcs11:")); @@ -325,14 +325,14 @@ test_build_with_attributes (void) gck_builder_add_string (&builder, CKA_LABEL, "The Label"); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_DATA); gck_builder_add_data (&builder, CKA_ID, (const guchar *)"TEST", 5); - uri_data.attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data.attributes = gck_builder_end (&builder); - uri = gck_uri_build (&uri_data, GCK_URI_FOR_OBJECT); + uri = gck_uri_data_build (&uri_data, GCK_URI_FOR_OBJECT); g_assert_nonnull (uri); gck_attributes_unref (uri_data.attributes); - check = gck_uri_parse (uri, GCK_URI_FOR_ANY, NULL); + check = gck_uri_data_parse (uri, GCK_URI_FOR_ANY, NULL); g_assert_nonnull (check); g_assert_nonnull (check->attributes); @@ -366,7 +366,7 @@ test_parse_private_key (void) GError *error = NULL; gulong klass; - uri_data = gck_uri_parse ("pkcs11:objecttype=private", GCK_URI_FOR_OBJECT, &error); + uri_data = gck_uri_data_parse ("pkcs11:objecttype=private", GCK_URI_FOR_OBJECT, &error); g_assert_nonnull (uri_data); g_assert_no_error (error); @@ -385,7 +385,7 @@ test_parse_secret_key (void) GError *error = NULL; gulong klass; - uri_data = gck_uri_parse ("pkcs11:objecttype=secretkey", GCK_URI_FOR_OBJECT, &error); + uri_data = gck_uri_data_parse ("pkcs11:objecttype=secretkey", GCK_URI_FOR_OBJECT, &error); g_assert_nonnull (uri_data); g_assert_no_error (error); @@ -405,7 +405,7 @@ test_parse_unknown_objecttype (void) GError *error = NULL; gulong klass; - uri_data = gck_uri_parse ("pkcs11:objecttype=unknown", GCK_URI_FOR_OBJECT, &error); + uri_data = gck_uri_data_parse ("pkcs11:objecttype=unknown", GCK_URI_FOR_OBJECT, &error); g_assert_nonnull (uri_data); g_assert_no_error (error); @@ -426,9 +426,9 @@ test_build_objecttype_cert (void) uri_data = gck_uri_data_new (); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); - uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); + uri = gck_uri_data_build (uri_data, GCK_URI_FOR_OBJECT); g_assert_nonnull (uri); g_assert_true (strstr (uri, "object-type=cert") || strstr (uri, "type=cert")); @@ -445,9 +445,9 @@ test_build_objecttype_private (void) uri_data = gck_uri_data_new (); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); - uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); + uri = gck_uri_data_build (uri_data, GCK_URI_FOR_OBJECT); g_assert_nonnull (uri); g_assert_true (strstr (uri, "object-type=private") || strstr (uri, "type=private")); @@ -464,9 +464,9 @@ test_build_objecttype_public (void) uri_data = gck_uri_data_new (); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PUBLIC_KEY); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); - uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); + uri = gck_uri_data_build (uri_data, GCK_URI_FOR_OBJECT); g_assert_nonnull (uri); g_assert_true (strstr (uri, "object-type=public") || strstr (uri, "type=public")); @@ -484,9 +484,9 @@ test_build_objecttype_secret (void) uri_data = gck_uri_data_new (); gck_builder_add_ulong (&builder, CKA_CLASS, CKO_SECRET_KEY); - uri_data->attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + uri_data->attributes = gck_builder_end (&builder); - uri = gck_uri_build (uri_data, GCK_URI_FOR_OBJECT); + uri = gck_uri_data_build (uri_data, GCK_URI_FOR_OBJECT); g_assert_nonnull (uri); g_assert_true (strstr (uri, "object-type=secret-key") || strstr (uri, "type=secret-key")); @@ -505,7 +505,7 @@ test_build_with_library (void) uri_data->module_info = g_new0 (GckModuleInfo, 1); uri_data->module_info->library_description = g_strdup ("The Description"); - uri = gck_uri_build (uri_data, GCK_URI_FOR_MODULE); + uri = gck_uri_data_build (uri_data, GCK_URI_FOR_MODULE); g_assert_nonnull (uri); g_assert_true (strstr (uri, "library-description=The%20Description")); diff --git a/ui/fixtures/ca-certificates.crt b/gcr-gtk3/fixtures/ca-certificates.crt index c30335f..c30335f 100644 --- a/ui/fixtures/ca-certificates.crt +++ b/gcr-gtk3/fixtures/ca-certificates.crt diff --git a/ui/fixtures/der-certificate.crt b/gcr-gtk3/fixtures/der-certificate.crt Binary files differindex 56fa849..56fa849 100644 --- a/ui/fixtures/der-certificate.crt +++ b/gcr-gtk3/fixtures/der-certificate.crt diff --git a/ui/fixtures/der-rsa-2048.p10 b/gcr-gtk3/fixtures/der-rsa-2048.p10 Binary files differindex 6355622..6355622 100644 --- a/ui/fixtures/der-rsa-2048.p10 +++ b/gcr-gtk3/fixtures/der-rsa-2048.p10 diff --git a/ui/fixtures/email.p12 b/gcr-gtk3/fixtures/email.p12 Binary files differindex d45d0f8..d45d0f8 100644 --- a/ui/fixtures/email.p12 +++ b/gcr-gtk3/fixtures/email.p12 diff --git a/ui/fixtures/pem-dsa-1024.key b/gcr-gtk3/fixtures/pem-dsa-1024.key index ccb1e7b..ccb1e7b 100644 --- a/ui/fixtures/pem-dsa-1024.key +++ b/gcr-gtk3/fixtures/pem-dsa-1024.key diff --git a/ui/frob-certificate.c b/gcr-gtk3/frob-certificate.c index f9cc259..41a5c0b 100644 --- a/ui/frob-certificate.c +++ b/gcr-gtk3/frob-certificate.c @@ -22,6 +22,7 @@ #include "config.h" #include "gcr/gcr.h" +#include "gcr-gtk3/gcr-gtk3.h" #include "egg/egg-hex.h" @@ -106,7 +107,7 @@ main(int argc, char *argv[]) if (argc > 1) test_certificate (argv[1]); else - test_certificate (SRCDIR "/ui/fixtures/der-certificate.crt"); + test_certificate (SRCDIR "/gcr-gtk3/fixtures/der-certificate.crt"); return 0; } diff --git a/gcr-gtk3/gcr-certificate-widget.c b/gcr-gtk3/gcr-certificate-widget.c new file mode 100644 index 0000000..e5fefdc --- /dev/null +++ b/gcr-gtk3/gcr-certificate-widget.c @@ -0,0 +1,677 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "config.h" + +#include <glib/gi18n-lib.h> + +#include <gcr-gtk3/gcr-certificate-widget.h> +#include "gcr/gcr-certificate-extensions.h" +#include "gcr/gcr-fingerprint.h" +#include "gcr/gcr-oids.h" + +#include "gcr-section.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-dn.h" +#include "egg/egg-oid.h" +#include "egg/egg-hex.h" + +struct _GcrCertificateWidget +{ + GtkBox parent_instance; + + GcrCertificate *certificate; + GtkWidget *reveal_button; + GtkWidget *revealer; + GtkWidget *secondary_info; + GtkSizeGroup *size_group; +}; + +G_DEFINE_TYPE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_BOX) + +enum { + PROP_CERTIFICATE = 1, + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +static void +gcr_certificate_widget_finalize (GObject *object) +{ + GcrCertificateWidget *self = (GcrCertificateWidget *)object; + + g_clear_object (&self->size_group); + + G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (object); +} + +static void +gcr_certificate_widget_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object); + + switch (prop_id) + { + case PROP_CERTIFICATE: + g_value_set_object (value, gcr_certificate_widget_get_certificate (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gcr_certificate_widget_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object); + + switch (prop_id) + { + case PROP_CERTIFICATE: + gcr_certificate_widget_set_certificate (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = gcr_certificate_widget_finalize; + object_class->get_property = gcr_certificate_widget_get_property; + object_class->set_property = gcr_certificate_widget_set_property; + + obj_properties[PROP_CERTIFICATE] = + g_param_spec_object ("certificate", + "Certificate", + "Certificate to display.", + GCR_TYPE_CERTIFICATE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, + N_PROPERTIES, + obj_properties); +} + +static void +on_reveal_button_clicked (GtkWidget *button, + GcrCertificateWidget *self) +{ + g_assert (GCR_IS_CERTIFICATE_WIDGET (self)); + gtk_widget_hide (button); + gtk_revealer_set_reveal_child (GTK_REVEALER (self->revealer), TRUE); +} + +static void +gcr_certificate_widget_init (GcrCertificateWidget *self) +{ + gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL); + self->reveal_button = gtk_button_new_with_label ("…"); + gtk_widget_set_halign (self->reveal_button, GTK_ALIGN_CENTER); + gtk_box_pack_end (GTK_BOX (self), self->reveal_button, FALSE, TRUE, 0); + self->secondary_info = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + self->revealer = g_object_new (GTK_TYPE_REVEALER, + "child", self->secondary_info, + "transition-type", GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN, + NULL); + gtk_box_pack_end (GTK_BOX (self), self->revealer, FALSE, TRUE, 0); + g_signal_connect (self->reveal_button, "clicked", G_CALLBACK (on_reveal_button_clicked), self); + self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); +} + +static GtkWidget* +_gcr_certificate_widget_add_section (GcrCertificateWidget *self, + const gchar *title, + GIcon *icon, + gboolean important) +{ + GtkWidget *widget; + + g_assert (GCR_IS_CERTIFICATE_WIDGET (self)); + + if (icon) + widget = gcr_section_new_with_icon (title, icon); + else + widget = gcr_section_new (title); + + gtk_size_group_add_widget (self->size_group, widget); + if (important) + gtk_box_pack_start (GTK_BOX (self), widget, FALSE, TRUE, 0); + else + gtk_container_add (GTK_CONTAINER (self->secondary_info), widget); + + return widget; +} + +static GtkWidget* +create_value_label (const gchar *label) +{ + return g_object_new (GTK_TYPE_LABEL, + "label", label, + "xalign", 1.0, + "halign", GTK_ALIGN_END, + "hexpand", TRUE, + "selectable", TRUE, + "wrap", TRUE, + NULL); +} + +static gchar* +calculate_label (GcrCertificateWidget *self) +{ + gchar *label; + + label = gcr_certificate_get_subject_cn (self->certificate); + if (label != NULL) + return label; + + return g_strdup (_("Certificate")); +} + +static void +on_parsed_dn_part (guint index, + GQuark oid, + GNode *value, + gpointer user_data) +{ + GtkWidget *section = user_data; + const gchar *attr; + const gchar *desc; + gchar *field = NULL; + gchar *display; + + attr = egg_oid_get_name (oid); + desc = egg_oid_get_description (oid); + + /* Combine them into something sane */ + if (attr && desc) { + if (strcmp (attr, desc) == 0) + field = g_strdup (attr); + else + field = g_strdup_printf ("%s (%s)", attr, desc); + } else if (!attr && !desc) { + field = g_strdup (""); + } else if (attr) { + field = g_strdup (attr); + } else if (desc) { + field = g_strdup (desc); + } else { + g_assert_not_reached (); + } + + display = egg_dn_print_value (oid, value); + if (display == NULL) + display = g_strdup (""); + + gcr_section_add_child (GCR_SECTION (section), field, create_value_label (display)); + + g_free (field); + g_free (display); +} + +static inline gchar * +hex_encode_bytes (GBytes *bytes) +{ + gsize size; + gconstpointer data = g_bytes_get_data (bytes, &size); + return egg_hex_encode_full (data, size, TRUE, " ", 1); +} + +static void +append_subject_public_key (GcrCertificateWidget *self, + GcrSection *section, + GNode *subject_public_key) +{ + guint key_nbits; + const gchar *text; + gchar *display; + GBytes *value; + guchar *raw; + gsize n_raw; + GQuark oid; + guint bits; + + key_nbits = gcr_certificate_get_key_size (self->certificate); + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key, + "algorithm", "algorithm", NULL)); + text = egg_oid_get_description (oid); + gcr_section_add_child (section, _("Key Algorithm"), create_value_label (text)); + + value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key, + "algorithm", "parameters", NULL)); + if (value) { + display = hex_encode_bytes (value); + gcr_section_add_child (section, _("Key Parameters"), create_value_label (display)); + g_clear_pointer (&display, g_free); + g_bytes_unref (value); + } + + if (key_nbits > 0) { + display = g_strdup_printf ("%u", key_nbits); + gcr_section_add_child (section, _("Key Size"), create_value_label (display)); + g_clear_pointer (&display, g_free); + } + + value = egg_asn1x_get_element_raw (subject_public_key); + raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL), + g_bytes_get_size (value), + G_CHECKSUM_SHA1, &n_raw); + g_bytes_unref (value); + display = egg_hex_encode_full (raw, n_raw, TRUE, " ", 1); + g_free (raw); + gcr_section_add_child (section, _("Key SHA1 Fingerprint"), create_value_label (text)); + g_clear_pointer (&display, g_free); + + value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits); + display = egg_hex_encode_full (g_bytes_get_data (value, NULL), bits / 8, TRUE, " ", 1); + gcr_section_add_child (section, _("Public Key"), create_value_label (text)); + g_clear_pointer (&display, g_free); + g_bytes_unref (value); +} + +static GcrSection * +append_extension_basic_constraints (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + gboolean is_ca = FALSE; + gint path_len = -1; + gchar *number; + + if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len)) + return NULL; + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Basic Constraints"), NULL, FALSE)); + gcr_section_add_child (section, _("Certificate Authority"), create_value_label (is_ca ? _("Yes") : _("No"))); + + number = g_strdup_printf ("%d", path_len); + gcr_section_add_child (section, _("Max Path Length"), create_value_label (path_len < 0 ? _("Unlimited") : number)); + g_free (number); + + return section; +} + +static GcrSection * +append_extension_extended_key_usage (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + GQuark *oids; + GString *text; + guint i; + + oids = _gcr_certificate_extension_extended_key_usage (data); + if (oids == NULL) + return NULL; + + text = g_string_new (""); + for (i = 0; oids[i] != 0; i++) { + if (i > 0) + g_string_append_unichar (text, '\n'); + g_string_append (text, egg_oid_get_description (oids[i])); + } + + g_free (oids); + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extended Key Usage"), NULL, FALSE)); + gcr_section_add_child (section, _("Allowed Purposes"), create_value_label (text->str)); + + g_string_free (text, TRUE); + + return section; +} + +static GcrSection * +append_extension_subject_key_identifier (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + gpointer keyid; + gsize n_keyid; + + keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid); + if (keyid == NULL) + return NULL; + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Key Identifier"), NULL, FALSE)); + gchar *display = egg_hex_encode_full (keyid, n_keyid, TRUE, " ", 1); + g_free (keyid); + gcr_section_add_child (section, _("Key Identifier"), create_value_label (display)); + g_free (display); + + return section; +} + +static const struct { + guint usage; + const gchar *description; +} usage_descriptions[] = { + { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") }, + { GCR_KEY_USAGE_NON_REPUDIATION, N_("Non repudiation") }, + { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") }, + { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") }, + { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") }, + { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") }, + { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") }, + { GCR_KEY_USAGE_ENCIPHER_ONLY, N_("Encipher only") }, + { GCR_KEY_USAGE_DECIPHER_ONLY, N_("Decipher only") } +}; + +static GcrSection * +append_extension_key_usage (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + gulong key_usage; + GString *text; + guint i; + + if (!_gcr_certificate_extension_key_usage (data, &key_usage)) + return NULL; + + text = g_string_new (""); + + for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) { + if (key_usage & usage_descriptions[i].usage) { + if (text->len > 0) + g_string_append_unichar (text, '\n'); + g_string_append (text, _(usage_descriptions[i].description)); + } + } + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Key Usage"), NULL, FALSE)); + gcr_section_add_child (section, _("Usages"), create_value_label (text->str)); + + g_string_free (text, TRUE); + + return section; +} + +static GcrSection * +append_extension_subject_alt_name (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + GArray *general_names; + GcrGeneralName *general; + guint i; + + general_names = _gcr_certificate_extension_subject_alt_name (data); + if (general_names == NULL) + return FALSE; + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Alternative Names"), NULL, FALSE)); + + for (i = 0; i < general_names->len; i++) { + general = &g_array_index (general_names, GcrGeneralName, i); + if (general->display == NULL) { + gchar *display = hex_encode_bytes (general->raw); + gcr_section_add_child (section, general->description, create_value_label (display)); + g_free (display); + } else + gcr_section_add_child (section, general->description, create_value_label (general->display)); + } + + _gcr_general_names_free (general_names); + + return section; +} + +static GcrSection * +append_extension_hex (GcrCertificateWidget *self, + GQuark oid, + GBytes *value) +{ + GcrSection *section; + const gchar *text; + gchar *display; + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extension"), NULL, FALSE)); + + /* Extension type */ + text = egg_oid_get_description (oid); + gcr_section_add_child (section, _("Identifier"), create_value_label (text)); + display = hex_encode_bytes (value); + gcr_section_add_child (section, _("Value"), create_value_label (display)); + g_free (display); + + return section; +} + +static void +append_extension (GcrCertificateWidget *self, + GNode *node) +{ + GQuark oid; + GBytes *value; + gboolean critical; + GcrSection *section = NULL; + + /* Dig out the OID */ + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL)); + g_return_if_fail (oid); + + /* Extension value */ + value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL)); + + /* The custom parsers */ + if (oid == GCR_OID_BASIC_CONSTRAINTS) + section = append_extension_basic_constraints (self, value); + else if (oid == GCR_OID_EXTENDED_KEY_USAGE) + section = append_extension_extended_key_usage (self, value); + else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER) + section = append_extension_subject_key_identifier (self, value); + else if (oid == GCR_OID_KEY_USAGE) + section = append_extension_key_usage (self, value); + else if (oid == GCR_OID_SUBJECT_ALT_NAME) + section = append_extension_subject_alt_name (self, value); + + /* Otherwise the default raw display */ + if (!section) { + section = append_extension_hex (self, oid, value); + } + + /* Critical */ + if (section && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) { + gcr_section_add_child (section, _("Critical"), create_value_label (critical ? _("Yes") : _("No"))); + } + + g_bytes_unref (value); +} + +/** + * gcr_certificate_widget_new: + * @certificate: (nullable): certificate to display, or %NULL + * + * Create a new certificate widget which displays a given certificate. + * + * Returns: (transfer full): a newly allocated #GcrCertificateWidget, which + * should be freed with g_object_unref() + */ +GtkWidget * +gcr_certificate_widget_new (GcrCertificate *certificate) +{ + return g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, "certificate", certificate, NULL); +} + +/** + * gcr_certificate_widget_get_certificate: + * @self: The certificate widget + * + * Get the certificate displayed in the widget. + * + * Returns: (nullable) (transfer none): the certificate + */ +GcrCertificate * +gcr_certificate_widget_get_certificate (GcrCertificateWidget *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL); + return self->certificate; +} + +/** + * gcr_certificate_widget_set_certificate: + * @self: The certificate widget + * @certificate: (nullable): the certificate to display + * + * Set the certificate displayed in the widget + */ +void +gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, GcrCertificate *certificate) +{ + GtkWidget *section, *label; + PangoAttrList *attributes; + gchar *display; + GIcon *icon; + GBytes *bytes, *number; + GNode *asn, *subject_public_key; + GQuark oid; + gconstpointer data; + gsize n_data; + GDate date; + gulong version; + guint bits, index; + + g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self)); + + g_set_object (&self->certificate, certificate); + + data = gcr_certificate_get_der_data (self->certificate, &n_data); + if (!data) { + g_set_object (&self->certificate, NULL); + } + + icon = gcr_certificate_get_icon (self->certificate); + display = calculate_label (self); + section = _gcr_certificate_widget_add_section (self, display, icon, TRUE); + g_clear_pointer (&display, g_free); + g_object_unref (icon); + + bytes = g_bytes_new_static (data, n_data); + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes); + g_bytes_unref (bytes); + + display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN"); + gcr_section_add_child (GCR_SECTION (section), _("Identity"), create_value_label (display)); + g_clear_pointer (&display, g_free); + + display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN"); + gcr_section_add_child (GCR_SECTION (section), _("Verified by"), create_value_label (display)); + g_clear_pointer (&display, g_free); + + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) { + display = g_malloc0 (128); + if (!g_date_strftime (display, 128, "%x", &date)) + g_return_if_reached (); + gcr_section_add_child (GCR_SECTION (section), _("Expires"), create_value_label (display)); + g_clear_pointer (&display, g_free); + } + + /* The subject */ + section = _gcr_certificate_widget_add_section (self, _("Subject Name"), NULL, FALSE); + egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), on_parsed_dn_part, section); + + /* The Issuer */ + section = _gcr_certificate_widget_add_section (self, _("Issuer Name"), NULL, FALSE); + egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), on_parsed_dn_part, section); + + /* The Issued Parameters */ + section = _gcr_certificate_widget_add_section (self, _("Issued Certificate"), NULL, FALSE); + + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version)) { + g_critical ("Unable to parse certificate version"); + } else { + display = g_strdup_printf ("%lu", version + 1); + gcr_section_add_child (GCR_SECTION (section), _("Version"), create_value_label (display)); + g_clear_pointer (&display, g_free); + } + + number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL)); + if (!number) { + g_critical ("Unable to parse certificate serial number"); + } else { + display = hex_encode_bytes (number); + gcr_section_add_child (GCR_SECTION (section), _("Serial Number"), create_value_label (display)); + g_clear_pointer (&display, g_free); + g_bytes_unref (number); + } + + display = g_malloc0 (128); + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) { + if (!g_date_strftime (display, 128, "%x", &date)) + g_return_if_reached (); + gcr_section_add_child (GCR_SECTION (section), _("Not Valid Before"), create_value_label (display)); + } + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) { + if (!g_date_strftime (display, 128, "%x", &date)) + g_return_if_reached (); + gcr_section_add_child (GCR_SECTION (section), _("Not Valid After"), create_value_label (display)); + } + g_clear_pointer (&display, g_free); + + /* Fingerprints */ + section = _gcr_certificate_widget_add_section (self, _("Certificate Fingerprints"), NULL, FALSE); + display = g_compute_checksum_for_bytes (G_CHECKSUM_SHA1, bytes); + gcr_section_add_child (GCR_SECTION (section), "SHA1", create_value_label (display)); + g_clear_pointer (&display, g_free); + display = g_compute_checksum_for_bytes (G_CHECKSUM_MD5, bytes); + gcr_section_add_child (GCR_SECTION (section), "MD5", create_value_label (display)); + g_clear_pointer (&display, g_free); + + /* Public Key Info */ + section = _gcr_certificate_widget_add_section (self, _("Public Key Info"), NULL, FALSE); + subject_public_key = egg_asn1x_node (asn, "tbsCertificate", "subjectPublicKeyInfo", NULL); + append_subject_public_key (self, GCR_SECTION (section), subject_public_key); + + /* Extensions */ + for (index = 1; TRUE; ++index) { + GNode *extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL); + if (extension == NULL) + break; + append_extension (self, extension); + } + + /* Signature */ + section = _gcr_certificate_widget_add_section (self, _("Signature"), NULL, FALSE); + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL)); + gcr_section_add_child (GCR_SECTION (section), _("Signature Algorithm"), create_value_label (egg_oid_get_description (oid))); + + bytes = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL)); + if (bytes) { + display = hex_encode_bytes (bytes); + gcr_section_add_child (GCR_SECTION (section), _("Signature Parameters"), create_value_label (display)); + g_clear_pointer (&display, g_free); + g_bytes_unref (bytes); + } + + bytes = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits); + display = egg_hex_encode_full (g_bytes_get_data (bytes, NULL), bits / 8, TRUE, " ", 1); + g_bytes_unref (bytes); + label = create_value_label (display); + attributes = pango_attr_list_new (); + pango_attr_list_insert (attributes, pango_attr_family_new ("Monospace")); + gtk_label_set_attributes (GTK_LABEL (label), attributes); + pango_attr_list_unref (attributes); + gcr_section_add_child (GCR_SECTION (section), _("Signature"), label); + g_clear_pointer (&display, g_free); + + egg_asn1x_destroy (asn); +} diff --git a/gcr-gtk3/gcr-certificate-widget.h b/gcr-gtk3/gcr-certificate-widget.h new file mode 100644 index 0000000..dab5a82 --- /dev/null +++ b/gcr-gtk3/gcr-certificate-widget.h @@ -0,0 +1,33 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright 2010 Stefan Walter + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + +#ifndef __GCR_CERTIFICATE_WIDGET_H__ +#define __GCR_CERTIFICATE_WIDGET_H__ + +#include <glib-object.h> +#include <gtk/gtk.h> +#include <gcr/gcr-certificate.h> + +G_BEGIN_DECLS + +#define GCR_TYPE_CERTIFICATE_WIDGET gcr_certificate_widget_get_type () +G_DECLARE_FINAL_TYPE (GcrCertificateWidget, gcr_certificate_widget, GCR, CERTIFICATE_WIDGET, GtkBox) + +GtkWidget *gcr_certificate_widget_new (GcrCertificate *certificate); + +GcrCertificate *gcr_certificate_widget_get_certificate (GcrCertificateWidget *self); + +void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, + GcrCertificate *certificate); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_WIDGET_H__ */ diff --git a/ui/gcr-crypto-types.xml b/gcr-gtk3/gcr-crypto-types.xml index 4b5037b..2f402c9 100644 --- a/ui/gcr-crypto-types.xml +++ b/gcr-gtk3/gcr-crypto-types.xml @@ -166,3 +166,4 @@ </magic> </mime-type> </mime-info> + diff --git a/ui/gcr-list-selector-private.h b/gcr-gtk3/gcr-gtk3.h index b1c4739..53b5850 100644 --- a/ui/gcr-list-selector-private.h +++ b/gcr-gtk3/gcr-gtk3.h @@ -1,7 +1,7 @@ /* * gnome-keyring * - * Copyright (C) 2011 Collabora Ltd. + * Copyright (C) 2010 Collabora Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -19,21 +19,22 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#ifndef __GCR_LIST_SELECTOR_PRIVATE_H__ -#define __GCR_LIST_SELECTOR_PRIVATE_H__ +#ifndef GCR_API_SUBJECT_TO_CHANGE +#error "This API has not yet reached stability." +#endif -#include "gcr/gcr-types.h" +#ifndef __GCR_GTK3_H__ +#define __GCR_GTK3_H__ -#include "gcr-list-selector.h" -#include "gcr-live-search.h" +#include <glib.h> -#include <gtk/gtk.h> +#include <gcr/gcr.h> -G_BEGIN_DECLS +#define __GCR_INSIDE_HEADER__ -void _gcr_list_selector_set_live_search (GcrListSelector *self, - GcrLiveSearch *search); +#include <gcr-gtk3/gcr-certificate-widget.h> +#include <gcr-gtk3/gcr-secure-entry-buffer.h> -G_END_DECLS +#undef __GCR_INSIDE_HEADER__ -#endif /* __GCR_LIST_SELECTOR_PRIVATE_H__ */ +#endif /* __GCR_GTK3_H__ */ diff --git a/ui/gcr-ui.pc.in b/gcr-gtk3/gcr-gtk3.pc.in index 1b994d0..1b994d0 100644 --- a/ui/gcr-ui.pc.in +++ b/gcr-gtk3/gcr-gtk3.pc.in diff --git a/ui/gcr-ui.symbols b/gcr-gtk3/gcr-gtk3.symbols index d258eb5..d258eb5 100644 --- a/ui/gcr-ui.symbols +++ b/gcr-gtk3/gcr-gtk3.symbols diff --git a/gcr-gtk3/gcr-section.c b/gcr-gtk3/gcr-section.c new file mode 100644 index 0000000..24c1502 --- /dev/null +++ b/gcr-gtk3/gcr-section.c @@ -0,0 +1,204 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "gcr-section.h" + +struct _GcrSection +{ + GtkGrid parent_instance; + + GtkWidget *frame; + GtkWidget *label; + GtkWidget *image; + GtkWidget *listbox; + GtkSizeGroup *size_group; +}; + +G_DEFINE_TYPE (GcrSection, gcr_section, GTK_TYPE_GRID) + +enum { + PROP_TITLE = 1, + PROP_ICON, + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +static void +gcr_section_dispose (GObject *object) +{ + GcrSection *self = (GcrSection *)object; + + g_clear_object (&self->size_group); + /* g_clear_pointer (&self->label, gtk_widget_unparent); */ + /* g_clear_pointer (&self->image, gtk_widget_unparent); */ + /* g_clear_pointer (&self->frame, gtk_widget_unparent); */ + + G_OBJECT_CLASS (gcr_section_parent_class)->dispose (object); +} + +static void +gcr_section_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrSection *self = GCR_SECTION (object); + + switch (prop_id) + { + case PROP_TITLE: + g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->label))); + break; + case PROP_ICON: + { + GIcon *icon; + gtk_image_get_gicon (GTK_IMAGE (self->image), &icon, NULL); + g_value_set_object (value, icon); + } + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcr_section_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrSection *self = GCR_SECTION (object); + + switch (prop_id) + { + case PROP_TITLE: + gtk_label_set_label (GTK_LABEL (self->label), g_value_get_string (value)); + break; + case PROP_ICON: + if (!self->image) + { + self->image = gtk_image_new (); + gtk_grid_attach (GTK_GRID (self), self->image, 1, 0, 1, 1); + gtk_container_child_set (GTK_CONTAINER (self), self->frame, "width", 2, NULL); + } + + gtk_image_set_from_gicon (GTK_IMAGE (self->image), g_value_get_object (value), GTK_ICON_SIZE_BUTTON); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcr_section_class_init (GcrSectionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = gcr_section_dispose; + object_class->get_property = gcr_section_get_property; + object_class->set_property = gcr_section_set_property; + obj_properties[PROP_TITLE] = + g_param_spec_string ("title", + "Title", + "The title of the section", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + obj_properties[PROP_ICON] = + g_param_spec_object ("icon", + "Icon", + "The Icon to use", + G_TYPE_ICON, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, + N_PROPERTIES, + obj_properties); +} + +static void +gcr_section_init (GcrSection *self) +{ + gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL); + self->label = gtk_label_new (NULL); + g_object_set (G_OBJECT (self->label), + "margin-start", 12, + "margin-end", 12, + "margin-top", 8, + "margin-bottom", 8, + "xalign", 0.0, + "halign", GTK_ALIGN_START, + "hexpand", TRUE, + NULL); + gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "heading"); + gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "h4"); + self->listbox = gtk_list_box_new (); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->listbox), GTK_SELECTION_NONE); + self->frame = gtk_frame_new (NULL); + g_object_set (G_OBJECT (self->frame), + "child", self->listbox, + "hexpand", TRUE, + NULL); + self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_container_add (GTK_CONTAINER (self), self->label); + gtk_container_add (GTK_CONTAINER (self), self->frame); + + g_object_set (self, + "margin-start", 12, + "margin-end", 12, + "margin-top", 8, + "margin-bottom", 8, + NULL); +} + +GtkWidget * +gcr_section_new (const gchar *title) +{ + return g_object_new (GCR_TYPE_SECTION, "title", title, NULL); +} + +GtkWidget * +gcr_section_new_with_icon (const gchar *title, + GIcon *icon) +{ + return g_object_new (GCR_TYPE_SECTION, "title", title, "icon", icon, NULL); +} + +void +gcr_section_add_child (GcrSection *self, + const gchar *description, + GtkWidget *child) +{ + GtkWidget *row, *box, *label; + g_return_if_fail (GCR_IS_SECTION (self)); + + row = gtk_list_box_row_new (); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_container_add (GTK_CONTAINER (row), box); + label = gtk_label_new (description); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + g_object_set (label, + "margin-start", 12, + "margin-end", 12, + "margin-top", 8, + "margin-bottom", 8, + "xalign", 0.0, + "halign", GTK_ALIGN_START, + NULL); + gtk_style_context_add_class (gtk_widget_get_style_context (label), "caption"); + g_object_set (child, + "margin-start", 12, + "margin-end", 12, + "margin-top", 8, + "margin-bottom", 8, + "halign", GTK_ALIGN_END, + NULL); + gtk_size_group_add_widget (self->size_group, label); + gtk_container_add (GTK_CONTAINER (box), label); + gtk_container_add (GTK_CONTAINER (box), child); + gtk_container_add (GTK_CONTAINER (self->listbox), row); +} diff --git a/gcr-gtk3/gcr-section.h b/gcr-gtk3/gcr-section.h new file mode 100644 index 0000000..69950cc --- /dev/null +++ b/gcr-gtk3/gcr-section.h @@ -0,0 +1,29 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifndef __GCR_SECTION_H__ +#define __GCR_SECTION_H__ + +#include <glib.h> +#include <glib-object.h> +#include <gtk/gtk.h> + +G_BEGIN_DECLS + +#define GCR_TYPE_SECTION gcr_section_get_type() +G_DECLARE_FINAL_TYPE (GcrSection, gcr_section, GCR, SECTION, GtkGrid) + +GtkWidget *gcr_section_new (const gchar *title); +GtkWidget *gcr_section_new_with_icon (const gchar *title, + GIcon *icon); + +void gcr_section_add_child (GcrSection *self, + const gchar *description, + GtkWidget *child); + +G_END_DECLS + +#endif /* __GCR_SECTION_H__ */ diff --git a/ui/gcr-secure-entry-buffer.c b/gcr-gtk3/gcr-secure-entry-buffer.c index a209a22..a209a22 100644 --- a/ui/gcr-secure-entry-buffer.c +++ b/gcr-gtk3/gcr-secure-entry-buffer.c diff --git a/ui/gcr-secure-entry-buffer.h b/gcr-gtk3/gcr-secure-entry-buffer.h index c7a0c60..c7a0c60 100644 --- a/ui/gcr-secure-entry-buffer.h +++ b/gcr-gtk3/gcr-secure-entry-buffer.h diff --git a/ui/gcr.gresource.xml b/gcr-gtk3/gcr.gresource.xml index 3ab232d..3ab232d 100644 --- a/ui/gcr.gresource.xml +++ b/gcr-gtk3/gcr.gresource.xml diff --git a/ui/icons/16x16/gcr-gnupg.png b/gcr-gtk3/icons/16x16/gcr-gnupg.png Binary files differindex 6595ca1..6595ca1 100644 --- a/ui/icons/16x16/gcr-gnupg.png +++ b/gcr-gtk3/icons/16x16/gcr-gnupg.png diff --git a/ui/icons/16x16/gcr-key-pair.png b/gcr-gtk3/icons/16x16/gcr-key-pair.png Binary files differindex 5cabf18..5cabf18 100644 --- a/ui/icons/16x16/gcr-key-pair.png +++ b/gcr-gtk3/icons/16x16/gcr-key-pair.png diff --git a/ui/icons/16x16/gcr-key.png b/gcr-gtk3/icons/16x16/gcr-key.png Binary files differindex e4c2ccc..e4c2ccc 100644 --- a/ui/icons/16x16/gcr-key.png +++ b/gcr-gtk3/icons/16x16/gcr-key.png diff --git a/ui/icons/16x16/gcr-password.png b/gcr-gtk3/icons/16x16/gcr-password.png Binary files differindex 10f4142..10f4142 100644 --- a/ui/icons/16x16/gcr-password.png +++ b/gcr-gtk3/icons/16x16/gcr-password.png diff --git a/ui/icons/16x16/gcr-smart-card.png b/gcr-gtk3/icons/16x16/gcr-smart-card.png Binary files differindex 2860eb4..2860eb4 100644 --- a/ui/icons/16x16/gcr-smart-card.png +++ b/gcr-gtk3/icons/16x16/gcr-smart-card.png diff --git a/ui/icons/22x22/gcr-gnupg.png b/gcr-gtk3/icons/22x22/gcr-gnupg.png Binary files differindex 4210e97..4210e97 100644 --- a/ui/icons/22x22/gcr-gnupg.png +++ b/gcr-gtk3/icons/22x22/gcr-gnupg.png diff --git a/ui/icons/22x22/gcr-key-pair.png b/gcr-gtk3/icons/22x22/gcr-key-pair.png Binary files differindex 8787443..8787443 100644 --- a/ui/icons/22x22/gcr-key-pair.png +++ b/gcr-gtk3/icons/22x22/gcr-key-pair.png diff --git a/ui/icons/22x22/gcr-key.png b/gcr-gtk3/icons/22x22/gcr-key.png Binary files differindex 7c0a2a3..7c0a2a3 100644 --- a/ui/icons/22x22/gcr-key.png +++ b/gcr-gtk3/icons/22x22/gcr-key.png diff --git a/ui/icons/22x22/gcr-password.png b/gcr-gtk3/icons/22x22/gcr-password.png Binary files differindex b613f16..b613f16 100644 --- a/ui/icons/22x22/gcr-password.png +++ b/gcr-gtk3/icons/22x22/gcr-password.png diff --git a/ui/icons/22x22/gcr-smart-card.png b/gcr-gtk3/icons/22x22/gcr-smart-card.png Binary files differindex 8474ff6..8474ff6 100644 --- a/ui/icons/22x22/gcr-smart-card.png +++ b/gcr-gtk3/icons/22x22/gcr-smart-card.png diff --git a/ui/icons/24x24/gcr-gnupg.png b/gcr-gtk3/icons/24x24/gcr-gnupg.png Binary files differindex 27b5adf..27b5adf 100644 --- a/ui/icons/24x24/gcr-gnupg.png +++ b/gcr-gtk3/icons/24x24/gcr-gnupg.png diff --git a/ui/icons/24x24/gcr-key-pair.png b/gcr-gtk3/icons/24x24/gcr-key-pair.png Binary files differindex ec78b77..ec78b77 100644 --- a/ui/icons/24x24/gcr-key-pair.png +++ b/gcr-gtk3/icons/24x24/gcr-key-pair.png diff --git a/ui/icons/24x24/gcr-key.png b/gcr-gtk3/icons/24x24/gcr-key.png Binary files differindex a44b24b..a44b24b 100644 --- a/ui/icons/24x24/gcr-key.png +++ b/gcr-gtk3/icons/24x24/gcr-key.png diff --git a/ui/icons/24x24/gcr-password.png b/gcr-gtk3/icons/24x24/gcr-password.png Binary files differindex 5647789..5647789 100644 --- a/ui/icons/24x24/gcr-password.png +++ b/gcr-gtk3/icons/24x24/gcr-password.png diff --git a/ui/icons/24x24/gcr-smart-card.png b/gcr-gtk3/icons/24x24/gcr-smart-card.png Binary files differindex ce1b5ba..ce1b5ba 100644 --- a/ui/icons/24x24/gcr-smart-card.png +++ b/gcr-gtk3/icons/24x24/gcr-smart-card.png diff --git a/ui/icons/256x256/gcr-gnupg.png b/gcr-gtk3/icons/256x256/gcr-gnupg.png Binary files differindex 200a42a..200a42a 100644 --- a/ui/icons/256x256/gcr-gnupg.png +++ b/gcr-gtk3/icons/256x256/gcr-gnupg.png diff --git a/ui/icons/256x256/gcr-password.png b/gcr-gtk3/icons/256x256/gcr-password.png Binary files differindex 50f7fb1..50f7fb1 100644 --- a/ui/icons/256x256/gcr-password.png +++ b/gcr-gtk3/icons/256x256/gcr-password.png diff --git a/ui/icons/256x256/gcr-smart-card.png b/gcr-gtk3/icons/256x256/gcr-smart-card.png Binary files differindex ef5820d..ef5820d 100644 --- a/ui/icons/256x256/gcr-smart-card.png +++ b/gcr-gtk3/icons/256x256/gcr-smart-card.png diff --git a/ui/icons/32x32/gcr-gnupg.png b/gcr-gtk3/icons/32x32/gcr-gnupg.png Binary files differindex f151fdf..f151fdf 100644 --- a/ui/icons/32x32/gcr-gnupg.png +++ b/gcr-gtk3/icons/32x32/gcr-gnupg.png diff --git a/ui/icons/32x32/gcr-key-pair.png b/gcr-gtk3/icons/32x32/gcr-key-pair.png Binary files differindex 2ba1f15..2ba1f15 100644 --- a/ui/icons/32x32/gcr-key-pair.png +++ b/gcr-gtk3/icons/32x32/gcr-key-pair.png diff --git a/ui/icons/32x32/gcr-key.png b/gcr-gtk3/icons/32x32/gcr-key.png Binary files differindex af1abf7..af1abf7 100644 --- a/ui/icons/32x32/gcr-key.png +++ b/gcr-gtk3/icons/32x32/gcr-key.png diff --git a/ui/icons/32x32/gcr-password.png b/gcr-gtk3/icons/32x32/gcr-password.png Binary files differindex 0b96362..0b96362 100644 --- a/ui/icons/32x32/gcr-password.png +++ b/gcr-gtk3/icons/32x32/gcr-password.png diff --git a/ui/icons/32x32/gcr-smart-card.png b/gcr-gtk3/icons/32x32/gcr-smart-card.png Binary files differindex b4eaa92..b4eaa92 100644 --- a/ui/icons/32x32/gcr-smart-card.png +++ b/gcr-gtk3/icons/32x32/gcr-smart-card.png diff --git a/ui/icons/48x48/gcr-gnupg.png b/gcr-gtk3/icons/48x48/gcr-gnupg.png Binary files differindex 56ddfef..56ddfef 100644 --- a/ui/icons/48x48/gcr-gnupg.png +++ b/gcr-gtk3/icons/48x48/gcr-gnupg.png diff --git a/ui/icons/48x48/gcr-key-pair.png b/gcr-gtk3/icons/48x48/gcr-key-pair.png Binary files differindex 6a373e6..6a373e6 100644 --- a/ui/icons/48x48/gcr-key-pair.png +++ b/gcr-gtk3/icons/48x48/gcr-key-pair.png diff --git a/ui/icons/48x48/gcr-key.png b/gcr-gtk3/icons/48x48/gcr-key.png Binary files differindex 939fbb7..939fbb7 100644 --- a/ui/icons/48x48/gcr-key.png +++ b/gcr-gtk3/icons/48x48/gcr-key.png diff --git a/ui/icons/48x48/gcr-password.png b/gcr-gtk3/icons/48x48/gcr-password.png Binary files differindex 8c13323..8c13323 100644 --- a/ui/icons/48x48/gcr-password.png +++ b/gcr-gtk3/icons/48x48/gcr-password.png diff --git a/ui/icons/48x48/gcr-smart-card.png b/gcr-gtk3/icons/48x48/gcr-smart-card.png Binary files differindex 6cd16f6..6cd16f6 100644 --- a/ui/icons/48x48/gcr-smart-card.png +++ b/gcr-gtk3/icons/48x48/gcr-smart-card.png diff --git a/ui/icons/meson.build b/gcr-gtk3/icons/meson.build index fe7953b..fe7953b 100644 --- a/ui/icons/meson.build +++ b/gcr-gtk3/icons/meson.build diff --git a/ui/icons/render-icons.py b/gcr-gtk3/icons/render-icons.py index cc5be3a..650d1a6 100755 --- a/ui/icons/render-icons.py +++ b/gcr-gtk3/icons/render-icons.py @@ -12,8 +12,8 @@ import subprocess INKSCAPE = '/usr/bin/inkscape' OPTIPNG = '/usr/bin/optipng' -SRC = 'ui/icons/src' -OUT = 'ui/icons' +SRC = 'gcr-gtk3/icons/src' +OUT = 'gcr-gtk3/icons' inkscape_process = None diff --git a/ui/icons/src/gcr-gnupg.svg b/gcr-gtk3/icons/src/gcr-gnupg.svg index ce68a4b..ce68a4b 100644 --- a/ui/icons/src/gcr-gnupg.svg +++ b/gcr-gtk3/icons/src/gcr-gnupg.svg diff --git a/ui/icons/src/gcr-key-and-keypair.svg b/gcr-gtk3/icons/src/gcr-key-and-keypair.svg index 0ccbbb7..0ccbbb7 100644 --- a/ui/icons/src/gcr-key-and-keypair.svg +++ b/gcr-gtk3/icons/src/gcr-key-and-keypair.svg diff --git a/ui/icons/src/gcr-password.svg b/gcr-gtk3/icons/src/gcr-password.svg index d5fc9b4..d5fc9b4 100644 --- a/ui/icons/src/gcr-password.svg +++ b/gcr-gtk3/icons/src/gcr-password.svg diff --git a/ui/icons/src/gcr-smart-card.svg b/gcr-gtk3/icons/src/gcr-smart-card.svg index 51a3761..51a3761 100644 --- a/ui/icons/src/gcr-smart-card.svg +++ b/gcr-gtk3/icons/src/gcr-smart-card.svg diff --git a/gcr/libgcr-base.map b/gcr-gtk3/libgcr-gtk3.map index 4a16138..4a16138 100644 --- a/gcr/libgcr-base.map +++ b/gcr-gtk3/libgcr-gtk3.map diff --git a/gcr-gtk3/meson.build b/gcr-gtk3/meson.build new file mode 100644 index 0000000..5737586 --- /dev/null +++ b/gcr-gtk3/meson.build @@ -0,0 +1,156 @@ +subdir('icons') + +gcr_gtk3_headers_install_dir = gcr_headers_subdir / 'gcr-gtk3' + +gcr_gtk3_public_sources = files( + 'gcr-certificate-widget.c', + 'gcr-secure-entry-buffer.c', +) + +gcr_gtk3_private_sources = files( + 'gcr-section.c', +) + +gcr_gtk3_headers = files( + 'gcr-gtk3.h', + 'gcr-certificate-widget.h', + 'gcr-secure-entry-buffer.h', +) + +# Generated sources +gcr_gtk3_enums_gen = gnome.mkenums_simple('gcr-enum-types', + sources: gcr_gtk3_headers, + install_header: true, + install_dir: get_option('includedir') / gcr_gtk3_headers_install_dir, +) + +gcr_gtk3_sources = [ + gcr_gtk3_private_sources, + gcr_gtk3_public_sources, + gcr_gtk3_enums_gen, +] + +gcr_gtk3_deps = [ + glib_deps, + p11kit_dep, + libegg_dep, + gck_dep, + gcr_dep, + gtk3_dep, +] + +gcr_gtk3_cflags = [ + '-DG_LOG_DOMAIN="Gcr"', + '-DGCR_COMPILATION', + '-DGCR_API_SUBJECT_TO_CHANGE', + '-DGCK_API_SUBJECT_TO_CHANGE', + '-DP11_KIT_API_SUBJECT_TO_CHANGE', +] + +gcr_gtk3_symbolmap = meson.current_source_dir() / 'libgcr-gtk3.map' +gcr_gtk3_linkflags = cc.get_supported_link_arguments( + '-Wl,--version-script,@0@'.format(gcr_gtk3_symbolmap), +) + +gcr_gtk3_lib = shared_library(gcr_gtk3_basename, + gcr_gtk3_sources, + dependencies: gcr_gtk3_deps, + c_args: gcr_gtk3_cflags, + link_args: gcr_gtk3_linkflags, + link_depends: gcr_gtk3_symbolmap, + include_directories: config_h_dir, + version: gcr_version, + soversion: gcr_soversion, + install: true, +) + +gcr_gtk3_pkgconf_deps = [ + glib_dep, + gio_dep, + gobject_dep, + gck_lib, + gcr_lib, + gtk3_dep, +] + +pkgconfig.generate(gcr_gtk3_lib, + subdirs: gcr_headers_subdir, + requires: gcr_gtk3_pkgconf_deps, + description: 'GObject and GUI library for high level crypto parsing and display', +) + +install_headers(gcr_gtk3_headers, + subdir: gcr_gtk3_headers_install_dir, +) + +gcr_gtk3_dep = declare_dependency( + link_with: gcr_gtk3_lib, + sources: gcr_gtk3_enums_gen[1], # Make sure gcr-enum-types.h can be included +) + +if get_option('introspection') + gcr_gtk3_gir = gnome.generate_gir(gcr_gtk3_lib, + sources: [ gcr_gtk3_headers, gcr_gtk3_public_sources ], + namespace: 'GcrGtk3', + nsversion: gcr_api_version, + export_packages: gcr_gtk3_basename, + identifier_prefix: 'Gcr', + symbol_prefix: 'gcr', + includes: [ + 'GObject-2.0', + 'Gio-2.0', + 'Gtk-3.0', + gck_gir[0], + gcr_gir[0], + ], + header: 'gcr-gtk3/gcr-gtk3.h', + extra_args: [ + '-DGCR_COMPILATION', + '-DGCR_API_SUBJECT_TO_CHANGE', + ], + install: true, + ) + + gcr_gtk3_vapi = gnome.generate_vapi(gcr_gtk3_basename, + sources: gcr_gtk3_gir[0], + packages: [ + 'glib-2.0', + 'gio-2.0', + gck_vapi, + gcr_vapi, + 'gtk+-3.0' + ], + vapi_dirs: [ + build_root / 'gck', + build_root / 'gcr', + ], + gir_dirs: [ + build_root / 'gck', + build_root / 'gcr', + ], + install: true, + ) +endif + +# Register new mime types +install_data('gcr-crypto-types.xml', + install_dir: get_option('datadir') / 'mime' / 'packages', +) + +# Manual UI testing programs +gcr_gtk3_manual_tests = [ + 'frob-certificate', +] + +gcr_gtk3_test_cflags = [ + '-DSRCDIR="@0@"'.format(source_root), +] + +foreach _test : gcr_gtk3_manual_tests + test_bin = executable('test-'+_test, + '@0@.c'.format(_test), + dependencies: [ gcr_gtk3_deps, gcr_gtk3_dep ], + c_args: [ gcr_gtk3_cflags, gcr_gtk3_test_cflags ], + include_directories: config_h_dir, + ) +endforeach diff --git a/gcr-gtk4/gcr-certificate-widget.c b/gcr-gtk4/gcr-certificate-widget.c new file mode 100644 index 0000000..58e3e55 --- /dev/null +++ b/gcr-gtk4/gcr-certificate-widget.c @@ -0,0 +1,684 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "config.h" + +#include <glib/gi18n-lib.h> + +#include <gcr-gtk4/gcr-certificate-widget.h> +#include "gcr/gcr-certificate-extensions.h" +#include "gcr/gcr-fingerprint.h" +#include "gcr/gcr-oids.h" + +#include "gcr-section.h" + +#include "egg/egg-asn1x.h" +#include "egg/egg-asn1-defs.h" +#include "egg/egg-dn.h" +#include "egg/egg-oid.h" +#include "egg/egg-hex.h" + +struct _GcrCertificateWidget +{ + GtkWidget parent_instance; + + GcrCertificate *certificate; + GtkWidget *reveal_button; + GtkWidget *revealer; + GtkWidget *secondary_info; + GtkSizeGroup *size_group; +}; + +G_DEFINE_TYPE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_WIDGET) + +enum { + PROP_CERTIFICATE = 1, + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +static void +gcr_certificate_widget_finalize (GObject *object) +{ + GtkWidget *child; + GcrCertificateWidget *self = (GcrCertificateWidget *)object; + + g_clear_object (&self->size_group); + while ((child = gtk_widget_get_first_child (GTK_WIDGET (self)))) { + gtk_widget_unparent (child); + } + + G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (object); +} + +static void +gcr_certificate_widget_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object); + + switch (prop_id) + { + case PROP_CERTIFICATE: + g_value_set_object (value, gcr_certificate_widget_get_certificate (self)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gcr_certificate_widget_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (object); + + switch (prop_id) + { + case PROP_CERTIFICATE: + gcr_certificate_widget_set_certificate (self, g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = gcr_certificate_widget_finalize; + object_class->get_property = gcr_certificate_widget_get_property; + object_class->set_property = gcr_certificate_widget_set_property; + + obj_properties[PROP_CERTIFICATE] = + g_param_spec_object ("certificate", + "Certificate", + "Certificate to display.", + GCR_TYPE_CERTIFICATE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, + N_PROPERTIES, + obj_properties); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT); +} + +static void +on_reveal_button_clicked (GtkWidget *button, + GcrCertificateWidget *self) +{ + g_assert (GCR_IS_CERTIFICATE_WIDGET (self)); + gtk_widget_hide (button); + gtk_revealer_set_reveal_child (GTK_REVEALER (self->revealer), TRUE); +} + +static void +gcr_certificate_widget_init (GcrCertificateWidget *self) +{ + gtk_orientable_set_orientation (GTK_ORIENTABLE (gtk_widget_get_layout_manager (GTK_WIDGET (self))), GTK_ORIENTATION_VERTICAL); + self->reveal_button = gtk_button_new_with_label ("…"); + gtk_widget_set_halign (self->reveal_button, GTK_ALIGN_CENTER); + gtk_widget_insert_before (self->reveal_button, GTK_WIDGET (self), NULL); + self->secondary_info = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + self->revealer = g_object_new (GTK_TYPE_REVEALER, + "child", self->secondary_info, + "transition-type", GTK_REVEALER_TRANSITION_TYPE_SLIDE_DOWN, + NULL); + gtk_widget_insert_after (self->revealer, GTK_WIDGET (self), self->reveal_button); + g_signal_connect (self->reveal_button, "clicked", G_CALLBACK (on_reveal_button_clicked), self); + self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); +} + +static GtkWidget* +_gcr_certificate_widget_add_section (GcrCertificateWidget *self, + const gchar *title, + GIcon *icon, + gboolean important) +{ + GtkWidget *widget; + + g_assert (GCR_IS_CERTIFICATE_WIDGET (self)); + + if (icon) + widget = gcr_section_new_with_icon (title, icon); + else + widget = gcr_section_new (title); + + gtk_size_group_add_widget (self->size_group, widget); + if (important) + gtk_widget_insert_before (widget, GTK_WIDGET (self), self->reveal_button); + else + gtk_box_append (GTK_BOX (self->secondary_info), widget); + + return widget; +} + +static GtkWidget* +create_value_label (const gchar *label) +{ + return g_object_new (GTK_TYPE_LABEL, + "label", label, + "xalign", 1.0, + "halign", GTK_ALIGN_END, + "hexpand", TRUE, + "selectable", TRUE, + "wrap", TRUE, + NULL); +} + +static gchar* +calculate_label (GcrCertificateWidget *self) +{ + gchar *label; + + label = gcr_certificate_get_subject_cn (self->certificate); + if (label != NULL) + return label; + + return g_strdup (_("Certificate")); +} + +static void +on_parsed_dn_part (guint index, + GQuark oid, + GNode *value, + gpointer user_data) +{ + GtkWidget *section = user_data; + const gchar *attr; + const gchar *desc; + gchar *field = NULL; + gchar *display; + + attr = egg_oid_get_name (oid); + desc = egg_oid_get_description (oid); + + /* Combine them into something sane */ + if (attr && desc) { + if (strcmp (attr, desc) == 0) + field = g_strdup (attr); + else + field = g_strdup_printf ("%s (%s)", attr, desc); + } else if (!attr && !desc) { + field = g_strdup (""); + } else if (attr) { + field = g_strdup (attr); + } else if (desc) { + field = g_strdup (desc); + } else { + g_assert_not_reached (); + } + + display = egg_dn_print_value (oid, value); + if (display == NULL) + display = g_strdup (""); + + gcr_section_add_child (GCR_SECTION (section), field, create_value_label (display)); + + g_free (field); + g_free (display); +} + +static inline gchar * +hex_encode_bytes (GBytes *bytes) +{ + gsize size; + gconstpointer data = g_bytes_get_data (bytes, &size); + return egg_hex_encode_full (data, size, TRUE, " ", 1); +} + +static void +append_subject_public_key (GcrCertificateWidget *self, + GcrSection *section, + GNode *subject_public_key) +{ + guint key_nbits; + const gchar *text; + gchar *display; + GBytes *value; + guchar *raw; + gsize n_raw; + GQuark oid; + guint bits; + + key_nbits = gcr_certificate_get_key_size (self->certificate); + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key, + "algorithm", "algorithm", NULL)); + text = egg_oid_get_description (oid); + gcr_section_add_child (section, _("Key Algorithm"), create_value_label (text)); + + value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key, + "algorithm", "parameters", NULL)); + if (value) { + display = hex_encode_bytes (value); + gcr_section_add_child (section, _("Key Parameters"), create_value_label (display)); + g_clear_pointer (&display, g_free); + g_bytes_unref (value); + } + + if (key_nbits > 0) { + display = g_strdup_printf ("%u", key_nbits); + gcr_section_add_child (section, _("Key Size"), create_value_label (display)); + g_clear_pointer (&display, g_free); + } + + value = egg_asn1x_get_element_raw (subject_public_key); + raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL), + g_bytes_get_size (value), + G_CHECKSUM_SHA1, &n_raw); + g_bytes_unref (value); + display = egg_hex_encode_full (raw, n_raw, TRUE, " ", 1); + g_free (raw); + gcr_section_add_child (section, _("Key SHA1 Fingerprint"), create_value_label (text)); + g_clear_pointer (&display, g_free); + + value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits); + display = egg_hex_encode_full (g_bytes_get_data (value, NULL), bits / 8, TRUE, " ", 1); + gcr_section_add_child (section, _("Public Key"), create_value_label (text)); + g_clear_pointer (&display, g_free); + g_bytes_unref (value); +} + +static GcrSection * +append_extension_basic_constraints (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + gboolean is_ca = FALSE; + gint path_len = -1; + gchar *number; + + if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len)) + return NULL; + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Basic Constraints"), NULL, FALSE)); + gcr_section_add_child (section, _("Certificate Authority"), create_value_label (is_ca ? _("Yes") : _("No"))); + + number = g_strdup_printf ("%d", path_len); + gcr_section_add_child (section, _("Max Path Length"), create_value_label (path_len < 0 ? _("Unlimited") : number)); + g_free (number); + + return section; +} + +static GcrSection * +append_extension_extended_key_usage (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + GQuark *oids; + GString *text; + guint i; + + oids = _gcr_certificate_extension_extended_key_usage (data); + if (oids == NULL) + return NULL; + + text = g_string_new (""); + for (i = 0; oids[i] != 0; i++) { + if (i > 0) + g_string_append_unichar (text, '\n'); + g_string_append (text, egg_oid_get_description (oids[i])); + } + + g_free (oids); + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extended Key Usage"), NULL, FALSE)); + gcr_section_add_child (section, _("Allowed Purposes"), create_value_label (text->str)); + + g_string_free (text, TRUE); + + return section; +} + +static GcrSection * +append_extension_subject_key_identifier (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + gpointer keyid; + gsize n_keyid; + + keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid); + if (keyid == NULL) + return NULL; + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Key Identifier"), NULL, FALSE)); + gchar *display = egg_hex_encode_full (keyid, n_keyid, TRUE, " ", 1); + g_free (keyid); + gcr_section_add_child (section, _("Key Identifier"), create_value_label (display)); + g_free (display); + + return section; +} + +static const struct { + guint usage; + const gchar *description; +} usage_descriptions[] = { + { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") }, + { GCR_KEY_USAGE_NON_REPUDIATION, N_("Non repudiation") }, + { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") }, + { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") }, + { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") }, + { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") }, + { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") }, + { GCR_KEY_USAGE_ENCIPHER_ONLY, N_("Encipher only") }, + { GCR_KEY_USAGE_DECIPHER_ONLY, N_("Decipher only") } +}; + +static GcrSection * +append_extension_key_usage (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + gulong key_usage; + GString *text; + guint i; + + if (!_gcr_certificate_extension_key_usage (data, &key_usage)) + return NULL; + + text = g_string_new (""); + + for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) { + if (key_usage & usage_descriptions[i].usage) { + if (text->len > 0) + g_string_append_unichar (text, '\n'); + g_string_append (text, _(usage_descriptions[i].description)); + } + } + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Key Usage"), NULL, FALSE)); + gcr_section_add_child (section, _("Usages"), create_value_label (text->str)); + + g_string_free (text, TRUE); + + return section; +} + +static GcrSection * +append_extension_subject_alt_name (GcrCertificateWidget *self, + GBytes *data) +{ + GcrSection *section; + GArray *general_names; + GcrGeneralName *general; + guint i; + + general_names = _gcr_certificate_extension_subject_alt_name (data); + if (general_names == NULL) + return FALSE; + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Subject Alternative Names"), NULL, FALSE)); + + for (i = 0; i < general_names->len; i++) { + general = &g_array_index (general_names, GcrGeneralName, i); + if (general->display == NULL) { + gchar *display = hex_encode_bytes (general->raw); + gcr_section_add_child (section, general->description, create_value_label (display)); + g_free (display); + } else + gcr_section_add_child (section, general->description, create_value_label (general->display)); + } + + _gcr_general_names_free (general_names); + + return section; +} + +static GcrSection * +append_extension_hex (GcrCertificateWidget *self, + GQuark oid, + GBytes *value) +{ + GcrSection *section; + const gchar *text; + gchar *display; + + section = GCR_SECTION (_gcr_certificate_widget_add_section (self, _("Extension"), NULL, FALSE)); + + /* Extension type */ + text = egg_oid_get_description (oid); + gcr_section_add_child (section, _("Identifier"), create_value_label (text)); + display = hex_encode_bytes (value); + gcr_section_add_child (section, _("Value"), create_value_label (display)); + g_free (display); + + return section; +} + +static void +append_extension (GcrCertificateWidget *self, + GNode *node) +{ + GQuark oid; + GBytes *value; + gboolean critical; + GcrSection *section = NULL; + + /* Dig out the OID */ + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL)); + g_return_if_fail (oid); + + /* Extension value */ + value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL)); + + /* The custom parsers */ + if (oid == GCR_OID_BASIC_CONSTRAINTS) + section = append_extension_basic_constraints (self, value); + else if (oid == GCR_OID_EXTENDED_KEY_USAGE) + section = append_extension_extended_key_usage (self, value); + else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER) + section = append_extension_subject_key_identifier (self, value); + else if (oid == GCR_OID_KEY_USAGE) + section = append_extension_key_usage (self, value); + else if (oid == GCR_OID_SUBJECT_ALT_NAME) + section = append_extension_subject_alt_name (self, value); + + /* Otherwise the default raw display */ + if (!section) { + section = append_extension_hex (self, oid, value); + } + + /* Critical */ + if (section && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) { + gcr_section_add_child (section, _("Critical"), create_value_label (critical ? _("Yes") : _("No"))); + } + + g_bytes_unref (value); +} + +/** + * gcr_certificate_widget_new: + * @certificate: (nullable): certificate to display, or %NULL + * + * Create a new certificate widget which displays a given certificate. + * + * Returns: (transfer full): a newly allocated #GcrCertificateWidget, which + * should be freed with g_object_unref() + */ +GtkWidget * +gcr_certificate_widget_new (GcrCertificate *certificate) +{ + return g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, "certificate", certificate, NULL); +} + +/** + * gcr_certificate_widget_get_certificate: + * @self: The certificate widget + * + * Get the certificate displayed in the widget. + * + * Returns: (nullable) (transfer none): the certificate + */ +GcrCertificate * +gcr_certificate_widget_get_certificate (GcrCertificateWidget *self) +{ + g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL); + return self->certificate; +} + +/** + * gcr_certificate_widget_set_certificate: + * @self: The certificate widget + * @certificate: (nullable): the certificate to display + * + * Set the certificate displayed in the widget + */ +void +gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, GcrCertificate *certificate) +{ + GtkWidget *section, *label; + PangoAttrList *attributes; + gchar *display; + GIcon *icon; + GBytes *bytes, *number; + GNode *asn, *subject_public_key; + GQuark oid; + gconstpointer data; + gsize n_data; + GDate date; + gulong version; + guint bits, index; + + g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self)); + + g_set_object (&self->certificate, certificate); + + data = gcr_certificate_get_der_data (self->certificate, &n_data); + if (!data) { + g_set_object (&self->certificate, NULL); + } + + icon = gcr_certificate_get_icon (self->certificate); + display = calculate_label (self); + section = _gcr_certificate_widget_add_section (self, display, icon, TRUE); + g_clear_pointer (&display, g_free); + g_object_unref (icon); + + bytes = g_bytes_new_static (data, n_data); + asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes); + g_bytes_unref (bytes); + + display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN"); + gcr_section_add_child (GCR_SECTION (section), _("Identity"), create_value_label (display)); + g_clear_pointer (&display, g_free); + + display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN"); + gcr_section_add_child (GCR_SECTION (section), _("Verified by"), create_value_label (display)); + g_clear_pointer (&display, g_free); + + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) { + display = g_malloc0 (128); + if (!g_date_strftime (display, 128, "%x", &date)) + g_return_if_reached (); + gcr_section_add_child (GCR_SECTION (section), _("Expires"), create_value_label (display)); + g_clear_pointer (&display, g_free); + } + + /* The subject */ + section = _gcr_certificate_widget_add_section (self, _("Subject Name"), NULL, FALSE); + egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), on_parsed_dn_part, section); + + /* The Issuer */ + section = _gcr_certificate_widget_add_section (self, _("Issuer Name"), NULL, FALSE); + egg_dn_parse (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), on_parsed_dn_part, section); + + /* The Issued Parameters */ + section = _gcr_certificate_widget_add_section (self, _("Issued Certificate"), NULL, FALSE); + + if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version)) { + g_critical ("Unable to parse certificate version"); + } else { + display = g_strdup_printf ("%lu", version + 1); + gcr_section_add_child (GCR_SECTION (section), _("Version"), create_value_label (display)); + g_clear_pointer (&display, g_free); + } + + number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL)); + if (!number) { + g_critical ("Unable to parse certificate serial number"); + } else { + display = hex_encode_bytes (number); + gcr_section_add_child (GCR_SECTION (section), _("Serial Number"), create_value_label (display)); + g_clear_pointer (&display, g_free); + g_bytes_unref (number); + } + + display = g_malloc0 (128); + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) { + if (!g_date_strftime (display, 128, "%x", &date)) + g_return_if_reached (); + gcr_section_add_child (GCR_SECTION (section), _("Not Valid Before"), create_value_label (display)); + } + if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) { + if (!g_date_strftime (display, 128, "%x", &date)) + g_return_if_reached (); + gcr_section_add_child (GCR_SECTION (section), _("Not Valid After"), create_value_label (display)); + } + g_clear_pointer (&display, g_free); + + /* Fingerprints */ + section = _gcr_certificate_widget_add_section (self, _("Certificate Fingerprints"), NULL, FALSE); + display = g_compute_checksum_for_bytes (G_CHECKSUM_SHA1, bytes); + gcr_section_add_child (GCR_SECTION (section), "SHA1", create_value_label (display)); + g_clear_pointer (&display, g_free); + display = g_compute_checksum_for_bytes (G_CHECKSUM_MD5, bytes); + gcr_section_add_child (GCR_SECTION (section), "MD5", create_value_label (display)); + g_clear_pointer (&display, g_free); + + /* Public Key Info */ + section = _gcr_certificate_widget_add_section (self, _("Public Key Info"), NULL, FALSE); + subject_public_key = egg_asn1x_node (asn, "tbsCertificate", "subjectPublicKeyInfo", NULL); + append_subject_public_key (self, GCR_SECTION (section), subject_public_key); + + /* Extensions */ + for (index = 1; TRUE; ++index) { + GNode *extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL); + if (extension == NULL) + break; + append_extension (self, extension); + } + + /* Signature */ + section = _gcr_certificate_widget_add_section (self, _("Signature"), NULL, FALSE); + + oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL)); + gcr_section_add_child (GCR_SECTION (section), _("Signature Algorithm"), create_value_label (egg_oid_get_description (oid))); + + bytes = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL)); + if (bytes) { + display = hex_encode_bytes (bytes); + gcr_section_add_child (GCR_SECTION (section), _("Signature Parameters"), create_value_label (display)); + g_clear_pointer (&display, g_free); + g_bytes_unref (bytes); + } + + bytes = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits); + display = egg_hex_encode_full (g_bytes_get_data (bytes, NULL), bits / 8, TRUE, " ", 1); + g_bytes_unref (bytes); + label = create_value_label (display); + attributes = pango_attr_list_new (); + pango_attr_list_insert (attributes, pango_attr_family_new ("Monospace")); + gtk_label_set_attributes (GTK_LABEL (label), attributes); + pango_attr_list_unref (attributes); + gcr_section_add_child (GCR_SECTION (section), _("Signature"), label); + g_clear_pointer (&display, g_free); + + egg_asn1x_destroy (asn); +} diff --git a/gcr-gtk4/gcr-certificate-widget.h b/gcr-gtk4/gcr-certificate-widget.h new file mode 100644 index 0000000..fb36733 --- /dev/null +++ b/gcr-gtk4/gcr-certificate-widget.h @@ -0,0 +1,30 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifndef __GCR_CERTIFICATE_WIDGET_H__ +#define __GCR_CERTIFICATE_WIDGET_H__ + +#include <gck/gck.h> +#include <gcr/gcr.h> + +#include <glib-object.h> +#include <gtk/gtk.h> + +G_BEGIN_DECLS + +#define GCR_TYPE_CERTIFICATE_WIDGET gcr_certificate_widget_get_type () +G_DECLARE_FINAL_TYPE (GcrCertificateWidget, gcr_certificate_widget, GCR, CERTIFICATE_WIDGET, GtkWidget) + +GtkWidget *gcr_certificate_widget_new (GcrCertificate *certificate); + +GcrCertificate *gcr_certificate_widget_get_certificate (GcrCertificateWidget *self); + +void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, + GcrCertificate *certificate); + +G_END_DECLS + +#endif /* __GCR_CERTIFICATE_WIDGET_H__ */ diff --git a/gcr-gtk4/gcr-gtk4.h b/gcr-gtk4/gcr-gtk4.h new file mode 100644 index 0000000..f94bf92 --- /dev/null +++ b/gcr-gtk4/gcr-gtk4.h @@ -0,0 +1,20 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifndef __GCR_GTK4_H__ +#define __GCR_GTK4_H__ + +#include <glib.h> + +#include <gcr/gcr.h> + +#define __GCR_GTK4_INSIDE_HEADER__ + +#include <gcr-gtk4/gcr-certificate-widget.h> + +#undef __GCR_GTK4_INSIDE_HEADER__ + +#endif /* __GCR_GTK4_H__ */ diff --git a/gcr-gtk4/gcr-section.c b/gcr-gtk4/gcr-section.c new file mode 100644 index 0000000..33aa1c3 --- /dev/null +++ b/gcr-gtk4/gcr-section.c @@ -0,0 +1,222 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "gcr-section.h" + +struct _GcrSection +{ + GtkWidget parent_instance; + + GtkWidget *frame; + GtkWidget *label; + GtkWidget *image; + GtkWidget *listbox; + GtkSizeGroup *size_group; +}; + +G_DEFINE_TYPE (GcrSection, gcr_section, GTK_TYPE_WIDGET) + +enum { + PROP_TITLE = 1, + PROP_ICON, + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +static void +gcr_section_dispose (GObject *object) +{ + GcrSection *self = (GcrSection *)object; + + g_clear_object (&self->size_group); + g_clear_pointer (&self->label, gtk_widget_unparent); + g_clear_pointer (&self->image, gtk_widget_unparent); + g_clear_pointer (&self->frame, gtk_widget_unparent); + + G_OBJECT_CLASS (gcr_section_parent_class)->dispose (object); +} + +static void +gcr_section_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GcrSection *self = GCR_SECTION (object); + + switch (prop_id) + { + case PROP_TITLE: + g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->label))); + break; + case PROP_ICON: + g_value_set_object (value, gtk_image_get_gicon (GTK_IMAGE (self->image))); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcr_section_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GcrSection *self = GCR_SECTION (object); + + switch (prop_id) + { + case PROP_TITLE: + gtk_label_set_label (GTK_LABEL (self->label), g_value_get_string (value)); + break; + case PROP_ICON: + if (!self->image) + { + GtkLayoutManager *layout_manager; + GtkLayoutChild *child; + + self->image = gtk_image_new (); + gtk_widget_insert_after (self->image, GTK_WIDGET (self), self->label); + layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (self)); + + child = gtk_layout_manager_get_layout_child (layout_manager, self->image); + g_object_set (G_OBJECT (child), + "column", 1, + NULL); + + child = gtk_layout_manager_get_layout_child (layout_manager, self->frame); + g_object_set (G_OBJECT (child), + "column-span", 2, + NULL); + } + + gtk_image_set_from_gicon (GTK_IMAGE (self->image), g_value_get_object (value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +gcr_section_class_init (GcrSectionClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = gcr_section_dispose; + object_class->get_property = gcr_section_get_property; + object_class->set_property = gcr_section_set_property; + obj_properties[PROP_TITLE] = + g_param_spec_string ("title", + "Title", + "The title of the section", + NULL, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + obj_properties[PROP_ICON] = + g_param_spec_object ("icon", + "Icon", + "The Icon to use", + G_TYPE_ICON, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); + + g_object_class_install_properties (object_class, + N_PROPERTIES, + obj_properties); + + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_GRID_LAYOUT); +} + +static void +gcr_section_init (GcrSection *self) +{ + GtkLayoutManager *layout_manager; + GtkLayoutChild *child; + + self->label = gtk_label_new (NULL); + g_object_set (G_OBJECT (self->label), + "margin-start", 12, + "margin-end", 12, + "margin-top", 8, + "margin-bottom", 8, + "xalign", 0.0, + "halign", GTK_ALIGN_START, + "hexpand", TRUE, + NULL); + gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "caption-heading"); + self->listbox = gtk_list_box_new (); + gtk_list_box_set_selection_mode (GTK_LIST_BOX (self->listbox), GTK_SELECTION_NONE); + self->frame = gtk_frame_new (NULL); + g_object_set (G_OBJECT (self->frame), + "child", self->listbox, + "hexpand", TRUE, + NULL); + self->size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); + gtk_widget_insert_after (self->label, GTK_WIDGET (self), NULL); + gtk_widget_insert_after (self->frame, GTK_WIDGET (self), self->label); + layout_manager = gtk_widget_get_layout_manager (GTK_WIDGET (self)); + + child = gtk_layout_manager_get_layout_child (layout_manager, self->frame); + g_object_set (G_OBJECT (child), + "row", 1, + NULL); + g_object_set (self, + "margin-start", 12, + "margin-end", 12, + "margin-top", 8, + "margin-bottom", 8, + NULL); +} + +GtkWidget * +gcr_section_new (const gchar *title) +{ + return g_object_new (GCR_TYPE_SECTION, "title", title, NULL); +} + +GtkWidget * +gcr_section_new_with_icon (const gchar *title, + GIcon *icon) +{ + return g_object_new (GCR_TYPE_SECTION, "title", title, "icon", icon, NULL); +} + +void +gcr_section_add_child (GcrSection *self, + const gchar *description, + GtkWidget *child) +{ + GtkWidget *row, *box, *label; + g_return_if_fail (GCR_IS_SECTION (self)); + + row = gtk_list_box_row_new (); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); + gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), box); + label = gtk_label_new (description); + gtk_label_set_xalign (GTK_LABEL (label), 0.0); + g_object_set (label, + "margin-start", 12, + "margin-end", 12, + "margin-top", 8, + "margin-bottom", 8, + "xalign", 0.0, + "halign", GTK_ALIGN_START, + NULL); + gtk_style_context_add_class (gtk_widget_get_style_context (label), "caption"); + g_object_set (child, + "margin-start", 12, + "margin-end", 12, + "margin-top", 8, + "margin-bottom", 8, + "halign", GTK_ALIGN_END, + NULL); + gtk_size_group_add_widget (self->size_group, label); + gtk_box_append (GTK_BOX (box), label); + gtk_box_append (GTK_BOX (box), child); + gtk_list_box_insert (GTK_LIST_BOX (self->listbox), row, -1); +} diff --git a/gcr-gtk4/gcr-section.h b/gcr-gtk4/gcr-section.h new file mode 100644 index 0000000..9f275d9 --- /dev/null +++ b/gcr-gtk4/gcr-section.h @@ -0,0 +1,30 @@ +/* + * Copyright 2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#ifndef __GCR_SECTION_H__ +#define __GCR_SECTION_H__ + +#include <glib.h> +#include <glib-object.h> +#include <gtk/gtk.h> + +G_BEGIN_DECLS + +#define GCR_TYPE_SECTION gcr_section_get_type() + +G_DECLARE_FINAL_TYPE (GcrSection, gcr_section, GCR, SECTION, GtkWidget) + +GtkWidget *gcr_section_new (const gchar *title); +GtkWidget *gcr_section_new_with_icon (const gchar *title, + GIcon *icon); + +void gcr_section_add_child (GcrSection *self, + const gchar *description, + GtkWidget *child); + +G_END_DECLS + +#endif /* __GCR_SECTION_H__ */ diff --git a/ui/libgcr-ui.map b/gcr-gtk4/libgcr-gtk4.map index 4a16138..4a16138 100644 --- a/ui/libgcr-ui.map +++ b/gcr-gtk4/libgcr-gtk4.map diff --git a/gcr-gtk4/meson.build b/gcr-gtk4/meson.build new file mode 100644 index 0000000..aa3f669 --- /dev/null +++ b/gcr-gtk4/meson.build @@ -0,0 +1,129 @@ +gcr_gtk4_headers_install_dir = gcr_headers_subdir / 'gcr-gtk4' + +gcr_gtk4_public_sources = files( + 'gcr-certificate-widget.c', +) + +gcr_gtk4_private_sources = files( + 'gcr-section.c', +) + +gcr_gtk4_headers = files( + 'gcr-certificate-widget.h', +) + + +gcr_gtk4_enums_gen = gnome.mkenums_simple('gcr-gtk4-enum-types', + sources: gcr_gtk4_headers, + install_header: true, + install_dir: get_option('includedir') / gcr_gtk4_headers_install_dir, +) + +gcr_gtk4_sources = [ + gcr_gtk4_private_sources, + gcr_gtk4_public_sources, + gcr_gtk4_enums_gen, +] + +gcr_gtk4_deps = [ + glib_deps, + p11kit_dep, + libegg_dep, + gck_dep, + gcr_dep, + gtk4_dep, +] + +gcr_gtk4_cflags = [ + '-DG_LOG_DOMAIN="GcrGtk4"', + '-DGCR_COMPILATION', + '-DGCR_API_SUBJECT_TO_CHANGE', + '-DGCK_API_SUBJECT_TO_CHANGE', + '-DP11_KIT_API_SUBJECT_TO_CHANGE', +] + +gcr_gtk4_symbolmap = meson.current_source_dir() / 'libgcr-gtk4.map' +gcr_gtk4_linkflags = cc.get_supported_link_arguments( + '-Wl,--version-script,@0@'.format(gcr_gtk4_symbolmap), +) + +gcr_gtk4_lib = shared_library(gcr_gtk4_basename, + gcr_gtk4_sources, + dependencies: gcr_gtk4_deps, + c_args: gcr_gtk4_cflags, + link_args: gcr_gtk4_linkflags, + link_depends: gcr_gtk4_symbolmap, + include_directories: config_h_dir, + version: gcr_version, + soversion: gcr_soversion, + install: true, +) + +gcr_gtk4_pkgconf_deps = [ + glib_dep, + gio_dep, + gobject_dep, + gck_lib, + gcr_lib, + gtk4_dep, +] + +pkgconfig.generate(gcr_gtk4_lib, + subdirs: gcr_headers_subdir, + requires: gcr_gtk4_pkgconf_deps, + description: 'Library providing Gtk4 widgets for high level crypto parsing and display', +) + +install_headers([gcr_gtk4_headers ], + subdir: gcr_gtk4_headers_install_dir, +) + +gcr_gtk4_dep = declare_dependency( + link_with: gcr_gtk4_lib, + sources: gcr_gtk4_enums_gen[1], # Make sure gcr-enum-types.h can be included +) + +if get_option('introspection') + gcr_gtk4_gir = gnome.generate_gir(gcr_gtk4_lib, + sources: [ gcr_gtk4_headers, gcr_gtk4_public_sources ], + namespace: 'GcrGtk4', + nsversion: gcr_api_version, + export_packages: gcr_gtk4_basename, + identifier_prefix: 'Gcr', + symbol_prefix: 'gcr', + includes: [ + 'GObject-2.0', + 'Gio-2.0', + 'Gtk-4.0', + gck_gir[0], + gcr_gir[0], + ], + header: 'gcr-gtk4/gcr-gtk4.h', + extra_args: [ + '-DGCR_COMPILATION', + '-DGCR_API_SUBJECT_TO_CHANGE', + ], + install: true, + ) + + gcr_gtk4_vapi = gnome.generate_vapi(gcr_gtk4_basename, + sources: gcr_gtk4_gir[0], + packages: [ + 'glib-2.0', + 'gio-2.0', + gck_vapi, + gcr_vapi, + 'gtk4' + ], + metadata_dirs: meson.current_source_dir(), + vapi_dirs: [ + build_root / 'gck', + build_root / 'gcr', + ], + gir_dirs: [ + build_root / 'gck', + build_root / 'gcr', + ], + install: true, + ) +endif diff --git a/gcr/frob-certificate-request.c b/gcr/frob-certificate-request.c index 6801b8c..459f391 100644 --- a/gcr/frob-certificate-request.c +++ b/gcr/frob-certificate-request.c @@ -23,7 +23,7 @@ #include "console-interaction.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "egg/egg-armor.h" diff --git a/gcr/frob-openpgp.c b/gcr/frob-openpgp.c index 433056b..7846f29 100644 --- a/gcr/frob-openpgp.c +++ b/gcr/frob-openpgp.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-openpgp.h" #include "gcr/gcr-record.h" diff --git a/gcr/frob-parser.c b/gcr/frob-parser.c index 1abf2e9..f071eb5 100644 --- a/gcr/frob-parser.c +++ b/gcr/frob-parser.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include <unistd.h> #include <string.h> diff --git a/gcr/gcr-base.h b/gcr/gcr-base.h deleted file mode 100644 index ea80d8e..0000000 --- a/gcr/gcr-base.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GI_SCANNER__ -#ifndef GCR_API_SUBJECT_TO_CHANGE -#error <gcr/This API has not yet reached stability.> -#endif -#endif - -#ifndef __GCR_BASE_H__ -#define __GCR_BASE_H__ - -#include <glib.h> - -#define __GCR_INSIDE_HEADER__ - -#include <gcr/gcr-types.h> - -#include <gcr/gcr-certificate.h> -#include <gcr/gcr-certificate-chain.h> -#include <gcr/gcr-certificate-request.h> -#include <gcr/gcr-column.h> -#include <gcr/gcr-deprecated-base.h> -#include <gcr/gcr-enum-types-base.h> -#include <gcr/gcr-filter-collection.h> -#include <gcr/gcr-icons.h> -#include <gcr/gcr-importer.h> -#include <gcr/gcr-library.h> -#include <gcr/gcr-mock-prompter.h> -#include <gcr/gcr-parser.h> -#include <gcr/gcr-pkcs11-certificate.h> -#include <gcr/gcr-prompt.h> -#include <gcr/gcr-secret-exchange.h> -#include <gcr/gcr-secure-memory.h> -#include <gcr/gcr-simple-certificate.h> -#include <gcr/gcr-simple-collection.h> -#include <gcr/gcr-ssh-askpass.h> -#include <gcr/gcr-system-prompt.h> -#include <gcr/gcr-system-prompter.h> -#include <gcr/gcr-trust.h> -#include <gcr/gcr-union-collection.h> -#include <gcr/gcr-unlock-options.h> -#include <gcr/gcr-version.h> - -#undef __GCR_INSIDE_HEADER__ - -#endif /* __GCR_BASE_H__ */ diff --git a/gcr/gcr-callback-output-stream.h b/gcr/gcr-callback-output-stream.h index b4ba031..668ce5f 100644 --- a/gcr/gcr-callback-output-stream.h +++ b/gcr/gcr-callback-output-stream.h @@ -22,9 +22,8 @@ #ifndef GCR_CALLBACK_OUTPUT_STREAM_H #define GCR_CALLBACK_OUTPUT_STREAM_H -#include "gcr-collection.h" - #include <glib-object.h> +#include <gio/gio.h> G_BEGIN_DECLS diff --git a/gcr/gcr-certificate-chain.c b/gcr/gcr-certificate-chain.c index f34eae8..c5cb8b8 100644 --- a/gcr/gcr-certificate-chain.c +++ b/gcr/gcr-certificate-chain.c @@ -28,7 +28,7 @@ #include "gcr-simple-certificate.h" #include "gcr-trust.h" -#include "gcr/gcr-enum-types-base.h" +#include "gcr/gcr-enum-types.h" #include "egg/egg-error.h" diff --git a/gcr/gcr-certificate-chain.h b/gcr/gcr-certificate-chain.h index 002db1b..78decd5 100644 --- a/gcr/gcr-certificate-chain.h +++ b/gcr/gcr-certificate-chain.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_CERTIFICATE_CHAIN_H__ #define __GCR_CERTIFICATE_CHAIN_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib-object.h> #include "gcr-certificate.h" diff --git a/gcr/gcr-certificate-extensions.h b/gcr/gcr-certificate-extensions.h index 0e5d135..6b42d44 100644 --- a/gcr/gcr-certificate-extensions.h +++ b/gcr/gcr-certificate-extensions.h @@ -20,7 +20,7 @@ */ #if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." +#error "Only <gcr/gcr.h> can be included directly." #endif #ifndef GCR_CERTIFICATE_EXTENSIONS_H diff --git a/gcr/gcr-certificate-request.c b/gcr/gcr-certificate-request.c index dd58d42..452d1e1 100644 --- a/gcr/gcr-certificate-request.c +++ b/gcr/gcr-certificate-request.c @@ -23,7 +23,7 @@ #include "gcr-key-mechanisms.h" #include "gcr-subject-public-key.h" -#include "gcr/gcr-enum-types-base.h" +#include "gcr/gcr-enum-types.h" #include "gcr/gcr-oids.h" #include <egg/egg-armor.h> diff --git a/gcr/gcr-certificate-request.h b/gcr/gcr-certificate-request.h index d8acdbd..623dc3d 100644 --- a/gcr/gcr-certificate-request.h +++ b/gcr/gcr-certificate-request.h @@ -17,13 +17,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_CERTIFICATE_REQUEST_H__ #define __GCR_CERTIFICATE_REQUEST_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib-object.h> #include "gcr-types.h" diff --git a/gcr/gcr-certificate.c b/gcr/gcr-certificate.c index dd2b666..eb1b10a 100644 --- a/gcr/gcr-certificate.c +++ b/gcr/gcr-certificate.c @@ -1081,7 +1081,7 @@ gcr_certificate_mixin_emit_notify (GcrCertificate *self) * macro instead of this function. */ void -gcr_certificate_mixin_comparable_init (GcrComparableIface *iface) +gcr_certificate_mixin_comparable_init (GcrComparableInterface *iface) { iface->compare = gcr_certificate_compare; } diff --git a/gcr/gcr-certificate.h b/gcr/gcr-certificate.h index b414325..12a1275 100644 --- a/gcr/gcr-certificate.h +++ b/gcr/gcr-certificate.h @@ -17,13 +17,13 @@ * License along with this program; if not, see <http://www.gnu.org/licenses/>. */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_CERTIFICATE_H__ #define __GCR_CERTIFICATE_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-types.h" #include "gcr-column.h" #include "gcr-comparable.h" @@ -137,7 +137,7 @@ gboolean gcr_certificate_get_basic_constraints (GcrCertificate *self void gcr_certificate_mixin_emit_notify (GcrCertificate *self); -void gcr_certificate_mixin_comparable_init (GcrComparableIface *iface); +void gcr_certificate_mixin_comparable_init (GcrComparableInterface *iface); void gcr_certificate_mixin_class_init (GObjectClass *object_class); diff --git a/gcr/gcr-collection.c b/gcr/gcr-collection.c deleted file mode 100644 index c4c05e5..0000000 --- a/gcr/gcr-collection.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-collection.h" - -/** - * GcrCollection: - * - * A #GcrCollection is used to group a set of objects. - * - * This is an abstract interface which can be used to determine which objects - * show up in a selector or other user interface element. - * - * Use [ctor@SimpleCollection.new] to create a concrete implementation of this - * interface which you can add objects to. - */ - -enum { - ADDED, - REMOVED, - LAST_SIGNAL, -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - - -typedef GcrCollectionIface GcrCollectionInterface; - -G_DEFINE_INTERFACE (GcrCollection, gcr_collection, G_TYPE_OBJECT); - -static void -gcr_collection_default_init (GcrCollectionIface *iface) -{ - static size_t initialized = 0; - - if (g_once_init_enter (&initialized)) { - - /** - * GcrCollection::added: - * @self: the collection - * @object: (type GObject.Object): object that was added - * - * This signal is emitted when an object is added to the collection. - */ - signals[ADDED] = g_signal_new ("added", GCR_TYPE_COLLECTION, - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrCollectionIface, added), - NULL, NULL, NULL, - G_TYPE_NONE, 1, G_TYPE_OBJECT); - - /** - * GcrCollection::removed: - * @self: the collection - * @object: (type GObject.Object): object that was removed - * - * This signal is emitted when an object is removed from the collection. - */ - signals[REMOVED] = g_signal_new ("removed", GCR_TYPE_COLLECTION, - G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GcrCollectionIface, removed), - NULL, NULL, NULL, - G_TYPE_NONE, 1, G_TYPE_OBJECT); - - g_once_init_leave (&initialized, 1); - } -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - - -/** - * gcr_collection_get_length: - * @self: The collection - * - * Get the number of objects in this collection. - * - * Returns: The number of objects. - */ -guint -gcr_collection_get_length (GcrCollection *self) -{ - g_return_val_if_fail (GCR_IS_COLLECTION (self), 0); - g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->get_length, 0); - return GCR_COLLECTION_GET_INTERFACE (self)->get_length (self); -} - -/** - * gcr_collection_get_objects: - * @self: The collection - * - * Get a list of the objects in this collection. - * - * Returns: (transfer container) (element-type GObject.Object): a list of the objects - * in this collection, which should be freed with g_list_free() - */ -GList* -gcr_collection_get_objects (GcrCollection *self) -{ - g_return_val_if_fail (GCR_IS_COLLECTION (self), 0); - g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->get_objects, 0); - return GCR_COLLECTION_GET_INTERFACE (self)->get_objects (self); -} - -/** - * gcr_collection_contains: - * @self: the collection - * @object: object to check - * - * Check whether the collection contains an object or not. - * - * Returns: whether the collection contains this object - */ -gboolean -gcr_collection_contains (GcrCollection *self, - GObject *object) -{ - g_return_val_if_fail (GCR_IS_COLLECTION (self), FALSE); - g_return_val_if_fail (G_IS_OBJECT (object), FALSE); - g_return_val_if_fail (GCR_COLLECTION_GET_INTERFACE (self)->contains, FALSE); - return GCR_COLLECTION_GET_INTERFACE (self)->contains (self, object); -} - -/** - * gcr_collection_emit_added: - * @self: The collection - * @object: The object that was added - * - * Emit the #GcrCollection::added signal for the given object. This function - * is used by implementors of this interface. - */ -void -gcr_collection_emit_added (GcrCollection *self, GObject *object) -{ - g_return_if_fail (GCR_IS_COLLECTION (self)); - g_signal_emit (self, signals[ADDED], 0, object); -} - -/** - * gcr_collection_emit_removed: - * @self: The collection - * @object: The object that was removed - * - * Emit the #GcrCollection::removed signal for the given object. This function - * is used by implementors of this interface. - */ -void -gcr_collection_emit_removed (GcrCollection *self, GObject *object) -{ - g_return_if_fail (GCR_IS_COLLECTION (self)); - g_signal_emit (self, signals[REMOVED], 0, object); -} diff --git a/gcr/gcr-collection.h b/gcr/gcr-collection.h deleted file mode 100644 index 6a1d193..0000000 --- a/gcr/gcr-collection.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_COLLECTION_H__ -#define __GCR_COLLECTION_H__ - -#include "gcr-types.h" - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_COLLECTION (gcr_collection_get_type()) -#define GCR_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrCollection)) -#define GCR_IS_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION)) -#define GCR_COLLECTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_COLLECTION, GcrCollectionIface)) - -typedef struct _GcrCollection GcrCollection; -typedef struct _GcrCollectionIface GcrCollectionIface; - -struct _GcrCollectionIface { - GTypeInterface parent; - - /* signals */ - void (*added) (GcrCollection *self, GObject *object); - - void (*removed) (GcrCollection *self, GObject *object); - - /* virtual */ - guint (*get_length) (GcrCollection *self); - - GList* (*get_objects) (GcrCollection *self); - - gboolean (*contains) (GcrCollection *self, - GObject *object); - - /*< private >*/ - gpointer dummy1; - gpointer dummy2; - gpointer dummy3; - gpointer dummy5; - gpointer dummy6; - gpointer dummy7; - gpointer dummy8; -}; - -GType gcr_collection_get_type (void); - -guint gcr_collection_get_length (GcrCollection *self); - -GList* gcr_collection_get_objects (GcrCollection *self); - -gboolean gcr_collection_contains (GcrCollection *self, - GObject *object); - -void gcr_collection_emit_added (GcrCollection *self, - GObject *object); - -void gcr_collection_emit_removed (GcrCollection *self, - GObject *object); - -G_END_DECLS - -#endif /* __GCR_COLLECTION_H__ */ diff --git a/gcr/gcr-column.h b/gcr/gcr-column.h index a6eb75b..9867575 100644 --- a/gcr/gcr-column.h +++ b/gcr/gcr-column.h @@ -20,6 +20,10 @@ #ifndef __GCR_COLUMN_H__ #define __GCR_COLUMN_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-types.h" #include <glib-object.h> diff --git a/gcr/gcr-comparable.c b/gcr/gcr-comparable.c index 91d54e9..4572dd1 100644 --- a/gcr/gcr-comparable.c +++ b/gcr/gcr-comparable.c @@ -30,18 +30,17 @@ */ /** - * GcrComparableIface: + * GcrComparableInterface: * @parent: type interface * @compare: Compare whether tow objects represent the same thing. * * The interface to implement for [iface@Comparable] */ -typedef GcrComparableIface GcrComparableInterface; G_DEFINE_INTERFACE (GcrComparable, gcr_comparable, G_TYPE_OBJECT); static void -gcr_comparable_default_init (GcrComparableIface *iface) +gcr_comparable_default_init (GcrComparableInterface *iface) { } @@ -61,9 +60,9 @@ gint gcr_comparable_compare (GcrComparable *self, GcrComparable *other) { g_return_val_if_fail (GCR_IS_COMPARABLE (self), -1); - g_return_val_if_fail (GCR_COMPARABLE_GET_INTERFACE (self)->compare, -1); + g_return_val_if_fail (GCR_COMPARABLE_GET_IFACE (self)->compare, -1); g_return_val_if_fail (G_IS_OBJECT (self), -1); - return GCR_COMPARABLE_GET_INTERFACE (self)->compare (self, other); + return GCR_COMPARABLE_GET_IFACE (self)->compare (self, other); } /** diff --git a/gcr/gcr-comparable.h b/gcr/gcr-comparable.h index 5a8e28f..8e1fb65 100644 --- a/gcr/gcr-comparable.h +++ b/gcr/gcr-comparable.h @@ -20,25 +20,22 @@ #ifndef __GCR_COMPARABLE_H__ #define __GCR_COMPARABLE_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib-object.h> G_BEGIN_DECLS -#define GCR_TYPE_COMPARABLE (gcr_comparable_get_type()) -#define GCR_COMPARABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COMPARABLE, GcrComparable)) -#define GCR_IS_COMPARABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COMPARABLE)) -#define GCR_COMPARABLE_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_COMPARABLE, GcrComparableIface)) - -typedef struct _GcrComparable GcrComparable; -typedef struct _GcrComparableIface GcrComparableIface; +#define GCR_TYPE_COMPARABLE gcr_comparable_get_type () +G_DECLARE_INTERFACE (GcrComparable, gcr_comparable, GCR, COMPARABLE, GObject) -struct _GcrComparableIface { +struct _GcrComparableInterface { GTypeInterface parent; gint (*compare) (GcrComparable *self, GcrComparable *other); }; -GType gcr_comparable_get_type (void); - gint gcr_comparable_compare (GcrComparable *self, GcrComparable *other); diff --git a/gcr/gcr-deprecated-base.h b/gcr/gcr-deprecated-base.h deleted file mode 100644 index 55dc087..0000000 --- a/gcr/gcr-deprecated-base.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef GCR_BASE_DEPRECATED_H_ -#define GCR_BASE_DEPRECATED_H_ -#ifndef GCR_DISABLE_DEPRECATED -#ifndef __GI_SCANNER__ - -#include <glib.h> - -#include "gcr-importer.h" -#include "gcr-parser.h" -#include "gcr-simple-collection.h" - -G_BEGIN_DECLS - -#define GCR_ERROR (gcr_error_get_domain ()) - -G_DEPRECATED -GQuark gcr_error_get_domain (void) G_GNUC_CONST; - -G_DEPRECATED_FOR(gcr_collection_contains) -gboolean gcr_simple_collection_contains (GcrSimpleCollection *self, - GObject *object); - -G_DEPRECATED_FOR(gcr_importer_listen) -GcrParser * gcr_importer_get_parser (GcrImporter *self); - -G_DEPRECATED_FOR(gcr_importer_listen) -void gcr_importer_set_parser (GcrImporter *self, - GcrParser *parser); - -G_DEPRECATED -GckSlot * gcr_importer_get_slot (GcrImporter *self); - -G_DEPRECATED -void gcr_importer_set_slot (GcrImporter *self, - GckSlot *slot); - -typedef enum { - GCR_IMPORTER_PROMPT_NEEDED, - GCR_IMPORTER_PROMPT_ALWAYS, - GCR_IMPORTER_PROMPT_NEVER -} GcrImporterPromptBehavior; - -G_DEPRECATED -GcrImporterPromptBehavior gcr_importer_get_prompt_behavior (GcrImporter *self); - -G_DEPRECATED -void gcr_importer_set_prompt_behavior (GcrImporter *self, - GcrImporterPromptBehavior behavior); - -G_END_DECLS - -#endif /* __GI_SCANNER__ */ -#endif /* GCR_DISABLE_DEPRECATED */ -#endif /* GCRTYPES_H_ */ diff --git a/gcr/gcr-filter-collection.c b/gcr/gcr-filter-collection.c deleted file mode 100644 index c62abae..0000000 --- a/gcr/gcr-filter-collection.c +++ /dev/null @@ -1,372 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-collection.h" -#include "gcr-filter-collection.h" - -#include <string.h> - -/** - * GcrFilterCollection: - * - * A collection which filters a [iface@Collection]. - * - * An implementation of [iface@Collection] which filters objects from another - * underlying collection. Use [ctor@FilterCollection.new_with_callback] - * to create a new filter collection. - * - * The callback will determine the criteria for whether an object shows through - * the filter or not. - */ - -/** - * GcrFilterCollectionClass: - * @parent_class: the parent class - * - * The class struct for [class@FilterCollection]. - */ - -/** - * GcrFilterCollectionFunc: - * @object: object to filter - * @user_data: user data passed to the callback - * - * A function which is called by [class@FilterCollection] in order to determine - * whether an object should show through the filter or not. - * - * Returns: %TRUE if an object should be included in the filtered collection - */ - -enum { - PROP_0, - PROP_UNDERLYING -}; - -struct _GcrFilterCollectionPrivate { - GHashTable *items; - GcrCollection *underlying; - GcrFilterCollectionFunc filter_func; - gpointer user_data; - GDestroyNotify destroy_func; -}; - -static void gcr_filter_collection_iface (GcrCollectionIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrFilterCollection, gcr_filter_collection, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrFilterCollection); - G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_filter_collection_iface)); - -static void -add_object (GcrFilterCollection *self, - GObject *object) -{ - g_assert (g_hash_table_lookup (self->pv->items, object) == NULL); - g_hash_table_insert (self->pv->items, g_object_ref (object), object); - gcr_collection_emit_added (GCR_COLLECTION (self), object); -} - -static void -remove_object (GcrFilterCollection *self, - GObject *object) -{ - g_object_ref (object); - if (!g_hash_table_remove (self->pv->items, object)) - g_assert_not_reached (); - gcr_collection_emit_removed (GCR_COLLECTION (self), object); - g_object_unref (object); -} - -static gboolean -filter_object (GcrFilterCollection *self, - GObject *object) -{ - gboolean match = TRUE; - - if (self->pv->filter_func) - match = (self->pv->filter_func) (object, self->pv->user_data); - - return match; -} - -static void -on_collection_added (GcrCollection *collection, - GObject *object, - gpointer user_data) -{ - GcrFilterCollection *self = GCR_FILTER_COLLECTION (user_data); - if (filter_object (self, object)) - add_object (self, object); -} - -static void -on_collection_removed (GcrCollection *collection, - GObject *object, - gpointer user_data) -{ - GcrFilterCollection *self = GCR_FILTER_COLLECTION (user_data); - if (g_hash_table_lookup (self->pv->items, object)) - remove_object (self, object); -} - -static void -gcr_filter_collection_init (GcrFilterCollection *self) -{ - self->pv = gcr_filter_collection_get_instance_private (self); - self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); -} - -static void -gcr_filter_collection_set_property (GObject *obj, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj); - - switch (property_id) { - case PROP_UNDERLYING: - g_return_if_fail (self->pv->underlying == NULL); - self->pv->underlying = g_value_dup_object (value); - g_return_if_fail (self->pv->underlying != NULL); - g_signal_connect (self->pv->underlying, "added", - G_CALLBACK (on_collection_added), self); - g_signal_connect (self->pv->underlying, "removed", - G_CALLBACK (on_collection_removed), self); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec); - break; - } -} - -static void -gcr_filter_collection_get_property (GObject *obj, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj); - - switch (property_id) { - case PROP_UNDERLYING: - g_value_set_object (value, gcr_filter_collection_get_underlying (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, property_id, pspec); - break; - } -} - -static void -gcr_filter_collection_finalize (GObject *obj) -{ - GcrFilterCollection *self = GCR_FILTER_COLLECTION (obj); - - if (self->pv->underlying) { - g_signal_handlers_disconnect_by_func (self->pv->underlying, - on_collection_added, self); - g_signal_handlers_disconnect_by_func (self->pv->underlying, - on_collection_removed, self); - g_object_unref (self->pv->underlying); - } - - if (self->pv->destroy_func) - (self->pv->destroy_func) (self->pv->user_data); - - g_assert (self->pv->items); - g_hash_table_destroy (self->pv->items); - self->pv->items = NULL; - - G_OBJECT_CLASS (gcr_filter_collection_parent_class)->finalize (obj); -} - -static void -gcr_filter_collection_class_init (GcrFilterCollectionClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->get_property = gcr_filter_collection_get_property; - gobject_class->set_property = gcr_filter_collection_set_property; - gobject_class->finalize = gcr_filter_collection_finalize; - - g_object_class_install_property (gobject_class, PROP_UNDERLYING, - g_param_spec_object ("underlying", "Underlying", "Underlying collection", - GCR_TYPE_COLLECTION, G_PARAM_STATIC_STRINGS | - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); -} - -static guint -gcr_filter_collection_get_length (GcrCollection *coll) -{ - GcrFilterCollection *self = GCR_FILTER_COLLECTION (coll); - return g_hash_table_size (self->pv->items); -} - -static GList* -gcr_filter_collection_get_objects (GcrCollection *coll) -{ - GcrFilterCollection *self = GCR_FILTER_COLLECTION (coll); - return g_hash_table_get_keys (self->pv->items); -} - -static gboolean -gcr_filter_collection_contains (GcrCollection *collection, - GObject *object) -{ - GcrFilterCollection *self = GCR_FILTER_COLLECTION (collection); - return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE; -} - -static void -gcr_filter_collection_iface (GcrCollectionIface *iface) -{ - iface->get_length = gcr_filter_collection_get_length; - iface->get_objects = gcr_filter_collection_get_objects; - iface->contains = gcr_filter_collection_contains; -} - -/** - * gcr_filter_collection_new_with_callback: - * @underlying: the underlying collection - * @callback: (nullable): function to call for each object - * @user_data: data to pass to the callback - * @destroy_func: called for user_data when it is no longer needed - * - * Create a new #GcrFilterCollection. - * - * The callback should return %TRUE if an object should appear in the - * filtered collection. - * - * If a %NULL callback is set, then all underlynig objects will appear in the - * filtered collection. - * - * Returns: (transfer full) (type Gcr.FilterCollection): a newly allocated - * filtered collection, which should be freed with g_object_unref() - */ -GcrCollection * -gcr_filter_collection_new_with_callback (GcrCollection *underlying, - GcrFilterCollectionFunc callback, - gpointer user_data, - GDestroyNotify destroy_func) -{ - GcrCollection *collection; - - collection = g_object_new (GCR_TYPE_FILTER_COLLECTION, - "underlying", underlying, - NULL); - gcr_filter_collection_set_callback (GCR_FILTER_COLLECTION (collection), - callback, user_data, destroy_func); - - return collection; -} - -/** - * gcr_filter_collection_set_callback: - * @self: a filter collection - * @callback: (nullable): function to call for each object - * @user_data: data to pass to the callback - * @destroy_func: called for user_data when it is no longer needed - * - * Set the callback used to filter the objects in the underlying collection. - * The callback should return %TRUE if an object should appear in the - * filtered collection. - * - * If a %NULL callback is set, then all underlynig objects will appear in the - * filtered collection. - * - * This will refilter the collection. - */ -void -gcr_filter_collection_set_callback (GcrFilterCollection *self, - GcrFilterCollectionFunc callback, - gpointer user_data, - GDestroyNotify destroy_func) -{ - g_return_if_fail (GCR_IS_FILTER_COLLECTION (self)); - - if (self->pv->destroy_func) - (self->pv->destroy_func) (self->pv->user_data); - self->pv->filter_func = callback; - self->pv->user_data = user_data; - self->pv->destroy_func = destroy_func; - - gcr_filter_collection_refilter (self); -} - -/** - * gcr_filter_collection_refilter: - * @self: a filter collection - * - * Refilter all objects in the underlying collection. Call this function if - * the filter callback function changes its filtering criteria. - */ -void -gcr_filter_collection_refilter (GcrFilterCollection *self) -{ - GList *objects = NULL; - GHashTable *snapshot; - GHashTableIter iter; - GObject *object; - gboolean have; - gboolean should; - GList *l; - - g_return_if_fail (GCR_IS_FILTER_COLLECTION (self)); - - snapshot = g_hash_table_new (g_direct_hash, g_direct_equal); - g_hash_table_iter_init (&iter, self->pv->items); - while (g_hash_table_iter_next (&iter, (gpointer *)&object, NULL)) - g_hash_table_insert (snapshot, object, object); - - if (self->pv->underlying) - objects = gcr_collection_get_objects (self->pv->underlying); - - for (l = objects; l != NULL; l = g_list_next (l)) { - have = g_hash_table_remove (snapshot, l->data); - should = filter_object (self, l->data); - if (have && !should) - remove_object (self, l->data); - else if (!have && should) - add_object (self, l->data); - } - - g_hash_table_iter_init (&iter, snapshot); - while (g_hash_table_iter_next (&iter, (gpointer *)&object, NULL)) - remove_object (self, object); - g_hash_table_destroy (snapshot); - - g_list_free (objects); -} - -/** - * gcr_filter_collection_get_underlying: - * @self: a filter collection - * - * Get the collection that is being filtered by this filter collection. - * - * Returns: (transfer none): the underlying collection - */ -GcrCollection * -gcr_filter_collection_get_underlying (GcrFilterCollection *self) -{ - g_return_val_if_fail (GCR_IS_FILTER_COLLECTION (self), NULL); - return self->pv->underlying; -} diff --git a/gcr/gcr-filter-collection.h b/gcr/gcr-filter-collection.h deleted file mode 100644 index 65e37db..0000000 --- a/gcr/gcr-filter-collection.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_FILTER_COLLECTION_H__ -#define __GCR_FILTER_COLLECTION_H__ - -#include "gcr-collection.h" - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_FILTER_COLLECTION (gcr_filter_collection_get_type ()) -#define GCR_FILTER_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollection)) -#define GCR_FILTER_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollectionClass)) -#define GCR_IS_FILTER_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_FILTER_COLLECTION)) -#define GCR_IS_FILTER_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_FILTER_COLLECTION)) -#define GCR_FILTER_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_FILTER_COLLECTION, GcrFilterCollectionClass)) - -typedef struct _GcrFilterCollection GcrFilterCollection; -typedef struct _GcrFilterCollectionClass GcrFilterCollectionClass; -typedef struct _GcrFilterCollectionPrivate GcrFilterCollectionPrivate; - -struct _GcrFilterCollection { - GObject parent; - - /*< private >*/ - GcrFilterCollectionPrivate *pv; -}; - -struct _GcrFilterCollectionClass { - GObjectClass parent_class; -}; - -GType gcr_filter_collection_get_type (void); - -typedef gboolean (* GcrFilterCollectionFunc) (GObject *object, - gpointer user_data); - -GcrCollection * gcr_filter_collection_new_with_callback (GcrCollection *underlying, - GcrFilterCollectionFunc callback, - gpointer user_data, - GDestroyNotify destroy_func); - -void gcr_filter_collection_set_callback (GcrFilterCollection *self, - GcrFilterCollectionFunc callback, - gpointer user_data, - GDestroyNotify destroy_func); - -void gcr_filter_collection_refilter (GcrFilterCollection *self); - -GcrCollection * gcr_filter_collection_get_underlying (GcrFilterCollection *self); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrFilterCollection, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_FILTER_COLLECTION_H__ */ diff --git a/gcr/gcr-fingerprint.h b/gcr/gcr-fingerprint.h index 299f087..9b19719 100644 --- a/gcr/gcr-fingerprint.h +++ b/gcr/gcr-fingerprint.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef GCR_FINGERPRINT_H #define GCR_FINGERPRINT_H +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib.h> #include "gcr-types.h" diff --git a/gcr/gcr-gnupg-collection.c b/gcr/gcr-gnupg-collection.c deleted file mode 100644 index d2f90bf..0000000 --- a/gcr/gcr-gnupg-collection.c +++ /dev/null @@ -1,738 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr-callback-output-stream.h" -#include "gcr-collection.h" -#include "gcr-gnupg-collection.h" -#include "gcr-gnupg-key.h" -#include "gcr-gnupg-process.h" -#include "gcr-gnupg-records.h" -#include "gcr-gnupg-util.h" -#include "gcr-internal.h" -#include "gcr-record.h" -#include "gcr-util.h" - -#include <sys/wait.h> -#include <string.h> - -enum { - PROP_0, - PROP_DIRECTORY -}; - -struct _GcrGnupgCollectionPrivate { - GHashTable *items; /* char *keyid -> GcrGnupgKey* */ - gchar *directory; -}; - -/* Forward declarations */ -static void _gcr_collection_iface (GcrCollectionIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrGnupgCollection, _gcr_gnupg_collection, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrGnupgCollection); - G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, _gcr_collection_iface) -); - - -static void -_gcr_gnupg_collection_init (GcrGnupgCollection *self) -{ - self->pv = _gcr_gnupg_collection_get_instance_private (self); - - self->pv->items = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, g_object_unref); -} - -static void -_gcr_gnupg_collection_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj); - - switch (prop_id) { - case PROP_DIRECTORY: - g_return_if_fail (!self->pv->directory); - self->pv->directory = g_value_dup_string (value); - if (self->pv->directory && !g_path_is_absolute (self->pv->directory)) { - g_warning ("gnupg collection directory path should be absolute: %s", - self->pv->directory); - } - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_gnupg_collection_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj); - - switch (prop_id) { - case PROP_DIRECTORY: - g_value_set_string (value, self->pv->directory); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_gnupg_collection_dispose (GObject *obj) -{ - GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj); - - g_hash_table_remove_all (self->pv->items); - - G_OBJECT_CLASS (_gcr_gnupg_collection_parent_class)->dispose (obj); -} - -static void -_gcr_gnupg_collection_finalize (GObject *obj) -{ - GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (obj); - - g_assert (self->pv->items); - g_assert (g_hash_table_size (self->pv->items) == 0); - g_hash_table_destroy (self->pv->items); - self->pv->items = NULL; - - g_free (self->pv->directory); - self->pv->directory = NULL; - - G_OBJECT_CLASS (_gcr_gnupg_collection_parent_class)->finalize (obj); -} - -static void -_gcr_gnupg_collection_class_init (GcrGnupgCollectionClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->get_property = _gcr_gnupg_collection_get_property; - gobject_class->set_property = _gcr_gnupg_collection_set_property; - gobject_class->dispose = _gcr_gnupg_collection_dispose; - gobject_class->finalize = _gcr_gnupg_collection_finalize; - - /** - * GcrGnupgCollection:directory: - * - * Directory to load the gnupg keys from, or %NULL for default - * ~/.gnupg/ directory. - */ - g_object_class_install_property (gobject_class, PROP_DIRECTORY, - g_param_spec_string ("directory", "Directory", "Gnupg Directory", - NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); - - _gcr_initialize_library (); -} - -static guint -gcr_gnupg_collection_real_get_length (GcrCollection *coll) -{ - GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (coll); - return g_hash_table_size (self->pv->items); -} - -static GList* -gcr_gnupg_collection_real_get_objects (GcrCollection *coll) -{ - GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (coll); - return g_hash_table_get_values (self->pv->items); -} - -static gboolean -gcr_gnupg_collection_real_contains (GcrCollection *collection, - GObject *object) -{ - GcrGnupgCollection *self = GCR_GNUPG_COLLECTION (collection); - GcrGnupgKey *key; - - if (!GCR_IS_GNUPG_KEY (object)) - return FALSE; - key = g_hash_table_lookup (self->pv->items, - _gcr_gnupg_key_get_keyid (GCR_GNUPG_KEY (object))); - if (key != NULL && G_OBJECT (key) == object) - return TRUE; - return FALSE; -} - -static void -_gcr_collection_iface (GcrCollectionIface *iface) -{ - iface->get_length = gcr_gnupg_collection_real_get_length; - iface->get_objects = gcr_gnupg_collection_real_get_objects; - iface->contains = gcr_gnupg_collection_real_contains; -} - -/** - * _gcr_gnupg_collection_new: - * @directory: (nullable): The gnupg home directory. - * - * Create a new GcrGnupgCollection. - * - * The gnupg home directory is where the keyring files live. If directory is - * %NULL then the default gnupg home directory is used. - * - * Returns: (transfer full) (type Gcr.GnupgCollection): A newly allocated collection. - */ -GcrCollection* -_gcr_gnupg_collection_new (const gchar *directory) -{ - return g_object_new (GCR_TYPE_GNUPG_COLLECTION, - "directory", directory, - NULL); -} - -/* - * We have to run the gnupg process twice to list the public and then the - * secret keys. These phases are tracked by GcrLoadingPhase. If the first - * phase completes successfully (using gpg --list-keys) then we move on to - * the second phase where the secret keys are loaded (using gpg --list-secret-keys) - * - * If a key is loaded as a public key by the public phase, it can be updated by - * the secret phase. A key discovered in the secret phase must have a public - * counterpart already loaded by the public phase. - */ - -typedef enum { - GCR_LOADING_PHASE_PUBLIC = 1, - GCR_LOADING_PHASE_SECRET = 2, -} GcrLoadingPhase; - -/* - * We use @difference to track the keys that were in the collection before - * the load process, and then remove any not found, at the end of the load - * process. Strings are directly used from collection->pv->items keys. - */ - -typedef struct { - GcrGnupgCollection *collection; /* reffed pointer back to collection */ - GcrLoadingPhase loading_phase; /* Whether loading public or private */ - GPtrArray *records; /* GcrRecord* not yet made into a key */ - GcrGnupgProcess *process; /* The gnupg process itself */ - GString *out_data; /* Pending output not yet parsed into colons */ - GHashTable *difference; /* Hashset gchar *keyid -> gchar *keyid */ - - guint error_sig; - guint status_sig; - GOutputStream *output; - GOutputStream *outattr; - - GQueue *attribute_queue; /* Queue of unprocessed GcrRecord* status records */ - GByteArray *attribute_buf; /* Buffer of unprocessed attribute data received */ - GHashTable *attributes; /* Processed attributes waiting for a matching key */ -} GcrGnupgCollectionLoad; - -/* Forward declarations */ -static void spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GTask *task); - -static void -_gcr_gnupg_collection_load_free (gpointer data) -{ - GcrGnupgCollectionLoad *load = data; - g_assert (load); - - g_ptr_array_unref (load->records); - g_string_free (load->out_data, TRUE); - g_hash_table_destroy (load->difference); - g_object_unref (load->collection); - - if (load->process) { - if (load->error_sig) - g_signal_handler_disconnect (load->process, load->error_sig); - if (load->status_sig) - g_signal_handler_disconnect (load->process, load->status_sig); - g_object_unref (load->process); - } - - g_output_stream_close (load->output, NULL, NULL); - g_object_unref (load->output); - g_output_stream_close (load->outattr, NULL, NULL); - g_object_unref (load->outattr); - - if (load->attribute_queue) { - while (!g_queue_is_empty (load->attribute_queue)) - _gcr_record_free (g_queue_pop_head (load->attribute_queue)); - g_queue_free (load->attribute_queue); - } - if (load->attribute_buf) - g_byte_array_unref (load->attribute_buf); - if (load->attributes) - g_hash_table_destroy (load->attributes); - - g_slice_free (GcrGnupgCollectionLoad, load); -} - -static void -process_records_as_public_key (GcrGnupgCollectionLoad *load, GPtrArray *records, - const gchar *keyid) -{ - GPtrArray *attr_records = NULL; - const gchar *fingerprint; - gchar *orig_fingerprint; - GcrGnupgKey *key; - guint i; - - /* Add in any attributes we have loaded */ - fingerprint = _gcr_gnupg_records_get_fingerprint (records); - if (fingerprint && load->attributes) - attr_records = g_hash_table_lookup (load->attributes, fingerprint); - if (attr_records) { - g_debug ("adding %d user id attribute(s) to key/fingerprint: %s/%s", - (gint)attr_records->len, keyid, fingerprint); - - if (!g_hash_table_lookup_extended (load->attributes, fingerprint, - (gpointer*)&orig_fingerprint, NULL)) - g_assert_not_reached (); - if (!g_hash_table_steal (load->attributes, fingerprint)) - g_assert_not_reached (); - g_free (orig_fingerprint); - - /* Move all the attribute records over to main records set */ - for (i = 0; i < attr_records->len; i++) - g_ptr_array_add (records, attr_records->pdata[i]); - - /* Shallow free of attr_records array */ - g_free (g_ptr_array_free (attr_records, FALSE)); - } - - /* Note that we've seen this keyid */ - g_hash_table_remove (load->difference, keyid); - - key = g_hash_table_lookup (load->collection->pv->items, keyid); - - /* Already have this key, just update */ - if (key) { - g_debug ("updating public key: %s", keyid); - _gcr_gnupg_key_set_public_records (key, records); - - /* Add a new key */ - } else { - key = _gcr_gnupg_key_new (records, NULL); - g_debug ("creating public key: %s", keyid); - g_hash_table_insert (load->collection->pv->items, g_strdup (keyid), key); - gcr_collection_emit_added (GCR_COLLECTION (load->collection), G_OBJECT (key)); - } -} - -static void -process_records_as_secret_key (GcrGnupgCollectionLoad *load, GPtrArray *records, - const gchar *keyid) -{ - GcrGnupgKey *key; - - key = g_hash_table_lookup (load->collection->pv->items, keyid); - - /* Don't have this key */ - if (key == NULL) { - g_message ("Secret key seen but no public key for: %s", keyid); - - /* Tell the private key that it's a secret one */ - } else { - g_debug ("adding secret records to key: %s", keyid); - _gcr_gnupg_key_set_secret_records (key, records); - } -} - -static void -process_records_as_key (GcrGnupgCollectionLoad *load) -{ - GPtrArray *records; - const gchar *keyid; - GQuark schema; - - g_assert (load->records->len); - - records = load->records; - load->records = g_ptr_array_new_with_free_func (_gcr_record_free); - - keyid = _gcr_gnupg_records_get_keyid (records); - if (keyid) { - schema = _gcr_record_get_schema (records->pdata[0]); - - /* A public key */ - if (schema == GCR_RECORD_SCHEMA_PUB) - process_records_as_public_key (load, records, keyid); - - /* A secret key */ - else if (schema == GCR_RECORD_SCHEMA_SEC) - process_records_as_secret_key (load, records, keyid); - - else - g_assert_not_reached (); - - } else { - g_warning ("parsed gnupg data had no keyid"); - } - - g_ptr_array_unref (records); -} - -static gboolean -process_outstanding_attribute (GcrGnupgCollectionLoad *load, GcrRecord *record) -{ - const gchar *fingerprint; - GPtrArray *records; - GcrRecord *xa1; - guint length; - - if (!_gcr_record_get_uint (record, GCR_RECORD_ATTRIBUTE_LENGTH, &length)) - g_return_val_if_reached (FALSE); - fingerprint = _gcr_record_get_raw (record, GCR_RECORD_ATTRIBUTE_KEY_FINGERPRINT); - g_return_val_if_fail (fingerprint != NULL, FALSE); - - /* Do we have enough data for this attribute? */ - if (!load->attribute_buf || load->attribute_buf->len < length) { - g_debug ("not enough attribute data in buffer: %u", length); - return FALSE; - } - - if (!load->attributes) - load->attributes = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, (GDestroyNotify)g_ptr_array_unref); - - records = g_hash_table_lookup (load->attributes, fingerprint); - if (!records) { - records = g_ptr_array_new_with_free_func (_gcr_record_free); - g_hash_table_insert (load->attributes, g_strdup (fingerprint), records); - } - - g_debug ("new attribute of length %d for key with fingerprint %s", - length, fingerprint); - - xa1 = _gcr_gnupg_build_xa1_record (record, load->attribute_buf->data, length); - g_ptr_array_add (records, xa1); - - /* Did we use up all the attribute data? Get rid of the buffer */ - if (length == load->attribute_buf->len) { - g_byte_array_unref (load->attribute_buf); - load->attribute_buf = NULL; - - /* Otherwise clear out the used data from buffer */ - } else { - g_byte_array_remove_range (load->attribute_buf, 0, length); - } - - return TRUE; -} - -static void -process_outstanding_attributes (GcrGnupgCollectionLoad *load) -{ - GcrRecord *record; - - if (load->attribute_queue == NULL) - return; - - g_debug ("%d outstanding attribute records", - (gint)g_queue_get_length (load->attribute_queue)); - - for (;;) { - record = g_queue_peek_head (load->attribute_queue); - if (record == NULL) - break; - if (!process_outstanding_attribute (load, record)) - break; - g_queue_pop_head (load->attribute_queue); - _gcr_record_free (record); - } -} - -static void -on_line_parse_output (const gchar *line, gpointer user_data) -{ - GcrGnupgCollectionLoad *load = user_data; - GcrRecord *record; - GQuark schema; - - g_debug ("output: %s", line); - - record = _gcr_record_parse_colons (line, -1); - if (!record) { - g_warning ("invalid gnupg output line: %s", line); - return; - } - - schema = _gcr_record_get_schema (record); - - /* - * Each time we see a line with 'pub' or 'sec' schema we assume that - * it's a new key being listed. - */ - if (schema == GCR_RECORD_SCHEMA_PUB || schema == GCR_RECORD_SCHEMA_SEC) { - g_debug ("start of new key"); - if (load->records->len) - process_records_as_key (load); - g_assert (!load->records->len); - g_ptr_array_add (load->records, record); - record = NULL; - - /* - * 'uid' and 'fpr' schema lines get added to the key that came before. - */ - } else if (schema == GCR_RECORD_SCHEMA_UID || - schema == GCR_RECORD_SCHEMA_FPR) { - if (load->records->len) { - g_ptr_array_add (load->records, record); - record = NULL; - } - } - - if (record != NULL) - _gcr_record_free (record); -} - - -static gssize -on_gnupg_process_output_data (gconstpointer buffer, - gsize count, - GCancellable *cancellable, - gpointer user_data, - GError **error) -{ - GTask *task = G_TASK (user_data); - GcrGnupgCollectionLoad *load = g_task_get_task_data (task); - - g_string_append_len (load->out_data, buffer, count); - _gcr_util_parse_lines (load->out_data, FALSE, on_line_parse_output, load); - return count; -} - -static void -on_gnupg_process_error_line (GcrGnupgProcess *process, const gchar *line, - gpointer user_data) -{ - g_printerr ("%s\n", line); -} - -static void -on_gnupg_process_status_record (GcrGnupgProcess *process, GcrRecord *record, - gpointer user_data) -{ - GTask *task = G_TASK (user_data); - GcrGnupgCollectionLoad *load = g_task_get_task_data (task); - - if (GCR_RECORD_SCHEMA_ATTRIBUTE != _gcr_record_get_schema (record)) - return; - - if (!load->attribute_queue) - load->attribute_queue = g_queue_new (); - - g_queue_push_tail (load->attribute_queue, _gcr_record_copy (record)); - process_outstanding_attributes (load); -} - -static gssize -on_gnupg_process_attribute_data (gconstpointer buffer, - gsize count, - GCancellable *cancellable, - gpointer user_data, - GError **error) -{ - GTask *task = G_TASK (user_data); - GcrGnupgCollectionLoad *load = g_task_get_task_data (task); - - /* If we don't have a buffer, just claim this one */ - if (!load->attribute_buf) - load->attribute_buf = g_byte_array_new (); - - g_byte_array_append (load->attribute_buf, buffer, count); - - process_outstanding_attributes (load); - return count; -} - -static void -on_gnupg_process_completed (GObject *source, GAsyncResult *result, gpointer user_data) -{ - GTask *task = G_TASK (user_data); - GcrGnupgCollectionLoad *load = g_task_get_task_data (task); - GHashTableIter iter; - GError *error = NULL; - GObject *object; - gpointer keyid; - - if (!_gcr_gnupg_process_run_finish (GCR_GNUPG_PROCESS (source), result, &error)) { - g_task_return_error (task, g_steal_pointer (&error)); - g_clear_object (&task); - return; - } - - /* Process any remaining output */ - _gcr_util_parse_lines (load->out_data, TRUE, on_line_parse_output, load); - - /* Process last bit as a key, if any */ - if (load->records->len) - process_records_as_key (load); - - /* If we completed loading public keys, then go and load secret */ - switch (load->loading_phase) { - case GCR_LOADING_PHASE_PUBLIC: - g_debug ("public load phase completed"); - load->loading_phase = GCR_LOADING_PHASE_SECRET; - spawn_gnupg_list_process (load, task); - g_clear_object (&task); - return; - case GCR_LOADING_PHASE_SECRET: - g_debug ("secret load phase completed"); - /* continue below */ - break; - default: - g_assert_not_reached (); - } - - /* Remove any keys that we still have in the difference */ - g_hash_table_iter_init (&iter, load->difference); - while (g_hash_table_iter_next (&iter, &keyid, NULL)) { - object = g_hash_table_lookup (load->collection->pv->items, keyid); - if (object != NULL) { - g_object_ref (object); - g_debug ("removing key no longer present in keyring: %s", (gchar*)keyid); - g_hash_table_remove (load->collection->pv->items, keyid); - gcr_collection_emit_removed (GCR_COLLECTION (load->collection), object); - g_object_unref (object); - } - } - - g_task_return_boolean (task, TRUE); - g_clear_object (&task); -} - -static void -spawn_gnupg_list_process (GcrGnupgCollectionLoad *load, GTask *task) -{ - GCancellable *cancellable = g_task_get_cancellable (task); - GcrGnupgProcessFlags flags = 0; - GPtrArray *argv; - - argv = g_ptr_array_new (); - - switch (load->loading_phase) { - case GCR_LOADING_PHASE_PUBLIC: - g_debug ("starting public load phase"); - g_ptr_array_add (argv, (gpointer)"--list-keys"); - /* Load photos in public phase */ - flags = GCR_GNUPG_PROCESS_WITH_ATTRIBUTES | - GCR_GNUPG_PROCESS_WITH_STATUS; - break; - case GCR_LOADING_PHASE_SECRET: - g_debug ("starting secret load phase"); - g_ptr_array_add (argv, (gpointer)"--list-secret-keys"); - break; - default: - g_assert_not_reached (); - } - - g_ptr_array_add (argv, (gpointer)"--fixed-list-mode"); - g_ptr_array_add (argv, (gpointer)"--with-colons"); - g_ptr_array_add (argv, (gpointer)"--with-fingerprint"); - g_ptr_array_add (argv, NULL); - - /* res is unreffed in on_gnupg_process_completed */ - _gcr_gnupg_process_run_async (load->process, (const gchar**)argv->pdata, NULL, flags, - cancellable, on_gnupg_process_completed, - g_object_ref (task)); - - g_ptr_array_unref (argv); -} - -/** - * _gcr_gnupg_collection_load_async: - * @self: The collection - * @cancellable: (nullable): Cancellation object or %NULL - * @callback: Callback to call when result is ready - * @user_data: Data for callback - * - * Start an operation to load or reload the list of gnupg keys in this - * collection. - */ -void -_gcr_gnupg_collection_load_async (GcrGnupgCollection *self, GCancellable *cancellable, - GAsyncReadyCallback callback, gpointer user_data) -{ - GTask *task; - GcrGnupgCollectionLoad *load; - GHashTableIter iter; - gpointer keyid; - - g_return_if_fail (GCR_IS_GNUPG_COLLECTION (self)); - - /* TODO: Cancellation not yet implemented */ - - task = g_task_new (self, cancellable, callback, user_data); - g_task_set_source_tag (task, _gcr_gnupg_collection_load_async); - - load = g_slice_new0 (GcrGnupgCollectionLoad); - load->records = g_ptr_array_new_with_free_func (_gcr_record_free); - load->out_data = g_string_sized_new (1024); - load->collection = g_object_ref (self); - - load->output = _gcr_callback_output_stream_new (on_gnupg_process_output_data, task, NULL); - load->outattr = _gcr_callback_output_stream_new (on_gnupg_process_attribute_data, task, NULL); - - load->process = _gcr_gnupg_process_new (self->pv->directory, NULL); - _gcr_gnupg_process_set_output_stream (load->process, load->output); - _gcr_gnupg_process_set_attribute_stream (load->process, load->outattr); - load->error_sig = g_signal_connect (load->process, "error-line", G_CALLBACK (on_gnupg_process_error_line), task); - load->status_sig = g_signal_connect (load->process, "status-record", G_CALLBACK (on_gnupg_process_status_record), task); - - /* - * Track all the keys we currently have, at end remove those that - * didn't get listed by the gpg process. - */ - load->difference = g_hash_table_new (g_str_hash, g_str_equal); - g_hash_table_iter_init (&iter, self->pv->items); - while (g_hash_table_iter_next (&iter, &keyid, NULL)) - g_hash_table_insert (load->difference, keyid, keyid); - - g_task_set_task_data (task, load, _gcr_gnupg_collection_load_free); - - load->loading_phase = GCR_LOADING_PHASE_PUBLIC; - spawn_gnupg_list_process (load, task); - - g_clear_object (&task); -} - -/** - * _gcr_gnupg_collection_load_finish: - * @self: The collection - * @result: The result passed to the callback - * @error: Location to raise an error on failure. - * - * Get the result of an operation to load or reload the list of gnupg keys - * in this collection. - */ -gboolean -_gcr_gnupg_collection_load_finish (GcrGnupgCollection *self, GAsyncResult *result, - GError **error) -{ - g_return_val_if_fail (GCR_IS_GNUPG_COLLECTION (self), FALSE); - g_return_val_if_fail (!error || !*error, FALSE); - - g_return_val_if_fail (g_task_is_valid (result, self), FALSE); - - return g_task_propagate_boolean (G_TASK (result), error); -} diff --git a/gcr/gcr-gnupg-collection.h b/gcr/gcr-gnupg-collection.h deleted file mode 100644 index ca22a9b..0000000 --- a/gcr/gcr-gnupg-collection.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef GCR_GNUPG_COLLECTION_H -#define GCR_GNUPG_COLLECTION_H - -#include "gcr-collection.h" - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_GNUPG_COLLECTION (_gcr_gnupg_collection_get_type ()) -#define GCR_GNUPG_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollection)) -#define GCR_GNUPG_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollectionClass)) -#define GCR_IS_GNUPG_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_COLLECTION)) -#define GCR_IS_GNUPG_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_COLLECTION)) -#define GCR_GNUPG_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_COLLECTION, GcrGnupgCollectionClass)) - -typedef struct _GcrGnupgCollection GcrGnupgCollection; -typedef struct _GcrGnupgCollectionClass GcrGnupgCollectionClass; -typedef struct _GcrGnupgCollectionPrivate GcrGnupgCollectionPrivate; - -struct _GcrGnupgCollection { - /*< private >*/ - GObject parent; - GcrGnupgCollectionPrivate *pv; -}; - -struct _GcrGnupgCollectionClass { - GObjectClass parent_class; -}; - -GType _gcr_gnupg_collection_get_type (void); - -GcrCollection* _gcr_gnupg_collection_new (const gchar *directory); - -void _gcr_gnupg_collection_load_async (GcrGnupgCollection *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - -gboolean _gcr_gnupg_collection_load_finish (GcrGnupgCollection *self, - GAsyncResult *result, - GError **error); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrGnupgCollection, g_object_unref) - -G_END_DECLS - -#endif /* GCR_GNUPG_COLLECTION_H */ diff --git a/gcr/gcr-gnupg-importer.c b/gcr/gcr-gnupg-importer.c index 79fa043..63b7b58 100644 --- a/gcr/gcr-gnupg-importer.c +++ b/gcr/gcr-gnupg-importer.c @@ -45,7 +45,7 @@ struct _GcrGnupgImporterPrivate { GArray *imported; }; -static void gcr_gnupg_importer_iface (GcrImporterIface *iface); +static void gcr_gnupg_importer_iface (GcrImporterInterface *iface); G_DEFINE_TYPE_WITH_CODE (GcrGnupgImporter, _gcr_gnupg_importer, G_TYPE_OBJECT, G_ADD_PRIVATE (GcrGnupgImporter); @@ -348,7 +348,7 @@ _gcr_gnupg_importer_import_finish (GcrImporter *importer, } static void -gcr_gnupg_importer_iface (GcrImporterIface *iface) +gcr_gnupg_importer_iface (GcrImporterInterface *iface) { iface->create_for_parsed = _gcr_gnupg_importer_create_for_parsed; iface->queue_for_parsed = _gcr_gnupg_importer_queue_for_parsed; diff --git a/gcr/gcr-gnupg-importer.h b/gcr/gcr-gnupg-importer.h index 4bb9550..6b75607 100644 --- a/gcr/gcr-gnupg-importer.h +++ b/gcr/gcr-gnupg-importer.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> can be included directly." -#endif - #ifndef __GCR_GNUPG_IMPORTER_H__ #define __GCR_GNUPG_IMPORTER_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-importer.h" #include <glib-object.h> diff --git a/gcr/gcr-gnupg-key.h b/gcr/gcr-gnupg-key.h index 1daed6d..9a3da2b 100644 --- a/gcr/gcr-gnupg-key.h +++ b/gcr/gcr-gnupg-key.h @@ -17,13 +17,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef GCR_GNUPG_KEY_H #define GCR_GNUPG_KEY_H +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib-object.h> #include "gcr-column.h" diff --git a/gcr/gcr-gnupg-records.h b/gcr/gcr-gnupg-records.h index 4f4e673..1f26538 100644 --- a/gcr/gcr-gnupg-records.h +++ b/gcr/gcr-gnupg-records.h @@ -17,10 +17,6 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> can be included directly." -#endif - #ifndef GCR_GNUPG_RECORDS_H #define GCR_GNUPG_RECORDS_H diff --git a/gcr/gcr-gnupg-util.h b/gcr/gcr-gnupg-util.h index 300cda8..48c8b6a 100644 --- a/gcr/gcr-gnupg-util.h +++ b/gcr/gcr-gnupg-util.h @@ -17,10 +17,6 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef GCR_GNUPG_UTIL_H #define GCR_GNUPG_UTIL_H diff --git a/gcr/gcr-icons.h b/gcr/gcr-icons.h index f4b981a..4915fe1 100644 --- a/gcr/gcr-icons.h +++ b/gcr/gcr-icons.h @@ -18,13 +18,13 @@ * License along with this program; if not, see <http://www.gnu.org/licenses/>. */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_ICONS_H__ #define __GCR_ICONS_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <gck/gck.h> #include <gio/gio.h> diff --git a/gcr/gcr-import-interaction.c b/gcr/gcr-import-interaction.c index b8da073..edf0675 100644 --- a/gcr/gcr-import-interaction.c +++ b/gcr/gcr-import-interaction.c @@ -33,7 +33,7 @@ */ /** - * GcrImportInteractionIface: + * GcrImportInteractionInterface: * @parent: parent interface * @supplement_prep: method which prepares for supplementing the given attributes before import * @supplement: method which synchronously supplements attributes before import @@ -43,18 +43,11 @@ * Interface implemented by implementations of [iface@ImportInteraction]. */ -typedef GcrImportInteractionIface GcrImportInteractionInterface; - G_DEFINE_INTERFACE (GcrImportInteraction, gcr_import_interaction, G_TYPE_TLS_INTERACTION); static void -gcr_import_interaction_default_init (GcrImportInteractionIface *iface) +gcr_import_interaction_default_init (GcrImportInteractionInterface *iface) { - static size_t initialized = 0; - - if (g_once_init_enter (&initialized)) { - g_once_init_leave (&initialized, 1); - } } /** @@ -74,12 +67,12 @@ void gcr_import_interaction_supplement_prep (GcrImportInteraction *interaction, GckBuilder *builder) { - GcrImportInteractionIface *iface; + GcrImportInteractionInterface *iface; g_return_if_fail (GCR_IS_IMPORT_INTERACTION (interaction)); g_return_if_fail (builder != NULL); - iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction); + iface = GCR_IMPORT_INTERACTION_GET_IFACE (interaction); if (iface->supplement != NULL) (iface->supplement_prep) (interaction, builder); } @@ -106,14 +99,14 @@ gcr_import_interaction_supplement (GcrImportInteraction *interaction, GCancellable *cancellable, GError **error) { - GcrImportInteractionIface *iface; + GcrImportInteractionInterface *iface; g_return_val_if_fail (GCR_IS_IMPORT_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED); g_return_val_if_fail (builder != NULL, G_TLS_INTERACTION_UNHANDLED); g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), G_TLS_INTERACTION_UNHANDLED); g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED); - iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction); + iface = GCR_IMPORT_INTERACTION_GET_IFACE (interaction); g_return_val_if_fail (iface->supplement != NULL, G_TLS_INTERACTION_UNHANDLED); return (iface->supplement) (interaction, builder, cancellable, error); @@ -141,13 +134,13 @@ gcr_import_interaction_supplement_async (GcrImportInteraction *interaction, GAsyncReadyCallback callback, gpointer user_data) { - GcrImportInteractionIface *iface; + GcrImportInteractionInterface *iface; g_return_if_fail (GCR_IS_IMPORT_INTERACTION (interaction)); g_return_if_fail (builder != NULL); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction); + iface = GCR_IMPORT_INTERACTION_GET_IFACE (interaction); g_return_if_fail (iface->supplement != NULL); (iface->supplement_async) (interaction, builder, cancellable, callback, user_data); @@ -171,13 +164,13 @@ gcr_import_interaction_supplement_finish (GcrImportInteraction *interaction, GAsyncResult *result, GError **error) { - GcrImportInteractionIface *iface; + GcrImportInteractionInterface *iface; g_return_val_if_fail (GCR_IS_IMPORT_INTERACTION (interaction), G_TLS_INTERACTION_UNHANDLED); g_return_val_if_fail (G_IS_ASYNC_RESULT (result), G_TLS_INTERACTION_UNHANDLED); g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED); - iface = GCR_IMPORT_INTERACTION_GET_INTERFACE (interaction); + iface = GCR_IMPORT_INTERACTION_GET_IFACE (interaction); g_return_val_if_fail (iface->supplement != NULL, G_TLS_INTERACTION_UNHANDLED); return (iface->supplement_finish) (interaction, result, error); diff --git a/gcr/gcr-import-interaction.h b/gcr/gcr-import-interaction.h index 79d615b..180cbb9 100644 --- a/gcr/gcr-import-interaction.h +++ b/gcr/gcr-import-interaction.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_IMPORT_INTERACTION_H__ #define __GCR_IMPORT_INTERACTION_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-importer.h" #include <glib-object.h> @@ -34,15 +34,10 @@ G_BEGIN_DECLS -#define GCR_TYPE_IMPORT_INTERACTION (gcr_import_interaction_get_type ()) -#define GCR_IMPORT_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORT_INTERACTION, GcrImportInteraction)) -#define GCR_IS_IMPORT_INTERACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORT_INTERACTION)) -#define GCR_IMPORT_INTERACTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_IMPORT_INTERACTION, GcrImportInteractionIface)) +#define GCR_TYPE_IMPORT_INTERACTION gcr_import_interaction_get_type () +G_DECLARE_INTERFACE(GcrImportInteraction, gcr_import_interaction, GCR, IMPORT_INTERACTION, GTlsInteraction) -typedef struct _GcrImportInteraction GcrImportInteraction; -typedef struct _GcrImportInteractionIface GcrImportInteractionIface; - -struct _GcrImportInteractionIface { +struct _GcrImportInteractionInterface { GTypeInterface parent; void (*supplement_prep) (GcrImportInteraction *interaction, @@ -67,8 +62,6 @@ struct _GcrImportInteractionIface { gpointer reserved[6]; }; -GType gcr_import_interaction_get_type (void); - void gcr_import_interaction_supplement_prep (GcrImportInteraction *interaction, GckBuilder *builder); diff --git a/gcr/gcr-importer.c b/gcr/gcr-importer.c index 802ded0..f1916f0 100644 --- a/gcr/gcr-importer.c +++ b/gcr/gcr-importer.c @@ -21,7 +21,6 @@ #include "config.h" -#include "gcr-deprecated-base.h" #include "gcr-importer.h" #include "gcr-internal.h" #include "gcr-gnupg-importer.h" @@ -53,7 +52,7 @@ */ /** - * GcrImporterIface: + * GcrImporterInterface: * @parent: parent interface * @create_for_parsed: implementation of gcr_importer_create_for_parsed(), required * @queue_for_parsed: implementation of gcr_importer_queue_for_parsed(), required @@ -64,8 +63,6 @@ * Interface implemented for a #GcrImporter. */ -typedef GcrImporterIface GcrImporterInterface; - G_DEFINE_INTERFACE (GcrImporter, gcr_importer, G_TYPE_OBJECT); typedef struct _GcrRegistered { @@ -77,7 +74,7 @@ static GArray *registered_importers = NULL; static gboolean registered_sorted = FALSE; static void -gcr_importer_default_init (GcrImporterIface *iface) +gcr_importer_default_init (GcrImporterInterface *iface) { static size_t initialized = 0; @@ -131,11 +128,9 @@ gcr_importer_default_init (GcrImporterIface *iface) /** * gcr_importer_register: * @importer_type: the GType of the importer being registered - * @attrs: the attributes that this importer is compatible with + * @attrs: (transfer full): the attributes that this importer is compatible with * * Register an importer to handle parsed items that match the given attributes. - * - * If @attrs are a floating reference, then it is consumed. */ void gcr_importer_register (GType importer_type, @@ -147,7 +142,7 @@ gcr_importer_register (GType importer_type, registered_importers = g_array_new (FALSE, FALSE, sizeof (GcrRegistered)); registered.importer_type = importer_type; - registered.attrs = gck_attributes_ref_sink (attrs); + registered.attrs = attrs; g_array_append_val (registered_importers, registered); registered_sorted = FALSE; } @@ -197,7 +192,7 @@ GList * gcr_importer_create_for_parsed (GcrParsed *parsed) { GcrRegistered *registered; - GcrImporterIface *iface; + GcrImporterInterface *iface; gpointer instance_class; GckAttributes *attrs; gboolean matched; @@ -286,12 +281,12 @@ gboolean gcr_importer_queue_for_parsed (GcrImporter *importer, GcrParsed *parsed) { - GcrImporterIface *iface; + GcrImporterInterface *iface; g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE); g_return_val_if_fail (parsed != NULL, FALSE); - iface = GCR_IMPORTER_GET_INTERFACE (importer); + iface = GCR_IMPORTER_GET_IFACE (importer); g_return_val_if_fail (iface != NULL, FALSE); g_return_val_if_fail (iface->queue_for_parsed != NULL, FALSE); @@ -378,13 +373,13 @@ gcr_importer_import (GcrImporter *importer, { gboolean result; ImportClosure *closure; - GcrImporterIface *iface; + GcrImporterInterface *iface; g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE); g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - iface = GCR_IMPORTER_GET_INTERFACE (importer); + iface = GCR_IMPORTER_GET_IFACE (importer); if (iface->import_sync) return (iface->import_sync) (importer, cancellable, error); @@ -455,12 +450,12 @@ gcr_importer_import_async (GcrImporter *importer, GAsyncReadyCallback callback, gpointer user_data) { - GcrImporterIface *iface; + GcrImporterInterface *iface; g_return_if_fail (GCR_IS_IMPORTER (importer)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - iface = GCR_IMPORTER_GET_INTERFACE (importer); + iface = GCR_IMPORTER_GET_IFACE (importer); g_return_if_fail (iface != NULL); g_return_if_fail (iface->import_async != NULL); @@ -482,13 +477,13 @@ gcr_importer_import_finish (GcrImporter *importer, GAsyncResult *result, GError **error) { - GcrImporterIface *iface; + GcrImporterInterface *iface; g_return_val_if_fail (GCR_IS_IMPORTER (importer), FALSE); g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - iface = GCR_IMPORTER_GET_INTERFACE (importer); + iface = GCR_IMPORTER_GET_IFACE (importer); g_return_val_if_fail (iface != NULL, FALSE); g_return_val_if_fail (iface->import_finish != NULL, FALSE); @@ -546,105 +541,3 @@ gcr_importer_register_well_known (void) g_type_class_unref (g_type_class_ref (GCR_TYPE_PKCS11_IMPORTER)); g_type_class_unref (g_type_class_ref (GCR_TYPE_GNUPG_IMPORTER)); } - -#ifndef GCR_DISABLE_DEPRECATED - -/** - * gcr_importer_get_parser: - * @self: An importer - * - * Has no effect. Use gcr_importer_listen() instead. - * - * Returns: %NULL is always returned. - * Deprecated: Since 3.0.0 - */ -GcrParser* -gcr_importer_get_parser (GcrImporter *self) -{ - g_warning ("gcr_importer_get_parser() is no longer supported " - "Use gcr_importer_listen() instead."); - return NULL; -} - -/** - * gcr_importer_set_parser: - * @self: An importer - * @parser: A parser - * - * Has no effect. Use gcr_importer_listen() instead. - * - * Deprecated: Since 3.0.0 - */ -void -gcr_importer_set_parser (GcrImporter *self, - GcrParser *parser) -{ - g_warning ("gcr_importer_set_parser() is no longer supported " - "Use gcr_importer_listen() instead."); -} - -/* - * gcr_importer_get_slot: - * @self: The importer - * - * Returns %NULL. - * - * Deprecated: since 3.4.0 - */ -GckSlot * -gcr_importer_get_slot (GcrImporter *self) -{ - g_warning ("gcr_importer_get_slot() is no longer supported."); - return NULL; -} - -/** - * gcr_importer_set_slot: - * @self: The importer - * @slot: The slot to import to - * - * Has no effect. - * - * Deprecated: since 3.4.0 - */ -void -gcr_importer_set_slot (GcrImporter *self, - GckSlot *slot) -{ - g_warning ("gcr_importer_set_slot() is no longer supported."); -} - -/** - * gcr_importer_get_prompt_behavior: - * @self: The importer - * - * Does nothing. - * - * Returns: zero - * - * Deprecated: since 3.4.0 - */ -GcrImporterPromptBehavior -gcr_importer_get_prompt_behavior (GcrImporter *self) -{ - g_warning ("gcr_importer_get_prompt_behavior() is no longer supported."); - return 0; -} - -/** - * gcr_importer_set_prompt_behavior: - * @self: The importer - * @behavior: The prompt behavior flag - * - * Has no effect. - * - * Deprecated: since 3.4.0 - */ -void -gcr_importer_set_prompt_behavior (GcrImporter *self, - GcrImporterPromptBehavior behavior) -{ - g_warning ("gcr_importer_set_prompt_behavior() is no longer supported."); -} - -#endif /* GCR_DISABLE_DEPRECATED */ diff --git a/gcr/gcr-importer.h b/gcr/gcr-importer.h index 7a1bcc1..3eab68c 100644 --- a/gcr/gcr-importer.h +++ b/gcr/gcr-importer.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_IMPORTER_H__ #define __GCR_IMPORTER_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-parser.h" #include <glib-object.h> @@ -34,15 +34,10 @@ G_BEGIN_DECLS -#define GCR_TYPE_IMPORTER (gcr_importer_get_type ()) -#define GCR_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORTER, GcrImporter)) -#define GCR_IS_IMPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORTER)) -#define GCR_IMPORTER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_IMPORTER, GcrImporterIface)) +#define GCR_TYPE_IMPORTER gcr_importer_get_type () +G_DECLARE_INTERFACE (GcrImporter, gcr_importer, GCR, IMPORTER, GObject) -typedef struct _GcrImporter GcrImporter; -typedef struct _GcrImporterIface GcrImporterIface; - -struct _GcrImporterIface { +struct _GcrImporterInterface { GTypeInterface parent; GList * (*create_for_parsed) (GcrParsed *parsed); @@ -67,8 +62,6 @@ struct _GcrImporterIface { gpointer reserved[14]; }; -GType gcr_importer_get_type (void); - GList * gcr_importer_create_for_parsed (GcrParsed *parsed); gboolean gcr_importer_queue_for_parsed (GcrImporter *importer, diff --git a/gcr/gcr-key-mechanisms.c b/gcr/gcr-key-mechanisms.c index 7d82908..89f968a 100644 --- a/gcr/gcr-key-mechanisms.c +++ b/gcr/gcr-key-mechanisms.c @@ -70,7 +70,7 @@ find_first_usable_mechanism (GckObject *key, break; } - gck_mechanisms_free (mechs); + g_array_unref (mechs); if (i < n_mechanisms) return mechanisms[i]; diff --git a/gcr/gcr-key-mechanisms.h b/gcr/gcr-key-mechanisms.h index 37cf46c..dc33085 100644 --- a/gcr/gcr-key-mechanisms.h +++ b/gcr/gcr-key-mechanisms.h @@ -17,10 +17,6 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_KEY_MECHANISMS_H__ #define __GCR_KEY_MECHANISMS_H__ diff --git a/gcr/gcr-library.c b/gcr/gcr-library.c index 44460ee..efc4b4a 100644 --- a/gcr/gcr-library.c +++ b/gcr/gcr-library.c @@ -19,7 +19,6 @@ #include "config.h" -#include "gcr-deprecated-base.h" #include "gcr-internal.h" #include "gcr-library.h" #include "gcr-types.h" @@ -95,15 +94,6 @@ gcr_data_error_get_domain (void) return domain; } -GQuark -gcr_error_get_domain (void) -{ - static GQuark domain = 0; - if (domain == 0) - domain = g_quark_from_static_string ("gcr-error"); - return domain; -} - /* ----------------------------------------------------------------------------- * INITIALIZATION */ diff --git a/gcr/gcr-library.h b/gcr/gcr-library.h index 9650497..91c240a 100644 --- a/gcr/gcr-library.h +++ b/gcr/gcr-library.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef GCR_LIBRARY_H_ #define GCR_LIBRARY_H_ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-types.h" #include <glib.h> diff --git a/gcr/gcr-mock-prompter.c b/gcr/gcr-mock-prompter.c index 1ca4589..0fb6221 100644 --- a/gcr/gcr-mock-prompter.c +++ b/gcr/gcr-mock-prompter.c @@ -101,7 +101,7 @@ typedef struct { static gint prompts_a_prompting = 0; static ThreadData *running = NULL; -static void gcr_mock_prompt_iface (GcrPromptIface *iface); +static void gcr_mock_prompt_iface (GcrPromptInterface *iface); G_DEFINE_TYPE_WITH_CODE (GcrMockPrompt, _gcr_mock_prompt, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_mock_prompt_iface); @@ -558,7 +558,7 @@ gcr_mock_prompt_password_finish (GcrPrompt *prompt, } static void -gcr_mock_prompt_iface (GcrPromptIface *iface) +gcr_mock_prompt_iface (GcrPromptInterface *iface) { iface->prompt_confirm_async = gcr_mock_prompt_confirm_async; iface->prompt_confirm_finish = gcr_mock_prompt_confirm_finish; diff --git a/gcr/gcr-mock-prompter.h b/gcr/gcr-mock-prompter.h index 369fd5f..f0585d7 100644 --- a/gcr/gcr-mock-prompter.h +++ b/gcr/gcr-mock-prompter.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_MOCK_PROMPTER_H__ #define __GCR_MOCK_PROMPTER_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-system-prompter.h" #include <glib-object.h> diff --git a/gcr/gcr-openpgp.h b/gcr/gcr-openpgp.h index f4825e1..c98c927 100644 --- a/gcr/gcr-openpgp.h +++ b/gcr/gcr-openpgp.h @@ -19,10 +19,6 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> can be included directly." -#endif - #ifndef __GCR_OPENPGP_H__ #define __GCR_OPENPGP_H__ diff --git a/gcr/gcr-openssh.c b/gcr/gcr-openssh.c index af4d550..a4b7ebe 100644 --- a/gcr/gcr-openssh.c +++ b/gcr/gcr-openssh.c @@ -230,7 +230,7 @@ parse_v1_public_line (const gchar *line, if (word_options) options = g_strndup (word_options, len_options); - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); if (callback != NULL) { bytes = g_bytes_new_with_free_func (outer, n_outer, @@ -542,7 +542,7 @@ parse_v2_public_line (const gchar *line, gck_builder_add_string (&builder, CKA_LABEL, label); } - attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + attrs = gck_builder_end (&builder); if (callback != NULL) { bytes = g_bytes_new_with_free_func (outer, n_outer, diff --git a/gcr/gcr-openssh.h b/gcr/gcr-openssh.h index a179afa..6fe75d5 100644 --- a/gcr/gcr-openssh.h +++ b/gcr/gcr-openssh.h @@ -19,10 +19,6 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> can be included directly." -#endif - #ifndef __GCR_OPENSSH_H__ #define __GCR_OPENSSH_H__ diff --git a/gcr/gcr-parser.c b/gcr/gcr-parser.c index ba3927e..1de17f9 100644 --- a/gcr/gcr-parser.c +++ b/gcr/gcr-parser.c @@ -482,7 +482,7 @@ parsed_fire (GcrParser *self, g_assert (parsed == self->pv->parsed); g_assert (parsed->attrs == NULL); - parsed->attrs = gck_attributes_ref_sink (gck_builder_end (&parsed->builder)); + parsed->attrs = gck_builder_end (&parsed->builder); g_object_notify (G_OBJECT (self), "parsed-description"); g_object_notify (G_OBJECT (self), "parsed-attributes"); diff --git a/gcr/gcr-parser.h b/gcr/gcr-parser.h index a19a98f..67b3bca 100644 --- a/gcr/gcr-parser.h +++ b/gcr/gcr-parser.h @@ -17,13 +17,13 @@ * License along with this program; if not, see <http://www.gnu.org/licenses/>. */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_PARSER_H__ #define __GCR_PARSER_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib-object.h> #include <gio/gio.h> diff --git a/gcr/gcr-pkcs11-certificate.c b/gcr/gcr-pkcs11-certificate.c index e3c3b55..db35aba 100644 --- a/gcr/gcr-pkcs11-certificate.c +++ b/gcr/gcr-pkcs11-certificate.c @@ -74,7 +74,7 @@ prepare_lookup_certificate_issuer (GcrCertificate *cert) gck_builder_add_data (&builder, CKA_SUBJECT, data, n_data); g_free (data); - return gck_attributes_ref_sink (gck_builder_end (&builder)); + return gck_builder_end (&builder); } static GcrCertificate* diff --git a/gcr/gcr-pkcs11-certificate.h b/gcr/gcr-pkcs11-certificate.h index a1cd444..2ed2085 100644 --- a/gcr/gcr-pkcs11-certificate.h +++ b/gcr/gcr-pkcs11-certificate.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_PKCS11_CERTIFICATE_H__ #define __GCR_PKCS11_CERTIFICATE_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-types.h" #include "gcr-certificate.h" diff --git a/gcr/gcr-pkcs11-importer.c b/gcr/gcr-pkcs11-importer.c index 302eb72..8f65f35 100644 --- a/gcr/gcr-pkcs11-importer.c +++ b/gcr/gcr-pkcs11-importer.c @@ -72,7 +72,7 @@ static void state_cancelled (GTask *task, gboolean async); static void state_create_object (GTask *task, gboolean async); -static void _gcr_pkcs11_importer_init_iface (GcrImporterIface *iface); +static void _gcr_pkcs11_importer_init_iface (GcrImporterInterface *iface); G_DEFINE_TYPE_WITH_CODE (GcrPkcs11Importer, _gcr_pkcs11_importer, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORTER, _gcr_pkcs11_importer_init_iface); @@ -306,7 +306,7 @@ supplement_attributes (GcrPkcs11Importer *self, } gck_attributes_unref (attrs); - l->data = attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + l->data = attrs = gck_builder_end (&builder); switch (klass) { case CKO_CERTIFICATE: @@ -340,14 +340,14 @@ supplement_attributes (GcrPkcs11Importer *self, supplement_with_attributes (&builder, supplements); supplement_id_for_data (&builder, nonce, sizeof (nonce), fingerprint, strlen (fingerprint)); - g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder))); + g_queue_push_tail (queue, gck_builder_end (&builder)); g_hash_table_insert (paired, pair->private_key, "present"); gck_builder_add_all (&builder, pair->certificate); supplement_with_attributes (&builder, supplements); supplement_id_for_data (&builder, nonce, sizeof (nonce), fingerprint, strlen (fingerprint)); - g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder))); + g_queue_push_tail (queue, gck_builder_end (&builder)); g_hash_table_insert (paired, pair->certificate, "present"); /* Used the suplements for the pairs, don't use for unpaired stuff */ @@ -371,7 +371,7 @@ supplement_attributes (GcrPkcs11Importer *self, supplement_id_for_data (&builder, nonce, sizeof (nonce), &attrs, sizeof (gpointer)); - g_queue_push_tail (queue, gck_attributes_ref_sink (gck_builder_end (&builder))); + g_queue_push_tail (queue, gck_builder_end (&builder)); } } @@ -392,7 +392,7 @@ complete_supplement (GTask *task, GckAttributes *attributes; if (error == NULL) { - attributes = gck_attributes_ref_sink (gck_builder_end (data->supplement)); + attributes = gck_builder_end (data->supplement); supplement_attributes (data->importer, attributes); gck_attributes_unref (attributes); @@ -628,7 +628,7 @@ calculate_uri (GcrPkcs11Importer *self) data = gck_uri_data_new (); data->token_info = gck_slot_get_token_info (self->slot); - uri = gck_uri_build (data, GCK_URI_FOR_TOKEN); + uri = gck_uri_data_build (data, GCK_URI_FOR_TOKEN); data->token_info = NULL; gck_uri_data_free (data); @@ -754,7 +754,7 @@ is_slot_importable (GckSlot *slot, } for (i = 0; token_blacklist[i] != NULL; i++) { - uri = gck_uri_parse (token_blacklist[i], GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE, &error); + uri = gck_uri_data_parse (token_blacklist[i], GCK_URI_FOR_TOKEN | GCK_URI_FOR_MODULE, &error); if (uri == NULL) { g_warning ("couldn't parse pkcs11 blacklist uri: %s", error->message); g_clear_error (&error); @@ -851,7 +851,7 @@ _gcr_pkcs11_importer_import_finish (GcrImporter *importer, } static void -_gcr_pkcs11_importer_init_iface (GcrImporterIface *iface) +_gcr_pkcs11_importer_init_iface (GcrImporterInterface *iface) { iface->create_for_parsed = _gcr_pkcs11_importer_create_for_parsed; iface->queue_for_parsed = _gcr_pkcs11_importer_queue_for_parsed; @@ -911,7 +911,9 @@ _gcr_pkcs11_importer_queue (GcrPkcs11Importer *self, gck_builder_add_all (&builder, attrs); gck_builder_add_string (&builder, CKA_LABEL, label); attrs = gck_builder_end (&builder); + } else { + gck_attributes_ref (attrs); } - g_queue_push_tail (self->queue, gck_attributes_ref_sink (attrs)); + g_queue_push_tail (self->queue, attrs); } diff --git a/gcr/gcr-pkcs11-importer.h b/gcr/gcr-pkcs11-importer.h index 3b1780d..c35655f 100644 --- a/gcr/gcr-pkcs11-importer.h +++ b/gcr/gcr-pkcs11-importer.h @@ -20,10 +20,6 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> can be included directly." -#endif - #ifndef __GCR_PKCS11_IMPORTER_H__ #define __GCR_PKCS11_IMPORTER_H__ diff --git a/gcr/gcr-prompt.c b/gcr/gcr-prompt.c index 1cae21e..17b6a46 100644 --- a/gcr/gcr-prompt.c +++ b/gcr/gcr-prompt.c @@ -49,7 +49,7 @@ */ /** - * GcrPromptIface: + * GcrPromptInterface: * @parent_iface: parent interface * @prompt_password_async: begin a password prompt * @prompt_password_finish: complete a password prompt @@ -81,14 +81,12 @@ typedef struct { GMainContext *context; } RunClosure; -typedef GcrPromptIface GcrPromptInterface; - -static void gcr_prompt_default_init (GcrPromptIface *iface); +static void gcr_prompt_default_init (GcrPromptInterface *iface); G_DEFINE_INTERFACE (GcrPrompt, gcr_prompt, G_TYPE_OBJECT); static void -gcr_prompt_default_init (GcrPromptIface *iface) +gcr_prompt_default_init (GcrPromptInterface *iface) { static gsize initialized = 0; @@ -240,7 +238,7 @@ gcr_prompt_default_init (GcrPromptIface *iface) * You can use the [method@Prompt.close] method to emit this signal. */ signals[PROMPT_CLOSE] = g_signal_new ("prompt-close", GCR_TYPE_PROMPT, G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GcrPromptIface, prompt_close), + G_STRUCT_OFFSET (GcrPromptInterface, prompt_close), NULL, NULL, NULL, G_TYPE_NONE, 0); @@ -297,12 +295,12 @@ void gcr_prompt_reset (GcrPrompt *prompt) { GParamSpec **params; - GcrPromptIface *iface; + GcrPromptInterface *iface; guint i, n_params; g_return_if_fail (GCR_IS_PROMPT (prompt)); - iface = GCR_PROMPT_GET_INTERFACE (prompt); + iface = GCR_PROMPT_GET_IFACE (prompt); params = g_object_interface_list_properties (iface, &n_params); g_object_freeze_notify (G_OBJECT (prompt)); @@ -770,12 +768,12 @@ gcr_prompt_password_async (GcrPrompt *prompt, GAsyncReadyCallback callback, gpointer user_data) { - GcrPromptIface *iface; + GcrPromptInterface *iface; g_return_if_fail (GCR_IS_PROMPT (prompt)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - iface = GCR_PROMPT_GET_INTERFACE (prompt); + iface = GCR_PROMPT_GET_IFACE (prompt); g_return_if_fail (iface->prompt_password_async); (iface->prompt_password_async) (prompt, cancellable, callback, user_data); @@ -803,13 +801,13 @@ gcr_prompt_password_finish (GcrPrompt *prompt, GAsyncResult *result, GError **error) { - GcrPromptIface *iface; + GcrPromptInterface *iface; g_return_val_if_fail (GCR_IS_PROMPT (prompt), NULL); g_return_val_if_fail (G_IS_ASYNC_RESULT (result), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - iface = GCR_PROMPT_GET_INTERFACE (prompt); + iface = GCR_PROMPT_GET_IFACE (prompt); g_return_val_if_fail (iface->prompt_password_async, NULL); return (iface->prompt_password_finish) (prompt, result, error); @@ -924,12 +922,12 @@ gcr_prompt_confirm_async (GcrPrompt *prompt, GAsyncReadyCallback callback, gpointer user_data) { - GcrPromptIface *iface; + GcrPromptInterface *iface; g_return_if_fail (GCR_IS_PROMPT (prompt)); g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - iface = GCR_PROMPT_GET_INTERFACE (prompt); + iface = GCR_PROMPT_GET_IFACE (prompt); g_return_if_fail (iface->prompt_confirm_async); (iface->prompt_confirm_async) (prompt, cancellable, callback, user_data); @@ -954,13 +952,13 @@ gcr_prompt_confirm_finish (GcrPrompt *prompt, GAsyncResult *result, GError **error) { - GcrPromptIface *iface; + GcrPromptInterface *iface; g_return_val_if_fail (GCR_IS_PROMPT (prompt), GCR_PROMPT_REPLY_CANCEL); g_return_val_if_fail (G_IS_ASYNC_RESULT (result), GCR_PROMPT_REPLY_CANCEL); g_return_val_if_fail (error == NULL || *error == NULL, GCR_PROMPT_REPLY_CANCEL); - iface = GCR_PROMPT_GET_INTERFACE (prompt); + iface = GCR_PROMPT_GET_IFACE (prompt); g_return_val_if_fail (iface->prompt_confirm_async, GCR_PROMPT_REPLY_CANCEL); return (iface->prompt_confirm_finish) (prompt, result, error); diff --git a/gcr/gcr-prompt.h b/gcr/gcr-prompt.h index 56b9339..7c741fc 100644 --- a/gcr/gcr-prompt.h +++ b/gcr/gcr-prompt.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stef@thewalter.net> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_PROMPT_H__ #define __GCR_PROMPT_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-types.h" #include <glib-object.h> @@ -37,15 +37,10 @@ typedef enum { GCR_PROMPT_REPLY_CONTINUE = 1, } GcrPromptReply; -#define GCR_TYPE_PROMPT (gcr_prompt_get_type ()) -#define GCR_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PROMPT, GcrPrompt)) -#define GCR_IS_PROMPT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PROMPT)) -#define GCR_PROMPT_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_PROMPT, GcrPromptIface)) +#define GCR_TYPE_PROMPT gcr_prompt_get_type () +G_DECLARE_INTERFACE (GcrPrompt, gcr_prompt, GCR, PROMPT, GObject) -typedef struct _GcrPrompt GcrPrompt; -typedef struct _GcrPromptIface GcrPromptIface; - -struct _GcrPromptIface { +struct _GcrPromptInterface { GTypeInterface parent_iface; void (* prompt_password_async) (GcrPrompt *prompt, @@ -69,8 +64,6 @@ struct _GcrPromptIface { void (* prompt_close) (GcrPrompt *prompt); }; -GType gcr_prompt_get_type (void); - void gcr_prompt_reset (GcrPrompt *prompt); gchar * gcr_prompt_get_title (GcrPrompt *prompt); diff --git a/gcr/gcr-record.h b/gcr/gcr-record.h index 755de10..640f157 100644 --- a/gcr/gcr-record.h +++ b/gcr/gcr-record.h @@ -19,10 +19,6 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef GCR_RECORD_H #define GCR_RECORD_H diff --git a/gcr/gcr-secret-exchange.h b/gcr/gcr-secret-exchange.h index 582558f..a5f3663 100644 --- a/gcr/gcr-secret-exchange.h +++ b/gcr/gcr-secret-exchange.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_SECRET_EXCHANGE_H__ #define __GCR_SECRET_EXCHANGE_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <gck/gck.h> #include <glib-object.h> diff --git a/gcr/gcr-secure-memory.h b/gcr/gcr-secure-memory.h index 2d562fc..5f46e13 100644 --- a/gcr/gcr-secure-memory.h +++ b/gcr/gcr-secure-memory.h @@ -21,13 +21,13 @@ Author: Stef Walter <stefw@gnome.org> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef GCR_SECURE_MEMORY_H #define GCR_SECURE_MEMORY_H +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib.h> G_BEGIN_DECLS diff --git a/gcr/gcr-simple-certificate.c b/gcr/gcr-simple-certificate.c index 0331a3b..59bf633 100644 --- a/gcr/gcr-simple-certificate.c +++ b/gcr/gcr-simple-certificate.c @@ -37,9 +37,7 @@ */ struct _GcrSimpleCertificatePrivate { - const guchar *data; - gsize n_data; - guchar *owned; + GBytes *bytes; }; /* Forward declarations */ @@ -66,10 +64,7 @@ gcr_simple_certificate_real_finalize (GObject *obj) { GcrSimpleCertificate *self = GCR_SIMPLE_CERTIFICATE (obj); - g_free (self->pv->owned); - self->pv->owned = NULL; - self->pv->data = NULL; - self->pv->n_data = 0; + g_clear_pointer (&self->pv->bytes, g_bytes_unref); G_OBJECT_CLASS (gcr_simple_certificate_parent_class)->finalize (obj); } @@ -94,11 +89,10 @@ gcr_simple_certificate_get_der_data (GcrCertificate *cert, g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL); g_return_val_if_fail (n_data, NULL); - g_return_val_if_fail (self->pv->data, NULL); + g_return_val_if_fail (self->pv->bytes, NULL); /* This is called when we're not a base class */ - *n_data = self->pv->n_data; - return self->pv->data; + return g_bytes_get_data (self->pv->bytes, n_data); } static void @@ -131,9 +125,7 @@ gcr_simple_certificate_new (const guchar *data, g_return_val_if_fail (n_data, NULL); cert = g_object_new (GCR_TYPE_SIMPLE_CERTIFICATE, NULL); - - cert->pv->data = cert->pv->owned = g_memdup (data, n_data); - cert->pv->n_data = n_data; + cert->pv->bytes = g_bytes_new (data, n_data); return GCR_CERTIFICATE (cert); } @@ -158,9 +150,6 @@ gcr_simple_certificate_new_static (const guchar *data, g_return_val_if_fail (n_data, NULL); cert = g_object_new (GCR_TYPE_SIMPLE_CERTIFICATE, NULL); - - cert->pv->owned = NULL; - cert->pv->data = data; - cert->pv->n_data = n_data; + cert->pv->bytes = g_bytes_new_static (data, n_data); return GCR_CERTIFICATE (cert); } diff --git a/gcr/gcr-simple-certificate.h b/gcr/gcr-simple-certificate.h index 14e54c6..eb97635 100644 --- a/gcr/gcr-simple-certificate.h +++ b/gcr/gcr-simple-certificate.h @@ -17,13 +17,13 @@ * License along with this program; if not, see <http://www.gnu.org/licenses/>. */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_SIMPLE_CERTIFICATE_H__ #define __GCR_SIMPLE_CERTIFICATE_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib-object.h> #include "gcr-certificate.h" diff --git a/gcr/gcr-simple-collection.c b/gcr/gcr-simple-collection.c deleted file mode 100644 index d0c5a30..0000000 --- a/gcr/gcr-simple-collection.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-collection.h" -#include "gcr-deprecated-base.h" -#include "gcr-internal.h" -#include "gcr-simple-collection.h" - -#include <string.h> - -/** - * GcrSimpleCollection: - * - * A simple implementation of [iface@Collection], which you can add and remove - * objects from. - * - * You can use [method@SimpleCollection.add] to add objects, and - * [method@SimpleCollection.remove] to remove them again. - */ - -struct _GcrSimpleCollectionPrivate { - GHashTable *items; -}; - -static void gcr_collection_iface (GcrCollectionIface *iface); -G_DEFINE_TYPE_WITH_CODE (GcrSimpleCollection, gcr_simple_collection, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrSimpleCollection); - G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_collection_iface)); - -#define UNUSED_VALUE GUINT_TO_POINTER (1) - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static void -gcr_simple_collection_init (GcrSimpleCollection *self) -{ - self->pv = gcr_simple_collection_get_instance_private (self); - self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, g_object_unref, NULL); -} - -static void -gcr_simple_collection_dispose (GObject *obj) -{ - GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (obj); - - g_hash_table_remove_all (self->pv->items); - - G_OBJECT_CLASS (gcr_simple_collection_parent_class)->dispose (obj); -} - -static void -gcr_simple_collection_finalize (GObject *obj) -{ - GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (obj); - - g_assert (self->pv->items); - g_assert (g_hash_table_size (self->pv->items) == 0); - g_hash_table_destroy (self->pv->items); - self->pv->items = NULL; - - G_OBJECT_CLASS (gcr_simple_collection_parent_class)->finalize (obj); -} - -static void -gcr_simple_collection_class_init (GcrSimpleCollectionClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->dispose = gcr_simple_collection_dispose; - gobject_class->finalize = gcr_simple_collection_finalize; -} - -static guint -gcr_simple_collection_real_get_length (GcrCollection *coll) -{ - GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (coll); - return g_hash_table_size (self->pv->items); -} - -static GList* -gcr_simple_collection_real_get_objects (GcrCollection *coll) -{ - GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (coll); - return g_hash_table_get_keys (self->pv->items); -} - -static gboolean -gcr_simple_collection_real_contains (GcrCollection *collection, - GObject *object) -{ - GcrSimpleCollection *self = GCR_SIMPLE_COLLECTION (collection); - return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE; -} - -static void -gcr_collection_iface (GcrCollectionIface *iface) -{ - iface->get_length = gcr_simple_collection_real_get_length; - iface->get_objects = gcr_simple_collection_real_get_objects; - iface->contains = gcr_simple_collection_real_contains; -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_simple_collection_new: - * - * Create a new #GcrSimpleCollection. - * - * Returns: (transfer full) (type Gcr.SimpleCollection): a newly allocated - * collection, which should be freed with g_object_unref() - */ -GcrCollection * -gcr_simple_collection_new (void) -{ - return g_object_new (GCR_TYPE_SIMPLE_COLLECTION, NULL); -} - -/** - * gcr_simple_collection_add: - * @self: The collection - * @object: The object to add - * - * Add an object to this collection - */ -void -gcr_simple_collection_add (GcrSimpleCollection *self, GObject *object) -{ - g_return_if_fail (GCR_IS_SIMPLE_COLLECTION (self)); - g_return_if_fail (G_IS_OBJECT (object)); - g_return_if_fail (!g_hash_table_lookup (self->pv->items, object)); - g_hash_table_insert (self->pv->items, g_object_ref (object), UNUSED_VALUE); - gcr_collection_emit_added (GCR_COLLECTION (self), object); -} - -/** - * gcr_simple_collection_remove: - * @self: The collection - * @object: The object to remove from the collection - * - * Remove an object from the collection. - */ -void -gcr_simple_collection_remove (GcrSimpleCollection *self, GObject *object) -{ - g_return_if_fail (GCR_IS_SIMPLE_COLLECTION (self)); - g_return_if_fail (G_IS_OBJECT (object)); - g_return_if_fail (g_hash_table_lookup (self->pv->items, object)); - g_object_ref (object); - g_hash_table_remove (self->pv->items, object); - gcr_collection_emit_removed (GCR_COLLECTION (self), object); - g_object_unref (object); -} - -/** - * gcr_simple_collection_contains: - * @self: The collection - * @object: The object to check - * - * Check if the collection contains a certain object. - * - * Deprecated: use gcr_collection_contains() instead - * - * Returns: %TRUE if the collection contains the object. - */ -gboolean -gcr_simple_collection_contains (GcrSimpleCollection *self, GObject *object) -{ - g_return_val_if_fail (GCR_IS_SIMPLE_COLLECTION (self), FALSE); - g_return_val_if_fail (G_IS_OBJECT (object), FALSE); - return gcr_collection_contains (GCR_COLLECTION (self), object); -} diff --git a/gcr/gcr-simple-collection.h b/gcr/gcr-simple-collection.h deleted file mode 100644 index 4623dae..0000000 --- a/gcr/gcr-simple-collection.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_SIMPLE_COLLECTION_H__ -#define __GCR_SIMPLE_COLLECTION_H__ - -#include "gcr-collection.h" - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_SIMPLE_COLLECTION (gcr_simple_collection_get_type ()) -#define GCR_SIMPLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrSimpleCollection)) -#define GCR_SIMPLE_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION, GcrSimpleCollectionClass)) -#define GCR_IS_SIMPLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION)) -#define GCR_IS_SIMPLE_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION)) -#define GCR_SIMPLE_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION, GcrSimpleCollectionClass)) - -typedef struct _GcrSimpleCollection GcrSimpleCollection; -typedef struct _GcrSimpleCollectionClass GcrSimpleCollectionClass; -typedef struct _GcrSimpleCollectionPrivate GcrSimpleCollectionPrivate; - -struct _GcrSimpleCollection { - GObject parent; - - /*< private >*/ - GcrSimpleCollectionPrivate *pv; -}; - -struct _GcrSimpleCollectionClass { - GObjectClass parent_class; -}; - -GType gcr_simple_collection_get_type (void); - -GcrCollection* gcr_simple_collection_new (void); - -void gcr_simple_collection_add (GcrSimpleCollection *self, - GObject *object); - -void gcr_simple_collection_remove (GcrSimpleCollection *self, - GObject *object); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrSimpleCollection, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_SIMPLE_COLLECTION_H__ */ diff --git a/gcr/gcr-single-collection.c b/gcr/gcr-single-collection.c deleted file mode 100644 index 478af1e..0000000 --- a/gcr/gcr-single-collection.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-collection.h" -#include "gcr-single-collection.h" - -#include <string.h> - -/** - * GcrSingleCollection: - * - * A single implementation of #GcrCollection. - */ - -struct _GcrSingleCollection { - GObject parent; - GObject *object; -}; - -/** - * GcrSingleCollectionClass: - * @parent_class: The parent class - * - * The class for #GcrSingleCollection. - */ - -static void _gcr_single_collection_iface (GcrCollectionIface *iface); -G_DEFINE_TYPE_WITH_CODE (GcrSingleCollection, _gcr_single_collection, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, _gcr_single_collection_iface)); - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static void -_gcr_single_collection_init (GcrSingleCollection *self) -{ - -} - -static void -_gcr_single_collection_dispose (GObject *obj) -{ - GcrSingleCollection *self = GCR_SINGLE_COLLECTION (obj); - - _gcr_single_collection_set_object (self, NULL); - - G_OBJECT_CLASS (_gcr_single_collection_parent_class)->dispose (obj); -} - -static void -_gcr_single_collection_class_init (GcrSingleCollectionClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->dispose = _gcr_single_collection_dispose; -} - -static guint -_gcr_single_collection_real_get_length (GcrCollection *coll) -{ - GcrSingleCollection *self = GCR_SINGLE_COLLECTION (coll); - return self->object == NULL ? 0 : 1; -} - -static GList* -_gcr_single_collection_real_get_objects (GcrCollection *coll) -{ - GcrSingleCollection *self = GCR_SINGLE_COLLECTION (coll); - return self->object == NULL ? NULL : g_list_append (NULL, self->object); -} - -static gboolean -_gcr_single_collection_real_contains (GcrCollection *collection, - GObject *object) -{ - GcrSingleCollection *self = GCR_SINGLE_COLLECTION (collection); - return self->object == object; -} - -static void -_gcr_single_collection_iface (GcrCollectionIface *iface) -{ - iface->get_length = _gcr_single_collection_real_get_length; - iface->get_objects = _gcr_single_collection_real_get_objects; - iface->contains = _gcr_single_collection_real_contains; -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -GcrCollection * -_gcr_single_collection_new (GObject *object) -{ - GcrSingleCollection *self; - - self = g_object_new (GCR_TYPE_SINGLE_COLLECTION, NULL); - _gcr_single_collection_set_object (self, object); - - return GCR_COLLECTION (self); -} - -GObject * -_gcr_single_collection_get_object (GcrSingleCollection *self) -{ - g_return_val_if_fail (GCR_IS_SINGLE_COLLECTION (self), NULL); - return self->object; -} - -void -_gcr_single_collection_set_object (GcrSingleCollection *self, - GObject *object) -{ - GObject *obj; - - g_return_if_fail (GCR_IS_SINGLE_COLLECTION (self)); - g_return_if_fail (object == NULL || G_IS_OBJECT (object)); - - if (object == self->object) - return; - - if (self->object) { - obj = self->object; - self->object = NULL; - gcr_collection_emit_removed (GCR_COLLECTION (self), obj); - g_object_unref (obj); - } - - if (object) { - self->object = g_object_ref (object); - gcr_collection_emit_added (GCR_COLLECTION (self), self->object); - } -} diff --git a/gcr/gcr-single-collection.h b/gcr/gcr-single-collection.h deleted file mode 100644 index 7dee26e..0000000 --- a/gcr/gcr-single-collection.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_SINGLE_COLLECTION_H__ -#define __GCR_SINGLE_COLLECTION_H__ - -#include "gcr-collection.h" - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_SINGLE_COLLECTION (_gcr_single_collection_get_type ()) -G_DECLARE_FINAL_TYPE (GcrSingleCollection, _gcr_single_collection, - GCR, SINGLE_COLLECTION, - GObject) - -GcrCollection * _gcr_single_collection_new (GObject *object); - -GObject * _gcr_single_collection_get_object (GcrSingleCollection *self); - -void _gcr_single_collection_set_object (GcrSingleCollection *self, - GObject *object); - -G_END_DECLS - -#endif /* __GCR_SINGLE_COLLECTION_H__ */ diff --git a/gcr/gcr-ssh-agent-service.c b/gcr/gcr-ssh-agent-service.c index b7e8928..beae47b 100644 --- a/gcr/gcr-ssh-agent-service.c +++ b/gcr/gcr-ssh-agent-service.c @@ -37,7 +37,7 @@ #include <gio/gunixsocketaddress.h> #include <glib/gstdio.h> -#include <gcr/gcr-base.h> +#include <gcr/gcr.h> #if WITH_SYSTEMD #include <systemd/sd-daemon.h> diff --git a/gcr/gcr-ssh-askpass.h b/gcr/gcr-ssh-askpass.h index b766974..fb54a7e 100644 --- a/gcr/gcr-ssh-askpass.h +++ b/gcr/gcr-ssh-askpass.h @@ -17,13 +17,13 @@ * Author: Stef Walter <stefw@gnome.org> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_SSH_ASKPASS_H__ #define __GCR_SSH_ASKPASS_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib-object.h> #include <gio/gio.h> diff --git a/gcr/gcr-subject-public-key.c b/gcr/gcr-subject-public-key.c index 7ff78f4..1a3f383 100644 --- a/gcr/gcr-subject-public-key.c +++ b/gcr/gcr-subject-public-key.c @@ -206,7 +206,9 @@ lookup_public_key (GckObject *object, gck_attributes_unref (attrs); session = gck_object_get_session (object); - objects = gck_session_find_objects (session, gck_builder_end (&builder), cancellable, &error); + attrs = gck_builder_end (&builder); + objects = gck_session_find_objects (session, attrs, cancellable, &error); + gck_attributes_unref (attrs); g_object_unref (session); if (error != NULL) { @@ -567,7 +569,7 @@ _gcr_subject_public_key_load_finish (GAsyncResult *result, return NULL; closure = g_task_get_task_data (G_TASK (result)); - attributes = gck_attributes_ref_sink (gck_builder_end (&closure->builder)); + attributes = gck_builder_end (&closure->builder); asn = _gcr_subject_public_key_for_attributes (attributes); if (asn == NULL) { g_set_error_literal (error, GCK_ERROR, CKR_TEMPLATE_INCONSISTENT, diff --git a/gcr/gcr-subject-public-key.h b/gcr/gcr-subject-public-key.h index 9e7c1d9..066fa22 100644 --- a/gcr/gcr-subject-public-key.h +++ b/gcr/gcr-subject-public-key.h @@ -19,10 +19,6 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef GCR_SUBJECT_PUBLIC_KEY_H #define GCR_SUBJECT_PUBLIC_KEY_H diff --git a/gcr/gcr-system-prompt.c b/gcr/gcr-system-prompt.c index ceba221..0c27abc 100644 --- a/gcr/gcr-system-prompt.c +++ b/gcr/gcr-system-prompt.c @@ -106,7 +106,7 @@ struct _GcrSystemPromptPrivate { gchar *last_response; }; -static void gcr_system_prompt_prompt_iface (GcrPromptIface *iface); +static void gcr_system_prompt_prompt_iface (GcrPromptInterface *iface); static void gcr_system_prompt_initable_iface (GInitableIface *iface); @@ -1322,7 +1322,7 @@ gcr_system_prompt_real_close (GcrPrompt *prompt) } static void -gcr_system_prompt_prompt_iface (GcrPromptIface *iface) +gcr_system_prompt_prompt_iface (GcrPromptInterface *iface) { iface->prompt_password_async = gcr_system_prompt_password_async; iface->prompt_password_finish = gcr_system_prompt_password_finish; diff --git a/gcr/gcr-system-prompt.h b/gcr/gcr-system-prompt.h index 0d20782..017ebef 100644 --- a/gcr/gcr-system-prompt.h +++ b/gcr/gcr-system-prompt.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stef@thewalter.net> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_SYSTEM_PROMPT_H__ #define __GCR_SYSTEM_PROMPT_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-types.h" #include "gcr-secret-exchange.h" diff --git a/gcr/gcr-system-prompter.c b/gcr/gcr-system-prompter.c index dbb51b0..0f993ee 100644 --- a/gcr/gcr-system-prompter.c +++ b/gcr/gcr-system-prompter.c @@ -30,7 +30,7 @@ #include "gcr-system-prompt.h" #include "gcr/gcr-dbus-generated.h" -#include "gcr/gcr-enum-types-base.h" +#include "gcr/gcr-enum-types.h" #include "gcr/gcr-marshal.h" #include "egg/egg-error.h" @@ -439,7 +439,7 @@ prompt_build_properties (GcrPrompt *prompt, while (g_hash_table_iter_next (&iter, (gpointer *)&property_name, NULL)) { /* Make sure this property is on the prompt interface */ - pspec = g_object_interface_find_property (GCR_PROMPT_GET_INTERFACE (obj), + pspec = g_object_interface_find_property (GCR_PROMPT_GET_IFACE (obj), property_name); if (pspec == NULL) continue; diff --git a/gcr/gcr-system-prompter.h b/gcr/gcr-system-prompter.h index 72b7c69..653383b 100644 --- a/gcr/gcr-system-prompter.h +++ b/gcr/gcr-system-prompter.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stef@thewalter.net> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_SYSTEM_PROMPTER_H__ #define __GCR_SYSTEM_PROMPTER_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-prompt.h" #include "gcr-secret-exchange.h" #include "gcr-types.h" diff --git a/gcr/gcr-trust.c b/gcr/gcr-trust.c index 786ab4f..c6ac4de 100644 --- a/gcr/gcr-trust.c +++ b/gcr/gcr-trust.c @@ -93,7 +93,7 @@ prepare_is_certificate_pinned (GcrCertificate *certificate, const gchar *purpose gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); gck_builder_add_string (&builder, CKA_X_PEER, peer); - return gck_attributes_ref_sink (gck_builder_end (&builder)); + return gck_builder_end (&builder); } static gboolean @@ -255,7 +255,7 @@ prepare_add_pinned_certificate (GcrCertificate *certificate, const gchar *purpos gck_builder_add_string (&builder, CKA_X_PEER, peer); gck_builder_add_boolean (&builder, CKA_TOKEN, TRUE); - return gck_attributes_ref_sink (gck_builder_end (&builder)); + return gck_builder_end (&builder); } static gboolean @@ -307,9 +307,10 @@ perform_add_pinned_certificate (GckAttributes *search, _("Couldn’t find a place to store the pinned certificate")); ret = FALSE; } else { - session = gck_slot_open_session (slot, CKF_RW_SESSION, NULL, &lerr); + session = gck_slot_open_session (slot, CKF_RW_SESSION, NULL, NULL, &lerr); if (session != NULL) { - object = gck_session_create_object (session, gck_builder_end (&builder), + GckAttributes *attrs = gck_builder_end (&builder); + object = gck_session_create_object (session, attrs, cancellable, &lerr); if (object != NULL) { g_object_unref (object); @@ -317,6 +318,7 @@ perform_add_pinned_certificate (GckAttributes *search, } g_object_unref (session); + gck_attributes_unref (attrs); } g_object_unref (slot); @@ -461,7 +463,7 @@ prepare_remove_pinned_certificate (GcrCertificate *certificate, const gchar *pur gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); gck_builder_add_string (&builder, CKA_X_PEER, peer); - return gck_attributes_ref_sink (gck_builder_end (&builder)); + return gck_builder_end (&builder); } static gboolean @@ -638,7 +640,7 @@ prepare_is_certificate_anchored (GcrCertificate *certificate, const gchar *purpo prepare_trust_attrs (certificate, CKT_X_ANCHORED_CERTIFICATE, &builder); gck_builder_add_string (&builder, CKA_X_PURPOSE, purpose); - return gck_attributes_ref_sink (gck_builder_end (&builder)); + return gck_builder_end (&builder); } static gboolean diff --git a/gcr/gcr-trust.h b/gcr/gcr-trust.h index 379f363..88b407c 100644 --- a/gcr/gcr-trust.h +++ b/gcr/gcr-trust.h @@ -17,13 +17,13 @@ * License along with this program; if not, see <http://www.gnu.org/licenses/>. */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef __GCR_TRUST_H__ #define __GCR_TRUST_H__ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include "gcr-certificate.h" #include "gcr-types.h" diff --git a/gcr/gcr-types.h b/gcr/gcr-types.h index 095615a..d049cb4 100644 --- a/gcr/gcr-types.h +++ b/gcr/gcr-types.h @@ -19,13 +19,13 @@ * Author: Stef Walter <stefw@collabora.co.uk> */ -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - #ifndef GCRTYPES_H_ #define GCRTYPES_H_ +#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) +#error "Only <gcr/gcr.h> can be included directly." +#endif + #include <glib.h> #ifndef GCK_API_SUBJECT_TO_CHANGE diff --git a/gcr/gcr-union-collection.c b/gcr/gcr-union-collection.c deleted file mode 100644 index 846b226..0000000 --- a/gcr/gcr-union-collection.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr-collection.h" -#include "gcr-internal.h" -#include "gcr-union-collection.h" - -#include <string.h> - -/** - * GcrUnionCollection: - * - * An implementation of #GcrCollection, which combines the objects in - * other [iface@Collection]s. Use [method@UnionCollection.add] to add and - * [method@UnionCollection.remove] to remove them. - */ - -struct _GcrUnionCollectionPrivate { - GHashTable *items; - GHashTable *collections; -}; - -static void gcr_collection_iface (GcrCollectionIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrUnionCollection, gcr_union_collection, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrUnionCollection); - G_IMPLEMENT_INTERFACE (GCR_TYPE_COLLECTION, gcr_collection_iface)); - -static void -on_collection_added (GcrCollection *collection, - GObject *object, - gpointer user_data) -{ - GcrUnionCollection *self = GCR_UNION_COLLECTION (user_data); - gint *count; - - g_object_ref (object); - - count = g_hash_table_lookup (self->pv->items, object); - if (count == NULL) { - count = g_new0 (gint, 1); - *count = 1; - g_hash_table_insert (self->pv->items, object, count); - gcr_collection_emit_added (GCR_COLLECTION (self), object); - } else { - g_assert (*count > 0); - (*count)++; - } - - g_object_unref (object); -} - -static void -on_collection_removed (GcrCollection *collection, - GObject *object, - gpointer user_data) -{ - GcrUnionCollection *self = GCR_UNION_COLLECTION (user_data); - gint *count; - - g_object_ref (object); - - count = g_hash_table_lookup (self->pv->items, object); - if (count != NULL) { - g_assert (*count > 0); - (*count)--; - - if (*count == 0) { - g_hash_table_remove (self->pv->items, object); - gcr_collection_emit_removed (GCR_COLLECTION (self), object); - } - } else { - g_warning ("Object of type %s that exists in an underlying " - "collection of a GcrUnionCollection appeared without " - "emitting 'added' signal.", G_OBJECT_TYPE_NAME (object)); - } - - g_object_unref (object); - -} - -static void -connect_to_collection (GcrUnionCollection *self, - GcrCollection *collection) -{ - g_signal_connect (collection, "added", G_CALLBACK (on_collection_added), self); - g_signal_connect (collection, "removed", G_CALLBACK (on_collection_removed), self); -} - -static void -disconnect_from_collection (GcrUnionCollection *self, - GcrCollection *collection) -{ - g_signal_handlers_disconnect_by_func (collection, on_collection_added, self); - g_signal_handlers_disconnect_by_func (collection, on_collection_removed, self); -} - -static void -gcr_union_collection_init (GcrUnionCollection *self) -{ - self->pv = gcr_union_collection_get_instance_private (self); - self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, - NULL, g_free); - self->pv->collections = g_hash_table_new_full (g_direct_hash, g_direct_equal, - g_object_unref, NULL); -} - -static void -gcr_union_collection_dispose (GObject *obj) -{ - GcrUnionCollection *self = GCR_UNION_COLLECTION (obj); - GHashTableIter iter; - GcrCollection *collection; - - g_hash_table_iter_init (&iter, self->pv->collections); - while (g_hash_table_iter_next (&iter, (gpointer *)&collection, NULL)) - disconnect_from_collection (self, collection); - g_hash_table_remove_all (self->pv->collections); - g_hash_table_remove_all (self->pv->items); - - G_OBJECT_CLASS (gcr_union_collection_parent_class)->dispose (obj); -} - -static void -gcr_union_collection_finalize (GObject *obj) -{ - GcrUnionCollection *self = GCR_UNION_COLLECTION (obj); - - g_assert (g_hash_table_size (self->pv->items) == 0); - g_hash_table_destroy (self->pv->items); - - g_assert (g_hash_table_size (self->pv->collections) == 0); - g_hash_table_destroy (self->pv->collections); - - G_OBJECT_CLASS (gcr_union_collection_parent_class)->finalize (obj); -} - -static void -gcr_union_collection_class_init (GcrUnionCollectionClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->dispose = gcr_union_collection_dispose; - gobject_class->finalize = gcr_union_collection_finalize; -} - -static guint -gcr_union_collection_real_get_length (GcrCollection *coll) -{ - GcrUnionCollection *self = GCR_UNION_COLLECTION (coll); - return g_hash_table_size (self->pv->items); -} - -static GList* -gcr_union_collection_real_get_objects (GcrCollection *coll) -{ - GcrUnionCollection *self = GCR_UNION_COLLECTION (coll); - return g_hash_table_get_keys (self->pv->items); -} - -static gboolean -gcr_union_collection_real_contains (GcrCollection *collection, - GObject *object) -{ - GcrUnionCollection *self = GCR_UNION_COLLECTION (collection); - return g_hash_table_lookup (self->pv->items, object) ? TRUE : FALSE; -} - -static void -gcr_collection_iface (GcrCollectionIface *iface) -{ - iface->get_length = gcr_union_collection_real_get_length; - iface->get_objects = gcr_union_collection_real_get_objects; - iface->contains = gcr_union_collection_real_contains; -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_union_collection_new: - * - * Create a new #GcrUnionCollection. - * - * Returns: (transfer full) (type Gcr.UnionCollection): a newly allocated - * collection, which should be freed with g_object_unref() - */ -GcrCollection * -gcr_union_collection_new (void) -{ - return g_object_new (GCR_TYPE_UNION_COLLECTION, NULL); -} - -/** - * gcr_union_collection_add: - * @self: The union collection - * @collection: The collection whose objects to add - * - * Add objects from this collection to the union - */ -void -gcr_union_collection_add (GcrUnionCollection *self, - GcrCollection *collection) -{ - g_return_if_fail (GCR_IS_UNION_COLLECTION (self)); - g_return_if_fail (GCR_IS_COLLECTION (collection)); - gcr_union_collection_take (self, g_object_ref (collection)); -} - -/** - * gcr_union_collection_take: - * @self: The union collection - * @collection: The collection whose objects to add - * - * Add objects from this collection to the union. Do not add an additional - * reference to the collection. - */ -void -gcr_union_collection_take (GcrUnionCollection *self, - GcrCollection *collection) -{ - GList *objects, *l; - - g_return_if_fail (GCR_IS_UNION_COLLECTION (self)); - g_return_if_fail (GCR_IS_COLLECTION (collection)); - g_return_if_fail (!g_hash_table_lookup (self->pv->collections, collection)); - - g_object_ref (collection); - - g_hash_table_insert (self->pv->collections, collection, collection); - connect_to_collection (self, collection); - - objects = gcr_collection_get_objects (collection); - for (l = objects; l != NULL; l = g_list_next (l)) - on_collection_added (collection, l->data, self); - g_list_free (objects); - - g_object_unref (collection); -} - -/** - * gcr_union_collection_remove: - * @self: The collection - * @collection: The collection whose objects to remove - * - * Remove an object from the collection. - */ -void -gcr_union_collection_remove (GcrUnionCollection *self, - GcrCollection *collection) -{ - GList *objects, *l; - - g_return_if_fail (GCR_IS_UNION_COLLECTION (self)); - g_return_if_fail (GCR_IS_COLLECTION (collection)); - g_return_if_fail (g_hash_table_lookup (self->pv->collections, collection)); - - g_object_ref (collection); - - g_hash_table_remove (self->pv->collections, collection); - disconnect_from_collection (self, collection); - - objects = gcr_collection_get_objects (collection); - for (l = objects; l != NULL; l = g_list_next (l)) - on_collection_removed (collection, l->data, self); - g_list_free (objects); - - g_object_unref (collection); -} - -/** - * gcr_union_collection_have: - * @self: the union collection - * @collection: the collection to check - * - * Check whether the collection is present in the union. - * - * Returns: whether present or not - */ -gboolean -gcr_union_collection_have (GcrUnionCollection *self, - GcrCollection *collection) -{ - g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), FALSE); - g_return_val_if_fail (GCR_IS_COLLECTION (collection), FALSE); - return g_hash_table_lookup (self->pv->collections, collection) != NULL; -} - -/** - * gcr_union_collection_size: - * @self: the union collection - * - * Return the number of collections in this union. This does not reflect - * the number of objects in the combined collection. - * - * Returns: number of collections inlcuded - */ -guint -gcr_union_collection_size (GcrUnionCollection *self) -{ - g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), FALSE); - return g_hash_table_size (self->pv->collections); -} - -/** - * gcr_union_collection_elements: - * @self: the union collection - * - * Get the collections that have been added to this union. - * - * Returns: (element-type Gcr.Collection) (transfer container): collections - * added to the union - */ -GList * -gcr_union_collection_elements (GcrUnionCollection *self) -{ - g_return_val_if_fail (GCR_IS_UNION_COLLECTION (self), NULL); - return g_hash_table_get_values (self->pv->collections); -} diff --git a/gcr/gcr-union-collection.h b/gcr/gcr-union-collection.h deleted file mode 100644 index 2ca740c..0000000 --- a/gcr/gcr-union-collection.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_UNION_COLLECTION_H__ -#define __GCR_UNION_COLLECTION_H__ - -#include "gcr-collection.h" - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_UNION_COLLECTION (gcr_union_collection_get_type ()) -#define GCR_UNION_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION, GcrUnionCollection)) -#define GCR_UNION_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION, GcrUnionCollectionClass)) -#define GCR_IS_UNION_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION)) -#define GCR_IS_UNION_COLLECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION)) -#define GCR_UNION_COLLECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION, GcrUnionCollectionClass)) - -typedef struct _GcrUnionCollection GcrUnionCollection; -typedef struct _GcrUnionCollectionClass GcrUnionCollectionClass; -typedef struct _GcrUnionCollectionPrivate GcrUnionCollectionPrivate; - -struct _GcrUnionCollection { - GObject parent; - - /*< private >*/ - GcrUnionCollectionPrivate *pv; -}; - -struct _GcrUnionCollectionClass { - GObjectClass parent_class; -}; - -GType gcr_union_collection_get_type (void); - -GcrCollection* gcr_union_collection_new (void); - -void gcr_union_collection_add (GcrUnionCollection *self, - GcrCollection *collection); - -void gcr_union_collection_take (GcrUnionCollection *self, - GcrCollection *collection); - -void gcr_union_collection_remove (GcrUnionCollection *self, - GcrCollection *collection); - -gboolean gcr_union_collection_have (GcrUnionCollection *self, - GcrCollection *collection); - -guint gcr_union_collection_size (GcrUnionCollection *self); - -GList * gcr_union_collection_elements (GcrUnionCollection *self); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrUnionCollection, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_UNION_COLLECTION_H__ */ diff --git a/gcr/gcr-version.h.in b/gcr/gcr-version.h.in index 81a5b4a..5f991d7 100644 --- a/gcr/gcr-version.h.in +++ b/gcr/gcr-version.h.in @@ -23,7 +23,7 @@ #define __GCR_VERSION_H__ #if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." +#error "Only <gcr/gcr.h> can be included directly." #endif /* compile time version @@ -28,8 +28,32 @@ #include <glib.h> -#include "gcr/gcr-base.h" -#include "ui/gcr-ui.h" +#define __GCR_INSIDE_HEADER__ + +#include <gcr/gcr-types.h> + +#include <gcr/gcr-certificate.h> +#include <gcr/gcr-certificate-chain.h> +#include <gcr/gcr-certificate-request.h> +#include <gcr/gcr-column.h> +#include <gcr/gcr-enum-types.h> +#include <gcr/gcr-fingerprint.h> +#include <gcr/gcr-icons.h> +#include <gcr/gcr-importer.h> +#include <gcr/gcr-library.h> +#include <gcr/gcr-mock-prompter.h> +#include <gcr/gcr-parser.h> +#include <gcr/gcr-pkcs11-certificate.h> +#include <gcr/gcr-prompt.h> +#include <gcr/gcr-secret-exchange.h> +#include <gcr/gcr-secure-memory.h> +#include <gcr/gcr-simple-certificate.h> +#include <gcr/gcr-ssh-askpass.h> +#include <gcr/gcr-system-prompt.h> +#include <gcr/gcr-system-prompter.h> +#include <gcr/gcr-trust.h> +#include <gcr/gcr-unlock-options.h> +#include <gcr/gcr-version.h> #undef __GCR_INSIDE_HEADER__ diff --git a/gcr/gcr-base.symbols b/gcr/gcr.symbols index 7a97e9a..7a97e9a 100644 --- a/gcr/gcr-base.symbols +++ b/gcr/gcr.symbols diff --git a/gcr/libgcr.map b/gcr/libgcr.map new file mode 100644 index 0000000..4a16138 --- /dev/null +++ b/gcr/libgcr.map @@ -0,0 +1,8 @@ +{ +global: + gcr_*; + _gcr_*; + SECMEM_*; +local: + *; +}; diff --git a/gcr/meson.build b/gcr/meson.build index d2f548d..59ec0fa 100644 --- a/gcr/meson.build +++ b/gcr/meson.build @@ -1,13 +1,11 @@ -gcr_base_headers_subdir = 'gcr-@0@'.format(gcr_api_version) -gcr_base_headers_install_dir = gcr_base_headers_subdir / 'gcr' +gcr_headers_subdir = 'gcr-@0@'.format(gcr_api_version) +gcr_headers_install_dir = gcr_headers_subdir / 'gcr' -gcr_base_public_sources = files( +gcr_public_sources = files( 'gcr-certificate.c', 'gcr-certificate-chain.c', 'gcr-certificate-request.c', - 'gcr-collection.c', 'gcr-comparable.c', - 'gcr-filter-collection.c', 'gcr-fingerprint.c', 'gcr-icons.c', 'gcr-importer.c', @@ -20,19 +18,16 @@ gcr_base_public_sources = files( 'gcr-secret-exchange.c', 'gcr-secure-memory.c', 'gcr-simple-certificate.c', - 'gcr-simple-collection.c', 'gcr-ssh-askpass.c', 'gcr-system-prompt.c', 'gcr-system-prompter.c', 'gcr-trust.c', - 'gcr-union-collection.c', ) -gcr_base_private_sources = files( +gcr_private_sources = files( 'gcr-callback-output-stream.c', 'gcr-certificate-extensions.c', 'gcr-column.c', - 'gcr-gnupg-collection.c', 'gcr-gnupg-importer.c', 'gcr-gnupg-key.c', 'gcr-gnupg-process.c', @@ -44,22 +39,18 @@ gcr_base_private_sources = files( 'gcr-openssh.c', 'gcr-pkcs11-importer.c', 'gcr-record.c', - 'gcr-single-collection.c', 'gcr-subject-public-key.c', 'gcr-util.c', ) -gcr_base_headers = files( - 'gcr-base.h', +gcr_headers = files( + 'gcr.h', 'gcr-certificate.h', 'gcr-certificate-chain.h', 'gcr-certificate-request.h', - 'gcr-collection.h', 'gcr-column.h', 'gcr-comparable.h', - 'gcr-deprecated-base.h', 'gcr-fingerprint.h', - 'gcr-filter-collection.h', 'gcr-icons.h', 'gcr-importer.h', 'gcr-import-interaction.h', @@ -71,13 +62,11 @@ gcr_base_headers = files( 'gcr-secret-exchange.h', 'gcr-secure-memory.h', 'gcr-simple-certificate.h', - 'gcr-simple-collection.h', 'gcr-ssh-askpass.h', 'gcr-system-prompt.h', 'gcr-system-prompter.h', 'gcr-trust.h', 'gcr-types.h', - 'gcr-union-collection.h', 'gcr-unlock-options.h', ) @@ -92,12 +81,12 @@ gcr_version_h = configure_file(input: 'gcr-version.h.in', configuration: gcr_version_conf, ) -gcr_base_headers += gcr_version_h +gcr_headers += gcr_version_h -gcr_enums_gen = gnome.mkenums_simple('gcr-enum-types-base', - sources: gcr_base_headers, +gcr_enums_gen = gnome.mkenums_simple('gcr-enum-types', + sources: gcr_headers, install_header: true, - install_dir: get_option('includedir') / gcr_base_headers_install_dir, + install_dir: get_option('includedir') / gcr_headers_install_dir, ) gcr_marshal_gen = gnome.genmarshal('gcr-marshal', @@ -125,23 +114,23 @@ gcr_oids = custom_target('gcr-oids', ] ) -gcr_base_sources = [ - gcr_base_private_sources, - gcr_base_public_sources, +gcr_sources = [ + gcr_private_sources, + gcr_public_sources, gcr_enums_gen, gcr_marshal_gen, gcr_dbus_gen, gcr_oids, ] -gcr_base_deps = [ +gcr_deps = [ glib_deps, p11kit_dep, libegg_dep, gck_dep, ] -gcr_base_cflags = [ +gcr_cflags = [ '-DG_LOG_DOMAIN="Gcr"', '-DGCR_COMPILATION', '-DGCR_API_SUBJECT_TO_CHANGE', @@ -150,34 +139,29 @@ gcr_base_cflags = [ '-D_XOPEN_SOURCE', # Needed for strptime() ] -gcr_base_symbolmap = meson.current_source_dir() / 'libgcr-base.map' -gcr_base_linkflags = cc.get_supported_link_arguments( - '-Wl,--version-script,@0@'.format(gcr_base_symbolmap), +gcr_symbolmap = meson.current_source_dir() / 'libgcr.map' +gcr_linkflags = cc.get_supported_link_arguments( + '-Wl,--version-script,@0@'.format(gcr_symbolmap), ) -gcr_base_lib = shared_library(gcr_base_basename, - gcr_base_sources, - dependencies: gcr_base_deps, - c_args: gcr_base_cflags, - link_args: gcr_base_linkflags, - link_depends: gcr_base_symbolmap, +gcr_lib = shared_library(gcr_basename, + gcr_sources, + dependencies: gcr_deps, + c_args: gcr_cflags, + link_args: gcr_linkflags, + link_depends: gcr_symbolmap, include_directories: config_h_dir, - version: gcr_soversion, + version: gcr_version, + soversion: gcr_soversion, install: true, ) -install_headers(gcr_base_headers, - subdir: gcr_base_headers_install_dir, +install_headers(gcr_headers, + subdir: gcr_headers_install_dir, ) -if get_option('gtk') - install_headers('gcr.h', - subdir: gcr_base_headers_install_dir, - ) -endif - -gcr_base_dep = declare_dependency( - link_with: gcr_base_lib, +gcr_dep = declare_dependency( + link_with: gcr_lib, include_directories: include_directories('..'), sources: [ gcr_enums_gen[1], @@ -187,17 +171,17 @@ gcr_base_dep = declare_dependency( ) if get_option('introspection') - gcr_gir = gnome.generate_gir(gcr_base_lib, - sources: [ gcr_base_public_sources, gcr_base_headers ], + gcr_gir = gnome.generate_gir(gcr_lib, + sources: [ gcr_public_sources, gcr_headers ], namespace: 'Gcr', nsversion: gcr_api_version, - export_packages: gcr_base_basename, + export_packages: gcr_basename, includes: [ 'GObject-2.0', 'Gio-2.0', gck_gir[0], ], - header: 'gcr/gcr-base.h', + header: 'gcr/gcr.h', extra_args: [ '-DGCR_COMPILATION', '-DGCR_API_SUBJECT_TO_CHANGE', @@ -220,8 +204,8 @@ if get_option('introspection') endif # pkg-config file -pkgconfig.generate(gcr_base_lib, - subdirs: gcr_base_headers_subdir, +pkgconfig.generate(gcr_lib, + subdirs: gcr_headers_subdir, requires: [ glib_dep, gio_dep, gobject_dep, p11kit_dep, gck_lib ], description: 'GObject and GUI library for high level crypto parsing and display', ) @@ -251,7 +235,7 @@ if get_option('ssh_agent') gcr_ssh_agent = executable('gcr-ssh-agent', gcr_ssh_agent_lib_sources + [ 'gcr-ssh-agent.c' ], - dependencies: [ gcr_base_deps, gcr_base_dep, libsecret_dep, libsystemd_deps ], + dependencies: [ gcr_deps, gcr_dep, libsecret_dep, libsystemd_deps ], c_args: [ '-DGCR_COMPILATION', '-DGCR_API_SUBJECT_TO_CHANGE', @@ -281,7 +265,7 @@ if get_option('ssh_agent') gcr_ssh_agent_test_lib = static_library('gcr-ssh-agent-test', sources: gcr_ssh_agent_lib_sources + [ 'gcr-ssh-agent-test.c' ], - dependencies: [ gcr_base_deps, gcr_base_dep, libsecret_dep, libsystemd_deps ], + dependencies: [ gcr_deps, gcr_dep, libsecret_dep, libsystemd_deps ], c_args: [ '-DGCR_COMPILATION', '-DGCR_API_SUBJECT_TO_CHANGE', @@ -299,9 +283,9 @@ if get_option('ssh_agent') foreach _test : gcr_ssh_agent_test_names test_bin = executable('test-ssh-agent-'+_test, 'test-ssh-agent-@0@.c'.format(_test), - dependencies: [ gcr_base_deps, gcr_base_dep ], + dependencies: [ gcr_deps, gcr_dep ], link_with: [ gcr_ssh_agent_test_lib, egg_test_lib ], - c_args: [ gcr_base_cflags, gcr_ssh_agent_test_cflags ], + c_args: [ gcr_cflags, gcr_ssh_agent_test_cflags ], include_directories: config_h_dir, ) @@ -332,7 +316,6 @@ endforeach # Tests gcr_test_names = [ 'util', - 'filter-collection', 'secret-exchange', 'simple-certificate', 'certificate', @@ -348,7 +331,6 @@ gcr_test_names = [ 'record', 'memory-icon', 'gnupg-key', - 'gnupg-collection', 'gnupg-process', 'system-prompt', 'ssh-askpass', @@ -362,14 +344,14 @@ gcr_test_cflags = [ foreach _test : gcr_test_names test_bin = executable('test-'+_test, 'test-@0@.c'.format(_test), - dependencies: [ gcr_base_deps, gcr_base_dep ], + dependencies: [ gcr_deps, gcr_dep ], link_with: [ gck_test_lib, egg_test_lib ], - c_args: [ gcr_base_cflags, gcr_test_cflags ], + c_args: [ gcr_cflags, gcr_test_cflags ], include_directories: config_h_dir, ) test(_test, test_bin, - suite: 'gcr-base', + suite: 'gcr', depends: gcr_ssh_askpass, ) endforeach @@ -377,18 +359,18 @@ endforeach # Example frob programs frob_certificate_request = executable('frob-certificate-request', files('frob-certificate-request.c', 'console-interaction.c'), - dependencies: [ gcr_base_dep, gcr_base_deps ], - c_args: gcr_base_cflags, + dependencies: [ gcr_dep, gcr_deps ], + c_args: gcr_cflags, ) frob_openpgp = executable('frob-openpgp', files('frob-openpgp.c'), - dependencies: [ gcr_base_dep, gcr_base_deps ], - c_args: gcr_base_cflags, + dependencies: [ gcr_dep, gcr_deps ], + c_args: gcr_cflags, ) frob_parser = executable('frob-parser', files('frob-parser.c'), - dependencies: [ gcr_base_dep, gcr_base_deps ], - c_args: gcr_base_cflags, + dependencies: [ gcr_dep, gcr_deps ], + c_args: gcr_cflags, ) diff --git a/gcr/test-certificate-chain.c b/gcr/test-certificate-chain.c index a0bc45f..6cb8ee4 100644 --- a/gcr/test-certificate-chain.c +++ b/gcr/test-certificate-chain.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-internal.h" #include "egg/egg-asn1x.h" diff --git a/gcr/test-certificate.c b/gcr/test-certificate.c index 6603ad4..2fed913 100644 --- a/gcr/test-certificate.c +++ b/gcr/test-certificate.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-internal.h" #include "gcr/gcr-certificate-extensions.h" diff --git a/gcr/test-filter-collection.c b/gcr/test-filter-collection.c deleted file mode 100644 index 952dbd3..0000000 --- a/gcr/test-filter-collection.c +++ /dev/null @@ -1,272 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* - Copyright (C) 2011 Collabora Ltd. - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#include "config.h" - -#include "gcr/gcr-simple-collection.h" -#include "gcr/gcr-filter-collection.h" - -#include "egg/egg-testing.h" - -#include <glib.h> - -#define NUM_OBJECTS 10 - -typedef struct { - GcrCollection *underlying; - GObject *objects[NUM_OBJECTS]; -} Test; - -static guint -mock_object_value (GObject *object) -{ - return GPOINTER_TO_UINT (g_object_get_data (object, "value")); -} - -static void -setup (Test *test, - gconstpointer unused) -{ - GcrSimpleCollection *collection; - guint i; - - test->underlying = gcr_simple_collection_new (); - collection = GCR_SIMPLE_COLLECTION (test->underlying); - - for (i = 0; i < NUM_OBJECTS; i++) { - test->objects[i] = g_object_new (G_TYPE_OBJECT, NULL); - g_object_set_data (test->objects[i], "value", GUINT_TO_POINTER (i)); - gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (collection), test->objects[i]); - } -} - -static void -teardown (Test *test, - gconstpointer unused) -{ - guint i; - - for (i = 0; i < NUM_OBJECTS; i++) - g_object_unref (test->objects[i]); - - g_object_unref (test->underlying); -} - -static void -test_create (Test *test, - gconstpointer unused) -{ - GcrFilterCollection *filter; - GcrCollection *collection; - GcrCollection *underlying; - GList *objects; - guint i; - - collection = gcr_filter_collection_new_with_callback (test->underlying, - NULL, NULL, NULL); - filter = GCR_FILTER_COLLECTION (collection); - - g_assert (test->underlying == gcr_filter_collection_get_underlying (filter)); - g_object_get (collection, "underlying", &underlying, NULL); - g_assert (test->underlying == underlying); - g_object_unref (underlying); - - g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS); - for (i = 0; i < NUM_OBJECTS; i++) - gcr_collection_contains (collection, test->objects[i]); - objects = gcr_collection_get_objects (collection); - g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS); - for (i = 0; i < NUM_OBJECTS; i++) - g_assert (g_list_find (objects, test->objects[i]) != NULL); - g_list_free (objects); - - g_object_unref (collection); -} - -static gboolean -on_filter_increment_value (GObject *object, - gpointer user_data) -{ - guint *value = user_data; - - g_assert_cmpuint (*value, >=, 0); - g_assert_cmpuint (*value, <=, 20); - (*value)++; - - return TRUE; -} - -static void -destroy_change_value (gpointer data) -{ - guint *value = data; - g_assert (value != NULL); - *value = 0; -} - -static void -test_callbacks (Test *test, - gconstpointer unused) -{ - GcrCollection *collection; - GcrFilterCollection *filter; - guint value = 4; - - collection = gcr_filter_collection_new_with_callback (test->underlying, - on_filter_increment_value, - &value, destroy_change_value); - g_assert_cmpuint (value, ==, 4 + NUM_OBJECTS); - - filter = GCR_FILTER_COLLECTION (collection); - - /* This should call destroy (value -> 0), and then refilter all values (value -> 10) */ - gcr_filter_collection_set_callback (filter, on_filter_increment_value, - &value, destroy_change_value); - g_assert_cmpuint (value, ==, NUM_OBJECTS); - - g_object_unref (collection); - g_assert_cmpuint (value, ==, 0); -} - -static gboolean -on_filter_modulo (GObject *object, - gpointer user_data) -{ - guint value = mock_object_value (object); - guint *modulo = user_data; - - g_assert (modulo != NULL); - g_assert_cmpuint (value, >=, 0); - g_assert_cmpuint (value, <, NUM_OBJECTS); - - return (value % *modulo) == 0; -} - -static void -test_filtering (Test *test, - gconstpointer unused) -{ - GcrFilterCollection *filter; - GcrCollection *collection; - GList *objects; - guint modulo; - guint i; - - modulo = 2; - collection = gcr_filter_collection_new_with_callback (test->underlying, - on_filter_modulo, &modulo, NULL); - filter = GCR_FILTER_COLLECTION (collection); - - g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo); - for (i = 0; i < NUM_OBJECTS; i += modulo) - gcr_collection_contains (collection, test->objects[i]); - objects = gcr_collection_get_objects (collection); - g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS / modulo); - for (i = 0; i < NUM_OBJECTS; i += modulo) - g_assert (g_list_find (objects, test->objects[i]) != NULL); - g_list_free (objects); - - modulo = 5; - gcr_filter_collection_refilter (filter); - - g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo); - for (i = 0; i < NUM_OBJECTS; i += modulo) - gcr_collection_contains (collection, test->objects[i]); - objects = gcr_collection_get_objects (collection); - g_assert_cmpuint (g_list_length (objects), ==, NUM_OBJECTS / modulo); - for (i = 0; i < NUM_OBJECTS; i += modulo) - g_assert (g_list_find (objects, test->objects[i]) != NULL); - g_list_free (objects); - - g_object_unref (collection); -} - -static void -on_filter_added (GcrCollection *collection, - GObject *object, - gpointer user_data) -{ - guint *added = user_data; - g_assert (added != NULL); - (*added)++; -} - -static void -on_filter_removed (GcrCollection *collection, - GObject *object, - gpointer user_data) -{ - guint *removed = user_data; - g_assert (removed != NULL); - (*removed)++; -} - -static void -test_add_remove (Test *test, - gconstpointer unused) -{ - GcrCollection *collection; - guint modulo; - guint added = 0; - guint removed = 0; - guint i; - - modulo = 2; - collection = gcr_filter_collection_new_with_callback (test->underlying, - on_filter_modulo, &modulo, NULL); - - g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo); - - g_signal_connect (collection, "added", G_CALLBACK (on_filter_added), &added); - g_signal_connect (collection, "removed", G_CALLBACK (on_filter_removed), &removed); - - for (i = 0; i < NUM_OBJECTS; i++) - gcr_simple_collection_remove (GCR_SIMPLE_COLLECTION (test->underlying), - test->objects[i]); - - g_assert_cmpuint (gcr_collection_get_length (collection), ==, 0); - g_assert_cmpuint (added, ==, 0); - g_assert_cmpuint (removed, ==, NUM_OBJECTS / modulo); - - for (i = 0; i < NUM_OBJECTS; i++) - gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (test->underlying), - test->objects[i]); - - g_assert_cmpuint (gcr_collection_get_length (collection), ==, NUM_OBJECTS / modulo); - g_assert_cmpuint (added, ==, NUM_OBJECTS / modulo); - g_assert_cmpuint (removed, ==, NUM_OBJECTS / modulo); - - g_object_unref (collection); -} - -int -main (int argc, char **argv) -{ - g_test_init (&argc, &argv, NULL); - g_set_prgname ("test-filter-collection"); - - g_test_add ("/gcr/filter-collection/create", Test, NULL, setup, test_create, teardown); - g_test_add ("/gcr/filter-collection/callbacks", Test, NULL, setup, test_callbacks, teardown); - g_test_add ("/gcr/filter-collection/filtering", Test, NULL, setup, test_filtering, teardown); - g_test_add ("/gcr/filter-collection/add-remove", Test, NULL, setup, test_add_remove, teardown); - - return g_test_run (); -} diff --git a/gcr/test-fingerprint.c b/gcr/test-fingerprint.c index 417d338..002e082 100644 --- a/gcr/test-fingerprint.c +++ b/gcr/test-fingerprint.c @@ -22,7 +22,7 @@ #include "config.h" #define GCR_COMPILATION 1 -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-internal.h" #include "gcr/gcr-fingerprint.h" @@ -115,7 +115,7 @@ build_attributes_for_cert (GBytes *data) gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509); - return gck_attributes_ref_sink (gck_builder_end (&builder)); + return gck_builder_end (&builder); } static GBytes * diff --git a/gcr/test-gnupg-collection.c b/gcr/test-gnupg-collection.c deleted file mode 100644 index e65900a..0000000 --- a/gcr/test-gnupg-collection.c +++ /dev/null @@ -1,249 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* - Copyright (C) 2010 Collabora Ltd - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#include "config.h" - -#include "gcr/gcr-base.h" -#include "gcr/gcr-gnupg-collection.h" -#include "gcr/gcr-gnupg-key.h" -#include "gcr/gcr-record.h" - -#include "egg/egg-testing.h" - -#include <glib.h> -#include <glib/gstdio.h> - -#include <errno.h> -#include <stdlib.h> -#include <string.h> - -typedef struct { - GcrGnupgCollection *collection; - gchar *directory; - GHashTable *keys; - GAsyncResult *result; -} Test; - -static void -on_collection_added (GcrCollection *collection, GObject *object, gpointer user_data) -{ - Test *test = user_data; - GcrGnupgKey *key; - const gchar *keyid; - - g_assert (GCR_COLLECTION (test->collection) == collection); - - g_assert (GCR_IS_GNUPG_KEY (object)); - key = GCR_GNUPG_KEY (object); - - keyid = _gcr_gnupg_key_get_keyid (key); - g_assert (keyid); - g_assert (!g_hash_table_lookup (test->keys, keyid)); - - g_hash_table_insert (test->keys, g_strdup (keyid), key); -} - -static void -on_collection_removed (GcrCollection *collection, GObject *object, gpointer user_data) -{ - Test *test = user_data; - GcrGnupgKey *key; - const gchar *keyid; - - g_assert (GCR_COLLECTION (test->collection) == collection); - g_assert (GCR_IS_GNUPG_KEY (object)); - - keyid = _gcr_gnupg_key_get_keyid (GCR_GNUPG_KEY (object)); - key = g_hash_table_lookup (test->keys, keyid); - g_assert (key == GCR_GNUPG_KEY (object)); - - if (!g_hash_table_remove (test->keys, keyid)) - g_assert_not_reached (); -} - -static void -setup (Test *test, gconstpointer unused) -{ - GcrCollection *collection; - GError *error = NULL; - gchar *cmd; - - test->directory = g_build_filename ("/tmp/gcr-tests.XXXXXX", NULL); - g_assert (g_mkdtemp_full (test->directory, 0700) != NULL); - - cmd = g_strdup_printf ("cp -p " SRCDIR "/gcr/fixtures/gnupg-homedir/* %s", test->directory); - g_spawn_check_exit_status (system (cmd), &error); - g_assert_no_error (error); - g_free (cmd); - - collection = _gcr_gnupg_collection_new (test->directory); - test->collection = GCR_GNUPG_COLLECTION (collection); - - test->keys = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - g_signal_connect (collection, "added", G_CALLBACK (on_collection_added), test); - g_signal_connect (collection, "removed", G_CALLBACK (on_collection_removed), test); -} - -static void -teardown (Test *test, gconstpointer unused) -{ - GError *error = NULL; - gchar *cmd; - - g_hash_table_destroy (test->keys); - - if (test->result) - g_object_unref (test->result); - - g_object_unref (test->collection); - - /* remove potential gpg 2.1 extras, ignore any errors. */ - cmd = g_strdup_printf ("rm -rf %s/*.d", test->directory); - system (cmd); - g_free (cmd); - cmd = g_strdup_printf ("rm -f %s/.gpg-v21-migrated", test->directory); - system (cmd); - g_free (cmd); - - cmd = g_strdup_printf ("rm -f %s/*", test->directory); - g_spawn_check_exit_status (system (cmd), &error); - g_assert_no_error (error); - g_free (cmd); - - if (g_rmdir (test->directory) < 0) - g_critical ("couldn't remove %s: %s", test->directory, g_strerror (errno)); - g_free (test->directory); -} - -static void -on_async_ready (GObject *source, GAsyncResult *res, gpointer user_data) -{ - Test *test = user_data; - g_assert (G_OBJECT (test->collection) == source); - g_assert (test->result == NULL); - test->result = g_object_ref (res); - egg_test_wait_stop (); -} - -static void -test_properties (Test *test, gconstpointer unused) -{ - gchar *directory; - g_object_get (test->collection, "directory", &directory, NULL); - g_assert_cmpstr (directory, ==, test->directory); - g_free (directory); -} - -static void -test_load (Test *test, gconstpointer unused) -{ - GError *error = NULL; - GcrGnupgKey *key; - GList *l, *objects; - GcrRecord *record; - GHashTable *check; - - _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test); - egg_test_wait_until (500000); - - g_assert (test->result); - _gcr_gnupg_collection_load_finish (test->collection, test->result, &error); - g_assert_no_error (error); - - /* Werner Koch (a public key) */ - key = g_hash_table_lookup (test->keys, "5DE249965B0358A2"); - g_assert (GCR_IS_GNUPG_KEY (key)); - g_assert (_gcr_gnupg_key_get_secret_records (key) == NULL); - - /* Test Number 2 (a secret key)*/ - key = g_hash_table_lookup (test->keys, "268FEE686262C395"); - g_assert (GCR_IS_GNUPG_KEY (key)); - g_assert (_gcr_gnupg_key_get_secret_records (key)); - - /* The length of collection should be correct */ - g_assert_cmpuint (g_hash_table_size (test->keys), ==, - gcr_collection_get_length (GCR_COLLECTION (test->collection))); - - /* The list of objects should be correct */ - objects = gcr_collection_get_objects (GCR_COLLECTION (test->collection)); - g_assert_cmpuint (g_hash_table_size (test->keys), ==, g_list_length (objects)); - check = g_hash_table_new (g_str_hash, g_str_equal); - for (l = objects; l != NULL; l = g_list_next (l)) { - g_assert (GCR_IS_GNUPG_KEY (l->data)); - key = g_hash_table_lookup (test->keys, _gcr_gnupg_key_get_keyid (l->data)); - g_assert (key == l->data); - g_hash_table_replace (check, (gchar*)_gcr_gnupg_key_get_keyid (l->data), ""); - } - g_assert_cmpuint (g_hash_table_size (check), ==, g_hash_table_size (test->keys)); - g_hash_table_destroy (check); - g_list_free (objects); - - /* Phillip R. Zimmerman's key should have a photo */ - key = g_hash_table_lookup (test->keys, "C7463639B2D7795E"); - g_assert (GCR_IS_GNUPG_KEY (key)); - record = _gcr_records_find (_gcr_gnupg_key_get_public_records (key), GCR_RECORD_SCHEMA_XA1); - g_assert (record); -} - -static void -test_reload (Test *test, gconstpointer unused) -{ - GError *error = NULL; - GcrGnupgKey *key; - - _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test); - egg_test_wait_until (500000); - g_assert (test->result); - _gcr_gnupg_collection_load_finish (test->collection, test->result, &error); - g_assert_no_error (error); - - g_object_unref (test->result); - test->result = NULL; - - _gcr_gnupg_collection_load_async (test->collection, NULL, on_async_ready, test); - egg_test_wait_until (500000); - g_assert (test->result); - _gcr_gnupg_collection_load_finish (test->collection, test->result, &error); - g_assert_no_error (error); - - /* Werner Koch (a public key) */ - key = g_hash_table_lookup (test->keys, "5DE249965B0358A2"); - g_assert (GCR_IS_GNUPG_KEY (key)); - g_assert (_gcr_gnupg_key_get_secret_records (key) == NULL); - - /* Test Number 2 (a secret key)*/ - key = g_hash_table_lookup (test->keys, "268FEE686262C395"); - g_assert (GCR_IS_GNUPG_KEY (key)); - g_assert (_gcr_gnupg_key_get_secret_records (key)); -} - -int -main (int argc, char **argv) -{ - g_test_init (&argc, &argv, NULL); - g_set_prgname ("test-gnupg-collection"); - - g_test_add ("/gcr/gnupg-collection/properties", Test, NULL, setup, test_properties, teardown); - g_test_add ("/gcr/gnupg-collection/load", Test, NULL, setup, test_load, teardown); - g_test_add ("/gcr/gnupg-collection/reload", Test, NULL, setup, test_reload, teardown); - - return egg_tests_run_with_loop (); -} diff --git a/gcr/test-gnupg-process.c b/gcr/test-gnupg-process.c index d6cedd0..827cfe0 100644 --- a/gcr/test-gnupg-process.c +++ b/gcr/test-gnupg-process.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-callback-output-stream.h" #include "gcr/gcr-gnupg-process.h" diff --git a/gcr/test-openpgp.c b/gcr/test-openpgp.c index afba139..897be02 100644 --- a/gcr/test-openpgp.c +++ b/gcr/test-openpgp.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-openpgp.h" #include "gcr/gcr-record.h" diff --git a/gcr/test-openssh.c b/gcr/test-openssh.c index 3161736..e3ad367 100644 --- a/gcr/test-openssh.c +++ b/gcr/test-openssh.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-openssh.h" #include "egg/egg-testing.h" diff --git a/gcr/test-parser.c b/gcr/test-parser.c index 13cbc2b..76960b5 100644 --- a/gcr/test-parser.c +++ b/gcr/test-parser.c @@ -26,7 +26,7 @@ #include "egg/egg-secure-memory.h" #include "egg/egg-testing.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-internal.h" #include "gck/gck.h" diff --git a/gcr/test-pkcs11-certificate.c b/gcr/test-pkcs11-certificate.c index e1858ce..1b11b7a 100644 --- a/gcr/test-pkcs11-certificate.c +++ b/gcr/test-pkcs11-certificate.c @@ -24,7 +24,7 @@ #include "egg/egg-asn1x.h" #include "egg/egg-asn1-defs.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-internal.h" #include "egg/egg-testing.h" diff --git a/gcr/test-secret-exchange.c b/gcr/test-secret-exchange.c index 27d7775..b533670 100644 --- a/gcr/test-secret-exchange.c +++ b/gcr/test-secret-exchange.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "egg/egg-testing.h" diff --git a/gcr/test-simple-certificate.c b/gcr/test-simple-certificate.c index 9353c5e..945768e 100644 --- a/gcr/test-simple-certificate.c +++ b/gcr/test-simple-certificate.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-internal.h" #include "gck/gck-test.h" diff --git a/gcr/test-ssh-askpass.c b/gcr/test-ssh-askpass.c index cd58fce..936f48d 100644 --- a/gcr/test-ssh-askpass.c +++ b/gcr/test-ssh-askpass.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "egg/egg-testing.h" #include "egg/mock-interaction.h" diff --git a/gcr/test-subject-public-key.c b/gcr/test-subject-public-key.c index 4d16a7b..e213d99 100644 --- a/gcr/test-subject-public-key.c +++ b/gcr/test-subject-public-key.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-subject-public-key.h" #include "gck/gck-mock.h" @@ -429,7 +429,7 @@ typedef struct { GckObject parent; GckAttributes *attrs; } MockObject; typedef struct { GckObjectClass parent; } MockObjectClass; GType mock_object_get_type (void) G_GNUC_CONST; -static void mock_object_cache_init (GckObjectCacheIface *iface); +static void mock_object_cache_init (GckObjectCacheInterface *iface); G_DEFINE_TYPE_WITH_CODE (MockObject, mock_object, GCK_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GCK_TYPE_OBJECT_CACHE, mock_object_cache_init) ); @@ -491,11 +491,11 @@ mock_object_fill (GckObjectCache *object, gck_builder_set_all (&builder, attrs); gck_attributes_unref (self->attrs); - self->attrs = gck_attributes_ref_sink (gck_builder_end (&builder)); + self->attrs = gck_builder_end (&builder); } static void -mock_object_cache_init (GckObjectCacheIface *iface) +mock_object_cache_init (GckObjectCacheInterface *iface) { iface->default_types = NULL; iface->n_default_types = 0; @@ -568,7 +568,7 @@ perform_load_partial (TestLoading *test, for (i = 0; i < gck_attributes_count (attributes); i += 2) gck_builder_add_attribute (&builder, gck_attributes_at (attributes, i)); - partial = gck_attributes_ref_sink (gck_builder_end (&builder)); + partial = gck_builder_end (&builder); object = g_object_new (mock_object_get_type (), "module", test->mo.module, @@ -649,7 +649,7 @@ test_load_failure_build (TestModule *test, gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); gck_builder_add_ulong (&builder, CKA_CERTIFICATE_TYPE, CKC_X_509); gck_builder_add_string (&builder, CKA_VALUE, "invalid value"); - attributes = gck_attributes_ref_sink (gck_builder_end (&builder)); + attributes = gck_builder_end (&builder); object = g_object_new (mock_object_get_type (), "module", test->module, diff --git a/gcr/test-system-prompt.c b/gcr/test-system-prompt.c index 7b3b2e7..e1d472e 100644 --- a/gcr/test-system-prompt.c +++ b/gcr/test-system-prompt.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-mock-prompter.h" #include "egg/egg-testing.h" diff --git a/gcr/test-trust.c b/gcr/test-trust.c index fb3dca9..08e4a35 100644 --- a/gcr/test-trust.c +++ b/gcr/test-trust.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-internal.h" #include "gck/gck-mock.h" diff --git a/gcr/test-util.c b/gcr/test-util.c index 6e7610f..8532c3e 100644 --- a/gcr/test-util.c +++ b/gcr/test-util.c @@ -21,7 +21,7 @@ #include "config.h" -#include "gcr/gcr-base.h" +#include "gcr/gcr.h" #include "gcr/gcr-util.h" #include <errno.h> diff --git a/meson.build b/meson.build index e2ec57c..dd70d01 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('gcr', 'c', - version: '3.41.0', + version: '3.90.0', meson_version: '>= 0.52', license: 'GPL2+', ) @@ -9,16 +9,16 @@ i18n = import('i18n') pkgconfig = import('pkgconfig') # Versioning -gcr_api_version = '3' +gcr_api_version = '4' gcr_version = meson.project_version() -gcr_soversion = '1.0.0' +gcr_soversion = '0.0.0' gcr_version_array = gcr_version.split('.') gcr_major_version = gcr_version_array[0].to_int() gcr_minor_version = gcr_version_array[1].to_int() gcr_micro_version = gcr_version_array[2].to_int() -gck_api_version = '1' -gck_version = '1.0.0' +gck_api_version = '2' +gck_version = '1.90.0' gck_soversion = '0.0.0' gck_version_array = gck_version.split('.') gck_major_version = gck_version_array[0].to_int() @@ -37,7 +37,8 @@ podir = source_root / 'po' gck_basename = 'gck-@0@'.format(gck_api_version) gcr_base_basename = 'gcr-base-@0@'.format(gcr_api_version) gcr_basename = 'gcr-@0@'.format(gcr_api_version) -gcr_ui_basename = 'gcr-ui-@0@'.format(gcr_api_version) +gcr_gtk3_basename = 'gcr-@0@-gtk3'.format(gcr_api_version) +gcr_gtk4_basename = 'gcr-@0@-gtk4'.format(gcr_api_version) # Dependencies min_glib_version = '2.44' @@ -72,9 +73,13 @@ if libsystemd.found() and systemd.found() with_systemd = true endif -if get_option('gtk') - gtk_min_version = '3.22' - gtk_dep = dependency('gtk+-3.0', version: '>=' + gtk_min_version) +if get_option('gtk3') + gtk3_min_version = '3.22' + gtk3_dep = dependency('gtk+-3.0', version: '>=' + gtk3_min_version) +endif + +if get_option('gtk4') + gtk4_dep = dependency('gtk4') endif # configuration @@ -104,9 +109,13 @@ subdir('egg') subdir('gck') subdir('gcr') subdir('schema') -if get_option('gtk') - subdir('ui') +if get_option('gtk3') + subdir('gcr-gtk3') +endif +if get_option('gtk4') + subdir('gcr-gtk4') endif +subdir('tools') if get_option('gtk_doc') if not get_option('introspection') error('Can\'t generate docs without introspection enabled!') @@ -118,7 +127,4 @@ endif # Post-install scripts meson.add_install_script('meson_post_install.py', get_option('datadir'), - get_option('libdir'), - gcr_major_version.to_string(), - gcr_soversion, ) diff --git a/meson_options.txt b/meson_options.txt index f96a47c..6f4bc52 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -3,15 +3,20 @@ option('introspection', value: true, description: 'Build GObject Introspection (GIR) files', ) -option('gtk', +option('gtk3', type: 'boolean', value: true, - description: 'Build code that uses GTK+', + description: 'Enable the GTK3 library and utilities', +) +option('gtk4', + type: 'boolean', + value: true, + description: 'Enable the GTK4 library and utilities', ) option('gtk_doc', type: 'boolean', value: true, - description: 'Build the reference documentation (requires gtk-doc)', + description: 'Build the reference documentation (requires gi-docgen)', ) option('gpg_path', type: 'string', diff --git a/meson_post_install.py b/meson_post_install.py index 0166814..9e5cbdf 100755 --- a/meson_post_install.py +++ b/meson_post_install.py @@ -9,9 +9,6 @@ install_prefix = os.environ['MESON_INSTALL_DESTDIR_PREFIX'] # Args datadir = sys.argv[1] -libdir = sys.argv[2] -gcr_major_version = sys.argv[3] -gcr_soversion = sys.argv[4] icondir = os.path.join(install_prefix, datadir, 'icons', 'hicolor') schemadir = os.path.join(install_prefix, datadir, 'glib-2.0', 'schemas') @@ -29,23 +26,3 @@ subprocess.call(['glib-compile-schemas', schemadir]) print('Updating MIME database...') subprocess.call(['update-mime-database', mimedatabasedir]) - -# FIXME: after a major version bump, just drop this -print('Creating symlink for libgcr-{}.so'.format(gcr_major_version)) - -def _get_path_for_lib(basename): - return os.path.join(install_prefix, libdir, basename) - -libgcr_ui_basename = 'libgcr-ui-{}.so'.format(gcr_major_version) -libgcr_basename = 'libgcr-{}.so'.format(gcr_major_version) - -subprocess.call(['ln', '-f', '-s', libgcr_ui_basename, _get_path_for_lib(libgcr_basename)]) - -for v in gcr_soversion.split('.'): - libgcr_ui_basename += '.{}'.format(v) - libgcr_basename += '.{}'.format(v) - - if not os.path.exists(_get_path_for_lib(libgcr_ui_basename)): - continue - - subprocess.call(['ln', '-f', '-s', libgcr_ui_basename, _get_path_for_lib(libgcr_basename)]) diff --git a/po/POTFILES.in b/po/POTFILES.in index 1062ddb..6e8a8e6 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -22,23 +22,23 @@ gcr/gcr-ssh-askpass.c gcr/gcr-subject-public-key.c gcr/gcr-system-prompt.c gcr/gcr-trust.c -ui/gcr-certificate-renderer.c -ui/gcr-certificate-request-renderer.c -ui/gcr-certificate-widget.c -ui/gcr-display-view.c -ui/gcr-failure-renderer.c -ui/gcr-gnupg-renderer.c -ui/gcr-import-button.c -ui/gcr-key-renderer.c -ui/gcr-pkcs11-import-dialog.c -ui/gcr-pkcs11-import-dialog.ui -ui/gcr-pkcs11-import-interaction.c -ui/gcr-prompt-dialog.c -ui/gcr-prompter.desktop.in.in -ui/gcr-certificate-exporter.c -ui/gcr-unlock-options-widget.ui -ui/gcr-unlock-renderer.c -ui/gcr-viewer.desktop.in.in -ui/gcr-viewer-tool.c -ui/gcr-viewer-widget.c -ui/gcr-viewer-window.c +gcr-gtk3/gcr-certificate-renderer.c +gcr-gtk3/gcr-certificate-request-renderer.c +gcr-gtk3/gcr-certificate-widget.c +gcr-gtk3/gcr-display-view.c +gcr-gtk3/gcr-failure-renderer.c +gcr-gtk3/gcr-gnupg-renderer.c +gcr-gtk3/gcr-import-button.c +gcr-gtk3/gcr-key-renderer.c +gcr-gtk3/gcr-pkcs11-import-dialog.c +gcr-gtk3/gcr-pkcs11-import-dialog.ui +gcr-gtk3/gcr-pkcs11-import-interaction.c +gcr-gtk3/gcr-prompt-dialog.c +gcr-gtk3/gcr-prompter.desktop.in.in +gcr-gtk3/gcr-certificate-exporter.c +gcr-gtk3/gcr-unlock-options-widget.ui +gcr-gtk3/gcr-unlock-renderer.c +gcr-gtk3/gcr-viewer.desktop.in.in +gcr-gtk3/gcr-viewer-tool.c +gcr-gtk3/gcr-viewer-widget.c +gcr-gtk3/gcr-viewer-window.c diff --git a/tools/gtk3/meson.build b/tools/gtk3/meson.build new file mode 100644 index 0000000..e2da60f --- /dev/null +++ b/tools/gtk3/meson.build @@ -0,0 +1,7 @@ +gcr_viewer_gtk3 = executable('gcr-viewer-gtk3', + 'viewer.c', + dependencies: [ gcr_gtk3_dep, gcr_gtk3_deps ], + c_args: gcr_gtk3_cflags, + include_directories: config_h_dir, + install: true, +) diff --git a/tools/gtk3/viewer.c b/tools/gtk3/viewer.c new file mode 100644 index 0000000..e8e6e7c --- /dev/null +++ b/tools/gtk3/viewer.c @@ -0,0 +1,139 @@ +/* + * Copyright 2011,2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * Copyright Stef Walter <stefw@collabora.co.uk> + * SPDX-License-Identifier: LGPL-2.0-or-later + */ + +#include <glib.h> +#include <glib/gi18n.h> +#include <gtk/gtk.h> +#include <gcr-gtk3/gcr-gtk3.h> + +#include "config.h" + +static gchar **remaining_args = NULL; + +static gboolean +print_version_and_exit (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + g_print("%s -- %s\n", _("GCR Certificate Viewer"), VERSION); + exit (0); + return TRUE; +} + +static const GOptionEntry options[] = { + { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, + print_version_and_exit, N_("Show the application's version"), NULL}, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, + &remaining_args, NULL, N_("[file...]") }, + { NULL } +}; + +static void +on_parser_parsed (GcrParser *parser, + gpointer user_data) +{ + GcrCertificate **cert = user_data; + GckAttributes *attributes; + const GckAttribute *attr; + + attributes = gcr_parser_get_parsed_attributes (parser); + attr = gck_attributes_find (attributes, CKA_VALUE); + *cert = gcr_simple_certificate_new (attr->value, attr->length); +} + +GcrCertificate * +simple_certificate_new_from_file (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GcrCertificate *cert = NULL; + GcrParser *parser; + GBytes *bytes; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (!error || !*error, NULL); + + + bytes = g_file_load_bytes (file, cancellable, NULL, error); + if (!bytes) { + return NULL; + } + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &cert); + if (!gcr_parser_parse_bytes (parser, bytes, error)) { + g_bytes_unref (bytes); + g_object_unref (parser); + g_object_unref (cert); + return NULL; + } + + g_bytes_unref (bytes); + g_object_unref (parser); + return cert; +} + + +static void +activate (GtkApplication* app, + gpointer user_data) +{ + GtkWidget *window; + GtkWidget *box; + GtkWidget *scrolled; + GCancellable *cancellable = NULL; + + window = gtk_application_window_new (app); + gtk_window_set_title (GTK_WINDOW (window), "Window"); + gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); + scrolled = gtk_scrolled_window_new (NULL, NULL); + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + g_object_set (G_OBJECT (scrolled), + "child", box, + "hscrollbar-policy", GTK_POLICY_NEVER, + NULL); + + if (remaining_args) { + for (int i = 0; remaining_args[i] != NULL; ++i) { + GFile *file; + GError *error = NULL; + GcrCertificate *certificate; + GtkWidget *widget; + + file = g_file_new_for_commandline_arg (remaining_args[i]); + certificate = simple_certificate_new_from_file (file, cancellable, &error); + g_object_unref (file); + widget = gcr_certificate_widget_new (GCR_CERTIFICATE (certificate)); + g_object_unref (certificate); + gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); + gtk_container_add (GTK_CONTAINER (box), widget); + } + + g_clear_pointer (&remaining_args, g_strfreev); + remaining_args = NULL; + } + + gtk_container_add (GTK_CONTAINER (window), scrolled); + gtk_widget_show_all (window); +} + +int +main (int argc, + char **argv) +{ + GtkApplication *app; + int status; + + app = gtk_application_new ("org.gnome.GcrViewerGtk4", G_APPLICATION_FLAGS_NONE); + g_application_add_main_option_entries (G_APPLICATION (app), options); + g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); + status = g_application_run (G_APPLICATION (app), argc, argv); + g_object_unref (app); + + return status; +} diff --git a/tools/gtk4/meson.build b/tools/gtk4/meson.build new file mode 100644 index 0000000..f15e00b --- /dev/null +++ b/tools/gtk4/meson.build @@ -0,0 +1,7 @@ +gcr_viewer_gtk4 = executable('gcr-viewer-gtk4', + 'viewer.c', + dependencies: [ gcr_gtk4_dep, gcr_gtk4_deps ], + c_args: gcr_gtk4_cflags, + include_directories: config_h_dir, + install: true, +) diff --git a/tools/gtk4/viewer.c b/tools/gtk4/viewer.c new file mode 100644 index 0000000..9440b28 --- /dev/null +++ b/tools/gtk4/viewer.c @@ -0,0 +1,139 @@ +/* + * Copyright 2011,2021 Collabora Ltd. + * Copyright Corentin Noël <corentin.noel@collabora.com> + * Copyright Stef Walter <stefw@collabora.co.uk> + * SPDX-License-Identifier: LGPL-2.0-or-later + */ + +#include <glib.h> +#include <glib/gi18n.h> +#include <gtk/gtk.h> +#include <gcr-gtk4/gcr-gtk4.h> + +#include "config.h" + +static gchar **remaining_args = NULL; + +static gboolean +print_version_and_exit (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + g_print("%s -- %s\n", _("GCR Certificate Viewer"), VERSION); + exit (0); + return TRUE; +} + +static const GOptionEntry options[] = { + { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, + print_version_and_exit, N_("Show the application's version"), NULL}, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, + &remaining_args, NULL, N_("[file...]") }, + { NULL } +}; + +static void +on_parser_parsed (GcrParser *parser, + gpointer user_data) +{ + GcrCertificate **cert = user_data; + GckAttributes *attributes; + const GckAttribute *attr; + + attributes = gcr_parser_get_parsed_attributes (parser); + attr = gck_attributes_find (attributes, CKA_VALUE); + *cert = gcr_simple_certificate_new (attr->value, attr->length); +} + +GcrCertificate * +simple_certificate_new_from_file (GFile *file, + GCancellable *cancellable, + GError **error) +{ + GcrCertificate *cert = NULL; + GcrParser *parser; + GBytes *bytes; + + g_return_val_if_fail (G_IS_FILE (file), NULL); + g_return_val_if_fail (!error || !*error, NULL); + + + bytes = g_file_load_bytes (file, cancellable, NULL, error); + if (!bytes) { + return NULL; + } + + parser = gcr_parser_new (); + g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), &cert); + if (!gcr_parser_parse_bytes (parser, bytes, error)) { + g_bytes_unref (bytes); + g_object_unref (parser); + g_object_unref (cert); + return NULL; + } + + g_bytes_unref (bytes); + g_object_unref (parser); + return cert; +} + + +static void +activate (GtkApplication* app, + gpointer user_data) +{ + GtkWidget *window; + GtkWidget *box; + GtkWidget *scrolled; + GCancellable *cancellable = NULL; + + window = gtk_application_window_new (app); + gtk_window_set_title (GTK_WINDOW (window), "Window"); + gtk_window_set_default_size (GTK_WINDOW (window), 400, 300); + scrolled = gtk_scrolled_window_new (); + box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12); + g_object_set (G_OBJECT (scrolled), + "child", box, + "hscrollbar-policy", GTK_POLICY_NEVER, + NULL); + + if (remaining_args) { + for (int i = 0; remaining_args[i] != NULL; ++i) { + GFile *file; + GError *error = NULL; + GcrCertificate *certificate; + GtkWidget *widget; + + file = g_file_new_for_commandline_arg (remaining_args[i]); + certificate = simple_certificate_new_from_file (file, cancellable, &error); + g_object_unref (file); + widget = gcr_certificate_widget_new (GCR_CERTIFICATE (certificate)); + g_object_unref (certificate); + gtk_widget_set_halign (widget, GTK_ALIGN_CENTER); + gtk_box_append (GTK_BOX (box), widget); + } + + g_clear_pointer (&remaining_args, g_strfreev); + remaining_args = NULL; + } + + gtk_window_set_child (GTK_WINDOW (window), scrolled); + gtk_widget_show (window); +} + +int +main (int argc, + char **argv) +{ + GtkApplication *app; + int status; + + app = gtk_application_new ("org.gnome.GcrViewerGtk4", G_APPLICATION_FLAGS_NONE); + g_application_add_main_option_entries (G_APPLICATION (app), options); + g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); + status = g_application_run (G_APPLICATION (app), argc, argv); + g_object_unref (app); + + return status; +} diff --git a/tools/meson.build b/tools/meson.build new file mode 100644 index 0000000..4db190e --- /dev/null +++ b/tools/meson.build @@ -0,0 +1,7 @@ +if get_option('gtk3') + subdir('gtk3') +endif + +if get_option('gtk4') + subdir('gtk4') +endif diff --git a/ui/GcrUi-3.metadata b/ui/GcrUi-3.metadata deleted file mode 100644 index 85cb51a..0000000 --- a/ui/GcrUi-3.metadata +++ /dev/null @@ -1,5 +0,0 @@ -// Metadata file for Vala API generation. -// See https://live.gnome.org/Vala/UpstreamGuide for more information - -CertificateRenderer - .label skip=true
\ No newline at end of file diff --git a/ui/eggimagemenuitem.c b/ui/eggimagemenuitem.c deleted file mode 100644 index 47d2d9e..0000000 --- a/ui/eggimagemenuitem.c +++ /dev/null @@ -1,734 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) 2001 Red Hat, Inc. - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -/* - * GtkImageMenuItem was was deprecated from GTK+ and reasoning explained - * here: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub - * Gcr wants to use image menu items in button drop downs using the device icons - * (for the import button). So just copy it here with the stock and activatable - * sutff removed - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#include "config.h" - -#include "eggimagemenuitem.h" - -struct _EggImageMenuItemPrivate -{ - GtkWidget *image; - - gchar *label; - guint always_show_image : 1; - guint16 toggle_size; -}; - -enum { - PROP_0, - PROP_IMAGE, - PROP_ALWAYS_SHOW_IMAGE -}; - -static void egg_image_menu_item_destroy (GtkWidget *widget); -static void egg_image_menu_item_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural); -static void egg_image_menu_item_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural); -static void egg_image_menu_item_get_preferred_height_for_width (GtkWidget *widget, - gint width, - gint *minimum, - gint *natural); -static void egg_image_menu_item_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void egg_image_menu_item_map (GtkWidget *widget); -static void egg_image_menu_item_remove (GtkContainer *container, - GtkWidget *child); -static void egg_image_menu_item_toggle_size_request (GtkMenuItem *menu_item, - gint *requisition); -static void egg_image_menu_item_toggle_size_allocate (GtkMenuItem *menu_item, - gint allocation); -static void egg_image_menu_item_set_label (GtkMenuItem *menu_item, - const gchar *label); -static const gchar * egg_image_menu_item_get_label (GtkMenuItem *menu_item); - -static void egg_image_menu_item_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); - -static void egg_image_menu_item_finalize (GObject *object); -static void egg_image_menu_item_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void egg_image_menu_item_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void egg_image_menu_item_screen_changed (GtkWidget *widget, - GdkScreen *previous_screen); - -static void egg_image_menu_item_recalculate (EggImageMenuItem *image_menu_item); - -G_DEFINE_TYPE_WITH_PRIVATE (EggImageMenuItem, egg_image_menu_item, GTK_TYPE_MENU_ITEM); - -static void -egg_image_menu_item_class_init (EggImageMenuItemClass *klass) -{ - GObjectClass *gobject_class = (GObjectClass*) klass; - GtkWidgetClass *widget_class = (GtkWidgetClass*) klass; - GtkMenuItemClass *menu_item_class = (GtkMenuItemClass*) klass; - GtkContainerClass *container_class = (GtkContainerClass*) klass; - - widget_class->destroy = egg_image_menu_item_destroy; - widget_class->screen_changed = egg_image_menu_item_screen_changed; - widget_class->get_preferred_width = egg_image_menu_item_get_preferred_width; - widget_class->get_preferred_height = egg_image_menu_item_get_preferred_height; - widget_class->get_preferred_height_for_width = egg_image_menu_item_get_preferred_height_for_width; - widget_class->size_allocate = egg_image_menu_item_size_allocate; - widget_class->map = egg_image_menu_item_map; - - container_class->forall = egg_image_menu_item_forall; - container_class->remove = egg_image_menu_item_remove; - - menu_item_class->toggle_size_request = egg_image_menu_item_toggle_size_request; - menu_item_class->toggle_size_allocate = egg_image_menu_item_toggle_size_allocate; - menu_item_class->set_label = egg_image_menu_item_set_label; - menu_item_class->get_label = egg_image_menu_item_get_label; - - gobject_class->finalize = egg_image_menu_item_finalize; - gobject_class->set_property = egg_image_menu_item_set_property; - gobject_class->get_property = egg_image_menu_item_get_property; - - g_object_class_install_property (gobject_class, - PROP_IMAGE, - g_param_spec_object ("image", - "Image widget", - "Child widget to appear next to the menu text", - GTK_TYPE_WIDGET, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, - PROP_ALWAYS_SHOW_IMAGE, - g_param_spec_boolean ("always-show-image", - "Always show image", - "Whether the image will always be shown", - FALSE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); -} - -static void -egg_image_menu_item_init (EggImageMenuItem *image_menu_item) -{ - EggImageMenuItemPrivate *priv; - - image_menu_item->priv = egg_image_menu_item_get_instance_private (image_menu_item); - priv = image_menu_item->priv; - - priv->image = NULL; - priv->label = NULL; -} - -static void -egg_image_menu_item_finalize (GObject *object) -{ - EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (object)->priv; - - g_free (priv->label); - priv->label = NULL; - - G_OBJECT_CLASS (egg_image_menu_item_parent_class)->finalize (object); -} - -static void -egg_image_menu_item_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (object); - - switch (prop_id) - { - case PROP_IMAGE: - egg_image_menu_item_set_image (image_menu_item, (GtkWidget *) g_value_get_object (value)); - break; - case PROP_ALWAYS_SHOW_IMAGE: - egg_image_menu_item_set_always_show_image (image_menu_item, g_value_get_boolean (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -egg_image_menu_item_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (object); - - switch (prop_id) - { - case PROP_IMAGE: - g_value_set_object (value, egg_image_menu_item_get_image (image_menu_item)); - break; - case PROP_ALWAYS_SHOW_IMAGE: - g_value_set_boolean (value, egg_image_menu_item_get_always_show_image (image_menu_item)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static gboolean -show_image (EggImageMenuItem *image_menu_item) -{ - EggImageMenuItemPrivate *priv = image_menu_item->priv; - GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (image_menu_item)); - gboolean show; - - if (priv->always_show_image) - show = TRUE; - else - g_object_get (settings, "gtk-menu-images", &show, NULL); - - return show; -} - -static void -egg_image_menu_item_map (GtkWidget *widget) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - - GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->map (widget); - - if (priv->image) - g_object_set (priv->image, - "visible", show_image (image_menu_item), - NULL); -} - -static void -egg_image_menu_item_destroy (GtkWidget *widget) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - - if (priv->image) - gtk_container_remove (GTK_CONTAINER (image_menu_item), - priv->image); - - GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->destroy (widget); -} - -static void -egg_image_menu_item_toggle_size_request (GtkMenuItem *menu_item, - gint *requisition) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (menu_item); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - GtkPackDirection pack_dir; - GtkWidget *parent; - GtkWidget *widget = GTK_WIDGET (menu_item); - - parent = gtk_widget_get_parent (widget); - - if (GTK_IS_MENU_BAR (parent)) - pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); - else - pack_dir = GTK_PACK_DIRECTION_LTR; - - *requisition = 0; - - if (priv->image && gtk_widget_get_visible (priv->image)) - { - GtkRequisition image_requisition; - guint toggle_spacing; - - gtk_widget_get_preferred_size (priv->image, &image_requisition, NULL); - - gtk_widget_style_get (GTK_WIDGET (menu_item), - "toggle-spacing", &toggle_spacing, - NULL); - - if (pack_dir == GTK_PACK_DIRECTION_LTR || pack_dir == GTK_PACK_DIRECTION_RTL) - { - if (image_requisition.width > 0) - *requisition = image_requisition.width + toggle_spacing; - } - else - { - if (image_requisition.height > 0) - *requisition = image_requisition.height + toggle_spacing; - } - } -} - -static void -egg_image_menu_item_toggle_size_allocate (GtkMenuItem *menu_item, - gint allocation) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (menu_item); - image_menu_item->priv->toggle_size = allocation; - GTK_MENU_ITEM_CLASS (egg_image_menu_item_parent_class)->toggle_size_allocate (menu_item, allocation); -} - -static void -egg_image_menu_item_recalculate (EggImageMenuItem *image_menu_item) -{ - EggImageMenuItemPrivate *priv = image_menu_item->priv; - - GTK_MENU_ITEM_CLASS - (egg_image_menu_item_parent_class)->set_label (GTK_MENU_ITEM (image_menu_item), priv->label); -} - -static void -egg_image_menu_item_set_label (GtkMenuItem *menu_item, - const gchar *label) -{ - EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (menu_item)->priv; - - if (priv->label != label) - { - g_free (priv->label); - priv->label = g_strdup (label); - - egg_image_menu_item_recalculate (EGG_IMAGE_MENU_ITEM (menu_item)); - - g_object_notify (G_OBJECT (menu_item), "label"); - - } -} - -static const gchar * -egg_image_menu_item_get_label (GtkMenuItem *menu_item) -{ - EggImageMenuItemPrivate *priv = EGG_IMAGE_MENU_ITEM (menu_item)->priv; - - return priv->label; -} - -static void -egg_image_menu_item_get_preferred_width (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - GtkPackDirection pack_dir; - GtkWidget *parent; - - parent = gtk_widget_get_parent (widget); - - if (GTK_IS_MENU_BAR (parent)) - pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); - else - pack_dir = GTK_PACK_DIRECTION_LTR; - - GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->get_preferred_width (widget, minimum, natural); - - if ((pack_dir == GTK_PACK_DIRECTION_TTB || pack_dir == GTK_PACK_DIRECTION_BTT) && - priv->image && - gtk_widget_get_visible (priv->image)) - { - gint child_minimum, child_natural; - - gtk_widget_get_preferred_width (priv->image, &child_minimum, &child_natural); - - *minimum = MAX (*minimum, child_minimum); - *natural = MAX (*natural, child_natural); - } -} - -static void -egg_image_menu_item_get_preferred_height (GtkWidget *widget, - gint *minimum, - gint *natural) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - gint child_height = 0; - GtkPackDirection pack_dir; - GtkWidget *parent; - - parent = gtk_widget_get_parent (widget); - - if (GTK_IS_MENU_BAR (parent)) - pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); - else - pack_dir = GTK_PACK_DIRECTION_LTR; - - if (priv->image && gtk_widget_get_visible (priv->image)) - { - GtkRequisition child_requisition; - - gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL); - - child_height = child_requisition.height; - } - - GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->get_preferred_height (widget, minimum, natural); - - if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR) - { - *minimum = MAX (*minimum, child_height); - *natural = MAX (*natural, child_height); - } -} - -static void -egg_image_menu_item_get_preferred_height_for_width (GtkWidget *widget, - gint width, - gint *minimum, - gint *natural) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - gint child_height = 0; - GtkPackDirection pack_dir; - GtkWidget *parent; - - parent = gtk_widget_get_parent (widget); - - if (GTK_IS_MENU_BAR (parent)) - pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); - else - pack_dir = GTK_PACK_DIRECTION_LTR; - - if (priv->image && gtk_widget_get_visible (priv->image)) - { - GtkRequisition child_requisition; - - gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL); - - child_height = child_requisition.height; - } - - GTK_WIDGET_CLASS - (egg_image_menu_item_parent_class)->get_preferred_height_for_width (widget, width, minimum, natural); - - if (pack_dir == GTK_PACK_DIRECTION_RTL || pack_dir == GTK_PACK_DIRECTION_LTR) - { - *minimum = MAX (*minimum, child_height); - *natural = MAX (*natural, child_height); - } -} - - -static void -egg_image_menu_item_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (widget); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - GtkAllocation widget_allocation; - GtkPackDirection pack_dir; - GtkWidget *parent; - - parent = gtk_widget_get_parent (widget); - - if (GTK_IS_MENU_BAR (parent)) - pack_dir = gtk_menu_bar_get_child_pack_direction (GTK_MENU_BAR (parent)); - else - pack_dir = GTK_PACK_DIRECTION_LTR; - - GTK_WIDGET_CLASS (egg_image_menu_item_parent_class)->size_allocate (widget, allocation); - - if (priv->image && gtk_widget_get_visible (priv->image)) - { - gint x, y, offset; - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder padding; - GtkRequisition child_requisition; - GtkAllocation child_allocation; - guint horizontal_padding, toggle_spacing; - gint toggle_size; - - toggle_size = priv->toggle_size; - gtk_widget_style_get (widget, - "horizontal-padding", &horizontal_padding, - "toggle-spacing", &toggle_spacing, - NULL); - - /* Man this is lame hardcoding action, but I can't - * come up with a solution that's really better. - */ - - gtk_widget_get_preferred_size (priv->image, &child_requisition, NULL); - - gtk_widget_get_allocation (widget, &widget_allocation); - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - gtk_style_context_get_padding (context, state, &padding); - offset = gtk_container_get_border_width (GTK_CONTAINER (image_menu_item)); - - if (pack_dir == GTK_PACK_DIRECTION_LTR || - pack_dir == GTK_PACK_DIRECTION_RTL) - { - if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) == - (pack_dir == GTK_PACK_DIRECTION_LTR)) - x = offset + horizontal_padding + padding.left + - (toggle_size - toggle_spacing - child_requisition.width) / 2; - else - x = widget_allocation.width - offset - horizontal_padding - padding.right - - toggle_size + toggle_spacing + - (toggle_size - toggle_spacing - child_requisition.width) / 2; - - y = (widget_allocation.height - child_requisition.height) / 2; - } - else - { - if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) == - (pack_dir == GTK_PACK_DIRECTION_TTB)) - y = offset + horizontal_padding + padding.top + - (toggle_size - toggle_spacing - child_requisition.height) / 2; - else - y = widget_allocation.height - offset - horizontal_padding - padding.bottom - - toggle_size + toggle_spacing + - (toggle_size - toggle_spacing - child_requisition.height) / 2; - - x = (widget_allocation.width - child_requisition.width) / 2; - } - - child_allocation.width = child_requisition.width; - child_allocation.height = child_requisition.height; - child_allocation.x = widget_allocation.x + MAX (x, 0); - child_allocation.y = widget_allocation.y + MAX (y, 0); - - gtk_widget_size_allocate (priv->image, &child_allocation); - } -} - -static void -egg_image_menu_item_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (container); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - - GTK_CONTAINER_CLASS (egg_image_menu_item_parent_class)->forall (container, - include_internals, - callback, - callback_data); - - if (include_internals && priv->image) - (* callback) (priv->image, callback_data); -} - -GtkWidget* -egg_image_menu_item_new (void) -{ - return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM, NULL); -} - -GtkWidget* -egg_image_menu_item_new_with_label (const gchar *label) -{ - return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM, - "label", label, - NULL); -} - -GtkWidget* -egg_image_menu_item_new_with_mnemonic (const gchar *label) -{ - return g_object_new (EGG_TYPE_IMAGE_MENU_ITEM, - "use-underline", TRUE, - "label", label, - NULL); -} - -void -egg_image_menu_item_set_always_show_image (EggImageMenuItem *image_menu_item, - gboolean always_show) -{ - EggImageMenuItemPrivate *priv; - - g_return_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item)); - - priv = image_menu_item->priv; - - if (priv->always_show_image != always_show) - { - priv->always_show_image = always_show; - - if (priv->image) - { - if (show_image (image_menu_item)) - gtk_widget_show (priv->image); - else - gtk_widget_hide (priv->image); - } - - g_object_notify (G_OBJECT (image_menu_item), "always-show-image"); - } -} - -gboolean -egg_image_menu_item_get_always_show_image (EggImageMenuItem *image_menu_item) -{ - g_return_val_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item), FALSE); - - return image_menu_item->priv->always_show_image; -} - -void -egg_image_menu_item_set_image (EggImageMenuItem *image_menu_item, - GtkWidget *image) -{ - EggImageMenuItemPrivate *priv; - - g_return_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item)); - - priv = image_menu_item->priv; - - if (image == priv->image) - return; - - if (priv->image) - gtk_container_remove (GTK_CONTAINER (image_menu_item), - priv->image); - - priv->image = image; - - if (image == NULL) - return; - - gtk_widget_set_parent (image, GTK_WIDGET (image_menu_item)); - g_object_set (image, - "visible", show_image (image_menu_item), - "no-show-all", TRUE, - NULL); - - g_object_notify (G_OBJECT (image_menu_item), "image"); -} - -GtkWidget* -egg_image_menu_item_get_image (EggImageMenuItem *image_menu_item) -{ - g_return_val_if_fail (EGG_IS_IMAGE_MENU_ITEM (image_menu_item), NULL); - - return image_menu_item->priv->image; -} - -static void -egg_image_menu_item_remove (GtkContainer *container, - GtkWidget *child) -{ - EggImageMenuItem *image_menu_item = EGG_IMAGE_MENU_ITEM (container); - EggImageMenuItemPrivate *priv = image_menu_item->priv; - - if (child == priv->image) - { - gboolean widget_was_visible; - - widget_was_visible = gtk_widget_get_visible (child); - - gtk_widget_unparent (child); - priv->image = NULL; - - if (widget_was_visible && - gtk_widget_get_visible (GTK_WIDGET (container))) - gtk_widget_queue_resize (GTK_WIDGET (container)); - - g_object_notify (G_OBJECT (image_menu_item), "image"); - } - else - { - GTK_CONTAINER_CLASS (egg_image_menu_item_parent_class)->remove (container, child); - } -} - -static void -show_image_change_notify (EggImageMenuItem *image_menu_item) -{ - EggImageMenuItemPrivate *priv = image_menu_item->priv; - - if (priv->image) - { - if (show_image (image_menu_item)) - gtk_widget_show (priv->image); - else - gtk_widget_hide (priv->image); - } -} - -static void -traverse_container (GtkWidget *widget, - gpointer data) -{ - if (EGG_IS_IMAGE_MENU_ITEM (widget)) - show_image_change_notify (EGG_IMAGE_MENU_ITEM (widget)); - else if (GTK_IS_CONTAINER (widget)) - gtk_container_forall (GTK_CONTAINER (widget), traverse_container, NULL); -} - -static void -egg_image_menu_item_setting_changed (GtkSettings *settings) -{ - GList *list, *l; - - list = gtk_window_list_toplevels (); - - for (l = list; l; l = l->next) - gtk_container_forall (GTK_CONTAINER (l->data), - traverse_container, NULL); - - g_list_free (list); -} - -static void -egg_image_menu_item_screen_changed (GtkWidget *widget, - GdkScreen *previous_screen) -{ - GtkSettings *settings; - gulong show_image_connection; - - if (!gtk_widget_has_screen (widget)) - return; - - settings = gtk_widget_get_settings (widget); - - show_image_connection = - g_signal_handler_find (settings, G_SIGNAL_MATCH_FUNC, 0, 0, - NULL, egg_image_menu_item_setting_changed, NULL); - - if (show_image_connection) - return; - - g_signal_connect (settings, "notify::gtk-menu-images", - G_CALLBACK (egg_image_menu_item_setting_changed), NULL); - - show_image_change_notify (EGG_IMAGE_MENU_ITEM (widget)); -} diff --git a/ui/eggimagemenuitem.h b/ui/eggimagemenuitem.h deleted file mode 100644 index 6576a1d..0000000 --- a/ui/eggimagemenuitem.h +++ /dev/null @@ -1,80 +0,0 @@ -/* GTK - The GIMP Toolkit - * Copyright (C) Red Hat, Inc. - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -/* - * GtkImageMenuItem was was deprecated from GTK+ and reasoning explained - * here: https://docs.google.com/document/d/1KCVPoYQBqMbDP11tHPpjW6uaEHrvLUmcDPqKAppCY8o/pub - * Gcr wants to use image menu items in button drop downs using the device icons - * (for the import button). So just copy it here with the stock and activatable - * sutff removed - */ - -/* - * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS - * file for a list of people on the GTK+ Team. See the ChangeLog - * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. - */ - -#ifndef __EGG_IMAGE_MENUITEM_H__ -#define __EGG_IMAGE_MENUITEM_H__ - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define EGG_TYPE_IMAGE_MENU_ITEM (egg_image_menu_item_get_type ()) -#define EGG_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItem)) -#define EGG_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemClass)) -#define EGG_IS_IMAGE_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_IMAGE_MENU_ITEM)) -#define EGG_IS_IMAGE_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_IMAGE_MENU_ITEM)) -#define EGG_IMAGE_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_IMAGE_MENU_ITEM, EggImageMenuItemClass)) - - -typedef struct _EggImageMenuItem EggImageMenuItem; -typedef struct _EggImageMenuItemPrivate EggImageMenuItemPrivate; -typedef struct _EggImageMenuItemClass EggImageMenuItemClass; - -struct _EggImageMenuItem -{ - GtkMenuItem menu_item; - - /*< private >*/ - EggImageMenuItemPrivate *priv; -}; - -struct _EggImageMenuItemClass -{ - GtkMenuItemClass parent_class; -}; - -GType egg_image_menu_item_get_type (void) G_GNUC_CONST; -GtkWidget* egg_image_menu_item_new (void); -GtkWidget* egg_image_menu_item_new_with_label (const gchar *label); -GtkWidget* egg_image_menu_item_new_with_mnemonic (const gchar *label); -void egg_image_menu_item_set_always_show_image (EggImageMenuItem *image_menu_item, - gboolean always_show); -gboolean egg_image_menu_item_get_always_show_image (EggImageMenuItem *image_menu_item); -void egg_image_menu_item_set_image (EggImageMenuItem *image_menu_item, - GtkWidget *image); -GtkWidget* egg_image_menu_item_get_image (EggImageMenuItem *image_menu_item); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (EggImageMenuItem, g_object_unref) - -G_END_DECLS - -#endif /* __EGG_IMAGE_MENUITEM_H__ */ diff --git a/ui/frob-combo-selector.c b/ui/frob-combo-selector.c deleted file mode 100644 index 8263b94..0000000 --- a/ui/frob-combo-selector.c +++ /dev/null @@ -1,97 +0,0 @@ - -#include "config.h" - -#include "gcr/gcr.h" - -#include <gtk/gtk.h> - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -static void -on_parser_parsed (GcrParser *parser, gpointer user_data) -{ - GcrSimpleCollection *collection = user_data; - GcrRenderer *renderer; - - renderer = gcr_renderer_create (gcr_parser_get_parsed_label (parser), - gcr_parser_get_parsed_attributes (parser)); - - if (renderer) { - gcr_simple_collection_add (collection, G_OBJECT (renderer)); - g_object_unref (renderer); - } -} - -static void -add_to_selector (GcrParser *parser, const gchar *path) -{ - GError *err = NULL; - guchar *data; - gsize n_data; - GBytes *bytes; - - if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) - g_error ("couldn't read file: %s", path); - - bytes = g_bytes_new_take (data, n_data); - if (!gcr_parser_parse_bytes (parser, bytes, &err)) - g_error ("couldn't parse data: %s", err->message); - - g_bytes_unref (bytes); -} - -int -main (int argc, char *argv[]) -{ - GcrCollection *collection; - GcrComboSelector *selector; - GtkDialog *dialog; - GcrParser *parser; - GObject *selected; - int i; - - gtk_init (&argc, &argv); - - dialog = GTK_DIALOG (gtk_dialog_new ()); - g_object_ref_sink (dialog); - - collection = gcr_simple_collection_new (); - selector = gcr_combo_selector_new (collection); - - gtk_widget_show (GTK_WIDGET (selector)); - gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (selector)); - - gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); - - parser = gcr_parser_new (); - g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), collection); - - if (argc == 1) { - add_to_selector (parser, SRCDIR "/ui/fixtures/ca-certificates.crt"); - } else { - for (i = 1; i < argc; ++i) - add_to_selector (parser, argv[i]); - } - - g_object_unref (parser); - g_object_unref (collection); - - gtk_dialog_run (dialog); - - selected = gcr_combo_selector_get_selected (selector); - if (selected == NULL) { - g_print ("nothing selected\n"); - } else { - gchar *label; - g_object_get (selected, "label", &label, NULL); - g_print ("selected: %s\n", label); - } - - gtk_widget_destroy (GTK_WIDGET (dialog)); - g_object_unref (dialog); - - return 0; -} diff --git a/ui/frob-gnupg-selector.c b/ui/frob-gnupg-selector.c deleted file mode 100644 index 41b1977..0000000 --- a/ui/frob-gnupg-selector.c +++ /dev/null @@ -1,94 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr.h" -#include "gcr/gcr-gnupg-collection.h" -#include "gcr/gcr-gnupg-key.h" - -#include "ui/gcr-live-search.h" -#include "ui/gcr-list-selector-private.h" - -#include <gtk/gtk.h> - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -static void -on_collection_loaded (GObject *source, GAsyncResult *result, gpointer unused) -{ - GError *error = NULL; - - _gcr_gnupg_collection_load_finish (GCR_GNUPG_COLLECTION (source), result, &error); - if (error) { - g_warning ("collection load failed: %s", error->message); - g_clear_error (&error); - } -} - -int -main (int argc, char *argv[]) -{ - GcrCollection *collection; - GcrListSelector *selector; - GtkWidget *scroll; - GtkDialog *dialog; - GtkWidget *search; - GtkBox *box; - - gtk_init (&argc, &argv); - - dialog = GTK_DIALOG (gtk_dialog_new ()); - g_object_ref_sink (dialog); - - collection = _gcr_gnupg_collection_new (NULL); - selector = gcr_list_selector_new (collection); - search = _gcr_live_search_new (GTK_WIDGET (selector)); - _gcr_list_selector_set_live_search (selector, GCR_LIVE_SEARCH (search)); - - scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (selector)); - - box = GTK_BOX (gtk_dialog_get_content_area (dialog)); - gtk_box_pack_start (box, GTK_WIDGET (scroll), TRUE, TRUE, 0); - gtk_box_pack_end (box, search, FALSE, TRUE, 0); - - gtk_widget_show (GTK_WIDGET (selector)); - gtk_widget_show (scroll); - - _gcr_gnupg_collection_load_async (GCR_GNUPG_COLLECTION (collection), NULL, - on_collection_loaded, NULL); - - gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); - - g_object_unref (collection); - - gtk_dialog_run (dialog); - gtk_widget_destroy (GTK_WIDGET (dialog)); - g_object_unref (dialog); - - return 0; -} diff --git a/ui/frob-import-button.c b/ui/frob-import-button.c deleted file mode 100644 index d876d81..0000000 --- a/ui/frob-import-button.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (C) 2014 Stef Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@redhat.com> - */ - -#include "config.h" - -#include "ui/gcr-ui.h" - -#include "gcr/gcr-importer.h" - -#include <gtk/gtk.h> - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -typedef GObject MockImporter; -typedef GObjectClass MockImporterClass; - -enum { - PROP_0, - PROP_LABEL, - PROP_ICON, - PROP_URI, - PROP_INTERACTION -}; - -GType mock_importer_get_type (void) G_GNUC_CONST; - -static GList * -mock_importer_create_for_parsed (GcrParsed *parsed) -{ - GcrImporter *self; - GIcon *icon; - - icon = g_themed_icon_new ("dialog-warning"); - self = g_object_new (mock_importer_get_type (), - "label", gcr_parsed_get_label (parsed), - "icon", icon, - NULL); - g_object_unref (icon); - return g_list_append (NULL, self); -} - -static gboolean -mock_importer_queue_for_parsed (GcrImporter *importer, - GcrParsed *parsed) -{ - return TRUE; -} - -static void -mock_importer_import_async (GcrImporter *importer, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - - task = g_task_new (importer, cancellable, callback, user_data); - g_task_set_source_tag (task, mock_importer_import_async); - - g_printerr ("Import %p\n", importer); - g_task_return_boolean (task, TRUE); - g_clear_object (&task); -} - - -static gboolean -mock_importer_import_finish (GcrImporter *importer, - GAsyncResult *result, - GError **error) -{ - return g_task_propagate_boolean (G_TASK (result), error); -} - - -static void -mock_importer_iface (GcrImporterIface *iface) -{ - iface->create_for_parsed = mock_importer_create_for_parsed; - iface->queue_for_parsed = mock_importer_queue_for_parsed; - iface->import_async = mock_importer_import_async; - iface->import_finish = mock_importer_import_finish; -} - -G_DEFINE_TYPE_WITH_CODE (MockImporter, mock_importer, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORTER, mock_importer_iface); -); - -static void -value_free (gpointer value) -{ - g_boxed_free (G_TYPE_VALUE, value); -} - -static void -mock_importer_init (MockImporter *self) -{ - -} - -static void -mock_importer_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - g_object_set_data_full (obj, pspec->name, g_boxed_copy (G_TYPE_VALUE, value), value_free); -} - -static void -mock_importer_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GValue *val = g_object_get_data (obj, pspec->name); - g_return_if_fail (val != NULL); - g_value_copy (val, value); -} - -static void -mock_importer_class_init (MockImporterClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->set_property = mock_importer_set_property; - gobject_class->get_property = mock_importer_get_property; - - g_object_class_install_property (gobject_class, PROP_LABEL, - g_param_spec_string ("label", "", "", - NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_ICON, - g_param_spec_object ("icon", "", "", - G_TYPE_ICON, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - - g_object_class_override_property (gobject_class, PROP_URI, "uri"); - g_object_class_override_property (gobject_class, PROP_INTERACTION, "interaction"); -} - -typedef MockImporter MockImporterTwo; -typedef MockImporterClass MockImporterTwoClass; - -GType mock_importer_two_get_type (void) G_GNUC_CONST; - -G_DEFINE_TYPE (MockImporterTwo, mock_importer_two, mock_importer_get_type ()); - -static void -mock_importer_two_init (MockImporterTwo *self) -{ - -} - -static void -mock_importer_two_class_init (MockImporterTwoClass *klass) -{ - -} - - -static void -on_parser_parsed (GcrParser *parser, - gpointer user_data) -{ - gcr_import_button_add_parsed (user_data, - gcr_parser_get_parsed (parser)); -} - -static void -parse_file (GcrParser *parser, - const gchar *path) -{ - GError *err = NULL; - guchar *data; - gsize n_data; - GBytes *bytes; - - if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) - g_error ("couldn't read file: %s", path); - - bytes = g_bytes_new_take (data, n_data); - if (!gcr_parser_parse_bytes (parser, bytes, &err)) - g_error ("couldn't parse data: %s", err->message); - - g_bytes_unref (bytes); -} - -int -main (int argc, char *argv[]) -{ - GtkDialog *dialog; - GcrParser *parser; - GtkWidget *button; - int i; - - gtk_init (&argc, &argv); - - gcr_importer_register (mock_importer_get_type (), gck_attributes_new (0)); - gcr_importer_register (mock_importer_two_get_type (), gck_attributes_new (0)); - - dialog = GTK_DIALOG (gtk_dialog_new ()); - g_object_ref_sink (dialog); - - button = GTK_WIDGET (gcr_import_button_new ("Import Button")); - gtk_widget_show (button); - - gtk_widget_set_halign (button, 0.5); - gtk_widget_set_valign (button, 0.5); - - gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), button); - - gtk_window_set_default_size (GTK_WINDOW (dialog), 200, 300); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); - - parser = gcr_parser_new (); - g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), button); - - if (argc == 1) { - parse_file (parser, SRCDIR "/ui/fixtures/ca-certificates.crt"); - } else { - for (i = 1; i < argc; ++i) - parse_file (parser, argv[i]); - } - - g_object_unref (parser); - - gtk_dialog_run (dialog); - - gtk_widget_destroy (GTK_WIDGET (dialog)); - g_object_unref (dialog); - - return 0; -} diff --git a/ui/frob-key.c b/ui/frob-key.c deleted file mode 100644 index 97d216b..0000000 --- a/ui/frob-key.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr.h" - -#include <gtk/gtk.h> - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -static void -on_parser_parsed (GcrParser *parser, gpointer unused) -{ - GcrKeyWidget *details; - GtkDialog *dialog; - - dialog = GTK_DIALOG (gtk_dialog_new ()); - g_object_ref_sink (dialog); - - details = gcr_key_widget_new (gcr_parser_get_parsed_attributes (parser)); - gtk_widget_show (GTK_WIDGET (details)); - gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (details)); - - gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); - gtk_dialog_run (dialog); - - g_object_unref (dialog); - g_object_unref (details); -} - -static void -test_key (const gchar *path) -{ - GcrParser *parser; - GError *err = NULL; - GBytes *bytes; - guchar *data; - gsize n_data; - - if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) - g_error ("couldn't read file: %s", path); - - parser = gcr_parser_new (); - g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), NULL); - bytes = g_bytes_new_take (data, n_data); - if (!gcr_parser_parse_bytes (parser, bytes, &err)) - g_error ("couldn't parse data: %s", err->message); - - g_object_unref (parser); - g_bytes_unref (bytes); -} - -int -main(int argc, char *argv[]) -{ - gtk_init (&argc, &argv); - g_set_prgname ("frob-key"); - - if (argc > 1) - test_key (argv[1]); - else - test_key (SRCDIR "/ui/fixtures/pem-dsa-1024.key"); - - return 0; -} diff --git a/ui/frob-prompt.c b/ui/frob-prompt.c deleted file mode 100644 index 20f5482..0000000 --- a/ui/frob-prompt.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr.h" -#include "gcr/gcr-base.h" - -#include <gtk/gtk.h> -#ifdef GDK_WINDOWING_X11 -#include <gdk/gdkx.h> -#endif -#ifdef GDK_WINDOWING_WAYLAND -#include <gdk/gdkwayland.h> -#endif - -static const gchar *file_name = NULL; -static gchar *prompt_type = NULL; -static gint prompt_delay = 0; -static gboolean prompt_window = FALSE; - -static gboolean -on_delay_timeout (gpointer data) -{ - GMainLoop *loop = data; - g_main_loop_quit (loop); - return FALSE; -} - -#ifdef GDK_WINDOWING_X11 -static void -set_caller_window_x11 (GcrPrompt *prompt, GdkWindow *window) -{ - gchar *caller_id = NULL; - - if (!GDK_IS_X11_WINDOW (window)) - return; - - caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (window)); - gcr_prompt_set_caller_window (prompt, caller_id); - g_free (caller_id); -} -#endif - -#ifdef GDK_WINDOWING_WAYLAND -static void -on_window_wl_export_handle (GdkWindow *window, - const char *handle, - gpointer user_data) -{ - GcrPrompt *prompt = GCR_PROMPT (user_data); - - g_return_if_fail (handle); - - gcr_prompt_set_caller_window (prompt, handle); -} - -static void -set_caller_window_wl (GcrPrompt *prompt, GdkWindow *window) -{ - if (!GDK_IS_WAYLAND_WINDOW (window)) - return; - - if (!gdk_wayland_window_export_handle (window, on_window_wl_export_handle, prompt, NULL)) - g_warning ("Couldn't export Wayland window handle"); -} -#endif - -static void -prompt_perform (GtkWidget *parent) -{ - GKeyFile *file; - GError *error = NULL; - gchar **groups, **keys; - GValue value = { 0, }; - GParamSpec *spec; - GcrPrompt *prompt; - const gchar *key; - const gchar *password; - GcrPromptReply reply; - gboolean cont = TRUE; - GMainLoop *loop; - gchar *type; - gchar *choice; - guint i, j; - - file = g_key_file_new (); - if (!g_key_file_load_from_file (file, file_name, G_KEY_FILE_NONE, &error)) - g_error ("couldn't load prompt info: %s", error->message); - - if (!prompt_type || g_str_equal (prompt_type, "dialog")) - prompt = g_object_new (GCR_TYPE_PROMPT_DIALOG, NULL); - else if (g_str_equal (prompt_type, "system")) - prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.SystemPrompter", 5, NULL, &error); - else if (g_str_equal (prompt_type, "private")) - prompt = gcr_system_prompt_open_for_prompter ("org.gnome.keyring.PrivatePrompter", 5, NULL, &error); - else - g_error ("invalid type: %s", prompt_type); - - if (error != NULL) - g_error ("couldn't create prompt: %s", error->message); - - if (parent) { - GdkWindow *window; - - window = gtk_widget_get_window (parent); -#ifdef GDK_WINDOWING_X11 - set_caller_window_x11 (prompt, window); -#endif -#ifdef GDK_WINDOWING_WAYLAND - set_caller_window_wl (prompt, window); -#endif - } - - loop = g_main_loop_new (NULL, FALSE); - groups = g_key_file_get_groups (file, NULL); - for (i = 0; cont && groups[i] != NULL; i++) { - - if (i != 0) { - g_timeout_add_seconds (prompt_delay, on_delay_timeout, loop); - g_main_loop_run (loop); - } - - keys = g_key_file_get_keys (file, groups[i], NULL, NULL); - for (j = 0; keys[j] != NULL; j++) { - key = keys[j]; - if (g_str_equal (key, "type")) - continue; - spec = g_object_class_find_property (G_OBJECT_GET_CLASS (prompt), key); - if (spec == NULL) - g_error ("couldn't find property %s on prompt %s", - key, G_OBJECT_TYPE_NAME (prompt)); - g_value_init (&value, spec->value_type); - switch (spec->value_type) { - case G_TYPE_STRING: - g_value_take_string (&value, g_key_file_get_string (file, groups[i], key, NULL)); - break; - case G_TYPE_INT: - g_value_set_int (&value, g_key_file_get_integer (file, groups[i], key, NULL)); - break; - case G_TYPE_BOOLEAN: - g_value_set_boolean (&value, g_key_file_get_boolean (file, groups[i], key, NULL)); - break; - default: - g_error ("unsupported type %s for property %s", - g_type_name (spec->value_type), key); - break; - } - - g_object_set_property (G_OBJECT (prompt), key, &value); - g_value_unset (&value); - } - - g_strfreev (keys); - - type = g_key_file_get_value (file, groups[i], "type", NULL); - if (g_strcmp0 (type, "password") == 0) { - password = gcr_prompt_password_run (prompt, NULL, &error); - if (error != NULL) - g_error ("couldn't prompt for password: %s", error->message); - g_print ("prompt password: %s\n", password); - g_print ("password strength: %d\n", gcr_prompt_get_password_strength (prompt)); - cont = (password != NULL); - } else if (g_strcmp0 (type, "confirm") == 0) { - reply = gcr_prompt_confirm_run (prompt, NULL, &error); - if (error != NULL) - g_error ("couldn't prompt for confirm: %s", error->message); - g_print ("prompt confirm: %d\n", reply); - cont = (reply != GCR_PROMPT_REPLY_CANCEL); - } else { - g_error ("unsupported prompt type: %s", type); - } - g_free (type); - - choice = gcr_prompt_get_choice_label (prompt); - if (choice) - g_print ("choice chosen: %s", gcr_prompt_get_choice_chosen (prompt) ? "true" : "false"); - g_free (choice); - g_print ("\n"); - } - - g_main_loop_unref (loop); - g_object_unref (prompt); - g_strfreev (groups); - g_key_file_free (file); - -} - -static void -on_prompt_clicked (GtkToolButton *button, - gpointer user_data) -{ - prompt_perform (user_data); -} - -static gboolean -on_window_delete (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - gtk_main_quit (); - return FALSE; -} - -static GOptionEntry option_entries[] = { - { "type", 'c', 0, G_OPTION_ARG_STRING, &prompt_type, - "'system', 'private' or 'dialog'", "type" }, - { "delay", 'd', 0, G_OPTION_ARG_INT, &prompt_delay, - "delay in seconds between prompts", "delay" }, - { "window", 'w', 0, G_OPTION_ARG_NONE, &prompt_window, - "prompt with a parent window", NULL }, - { NULL } -}; - -int -main (int argc, char *argv[]) -{ - GOptionContext *context; - GtkWidget *window; - GtkToolbar *toolbar; - GtkToolItem *item; - GError *error = NULL; - - g_set_prgname ("frob-prompt"); - - context = g_option_context_new (""); - g_option_context_add_main_entries (context, option_entries, GETTEXT_PACKAGE); - g_option_context_add_group (context, gtk_get_option_group (TRUE)); - - if (!g_option_context_parse (context, &argc, &argv, &error)) - g_error ("%s", error->message); - - g_option_context_free (context); - - if (argc < 2) - g_error ("specify file"); - file_name = argv[1]; - - if (prompt_window) { - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - g_signal_connect (window, "delete-event", G_CALLBACK (on_window_delete), NULL); - - toolbar = GTK_TOOLBAR (gtk_toolbar_new ()); - gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_TEXT); - item = gtk_tool_button_new (NULL, "Prompt"); - g_signal_connect (item, "clicked", G_CALLBACK (on_prompt_clicked), window); - gtk_toolbar_insert (toolbar, item, 0); - gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (toolbar)); - - gtk_window_set_default_size (GTK_WINDOW (window), 400, 80); - gtk_widget_show_all (window); - - gtk_main (); - - } else { - prompt_perform (NULL); - } - - g_free (prompt_type); - return 0; -} diff --git a/ui/frob-request.c b/ui/frob-request.c deleted file mode 100644 index 1d2f946..0000000 --- a/ui/frob-request.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr.h" - -#include "ui/gcr-certificate-request-renderer.h" - -#include <gtk/gtk.h> - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -static void -on_parser_parsed (GcrParser *parser, - gpointer user_data) -{ - GcrViewer *viewer; - GcrRenderer *renderer; - GtkDialog *dialog = GTK_DIALOG (user_data); - - viewer = gcr_viewer_new_scrolled (); - renderer = _gcr_certificate_request_renderer_new_for_attributes (gcr_parser_get_parsed_label (parser), - gcr_parser_get_parsed_attributes (parser)); - gcr_viewer_add_renderer (viewer, renderer); - g_object_unref (renderer); - gtk_widget_show (GTK_WIDGET (viewer)); - gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (viewer)); - - gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); -} - -static void -test_request (const gchar *path) -{ - GcrParser *parser; - GError *err = NULL; - guchar *data; - gsize n_data; - GtkWidget *dialog; - GBytes *bytes; - - if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) - g_error ("couldn't read file: %s", path); - - dialog = gtk_dialog_new (); - g_object_ref_sink (dialog); - - parser = gcr_parser_new (); - g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), dialog); - bytes = g_bytes_new_take (data, n_data); - if (!gcr_parser_parse_data (parser, data, n_data, &err)) - g_error ("couldn't parse data: %s", err->message); - - g_object_unref (parser); - g_bytes_unref (bytes); - - gtk_widget_show (dialog); - g_signal_connect (dialog, "delete-event", G_CALLBACK (gtk_main_quit), NULL); - gtk_main (); - - g_object_unref (dialog); -} - -int -main(int argc, char *argv[]) -{ - gtk_init (&argc, &argv); - g_set_prgname ("frob-request"); - - if (argc > 1) - test_request (argv[1]); - else - test_request (SRCDIR "/ui/fixtures/der-rsa-2048.p10"); - - return 0; -} diff --git a/ui/frob-system-prompt.c b/ui/frob-system-prompt.c deleted file mode 100644 index 330f8bd..0000000 --- a/ui/frob-system-prompt.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr.h" - -#include <gtk/gtk.h> -#ifdef GDK_WINDOWING_X11 -#include <gdk/gdkx.h> -#endif -#ifdef GDK_WINDOWING_WAYLAND -#include <gdk/gdkwayland.h> -#endif - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -static void -run_prompt (GcrPrompt *prompt) -{ - const char *password; - GError *error = NULL; - - password = gcr_prompt_password_run (GCR_PROMPT (prompt), NULL, &error); - if (error != NULL) { - g_warning ("couldn't prompt for password: %s", error->message); - g_error_free (error); - g_object_unref (prompt); - return; - } - - g_print ("password: %s\n", password); - g_object_unref (prompt); -} - -static void -on_gdk_wl_window_exported (GdkWindow *window, - const char *handle, - gpointer user_data) -{ - GcrPrompt *prompt = GCR_PROMPT (user_data); - - g_return_if_fail (handle); - - gcr_prompt_set_caller_window (prompt, handle); - run_prompt (prompt); -} - -static void -on_prompt_clicked (GtkToolButton *button, - gpointer user_data) -{ - GcrPrompt *prompt; - GError *error = NULL; - GtkWidget *parent = user_data; - GdkWindow *window; - gchar *caller_id; - - prompt = gcr_system_prompt_open (-1, NULL, &error); - if (error != NULL) { - g_warning ("couldn't open prompt: %s", error->message); - g_error_free (error); - return; - } - - gcr_prompt_set_title (GCR_PROMPT (prompt), "This is the title"); - gcr_prompt_set_message (GCR_PROMPT (prompt), "This is the message"); - gcr_prompt_set_description (GCR_PROMPT (prompt), "This is the description"); - - window = gtk_widget_get_window (parent); -#ifdef GDK_WINDOWING_X11 - if (GDK_IS_X11_WINDOW (window)) { - caller_id = g_strdup_printf ("%lu", (gulong)GDK_WINDOW_XID (window)); - gcr_prompt_set_caller_window (prompt, caller_id); - g_free (caller_id); - } -#endif -#ifdef GDK_WINDOWING_WAYLAND - if (GDK_IS_WAYLAND_WINDOW (window)) { - if (!gdk_wayland_window_export_handle (window, on_gdk_wl_window_exported, prompt, NULL)) { - g_warning ("Couldn't export Wayland window handle"); - } else { - return; /* Don't run the prompt before the async method finished */ - } - } -#endif - - run_prompt (prompt); -} - -static gboolean -on_window_delete (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - gtk_main_quit (); - return FALSE; -} - -int -main (int argc, char *argv[]) -{ - GtkWidget *window; - GtkToolbar *toolbar; - GtkToolItem *item; - - gtk_init (&argc, &argv); - - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - g_signal_connect (window, "delete-event", G_CALLBACK (on_window_delete), NULL); - - toolbar = GTK_TOOLBAR (gtk_toolbar_new ()); - gtk_toolbar_set_style (toolbar, GTK_TOOLBAR_TEXT); - item = gtk_tool_button_new (NULL, "Prompt"); - g_signal_connect (item, "clicked", G_CALLBACK (on_prompt_clicked), window); - gtk_toolbar_insert (toolbar, item, 0); - gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (toolbar)); - - gtk_window_set_default_size (GTK_WINDOW (window), 400, 80); - gtk_widget_show_all (window); - - gtk_main (); - - return 0; -} diff --git a/ui/frob-tree-selector.c b/ui/frob-tree-selector.c deleted file mode 100644 index f2a7ef8..0000000 --- a/ui/frob-tree-selector.c +++ /dev/null @@ -1,211 +0,0 @@ - -#include "config.h" - -#include "gcr/gcr.h" - -#include <gtk/gtk.h> - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -#define TEST_TYPE_COLLECTION (test_collection_get_type ()) -#define TEST_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_TYPE_COLLECTION, TestCollection)) -#define TEST_IS_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TEST_TYPE_COLLECTION)) - -typedef struct _TestCollection TestCollection; -typedef struct _TestCollectionClass TestCollectionClass; -typedef struct _TestCollectionPrivate TestCollectionPrivate; - -struct _TestCollection { - GcrSimpleCollection parent; - gchar *label; -}; - -struct _TestCollectionClass { - GcrSimpleCollectionClass parent_class; -}; - -GType test_collection_get_type (void) G_GNUC_CONST; - -enum { - PROP_0, - PROP_LABEL, -}; - -G_DEFINE_TYPE (TestCollection, test_collection, GCR_TYPE_SIMPLE_COLLECTION); - -static GHashTable *all_collections = NULL; - -static void -test_collection_init (TestCollection *self) -{ - -} - -static void -test_collection_finalize (GObject *obj) -{ - TestCollection *self = TEST_COLLECTION (obj); - g_free (self->label); - g_hash_table_remove (all_collections, self); - G_OBJECT_CLASS (test_collection_parent_class)->finalize (obj); -} - -static void -test_collection_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - TestCollection *self = TEST_COLLECTION (obj); - switch (prop_id) { - case PROP_LABEL: - g_value_set_string (value, self->label); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -test_collection_class_init (TestCollectionClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gobject_class->get_property = test_collection_get_property; - gobject_class->finalize = test_collection_finalize; - - g_object_class_install_property (gobject_class, PROP_LABEL, - g_param_spec_string ("label", "label", "label", NULL, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); -} - -static GcrSimpleCollection * -test_collection_instance (const gchar *label) -{ - TestCollection *collection = NULL; - - g_assert (label); - - if (!all_collections) { - all_collections = g_hash_table_new (g_str_hash, g_str_equal); - } else { - collection = g_hash_table_lookup (all_collections, label); - if (collection != NULL) - return GCR_SIMPLE_COLLECTION (g_object_ref (collection)); - } - - collection = g_object_new (TEST_TYPE_COLLECTION, NULL); - collection->label = g_strdup (label); - g_hash_table_insert (all_collections, collection->label, collection); - return GCR_SIMPLE_COLLECTION (collection); -} - -static void -on_parser_parsed (GcrParser *parser, gpointer user_data) -{ - GcrSimpleCollection *collection = user_data; - GcrSimpleCollection *testcol; - GcrRenderer *renderer; - gchar *group; - - renderer = gcr_renderer_create (gcr_parser_get_parsed_label (parser), - gcr_parser_get_parsed_attributes (parser)); - if (renderer == NULL) - return; - - if (GCR_IS_CERTIFICATE (renderer)) - group = gcr_certificate_get_subject_part (GCR_CERTIFICATE (renderer), "O"); - else - group = g_strdup (G_OBJECT_TYPE_NAME (renderer)); - - - testcol = test_collection_instance (group); - if (!gcr_collection_contains (GCR_COLLECTION (collection), G_OBJECT (testcol))) - gcr_simple_collection_add (collection, G_OBJECT (testcol)); - - gcr_simple_collection_add (GCR_SIMPLE_COLLECTION (testcol), G_OBJECT (renderer)); - g_object_unref (renderer); - g_object_unref (testcol); - g_free (group); -} - -static void -add_to_selector (GcrParser *parser, const gchar *path) -{ - GError *err = NULL; - guchar *data; - gsize n_data; - GBytes *bytes; - - if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) - g_error ("couldn't read file: %s", path); - - bytes = g_bytes_new_take (data, n_data); - if (!gcr_parser_parse_bytes (parser, bytes, &err)) - g_error ("couldn't parse data: %s", err->message); - - g_bytes_unref (bytes); -} - -int -main (int argc, char *argv[]) -{ - GcrCollection *collection; - GcrTreeSelector *selector; - GtkDialog *dialog; - GcrParser *parser; - GtkWidget *scroll; - GList *selected, *l; - int i; - - gtk_init (&argc, &argv); - - dialog = GTK_DIALOG (gtk_dialog_new ()); - g_object_ref_sink (dialog); - - collection = gcr_simple_collection_new (); - selector = gcr_tree_selector_new (collection, GCR_CERTIFICATE_COLUMNS); - - scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scroll), GTK_SHADOW_ETCHED_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET (selector)); - gtk_widget_show_all (scroll); - - gtk_widget_show (GTK_WIDGET (selector)); - gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (scroll), TRUE, TRUE, 0); - - gtk_window_set_default_size (GTK_WINDOW (dialog), 550, 400); - gtk_container_set_border_width (GTK_CONTAINER (dialog), 20); - - parser = gcr_parser_new (); - g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), collection); - - if (argc == 1) { - add_to_selector (parser, SRCDIR "/ui/fixtures/ca-certificates.crt"); - } else { - for (i = 1; i < argc; ++i) - add_to_selector (parser, argv[i]); - } - - g_object_unref (parser); - g_object_unref (collection); - - gtk_dialog_run (dialog); - - selected = gcr_tree_selector_get_selected (selector); - for (l = selected; l; l = g_list_next (l)) { - gchar *label; - g_object_get (l->data, "label", &label, NULL); - g_print ("selected: %s\n", label); - g_free (label); - } - g_list_free (selected); - - gtk_widget_destroy (GTK_WIDGET (dialog)); - g_object_unref (dialog); - - return 0; -} diff --git a/ui/frob-unlock-options.c b/ui/frob-unlock-options.c deleted file mode 100644 index b9e5b09..0000000 --- a/ui/frob-unlock-options.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr.h" - -#include <gtk/gtk.h> - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -static void -test_unlock_options (void) -{ - GcrUnlockOptionsWidget *unlock; - GtkDialog *dialog; - - dialog = GTK_DIALOG (gtk_dialog_new ()); - g_object_ref_sink (dialog); - - unlock = GCR_UNLOCK_OPTIONS_WIDGET (gcr_unlock_options_widget_new ()); - gtk_widget_show (GTK_WIDGET (unlock)); - gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (dialog)), GTK_WIDGET (unlock)); - - gcr_unlock_options_widget_set_sensitive (unlock, GCR_UNLOCK_OPTION_IDLE, FALSE, - "This is a test of the tooltip."); - gcr_unlock_options_widget_set_sensitive (unlock, GCR_UNLOCK_OPTION_ALWAYS, TRUE, NULL); - gcr_unlock_options_widget_set_label (unlock, GCR_UNLOCK_OPTION_IDLE, "Disabled label test"); - gcr_unlock_options_widget_set_ttl (unlock, 80); - gcr_unlock_options_widget_set_choice (unlock, GCR_UNLOCK_OPTION_ALWAYS); - - gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 400); - gtk_dialog_run (dialog); - - g_printerr ("choice: %s\n", - gcr_unlock_options_widget_get_choice (unlock)); - - g_printerr ("ttl: %u\n", - gcr_unlock_options_widget_get_ttl (unlock)); - - g_printerr ("idle sensitive: %s\n", - gcr_unlock_options_widget_get_sensitive (unlock, GCR_UNLOCK_OPTION_IDLE) ? "T" : "F"); - - g_printerr ("always sensitive: %s\n", - gcr_unlock_options_widget_get_sensitive (unlock, GCR_UNLOCK_OPTION_ALWAYS) ? "T" : "F"); - - g_printerr ("label: %s\n", - gcr_unlock_options_widget_get_label (unlock, GCR_UNLOCK_OPTION_ALWAYS)); - - g_object_unref (dialog); -} - -int -main(int argc, char *argv[]) -{ - gtk_init (&argc, &argv); - g_set_prgname ("frob-unlock-options"); - - test_unlock_options (); - - return 0; -} diff --git a/ui/frob-unlock.c b/ui/frob-unlock.c deleted file mode 100644 index 4919765..0000000 --- a/ui/frob-unlock.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr.h" - -#include "ui/gcr-unlock-renderer.h" -#include "ui/gcr-viewer-window.h" - -#include <gtk/gtk.h> - -#include <unistd.h> -#include <string.h> -#include <errno.h> - -static gboolean -delete_event(GtkWidget *widget, - GdkEvent *event, - gpointer data) -{ - gtk_main_quit (); - return FALSE; -} - -static void -on_parser_parsed (GcrParser *parser, gpointer unused) -{ - -} - -static void -on_unlock_clicked (GcrUnlockRenderer *renderer, - GcrParser *parser) -{ - const gchar *password; - password = _gcr_unlock_renderer_get_password (renderer); - gcr_parser_add_password (parser, password); - gtk_main_quit (); -} - -static void -on_parser_authenticate (GcrParser *parser, - gint count, - gpointer user_data) -{ - GcrUnlockRenderer *renderer; - GtkWindow *window; - - window = GTK_WINDOW (gcr_viewer_window_new ()); - g_object_ref_sink (window); - - renderer = _gcr_unlock_renderer_new_for_parsed (parser); - g_signal_connect (renderer, "unlock-clicked", G_CALLBACK (on_unlock_clicked), parser); - gcr_viewer_add_renderer (gcr_viewer_window_get_viewer (GCR_VIEWER_WINDOW (window)), GCR_RENDERER (renderer)); - g_object_unref (renderer); - - gtk_window_set_default_size (window, 550, 400); - gtk_container_set_border_width (GTK_CONTAINER (window), 20); - - g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), NULL); - gtk_widget_show (GTK_WIDGET (window)); - - gtk_main (); - - g_object_unref (window); -} - -static void -test_key (const gchar *path) -{ - GcrParser *parser; - GError *err = NULL; - guchar *data; - gsize n_data; - GBytes *bytes; - - if (!g_file_get_contents (path, (gchar**)&data, &n_data, NULL)) - g_error ("couldn't read file: %s", path); - - parser = gcr_parser_new (); - g_signal_connect (parser, "parsed", G_CALLBACK (on_parser_parsed), NULL); - g_signal_connect (parser, "authenticate", G_CALLBACK (on_parser_authenticate), NULL); - bytes = g_bytes_new_take (data, n_data); - if (!gcr_parser_parse_bytes (parser, bytes, &err)) - g_error ("couldn't parse data: %s", err->message); - - g_object_unref (parser); - g_bytes_unref (bytes); -} - -int -main(int argc, char *argv[]) -{ - gtk_init (&argc, &argv); - g_set_prgname ("frob-unlock"); - - if (argc > 1) { - test_key (argv[1]); - } else { - test_key (SRCDIR "/ui/fixtures/email.p12"); - } - - return 0; -} diff --git a/ui/gcr-certificate-basics-widget.c b/ui/gcr-certificate-basics-widget.c deleted file mode 100644 index 6646134..0000000 --- a/ui/gcr-certificate-basics-widget.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" -#include "gcr-certificate-basics-widget.h" - -#ifndef GCR_DISABLE_DEPRECATED - -/* These are all stubs for GcrCertificateWidget */ - -GType -gcr_certificate_basics_widget_get_type (void) -{ - return gcr_certificate_widget_get_type (); -} - -/** - * gcr_certificate_basics_widget_new: (skip) - * - * Create new certificate viewer. - * - * Deprecated: Since 2.30 - * - * Returns: (transfer full) (type GcrUi.CertificateWidget): a new certificate widget - */ -GcrCertificateBasicsWidget * -gcr_certificate_basics_widget_new (GcrCertificate *cert) -{ - return gcr_certificate_widget_new (cert); -} - -/** - * gcr_certificate_basics_widget_get_certificate: (skip) - * - * Get certificate on viewer. - * - * Deprecated: Since 2.30 - * - * Returns: (transfer none): the certificate - */ -GcrCertificate * -gcr_certificate_basics_widget_get_certificate (GcrCertificateBasicsWidget *basics) -{ - return gcr_certificate_widget_get_certificate (basics); -} - -/** - * gcr_certificate_basics_widget_set_certificate: (skip) - * @basics: the certificate widget - * @cert: the certificate - * - * Set certificate on viewer. - * - * Deprecated: Since 2.30 - */ -void -gcr_certificate_basics_widget_set_certificate (GcrCertificateBasicsWidget *basics, - GcrCertificate *cert) -{ - return gcr_certificate_widget_set_certificate (basics, cert); -} - -#endif /* GCR_DISABLE_DEPRECATED */ diff --git a/ui/gcr-certificate-basics-widget.h b/ui/gcr-certificate-basics-widget.h deleted file mode 100644 index 9715ee9..0000000 --- a/ui/gcr-certificate-basics-widget.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2008 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_CERTIFICATE_BASICS_WIDGET_H__ -#define __GCR_CERTIFICATE_BASICS_WIDGET_H__ - -/* - * GcrCertificateBasicsWidget has been replaced with GcrCertificateWidget. - * These functions are stubs for GcrCertificateWidget. - */ - -#ifndef GCR_DISABLE_DEPRECATED - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-certificate.h" -#include "gcr/gcr-types.h" - -#include "gcr-certificate-widget.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_CERTIFICATE_BASICS_WIDGET (gcr_certificate_basics_widget_get_type ()) -#define GCR_CERTIFICATE_BASICS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidget)) -#define GCR_CERTIFICATE_BASICS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidgetClass)) -#define GCR_IS_CERTIFICATE_BASICS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET)) -#define GCR_IS_CERTIFICATE_BASICS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_BASICS_WIDGET)) -#define GCR_CERTIFICATE_BASICS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_BASICS_WIDGET, GcrCertificateBasicsWidgetClass)) - -typedef GcrCertificateWidget GcrCertificateBasicsWidget; -typedef GcrCertificateWidgetClass GcrCertificateBasicsWidgetClass; - -G_DEPRECATED_FOR(gcr_certificate_widget_get_type) -GType gcr_certificate_basics_widget_get_type (void); - -G_DEPRECATED_FOR(gcr_certificate_widget_new) -GcrCertificateBasicsWidget* gcr_certificate_basics_widget_new (GcrCertificate *cert); - -G_DEPRECATED_FOR(gcr_certificate_widget_get_certificate) -GcrCertificate* gcr_certificate_basics_widget_get_certificate (GcrCertificateBasicsWidget *basics); - -G_DEPRECATED_FOR(gcr_certificate_widget_set_certificate) -void gcr_certificate_basics_widget_set_certificate (GcrCertificateBasicsWidget *basics, - GcrCertificate *cert); - -G_END_DECLS - -#endif /* GCR_DISABLE_DEPRECATED */ - -#endif /* __GCR_CERTIFICATE_BASICS_WIDGET_H__ */ diff --git a/ui/gcr-certificate-details-widget.c b/ui/gcr-certificate-details-widget.c deleted file mode 100644 index 79e215c..0000000 --- a/ui/gcr-certificate-details-widget.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" -#include "gcr-certificate-details-widget.h" - -#ifndef GCR_DISABLE_DEPRECATED - -/* These are all stubs for GcrCertificateWidget */ - -GType -gcr_certificate_details_widget_get_type (void) -{ - return gcr_certificate_widget_get_type (); -} - -/** - * gcr_certificate_details_widget_new: (skip) - * - * Create a new certificate viewer. - * - * Deprecated: Since 2.30 - * - * Returns: (transfer full) (type GcrUi.CertificateWidget): a new certificate widget - */ -GcrCertificateDetailsWidget * -gcr_certificate_details_widget_new (GcrCertificate *cert) -{ - return gcr_certificate_widget_new (cert); -} - -/** - * gcr_certificate_details_widget_get_certificate: (skip) - * - * Get certificate displayed in viewer. - * - * Deprecated: Since 2.30 - * - * Returns: (transfer none): the certificate - */ -GcrCertificate* -gcr_certificate_details_widget_get_certificate (GcrCertificateDetailsWidget *details) -{ - return gcr_certificate_widget_get_certificate (details); -} - -/** - * gcr_certificate_details_widget_set_certificate: (skip) - * @details: the certificate widget - * @cert: the certificate - * - * Set certificate displayed in viewer. - * - * Deprecated: Since 2.30 - */ -void -gcr_certificate_details_widget_set_certificate (GcrCertificateDetailsWidget *details, - GcrCertificate *cert) -{ - return gcr_certificate_widget_set_certificate (details, cert); -} - -#endif /* GCR_DISABLE_DEPRECATED */ diff --git a/ui/gcr-certificate-details-widget.h b/ui/gcr-certificate-details-widget.h deleted file mode 100644 index 2a1de50..0000000 --- a/ui/gcr-certificate-details-widget.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2008 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_CERTIFICATE_DETAILS_WIDGET_H__ -#define __GCR_CERTIFICATE_DETAILS_WIDGET_H__ - -/* - * GcrCertificateDetailsWidget has been replaced with GcrCertificateWidget. - * These functions are stubs for GcrCertificateWidget. - */ - -#ifndef GCR_DISABLE_DEPRECATED - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-certificate.h" -#include "gcr/gcr-types.h" - -#include "gcr-certificate-widget.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_CERTIFICATE_DETAILS_WIDGET (gcr_certificate_details_widget_get_type ()) -#define GCR_CERTIFICATE_DETAILS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidget)) -#define GCR_CERTIFICATE_DETAILS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidgetClass)) -#define GCR_IS_CERTIFICATE_DETAILS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET)) -#define GCR_IS_CERTIFICATE_DETAILS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET)) -#define GCR_CERTIFICATE_DETAILS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_DETAILS_WIDGET, GcrCertificateDetailsWidgetClass)) - -typedef GcrCertificateWidget GcrCertificateDetailsWidget; -typedef GcrCertificateWidgetClass GcrCertificateDetailsWidgetClass; - -G_DEPRECATED_FOR(gcr_certificate_widget_get_type) -GType gcr_certificate_details_widget_get_type (void); - -G_DEPRECATED_FOR(gcr_certificate_widget_new) -GcrCertificateDetailsWidget* gcr_certificate_details_widget_new (GcrCertificate *cert); - -G_DEPRECATED_FOR(gcr_certificate_widget_get_certificate) -GcrCertificate* gcr_certificate_details_widget_get_certificate (GcrCertificateDetailsWidget *details); - -G_DEPRECATED_FOR(gcr_certificate_widget_set_certificate) -void gcr_certificate_details_widget_set_certificate (GcrCertificateDetailsWidget *details, - GcrCertificate *cert); - -G_END_DECLS - -#endif /* GCR_DISABLE_DEPRECATED */ - -#endif /* __GCR_CERTIFICATE_DETAILS_WIDGET_H__ */ diff --git a/ui/gcr-certificate-exporter.c b/ui/gcr-certificate-exporter.c deleted file mode 100644 index 4b1817f..0000000 --- a/ui/gcr-certificate-exporter.c +++ /dev/null @@ -1,570 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr-certificate.h" - -#include "gcr-certificate-exporter.h" - -#include "egg/egg-armor.h" -#include "egg/egg-openssl.h" - -#include <glib/gi18n-lib.h> - -enum { - PROP_0, - PROP_CERTIFICATE, - PROP_LABEL, - PROP_TRANSIENT_FOR -}; - -struct _GcrCertificateExporterPrivate { - - /* Setup stuff */ - GcrCertificate *certificate; - gchar *label; - GtkWindow *transient_for; - - /* Used during operation */ - GtkFileChooser *chooser_dialog; - GFile *output_file; - GByteArray *buffer; - guint buffer_at; - - /* Async stuff */ - GAsyncReadyCallback callback; - gpointer user_data; - GCancellable *cancellable; - GError *error; - gboolean completed; -}; - -static const gchar *BAD_FILENAME_CHARS = "/\\<>|?*"; - -/* Forward declarations */ -static void _gcr_certificate_exporter_async_result_init (GAsyncResultIface *iface); -static void write_to_outputstream (GcrCertificateExporter *self, GOutputStream *os); - -G_DEFINE_TYPE_WITH_CODE (GcrCertificateExporter, _gcr_certificate_exporter, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrCertificateExporter); - G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_RESULT, _gcr_certificate_exporter_async_result_init)); - -typedef void (*PrepareDataFunc) (GcrCertificateExporter *self); - -/* ----------------------------------------------------------------------------- - * INTERNAL - */ - -static void -prepare_data_for_der (GcrCertificateExporter *self) -{ - gconstpointer data; - gsize n_data; - - data = gcr_certificate_get_der_data (self->pv->certificate, &n_data); - g_return_if_fail (data); - - self->pv->buffer = g_byte_array_new (); - g_byte_array_append (self->pv->buffer, data, n_data); -} - -static void -prepare_data_for_pem (GcrCertificateExporter *self) -{ - gconstpointer data; - gpointer encoded; - gsize n_data, n_encoded; - - data = gcr_certificate_get_der_data (self->pv->certificate, &n_data); - g_return_if_fail (data); - - self->pv->buffer = g_byte_array_new (); - - encoded = egg_armor_write (data, n_data, - g_quark_from_static_string ("CERTIFICATE"), - NULL, &n_encoded); - - g_byte_array_append (self->pv->buffer, encoded, n_encoded); - g_free (encoded); -} - -static void -complete_async_result (GcrCertificateExporter *self) -{ - g_assert (self->pv->callback); - g_assert (!self->pv->completed); - - if (self->pv->chooser_dialog) - gtk_widget_hide (GTK_WIDGET (self->pv->chooser_dialog)); - - self->pv->completed = TRUE; - (self->pv->callback) (G_OBJECT (self), G_ASYNC_RESULT (self), - self->pv->user_data); -} - -static void -on_outputstream_write_ready (GObject *source, GAsyncResult *res, gpointer user_data) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); - GOutputStream *os = G_OUTPUT_STREAM (source); - gssize written; - - written = g_output_stream_write_finish (os, res, &self->pv->error); - - if (self->pv->error) { - complete_async_result (self); - return; - } - - g_return_if_fail (written >= 0); - g_return_if_fail (written <= self->pv->buffer->len - self->pv->buffer_at); - self->pv->buffer_at += written; - - /* Write next bit, or finished */ - write_to_outputstream (self, os); -} - -static void -on_outputstream_closed (GObject *source, GAsyncResult *res, gpointer user_data) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); - g_output_stream_close_finish (G_OUTPUT_STREAM (source), res, &self->pv->error); - complete_async_result (self); -} - -static void -write_to_outputstream (GcrCertificateExporter *self, GOutputStream *os) -{ - gtk_widget_hide (GTK_WIDGET (self->pv->chooser_dialog)); - g_assert (GTK_IS_WIDGET (self->pv->chooser_dialog)); - - /* Are we all done? */ - g_assert (self->pv->buffer_at <= self->pv->buffer->len); - if (self->pv->buffer_at == self->pv->buffer->len) { - g_output_stream_close_async (os, G_PRIORITY_DEFAULT, - self->pv->cancellable, - on_outputstream_closed, self); - return; - } - - g_output_stream_write_async (os, self->pv->buffer->data + self->pv->buffer_at, - self->pv->buffer->len - self->pv->buffer_at, - G_PRIORITY_DEFAULT, self->pv->cancellable, - on_outputstream_write_ready, self); -} - -static void -on_replace_file_ready (GObject *source, GAsyncResult *res, gpointer user_data) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); - GFile *file = G_FILE (source); - GFileOutputStream *os; - - os = g_file_replace_finish (file, res, &self->pv->error); - - if (self->pv->error) { - complete_async_result (self); - return; - } - - write_to_outputstream (self, G_OUTPUT_STREAM (os)); -} - -static void -on_replace_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); - - if (response_id == GTK_RESPONSE_ACCEPT) { - g_file_replace_async (self->pv->output_file, NULL, FALSE, G_FILE_CREATE_NONE, - G_PRIORITY_DEFAULT, self->pv->cancellable, - on_replace_file_ready, self); - } - - gtk_widget_destroy (GTK_WIDGET (dialog)); -} - -static void -on_cancel_replace_dialog (GCancellable *cancellable, gpointer user_data) -{ - gtk_widget_destroy (user_data); -} - -static void -on_create_file_ready (GObject *source, GAsyncResult *res, gpointer user_data) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); - GFileOutputStream *os; - GtkWidget *dialog; - - os = g_file_create_finish (self->pv->output_file, res, &self->pv->error); - - /* Try again this time replacing the file */ - if (g_error_matches (self->pv->error, G_IO_ERROR, G_IO_ERROR_EXISTS)) { - g_clear_error (&self->pv->error); - - dialog = gtk_message_dialog_new_with_markup (GTK_WINDOW (self->pv->chooser_dialog), - GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, "<b>%s</b>\n\n%s", - _("A file already exists with this name."), - _("Do you want to replace it with a new file?")); - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - _("_Cancel"), GTK_RESPONSE_CANCEL, - _("_Replace"), GTK_RESPONSE_ACCEPT, NULL); - - g_signal_connect (dialog, "response", - G_CALLBACK (on_replace_dialog_response), self); - if (self->pv->cancellable) - g_cancellable_connect (self->pv->cancellable, - G_CALLBACK (on_cancel_replace_dialog), - g_object_ref (dialog), g_object_unref); - gtk_widget_show (dialog); - - return; - } - - if (self->pv->error) { - complete_async_result (self); - return; - } - - write_to_outputstream (self, G_OUTPUT_STREAM (os)); -} - -static void -on_chooser_dialog_response (GtkDialog *dialog, gint response_id, gpointer user_data) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (user_data); - GtkFileFilter *filter; - PrepareDataFunc prepare_data; - - if (response_id != GTK_RESPONSE_ACCEPT) { - g_set_error (&self->pv->error, G_IO_ERROR, G_IO_ERROR_CANCELLED, - _("The operation was cancelled.")); - complete_async_result (self); - return; - } - - if (self->pv->output_file) - g_object_unref (self->pv->output_file); - self->pv->output_file = gtk_file_chooser_get_file (self->pv->chooser_dialog); - g_return_if_fail (self->pv->output_file); - - filter = gtk_file_chooser_get_filter (self->pv->chooser_dialog); - prepare_data = g_object_get_data (G_OBJECT (filter), "prepare-data-func"); - g_assert (prepare_data); - - if (self->pv->buffer) - g_byte_array_free (self->pv->buffer, TRUE); - self->pv->buffer = NULL; - self->pv->buffer_at = 0; - - /* Prepare the for writing out */ - (prepare_data) (self); - - /* Try to open the file */ - g_file_create_async (self->pv->output_file, G_FILE_CREATE_NONE, G_PRIORITY_DEFAULT, - self->pv->cancellable, on_create_file_ready, - self); -} - -static void -on_cancel_chooser_dialog (GCancellable *cancellable, gpointer user_data) -{ - GtkDialog *dialog = GTK_DIALOG (user_data); - gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL); -} - -static void -exporter_display_chooser (GcrCertificateExporter *self) -{ - GtkFileFilter* filter; - GtkWidget *dialog; - gchar *filename; - - g_assert (!self->pv->chooser_dialog); - - dialog = gtk_file_chooser_dialog_new (_("Export certificate"), - NULL, GTK_FILE_CHOOSER_ACTION_SAVE, - _("_Cancel"), GTK_RESPONSE_CANCEL, - _("_Save"), GTK_RESPONSE_ACCEPT, - NULL); - - self->pv->chooser_dialog = GTK_FILE_CHOOSER (g_object_ref_sink (dialog)); - gtk_dialog_set_default_response (GTK_DIALOG (dialog), - GTK_RESPONSE_ACCEPT); - gtk_file_chooser_set_local_only (self->pv->chooser_dialog, FALSE); - - filter = gtk_file_filter_new (); - gtk_file_filter_set_name (filter, _("Certificate files")); - gtk_file_filter_add_mime_type (filter, "application/x-x509-ca-cert"); - gtk_file_filter_add_mime_type (filter, "application/x-x509-user-cert"); - gtk_file_filter_add_mime_type (filter, "application/pkix-cert"); - gtk_file_filter_add_pattern (filter, "*.cer"); - gtk_file_filter_add_pattern (filter, "*.crt"); - g_object_set_data (G_OBJECT (filter), "prepare-data-func", prepare_data_for_der); - gtk_file_chooser_add_filter (self->pv->chooser_dialog, filter); - gtk_file_chooser_set_filter (self->pv->chooser_dialog, filter); - - filter = gtk_file_filter_new (); - gtk_file_filter_set_name (filter, _("PEM files")); - gtk_file_filter_add_mime_type (filter, "text/plain"); - gtk_file_filter_add_pattern (filter, "*.pem"); - g_object_set_data (G_OBJECT (filter), "prepare-data-func", prepare_data_for_pem); - gtk_file_chooser_add_filter (self->pv->chooser_dialog, filter); - - filename = g_strconcat (self->pv->label, ".crt", NULL); - g_strdelimit (filename, BAD_FILENAME_CHARS, '_'); - gtk_file_chooser_set_current_name (self->pv->chooser_dialog, filename); - g_free (filename); - - g_signal_connect (self->pv->chooser_dialog, "response", - G_CALLBACK (on_chooser_dialog_response), self); - if (self->pv->cancellable) - g_cancellable_connect (self->pv->cancellable, - G_CALLBACK (on_cancel_chooser_dialog), self, NULL); - - gtk_dialog_run (GTK_DIALOG (self->pv->chooser_dialog)); -} - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static void -_gcr_certificate_exporter_init (GcrCertificateExporter *self) -{ - self->pv = _gcr_certificate_exporter_get_instance_private (self); -} - -static void -_gcr_certificate_exporter_dispose (GObject *obj) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj); - - if (self->pv->certificate) - g_object_unref (self->pv->certificate); - self->pv->certificate = NULL; - - if (self->pv->cancellable) - g_object_unref (self->pv->cancellable); - self->pv->cancellable = NULL; - - G_OBJECT_CLASS (_gcr_certificate_exporter_parent_class)->dispose (obj); -} - -static void -_gcr_certificate_exporter_finalize (GObject *obj) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj); - - g_free (self->pv->label); - - /* - * Should have been freed in _export_finish, which holds a ref to self - * so this should never be reached without being finished. - */ - g_assert (!self->pv->chooser_dialog); - g_assert (!self->pv->output_file); - g_assert (!self->pv->buffer); - - g_clear_error (&self->pv->error); - - G_OBJECT_CLASS (_gcr_certificate_exporter_parent_class)->finalize (obj); -} - -static void -_gcr_certificate_exporter_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj); - GcrCertificate *cert; - - switch (prop_id) { - case PROP_CERTIFICATE: - cert = g_value_dup_object (value); - if (self->pv->certificate) - g_object_unref (self->pv->certificate); - self->pv->certificate = cert; - g_object_notify (G_OBJECT (self), "certificate"); - break; - case PROP_LABEL: - g_free (self->pv->label); - self->pv->label = g_value_dup_string (value); - g_object_notify (obj, "label"); - break; - case PROP_TRANSIENT_FOR: - self->pv->transient_for = g_value_get_object (value); - g_object_notify (obj, "transient-for"); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_certificate_exporter_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrCertificateExporter *self = GCR_CERTIFICATE_EXPORTER (obj); - - switch (prop_id) { - case PROP_CERTIFICATE: - g_value_set_object (value, self->pv->certificate); - break; - case PROP_LABEL: - g_value_take_string (value, self->pv->label); - break; - case PROP_TRANSIENT_FOR: - g_value_set_object (value, self->pv->transient_for); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_certificate_exporter_class_init (GcrCertificateExporterClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - _gcr_certificate_exporter_parent_class = g_type_class_peek_parent (klass); - - gobject_class->dispose = _gcr_certificate_exporter_dispose; - gobject_class->finalize = _gcr_certificate_exporter_finalize; - gobject_class->set_property = _gcr_certificate_exporter_set_property; - gobject_class->get_property = _gcr_certificate_exporter_get_property; - - g_object_class_install_property (gobject_class, PROP_CERTIFICATE, - g_param_spec_object ("certificate", "Certificate", "Certificate to display.", - GCR_TYPE_CERTIFICATE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_LABEL, - g_param_spec_string ("label", "Label", "Label of certificate.", - _("Certificate"), - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_TRANSIENT_FOR, - g_param_spec_object ("transient-for", "Transient For", "Transient for this Window", - GTK_TYPE_WINDOW, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -} - -static GObject* -_gcr_certificate_exporter_get_source_object (GAsyncResult *result) -{ - g_return_val_if_fail (GCR_IS_CERTIFICATE_EXPORTER (result), NULL); - return G_OBJECT (result); -} - -static gpointer -_gcr_certificate_exporter_get_user_data (GAsyncResult *result) -{ - g_return_val_if_fail (GCR_IS_CERTIFICATE_EXPORTER (result), NULL); - return GCR_CERTIFICATE_EXPORTER (result)->pv->user_data; -} - -static void -_gcr_certificate_exporter_async_result_init (GAsyncResultIface *iface) -{ - iface->get_source_object = _gcr_certificate_exporter_get_source_object; - iface->get_user_data = _gcr_certificate_exporter_get_user_data; -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -GcrCertificateExporter* -_gcr_certificate_exporter_new (GcrCertificate *certificate, const gchar *label, - GtkWindow *transient_for) -{ - return g_object_new (GCR_TYPE_CERTIFICATE_EXPORTER, - "certificate", certificate, - "label", label, - "transient-for", transient_for, - NULL); -} - -void -_gcr_certificate_exporter_export_async (GcrCertificateExporter *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - g_return_if_fail (GCR_IS_CERTIFICATE_EXPORTER (self)); - g_return_if_fail (callback); - - /* Must not have already started */ - g_return_if_fail (!self->pv->callback); - g_return_if_fail (!self->pv->cancellable); - - self->pv->callback = callback; - self->pv->user_data = user_data; - if (cancellable) - self->pv->cancellable = g_object_ref (cancellable); - - /* Matching in export_finish */ - g_object_ref (self); - - exporter_display_chooser (self); -} - -gboolean -_gcr_certificate_exporter_export_finish (GcrCertificateExporter *self, - GAsyncResult *result, - GError **error) -{ - gboolean ret = TRUE; - - g_return_val_if_fail (G_ASYNC_RESULT (self) == result, FALSE); - g_return_val_if_fail (!error || !*error, FALSE); - g_return_val_if_fail (self->pv->completed, FALSE); - - /* Cleanup all the operation stuff */ - self->pv->callback = NULL; - - if (self->pv->chooser_dialog) - g_object_unref (self->pv->chooser_dialog); - self->pv->chooser_dialog = NULL; - - if (self->pv->output_file) - g_object_unref (self->pv->output_file); - self->pv->output_file = NULL; - - if (self->pv->buffer) - g_byte_array_free (self->pv->buffer, TRUE); - self->pv->buffer = NULL; - self->pv->buffer_at = 0; - - self->pv->completed = FALSE; - - if (self->pv->error) { - g_propagate_error (error, self->pv->error); - ret = FALSE; - } - - /* Matches in export_async */ - g_object_unref (self); - return ret; -} diff --git a/ui/gcr-certificate-exporter.h b/ui/gcr-certificate-exporter.h deleted file mode 100644 index d5dd9c2..0000000 --- a/ui/gcr-certificate-exporter.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_CERTIFICATE_EXPORTER_H__ -#define __GCR_CERTIFICATE_EXPORTER_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-types.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_CERTIFICATE_EXPORTER (_gcr_certificate_exporter_get_type ()) -#define GCR_CERTIFICATE_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporter)) -#define GCR_CERTIFICATE_EXPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporterClass)) -#define GCR_IS_CERTIFICATE_EXPORTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_EXPORTER)) -#define GCR_IS_CERTIFICATE_EXPORTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_EXPORTER)) -#define GCR_CERTIFICATE_EXPORTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_EXPORTER, GcrCertificateExporterClass)) - -typedef struct _GcrCertificateExporter GcrCertificateExporter; -typedef struct _GcrCertificateExporterClass GcrCertificateExporterClass; -typedef struct _GcrCertificateExporterPrivate GcrCertificateExporterPrivate; - -struct _GcrCertificateExporter { - /*< private >*/ - GObject parent; - GcrCertificateExporterPrivate *pv; -}; - -struct _GcrCertificateExporterClass { - GObjectClass parent_class; -}; - -GType _gcr_certificate_exporter_get_type (void); - -GcrCertificateExporter* _gcr_certificate_exporter_new (GcrCertificate *certificate, - const gchar *label, - GtkWindow *transient_for); - -void _gcr_certificate_exporter_export_async (GcrCertificateExporter *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - -gboolean _gcr_certificate_exporter_export_finish (GcrCertificateExporter *self, - GAsyncResult *result, - GError **error); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateExporter, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_CERTIFICATE_EXPORTER_H__ */ diff --git a/ui/gcr-certificate-renderer-private.h b/ui/gcr-certificate-renderer-private.h deleted file mode 100644 index 53f3bda..0000000 --- a/ui/gcr-certificate-renderer-private.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_CERTIFICATE_RENDERER_PRIVATE_H__ -#define __GCR_CERTIFICATE_RENDERER_PRIVATE_H__ - -#include "gcr-display-view.h" -#include "gcr-renderer.h" - -G_BEGIN_DECLS - -void _gcr_certificate_renderer_append_distinguished_name (GcrRenderer *renderer, - GcrDisplayView *view, - GNode *dn); - -void _gcr_certificate_renderer_append_subject_public_key (GcrRenderer *renderer, - GcrDisplayView *view, - guint key_size, - GNode *subject_public_key); - -void _gcr_certificate_renderer_append_signature (GcrRenderer *renderer, - GcrDisplayView *view, - GNode *asn); - -void _gcr_certificate_renderer_append_extension (GcrRenderer *renderer, - GcrDisplayView *view, - GNode *asn); - -G_END_DECLS - -#endif /* __GCR_CERTIFICATE_RENDERER_PRIVATE_H__ */ diff --git a/ui/gcr-certificate-renderer.c b/ui/gcr-certificate-renderer.c deleted file mode 100644 index 70bfb5d..0000000 --- a/ui/gcr-certificate-renderer.c +++ /dev/null @@ -1,960 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-certificate.h" -#include "gcr/gcr-certificate-extensions.h" -#include "gcr/gcr-fingerprint.h" -#include "gcr/gcr-icons.h" -#include "gcr/gcr-oids.h" -#include "gcr/gcr-simple-certificate.h" - -#include "gcr-certificate-exporter.h" -#include "gcr-certificate-renderer.h" -#include "gcr-certificate-renderer-private.h" -#include "gcr-deprecated.h" -#include "gcr-display-view.h" -#include "gcr-renderer.h" - -#include "egg/egg-asn1x.h" -#include "egg/egg-asn1-defs.h" -#include "egg/egg-dn.h" -#include "egg/egg-oid.h" -#include "egg/egg-hex.h" - -#include "gck/gck.h" - -#include <gdk/gdk.h> -#include <glib/gi18n-lib.h> - -/** - * GcrCertificateRenderer: - * - * An implementation of #GcrRenderer which renders certificates. - */ - -/** - * GcrCertificateRendererClass: - * @parent_class: The parent class. - * - * The class for #GcrCertificateRenderer. - */ - -enum { - PROP_0, - PROP_CERTIFICATE, - PROP_LABEL, - PROP_ATTRIBUTES -}; - -struct _GcrCertificateRendererPrivate { - GcrCertificate *opt_cert; - GckAttributes *opt_attrs; - guint key_size; - gchar *label; -}; - -static void gcr_renderer_iface_init (GcrRendererIface *iface); -static void gcr_renderer_certificate_iface_init (GcrCertificateIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrCertificateRenderer, gcr_certificate_renderer, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrCertificateRenderer); - G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init); - GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE (); - G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, gcr_renderer_certificate_iface_init); -); - -/* ----------------------------------------------------------------------------- - * INTERNAL - */ - -static gchar* -calculate_label (GcrCertificateRenderer *self) -{ - gchar *label; - - if (self->pv->label) - return g_strdup (self->pv->label); - - if (self->pv->opt_attrs) { - if (gck_attributes_find_string (self->pv->opt_attrs, CKA_LABEL, &label)) - return label; - } - - label = gcr_certificate_get_subject_cn (GCR_CERTIFICATE (self)); - if (label != NULL) - return label; - - return g_strdup (_("Certificate")); -} - -static gboolean -append_extension_basic_constraints (GcrRenderer *renderer, - GcrDisplayView *view, - GBytes *data) -{ - gboolean is_ca = FALSE; - gint path_len = -1; - gchar *number; - - if (!_gcr_certificate_extension_basic_constraints (data, &is_ca, &path_len)) - return FALSE; - - _gcr_display_view_append_heading (view, renderer, _("Basic Constraints")); - - _gcr_display_view_append_value (view, renderer, _("Certificate Authority"), - is_ca ? _("Yes") : _("No"), FALSE); - - number = g_strdup_printf ("%d", path_len); - _gcr_display_view_append_value (view, renderer, _("Max Path Length"), - path_len < 0 ? _("Unlimited") : number, FALSE); - g_free (number); - - return TRUE; -} - -static gboolean -append_extension_extended_key_usage (GcrRenderer *renderer, - GcrDisplayView *view, - GBytes *data) -{ - GQuark *oids; - GString *text; - guint i; - - oids = _gcr_certificate_extension_extended_key_usage (data); - if (oids == NULL) - return FALSE; - - _gcr_display_view_append_heading (view, renderer, _("Extended Key Usage")); - - text = g_string_new (""); - for (i = 0; oids[i] != 0; i++) { - if (i > 0) - g_string_append_unichar (text, GCR_DISPLAY_VIEW_LINE_BREAK); - g_string_append (text, egg_oid_get_description (oids[i])); - } - - g_free (oids); - - _gcr_display_view_append_value (view, renderer, _("Allowed Purposes"), - text->str, FALSE); - - g_string_free (text, TRUE); - - return TRUE; -} - -static gboolean -append_extension_subject_key_identifier (GcrRenderer *renderer, - GcrDisplayView *view, - GBytes *data) -{ - gpointer keyid; - gsize n_keyid; - - keyid = _gcr_certificate_extension_subject_key_identifier (data, &n_keyid); - if (keyid == NULL) - return FALSE; - - _gcr_display_view_append_heading (view, renderer, _("Subject Key Identifier")); - _gcr_display_view_append_hex (view, renderer, _("Key Identifier"), keyid, n_keyid); - - g_free (keyid); - - return TRUE; -} - -static const struct { - guint usage; - const gchar *description; -} usage_descriptions[] = { - { GCR_KEY_USAGE_DIGITAL_SIGNATURE, N_("Digital signature") }, - { GCR_KEY_USAGE_NON_REPUDIATION, N_("Non repudiation") }, - { GCR_KEY_USAGE_KEY_ENCIPHERMENT, N_("Key encipherment") }, - { GCR_KEY_USAGE_DATA_ENCIPHERMENT, N_("Data encipherment") }, - { GCR_KEY_USAGE_KEY_AGREEMENT, N_("Key agreement") }, - { GCR_KEY_USAGE_KEY_CERT_SIGN, N_("Certificate signature") }, - { GCR_KEY_USAGE_CRL_SIGN, N_("Revocation list signature") }, - { GCR_KEY_USAGE_ENCIPHER_ONLY, N_("Encipher only") }, - { GCR_KEY_USAGE_DECIPHER_ONLY, N_("Decipher only") } -}; - -static gboolean -append_extension_key_usage (GcrRenderer *renderer, - GcrDisplayView *view, - GBytes *data) -{ - gulong key_usage; - GString *text; - guint i; - - if (!_gcr_certificate_extension_key_usage (data, &key_usage)) - return FALSE; - - text = g_string_new (""); - - for (i = 0; i < G_N_ELEMENTS (usage_descriptions); i++) { - if (key_usage & usage_descriptions[i].usage) { - if (text->len > 0) - g_string_append_unichar (text, GCR_DISPLAY_VIEW_LINE_BREAK); - g_string_append (text, _(usage_descriptions[i].description)); - } - } - - _gcr_display_view_append_heading (view, renderer, _("Key Usage")); - _gcr_display_view_append_value (view, renderer, _("Usages"), text->str, FALSE); - - g_string_free (text, TRUE); - - return TRUE; -} - -static gboolean -append_extension_subject_alt_name (GcrRenderer *renderer, - GcrDisplayView *view, - GBytes *data) -{ - GArray *general_names; - GcrGeneralName *general; - guint i; - - general_names = _gcr_certificate_extension_subject_alt_name (data); - if (general_names == NULL) - return FALSE; - - _gcr_display_view_append_heading (view, renderer, _("Subject Alternative Names")); - - for (i = 0; i < general_names->len; i++) { - general = &g_array_index (general_names, GcrGeneralName, i); - if (general->display == NULL) - _gcr_display_view_append_hex (view, renderer, general->description, - g_bytes_get_data (general->raw, NULL), - g_bytes_get_size (general->raw)); - else - _gcr_display_view_append_value (view, renderer, general->description, - general->display, FALSE); - } - - _gcr_general_names_free (general_names); - - return TRUE; -} - -static gboolean -append_extension_hex (GcrRenderer *renderer, - GcrDisplayView *view, - GQuark oid, - gconstpointer data, - gsize n_data) -{ - const gchar *text; - - _gcr_display_view_append_heading (view, renderer, _("Extension")); - - /* Extension type */ - text = egg_oid_get_description (oid); - _gcr_display_view_append_value (view, renderer, _("Identifier"), text, FALSE); - _gcr_display_view_append_hex (view, renderer, _("Value"), data, n_data); - - return TRUE; -} - -static void -on_export_completed (GObject *source, GAsyncResult *result, gpointer user_data) -{ - GtkWindow *parent = GTK_WINDOW (user_data); - GcrCertificateExporter *exporter = GCR_CERTIFICATE_EXPORTER (source); - GError *error = NULL; - GtkWidget *dialog; - - if (!_gcr_certificate_exporter_export_finish (exporter, result, &error)) { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - dialog = gtk_message_dialog_new_with_markup (parent, - GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, "<big>%s</big>\n\n%s", - _("Couldn’t export the certificate."), - error->message); - gtk_widget_show (dialog); - g_signal_connect (dialog, "delete-event", - G_CALLBACK (gtk_widget_destroy), dialog); - g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); - } - } - - /* Matches ref in on_certificate_export */ - if (parent) - g_object_unref (parent); -} - -static void -on_certificate_export (GtkMenuItem *menuitem, gpointer user_data) -{ - GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (user_data); - GcrCertificateExporter *exporter; - gchar *label; - GtkWidget *parent; - - label = calculate_label (self); - - parent = gtk_widget_get_toplevel (GTK_WIDGET (menuitem)); - if (parent && !GTK_IS_WINDOW (parent)) - parent = NULL; - - exporter = _gcr_certificate_exporter_new (GCR_CERTIFICATE (self), label, - GTK_WINDOW (parent)); - - g_free (label); - - _gcr_certificate_exporter_export_async (exporter, NULL, on_export_completed, - parent ? g_object_ref (parent) : NULL); -} - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static void -gcr_certificate_renderer_init (GcrCertificateRenderer *self) -{ - self->pv = gcr_certificate_renderer_get_instance_private (self); -} - -static void -gcr_certificate_renderer_dispose (GObject *obj) -{ - GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj); - - if (self->pv->opt_cert) - g_object_unref (self->pv->opt_cert); - self->pv->opt_cert = NULL; - - G_OBJECT_CLASS (gcr_certificate_renderer_parent_class)->dispose (obj); -} - -static void -gcr_certificate_renderer_finalize (GObject *obj) -{ - GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj); - - g_assert (!self->pv->opt_cert); - - if (self->pv->opt_attrs) - gck_attributes_unref (self->pv->opt_attrs); - self->pv->opt_attrs = NULL; - - g_free (self->pv->label); - self->pv->label = NULL; - - G_OBJECT_CLASS (gcr_certificate_renderer_parent_class)->finalize (obj); -} - -static void -gcr_certificate_renderer_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj); - - switch (prop_id) { - case PROP_CERTIFICATE: - gcr_certificate_renderer_set_certificate (self, g_value_get_object (value)); - break; - case PROP_LABEL: - g_free (self->pv->label); - self->pv->label = g_value_dup_string (value); - g_object_notify (obj, "label"); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - break; - case PROP_ATTRIBUTES: - gck_attributes_unref (self->pv->opt_attrs); - self->pv->opt_attrs = g_value_get_boxed (value); - if (self->pv->opt_attrs) - gck_attributes_ref (self->pv->opt_attrs); - if (self->pv->opt_cert) { - g_object_unref (self->pv->opt_cert); - g_object_notify (G_OBJECT (self), "certificate"); - self->pv->opt_cert = NULL; - } - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - g_object_notify (G_OBJECT (self), "attributes"); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_certificate_renderer_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (obj); - - switch (prop_id) { - case PROP_CERTIFICATE: - g_value_set_object (value, self->pv->opt_cert); - break; - case PROP_LABEL: - g_value_take_string (value, calculate_label (self)); - break; - case PROP_ATTRIBUTES: - g_value_set_boxed (value, self->pv->opt_attrs); - break; - default: - gcr_certificate_mixin_get_property (obj, prop_id, value, pspec); - break; - } -} - -static void -gcr_certificate_renderer_class_init (GcrCertificateRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GckBuilder builder = GCK_BUILDER_INIT; - - gcr_certificate_renderer_parent_class = g_type_class_peek_parent (klass); - - gobject_class->dispose = gcr_certificate_renderer_dispose; - gobject_class->finalize = gcr_certificate_renderer_finalize; - gobject_class->set_property = gcr_certificate_renderer_set_property; - gobject_class->get_property = gcr_certificate_renderer_get_property; - - /** - * GcrCertificateRenderer:certificate: - * - * The certificate to display. May be %NULL. - */ - g_object_class_install_property (gobject_class, PROP_CERTIFICATE, - g_param_spec_object ("certificate", "Certificate", "Certificate to display.", - GCR_TYPE_CERTIFICATE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrCertificateRenderer:attributes: - * - * The certificate attributes to display. One of the attributes must be - * a CKA_VALUE type attribute which contains a DER encoded certificate. - */ - g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, - g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes", - GCK_TYPE_ATTRIBUTES, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrCertificateRenderer:label: - * - * The label to display. - */ - g_object_class_install_property (gobject_class, PROP_LABEL, - g_param_spec_string ("label", "Label", "Certificate Label", - "", - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - gcr_certificate_mixin_class_init (gobject_class); - - /* Register this as a renderer which can be loaded */ - gck_builder_add_ulong (&builder, CKA_CLASS, CKO_CERTIFICATE); - gcr_renderer_register (GCR_TYPE_CERTIFICATE_RENDERER, gck_builder_end (&builder)); -} - -static void -gcr_certificate_renderer_render (GcrRenderer *renderer, GcrViewer *viewer) -{ - GcrCertificateRenderer *self; - GNode *extension; - gconstpointer data; - gsize n_data; - GcrDisplayView *view; - GcrCertificate *cert; - GBytes *number; - gulong version; - guint bits, index; - gchar *display; - GBytes *bytes; - GNode *asn; - GDate date; - GIcon *icon; - - self = GCR_CERTIFICATE_RENDERER (renderer); - - if (GCR_IS_DISPLAY_VIEW (viewer)) { - view = GCR_DISPLAY_VIEW (viewer); - - } else { - g_warning ("GcrCertificateRenderer only works with internal specific " - "GcrViewer returned by gcr_viewer_new()."); - return; - } - - _gcr_display_view_begin (view, renderer); - cert = GCR_CERTIFICATE (self); - - data = gcr_certificate_get_der_data (cert, &n_data); - if (!data) { - _gcr_display_view_end (view, renderer); - return; - } - - icon = gcr_certificate_get_icon (cert); - _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon); - g_object_unref (icon); - - bytes = g_bytes_new_static (data, n_data); - asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes); - g_return_if_fail (asn != NULL); - g_bytes_unref (bytes); - - display = calculate_label (self); - _gcr_display_view_append_title (view, renderer, display); - g_free (display); - - display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL), "CN"); - _gcr_display_view_append_content (view, renderer, _("Identity"), display); - g_free (display); - - display = egg_dn_read_part (egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL), "CN"); - _gcr_display_view_append_content (view, renderer, _("Verified by"), display); - g_free (display); - - if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) { - display = g_malloc0 (128); - if (!g_date_strftime (display, 128, "%x", &date)) - g_return_if_reached (); - _gcr_display_view_append_content (view, renderer, _("Expires"), display); - g_free (display); - } - - _gcr_display_view_start_details (view, renderer); - - /* The subject */ - _gcr_display_view_append_heading (view, renderer, _("Subject Name")); - _gcr_certificate_renderer_append_distinguished_name (renderer, view, - egg_asn1x_node (asn, "tbsCertificate", "subject", "rdnSequence", NULL)); - - /* The Issuer */ - _gcr_display_view_append_heading (view, renderer, _("Issuer Name")); - _gcr_certificate_renderer_append_distinguished_name (renderer, view, - egg_asn1x_node (asn, "tbsCertificate", "issuer", "rdnSequence", NULL)); - - /* The Issued Parameters */ - _gcr_display_view_append_heading (view, renderer, _("Issued Certificate")); - - if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (asn, "tbsCertificate", "version", NULL), &version)) - g_return_if_reached (); - display = g_strdup_printf ("%lu", version + 1); - _gcr_display_view_append_value (view, renderer, _("Version"), display, FALSE); - g_free (display); - - number = egg_asn1x_get_integer_as_raw (egg_asn1x_node (asn, "tbsCertificate", "serialNumber", NULL)); - g_return_if_fail (number != NULL); - _gcr_display_view_append_hex (view, renderer, _("Serial Number"), - g_bytes_get_data (number, NULL), - g_bytes_get_size (number)); - g_bytes_unref (number); - - display = g_malloc0 (128); - if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notBefore", NULL), &date)) { - if (!g_date_strftime (display, 128, "%Y-%m-%d", &date)) - g_return_if_reached (); - _gcr_display_view_append_value (view, renderer, _("Not Valid Before"), display, FALSE); - } - if (egg_asn1x_get_time_as_date (egg_asn1x_node (asn, "tbsCertificate", "validity", "notAfter", NULL), &date)) { - if (!g_date_strftime (display, 128, "%Y-%m-%d", &date)) - g_return_if_reached (); - _gcr_display_view_append_value (view, renderer, _("Not Valid After"), display, FALSE); - } - g_free (display); - - /* Fingerprints */ - _gcr_display_view_append_heading (view, renderer, _("Certificate Fingerprints")); - - _gcr_display_view_append_fingerprint (view, renderer, data, n_data, "SHA1", G_CHECKSUM_SHA1); - _gcr_display_view_append_fingerprint (view, renderer, data, n_data, "MD5", G_CHECKSUM_MD5); - - /* Public Key Info */ - _gcr_display_view_append_heading (view, renderer, _("Public Key Info")); - bits = gcr_certificate_get_key_size (cert); - _gcr_certificate_renderer_append_subject_public_key (renderer, view, bits, - egg_asn1x_node (asn, "tbsCertificate", - "subjectPublicKeyInfo", NULL)); - - /* Extensions */ - for (index = 1; TRUE; ++index) { - extension = egg_asn1x_node (asn, "tbsCertificate", "extensions", index, NULL); - if (extension == NULL) - break; - _gcr_certificate_renderer_append_extension (renderer, view, extension); - } - - /* Signature */ - _gcr_display_view_append_heading (view, renderer, _("Signature")); - _gcr_certificate_renderer_append_signature (renderer, view, asn); - - egg_asn1x_destroy (asn); - _gcr_display_view_end (view, renderer); -} - -static void -gcr_certificate_renderer_populate_popup (GcrRenderer *self, GcrViewer *viewer, - GtkMenu *menu) -{ - GtkWidget *item; - - item = gtk_separator_menu_item_new (); - gtk_widget_show (item); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); - - item = gtk_menu_item_new_with_label (_("Export Certificate\xE2\x80\xA6")); - gtk_widget_show (item); - g_signal_connect_data (item, "activate", G_CALLBACK (on_certificate_export), - g_object_ref (self), (GClosureNotify)g_object_unref, 0); - gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), item); -} - -static void -gcr_renderer_iface_init (GcrRendererIface *iface) -{ - iface->populate_popup = gcr_certificate_renderer_populate_popup; - iface->render_view = gcr_certificate_renderer_render; -} - -static const guchar * -gcr_certificate_renderer_get_der_data (GcrCertificate *cert, - gsize *n_data) -{ - GcrCertificateRenderer *self = GCR_CERTIFICATE_RENDERER (cert); - const GckAttribute *attr; - - g_assert (n_data); - - if (self->pv->opt_cert) - return gcr_certificate_get_der_data (self->pv->opt_cert, n_data); - - if (self->pv->opt_attrs) { - attr = gck_attributes_find (self->pv->opt_attrs, CKA_VALUE); - g_return_val_if_fail (attr, NULL); - *n_data = attr->length; - return attr->value; - } - - return NULL; -} - -static void -gcr_renderer_certificate_iface_init (GcrCertificateIface *iface) -{ - iface->get_der_data = gcr_certificate_renderer_get_der_data; -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_certificate_renderer_new: - * @certificate: The certificate to display - * - * Create a new certificate renderer to display the certificate. - * - * Returns: (transfer full): a newly allocated #GcrCertificateRenderer, which - * should be released with g_object_unref() - */ -GcrCertificateRenderer * -gcr_certificate_renderer_new (GcrCertificate *certificate) -{ - return g_object_new (GCR_TYPE_CERTIFICATE_RENDERER, "certificate", certificate, NULL); -} - -/** - * gcr_certificate_renderer_new_for_attributes: - * @label: (nullable): the label to display - * @attrs: The attributes to display - * - * Create a new certificate renderer to display the label and attributes. One - * of the attributes should be a CKA_VALUE type attribute containing a DER - * encoded certificate. - * - * Returns: (transfer full): a newly allocated #GcrCertificateRenderer, which - * should be released with g_object_unref() - */ -GcrCertificateRenderer * -gcr_certificate_renderer_new_for_attributes (const gchar *label, struct _GckAttributes *attrs) -{ - return g_object_new (GCR_TYPE_CERTIFICATE_RENDERER, "label", label, "attributes", attrs, NULL); -} - -/** - * gcr_certificate_renderer_get_certificate: - * @self: The renderer - * - * Get the certificate displayed in the renderer. If no certificate was - * explicitly set, then the renderer will return itself since it acts as - * a valid certificate. - * - * Returns: (transfer none): The certificate, owned by the renderer. - */ -GcrCertificate * -gcr_certificate_renderer_get_certificate (GcrCertificateRenderer *self) -{ - g_return_val_if_fail (GCR_IS_CERTIFICATE_RENDERER (self), NULL); - if (self->pv->opt_cert) - return self->pv->opt_cert; - return GCR_CERTIFICATE (self); -} - -/** - * gcr_certificate_renderer_set_certificate: - * @self: The renderer - * @certificate: (nullable): the certificate to display - * - * Set a certificate to display in the renderer. - */ -void -gcr_certificate_renderer_set_certificate (GcrCertificateRenderer *self, GcrCertificate *certificate) -{ - g_return_if_fail (GCR_IS_CERTIFICATE_RENDERER (self)); - - if (self->pv->opt_cert) - g_object_unref (self->pv->opt_cert); - self->pv->opt_cert = certificate; - if (self->pv->opt_cert) - g_object_ref (self->pv->opt_cert); - - if (self->pv->opt_attrs) { - gck_attributes_unref (self->pv->opt_attrs); - self->pv->opt_attrs = NULL; - } - - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - g_object_notify (G_OBJECT (self), "certificate"); -} - -/** - * gcr_certificate_renderer_get_attributes: - * @self: The renderer - * - * Get the PKCS#11 attributes, if any, set for this renderer to display. - * - * Returns: (nullable) (transfer none): the attributes, owned by the renderer - * - * Deprecated: 3.6: Use gcr_renderer_get_attributes() instead - */ -GckAttributes * -gcr_certificate_renderer_get_attributes (GcrCertificateRenderer *self) -{ - g_return_val_if_fail (GCR_IS_CERTIFICATE_RENDERER (self), NULL); - return gcr_renderer_get_attributes (GCR_RENDERER (self)); -} - -/** - * gcr_certificate_renderer_set_attributes: - * @self: The renderer - * @attrs: (nullable): attributes to set - * - * Set the PKCS#11 attributes for this renderer to display. One of the attributes - * should be a `CKA_VALUE` type attribute containing a DER encoded certificate. - * - * Deprecated: 3.6: Use gcr_renderer_set_attributes() instead - */ -void -gcr_certificate_renderer_set_attributes (GcrCertificateRenderer *self, GckAttributes *attrs) -{ - g_return_if_fail (GCR_IS_CERTIFICATE_RENDERER (self)); - gcr_renderer_set_attributes (GCR_RENDERER (self), attrs); -} - -typedef struct { - GcrRenderer *renderer; - GcrDisplayView *view; -} AppendDnClosure; - -static void -on_parsed_dn_part (guint index, - GQuark oid, - GNode *value, - gpointer user_data) -{ - GcrRenderer *renderer = ((AppendDnClosure *)user_data)->renderer; - GcrDisplayView *view = ((AppendDnClosure *)user_data)->view; - const gchar *attr; - const gchar *desc; - gchar *field = NULL; - gchar *display; - - attr = egg_oid_get_name (oid); - desc = egg_oid_get_description (oid); - - /* Combine them into something sane */ - if (attr && desc) { - if (strcmp (attr, desc) == 0) - field = g_strdup (attr); - else - field = g_strdup_printf ("%s (%s)", attr, desc); - } else if (!attr && !desc) { - field = g_strdup (""); - } else if (attr) { - field = g_strdup (attr); - } else if (desc) { - field = g_strdup (desc); - } else { - g_assert_not_reached (); - } - - display = egg_dn_print_value (oid, value); - if (display == NULL) - display = g_strdup (""); - - _gcr_display_view_append_value (view, renderer, field, display, FALSE); - g_free (field); - g_free (display); -} - - -void -_gcr_certificate_renderer_append_distinguished_name (GcrRenderer *renderer, - GcrDisplayView *view, - GNode *dn) -{ - AppendDnClosure closure; - - g_return_if_fail (GCR_IS_RENDERER (renderer)); - g_return_if_fail (GCR_IS_DISPLAY_VIEW (view)); - g_return_if_fail (dn != NULL); - - closure.renderer = renderer; - closure.view = view; - egg_dn_parse (dn, on_parsed_dn_part, &closure); -} - -void -_gcr_certificate_renderer_append_subject_public_key (GcrRenderer *renderer, - GcrDisplayView *view, - guint key_nbits, - GNode *subject_public_key) -{ - const gchar *text; - gchar *display; - GBytes *value; - guchar *raw; - gsize n_raw; - GQuark oid; - guint bits; - - oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (subject_public_key, - "algorithm", "algorithm", NULL)); - text = egg_oid_get_description (oid); - _gcr_display_view_append_value (view, renderer, _("Key Algorithm"), text, FALSE); - - value = egg_asn1x_get_element_raw (egg_asn1x_node (subject_public_key, - "algorithm", "parameters", NULL)); - if (value) { - _gcr_display_view_append_hex (view, renderer, _("Key Parameters"), - g_bytes_get_data (value, NULL), - g_bytes_get_size (value)); - g_bytes_unref (value); - } - - if (key_nbits > 0) { - display = g_strdup_printf ("%u", key_nbits); - _gcr_display_view_append_value (view, renderer, _("Key Size"), display, FALSE); - g_free (display); - } - - value = egg_asn1x_get_element_raw (subject_public_key); - raw = gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (value, NULL), - g_bytes_get_size (value), - G_CHECKSUM_SHA1, &n_raw); - _gcr_display_view_append_hex (view, renderer, _("Key SHA1 Fingerprint"), raw, n_raw); - g_bytes_unref (value); - g_free (raw); - - value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (subject_public_key, "subjectPublicKey", NULL), &bits); - _gcr_display_view_append_hex (view, renderer, _("Public Key"), - g_bytes_get_data (value, NULL), bits / 8); - g_bytes_unref (value); -} - -void -_gcr_certificate_renderer_append_signature (GcrRenderer *renderer, - GcrDisplayView *view, - GNode *asn) -{ - const gchar *text; - GBytes *value; - GQuark oid; - guint bits; - - oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (asn, "signatureAlgorithm", "algorithm", NULL)); - text = egg_oid_get_description (oid); - _gcr_display_view_append_value (view, renderer, _("Signature Algorithm"), text, FALSE); - - value = egg_asn1x_get_element_raw (egg_asn1x_node (asn, "signatureAlgorithm", "parameters", NULL)); - if (value) { - _gcr_display_view_append_hex (view, renderer, _("Signature Parameters"), - g_bytes_get_data (value, NULL), - g_bytes_get_size (value)); - g_bytes_unref (value); - } - - value = egg_asn1x_get_bits_as_raw (egg_asn1x_node (asn, "signature", NULL), &bits); - _gcr_display_view_append_hex (view, renderer, _("Signature"), - g_bytes_get_data (value, NULL), bits / 8); - g_bytes_unref (value); -} - -void -_gcr_certificate_renderer_append_extension (GcrRenderer *renderer, - GcrDisplayView *view, - GNode *node) -{ - GQuark oid; - GBytes *value; - gboolean critical; - gboolean ret = FALSE; - - /* Dig out the OID */ - oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (node, "extnID", NULL)); - g_return_if_fail (oid); - - /* Extension value */ - value = egg_asn1x_get_string_as_bytes (egg_asn1x_node (node, "extnValue", NULL)); - - /* The custom parsers */ - if (oid == GCR_OID_BASIC_CONSTRAINTS) - ret = append_extension_basic_constraints (renderer, view, value); - else if (oid == GCR_OID_EXTENDED_KEY_USAGE) - ret = append_extension_extended_key_usage (renderer, view, value); - else if (oid == GCR_OID_SUBJECT_KEY_IDENTIFIER) - ret = append_extension_subject_key_identifier (renderer, view, value); - else if (oid == GCR_OID_KEY_USAGE) - ret = append_extension_key_usage (renderer, view, value); - else if (oid == GCR_OID_SUBJECT_ALT_NAME) - ret = append_extension_subject_alt_name (renderer, view, value); - - /* Otherwise the default raw display */ - if (ret == FALSE) - ret = append_extension_hex (renderer, view, oid, - g_bytes_get_data (value, NULL), - g_bytes_get_size (value)); - - /* Critical */ - if (ret == TRUE && egg_asn1x_get_boolean (egg_asn1x_node (node, "critical", NULL), &critical)) { - _gcr_display_view_append_value (view, renderer, _("Critical"), - critical ? _("Yes") : _("No"), FALSE); - } -} diff --git a/ui/gcr-certificate-renderer.h b/ui/gcr-certificate-renderer.h deleted file mode 100644 index c5a6c92..0000000 --- a/ui/gcr-certificate-renderer.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_CERTIFICATE_RENDERER_H__ -#define __GCR_CERTIFICATE_RENDERER_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-certificate.h" -#include "gcr/gcr-types.h" - -#include "gcr-renderer.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_CERTIFICATE_RENDERER (gcr_certificate_renderer_get_type ()) -#define GCR_CERTIFICATE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRenderer)) -#define GCR_CERTIFICATE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererClass)) -#define GCR_IS_CERTIFICATE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_RENDERER)) -#define GCR_IS_CERTIFICATE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_RENDERER)) -#define GCR_CERTIFICATE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_RENDERER, GcrCertificateRendererClass)) - -typedef struct _GcrCertificateRenderer GcrCertificateRenderer; -typedef struct _GcrCertificateRendererClass GcrCertificateRendererClass; -typedef struct _GcrCertificateRendererPrivate GcrCertificateRendererPrivate; - -struct _GcrCertificateRenderer { - GObject parent; - - /*< private >*/ - GcrCertificateRendererPrivate *pv; -}; - -struct _GcrCertificateRendererClass { - GObjectClass parent_class; -}; - -GType gcr_certificate_renderer_get_type (void); - -GcrCertificateRenderer* gcr_certificate_renderer_new (GcrCertificate *certificate); - -GcrCertificateRenderer* gcr_certificate_renderer_new_for_attributes (const gchar *label, - struct _GckAttributes *attrs); - -GcrCertificate* gcr_certificate_renderer_get_certificate (GcrCertificateRenderer *self); - -void gcr_certificate_renderer_set_certificate (GcrCertificateRenderer *self, - GcrCertificate *certificate); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateRenderer, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_CERTIFICATE_RENDERER_H__ */ diff --git a/ui/gcr-certificate-request-renderer.c b/ui/gcr-certificate-request-renderer.c deleted file mode 100644 index f239a9b..0000000 --- a/ui/gcr-certificate-request-renderer.c +++ /dev/null @@ -1,531 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-oids.h" -#include "gcr/gcr-subject-public-key.h" - -#include "gcr-certificate-renderer-private.h" -#include "gcr-certificate-request-renderer.h" -#include "gcr-display-view.h" - -#include "egg/egg-asn1x.h" -#include "egg/egg-asn1-defs.h" -#include "egg/egg-dn.h" -#include "egg/egg-oid.h" - -#include "gck/gck.h" - -#include <glib/gi18n-lib.h> - -/** - * GcrCertificateRequestRenderer: - * - * An implementation of #GcrRenderer which renders certificate requests - */ - -/** - * GcrCertificateRequestRendererClass: - * @parent_class: The parent class - * - * The class for #GcrCertificateRequestRenderer - */ - -enum { - PROP_0, - PROP_LABEL, - PROP_ATTRIBUTES -}; - -struct _GcrCertificateRequestRendererPrivate { - GckAttributes *attrs; - gchar *label; - - guint key_size; - gulong type; - GNode *asn; -}; - -static void _gcr_certificate_request_renderer_iface (GcrRendererIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrCertificateRequestRenderer, _gcr_certificate_request_renderer, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrCertificateRequestRenderer); - G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, _gcr_certificate_request_renderer_iface); -); - -static gchar* -calculate_label (GcrCertificateRequestRenderer *self) -{ - gchar *label = NULL; - - if (self->pv->label) - return g_strdup (self->pv->label); - - if (self->pv->attrs) { - if (gck_attributes_find_string (self->pv->attrs, CKA_LABEL, &label)) - return label; - } - - if (self->pv->asn && self->pv->type == CKQ_GCR_PKCS10) { - label = egg_dn_read_part (egg_asn1x_node (self->pv->asn, - "certificationRequestInfo", - "subject", - "rdnSequence", - NULL), "CN"); - } - - if (label != NULL) - return label; - - return g_strdup (_("Certificate request")); -} - -static void -_gcr_certificate_request_renderer_init (GcrCertificateRequestRenderer *self) -{ - self->pv = _gcr_certificate_request_renderer_get_instance_private (self); -} - -static void -_gcr_certificate_request_renderer_finalize (GObject *obj) -{ - GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj); - - if (self->pv->attrs) - gck_attributes_unref (self->pv->attrs); - self->pv->attrs = NULL; - - g_free (self->pv->label); - self->pv->label = NULL; - - egg_asn1x_destroy (self->pv->asn); - - G_OBJECT_CLASS (_gcr_certificate_request_renderer_parent_class)->finalize (obj); -} - -static void -_gcr_certificate_request_renderer_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj); - - switch (prop_id) { - case PROP_LABEL: - g_free (self->pv->label); - self->pv->label = g_value_dup_string (value); - g_object_notify (obj, "label"); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - break; - case PROP_ATTRIBUTES: - _gcr_certificate_request_renderer_set_attributes (self, g_value_get_boxed (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_certificate_request_renderer_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GcrCertificateRequestRenderer *self = GCR_CERTIFICATE_REQUEST_RENDERER (obj); - - switch (prop_id) { - case PROP_LABEL: - g_value_take_string (value, calculate_label (self)); - break; - case PROP_ATTRIBUTES: - g_value_set_boxed (value, self->pv->attrs); - break; - default: - gcr_certificate_mixin_get_property (obj, prop_id, value, pspec); - break; - } -} - -static void -_gcr_certificate_request_renderer_class_init (GcrCertificateRequestRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GckBuilder builder = GCK_BUILDER_INIT; - - gobject_class->finalize = _gcr_certificate_request_renderer_finalize; - gobject_class->set_property = _gcr_certificate_request_renderer_set_property; - gobject_class->get_property = _gcr_certificate_request_renderer_get_property; - - /** - * GcrCertificateRequestRenderer:attributes: - * - * The certificate attributes to display. One of the attributes must be - * a CKA_VALUE type attribute which contains a DER encoded certificate. - */ - g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, - g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes", - GCK_TYPE_ATTRIBUTES, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrCertificateRequestRenderer:label: - * - * The label to display. - */ - g_object_class_install_property (gobject_class, PROP_LABEL, - g_param_spec_string ("label", "Label", "Certificate Label", - "", - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /* Register this as a renderer which can be loaded */ - gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_CERTIFICATE_REQUEST); - gck_builder_add_ulong (&builder, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_PKCS10); - gcr_renderer_register (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, gck_builder_end (&builder)); - - gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_CERTIFICATE_REQUEST); - gck_builder_add_ulong (&builder, CKA_GCR_CERTIFICATE_REQUEST_TYPE, CKQ_GCR_SPKAC); - gcr_renderer_register (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, gck_builder_end (&builder)); -} - -static gboolean -append_extension_request (GcrRenderer *renderer, - GcrDisplayView *view, - GNode *attribute) -{ - GBytes *value; - GNode *node; - GNode *asn; - guint i; - - node = egg_asn1x_node (attribute, "values", 1, NULL); - if (node == NULL) - return FALSE; - - value = egg_asn1x_get_element_raw (node); - asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "ExtensionRequest", value); - if (asn == NULL) - return FALSE; - - for (i = 1; TRUE; i++) { - node = egg_asn1x_node (asn, i, NULL); - if (node == NULL) - break; - _gcr_certificate_renderer_append_extension (renderer, view, node); - } - - egg_asn1x_destroy (asn); - return TRUE; -} - -static void -append_attribute (GcrRenderer *renderer, - GcrDisplayView *view, - GNode *attribute) -{ - GQuark oid; - GBytes *value; - const gchar *text; - GNode *node; - gboolean ret = FALSE; - gint i; - - /* Dig out the OID */ - oid = egg_asn1x_get_oid_as_quark (egg_asn1x_node (attribute, "type", NULL)); - g_return_if_fail (oid); - - if (oid == GCR_OID_PKCS9_ATTRIBUTE_EXTENSION_REQ) - ret = append_extension_request (renderer, view, attribute); - - if (!ret) { - _gcr_display_view_append_heading (view, renderer, _("Attribute")); - - /* Extension type */ - text = egg_oid_get_description (oid); - _gcr_display_view_append_value (view, renderer, _("Type"), text, FALSE); - - for (i = 1; TRUE; i++) { - node = egg_asn1x_node (attribute, "values", i, NULL); - if (node == NULL) - break; - value = egg_asn1x_get_element_raw (node); - _gcr_display_view_append_hex (view, renderer, _("Value"), - g_bytes_get_data (value, NULL), - g_bytes_get_size (value)); - g_bytes_unref (value); - } - } -} - -static guint -ensure_key_size (GcrCertificateRequestRenderer *self, - GNode *public_key) -{ - if (self->pv->key_size) - return self->pv->key_size; - - self->pv->key_size = _gcr_subject_public_key_calculate_size (public_key); - return self->pv->key_size; -} - -static void -render_pkcs10_certificate_req (GcrCertificateRequestRenderer *self, - GcrDisplayView *view) -{ - GcrRenderer *renderer = GCR_RENDERER (self); - GNode *public_key; - GNode *attribute; - GNode *subject; - gchar *display; - gulong version; - guint bits; - guint i; - - display = calculate_label (self); - _gcr_display_view_append_title (view, renderer, display); - g_free (display); - - _gcr_display_view_append_content (view, renderer, _("Certificate request"), NULL); - - subject = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", - "subject", "rdnSequence", NULL); - display = egg_dn_read_part (subject, "CN"); - _gcr_display_view_append_content (view, renderer, _("Identity"), display); - g_free (display); - - _gcr_display_view_start_details (view, renderer); - - /* The subject */ - _gcr_display_view_append_heading (view, renderer, _("Subject Name")); - _gcr_certificate_renderer_append_distinguished_name (renderer, view, subject); - - /* The certificate request type */ - _gcr_display_view_append_heading (view, renderer, _("Certificate request")); - _gcr_display_view_append_value (view, renderer, _("Type"), "PKCS#10", FALSE); - if (!egg_asn1x_get_integer_as_ulong (egg_asn1x_node (self->pv->asn, - "certificationRequestInfo", - "version", NULL), &version)) - g_return_if_reached (); - display = g_strdup_printf ("%lu", version + 1); - _gcr_display_view_append_value (view, renderer, _("Version"), display, FALSE); - g_free (display); - - _gcr_display_view_append_heading (view, renderer, _("Public Key Info")); - public_key = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", "subjectPKInfo", NULL); - bits = ensure_key_size (self, public_key); - _gcr_certificate_renderer_append_subject_public_key (renderer, view, - bits, public_key); - - /* Attributes */ - for (i = 1; TRUE; ++i) { - /* Make sure it is present */ - attribute = egg_asn1x_node (self->pv->asn, "certificationRequestInfo", "attributes", i, NULL); - if (attribute == NULL) - break; - append_attribute (renderer, view, attribute); - } - - /* Signature */ - _gcr_display_view_append_heading (view, renderer, _("Signature")); - _gcr_certificate_renderer_append_signature (renderer, view, self->pv->asn); -} - -static void -render_spkac_certificate_req (GcrCertificateRequestRenderer *self, - GcrDisplayView *view) -{ - GcrRenderer *renderer = GCR_RENDERER (self); - GNode *public_key; - gchar *display; - guint bits; - - display = calculate_label (self); - _gcr_display_view_append_title (view, renderer, display); - g_free (display); - - _gcr_display_view_append_content (view, renderer, _("Certificate request"), NULL); - - _gcr_display_view_start_details (view, renderer); - - /* The certificate request type */ - _gcr_display_view_append_heading (view, renderer, _("Certificate request")); - _gcr_display_view_append_value (view, renderer, _("Type"), "SPKAC", FALSE); - - display = egg_asn1x_get_string_as_utf8 (egg_asn1x_node (self->pv->asn, "publicKeyAndChallenge", - "challenge", NULL), NULL); - _gcr_display_view_append_value (view, renderer, _("Challenge"), display, FALSE); - g_free (display); - - _gcr_display_view_append_heading (view, renderer, _("Public Key Info")); - public_key = egg_asn1x_node (self->pv->asn, "publicKeyAndChallenge", "spki", NULL); - bits = ensure_key_size (self, public_key); - _gcr_certificate_renderer_append_subject_public_key (renderer, view, - bits, public_key); - - /* Signature */ - _gcr_display_view_append_heading (view, renderer, _("Signature")); - _gcr_certificate_renderer_append_signature (renderer, view, self->pv->asn); -} - -static void -gcr_certificate_request_renderer_render (GcrRenderer *renderer, - GcrViewer *viewer) -{ - GcrCertificateRequestRenderer *self; - GcrDisplayView *view; - GIcon *icon; - - self = GCR_CERTIFICATE_REQUEST_RENDERER (renderer); - - if (GCR_IS_DISPLAY_VIEW (viewer)) { - view = GCR_DISPLAY_VIEW (viewer); - - } else { - g_warning ("GcrCertificateRequestRenderer only works with internal specific " - "GcrViewer returned by gcr_viewer_new()."); - return; - } - - _gcr_display_view_begin (view, renderer); - - icon = g_themed_icon_new ("dialog-question"); - _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon); - g_object_unref (icon); - - switch (self->pv->type) { - case CKQ_GCR_PKCS10: - render_pkcs10_certificate_req (self, view); - break; - case CKQ_GCR_SPKAC: - render_spkac_certificate_req (self, view); - break; - default: - g_warning ("unknown request type in GcrCertificateRequestRenderer"); - break; - } - - _gcr_display_view_end (view, renderer); -} - -static void -_gcr_certificate_request_renderer_iface (GcrRendererIface *iface) -{ - iface->render_view = gcr_certificate_request_renderer_render; -} - -/** - * gcr_certificate_request_renderer_new_for_attributes: - * @label: (nullable): the label to display - * @attrs: the attributes to display - * - * Create a new certificate request renderer to display the label and attributes. - * One of the attributes should be a CKA_VALUE type attribute containing a DER - * encoded PKCS#10 certificate request or an SPKAC request. - * - * Returns: (transfer full): a newly allocated #GcrCertificateRequestRenderer, which - * should be released with g_object_unref() - */ -GcrRenderer * -_gcr_certificate_request_renderer_new_for_attributes (const gchar *label, - GckAttributes *attrs) -{ - return g_object_new (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, - "label", label, - "attributes", attrs, - NULL); -} - -/** - * gcr_certificate_request_renderer_get_attributes: - * @self: the renderer - * - * Get the PKCS#11 attributes, if any, set for this renderer to display. - * - * Returns: (nullable) (transfer none): the attributes, owned by the renderer - */ -GckAttributes * -_gcr_certificate_request_renderer_get_attributes (GcrCertificateRequestRenderer *self) -{ - g_return_val_if_fail (GCR_IS_CERTIFICATE_REQUEST_RENDERER (self), NULL); - return self->pv->attrs; -} - -/** - * gcr_certificate_request_renderer_set_attributes: - * @self: the renderer - * @attrs: (nullable): attributes to set - * - * Set the PKCS#11 attributes for this renderer to display. One of the attributes - * should be a `CKA_VALUE` type attribute containing a DER encoded PKCS#10 - * certificate request or an SPKAC request. - */ -void -_gcr_certificate_request_renderer_set_attributes (GcrCertificateRequestRenderer *self, - GckAttributes *attrs) -{ - const GckAttribute *value; - GNode *asn = NULL; - gulong type = 0; - GBytes *bytes; - - g_return_if_fail (GCR_IS_CERTIFICATE_REQUEST_RENDERER (self)); - - if (attrs) { - value = gck_attributes_find (attrs, CKA_VALUE); - if (value == NULL) { - g_warning ("no CKA_VALUE found in attributes passed to " - "GcrCertificateRequestRenderer attributes property"); - return; - } - - bytes = g_bytes_new_with_free_func (value->value, value->length, - gck_attributes_unref, gck_attributes_ref (attrs)); - - asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "pkcs-10-CertificationRequest", bytes); - if (asn != NULL) { - type = CKQ_GCR_PKCS10; - } else { - asn = egg_asn1x_create_and_decode (pkix_asn1_tab, "SignedPublicKeyAndChallenge", bytes); - if (asn != NULL) { - type = CKQ_GCR_SPKAC; - } else { - g_warning ("the data contained in the CKA_VALUE attribute passed to " - "GcrCertificateRequestRenderer was not valid DER encoded PKCS#10 " - "or SPKAC"); - } - } - - g_bytes_unref (bytes); - - if (type == 0) - return; - - gck_attributes_ref (attrs); - } - - if (self->pv->attrs) - gck_attributes_unref (self->pv->attrs); - self->pv->attrs = attrs; - self->pv->asn = asn; - self->pv->type = type; - self->pv->key_size = 0; /* calculated later */ - - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - g_object_notify (G_OBJECT (self), "attributes"); -} diff --git a/ui/gcr-certificate-request-renderer.h b/ui/gcr-certificate-request-renderer.h deleted file mode 100644 index d43d8fe..0000000 --- a/ui/gcr-certificate-request-renderer.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_CERTIFICATE_REQUEST_RENDERER_H__ -#define __GCR_CERTIFICATE_REQUEST_RENDERER_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-certificate.h" -#include "gcr/gcr-types.h" - -#include "gcr-renderer.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_CERTIFICATE_REQUEST_RENDERER (_gcr_certificate_request_renderer_get_type ()) -#define GCR_CERTIFICATE_REQUEST_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRenderer)) -#define GCR_CERTIFICATE_REQUEST_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRendererClass)) -#define GCR_IS_CERTIFICATE_REQUEST_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER)) -#define GCR_IS_CERTIFICATE_REQUEST_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER)) -#define GCR_CERTIFICATE_REQUEST_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_REQUEST_RENDERER, GcrCertificateRequestRendererClass)) - -typedef struct _GcrCertificateRequestRenderer GcrCertificateRequestRenderer; -typedef struct _GcrCertificateRequestRendererClass GcrCertificateRequestRendererClass; -typedef struct _GcrCertificateRequestRendererPrivate GcrCertificateRequestRendererPrivate; - -struct _GcrCertificateRequestRenderer { - GObject parent; - - /*< private >*/ - GcrCertificateRequestRendererPrivate *pv; -}; - -struct _GcrCertificateRequestRendererClass { - GObjectClass parent_class; -}; - -GType _gcr_certificate_request_renderer_get_type (void); - -GcrRenderer * _gcr_certificate_request_renderer_new_for_attributes (const gchar *label, - struct _GckAttributes *attrs); - -GckAttributes * _gcr_certificate_request_renderer_get_attributes (GcrCertificateRequestRenderer *self); - -void _gcr_certificate_request_renderer_set_attributes (GcrCertificateRequestRenderer *self, - GckAttributes *attrs); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateRequestRenderer, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_CERTIFICATE_REQUEST_RENDERER_H__ */ diff --git a/ui/gcr-certificate-widget.c b/ui/gcr-certificate-widget.c deleted file mode 100644 index 731ccee..0000000 --- a/ui/gcr-certificate-widget.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-certificate.h" - -#include "gcr-certificate-renderer.h" -#include "gcr-certificate-widget.h" -#include "gcr-deprecated.h" -#include "gcr-renderer.h" -#include "gcr-viewer.h" - -#include "gck/gck.h" - -#include <gdk/gdk.h> -#include <glib/gi18n-lib.h> - -/** - * GcrCertificateWidget: - * - * A widget that can be used to display a certificate. - * - * A certificate widget is normally in a collapsed state showing only - * details, but can be expanded by the user. - * - * Use [ctor@CertificateWidget.new] to create a new certificate widget. Only - * one certificate can be displayed. It contains a [iface@Viewer] internally - * and [class@CertificateRenderer] is used to render the certificate to the - * viewer. - * - * To show more than one certificate in a view, create the viewer and - * add renderers to it. - */ - -enum { - PROP_0, - PROP_CERTIFICATE, - PROP_ATTRIBUTES -}; - -struct _GcrCertificateWidgetPrivate { - GcrViewer *viewer; - GcrCertificateRenderer *renderer; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GcrCertificateWidget, gcr_certificate_widget, GTK_TYPE_BIN); - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static GObject* -gcr_certificate_widget_constructor (GType type, guint n_props, GObjectConstructParam *props) -{ - GObject *obj = G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->constructor (type, n_props, props); - GcrCertificateWidget *self = NULL; - - g_return_val_if_fail (obj, NULL); - - self = GCR_CERTIFICATE_WIDGET (obj); - - self->pv->viewer = gcr_viewer_new_scrolled (); - gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->viewer)); - gtk_widget_show (GTK_WIDGET (self->pv->viewer)); - - gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (self->pv->renderer)); - return obj; -} - -static void -gcr_certificate_widget_init (GcrCertificateWidget *self) -{ - self->pv = gcr_certificate_widget_get_instance_private (self); - self->pv->renderer = gcr_certificate_renderer_new (NULL); -} - -static void -gcr_certificate_widget_finalize (GObject *obj) -{ - GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj); - - g_assert (self->pv->renderer); - g_object_unref (self->pv->renderer); - self->pv->renderer = NULL; - - g_assert (self->pv->viewer); - self->pv->viewer = NULL; - - G_OBJECT_CLASS (gcr_certificate_widget_parent_class)->finalize (obj); -} - -static void -gcr_certificate_widget_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj); - - switch (prop_id) { - case PROP_CERTIFICATE: - gcr_certificate_widget_set_certificate (self, g_value_get_object (value)); - break; - case PROP_ATTRIBUTES: - gcr_certificate_widget_set_attributes (self, g_value_get_boxed (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_certificate_widget_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrCertificateWidget *self = GCR_CERTIFICATE_WIDGET (obj); - - switch (prop_id) { - case PROP_CERTIFICATE: - g_value_set_object (value, gcr_certificate_widget_get_certificate (self)); - break; - case PROP_ATTRIBUTES: - g_value_set_boxed (value, gcr_certificate_widget_get_attributes (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_certificate_widget_class_init (GcrCertificateWidgetClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gcr_certificate_widget_parent_class = g_type_class_peek_parent (klass); - - gobject_class->constructor = gcr_certificate_widget_constructor; - gobject_class->finalize = gcr_certificate_widget_finalize; - gobject_class->set_property = gcr_certificate_widget_set_property; - gobject_class->get_property = gcr_certificate_widget_get_property; - - g_object_class_install_property (gobject_class, PROP_CERTIFICATE, - g_param_spec_object("certificate", "Certificate", "Certificate to display.", - GCR_TYPE_CERTIFICATE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, - g_param_spec_boxed ("attributes", "Attributes", "Attributes which contain the certificate", - GCK_TYPE_ATTRIBUTES, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_certificate_widget_new: - * @certificate: (nullable): certificate to display, or %NULL - * - * Create a new certificate widget which displays a given certificate. - * - * Returns: (transfer full): a new certificate widget - */ -GcrCertificateWidget * -gcr_certificate_widget_new (GcrCertificate *certificate) -{ - return g_object_new (GCR_TYPE_CERTIFICATE_WIDGET, "certificate", certificate, NULL); -} - -/** - * gcr_certificate_widget_get_certificate: - * @self: The certificate widget - * - * Get the certificate displayed in the widget. - * - * Returns: (nullable) (transfer none): the certificate - */ -GcrCertificate * -gcr_certificate_widget_get_certificate (GcrCertificateWidget *self) -{ - g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL); - return gcr_certificate_renderer_get_certificate (self->pv->renderer); -} - -/** - * gcr_certificate_widget_set_certificate: - * @self: The certificate widget - * @certificate: (nullable): the certificate to display - * - * Set the certificate displayed in the widget - */ -void -gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, GcrCertificate *certificate) -{ - g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self)); - gcr_certificate_renderer_set_certificate (self->pv->renderer, certificate); -} - -/** - * gcr_certificate_widget_get_attributes: - * @self: The certificate widget - * - * Get the attributes displayed in the widget. The attributes should contain - * a certificate. - * - * Returns: (nullable) (transfer none): the attributes, owned by the widget - */ -GckAttributes * -gcr_certificate_widget_get_attributes (GcrCertificateWidget *self) -{ - g_return_val_if_fail (GCR_IS_CERTIFICATE_WIDGET (self), NULL); - return gcr_renderer_get_attributes (GCR_RENDERER (self->pv->renderer)); -} - -/** - * gcr_certificate_widget_set_attributes: - * @self: The certificate widget - * @attrs: (nullable): the attributes to display - * - * Set the attributes displayed in the widget. The attributes should contain - * a certificate. - */ -void -gcr_certificate_widget_set_attributes (GcrCertificateWidget *self, - GckAttributes *attrs) -{ - g_return_if_fail (GCR_IS_CERTIFICATE_WIDGET (self)); - gcr_renderer_set_attributes (GCR_RENDERER (self->pv->renderer), attrs); -} diff --git a/ui/gcr-certificate-widget.h b/ui/gcr-certificate-widget.h deleted file mode 100644 index c6727a6..0000000 --- a/ui/gcr-certificate-widget.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_CERTIFICATE_WIDGET_H__ -#define __GCR_CERTIFICATE_WIDGET_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-certificate.h" -#include "gcr/gcr-types.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_CERTIFICATE_WIDGET (gcr_certificate_widget_get_type ()) -#define GCR_CERTIFICATE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidget)) -#define GCR_CERTIFICATE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetClass)) -#define GCR_IS_CERTIFICATE_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_CERTIFICATE_WIDGET)) -#define GCR_IS_CERTIFICATE_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_CERTIFICATE_WIDGET)) -#define GCR_CERTIFICATE_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_CERTIFICATE_WIDGET, GcrCertificateWidgetClass)) - -typedef struct _GcrCertificateWidget GcrCertificateWidget; -typedef struct _GcrCertificateWidgetClass GcrCertificateWidgetClass; -typedef struct _GcrCertificateWidgetPrivate GcrCertificateWidgetPrivate; - -struct _GcrCertificateWidget { - /*< private >*/ - GtkBin parent; - GcrCertificateWidgetPrivate *pv; -}; - -struct _GcrCertificateWidgetClass { - /*< private >*/ - GtkBinClass parent_class; -}; - -GType gcr_certificate_widget_get_type (void); - -GcrCertificateWidget* gcr_certificate_widget_new (GcrCertificate *certificate); - -GcrCertificate* gcr_certificate_widget_get_certificate (GcrCertificateWidget *self); - -void gcr_certificate_widget_set_certificate (GcrCertificateWidget *self, - GcrCertificate *certificate); - -GckAttributes * gcr_certificate_widget_get_attributes (GcrCertificateWidget *self); - -void gcr_certificate_widget_set_attributes (GcrCertificateWidget *self, - GckAttributes *attrs); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCertificateWidget, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_CERTIFICATE_WIDGET_H__ */ diff --git a/ui/gcr-collection-model.c b/ui/gcr-collection-model.c deleted file mode 100644 index f2d0736..0000000 --- a/ui/gcr-collection-model.c +++ /dev/null @@ -1,1654 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr-collection-model.h" - -#include "ui/gcr-enum-types.h" - -#include <gtk/gtk.h> - -#include <string.h> -#include <unistd.h> - -/** - * GcrCollectionModel: - * - * Ain implementation of a [iface@Gtk.TreeModel] which contains a row for each - * object in a [iface@Gcr.Collection]. - * - * As objects are added or removed from the collection, rows are added and - * removed from this model. - * - * The row values come from the properties of the objects in the collection. Use - * [ctor@CollectionModel.new] to create a new collection model. To have more - * control over the values use a set of [struct@Gcr.Column] structures to - * define the columns. This can be done with [ctor@CollectionModel.new_full] or - * [method@CollectionModel.set_columns]. - * - * Each row can have a selected state, which is represented by a boolean column. - * The selected state can be toggled with gcr_collection_model_toggle_selected() - * or set with gcr_collection_model_set_selected_objects() and retrieved with - * [method@CollectionModel.get_selected_objects]. - * - * To determine which object a row represents and vice versa, use the - * [method@CollectionModel.iter_for_object] or - * [method@CollectionModel.object_for_iter] functions. - */ - -/** - * GcrCollectionModelClass: - * @parent_class: The parent class - * - * The class for #GcrCollectionModel. - */ - -/** - * GcrCollectionModelMode: - * @GCR_COLLECTION_MODEL_LIST: only objects in the top collection, no child objects - * @GCR_COLLECTION_MODEL_TREE: show objects in the collection, and child objects in a tree form - * - * If a [class@CollectionModel] is created with a mode of - * %GCR_COLLECTION_MODEL_TREE, then any included objects that are themselves a - * [iface@Gcr.Collection], will have all child - * objects include as child rows in a tree form. - */ - -#define COLLECTION_MODEL_STAMP 0xAABBCCDD - -enum { - PROP_0, - PROP_COLLECTION, - PROP_COLUMNS, - PROP_MODE -}; - -typedef struct { - GObject *object; - GSequenceIter *parent; - GSequence *children; -} GcrCollectionRow; - -typedef struct { - GtkTreeIterCompareFunc sort_func; - gpointer user_data; - GDestroyNotify destroy_func; -} GcrCollectionSortClosure; - -typedef struct _GcrCollectionColumn { - gchar *property; - GType *type; - GtkTreeIterCompareFunc sort_func; - gpointer sort_data; - GDestroyNotify sort_destroy; -} GcrCollectionColumn; - -struct _GcrCollectionModelPrivate { - GcrCollectionModelMode mode; - GcrCollection *collection; - GHashTable *selected; - GSequence *root_sequence; - GHashTable *object_to_seq; - - const GcrColumn *columns; - guint n_columns; - - /* Sort information */ - gint sort_column_id; - GtkSortType sort_order_type; - GcrCollectionSortClosure *column_sort_closures; - GcrCollectionSortClosure default_sort_closure; - - /* Sequence ordering information */ - GCompareDataFunc order_current; - gpointer order_argument; -}; - -/* Forward declarations */ -static void gcr_collection_model_tree_model_init (GtkTreeModelIface *iface); -static void gcr_collection_model_tree_sortable_init (GtkTreeSortableIface *iface); - -G_DEFINE_TYPE_EXTENDED (GcrCollectionModel, gcr_collection_model, G_TYPE_OBJECT, 0, - G_ADD_PRIVATE (GcrCollectionModel); - G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, gcr_collection_model_tree_model_init) - G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_SORTABLE, gcr_collection_model_tree_sortable_init) -); - -typedef gint (*CompareValueFunc) (const GValue *va, - const GValue *vb); - -static gint -compare_int_value (const GValue *va, - const GValue *vb) -{ - gint a = g_value_get_int (va); - gint b = g_value_get_int (vb); - if (a > b) return 1; - else if (a < b) return -1; - return 0; -} - -static gint -compare_uint_value (const GValue *va, - const GValue *vb) -{ - guint a = g_value_get_uint (va); - guint b = g_value_get_uint (vb); - if (a > b) return 1; - else if (a < b) return -1; - return 0; -} - -static gint -compare_long_value (const GValue *va, - const GValue *vb) -{ - glong a = g_value_get_long (va); - glong b = g_value_get_long (vb); - if (a > b) return 1; - else if (a < b) return -1; - return 0; -} - -static gint -compare_ulong_value (const GValue *va, - const GValue *vb) -{ - gulong a = g_value_get_ulong (va); - gulong b = g_value_get_ulong (vb); - if (a > b) return 1; - else if (a < b) return -1; - return 0; -} - -static gint -compare_string_value (const GValue *va, - const GValue *vb) -{ - const gchar *a = g_value_get_string (va); - const gchar *b = g_value_get_string (vb); - gchar *case_a; - gchar *case_b; - gboolean ret; - - if (a == b) - return 0; - else if (!a) - return -1; - else if (!b) - return 1; - - case_a = g_utf8_casefold (a, -1); - case_b = g_utf8_casefold (b, -1); - ret = g_utf8_collate (case_a, case_b); - g_free (case_a); - g_free (case_b); - - return ret; -} - -static gint -compare_date_value (const GValue *va, - const GValue *vb) -{ - GDate *a = g_value_get_boxed (va); - GDate *b = g_value_get_boxed (vb); - - if (a == b) - return 0; - else if (!a) - return -1; - else if (!b) - return 1; - else - return g_date_compare (a, b); -} - -static CompareValueFunc -lookup_compare_func (GType type) -{ - switch (type) { - case G_TYPE_INT: - return compare_int_value; - case G_TYPE_UINT: - return compare_uint_value; - case G_TYPE_LONG: - return compare_long_value; - case G_TYPE_ULONG: - return compare_ulong_value; - case G_TYPE_STRING: - return compare_string_value; - } - - if (type == G_TYPE_DATE) - return compare_date_value; - - return NULL; -} - -static gint -order_sequence_by_closure (gconstpointer a, - gconstpointer b, - gpointer user_data) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data); - GcrCollectionSortClosure *closure = self->pv->order_argument; - const GcrCollectionRow *row_a = a; - const GcrCollectionRow *row_b = b; - GtkTreeIter iter_a; - GtkTreeIter iter_b; - - g_assert (closure); - g_assert (closure->sort_func); - - if (!gcr_collection_model_iter_for_object (self, row_a->object, &iter_a)) - g_return_val_if_reached (0); - if (!gcr_collection_model_iter_for_object (self, row_b->object, &iter_b)) - g_return_val_if_reached (0); - - return (closure->sort_func) (GTK_TREE_MODEL (self), - &iter_a, &iter_b, closure->user_data); -} - -static gint -order_sequence_by_closure_reverse (gconstpointer a, - gconstpointer b, - gpointer user_data) -{ - return 0 - order_sequence_by_closure (a, b, user_data); -} - -static gint -order_sequence_as_unsorted (gconstpointer a, - gconstpointer b, - gpointer user_data) -{ - const GcrCollectionRow *row_a = a; - const GcrCollectionRow *row_b = b; - return GPOINTER_TO_INT (row_a->object) - GPOINTER_TO_INT (row_b->object); -} - -static gint -order_sequence_as_unsorted_reverse (gconstpointer a, - gconstpointer b, - gpointer user_data) -{ - const GcrCollectionRow *row_a = a; - const GcrCollectionRow *row_b = b; - return GPOINTER_TO_INT (row_b->object) - GPOINTER_TO_INT (row_a->object); -} - -static void -lookup_object_property (GObject *object, - const gchar *property_name, - GValue *value) -{ - if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), property_name)) - g_object_get_property (object, property_name, value); - - /* Other types have sane defaults */ - else if (G_VALUE_TYPE (value) == G_TYPE_STRING) - g_value_set_string (value, ""); -} - -static gint -order_sequence_by_property (gconstpointer a, - gconstpointer b, - gpointer user_data) -{ - const GcrCollectionRow *row_a = a; - const GcrCollectionRow *row_b = b; - GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data); - const GcrColumn *column = self->pv->order_argument; - GValue value_a = { 0, }; - GValue value_b = { 0, }; - CompareValueFunc compare; - gint ret; - - g_assert (column); - - /* Sort according to property values */ - column = &self->pv->columns[self->pv->sort_column_id]; - g_value_init (&value_a, column->property_type); - lookup_object_property (row_a->object, column->property_name, &value_a); - g_value_init (&value_b, column->property_type); - lookup_object_property (row_b->object, column->property_name, &value_b); - - compare = lookup_compare_func (column->property_type); - g_assert (compare != NULL); - - ret = (compare) (&value_a, &value_b); - - g_value_unset (&value_a); - g_value_unset (&value_b); - - return ret; -} - -static gint -order_sequence_by_property_reverse (gconstpointer a, - gconstpointer b, - gpointer user_data) -{ - return 0 - order_sequence_by_property (a, b, user_data); -} - -static GHashTable* -selected_hash_table_new (void) -{ - return g_hash_table_new (g_direct_hash, g_direct_equal); -} - -static gboolean -sequence_iter_to_tree (GcrCollectionModel *self, - GSequenceIter *seq, - GtkTreeIter *iter) -{ - GcrCollectionRow *row; - - g_return_val_if_fail (seq != NULL, FALSE); - - if (g_sequence_iter_is_end (seq)) - return FALSE; - - row = g_sequence_get (seq); - g_return_val_if_fail (row != NULL && G_IS_OBJECT (row->object), FALSE); - - memset (iter, 0, sizeof (*iter)); - iter->stamp = COLLECTION_MODEL_STAMP; - iter->user_data = row->object; - iter->user_data2 = seq; - return TRUE; -} - -static GSequenceIter * -sequence_iter_for_tree (GcrCollectionModel *self, - GtkTreeIter *iter) -{ - g_return_val_if_fail (iter != NULL, NULL); - g_return_val_if_fail (iter->stamp == COLLECTION_MODEL_STAMP, NULL); - return iter->user_data2; -} - -static GtkTreePath * -sequence_iter_to_path (GcrCollectionModel *self, - GSequenceIter *seq) -{ - GcrCollectionRow *row; - GtkTreePath *path; - - path = gtk_tree_path_new (); - while (seq) { - gtk_tree_path_prepend_index (path, g_sequence_iter_get_position (seq)); - row = g_sequence_get (seq); - seq = row->parent; - } - return path; -} - -static GSequence * -child_sequence_for_tree (GcrCollectionModel *self, - GtkTreeIter *iter) -{ - GcrCollectionRow *row; - GSequenceIter *seq; - - if (iter == NULL) { - return self->pv->root_sequence; - } else { - seq = sequence_iter_for_tree (self, iter); - g_return_val_if_fail (seq != NULL, NULL); - row = g_sequence_get (seq); - return row->children; - } -} - -static void -on_object_notify (GObject *object, GParamSpec *spec, GcrCollectionModel *self) -{ - GtkTreeIter iter; - GtkTreePath *path; - gboolean found = FALSE; - guint i; - - g_return_if_fail (spec->name); - - for (i = 0; i < self->pv->n_columns - 1; ++i) { - g_assert (self->pv->columns[i].property_name); - if (g_str_equal (self->pv->columns[i].property_name, spec->name)) { - found = TRUE; - break; - } - } - - /* Tell the tree view that this row changed */ - if (found) { - if (!gcr_collection_model_iter_for_object (self, object, &iter)) - g_return_if_reached (); - path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), &iter); - g_return_if_fail (path); - gtk_tree_model_row_changed (GTK_TREE_MODEL (self), path, &iter); - gtk_tree_path_free (path); - } -} - -static void -on_object_gone (gpointer unused, GObject *was_object) -{ - g_warning ("object contained in GcrCollection and included in GcrCollectionModel " - "was destroyed before it was removed from the collection"); -} - -static void on_collection_added (GcrCollection *collection, - GObject *object, - gpointer user_data); - -static void on_collection_removed (GcrCollection *collection, - GObject *object, - gpointer user_data); - -static void add_object_to_sequence (GcrCollectionModel *self, - GSequence *sequence, - GSequenceIter *parent, - GObject *object, - gboolean emit); - -static void remove_object_from_sequence (GcrCollectionModel *self, - GSequence *sequence, - GSequenceIter *seq, - GObject *object, - gboolean emit); - -static void -add_children_to_sequence (GcrCollectionModel *self, - GSequence *sequence, - GSequenceIter *parent, - GcrCollection *collection, - GList *children, - GHashTable *exclude, - gboolean emit) -{ - GList *l; - - for (l = children; l; l = g_list_next (l)) { - if (!exclude || g_hash_table_lookup (exclude, l->data) == NULL) - add_object_to_sequence (self, sequence, parent, l->data, emit); - } - - /* Now listen in for any changes */ - g_signal_connect_after (collection, "added", G_CALLBACK (on_collection_added), self); - g_signal_connect_after (collection, "removed", G_CALLBACK (on_collection_removed), self); -} - -static void -add_object_to_sequence (GcrCollectionModel *self, - GSequence *sequence, - GSequenceIter *parent, - GObject *object, - gboolean emit) -{ - GcrCollectionRow *row; - GcrCollection *collection; - GSequenceIter *seq; - GtkTreeIter iter; - GtkTreePath *path; - GList *children; - - g_assert (GCR_IS_COLLECTION_MODEL (self)); - g_assert (G_IS_OBJECT (object)); - g_assert (self->pv->order_current); - - if (g_hash_table_lookup (self->pv->object_to_seq, object)) { - g_warning ("object was already added to the GcrCollectionModel. Perhaps " - "a loop exists in a tree structure?"); - return; - } - - row = g_slice_new0 (GcrCollectionRow); - row->object = object; - row->parent = parent; - row->children = NULL; - - seq = g_sequence_insert_sorted (sequence, row, self->pv->order_current, self); - g_hash_table_insert (self->pv->object_to_seq, object, seq); - g_object_weak_ref (G_OBJECT (object), (GWeakNotify)on_object_gone, self); - g_signal_connect (object, "notify", G_CALLBACK (on_object_notify), self); - - if (emit) { - if (!sequence_iter_to_tree (self, seq, &iter)) - g_assert_not_reached (); - path = sequence_iter_to_path (self, seq); - g_assert (path != NULL); - gtk_tree_model_row_inserted (GTK_TREE_MODEL (self), path, &iter); - gtk_tree_path_free (path); - } - - if (self->pv->mode == GCR_COLLECTION_MODEL_TREE && - GCR_IS_COLLECTION (object)) { - row->children = g_sequence_new (NULL); - collection = GCR_COLLECTION (object); - children = gcr_collection_get_objects (collection); - add_children_to_sequence (self, row->children, seq, - collection, children, NULL, emit); - g_list_free (children); - } -} - -static void -on_collection_added (GcrCollection *collection, - GObject *object, - gpointer user_data) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data); - GSequence *sequence; - GSequenceIter *parent; - GcrCollectionRow *row; - - if (collection == self->pv->collection) { - sequence = self->pv->root_sequence; - parent = NULL; - } else { - parent = g_hash_table_lookup (self->pv->object_to_seq, G_OBJECT (collection)); - row = g_sequence_get (parent); - g_assert (row->children); - sequence = row->children; - } - - add_object_to_sequence (self, sequence, parent, object, TRUE); -} - -static void -remove_children_from_sequence (GcrCollectionModel *self, - GSequence *sequence, - GcrCollection *collection, - GHashTable *exclude, - gboolean emit) -{ - GSequenceIter *seq, *next; - GcrCollectionRow *row; - - g_signal_handlers_disconnect_by_func (collection, on_collection_added, self); - g_signal_handlers_disconnect_by_func (collection, on_collection_removed, self); - - for (seq = g_sequence_get_begin_iter (sequence); - !g_sequence_iter_is_end (seq); seq = next) { - next = g_sequence_iter_next (seq); - row = g_sequence_get (seq); - if (!exclude || g_hash_table_lookup (exclude, row->object) == NULL) - remove_object_from_sequence (self, sequence, seq, row->object, emit); - } -} - -static void -remove_object_from_sequence (GcrCollectionModel *self, - GSequence *sequence, - GSequenceIter *seq, - GObject *object, - gboolean emit) -{ - GcrCollectionRow *row; - GtkTreePath *path = NULL; - - if (emit) { - path = sequence_iter_to_path (self, seq); - g_assert (path != NULL); - } - - row = g_sequence_get (seq); - g_assert (row->object == object); - - g_object_weak_unref (object, on_object_gone, self); - g_signal_handlers_disconnect_by_func (object, on_object_notify, self); - - if (row->children) { - g_assert (self->pv->mode == GCR_COLLECTION_MODEL_TREE); - g_assert (GCR_IS_COLLECTION (object)); - remove_children_from_sequence (self, row->children, - GCR_COLLECTION (object), NULL, emit); - g_assert (g_sequence_get_length (row->children) == 0); - g_sequence_free (row->children); - row->children = NULL; - } - - if (self->pv->selected) - g_hash_table_remove (self->pv->selected, object); - if (!g_hash_table_remove (self->pv->object_to_seq, object)) - g_assert_not_reached (); - - g_sequence_remove (seq); - g_slice_free (GcrCollectionRow, row); - - /* Fire signal for this removed row */ - if (path != NULL) { - gtk_tree_model_row_deleted (GTK_TREE_MODEL (self), path); - gtk_tree_path_free (path); - } - -} - -static void -on_collection_removed (GcrCollection *collection, - GObject *object, - gpointer user_data) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (user_data); - GSequenceIter *seq; - GSequence *sequence; - - seq = g_hash_table_lookup (self->pv->object_to_seq, object); - g_return_if_fail (seq != NULL); - - sequence = g_sequence_iter_get_sequence (seq); - g_assert (sequence != NULL); - - remove_object_from_sequence (self, sequence, seq, object, TRUE); -} - -static void -free_owned_columns (gpointer data) -{ - GcrColumn *columns; - g_assert (data); - - /* Only the property column is in use */ - for (columns = data; columns->property_name; ++columns) - g_free ((gchar*)columns->property_name); - g_free (data); -} - -static GtkTreeModelFlags -gcr_collection_model_real_get_flags (GtkTreeModel *model) -{ - return GTK_TREE_MODEL_ITERS_PERSIST; -} - -static gint -gcr_collection_model_real_get_n_columns (GtkTreeModel *model) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - return self->pv->n_columns; -} - -static GType -gcr_collection_model_real_get_column_type (GtkTreeModel *model, - gint column_id) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - g_return_val_if_fail (column_id >= 0 && column_id <= self->pv->n_columns, 0); - - /* The last is the selected column */ - if (column_id == self->pv->n_columns) - return G_TYPE_BOOLEAN; - - return self->pv->columns[column_id].column_type; -} - -static gboolean -gcr_collection_model_real_get_iter (GtkTreeModel *model, - GtkTreeIter *iter, - GtkTreePath *path) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - const gint *indices; - GSequence *sequence; - GSequenceIter *seq; - GcrCollectionRow *row; - gint count; - gint i; - - sequence = self->pv->root_sequence; - seq = NULL; - - indices = gtk_tree_path_get_indices_with_depth (path, &count); - if (count == 0) - return FALSE; - - for (i = 0; i < count; i++) { - if (!sequence) - return FALSE; - seq = g_sequence_get_iter_at_pos (sequence, indices[i]); - if (g_sequence_iter_is_end (seq)) - return FALSE; - row = g_sequence_get (seq); - sequence = row->children; - } - - return sequence_iter_to_tree (self, seq, iter); -} - -static GtkTreePath* -gcr_collection_model_real_get_path (GtkTreeModel *model, - GtkTreeIter *iter) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - GSequenceIter *seq; - - if (iter == NULL) - return gtk_tree_path_new (); - - seq = sequence_iter_for_tree (self, iter); - g_return_val_if_fail (seq != NULL, NULL); - return sequence_iter_to_path (self, seq); -} - -static void -gcr_collection_model_real_get_value (GtkTreeModel *model, - GtkTreeIter *iter, - gint column_id, - GValue *value) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - GObject *object; - GValue original; - const GcrColumn *column; - GParamSpec *spec; - - object = gcr_collection_model_object_for_iter (self, iter); - g_return_if_fail (G_IS_OBJECT (object)); - g_return_if_fail (column_id >= 0 && column_id < self->pv->n_columns); - - /* The selected column? Last one */ - if (column_id == self->pv->n_columns - 1) { - g_value_init (value, G_TYPE_BOOLEAN); - g_value_set_boolean (value, gcr_collection_model_is_selected (self, iter)); - return; - } - - /* Figure out which property */ - column = &self->pv->columns[column_id]; - g_assert (column->property_name); - g_value_init (value, column->column_type); - - /* Lookup the property on the object */ - spec = g_object_class_find_property (G_OBJECT_GET_CLASS (object), column->property_name); - if (spec != NULL) { - /* A transformer is specified, or mismatched types */ - if (column->transformer || column->column_type != column->property_type) { - memset (&original, 0, sizeof (original)); - g_value_init (&original, column->property_type); - g_object_get_property (object, column->property_name, &original); - - if (column->transformer) { - (column->transformer) (&original, value); - } else { - g_warning ("%s property of %s class was of type %s instead of type %s" - " and cannot be converted due to lack of transformer", - column->property_name, G_OBJECT_TYPE_NAME (object), - g_type_name (column->property_type), - g_type_name (column->column_type)); - spec = NULL; - } - - /* Simple, no transformation necessary */ - } else { - g_object_get_property (object, column->property_name, value); - } - } - - if (spec == NULL) { - - /* All the number types have sane defaults */ - if (column->column_type == G_TYPE_STRING) - g_value_set_string (value, ""); - } -} - -static gboolean -gcr_collection_model_real_iter_next (GtkTreeModel *model, - GtkTreeIter *iter) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - GSequenceIter *seq = sequence_iter_for_tree (self, iter); - g_return_val_if_fail (seq != NULL, FALSE); - return sequence_iter_to_tree (self, g_sequence_iter_next (seq), iter); -} - -static gboolean -gcr_collection_model_real_iter_children (GtkTreeModel *model, - GtkTreeIter *iter, - GtkTreeIter *parent) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - GSequence *sequence = child_sequence_for_tree (self, parent); - return sequence && sequence_iter_to_tree (self, g_sequence_get_begin_iter (sequence), iter); -} - -static gboolean -gcr_collection_model_real_iter_has_child (GtkTreeModel *model, - GtkTreeIter *iter) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - GSequence *sequence = child_sequence_for_tree (self, iter); - return sequence && !g_sequence_iter_is_end (g_sequence_get_begin_iter (sequence)); -} - -static gint -gcr_collection_model_real_iter_n_children (GtkTreeModel *model, - GtkTreeIter *iter) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - GSequence *sequence = child_sequence_for_tree (self, iter); - return sequence ? g_sequence_get_length (sequence) : 0; -} - -static gboolean -gcr_collection_model_real_iter_nth_child (GtkTreeModel *model, - GtkTreeIter *iter, - GtkTreeIter *parent, - gint n) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - GSequence *sequence; - GSequenceIter *seq; - - sequence = child_sequence_for_tree (self, parent); - if (sequence == NULL) - return FALSE; - seq = g_sequence_get_iter_at_pos (sequence, n); - return sequence_iter_to_tree (self, seq, iter); -} - -static gboolean -gcr_collection_model_real_iter_parent (GtkTreeModel *model, - GtkTreeIter *iter, - GtkTreeIter *child) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (model); - GSequenceIter *seq; - GcrCollectionRow *row; - - seq = sequence_iter_for_tree (self, child); - g_return_val_if_fail (seq != NULL, FALSE); - row = g_sequence_get (seq); - if (row->parent == NULL) - return FALSE; - return sequence_iter_to_tree (self, row->parent, iter); -} - -static void -gcr_collection_model_real_ref_node (GtkTreeModel *model, - GtkTreeIter *iter) -{ - /* Nothing to do */ -} - -static void -gcr_collection_model_real_unref_node (GtkTreeModel *model, - GtkTreeIter *iter) -{ - /* Nothing to do */ -} - -static void -gcr_collection_model_tree_model_init (GtkTreeModelIface *iface) -{ - iface->get_flags = gcr_collection_model_real_get_flags; - iface->get_n_columns = gcr_collection_model_real_get_n_columns; - iface->get_column_type = gcr_collection_model_real_get_column_type; - iface->get_iter = gcr_collection_model_real_get_iter; - iface->get_path = gcr_collection_model_real_get_path; - iface->get_value = gcr_collection_model_real_get_value; - iface->iter_next = gcr_collection_model_real_iter_next; - iface->iter_children = gcr_collection_model_real_iter_children; - iface->iter_has_child = gcr_collection_model_real_iter_has_child; - iface->iter_n_children = gcr_collection_model_real_iter_n_children; - iface->iter_nth_child = gcr_collection_model_real_iter_nth_child; - iface->iter_parent = gcr_collection_model_real_iter_parent; - iface->ref_node = gcr_collection_model_real_ref_node; - iface->unref_node = gcr_collection_model_real_unref_node; -} - -static void -collection_resort_sequence (GcrCollectionModel *self, - GSequenceIter *parent, - GSequence *sequence) -{ - GPtrArray *previous; - GSequenceIter *seq, *next; - gint *new_order; - GtkTreePath *path; - GtkTreeIter iter; - GcrCollectionRow *row; - gint index; - gint i; - - /* Make note of how things stand, and at same time resort all kids */ - previous = g_ptr_array_new (); - for (seq = g_sequence_get_begin_iter (sequence); - !g_sequence_iter_is_end (seq); seq = next) { - next = g_sequence_iter_next (seq); - row = g_sequence_get (seq); - if (row->children) - collection_resort_sequence (self, seq, row->children); - g_ptr_array_add (previous, row->object); - } - - if (previous->len == 0) { - g_ptr_array_free (previous, TRUE); - return; - } - - /* Actually perform the sort */ - g_sequence_sort (sequence, self->pv->order_current, self); - - /* Now go through and map out how things changed */ - new_order = g_new0 (gint, previous->len); - for (i = 0; i < previous->len; i++) { - seq = g_hash_table_lookup (self->pv->object_to_seq, previous->pdata[i]); - g_assert (seq != NULL); - index = g_sequence_iter_get_position (seq); - g_assert (index >= 0 && index < previous->len); - new_order[index] = i; - } - - g_ptr_array_free (previous, TRUE); - - path = sequence_iter_to_path (self, parent); - if (parent == NULL) { - gtk_tree_model_rows_reordered (GTK_TREE_MODEL (self), path, NULL, new_order); - } else { - if (!sequence_iter_to_tree (self, parent, &iter)) - g_assert_not_reached (); - gtk_tree_model_rows_reordered (GTK_TREE_MODEL (self), path, &iter, new_order); - } - gtk_tree_path_free (path); - g_free (new_order); -} - -static gboolean -gcr_collection_model_get_sort_column_id (GtkTreeSortable *sortable, - gint *sort_column_id, - GtkSortType *order) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); - - if (order) - *order = self->pv->sort_order_type; - if (sort_column_id) - *sort_column_id = self->pv->sort_column_id; - return (self->pv->sort_column_id != GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID && - self->pv->sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID); -} - -static void -gcr_collection_model_set_sort_column_id (GtkTreeSortable *sortable, - gint sort_column_id, - GtkSortType order) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); - GCompareDataFunc func; - gpointer argument; - const GcrColumn *column; - gboolean reverse; - - reverse = (order == GTK_SORT_DESCENDING); - - if (sort_column_id == GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID) { - func = reverse ? order_sequence_as_unsorted_reverse : order_sequence_as_unsorted; - argument = NULL; - - } else if (sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) { - func = reverse ? order_sequence_by_closure_reverse : order_sequence_by_closure; - argument = &self->pv->default_sort_closure; - - } else if (sort_column_id >= 0 && sort_column_id < self->pv->n_columns) { - if (self->pv->column_sort_closures[sort_column_id].sort_func) { - func = reverse ? order_sequence_by_closure_reverse : order_sequence_by_closure; - argument = &self->pv->column_sort_closures[sort_column_id]; - } else { - column = &self->pv->columns[sort_column_id]; - if (!(column->flags & GCR_COLUMN_SORTABLE)) - return; - if (!lookup_compare_func (column->property_type)) { - g_warning ("no sort implementation defined for type '%s' on column '%s'", - g_type_name (column->property_type), column->property_name); - return; - } - - func = reverse ? order_sequence_by_property_reverse : order_sequence_by_property; - argument = (gpointer)column; - } - } else { - g_warning ("invalid sort_column_id passed to gtk_tree_sortable_set_sort_column_id(): %d", - sort_column_id); - return; - } - - if (sort_column_id != self->pv->sort_column_id || - order != self->pv->sort_order_type) { - self->pv->sort_column_id = sort_column_id; - self->pv->sort_order_type = order; - gtk_tree_sortable_sort_column_changed (sortable); - } - - if (func != self->pv->order_current || - argument != self->pv->order_argument) { - self->pv->order_current = func; - self->pv->order_argument = (gpointer)argument; - collection_resort_sequence (self, NULL, self->pv->root_sequence); - } -} - -static void -clear_sort_closure (GcrCollectionSortClosure *closure) -{ - if (closure->destroy_func) - (closure->destroy_func) (closure->user_data); - closure->sort_func = NULL; - closure->destroy_func = NULL; - closure->user_data = NULL; -} - -static void -set_sort_closure (GcrCollectionSortClosure *closure, - GtkTreeIterCompareFunc func, - gpointer data, - GDestroyNotify destroy) -{ - clear_sort_closure (closure); - closure->sort_func = func; - closure->user_data = data; - closure->destroy_func = destroy; -} - -static void -gcr_collection_model_set_sort_func (GtkTreeSortable *sortable, - gint sort_column_id, - GtkTreeIterCompareFunc func, - gpointer data, - GDestroyNotify destroy) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); - - g_return_if_fail (sort_column_id >= 0 && sort_column_id < self->pv->n_columns); - - set_sort_closure (&self->pv->column_sort_closures[sort_column_id], - func, data, destroy); - - /* Resorts if necessary */ - if (self->pv->sort_column_id == sort_column_id) { - gcr_collection_model_set_sort_column_id (sortable, - self->pv->sort_column_id, - self->pv->sort_order_type); - } -} - -static void -gcr_collection_model_set_default_sort_func (GtkTreeSortable *sortable, - GtkTreeIterCompareFunc func, - gpointer data, GDestroyNotify destroy) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); - - set_sort_closure (&self->pv->default_sort_closure, - func, data, destroy); - - /* Resorts if necessary */ - if (self->pv->sort_column_id == GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID) { - gcr_collection_model_set_sort_column_id (sortable, - self->pv->sort_column_id, - self->pv->sort_order_type); - } -} - -static gboolean -gcr_collection_model_has_default_sort_func (GtkTreeSortable *sortable) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (sortable); - - return (self->pv->default_sort_closure.sort_func != NULL); -} - -static void -gcr_collection_model_tree_sortable_init (GtkTreeSortableIface *iface) -{ - iface->get_sort_column_id = gcr_collection_model_get_sort_column_id; - iface->set_sort_column_id = gcr_collection_model_set_sort_column_id; - iface->set_sort_func = gcr_collection_model_set_sort_func; - iface->set_default_sort_func = gcr_collection_model_set_default_sort_func; - iface->has_default_sort_func = gcr_collection_model_has_default_sort_func; -} - -static void -gcr_collection_model_init (GcrCollectionModel *self) -{ - self->pv = gcr_collection_model_get_instance_private (self); - - self->pv->root_sequence = g_sequence_new (NULL); - self->pv->object_to_seq = g_hash_table_new (g_direct_hash, g_direct_equal); - self->pv->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID; - self->pv->sort_order_type = GTK_SORT_ASCENDING; - self->pv->order_current = order_sequence_as_unsorted; -} - -static void -gcr_collection_model_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (object); - GcrColumn *columns; - - switch (prop_id) { - case PROP_MODE: - self->pv->mode = g_value_get_enum (value); - break; - case PROP_COLLECTION: - gcr_collection_model_set_collection (self, g_value_get_object (value)); - break; - case PROP_COLUMNS: - columns = g_value_get_pointer (value); - if (columns) - gcr_collection_model_set_columns (self, columns); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gcr_collection_model_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (object); - - switch (prop_id) { - case PROP_MODE: - g_value_set_enum (value, self->pv->mode); - break; - case PROP_COLLECTION: - g_value_set_object (value, self->pv->collection); - break; - case PROP_COLUMNS: - g_value_set_pointer (value, (gpointer)self->pv->columns); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -gcr_collection_model_dispose (GObject *object) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (object); - - /* Disconnect from all rows */ - if (self->pv->collection) { - remove_children_from_sequence (self, self->pv->root_sequence, - self->pv->collection, NULL, FALSE); - g_object_unref (self->pv->collection); - self->pv->collection = NULL; - } - - G_OBJECT_CLASS (gcr_collection_model_parent_class)->dispose (object); -} - -static void -gcr_collection_model_finalize (GObject *object) -{ - GcrCollectionModel *self = GCR_COLLECTION_MODEL (object); - guint i; - - g_assert (!self->pv->collection); - - g_assert (g_sequence_get_length (self->pv->root_sequence) == 0); - g_sequence_free (self->pv->root_sequence); - g_assert (g_hash_table_size (self->pv->object_to_seq) == 0); - g_hash_table_destroy (self->pv->object_to_seq); - - if (self->pv->selected) { - g_assert (g_hash_table_size (self->pv->selected) == 0); - g_hash_table_destroy (self->pv->selected); - self->pv->selected = NULL; - } - - self->pv->columns = NULL; - for (i = 0; i < self->pv->n_columns; i++) - clear_sort_closure (&self->pv->column_sort_closures[i]); - g_free (self->pv->column_sort_closures); - clear_sort_closure (&self->pv->default_sort_closure); - - G_OBJECT_CLASS (gcr_collection_model_parent_class)->finalize (object); -} - -static void -gcr_collection_model_class_init (GcrCollectionModelClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - gcr_collection_model_parent_class = g_type_class_peek_parent (klass); - - gobject_class->dispose = gcr_collection_model_dispose; - gobject_class->finalize = gcr_collection_model_finalize; - gobject_class->set_property = gcr_collection_model_set_property; - gobject_class->get_property = gcr_collection_model_get_property; - - g_object_class_install_property (gobject_class, PROP_MODE, - g_param_spec_enum ("mode", "Mode", "Tree or list mode", - GCR_TYPE_COLLECTION_MODEL_MODE, GCR_COLLECTION_MODEL_TREE, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_COLLECTION, - g_param_spec_object ("collection", "Object Collection", "Collection to get objects from", - GCR_TYPE_COLLECTION, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_COLUMNS, - g_param_spec_pointer ("columns", "Columns", "Columns for the model", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); -} - -/** - * gcr_collection_model_new: (skip) - * @collection: the collection to represent - * @mode: whether list or tree mode - * @...: the column names and types - * - * Create a new #GcrCollectionModel. The variable argument list should contain - * pairs of property names, and #GType values. The variable argument list should - * be terminated with %NULL. - * - * Returns: (transfer full): a newly allocated model, which should be released - * with g_object_unref(). - */ -GcrCollectionModel* -gcr_collection_model_new (GcrCollection *collection, - GcrCollectionModelMode mode, - ...) -{ - GcrColumn column; - GcrCollectionModel *self; - const gchar *arg; - GArray *array; - va_list va; - - /* With a null terminator */ - array = g_array_new (TRUE, TRUE, sizeof (GcrColumn)); - - va_start (va, mode); - while ((arg = va_arg (va, const gchar*)) != NULL) { - memset (&column, 0, sizeof (column)); - column.property_name = g_strdup (arg); - column.property_type = va_arg (va, GType); - column.column_type = column.property_type; - g_array_append_val (array, column); - } - va_end (va); - - self = gcr_collection_model_new_full (collection, mode, (GcrColumn*)array->data); - g_object_set_data_full (G_OBJECT (self), "gcr_collection_model_new", - g_array_free (array, FALSE), free_owned_columns); - return self; -} - -/** - * gcr_collection_model_new_full: (skip) - * @collection: the collection to represent - * @mode: whether list or tree mode - * @columns: the columns the model should contain - * - * Create a new #GcrCollectionModel. - * - * Returns: (transfer full): a newly allocated model, which should be released - * with g_object_unref() - */ -GcrCollectionModel* -gcr_collection_model_new_full (GcrCollection *collection, - GcrCollectionModelMode mode, - const GcrColumn *columns) -{ - GcrCollectionModel *self = g_object_new (GCR_TYPE_COLLECTION_MODEL, - "collection", collection, - "mode", mode, - NULL); - gcr_collection_model_set_columns (self, columns); - return self; -} - -/** - * gcr_collection_model_set_columns: (skip) - * @self: The model - * @columns: The columns the model should contain - * - * Set the columns that the model should contain. @columns is an array of - * #GcrColumn structures, with the last one containing %NULL for all values. - * - * This function can only be called once, and only if the model was not created - * without a set of columns. This function cannot be called after the model - * has been added to a view. - * - * The columns are accessed as static data. They should continue to remain - * in memory for longer than the GcrCollectionModel object. - * - * Returns: The number of columns - */ -guint -gcr_collection_model_set_columns (GcrCollectionModel *self, - const GcrColumn *columns) -{ - const GcrColumn *col; - guint n_columns; - - g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), 0); - g_return_val_if_fail (columns, 0); - g_return_val_if_fail (self->pv->n_columns == 0, 0); - - /* Count the number of columns, extra column for selected */ - for (col = columns, n_columns = 1; col->property_name; ++col) - ++n_columns; - - /* We expect the columns to stay around */ - self->pv->columns = columns; - self->pv->n_columns = n_columns; - self->pv->column_sort_closures = g_new0 (GcrCollectionSortClosure, self->pv->n_columns); - - return n_columns - 1; -} - -/** - * gcr_collection_model_get_collection: - * @self: a collection model - * - * Get the collection which this model represents - * - * Returns: (transfer none): the collection, owned by the model - */ -GcrCollection * -gcr_collection_model_get_collection (GcrCollectionModel *self) -{ - g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL); - return self->pv->collection; -} - -/** - * gcr_collection_model_set_collection: - * @self: a collection model - * @collection: (nullable): the collection or %NULL - * - * Set the collection which this model represents - */ -void -gcr_collection_model_set_collection (GcrCollectionModel *self, - GcrCollection *collection) -{ - GcrCollection *previous; - GHashTable *exclude; - GList *children = NULL; - GList *l; - - g_return_if_fail (GCR_IS_COLLECTION_MODEL (self)); - g_return_if_fail (collection == NULL || GCR_IS_COLLECTION (collection)); - - if (collection == self->pv->collection) - return; - - if (collection) - g_object_ref (collection); - previous = self->pv->collection; - self->pv->collection = collection; - - if (collection) - children = gcr_collection_get_objects (collection); - - if (previous) { - exclude = g_hash_table_new (g_direct_hash, g_direct_equal); - for (l = children; l != NULL; l = g_list_next (l)) - g_hash_table_insert (exclude, l->data, l->data); - - remove_children_from_sequence (self, self->pv->root_sequence, - previous, exclude, TRUE); - - g_hash_table_destroy (exclude); - g_object_unref (previous); - } - - if (collection) { - add_children_to_sequence (self, self->pv->root_sequence, - NULL, collection, children, - self->pv->object_to_seq, TRUE); - g_list_free (children); - } - - g_object_notify (G_OBJECT (self), "collection"); -} - -/** - * gcr_collection_model_object_for_iter: - * @self: The model - * @iter: The row - * - * Get the object that is represented by the given row in the model. - * - * Returns: (transfer none): The object, owned by the model. - */ -GObject * -gcr_collection_model_object_for_iter (GcrCollectionModel *self, const GtkTreeIter *iter) -{ - g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL); - g_return_val_if_fail (iter != NULL, NULL); - g_return_val_if_fail (iter->stamp == COLLECTION_MODEL_STAMP, NULL); - g_return_val_if_fail (G_IS_OBJECT (iter->user_data), NULL); - - return G_OBJECT (iter->user_data); -} - -/** - * gcr_collection_model_iter_for_object: - * @self: The model - * @object: The object - * @iter: The row for the object - * - * Set @iter to the row for the given object. If the object is not in this - * model, then %FALSE will be returned. - * - * Returns: %TRUE if the object was present. - */ -gboolean -gcr_collection_model_iter_for_object (GcrCollectionModel *self, GObject *object, - GtkTreeIter *iter) -{ - GSequenceIter *seq; - - g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), FALSE); - g_return_val_if_fail (G_IS_OBJECT (object), FALSE); - g_return_val_if_fail (iter != NULL, FALSE); - - seq = g_hash_table_lookup (self->pv->object_to_seq, object); - if (seq == NULL) - return FALSE; - - return sequence_iter_to_tree (self, seq, iter); -} - -/** - * gcr_collection_model_column_for_selected: - * @self: The model - * - * Get the column identifier for the column that contains the values - * of the selected state. - * - * Returns: The column identifier. - */ -gint -gcr_collection_model_column_for_selected (GcrCollectionModel *self) -{ - g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), 0); - g_assert (self->pv->n_columns > 0); - return self->pv->n_columns - 1; -} - -/** - * gcr_collection_model_toggle_selected: - * @self: The model - * @iter: The row - * - * Toggle the selected state of a given row. - */ -void -gcr_collection_model_toggle_selected (GcrCollectionModel *self, GtkTreeIter *iter) -{ - GObject *object; - - g_return_if_fail (GCR_IS_COLLECTION_MODEL (self)); - - object = gcr_collection_model_object_for_iter (self, iter); - g_return_if_fail (G_IS_OBJECT (object)); - - if (!self->pv->selected) - self->pv->selected = selected_hash_table_new (); - - if (g_hash_table_lookup (self->pv->selected, object)) - g_hash_table_remove (self->pv->selected, object); - else - g_hash_table_insert (self->pv->selected, object, object); -} - -/** - * gcr_collection_model_change_selected: - * @self: The model - * @iter: The row - * @selected: Whether the row should be selected or not. - * - * Set whether a given row is toggled selected or not. - */ -void -gcr_collection_model_change_selected (GcrCollectionModel *self, GtkTreeIter *iter, gboolean selected) -{ - GtkTreePath *path; - GObject *object; - - g_return_if_fail (GCR_IS_COLLECTION_MODEL (self)); - - object = gcr_collection_model_object_for_iter (self, iter); - g_return_if_fail (G_IS_OBJECT (object)); - - if (!self->pv->selected) - self->pv->selected = g_hash_table_new (g_direct_hash, g_direct_equal); - - if (selected) - g_hash_table_insert (self->pv->selected, object, object); - else - g_hash_table_remove (self->pv->selected, object); - - /* Tell the view that this row changed */ - path = gtk_tree_model_get_path (GTK_TREE_MODEL (self), iter); - g_return_if_fail (path); - gtk_tree_model_row_changed (GTK_TREE_MODEL (self), path, iter); - gtk_tree_path_free (path); -} - -/** - * gcr_collection_model_is_selected: - * @self: The model - * @iter: The row - * - * Check whether a given row has been toggled as selected. - * - * Returns: Whether the row has been selected. - */ -gboolean -gcr_collection_model_is_selected (GcrCollectionModel *self, GtkTreeIter *iter) -{ - GObject *object; - - g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), FALSE); - - object = gcr_collection_model_object_for_iter (self, iter); - g_return_val_if_fail (G_IS_OBJECT (object), FALSE); - - if (!self->pv->selected) - return FALSE; - - return g_hash_table_lookup (self->pv->selected, object) ? TRUE : FALSE; -} - -/** - * gcr_collection_model_get_selected_objects: - * @self: the collection model - * - * Get a list of checked/selected objects. - * - * Returns: (transfer container) (element-type GObject.Object): a list of selected - * objects, which should be freed with g_list_free() - */ -GList * -gcr_collection_model_get_selected_objects (GcrCollectionModel *self) -{ - GHashTableIter iter; - GList *result = NULL; - gpointer key; - - g_return_val_if_fail (GCR_IS_COLLECTION_MODEL (self), NULL); - - if (!self->pv->selected) - return NULL; - - g_hash_table_iter_init (&iter, self->pv->selected); - while (g_hash_table_iter_next (&iter, &key, NULL)) - result = g_list_prepend (result, key); - return result; -} - -/** - * gcr_collection_model_set_selected_objects: - * @self: the collection model - * @selected: (element-type GObject.Object): a list of objects to select - * - * Set the checked/selected objects. - */ -void -gcr_collection_model_set_selected_objects (GcrCollectionModel *self, - GList *selected) -{ - GHashTable *newly_selected; - GList *old_selection; - GtkTreeIter iter; - GList *l; - - old_selection = gcr_collection_model_get_selected_objects (self); - newly_selected = selected_hash_table_new (); - - /* Select all the objects in selected which aren't already selected */ - for (l = selected; l; l = g_list_next (l)) { - if (!self->pv->selected || !g_hash_table_lookup (self->pv->selected, l->data)) { - if (!gcr_collection_model_iter_for_object (self, l->data, &iter)) - g_return_if_reached (); - gcr_collection_model_change_selected (self, &iter, TRUE); - } - - /* Note that we've seen this one */ - g_hash_table_insert (newly_selected, l->data, l->data); - } - - /* Unselect all the objects which aren't supposed to be selected */ - for (l = old_selection; l; l = g_list_next (l)) { - if (!g_hash_table_lookup (newly_selected, l->data)) { - if (!gcr_collection_model_iter_for_object (self, l->data, &iter)) - g_return_if_reached (); - gcr_collection_model_change_selected (self, &iter, FALSE); - } - } - - g_list_free (old_selection); - g_hash_table_destroy (newly_selected); -} diff --git a/ui/gcr-collection-model.h b/ui/gcr-collection-model.h deleted file mode 100644 index a202046..0000000 --- a/ui/gcr-collection-model.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_COLLECTION_MODEL_H__ -#define __GCR_COLLECTION_MODEL_H__ - -#include <gtk/gtk.h> - -#include "gcr/gcr-collection.h" -#include "gcr/gcr-column.h" - -typedef enum { - GCR_COLLECTION_MODEL_LIST = 0, - GCR_COLLECTION_MODEL_TREE -} GcrCollectionModelMode; - -#define GCR_TYPE_COLLECTION_MODEL (gcr_collection_model_get_type ()) -#define GCR_COLLECTION_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModel)) -#define GCR_COLLECTION_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelClass)) -#define GCR_IS_COLLECTION_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COLLECTION_MODEL)) -#define GCR_IS_COLLECTION_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COLLECTION_MODEL)) -#define GCR_COLLECTION_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COLLECTION_MODEL, GcrCollectionModelClass)) - -typedef struct _GcrCollectionModel GcrCollectionModel; -typedef struct _GcrCollectionModelClass GcrCollectionModelClass; -typedef struct _GcrCollectionModelPrivate GcrCollectionModelPrivate; - -struct _GcrCollectionModel { - GObject parent; - - /*< private >*/ - GcrCollectionModelPrivate *pv; -}; - -struct _GcrCollectionModelClass { - GObjectClass parent_class; -}; - -GType gcr_collection_model_get_type (void); - -GcrCollectionModel* gcr_collection_model_new (GcrCollection *collection, - GcrCollectionModelMode mode, - ...) G_GNUC_NULL_TERMINATED; - -GcrCollectionModel* gcr_collection_model_new_full (GcrCollection *collection, - GcrCollectionModelMode mode, - const GcrColumn *columns); - -guint gcr_collection_model_set_columns (GcrCollectionModel *self, - const GcrColumn *columns); - -GcrCollection * gcr_collection_model_get_collection (GcrCollectionModel *self); - -void gcr_collection_model_set_collection (GcrCollectionModel *self, - GcrCollection *collection); - -GObject* gcr_collection_model_object_for_iter (GcrCollectionModel *self, - const GtkTreeIter *iter); - -gboolean gcr_collection_model_iter_for_object (GcrCollectionModel *self, - GObject *object, - GtkTreeIter *iter); - -gint gcr_collection_model_column_for_selected (GcrCollectionModel *self); - -void gcr_collection_model_toggle_selected (GcrCollectionModel *self, - GtkTreeIter *iter); - -void gcr_collection_model_change_selected (GcrCollectionModel *self, - GtkTreeIter *iter, - gboolean selected); - -gboolean gcr_collection_model_is_selected (GcrCollectionModel *self, - GtkTreeIter *iter); - -GList* gcr_collection_model_get_selected_objects (GcrCollectionModel *self); - -void gcr_collection_model_set_selected_objects (GcrCollectionModel *self, - GList *selected); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrCollectionModel, g_object_unref) - -#endif /* __GCR_COLLECTION_MODEL_H__ */ diff --git a/ui/gcr-combo-selector.c b/ui/gcr-combo-selector.c deleted file mode 100644 index cac6419..0000000 --- a/ui/gcr-combo-selector.c +++ /dev/null @@ -1,250 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-internal.h" - -#include "gcr-collection-model.h" -#include "gcr-combo-selector.h" - -#include <glib/gi18n-lib.h> - -#include <string.h> - -/** - * GcrComboSelector: - * - * A widget that can be used to select a certificate or key. It allows - * the user to select one object from the selector at a time. - */ - -enum { - PROP_0, - PROP_COLLECTION -}; - -struct _GcrComboSelectorPrivate { - GcrCollection *collection; - GcrCollectionModel *model; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GcrComboSelector, gcr_combo_selector, GTK_TYPE_COMBO_BOX); - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static GObject* -gcr_combo_selector_constructor (GType type, guint n_props, GObjectConstructParam *props) -{ - GcrComboSelector *self = GCR_COMBO_SELECTOR (G_OBJECT_CLASS (gcr_combo_selector_parent_class)->constructor(type, n_props, props)); - GtkCellRenderer *cell; - - g_return_val_if_fail (self, NULL); - - self->pv->model = gcr_collection_model_new (self->pv->collection, - GCR_COLLECTION_MODEL_LIST, - "icon", G_TYPE_ICON, - "markup", G_TYPE_STRING, - NULL); - - gtk_combo_box_set_model (GTK_COMBO_BOX (self), GTK_TREE_MODEL (self->pv->model)); - - /* The icon */ - cell = gtk_cell_renderer_pixbuf_new (); - g_object_set (cell, "stock-size", GTK_ICON_SIZE_DND, NULL); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, FALSE); - gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell, "gicon", 0); - - /* The markup */ - cell = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (self), cell, TRUE); - gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (self), cell, "markup", 1); - - return G_OBJECT (self); -} - -static void -gcr_combo_selector_init (GcrComboSelector *self) -{ - self->pv = gcr_combo_selector_get_instance_private (self); -} - -static void -gcr_combo_selector_dispose (GObject *obj) -{ - GcrComboSelector *self = GCR_COMBO_SELECTOR (obj); - - if (self->pv->model) - g_object_unref (self->pv->model); - self->pv->model = NULL; - - if (self->pv->collection) - g_object_unref (self->pv->collection); - self->pv->collection = NULL; - - G_OBJECT_CLASS (gcr_combo_selector_parent_class)->dispose (obj); -} - -static void -gcr_combo_selector_finalize (GObject *obj) -{ - GcrComboSelector *self = GCR_COMBO_SELECTOR (obj); - - g_assert (!self->pv->collection); - g_assert (!self->pv->model); - - G_OBJECT_CLASS (gcr_combo_selector_parent_class)->finalize (obj); -} - -static void -gcr_combo_selector_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrComboSelector *self = GCR_COMBO_SELECTOR (obj); - - switch (prop_id) { - case PROP_COLLECTION: - g_return_if_fail (!self->pv->collection); - self->pv->collection = g_value_dup_object (value); - g_return_if_fail (self->pv->collection); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_combo_selector_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrComboSelector *self = GCR_COMBO_SELECTOR (obj); - - switch (prop_id) { - case PROP_COLLECTION: - g_value_set_object (value, gcr_combo_selector_get_collection (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_combo_selector_class_init (GcrComboSelectorClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->constructor = gcr_combo_selector_constructor; - gobject_class->dispose = gcr_combo_selector_dispose; - gobject_class->finalize = gcr_combo_selector_finalize; - gobject_class->set_property = gcr_combo_selector_set_property; - gobject_class->get_property = gcr_combo_selector_get_property; - - /** - * GcrComboSelector:collection: - * - * The collection which contains the objects to display in the selector. - */ - g_object_class_install_property (gobject_class, PROP_COLLECTION, - g_param_spec_object ("collection", "Collection", "Collection to select from", - GCR_TYPE_COLLECTION, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_combo_selector_new: - * @collection: The collection that contains the objects to display - * - * Create a new #GcrTreeSelector. - * - * Returns: A newly allocated selector, which should be released with - * g_object_unref(). - */ -GcrComboSelector* -gcr_combo_selector_new (GcrCollection *collection) -{ - return g_object_new (GCR_TYPE_COMBO_SELECTOR, - "collection", collection, - NULL); -} - -/** - * gcr_combo_selector_get_collection: - * @self: The selector - * - * Get the collection that this selector is displaying objects from. - * - * Returns: (transfer none): The collection, owned by the selector. - */ -GcrCollection * -gcr_combo_selector_get_collection (GcrComboSelector *self) -{ - g_return_val_if_fail (GCR_IS_COMBO_SELECTOR (self), NULL); - return self->pv->collection; -} - -/** - * gcr_combo_selector_get_selected: - * @self: The selector - * - * Get the selected object in the selector, or %NULL if nothing selected. - * - * Returns: (transfer none): the selected object, owned by the selector, or %NULL - */ -GObject * -gcr_combo_selector_get_selected (GcrComboSelector *self) -{ - GtkTreeIter iter; - - g_return_val_if_fail (GCR_IS_COMBO_SELECTOR (self), NULL); - gtk_combo_box_get_active_iter (GTK_COMBO_BOX (self), &iter); - - return gcr_collection_model_object_for_iter (self->pv->model, &iter); -} - -/** - * gcr_combo_selector_set_selected: - * @self: The selector - * @selected: (nullable): the object to select or %NULL - * - * Set the currently selected object in the selector, or clear the selection - * if selected is set to %NULL. - */ -void -gcr_combo_selector_set_selected (GcrComboSelector *self, GObject *selected) -{ - GtkTreeIter iter; - - g_return_if_fail (GCR_IS_COMBO_SELECTOR (self)); - - if (selected) { - if (!gcr_collection_model_iter_for_object (self->pv->model, selected, &iter)) - g_return_if_reached (); - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), &iter); - } else { - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (self), NULL); - } -} diff --git a/ui/gcr-combo-selector.h b/ui/gcr-combo-selector.h deleted file mode 100644 index e46ef8a..0000000 --- a/ui/gcr-combo-selector.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_COMBO_SELECTOR_H__ -#define __GCR_COMBO_SELECTOR_H__ - -#include "gcr/gcr-types.h" - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_COMBO_SELECTOR (gcr_combo_selector_get_type ()) -#define GCR_COMBO_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_COMBO_SELECTOR, GcrComboSelector)) -#define GCR_COMBO_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorClass)) -#define GCR_IS_COMBO_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_COMBO_SELECTOR)) -#define GCR_IS_COMBO_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_COMBO_SELECTOR)) -#define GCR_COMBO_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_COMBO_SELECTOR, GcrComboSelectorClass)) - -typedef struct _GcrComboSelector GcrComboSelector; -typedef struct _GcrComboSelectorClass GcrComboSelectorClass; -typedef struct _GcrComboSelectorPrivate GcrComboSelectorPrivate; - -struct _GcrComboSelector { - GtkComboBox parent; - - /*< private >*/ - GcrComboSelectorPrivate *pv; -}; - -struct _GcrComboSelectorClass { - /*< private >*/ - GtkComboBoxClass parent_class; -}; - -GType gcr_combo_selector_get_type (void); - -GcrComboSelector* gcr_combo_selector_new (GcrCollection *collection); - -GcrCollection* gcr_combo_selector_get_collection (GcrComboSelector *self); - -GObject* gcr_combo_selector_get_selected (GcrComboSelector *self); - -void gcr_combo_selector_set_selected (GcrComboSelector *self, - GObject *selected); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrComboSelector, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_COMBO_SELECTOR_H__ */ diff --git a/ui/gcr-deprecated.h b/ui/gcr-deprecated.h deleted file mode 100644 index c374eb1..0000000 --- a/ui/gcr-deprecated.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef GCR_DEPRECATED_H_ -#define GCR_DEPRECATED_H_ -#ifndef GCR_DISABLE_DEPRECATED -#ifndef __GI_SCANNER__ - -#include <glib.h> - -#include "gcr-certificate-basics-widget.h" -#include "gcr-certificate-details-widget.h" -#include "gcr-certificate-renderer.h" -#include "gcr-viewer.h" - -G_BEGIN_DECLS - -G_DEPRECATED_FOR(gcr_renderer_render_view) -void gcr_renderer_render (GcrRenderer *self, - GcrViewer *viewer); - -G_DEPRECATED_FOR(gcr_renderer_get_attributes) -GckAttributes * gcr_certificate_renderer_get_attributes (GcrCertificateRenderer *self); - -G_DEPRECATED_FOR(gcr_renderer_set_attributes) -void gcr_certificate_renderer_set_attributes (GcrCertificateRenderer *self, - GckAttributes *attrs); - -G_END_DECLS - -#endif /* __GI_SCANNER__ */ -#endif /* GCR_DISABLE_DEPRECATED */ -#endif /* GCRTYPES_H_ */ diff --git a/ui/gcr-dialog-util.c b/ui/gcr-dialog-util.c deleted file mode 100644 index e9c7fa0..0000000 --- a/ui/gcr-dialog-util.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr-dialog-util.h" - -#include <string.h> - -typedef struct { - GtkDialog *dialog; - gboolean was_modal; - gboolean destroyed; - gulong response_sig; - gulong unmap_sig; - gulong delete_sig; - gulong destroy_sig; -} DialogRunClosure; - -static void -dialog_run_closure_free (gpointer data) -{ - DialogRunClosure *closure = data; - g_object_unref (closure->dialog); - g_assert (closure->response_sig == 0); - g_assert (closure->unmap_sig == 0); - g_assert (closure->delete_sig == 0); - g_assert (closure->destroy_sig == 0); - g_free (closure); -} - -static void -complete_task (GTask *task, int response_id) -{ - DialogRunClosure *closure = g_task_get_task_data (task); - - g_object_ref (task); - - if (!closure->destroyed) { - if (!closure->was_modal) - gtk_window_set_modal (GTK_WINDOW (closure->dialog), FALSE); - - g_signal_handler_disconnect (closure->dialog, closure->response_sig); - closure->response_sig = 0; - g_signal_handler_disconnect (closure->dialog, closure->unmap_sig); - closure->unmap_sig = 0; - g_signal_handler_disconnect (closure->dialog, closure->delete_sig); - closure->delete_sig = 0; - g_signal_handler_disconnect (closure->dialog, closure->destroy_sig); - closure->destroy_sig = 0; - } - - g_task_return_int (task, response_id); - g_clear_object (&task); -} - -static void -on_dialog_unmap (GtkDialog *dialog, - gpointer user_data) -{ - GTask *task = G_TASK (user_data); - - complete_task (task, GTK_RESPONSE_NONE); -} - -static void -on_dialog_response (GtkDialog *dialog, - gint response_id, - gpointer user_data) -{ - GTask *task = G_TASK (user_data); - complete_task (task, response_id); -} - -static gint -on_dialog_delete (GtkDialog *dialog, - GdkEventAny *event, - gpointer user_data) -{ - GTask *task = G_TASK (user_data); - complete_task (task, GTK_RESPONSE_NONE); - return TRUE; /* Do not destroy */ -} - -static void -on_dialog_destroy (GtkDialog *dialog, - gpointer user_data) -{ - GTask *task = G_TASK (user_data); - DialogRunClosure *closure = g_task_get_task_data (task); - - /* complete will be called by run_unmap_handler */ - closure->destroyed = TRUE; -} - -void -_gcr_dialog_util_run_async (GtkDialog *dialog, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GTask *task; - DialogRunClosure *closure; - - g_return_if_fail (GTK_IS_DIALOG (dialog)); - g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable)); - - task = g_task_new (dialog, cancellable, callback, user_data); - g_task_set_source_tag (task, _gcr_dialog_util_run_async); - - closure = g_new0 (DialogRunClosure, 1); - closure->dialog = g_object_ref (dialog); - closure->was_modal = gtk_window_get_modal (GTK_WINDOW (dialog)); - if (!closure->was_modal) - gtk_window_set_modal (GTK_WINDOW (dialog), TRUE); - - if (!gtk_widget_get_visible (GTK_WIDGET (dialog))) - gtk_widget_show (GTK_WIDGET (dialog)); - - g_task_set_task_data (task, closure, dialog_run_closure_free); - - closure->response_sig = g_signal_connect_data (dialog, "response", - G_CALLBACK (on_dialog_response), - g_object_ref (task), - (GClosureNotify)g_object_unref, 0); - - closure->unmap_sig = g_signal_connect_data (dialog, "unmap", - G_CALLBACK (on_dialog_unmap), - g_object_ref (task), - (GClosureNotify)g_object_unref, 0); - - closure->delete_sig = g_signal_connect_data (dialog, "delete-event", - G_CALLBACK (on_dialog_delete), - g_object_ref (task), - (GClosureNotify)g_object_unref, 0); - - closure->destroy_sig = g_signal_connect_data (dialog, "destroy", - G_CALLBACK (on_dialog_destroy), - g_object_ref (task), - (GClosureNotify)g_object_unref, 0); - - g_clear_object (&task); -} - - -gint -_gcr_dialog_util_run_finish (GtkDialog *dialog, - GAsyncResult *result) -{ - g_return_val_if_fail (g_task_is_valid (result, dialog), GTK_RESPONSE_NONE); - - return g_task_propagate_int (G_TASK (result), NULL); -} diff --git a/ui/gcr-dialog-util.h b/ui/gcr-dialog-util.h deleted file mode 100644 index b40b14c..0000000 --- a/ui/gcr-dialog-util.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef GCR_DIALOG_UTIL_H -#define GCR_DIALOG_UTIL_H - -#include <gtk/gtk.h> -#include <gio/gio.h> - -G_BEGIN_DECLS - -void _gcr_dialog_util_run_async (GtkDialog *dialog, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - -gint _gcr_dialog_util_run_finish (GtkDialog *dialog, - GAsyncResult *result); - -G_END_DECLS - -#endif /* __GCR_TOKEN_MANAGER_H__ */ diff --git a/ui/gcr-display-scrolled.c b/ui/gcr-display-scrolled.c deleted file mode 100644 index 964acee..0000000 --- a/ui/gcr-display-scrolled.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - - -#include "config.h" - -#include "gcr-display-scrolled.h" -#include "gcr-viewer.h" - -static void _gcr_display_scrolled_viewer_iface (GcrViewerIface *iface); - -struct _GcrDisplayScrolledPrivate { - GcrViewer *internal; -}; - -G_DEFINE_TYPE_WITH_CODE (GcrDisplayScrolled, _gcr_display_scrolled, GTK_TYPE_SCROLLED_WINDOW, - G_ADD_PRIVATE (GcrDisplayScrolled); - G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_scrolled_viewer_iface)); - -/* ----------------------------------------------------------------------------- - * INTERNAL - */ - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static void -_gcr_display_scrolled_init (GcrDisplayScrolled *self) -{ - self->pv = _gcr_display_scrolled_get_instance_private (self); - self->pv->internal = gcr_viewer_new (); -} - -static void -_gcr_display_scrolled_constructed (GObject *object) -{ - GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (object); - - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (self), GTK_SHADOW_ETCHED_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (self), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->internal)); - gtk_widget_show (GTK_WIDGET (self->pv->internal)); -} - -static void -_gcr_display_scrolled_get_preferred_height (GtkWidget *widget, gint *minimal_height, - gint *natural_height) -{ - GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget); - gint minimal, natural; - - GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_height (widget, - minimal_height, - natural_height); - - minimal = 0; - natural = 0; - - gtk_widget_get_preferred_height (GTK_WIDGET (self->pv->internal), - &minimal, &natural); - - /* This is messy, we add a extra for the etching height */ - *minimal_height = MAX (minimal + 3, *minimal_height); - *natural_height = MAX (natural + 3, *natural_height); -} - -static void -_gcr_display_scrolled_get_preferred_width (GtkWidget *widget, gint *minimal_width, - gint *natural_width) -{ - GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (widget); - gint minimal, natural; - - GTK_WIDGET_CLASS (_gcr_display_scrolled_parent_class)->get_preferred_width (widget, - minimal_width, - natural_width); - - minimal = 0; - natural = 0; - - gtk_widget_get_preferred_width (GTK_WIDGET (self->pv->internal), - &minimal, &natural); - - /* This is messy, we add a extra for the scrollbar width, etching */ - *minimal_width = MAX (minimal + 32, *minimal_width); - *natural_width = MAX (natural + 32, *natural_width); -} - -static void -_gcr_display_scrolled_class_init (GcrDisplayScrolledClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - - widget_class->get_preferred_height = _gcr_display_scrolled_get_preferred_height; - widget_class->get_preferred_width = _gcr_display_scrolled_get_preferred_width; - - object_class->constructed = _gcr_display_scrolled_constructed; -} - -static void -_gcr_display_scrolled_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer) -{ - GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); - gcr_viewer_add_renderer (self->pv->internal, renderer); -} - -static void -_gcr_display_scrolled_real_insert_renderer (GcrViewer *viewer, - GcrRenderer *renderer, - GcrRenderer *before) -{ - GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); - gcr_viewer_insert_renderer (self->pv->internal, renderer, before); -} - -static void -_gcr_display_scrolled_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer) -{ - GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); - gcr_viewer_remove_renderer (self->pv->internal, renderer); -} - -static guint -_gcr_display_scrolled_real_count_renderers (GcrViewer *viewer) -{ - GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); - return gcr_viewer_count_renderers (self->pv->internal); -} - -static GcrRenderer* -_gcr_display_scrolled_real_get_renderer (GcrViewer *viewer, guint index_) -{ - GcrDisplayScrolled *self = GCR_DISPLAY_SCROLLED (viewer); - return gcr_viewer_get_renderer (self->pv->internal, index_); -} - -static void -_gcr_display_scrolled_viewer_iface (GcrViewerIface *iface) -{ - iface->add_renderer = _gcr_display_scrolled_real_add_renderer; - iface->insert_renderer = _gcr_display_scrolled_real_insert_renderer; - iface->remove_renderer = _gcr_display_scrolled_real_remove_renderer; - iface->count_renderers = _gcr_display_scrolled_real_count_renderers; - iface->get_renderer = _gcr_display_scrolled_real_get_renderer; -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -GcrDisplayScrolled* -_gcr_display_scrolled_new (void) -{ - return g_object_new (GCR_TYPE_DISPLAY_SCROLLED, NULL); -} diff --git a/ui/gcr-display-scrolled.h b/ui/gcr-display-scrolled.h deleted file mode 100644 index 8726ae2..0000000 --- a/ui/gcr-display-scrolled.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_DISPLAY_SCROLLED_H__ -#define __GCR_DISPLAY_SCROLLED_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_DISPLAY_SCROLLED (_gcr_display_scrolled_get_type ()) -#define GCR_DISPLAY_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolled)) -#define GCR_DISPLAY_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledClass)) -#define GCR_IS_DISPLAY_SCROLLED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_DISPLAY_SCROLLED)) -#define GCR_IS_DISPLAY_SCROLLED_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_DISPLAY_SCROLLED)) -#define GCR_DISPLAY_SCROLLED_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_DISPLAY_SCROLLED, GcrDisplayScrolledClass)) - -typedef struct _GcrDisplayScrolled GcrDisplayScrolled; -typedef struct _GcrDisplayScrolledClass GcrDisplayScrolledClass; -typedef struct _GcrDisplayScrolledPrivate GcrDisplayScrolledPrivate; - -struct _GcrDisplayScrolled { - /*< private >*/ - GtkScrolledWindow parent; - GcrDisplayScrolledPrivate *pv; -}; - -struct _GcrDisplayScrolledClass { - GtkScrolledWindowClass parent_class; -}; - -GType _gcr_display_scrolled_get_type (void); - -GcrDisplayScrolled* _gcr_display_scrolled_new (void); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrDisplayScrolled, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_DISPLAY_SCROLLED_H__ */ diff --git a/ui/gcr-display-view.c b/ui/gcr-display-view.c deleted file mode 100644 index 766a3a2..0000000 --- a/ui/gcr-display-view.c +++ /dev/null @@ -1,1232 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-display-view.h" -#include "gcr-renderer.h" -#include "gcr-viewer.h" - -#include "egg/egg-oid.h" -#include "egg/egg-hex.h" - -#include <gdk/gdk.h> -#include <glib/gi18n-lib.h> - -static void _gcr_display_view_viewer_iface (GcrViewerIface *iface); - -#define ZWSP "\342\200\213" -#define NORMAL_MARGIN 10 -#define FIELD_MARGIN 17 -#define COLUMN_MARGIN 6 -#define ICON_MARGIN 8 -#define MESSAGE_PADDING 8 - -typedef struct _GcrDisplayItem { - GcrDisplayView *display_view; - GcrRenderer *renderer; - gboolean expanded; - gboolean details; - GtkTextMark *beginning; - GtkTextMark *ending; - GtkWidget *details_widget; - GtkTextChildAnchor *area_anchor; - GtkTextTag *extra_tag; - gint field_width; - GdkPixbuf *pixbuf; - GtkTextTag *field_tag; - GtkTextTag *details_tag; - gulong data_changed_id; -} GcrDisplayItem; - -struct _GcrDisplayViewPrivate { - GtkTextBuffer *buffer; - GPtrArray *renderers; - GHashTable *items; - GtkTextTag *title_tag; - GtkTextTag *content_tag; - GtkTextTag *heading_tag; - GtkTextTag *message_tag; - GtkTextTag *monospace_tag; - GtkTextTag *area_tag; - GcrDisplayItem *current_item; - gint text_height; - GdkCursor *cursor; - - gboolean have_measurements; - gint minimal_width; - gint natural_width; - gint minimal_height; - gint natural_height; -}; - -G_DEFINE_TYPE_WITH_CODE (GcrDisplayView, _gcr_display_view, GTK_TYPE_TEXT_VIEW, - G_ADD_PRIVATE (GcrDisplayView); - G_IMPLEMENT_INTERFACE (GCR_TYPE_VIEWER, _gcr_display_view_viewer_iface)); - -/* ----------------------------------------------------------------------------- - * INTERNAL - */ - -static void -ensure_measurements (GcrDisplayView *self) -{ - PangoLayout *layout; - PangoRectangle extents; - gint icon_width; - gint icon_height; - GHashTableIter iter; - GcrDisplayItem *item; - gpointer value; - gboolean expanded; - - if (self->pv->have_measurements) - return; - - /* See if anything is expanded? */ - expanded = FALSE; - g_hash_table_iter_init (&iter, self->pv->items); - while (g_hash_table_iter_next (&iter, NULL, &value)) { - item = value; - if (item->expanded) { - expanded = TRUE; - break; - } - } - - /* - * We use a string in our widget font as the basis for our measurements. - * These are just estimates of what we need, and what looks goodish. - * There's room here for improvement. If this is causes problems for - * you or bothers you, scratch that itch: - */ - - layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "0123456789"); - pango_layout_get_extents (layout, NULL, &extents); - pango_extents_to_pixels (&extents, NULL); - g_object_unref (layout); - - if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &icon_width, &icon_height)) { - icon_width = 48; - icon_height = 48; - } - - if (expanded) { - /* If expanded, display more 10 lines at least */ - self->pv->minimal_height = extents.height * 14; - self->pv->natural_height = extents.height * 25; - } else { - /* If not expanded we can get by with 9 lines */ - self->pv->minimal_height = extents.height * 8; - self->pv->natural_height = extents.height * 9; - } - - self->pv->minimal_width = icon_width + (extents.width * 5); - self->pv->natural_width = icon_width + (extents.width * 8); - self->pv->have_measurements = TRUE; -} - -static void -ensure_text_height (GcrDisplayView *self) -{ - PangoRectangle extents; - PangoLayout *layout; - - if (self->pv->text_height > 0) - return; - - layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), "Wp"); - pango_layout_get_extents (layout, NULL, &extents); - pango_extents_to_pixels (&extents, NULL); - g_object_unref (layout); - - self->pv->text_height = extents.height; -} - -static void -recalculate_and_resize (GcrDisplayView *self) -{ - self->pv->have_measurements = FALSE; - gtk_widget_queue_resize (GTK_WIDGET (self)); -} - -static GtkTextTagTable* -create_tag_table (GcrDisplayView *self) -{ - GtkTextTagTable *tags; - gint width, height; - - g_assert (GCR_IS_DISPLAY_VIEW (self)); - - tags = gtk_text_tag_table_new (); - - if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height)) - width = 48; - - self->pv->title_tag = g_object_new (GTK_TYPE_TEXT_TAG, - "name", "title", - "scale", PANGO_SCALE_LARGE, - "right-margin", (ICON_MARGIN * 2) + width, - "pixels-below-lines", 6, - "weight", PANGO_WEIGHT_BOLD, - NULL); - gtk_text_tag_table_add (tags, self->pv->title_tag); - - self->pv->content_tag = g_object_new (GTK_TYPE_TEXT_TAG, - "name", "content", - "right-margin", (ICON_MARGIN * 2) + width, - "left-margin", FIELD_MARGIN, - "pixels-below-lines", 3, - "wrap-mode", GTK_WRAP_WORD, - NULL); - gtk_text_tag_table_add (tags, self->pv->content_tag); - - self->pv->message_tag = g_object_new (GTK_TYPE_TEXT_TAG, - "name", "message", - "right-margin", (ICON_MARGIN * 2) + width, - "rise", 3 * PANGO_SCALE, - "pixels-below-lines", 3, - "wrap-mode", GTK_WRAP_WORD, - NULL); - gtk_text_tag_table_add (tags, self->pv->message_tag); - - self->pv->heading_tag = g_object_new (GTK_TYPE_TEXT_TAG, - "name", "heading", - "pixels-above-lines", 9, - "pixels-below-lines", 3, - "weight", PANGO_WEIGHT_BOLD, - NULL); - gtk_text_tag_table_add (tags, self->pv->heading_tag); - - self->pv->monospace_tag = g_object_new (GTK_TYPE_TEXT_TAG, - "name", "monospace", - "family", "monospace", - NULL); - gtk_text_tag_table_add (tags, self->pv->monospace_tag); - - self->pv->area_tag = g_object_new (GTK_TYPE_TEXT_TAG, - "name", "area", - "justification", GTK_JUSTIFY_CENTER, - NULL); - gtk_text_tag_table_add (tags, self->pv->area_tag); - - return tags; -} - -static void -on_expander_realize (GtkWidget *widget, gpointer user_data) -{ - GdkCursor *cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), GDK_ARROW); - gdk_window_set_cursor (gtk_widget_get_window (widget), cursor); - g_object_unref (cursor); -} - -static void -on_expander_expanded (GObject *object, GParamSpec *param_spec, gpointer user_data) -{ - GtkExpander *expander = GTK_EXPANDER (object); - GcrDisplayItem *item = user_data; - item->expanded = gtk_expander_get_expanded (expander); - gcr_renderer_render_view (item->renderer, GCR_VIEWER (item->display_view)); - recalculate_and_resize (item->display_view); -} - -static GcrDisplayItem* -create_display_item (GcrDisplayView *self, GcrRenderer *renderer) -{ - GcrDisplayItem *item; - GtkTextTagTable *tags; - GtkTextIter iter; - GtkWidget *widget; - GtkWidget *label; - GtkStyleContext *style; - gchar *text; - - item = g_new0 (GcrDisplayItem, 1); - item->display_view = self; - item->renderer = renderer; - - tags = gtk_text_buffer_get_tag_table (self->pv->buffer); - - g_assert (!item->field_tag); - item->field_width = 0; - item->field_tag = g_object_new (GTK_TYPE_TEXT_TAG, - "left-margin", item->field_width + FIELD_MARGIN, - "indent", item->field_width, - "pixels-below-lines", 3, - "wrap-mode", GTK_WRAP_WORD_CHAR, - NULL); - gtk_text_tag_table_add (tags, item->field_tag); - - g_assert (!item->details_tag); - item->details_tag = g_object_new (GTK_TYPE_TEXT_TAG, NULL); - gtk_text_tag_table_add (tags, item->details_tag); - - /* - * Add two lines space that delimit this from later items. The - * item will live between the two zero width spaces. - */ - gtk_text_buffer_get_end_iter (self->pv->buffer, &iter); - gtk_text_buffer_insert (self->pv->buffer, &iter, "\n\n", -1); - if (!gtk_text_iter_backward_char (&iter)) - g_assert_not_reached (); - - /* The mark that determines the beginning of this item, with left gravity. */ - item->beginning = gtk_text_buffer_create_mark (self->pv->buffer, NULL, &iter, TRUE); - g_object_ref (item->beginning); - - /* The mark that determines the end of this item, with right gravity. */ - item->ending = gtk_text_buffer_create_mark (self->pv->buffer, NULL, &iter, FALSE); - g_object_ref (item->ending); - - widget = gtk_expander_new_with_mnemonic (""); - label = gtk_expander_get_label_widget (GTK_EXPANDER (widget)); - text = g_strdup_printf ("<b>%s</b>", _("_Details")); - gtk_label_set_markup_with_mnemonic (GTK_LABEL (label), text); - g_signal_connect (widget, "notify::expanded", G_CALLBACK (on_expander_expanded), item); - g_signal_connect (widget, "realize", G_CALLBACK (on_expander_realize), NULL); - item->expanded = gtk_expander_get_expanded (GTK_EXPANDER (widget)); - g_free (text); - - gtk_widget_set_halign (widget, 0.5); - gtk_widget_set_valign (widget, 0.5); - gtk_widget_set_margin_top (widget, 6); - gtk_widget_set_margin_bottom (widget, 9); - gtk_widget_show_all (widget); - - item->details_widget = gtk_event_box_new (); - gtk_event_box_set_visible_window (GTK_EVENT_BOX (item->details_widget), FALSE); - gtk_container_add (GTK_CONTAINER (item->details_widget), widget); - g_signal_connect (item->details_widget, "realize", G_CALLBACK (on_expander_realize), NULL); - style = gtk_widget_get_style_context (GTK_WIDGET (item->details_widget)); - gtk_style_context_add_class (style, "gcr-red"); - g_object_ref (item->details_widget); - - return item; -} - -static void -destroy_display_item (gpointer data) -{ - GcrDisplayItem *item = data; - GtkTextIter iter, end; - GtkTextTagTable *tags; - GcrDisplayView *self; - - g_assert (item); - - g_assert (GCR_IS_DISPLAY_VIEW (item->display_view)); - self = item->display_view; - - tags = gtk_text_buffer_get_tag_table (self->pv->buffer); - gtk_text_tag_table_remove (tags, item->field_tag); - gtk_text_tag_table_remove (tags, item->details_tag); - - g_object_unref (item->field_tag); - g_object_unref (item->details_tag); - - if (item->pixbuf) - g_object_unref (item->pixbuf); - item->pixbuf = NULL; - - g_assert (item->details_widget); - g_object_unref (item->details_widget); - item->details_widget = NULL; - - g_clear_object (&item->area_anchor); - - g_return_if_fail (!gtk_text_mark_get_deleted (item->beginning)); - g_return_if_fail (!gtk_text_mark_get_deleted (item->ending)); - - /* Setup iters to encompass our delemiter characters see create_display_item() */ - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning); - gtk_text_iter_backward_char (&iter); - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending); - gtk_text_iter_forward_char (&end); - gtk_text_buffer_delete (self->pv->buffer, &iter, &end); - - gtk_text_buffer_delete_mark (self->pv->buffer, item->beginning); - gtk_text_buffer_delete_mark (self->pv->buffer, item->ending); - - g_object_unref (item->beginning); - g_object_unref (item->ending); - - g_free (item); -} - -static GcrDisplayItem* -lookup_display_item (GcrDisplayView *self, GcrRenderer *renderer) -{ - GcrDisplayItem *item = g_hash_table_lookup (self->pv->items, renderer); - g_return_val_if_fail (item, NULL); - g_assert (item->display_view == self); - return item; -} - -static GcrDisplayItem* -find_item_at_iter (GcrDisplayView *self, GtkTextIter *iter) -{ - GHashTableIter hi; - GcrDisplayItem *item; - gpointer value; - GtkTextIter start, end; - - g_hash_table_iter_init (&hi, self->pv->items); - while (g_hash_table_iter_next (&hi, NULL, &value)) { - item = value; - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->beginning); - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending); - - if (gtk_text_iter_compare (iter, &start) >= 0 && - gtk_text_iter_compare (iter, &end) < 0) - return item; - } - - return NULL; -} - -static void -on_renderer_data_changed (GcrRenderer *renderer, - gpointer user_data) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (user_data); - - /* Item may be removed, but not yet destroyed */ - if (!g_hash_table_lookup (self->pv->items, renderer)) - return; - - /* Just ask the renderer to render itself on us */ - gcr_renderer_render_view (renderer, GCR_VIEWER (self)); -} - -static void -paint_item_icon (GcrDisplayView *self, - GcrDisplayItem *item, - GdkRectangle *visible, - cairo_t *cr) -{ - GtkTextIter iter; - GdkRectangle location; - GtkTextView *view; - - if (item->pixbuf == NULL) - return; - - view = GTK_TEXT_VIEW (self); - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning); - gtk_text_view_get_iter_location (view, &iter, &location); - - location.height = gdk_pixbuf_get_height (item->pixbuf); - location.width = gdk_pixbuf_get_width (item->pixbuf); - location.x = visible->width - location.width - ICON_MARGIN; - - if (!gdk_rectangle_intersect (visible, &location, NULL)) - return; - - gtk_text_view_buffer_to_window_coords (view, GTK_TEXT_WINDOW_TEXT, - location.x, location.y, - &location.x, &location.y); - - cairo_save (cr); - gdk_cairo_set_source_pixbuf (cr, item->pixbuf, location.x, location.y); - cairo_rectangle (cr, location.x, location.y, location.width, location.height); - cairo_fill (cr); - cairo_restore (cr); -} - -static void -paint_item_border (GcrDisplayView *self, - GcrDisplayItem *item, - GtkStyleContext *context, - GdkRectangle *visible, - gint index, - cairo_t *cr) -{ - GtkTextView *view; - GtkTextIter iter, end; - GdkRectangle location; - - if (index == 0) - return; - - view = GTK_TEXT_VIEW (self); - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->beginning); - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &end, item->ending); - - /* Don't paint for non-visible items */ - if (gtk_text_iter_compare (&iter, &end) == 0) - return; - - ensure_text_height (self); - - gtk_text_view_get_iter_location (view, &iter, &location); - - location.height = 2; - location.width = visible->width - (NORMAL_MARGIN * 2); - location.x = NORMAL_MARGIN; - location.y -= self->pv->text_height / 2; - - if (!gdk_rectangle_intersect (visible, &location, NULL)) - return; - - gtk_render_background (context, cr, location.x, location.y - 0.5, location.width, 1); -} - -static void -paint_extras (GcrDisplayView *self, cairo_t *cr) -{ - GdkRectangle visible; - GcrDisplayItem *item; - GtkStyleContext *context; - guint i; - - gtk_text_view_get_visible_rect (GTK_TEXT_VIEW (self), &visible); - context = gtk_widget_get_style_context (GTK_WIDGET (self)); - - for (i = 0; i < self->pv->renderers->len; i++) { - item = g_hash_table_lookup (self->pv->items, self->pv->renderers->pdata[i]); - g_assert (item != NULL); - paint_item_icon (self, item, &visible, cr); - paint_item_border (self, item, context, &visible, i, cr); - } -} - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static GObject* -_gcr_display_view_constructor (GType type, guint n_props, GObjectConstructParam *props) -{ - GObject *obj = G_OBJECT_CLASS (_gcr_display_view_parent_class)->constructor (type, n_props, props); - GcrDisplayView *self = NULL; - GtkTextView *view = NULL; - GtkTextTagTable *tags; - - g_return_val_if_fail (obj, NULL); - - self = GCR_DISPLAY_VIEW (obj); - view = GTK_TEXT_VIEW (obj); - - tags = create_tag_table (self); - self->pv->buffer = gtk_text_buffer_new (tags); - g_object_unref (tags); - - gtk_text_view_set_buffer (view, self->pv->buffer); - gtk_text_view_set_editable (view, FALSE); - gtk_text_view_set_left_margin (view, NORMAL_MARGIN); - gtk_text_view_set_right_margin (view, NORMAL_MARGIN); - gtk_text_view_set_cursor_visible (view, FALSE); - - return obj; -} - -static void -_gcr_display_view_init (GcrDisplayView *self) -{ - self->pv = _gcr_display_view_get_instance_private (self); - self->pv->items = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, destroy_display_item); - self->pv->renderers = g_ptr_array_new_with_free_func (g_object_unref); -} - -static void -_gcr_display_view_dispose (GObject *obj) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (obj); - GcrRenderer *renderer; - GcrDisplayItem *item; - - while (self->pv->renderers->len) { - renderer = g_ptr_array_index (self->pv->renderers, 0); - item = g_hash_table_lookup (self->pv->items, renderer); - g_return_if_fail (item); - g_signal_handler_disconnect (renderer, item->data_changed_id); - if (!g_hash_table_remove (self->pv->items, renderer)) - g_return_if_reached (); - g_ptr_array_remove_index_fast (self->pv->renderers, 0); - } - - if (self->pv->buffer) - g_object_unref (self->pv->buffer); - self->pv->buffer = NULL; - - g_assert (g_hash_table_size (self->pv->items) == 0); - - G_OBJECT_CLASS (_gcr_display_view_parent_class)->dispose (obj); -} - -static void -_gcr_display_view_finalize (GObject *obj) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (obj); - - if (self->pv->buffer) - g_object_unref (self->pv->buffer); - self->pv->buffer = NULL; - - g_assert (g_hash_table_size (self->pv->items) == 0); - g_hash_table_destroy (self->pv->items); - self->pv->items = NULL; - - g_assert (self->pv->renderers); - g_assert (self->pv->renderers->len == 0); - g_ptr_array_free (self->pv->renderers, TRUE); - self->pv->renderers = NULL; - - g_assert (self->pv->content_tag); - g_object_unref (self->pv->content_tag); - self->pv->content_tag = NULL; - - g_assert (self->pv->heading_tag); - g_object_unref (self->pv->heading_tag); - self->pv->heading_tag = NULL; - - g_assert (self->pv->monospace_tag); - g_object_unref (self->pv->monospace_tag); - self->pv->monospace_tag = NULL; - - g_assert (self->pv->title_tag); - g_object_unref (self->pv->title_tag); - self->pv->title_tag = NULL; - - g_clear_object (&self->pv->cursor); - - G_OBJECT_CLASS (_gcr_display_view_parent_class)->finalize (obj); -} - -static void -_gcr_display_view_realize (GtkWidget *widget) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (widget); - GdkDisplay *display; - - if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->realize) - GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->realize (widget); - - if (!self->pv->cursor) { - display = gtk_widget_get_display (GTK_WIDGET (self)); - self->pv->cursor = gdk_cursor_new_for_display (display, GDK_ARROW); - } - - gdk_window_set_cursor (gtk_text_view_get_window (GTK_TEXT_VIEW (self), GTK_TEXT_WINDOW_WIDGET), - self->pv->cursor); -} - -static gboolean -_gcr_display_view_button_press_event (GtkWidget *widget, GdkEventButton *event) -{ - GtkTextView *text_view = GTK_TEXT_VIEW (widget); - GcrDisplayView *self = GCR_DISPLAY_VIEW (widget); - GcrDisplayItem *item; - gboolean handled = FALSE; - GtkTextIter iter; - gint x, y; - - if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->button_press_event) - handled = GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->button_press_event ( - widget, event); - - if (event->window == gtk_text_view_get_window (text_view, GTK_TEXT_WINDOW_TEXT)) { - gtk_text_view_window_to_buffer_coords (text_view, GTK_TEXT_WINDOW_TEXT, - event->x, event->y, &x, &y); - gtk_text_view_get_iter_at_location (text_view, &iter, x, y); - - item = find_item_at_iter (self, &iter); - self->pv->current_item = item; - } - - return handled; -} - -static gboolean -_gcr_display_view_draw (GtkWidget *widget, cairo_t *cr) -{ - GdkWindow *window; - gboolean handled = TRUE; - - /* Have GtkTextView draw the text first. */ - if (GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->draw) - handled = GTK_WIDGET_CLASS (_gcr_display_view_parent_class)->draw (widget, cr); - - window = gtk_text_view_get_window (GTK_TEXT_VIEW (widget), GTK_TEXT_WINDOW_TEXT); - if (gtk_cairo_should_draw_window (cr, window)) - paint_extras (GCR_DISPLAY_VIEW (widget), cr); - - return handled; -} - -static void -_gcr_display_get_preferred_height (GtkWidget *widget, gint *minimal_height, - gint *natural_height) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (widget); - ensure_measurements (self); - *minimal_height = self->pv->minimal_height; - *natural_height = self->pv->natural_height; -} - -static void -_gcr_display_get_preferred_width (GtkWidget *widget, gint *minimal_width, - gint *natural_width) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (widget); - ensure_measurements (self); - *minimal_width = self->pv->minimal_width; - *natural_width = self->pv->natural_width; -} - -static void -_gcr_display_view_populate_popup (GtkTextView *text_view, -#if GTK_CHECK_VERSION (3, 8, 0) - GtkWidget *menu -#else - GtkMenu *menu -#endif - ) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (text_view); - - if (GTK_TEXT_VIEW_CLASS (_gcr_display_view_parent_class)->populate_popup) - GTK_TEXT_VIEW_CLASS (_gcr_display_view_parent_class)->populate_popup (text_view, menu); - - /* Ask the current renderer to add menu items */ - if (self->pv->current_item) - gcr_renderer_popuplate_popup (self->pv->current_item->renderer, - GCR_VIEWER (self), GTK_MENU (menu)); -} - -static void -_gcr_display_view_class_init (GcrDisplayViewClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - GtkTextViewClass *text_view_class = GTK_TEXT_VIEW_CLASS (klass); - - _gcr_display_view_parent_class = g_type_class_peek_parent (klass); - - gobject_class->constructor = _gcr_display_view_constructor; - gobject_class->dispose = _gcr_display_view_dispose; - gobject_class->finalize = _gcr_display_view_finalize; - - widget_class->realize = _gcr_display_view_realize; - widget_class->button_press_event = _gcr_display_view_button_press_event; - widget_class->get_preferred_height = _gcr_display_get_preferred_height; - widget_class->get_preferred_width = _gcr_display_get_preferred_width; - widget_class->draw = _gcr_display_view_draw; - - text_view_class->populate_popup = _gcr_display_view_populate_popup; - - /* Load a CSS once */ - do { - GtkCssProvider* provider = gtk_css_provider_new (); - GdkDisplay* display = gdk_display_get_default (); - GdkScreen* screen = gdk_display_get_default_screen (display); - GError *err = NULL; - - gtk_style_context_add_provider_for_screen (screen, - GTK_STYLE_PROVIDER(provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - - if (!gtk_css_provider_load_from_data (GTK_CSS_PROVIDER(provider), - ".gcr-red * { background-color: red; }\n", -1, &err)) { - g_warning ("couldn't load style: %s", - err && err->message ? err->message : ""); - } - g_object_unref (provider); - } while (0); -} - -static void -_gcr_display_view_real_insert_renderer (GcrViewer *viewer, - GcrRenderer *renderer, - GcrRenderer *before) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer); - GcrDisplayItem *item; - guint i; - - if (before != NULL) - g_return_if_fail (g_hash_table_lookup (self->pv->items, before) != NULL); - - item = create_display_item (self, renderer); - g_object_ref (renderer); - - /* Insert it at the right place */ - if (before != NULL) { - g_ptr_array_add (self->pv->renderers, NULL); - for (i = self->pv->renderers->len; i > 0; i--) { - self->pv->renderers->pdata[i] = self->pv->renderers->pdata[i - 1]; - if (self->pv->renderers->pdata[i] == before) { - self->pv->renderers->pdata[i - 1] = renderer; - break; - } - } - - /* Must have been found */ - g_assert (i > 0); - - /* No before, just add to end */ - } else { - g_ptr_array_add (self->pv->renderers, renderer); - } - - g_hash_table_insert (self->pv->items, renderer, item); - - gcr_renderer_render_view (renderer, viewer); - item->data_changed_id = g_signal_connect (renderer, "data-changed", - G_CALLBACK (on_renderer_data_changed), self); -} - -static void -_gcr_display_view_real_add_renderer (GcrViewer *viewer, GcrRenderer *renderer) -{ - _gcr_display_view_real_insert_renderer (viewer, renderer, NULL); -} - -static void -_gcr_display_view_real_remove_renderer (GcrViewer *viewer, GcrRenderer *renderer) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer); - GcrDisplayItem *item; - - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - /* Unhook the callback */ - g_signal_handler_disconnect (renderer, item->data_changed_id); - - /* Destroys the display item */ - g_assert (item->display_view == self); - g_hash_table_remove (self->pv->items, renderer); - - /* Unrefs the renderer */ - if (!g_ptr_array_remove (self->pv->renderers, renderer)) - g_return_if_reached (); -} - -static guint -_gcr_display_view_real_count_renderers (GcrViewer *viewer) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer); - return self->pv->renderers->len; -} - -static GcrRenderer* -_gcr_display_view_real_get_renderer (GcrViewer *viewer, guint index_) -{ - GcrDisplayView *self = GCR_DISPLAY_VIEW (viewer); - g_return_val_if_fail (index_ < self->pv->renderers->len, NULL); - return g_ptr_array_index (self->pv->renderers, index_); -} - -static void -_gcr_display_view_viewer_iface (GcrViewerIface *iface) -{ - iface->add_renderer = (gpointer)_gcr_display_view_real_add_renderer; - iface->insert_renderer = (gpointer)_gcr_display_view_real_insert_renderer; - iface->remove_renderer = (gpointer)_gcr_display_view_real_remove_renderer; - iface->count_renderers = (gpointer)_gcr_display_view_real_count_renderers; - iface->get_renderer = (gpointer)_gcr_display_view_real_get_renderer; -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -GcrDisplayView* -_gcr_display_view_new (void) -{ - return g_object_new (GCR_TYPE_DISPLAY_VIEW, NULL); -} - -void -_gcr_display_view_begin (GcrDisplayView *self, - GcrRenderer *renderer) -{ - GtkTextIter start, iter; - GcrDisplayItem *item; - GList *widgets, *l; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - /* Remove the details widget so it doesn't get destroyed */ - if (gtk_widget_get_parent (item->details_widget)) - gtk_container_remove (GTK_CONTAINER (self), item->details_widget); - - /* Remove area widgets so they don't get destroyed unnecessarily */ - if (item->area_anchor) { - g_assert (!gtk_text_child_anchor_get_deleted (item->area_anchor)); - widgets = gtk_text_child_anchor_get_widgets (item->area_anchor); - for (l = widgets; l != NULL; l = g_list_next (l)) - gtk_container_remove (GTK_CONTAINER (self), l->data); - g_list_free (widgets); - g_object_unref (item->area_anchor); - item->area_anchor = NULL; - } - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->beginning); - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); - gtk_text_buffer_delete (self->pv->buffer, &start, &iter); - - item->extra_tag = NULL; - item->field_width = 0; - item->details = FALSE; -} - -void -_gcr_display_view_end (GcrDisplayView *self, - GcrRenderer *renderer) -{ - GcrDisplayItem *item; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - item = lookup_display_item (self, renderer); - g_return_if_fail (item); -} - -void -_gcr_display_view_start_details (GcrDisplayView *self, GcrRenderer *renderer) -{ - GtkTextChildAnchor *anchor; - GcrDisplayItem *item; - GtkTextIter iter; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - if (item->details) { - g_warning ("A GcrRenderer implementation has called %s twice in one render", - G_STRFUNC); - return; - } - - item->extra_tag = item->details_tag; - item->details = TRUE; - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); - anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter); - gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), item->details_widget, anchor); - gtk_widget_show_all (item->details_widget); - gtk_text_buffer_insert (self->pv->buffer, &iter, "\n", 1); -} - -void -_gcr_display_view_append_content (GcrDisplayView *self, GcrRenderer *renderer, - const gchar *content, const gchar *details) -{ - GcrDisplayItem *item; - GtkTextIter iter; - gchar *memory = NULL; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - g_return_if_fail (content); - - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - if (item->details && !item->expanded) - return; - - if (details) - content = memory = g_strdup_printf ("%s: %s", content, details); - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, content, -1, - self->pv->content_tag, item->extra_tag, NULL); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, - item->extra_tag, NULL); - - g_free (memory); -} - -void -_gcr_display_view_append_value (GcrDisplayView *self, GcrRenderer *renderer, const gchar *field, - const gchar *value, gboolean monospace) -{ - GcrDisplayItem *item; - PangoRectangle extents; - PangoTabArray *tabs; - PangoLayout *layout; - GtkTextIter iter; - gchar *text; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - g_return_if_fail (field); - - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - if (item->details && !item->expanded) - return; - - text = g_strdup_printf ("%s:", field); - if (value == NULL) - value = ""; - - /* Measure the width of the field */ - layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), text); - pango_layout_get_extents (layout, NULL, &extents); - pango_extents_to_pixels (&extents, NULL); - g_object_unref (layout); - - /* An estimate of the text height */ - self->pv->text_height = extents.height; - - /* Make the tab wide enough to accomodate */ - if (extents.width > item->field_width) { - item->field_width = extents.width + COLUMN_MARGIN; - tabs = pango_tab_array_new (1, TRUE); - pango_tab_array_set_tab (tabs, 0, PANGO_TAB_LEFT, item->field_width); - g_object_set (item->field_tag, - "left-margin", FIELD_MARGIN, - "indent", 0 - item->field_width, - "tabs", tabs, - NULL); - pango_tab_array_free (tabs); - } - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, text, -1, - item->field_tag, item->extra_tag, NULL); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\t", 1, - item->extra_tag, NULL); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, value, -1, item->field_tag, - monospace ? self->pv->monospace_tag : item->extra_tag, - monospace ? item->extra_tag : NULL, NULL); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, - item->extra_tag, NULL); - - g_free (text); -} - -void -_gcr_display_view_append_hex (GcrDisplayView *self, GcrRenderer *renderer, - const gchar *field, gconstpointer value, gsize n_value) -{ - gchar *display; - - display = egg_hex_encode_full (value, n_value, TRUE, " ", 1); - _gcr_display_view_append_value (self, renderer, field, display, TRUE); - g_free (display); -} - -void -_gcr_display_view_append_title (GcrDisplayView *self, GcrRenderer *renderer, const gchar *title) -{ - GcrDisplayItem *item; - GtkTextIter iter; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - g_return_if_fail (title); - - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - if (item->details && !item->expanded) - return; - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, title, -1, - self->pv->title_tag, item->extra_tag, NULL); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, - item->extra_tag, NULL); -} - -void -_gcr_display_view_append_heading (GcrDisplayView *self, GcrRenderer *renderer, const gchar *heading) -{ - GcrDisplayItem *item; - GtkTextIter iter; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - g_return_if_fail (heading); - - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - if (item->details && !item->expanded) - return; - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, heading, -1, - self->pv->heading_tag, item->extra_tag, NULL); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, - item->extra_tag, NULL); -} - -void -_gcr_display_view_append_fingerprint (GcrDisplayView *self, GcrRenderer *renderer, const guchar *data, - gsize n_data, const gchar *name, GChecksumType type) -{ - GChecksum *checksum; - guint8 *buffer; - gsize n_buffer; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - - checksum = g_checksum_new (type); - g_return_if_fail (checksum); - g_checksum_update (checksum, data, n_data); - - n_buffer = g_checksum_type_get_length (type); - g_return_if_fail (n_buffer); - buffer = g_malloc0 (n_buffer); - - g_checksum_get_digest (checksum, buffer, &n_buffer); - g_checksum_free (checksum); - - _gcr_display_view_append_hex (self, renderer, name, buffer, n_buffer); - - g_free (buffer); -} - -void -_gcr_display_view_append_message (GcrDisplayView *self, - GcrRenderer *renderer, - GtkMessageType message_type, - const gchar *message) -{ - const gchar *name = NULL; - GtkWidget *image = NULL; - GcrDisplayItem *item; - GtkTextChildAnchor *anchor; - GtkTextIter iter; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - g_return_if_fail (GCR_IS_RENDERER (renderer)); - - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - switch (message_type) { - case GTK_MESSAGE_INFO: - name = "dialog-information"; - break; - - case GTK_MESSAGE_QUESTION: - name = "dialog-question"; - break; - - case GTK_MESSAGE_WARNING: - name = "dialog-warning"; - break; - - case GTK_MESSAGE_ERROR: - name = "dialog-error"; - break; - - case GTK_MESSAGE_OTHER: - break; - - default: - g_warning ("unknown GtkMessageType: %u", message_type); - break; - } - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); - - if (name != NULL) { - image = gtk_image_new_from_icon_name (name, GTK_ICON_SIZE_MENU); -#if GTK_CHECK_VERSION (3, 12, 0) - gtk_widget_set_margin_start (image, MESSAGE_PADDING); - gtk_widget_set_margin_end (image, MESSAGE_PADDING); -#else - gtk_widget_set_margin_left (image, MESSAGE_PADDING); - gtk_widget_set_margin_right (image, MESSAGE_PADDING); -#endif - gtk_widget_show (image); - - anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter); - gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), image, anchor); - } - - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, message, -1, - self->pv->message_tag, item->extra_tag, NULL); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n", 1, - item->extra_tag, NULL); -} - -void -_gcr_display_view_set_icon (GcrDisplayView *self, GcrRenderer *renderer, GIcon *icon) -{ - GcrDisplayItem *item; - GdkScreen *screen; - GtkIconTheme *icon_theme; - gint width, height; - GtkIconInfo *info; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - item = lookup_display_item (self, renderer); - g_return_if_fail (item); - - if (item->pixbuf) - g_object_unref (item->pixbuf); - item->pixbuf = NULL; - - if (!icon) - return; - - screen = gtk_widget_get_screen (GTK_WIDGET (self)); - icon_theme = gtk_icon_theme_get_for_screen (screen); - - if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DIALOG, &width, &height)) - g_return_if_reached (); - - info = gtk_icon_theme_lookup_by_gicon (icon_theme, icon, MIN (width, height), - GTK_ICON_LOOKUP_USE_BUILTIN); - - if (info) { - GtkStyleContext *style = gtk_widget_get_style_context (GTK_WIDGET (self)); - item->pixbuf = gtk_icon_info_load_symbolic_for_context (info, style, FALSE, NULL); -#if GTK_CHECK_VERSION(3, 8, 0) - g_object_unref (info); -#else - gtk_icon_info_free (info); -#endif - } -} - -void -_gcr_display_view_add_widget_area (GcrDisplayView *self, - GcrRenderer *renderer, - GtkWidget *area) -{ - GtkTextIter iter, start; - GcrDisplayItem *item; - - g_return_if_fail (GCR_IS_DISPLAY_VIEW (self)); - g_return_if_fail (GTK_IS_WIDGET (area)); - - item = lookup_display_item (self, renderer); - g_return_if_fail (item != NULL); - g_return_if_fail (item->area_anchor == NULL); - - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &start, item->ending); - iter = start; - - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, "\n" ZWSP, -1, self->pv->area_tag, NULL); - gtk_text_buffer_get_iter_at_mark (self->pv->buffer, &iter, item->ending); - - item->area_anchor = gtk_text_buffer_create_child_anchor (self->pv->buffer, &iter); - g_object_ref (item->area_anchor); - gtk_text_view_add_child_at_anchor (GTK_TEXT_VIEW (self), area, item->area_anchor); - gtk_text_buffer_insert_with_tags (self->pv->buffer, &iter, ZWSP "\n", -1, self->pv->area_tag, NULL); -} diff --git a/ui/gcr-display-view.h b/ui/gcr-display-view.h deleted file mode 100644 index 99c3bed..0000000 --- a/ui/gcr-display-view.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_DISPLAY_VIEW_H__ -#define __GCR_DISPLAY_VIEW_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-certificate.h" -#include "gcr/gcr-types.h" - -#include "gcr-viewer.h" - -G_BEGIN_DECLS - -#define GCR_DISPLAY_VIEW_LINE_BREAK 0x2028 - -#define GCR_TYPE_DISPLAY_VIEW (_gcr_display_view_get_type ()) -#define GCR_DISPLAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_DISPLAY_VIEW, GcrDisplayView)) -#define GCR_DISPLAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewClass)) -#define GCR_IS_DISPLAY_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_DISPLAY_VIEW)) -#define GCR_IS_DISPLAY_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_DISPLAY_VIEW)) -#define GCR_DISPLAY_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_DISPLAY_VIEW, GcrDisplayViewClass)) - -typedef struct _GcrDisplayView GcrDisplayView; -typedef struct _GcrDisplayViewClass GcrDisplayViewClass; -typedef struct _GcrDisplayViewPrivate GcrDisplayViewPrivate; - -struct _GcrDisplayView { - /*< private >*/ - GtkTextView parent; - GcrDisplayViewPrivate *pv; -}; - -struct _GcrDisplayViewClass { - GtkTextViewClass parent_class; -}; - -GType _gcr_display_view_get_type (void); - -GcrDisplayView* _gcr_display_view_new (void); - -void _gcr_display_view_begin (GcrDisplayView *self, - GcrRenderer *renderer); - -void _gcr_display_view_end (GcrDisplayView *self, - GcrRenderer *renderer); - -void _gcr_display_view_append_value (GcrDisplayView *self, - GcrRenderer *renderer, - const gchar *field, - const gchar *value, - gboolean monospace); - -void _gcr_display_view_append_hex (GcrDisplayView *self, - GcrRenderer *renderer, - const gchar *field, - gconstpointer value, - gsize n_value); - -void _gcr_display_view_append_title (GcrDisplayView *self, - GcrRenderer *renderer, - const gchar *title); - -void _gcr_display_view_append_content (GcrDisplayView *self, - GcrRenderer *renderer, - const gchar *content, - const gchar *details); - -void _gcr_display_view_start_details (GcrDisplayView *self, - GcrRenderer *renderer); - -void _gcr_display_view_append_heading (GcrDisplayView *self, - GcrRenderer *renderer, - const gchar *heading); - -void _gcr_display_view_append_fingerprint (GcrDisplayView *self, - GcrRenderer *renderer, - const guchar *data, - gsize n_data, - const gchar *name, - GChecksumType type); - -void _gcr_display_view_append_message (GcrDisplayView *self, - GcrRenderer *renderer, - GtkMessageType message_type, - const gchar *message); - -void _gcr_display_view_set_icon (GcrDisplayView *self, - GcrRenderer *renderer, - GIcon *icon); - -void _gcr_display_view_add_widget_area (GcrDisplayView *self, - GcrRenderer *render, - GtkWidget *area); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrDisplayView, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_DISPLAY_VIEW_H__ */ diff --git a/ui/gcr-failure-renderer.c b/ui/gcr-failure-renderer.c deleted file mode 100644 index 46ad600..0000000 --- a/ui/gcr-failure-renderer.c +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-icons.h" -#include "gcr/gcr-parser.h" - -#include "gcr-display-view.h" -#include "gcr-failure-renderer.h" -#include "gcr-secure-entry-buffer.h" - -#include <gdk/gdk.h> -#include <glib/gi18n-lib.h> - -/** - * GcrFailureRenderer: - * - * A renderer that can be used for unsupported data. - */ - -enum { - PROP_0, - PROP_LABEL, - PROP_ATTRIBUTES -}; - -struct _GcrFailureRendererPrivate { - gchar *label; - GError *error; -}; - -static void gcr_renderer_iface_init (GcrRendererIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrFailureRenderer, gcr_failure_renderer, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrFailureRenderer); - G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init); -); - -static void -gcr_failure_renderer_init (GcrFailureRenderer *self) -{ - self->pv = gcr_failure_renderer_get_instance_private (self); -} - -static void -gcr_failure_renderer_finalize (GObject *obj) -{ - GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj); - - g_error_free (self->pv->error); - g_free (self->pv->label); - - G_OBJECT_CLASS (gcr_failure_renderer_parent_class)->finalize (obj); -} - -static void -gcr_failure_renderer_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj); - - switch (prop_id) { - case PROP_LABEL: - g_free (self->pv->label); - self->pv->label = g_value_dup_string (value); - g_object_notify (obj, "label"); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - break; - case PROP_ATTRIBUTES: - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_failure_renderer_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GcrFailureRenderer *self = GCR_FAILURE_RENDERER (obj); - - switch (prop_id) { - case PROP_LABEL: - g_value_take_string (value, self->pv->label); - break; - case PROP_ATTRIBUTES: - g_value_set_boxed (value, NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_failure_renderer_class_init (GcrFailureRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->finalize = gcr_failure_renderer_finalize; - gobject_class->set_property = gcr_failure_renderer_set_property; - gobject_class->get_property = gcr_failure_renderer_get_property; - - g_object_class_install_property (gobject_class, PROP_LABEL, - g_param_spec_string ("label", "Label", "Failure Label", - "", - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, - g_param_spec_boxed ("attributes", "Attributes", "Renderer attributes", - GCK_TYPE_ATTRIBUTES, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -} - -static void -gcr_failure_renderer_render (GcrRenderer *renderer, - GcrViewer *viewer) -{ - GcrFailureRenderer *self = GCR_FAILURE_RENDERER (renderer); - GcrDisplayView *view; - gchar *display; - GIcon *icon; - - if (GCR_IS_DISPLAY_VIEW (viewer)) { - view = GCR_DISPLAY_VIEW (viewer); - - } else { - g_warning ("GcrFailureRenderer only works with internal specific " - "GcrViewer returned by gcr_viewer_new()."); - return; - } - - _gcr_display_view_begin (view, renderer); - - if (g_error_matches (self->pv->error, GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED)) - icon = g_themed_icon_new ("dialog-warning"); - else - icon = g_themed_icon_new ("dialog-error"); - _gcr_display_view_set_icon (view, renderer, icon); - g_object_unref (icon); - - _gcr_display_view_append_title (view, renderer, self->pv->label); - - if (self->pv->label) - display = g_strdup_printf (_("Could not display “%s”"), self->pv->label); - else - display = g_strdup (_("Could not display file")); - _gcr_display_view_append_content (view, renderer, display, NULL); - g_free (display); - - if (self->pv->error->message) - _gcr_display_view_append_value (view, renderer, _("Reason"), - self->pv->error->message, FALSE); - - _gcr_display_view_end (view, renderer); -} - -static void -gcr_renderer_iface_init (GcrRendererIface *iface) -{ - iface->render_view = gcr_failure_renderer_render; -} - -/** - * gcr_failure_renderer_new: - * @label: (nullable): the label for the failure - * @error: the error to display - * - * Create a new renderer for an error. - * - * Returns: (transfer full) (type GcrUi.FailureRenderer): the new renderer - */ -GcrRenderer * -gcr_failure_renderer_new (const gchar *label, - GError *error) -{ - GcrFailureRenderer *renderer; - - renderer = g_object_new (GCR_TYPE_FAILURE_RENDERER, - "label", label, - NULL); - - renderer->pv->error = g_error_copy (error); - return GCR_RENDERER (renderer); -} - -/** - * gcr_failure_renderer_new_unsupported: - * @label: the label for the failure - * - * Create a new renderer for unsupported data. - * - * Returns: (transfer full): the new renderer - */ -GcrRenderer * -gcr_failure_renderer_new_unsupported (const gchar *label) -{ - GcrRenderer *renderer; - GError *error; - - error = g_error_new (GCR_DATA_ERROR, GCR_ERROR_UNRECOGNIZED, - _("Cannot display a file of this type.")); - - renderer = gcr_failure_renderer_new (label, error); - - g_error_free (error); - return renderer; -} diff --git a/ui/gcr-failure-renderer.h b/ui/gcr-failure-renderer.h deleted file mode 100644 index 4dd1027..0000000 --- a/ui/gcr-failure-renderer.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_FAILURE_RENDERER_H__ -#define __GCR_FAILURE_RENDERER_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr-renderer.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_FAILURE_RENDERER (gcr_failure_renderer_get_type ()) -#define GCR_FAILURE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_FAILURE_RENDERER, GcrFailureRenderer)) -#define GCR_FAILURE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_FAILURE_RENDERER, GcrFailureRendererClass)) -#define GCR_IS_FAILURE_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_FAILURE_RENDERER)) -#define GCR_IS_FAILURE_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_FAILURE_RENDERER)) -#define GCR_FAILURE_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_FAILURE_RENDERER, GcrFailureRendererClass)) - -typedef struct _GcrFailureRenderer GcrFailureRenderer; -typedef struct _GcrFailureRendererClass GcrFailureRendererClass; -typedef struct _GcrFailureRendererPrivate GcrFailureRendererPrivate; - -struct _GcrFailureRenderer { - /*< private >*/ - GObject parent; - GcrFailureRendererPrivate *pv; -}; - -struct _GcrFailureRendererClass { - /*< private >*/ - GObjectClass parent_class; -}; - -GType gcr_failure_renderer_get_type (void); - -GcrRenderer * gcr_failure_renderer_new (const gchar *label, - GError *error); - -GcrRenderer * gcr_failure_renderer_new_unsupported (const gchar *label); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrFailureRenderer, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_FAILURE_RENDERER_H__ */ diff --git a/ui/gcr-gnupg-renderer.c b/ui/gcr-gnupg-renderer.c deleted file mode 100644 index 73fb5d6..0000000 --- a/ui/gcr-gnupg-renderer.c +++ /dev/null @@ -1,852 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr-icons.h" -#include "gcr/gcr-gnupg-records.h" -#include "gcr/gcr-openpgp.h" -#include "gcr/gcr-simple-certificate.h" -#include "gcr/gcr-types.h" - -#include "gcr-display-view.h" -#include "gcr-gnupg-renderer.h" -#include "gcr-renderer.h" - -#include "gck/gck.h" - -#include "egg/egg-hex.h" - -#include <gdk/gdk.h> -#include <glib/gi18n-lib.h> - -#include <stdlib.h> - -enum { - PROP_0, - PROP_RECORDS, - PROP_LABEL, - PROP_ATTRIBUTES -}; - -struct _GcrGnupgRendererPrivate { - GPtrArray *records; - GckAttributes *attrs; - gchar *label; -}; - -static void _gcr_gnupg_renderer_iface_init (GcrRendererIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrGnupgRenderer, _gcr_gnupg_renderer, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrGnupgRenderer); - G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, _gcr_gnupg_renderer_iface_init); -); - -/* ----------------------------------------------------------------------------- - * INTERNAL - */ - -static gchar * -calculate_label (GcrGnupgRenderer *self) -{ - gchar *userid; - gchar *label = NULL; - - if (self->pv->attrs) { - if (gck_attributes_find_string (self->pv->attrs, CKA_LABEL, &label)) - return label; - } - - userid = _gcr_gnupg_records_get_user_id (self->pv->records); - if (userid != NULL) { - if (!_gcr_gnupg_records_parse_user_id (userid, &label, NULL, NULL)) - label = NULL; - } - - if (label != NULL) - return label; - - if (self->pv->label) - return g_strdup (self->pv->label); - - return g_strdup (_("PGP Key")); -} - -static void -_gcr_gnupg_renderer_init (GcrGnupgRenderer *self) -{ - self->pv = _gcr_gnupg_renderer_get_instance_private (self); -} - -static void -_gcr_gnupg_renderer_finalize (GObject *obj) -{ - GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj); - - gck_attributes_unref (self->pv->attrs); - g_free (self->pv->label); - if (self->pv->records) - g_ptr_array_unref (self->pv->records); - - G_OBJECT_CLASS (_gcr_gnupg_renderer_parent_class)->finalize (obj); -} - -static void -_gcr_gnupg_renderer_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj); - - switch (prop_id) { - case PROP_RECORDS: - _gcr_gnupg_renderer_set_records (self, g_value_get_boxed (value)); - break; - case PROP_LABEL: - g_free (self->pv->label); - self->pv->label = g_value_dup_string (value); - g_object_notify (obj, "label"); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - break; - case PROP_ATTRIBUTES: - _gcr_gnupg_renderer_set_attributes (self, g_value_get_boxed (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_gnupg_renderer_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GcrGnupgRenderer *self = GCR_GNUPG_RENDERER (obj); - - switch (prop_id) { - case PROP_RECORDS: - g_value_set_object (value, self->pv->records); - break; - case PROP_LABEL: - g_value_take_string (value, calculate_label (self)); - break; - case PROP_ATTRIBUTES: - g_value_set_boxed (value, self->pv->attrs); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_gnupg_renderer_class_init (GcrGnupgRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GckBuilder builder = GCK_BUILDER_INIT; - - _gcr_gnupg_renderer_parent_class = g_type_class_peek_parent (klass); - - gobject_class->finalize = _gcr_gnupg_renderer_finalize; - gobject_class->set_property = _gcr_gnupg_renderer_set_property; - gobject_class->get_property = _gcr_gnupg_renderer_get_property; - - g_object_class_install_property (gobject_class, PROP_RECORDS, - g_param_spec_boxed ("records", "Records", "Gnupg records to display", - G_TYPE_PTR_ARRAY, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, - g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes", - GCK_TYPE_ATTRIBUTES, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_LABEL, - g_param_spec_string ("label", "Label", "Certificate Label", - "", - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /* Register this as a renderer which can be loaded */ - gck_builder_add_ulong (&builder, CKA_CLASS, CKO_GCR_GNUPG_RECORDS); - gcr_renderer_register (GCR_TYPE_GNUPG_RENDERER, gck_builder_end (&builder)); -} - -static const gchar * -name_for_algo (guint algo) -{ - switch (algo) - { - case GCR_OPENPGP_ALGO_RSA: - case GCR_OPENPGP_ALGO_RSA_E: - case GCR_OPENPGP_ALGO_RSA_S: - return _("RSA"); - case GCR_OPENPGP_ALGO_ELG_E: - return _("Elgamal"); - case GCR_OPENPGP_ALGO_DSA: - return _("DSA"); - default: - return NULL; - } -} - -static const gchar * -capability_for_code (gchar code) -{ - switch (code) { - case 'e': case 'E': - return _("Encrypt"); - case 's': case 'S': - return _("Sign"); - case 'c': case 'C': - return _("Certify"); - case 'a': case 'A': - return _("Authenticate"); - case 'D': - return C_("capability", "Disabled"); - default: - return NULL; - } -} - -static gchar * -capabilities_for_codes (const gchar *codes) -{ - const gchar *cap; - GString *result; - guint i; - - result = g_string_new (""); - for (i = 0; codes[i] != 0; i++) { - if (result->len) - g_string_append_unichar (result, GCR_DISPLAY_VIEW_LINE_BREAK); - cap = capability_for_code (codes[i]); - if (cap != NULL) - g_string_append (result, cap); - else - g_string_append_c (result, codes[i]); - } - return g_string_free (result, FALSE); -} - -static const gchar * -status_for_code (gchar code) -{ - switch (code) { - case 'o': - return _("Unknown"); - case 'i': - return _("Invalid"); - case 'd': - return C_("ownertrust", "Disabled"); - case 'r': - return _("Revoked"); - case 'e': - return _("Expired"); - case 'q': case '-': - return _("Undefined trust"); - case 'n': - return _("Distrusted"); - case 'm': - return _("Marginally trusted"); - case 'f': - return _("Fully trusted"); - case 'u': - return _("Ultimately trusted"); - default: - return NULL; - } -} - -static const gchar * -message_for_code (gchar code, - GtkMessageType *message_type) -{ - *message_type = GTK_MESSAGE_OTHER; - switch (code) { - case 'o': - *message_type = GTK_MESSAGE_QUESTION; - return _("The information in this key has not yet been verified"); - case 'i': - *message_type = GTK_MESSAGE_ERROR; - return _("This key is invalid"); - case 'd': - *message_type = GTK_MESSAGE_WARNING; - return _("This key has been disabled"); - case 'r': - *message_type = GTK_MESSAGE_ERROR; - return _("This key has been revoked"); - case 'e': - *message_type = GTK_MESSAGE_ERROR; - return _("This key has expired"); - case 'q': case '-': - return NULL; - case 'n': - *message_type = GTK_MESSAGE_WARNING; - return _("This key is distrusted"); - case 'm': - *message_type = GTK_MESSAGE_OTHER; - return _("This key is marginally trusted"); - case 'f': - *message_type = GTK_MESSAGE_OTHER; - return _("This key is fully trusted"); - case 'u': - *message_type = GTK_MESSAGE_OTHER; - return _("This key is ultimately trusted"); - default: - return NULL; - } -} - -static void -append_key_record (GcrGnupgRenderer *self, - GcrDisplayView *view, - GcrRecord *record, - const gchar *title) -{ - GcrRenderer *renderer = GCR_RENDERER (self); - const gchar *value; - gchar *display; - GDateTime *date; - gchar code; - guint algo; - guint bits; - - _gcr_display_view_append_heading (view, renderer, title); - - /* Key ID */ - value = _gcr_record_get_raw (record, GCR_RECORD_KEY_KEYID); - if (value != NULL) - _gcr_display_view_append_value (view, renderer, _("Key ID"), value, TRUE); - - /* Algorithm */ - if (_gcr_record_get_uint (record, GCR_RECORD_KEY_ALGO, &algo)) { - display = NULL; - value = name_for_algo (algo); - if (value == NULL) - value = display = g_strdup_printf ("%u", algo); - _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE); - g_free (display); - } - - /* Key Size */ - if (_gcr_record_get_uint (record, GCR_RECORD_KEY_BITS, &bits)) { - display = g_strdup_printf ("%u", bits); - _gcr_display_view_append_value (view, renderer, _("Key Size"), display, FALSE); - g_free (display); - } - - /* Created */ - date = _gcr_record_get_date (record, GCR_RECORD_KEY_TIMESTAMP); - if (date != NULL) { - display = g_date_time_format (date, "%x"); - _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE); - g_free (display); - g_date_time_unref (date); - } - - /* Expiry */ - date = _gcr_record_get_date (record, GCR_RECORD_KEY_EXPIRY); - if (date != NULL) { - display = g_date_time_format (date, "%x"); - _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE); - g_free (display); - g_date_time_unref (date); - } - - /* Capabilities */ - value = _gcr_record_get_raw (record, GCR_RECORD_PUB_CAPS); - if (value != NULL && value[0] != '\0') { - display = capabilities_for_codes (value); - _gcr_display_view_append_value (view, renderer, _("Capabilities"), display, FALSE); - g_free (display); - } - - /* Owner Trust */ - code = _gcr_record_get_char (record, GCR_RECORD_KEY_OWNERTRUST); - if (code != 0) { - display = NULL; - value = status_for_code (code); - if (value == NULL) { - value = display = g_new0 (gchar, 2); - display[0] = code; - } - _gcr_display_view_append_value (view, renderer, _("Owner trust"), value, FALSE); - g_free (display); - } -} - -static void -append_uid_record (GcrGnupgRenderer *self, - GcrDisplayView *view, - GcrRecord *record) -{ - GcrRenderer *renderer = GCR_RENDERER (self); - gchar *userid; - gchar *name; - gchar *comment; - gchar *email; - GDateTime *date; - gchar *display; - - _gcr_display_view_append_heading (view, renderer, _("User ID")); - - userid = _gcr_record_get_string (record, GCR_RECORD_UID_USERID); - if (userid == NULL) { - _gcr_display_view_append_value (view, renderer, _("Value"), _("Unknown"), FALSE); - return; - } - - if (_gcr_gnupg_records_parse_user_id (userid, &name, &email, &comment)) { - if (name != NULL) - _gcr_display_view_append_value (view, renderer, _("Name"), name, FALSE); - g_free (name); - if (email != NULL) - _gcr_display_view_append_value (view, renderer, _("Email"), email, FALSE); - g_free (email); - if (comment != NULL) - _gcr_display_view_append_value (view, renderer, _("Comment"), comment, FALSE); - g_free (comment); - - /* Unparseable user id */ - } else { - _gcr_display_view_append_value (view, renderer, _("Value"), userid, FALSE); - } - - /* Created */ - date = _gcr_record_get_date (record, GCR_RECORD_UID_TIMESTAMP); - if (date != NULL) { - display = g_date_time_format (date, "%x"); - _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE); - g_free (display); - g_date_time_unref (date); - } - - /* Expiry */ - date = _gcr_record_get_date (record, GCR_RECORD_UID_EXPIRY); - if (date != NULL) { - display = g_date_time_format (date, "%x"); - _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE); - g_free (display); - g_date_time_unref (date); - } - - g_free (userid); -} - -static void -append_uat_record (GcrGnupgRenderer *self, - GcrDisplayView *view, - GcrRecord *record) -{ - GcrRenderer *renderer = GCR_RENDERER (self); - gchar **parts; - gchar *display; - const gchar *value; - GDateTime *date; - - _gcr_display_view_append_heading (view, renderer, _("User Attribute")); - - /* Size */ - value = _gcr_record_get_raw (record, GCR_RECORD_UAT_COUNT_SIZE); - if (value != NULL) { - parts = g_strsplit (value, " ", 2); - if (parts && parts[0] && parts[1]) - _gcr_display_view_append_value (view, renderer, _("Size"), parts[1], FALSE); - g_strfreev (parts); - } - - /* Created */ - date = _gcr_record_get_date (record, GCR_RECORD_KEY_TIMESTAMP); - if (date != NULL) { - display = g_date_time_format (date, "%x"); - _gcr_display_view_append_value (view, renderer, _("Created"), display, FALSE); - g_free (display); - g_date_time_unref (date); - } - - /* Expiry */ - date = _gcr_record_get_date (record, GCR_RECORD_KEY_EXPIRY); - if (date != NULL) { - display = g_date_time_format (date, "%x"); - _gcr_display_view_append_value (view, renderer, _("Expiry"), display, FALSE); - g_free (display); - g_date_time_unref (date); - } -} - -static const gchar * -signature_klass_string (const gchar *klass) -{ - char *end; - guint val; - - val = strtoul (klass, &end, 16); - if (end != klass + 2) - return NULL; - - switch (val) { - case 0x00: - return _("Signature of a binary document"); - case 0x01: - return _("Signature of a canonical text document"); - case 0x02: - return _("Standalone signature"); - case 0x10: - return _("Generic certification of key"); - case 0x11: - return _("Persona certification of key"); - case 0x12: - return _("Casual certification of key"); - case 0x13: - return _("Positive certification of key"); - case 0x18: - return _("Subkey binding signature"); - case 0x19: - return _("Primary key binding signature"); - case 0x1F: - return _("Signature directly on key"); - case 0x20: - return _("Key revocation signature"); - case 0x28: - return _("Subkey revocation signature"); - case 0x30: - return _("Certification revocation signature"); - case 0x40: - return _("Timestamp signature"); - case 0x50: - return _("Third-party confirmation signature"); - default: - return NULL; - } -} - -static void -append_sig_record (GcrGnupgRenderer *self, - GcrDisplayView *view, - GcrRecord *record, - const gchar *keyid) -{ - GcrRenderer *renderer = GCR_RENDERER (self); - const gchar *sigid; - gchar *display; - const gchar *value; - const gchar *klass; - guint algo; - - /* Hide self-signatures. There's so many of them */ - sigid = _gcr_record_get_raw (record, GCR_RECORD_SIG_KEYID); - if (sigid && keyid && g_str_equal (sigid, keyid)) - return; - - _gcr_display_view_append_heading (view, renderer, _("Signature")); - - /* Key ID */ - if (sigid != NULL) - _gcr_display_view_append_value (view, renderer, _("Key ID"), sigid, TRUE); - - /* Algorithm */ - if (_gcr_record_get_uint (record, GCR_RECORD_SIG_ALGO, &algo)) { - display = NULL; - value = name_for_algo (algo); - if (value == NULL) - value = display = g_strdup_printf ("%u", algo); - _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE); - g_free (display); - } - - /* User ID */ - display = _gcr_record_get_string (record, GCR_RECORD_SIG_USERID); - if (display != NULL) - _gcr_display_view_append_value (view, renderer, _("User ID"), display, FALSE); - g_free (display); - - /* Signature class */ - klass = _gcr_record_get_raw (record, GCR_RECORD_SIG_CLASS); - if (klass != NULL) { - value = NULL; - if (strlen (klass) >= 2) { - value = signature_klass_string (klass); - if (value != NULL) { - _gcr_display_view_append_value (view, renderer, _("Class"), value, FALSE); - if (klass[2] == 'l') - _gcr_display_view_append_value (view, renderer, _("Type"), _("Local only"), FALSE); - else if (klass[2] == 'x') - _gcr_display_view_append_value (view, renderer, _("Type"), _("Exportable"), FALSE); - } - } - if (value == NULL) - _gcr_display_view_append_value (view, renderer, _("Class"), klass, FALSE); - } -} - -static void -append_rvk_record (GcrGnupgRenderer *self, - GcrDisplayView *view, - GcrRecord *record) -{ - GcrRenderer *renderer = GCR_RENDERER (self); - const gchar *value; - gchar *display; - guint algo; - - _gcr_display_view_append_heading (view, renderer, _("Revocation Key")); - - /* Algorithm */ - if (_gcr_record_get_uint (record, GCR_RECORD_RVK_ALGO, &algo)) { - display = NULL; - value = name_for_algo (algo); - if (value == NULL) - value = display = g_strdup_printf ("%u", algo); - _gcr_display_view_append_value (view, renderer, _("Algorithm"), value, FALSE); - g_free (display); - } - - value = _gcr_record_get_raw (record, GCR_RECORD_RVK_FINGERPRINT); - if (value != NULL) - _gcr_display_view_append_value (view, renderer, _("Fingerprint"), value, TRUE); -} - -static void -append_fpr_record (GcrGnupgRenderer *self, - GcrDisplayView *view, - GcrRecord *record, - GQuark last_schema) -{ - GcrRenderer *renderer = GCR_RENDERER (self); - const gchar *value; - gpointer raw; - gsize n_raw; - - if (last_schema != GCR_RECORD_SCHEMA_PUB && - last_schema != GCR_RECORD_SCHEMA_SUB && - last_schema != GCR_RECORD_SCHEMA_SEC && - last_schema != GCR_RECORD_SCHEMA_SSB) - return; - - value = _gcr_record_get_raw (record, GCR_RECORD_FPR_FINGERPRINT); - if (value != NULL) { - raw = egg_hex_decode (value, -1, &n_raw); - if (raw != NULL) - _gcr_display_view_append_hex (view, renderer, _("Fingerprint"), raw, n_raw); - else - _gcr_display_view_append_value (view, renderer, _("Fingerprint"), value, TRUE); - g_free (raw); - } -} - -static void -_gcr_gnupg_renderer_render (GcrRenderer *renderer, - GcrViewer *viewer) -{ - GtkMessageType message_type; - GcrGnupgRenderer *self; - GcrDisplayView *view; - GDateTime *date; - const gchar *value; - gchar *display; - gchar *userid; - gchar *email; - gchar *comment; - GIcon *icon; - GQuark schema; - GQuark last_schema; - gchar code; - guint i; - - self = GCR_GNUPG_RENDERER (renderer); - - if (GCR_IS_DISPLAY_VIEW (viewer)) { - view = GCR_DISPLAY_VIEW (viewer); - - } else { - g_warning ("GcrGnupgRenderer only works with internal specific " - "GcrViewer returned by gcr_viewer_new()."); - return; - } - - _gcr_display_view_begin (view, renderer); - - if (self->pv->records == NULL || self->pv->records->len == 0) { - _gcr_display_view_end (view, renderer); - return; - } - - icon = _gcr_gnupg_records_get_icon (self->pv->records); - _gcr_display_view_set_icon (view, GCR_RENDERER (self), icon); - g_object_unref (icon); - - display = calculate_label (self); - _gcr_display_view_append_title (view, renderer, display); - g_free (display); - - userid = _gcr_gnupg_records_get_user_id (self->pv->records); - if (userid != NULL) { - if (_gcr_gnupg_records_parse_user_id (userid, NULL, &email, &comment)) { - if (email != NULL) - _gcr_display_view_append_content (view, renderer, _("Email"), email); - g_free (email); - if (comment != NULL) - _gcr_display_view_append_content (view, renderer, _("Comment"), comment); - g_free (comment); - } - g_free (userid); - } - - code = _gcr_record_get_char (self->pv->records->pdata[0], GCR_RECORD_TRUST); - if (code != 'e') { - date = _gcr_record_get_date (self->pv->records->pdata[0], GCR_RECORD_KEY_EXPIRY); - if (date != NULL) { - display = g_date_time_format (date, "%x"); - _gcr_display_view_append_content (view, renderer, _("Expires"), display); - g_date_time_unref (date); - g_free (display); - } - } - - /* The warning or status */ - value = message_for_code (code, &message_type); - if (value != NULL) - _gcr_display_view_append_message (view, renderer, message_type, value); - - _gcr_display_view_start_details (view, renderer); - - value = _gcr_gnupg_records_get_keyid (self->pv->records); - last_schema = 0; - - for (i = 0; i < self->pv->records->len; i++) { - schema = _gcr_record_get_schema (self->pv->records->pdata[i]); - if (schema == GCR_RECORD_SCHEMA_PUB) - append_key_record (self, view, self->pv->records->pdata[i], _("Public Key")); - else if (schema == GCR_RECORD_SCHEMA_SUB) - append_key_record (self, view, self->pv->records->pdata[i], _("Public Subkey")); - else if (schema == GCR_RECORD_SCHEMA_SEC) - append_key_record (self, view, self->pv->records->pdata[i], _("Secret Key")); - else if (schema == GCR_RECORD_SCHEMA_SSB) - append_key_record (self, view, self->pv->records->pdata[i], _("Secret Subkey")); - else if (schema == GCR_RECORD_SCHEMA_UID) - append_uid_record (self, view, self->pv->records->pdata[i]); - else if (schema == GCR_RECORD_SCHEMA_UAT) - append_uat_record (self, view, self->pv->records->pdata[i]); - else if (schema == GCR_RECORD_SCHEMA_SIG) - append_sig_record (self, view, self->pv->records->pdata[i], value); - else if (schema == GCR_RECORD_SCHEMA_RVK) - append_rvk_record (self, view, self->pv->records->pdata[i]); - else if (schema == GCR_RECORD_SCHEMA_FPR) - append_fpr_record (self, view, self->pv->records->pdata[i], last_schema); - last_schema = schema; - } - - _gcr_display_view_end (view, renderer); -} - -static void -_gcr_gnupg_renderer_iface_init (GcrRendererIface *iface) -{ - iface->render_view = _gcr_gnupg_renderer_render; -} - -GcrGnupgRenderer * -_gcr_gnupg_renderer_new (GPtrArray *records) -{ - g_return_val_if_fail (records != NULL, NULL); - - return g_object_new (GCR_TYPE_GNUPG_RENDERER, - "records", records, - NULL); -} - -GcrGnupgRenderer * -_gcr_gnupg_renderer_new_for_attributes (const gchar *label, - GckAttributes *attrs) -{ - g_return_val_if_fail (attrs != NULL, NULL); - - return g_object_new (GCR_TYPE_GNUPG_RENDERER, - "label", label, - "attributes", attrs, - NULL); -} - -GPtrArray * -_gcr_gnupg_renderer_get_records (GcrGnupgRenderer *self) -{ - g_return_val_if_fail (GCR_IS_GNUPG_RENDERER (self), NULL); - return self->pv->records; -} - -void -_gcr_gnupg_renderer_set_records (GcrGnupgRenderer *self, - GPtrArray *records) -{ - g_return_if_fail (GCR_IS_GNUPG_RENDERER (self)); - - if (records) - g_ptr_array_ref (records); - if (self->pv->records) - g_ptr_array_unref (self->pv->records); - self->pv->records = records; - - if (self->pv->attrs) { - gck_attributes_unref (self->pv->attrs); - self->pv->attrs = NULL; - g_object_notify (G_OBJECT (self), "attributes"); - } - - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - g_object_notify (G_OBJECT (self), "records"); -} - -GckAttributes* -_gcr_gnupg_renderer_get_attributes (GcrGnupgRenderer *self) -{ - g_return_val_if_fail (GCR_IS_GNUPG_RENDERER (self), NULL); - return self->pv->attrs; -} - -void -_gcr_gnupg_renderer_set_attributes (GcrGnupgRenderer *self, - GckAttributes *attrs) -{ - const GckAttribute *attr; - GPtrArray *records; - - g_return_if_fail (GCR_IS_GNUPG_RENDERER (self)); - - attr = gck_attributes_find (attrs, CKA_VALUE); - g_return_if_fail (attr != NULL); - records = _gcr_records_parse_colons (attr->value, attr->length); - g_return_if_fail (records != NULL); - - if (attrs) - gck_attributes_ref (attrs); - gck_attributes_unref (self->pv->attrs); - self->pv->attrs = attrs; - - if (self->pv->records) - g_ptr_array_unref (self->pv->records); - self->pv->records = records; - g_object_notify (G_OBJECT (self), "records"); - - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - g_object_notify (G_OBJECT (self), "attributes"); - -} diff --git a/ui/gcr-gnupg-renderer.h b/ui/gcr-gnupg-renderer.h deleted file mode 100644 index fc68713..0000000 --- a/ui/gcr-gnupg-renderer.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#if !defined (__GCR_H_INSIDE__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> can be included directly." -#endif - -#ifndef __GCR_GNUPG_RENDERER_H__ -#define __GCR_GNUPG_RENDERER_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-record.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_GNUPG_RENDERER (_gcr_gnupg_renderer_get_type ()) -#define GCR_GNUPG_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRenderer)) -#define GCR_GNUPG_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRendererClass)) -#define GCR_IS_GNUPG_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_GNUPG_RENDERER)) -#define GCR_IS_GNUPG_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_GNUPG_RENDERER)) -#define GCR_GNUPG_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_GNUPG_RENDERER, GcrGnupgRendererClass)) - -typedef struct _GcrGnupgRenderer GcrGnupgRenderer; -typedef struct _GcrGnupgRendererClass GcrGnupgRendererClass; -typedef struct _GcrGnupgRendererPrivate GcrGnupgRendererPrivate; - -struct _GcrGnupgRenderer { - GObject parent; - - /*< private >*/ - GcrGnupgRendererPrivate *pv; -}; - -struct _GcrGnupgRendererClass { - GObjectClass parent_class; -}; - -GType _gcr_gnupg_renderer_get_type (void); - -GcrGnupgRenderer * _gcr_gnupg_renderer_new (GPtrArray *records); - -GcrGnupgRenderer * _gcr_gnupg_renderer_new_for_attributes (const gchar *label, - GckAttributes *attrs); - -GPtrArray * _gcr_gnupg_renderer_get_records (GcrGnupgRenderer *self); - -void _gcr_gnupg_renderer_set_records (GcrGnupgRenderer *self, - GPtrArray *records); - -GckAttributes * _gcr_gnupg_renderer_get_attributes (GcrGnupgRenderer *self); - -void _gcr_gnupg_renderer_set_attributes (GcrGnupgRenderer *self, - GckAttributes *attrs); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrGnupgRenderer, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_GNUPG_RENDERER_H__ */ diff --git a/ui/gcr-import-button.c b/ui/gcr-import-button.c deleted file mode 100644 index f3a6478..0000000 --- a/ui/gcr-import-button.c +++ /dev/null @@ -1,592 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr-internal.h" -#include "gcr/gcr-library.h" -#include "gcr/gcr-marshal.h" -#include "gcr/gcr-parser.h" -#include "gcr/gcr-version.h" - -#include "eggimagemenuitem.h" -#include "gcr-import-button.h" -#include "gcr-pkcs11-import-interaction.h" - -#include <glib/gi18n-lib.h> - -enum { - PROP_0, - PROP_LABEL -}; - -/** - * GcrImportButton: - * - * A button which imports keys and certificates. - * - * The import button shows a spinner when the button is activated. When more - * than one importer is available, it shows a drop down to select which to - * import to. - */ - -/** - * GcrImportButtonClass: - * @parent_class: The parent class - * @importing: Emitted when the import begins. - * @imported: Emitted when the import completes, or fails. - * - * Class struct for [class@ImportButton]. - */ - -struct _GcrImportButtonPrivate { - GList *queued; - GList *importers; - gboolean ready; - gboolean created; - gboolean importing; - gchar *imported; - GtkWidget *spinner; - GtkWidget *arrow; - GtkWidget *label; - GCancellable *cancellable; - GtkMenu *menu; -}; - -enum { - IMPORTING, - IMPORTED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -static GQuark QUARK_IMPORTER = 0; - -#if GCR_CHECK_VERSION(4,0,0) -#error Port this class to derive from GtkMenuButton during 4.x ABI bump -#endif - -G_DEFINE_TYPE_WITH_PRIVATE (GcrImportButton, gcr_import_button, GTK_TYPE_BUTTON); - -static void -gcr_import_button_init (GcrImportButton *self) -{ - self->pv = gcr_import_button_get_instance_private (self); - self->pv->cancellable = g_cancellable_new (); - - self->pv->label = gtk_label_new (""); - gtk_label_set_use_underline (GTK_LABEL (self->pv->label), TRUE); -} - -static void -update_import_button (GcrImportButton *self) -{ - gchar *message; - gchar *label; - - /* Initializing, set a spinner */ - if (self->pv->queued && !self->pv->ready) { - gtk_widget_show (self->pv->spinner); - gtk_spinner_start (GTK_SPINNER (self->pv->spinner)); - gtk_widget_hide (self->pv->arrow); - gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); - gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Initializing\xE2\x80\xA6")); - - /* Importing, set a spinner */ - } else if (self->pv->importing) { - gtk_widget_show (self->pv->spinner); - gtk_spinner_start (GTK_SPINNER (self->pv->spinner)); - gtk_widget_hide (self->pv->arrow); - gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); - gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Import is in progress\xE2\x80\xA6")); - - } else if (self->pv->imported) { - gtk_widget_hide (self->pv->spinner); - gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); - gtk_widget_hide (self->pv->arrow); - gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); - message = g_strdup_printf (_("Imported to: %s"), self->pv->imported); - gtk_widget_set_tooltip_text (GTK_WIDGET (self), message); - g_free (message); - - /* Not importing, but have importers */ - } else if (self->pv->importers) { - - gtk_widget_hide (self->pv->spinner); - gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); - gtk_widget_set_sensitive (GTK_WIDGET (self), TRUE); - - /* More than one importer */ - if (self->pv->importers->next) { - gtk_widget_show (self->pv->arrow); - gtk_widget_set_tooltip_text (GTK_WIDGET (self), NULL); - - /* Only one importer */ - } else { - gtk_widget_hide (self->pv->arrow); - g_object_get (self->pv->importers->data, "label", &label, NULL); - message = g_strdup_printf (_("Import to: %s"), label); - gtk_widget_set_tooltip_text (GTK_WIDGET (self), message); - g_free (message); - g_free (label); - } - - /* No importers, none compatible */ - } else if (self->pv->created) { - gtk_widget_hide (self->pv->spinner); - gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); - gtk_widget_hide (self->pv->arrow); - - gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); - gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("Cannot import because there are no compatible importers")); - - /* No importers yet added */ - } else { - gtk_widget_hide (self->pv->spinner); - gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); - gtk_widget_hide (self->pv->arrow); - - gtk_widget_set_sensitive (GTK_WIDGET (self), FALSE); - gtk_widget_set_tooltip_text (GTK_WIDGET (self), _("No data to import")); - } -} - -static void -on_library_pkcs11_ready (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (user_data); - GList *queued, *l; - - self->pv->ready = TRUE; - - /* Process the parsed items that have been seen */ - queued = self->pv->queued; - self->pv->queued = NULL; - for (l = queued; l != NULL; l = g_list_next (l)) - gcr_import_button_add_parsed (self, l->data); - g_assert (self->pv->queued == NULL); - g_list_free_full (queued, gcr_parsed_unref); -} - -static void -gcr_import_button_constructed (GObject *obj) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (obj); - GtkWidget *grid; - - G_OBJECT_CLASS (gcr_import_button_parent_class)->constructed (obj); - - self->pv->spinner = gtk_spinner_new (); - self->pv->arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON); - grid = gtk_grid_new (); - - gtk_orientable_set_orientation (GTK_ORIENTABLE (grid), GTK_ORIENTATION_HORIZONTAL); - gtk_container_add (GTK_CONTAINER (grid), self->pv->spinner); - gtk_container_add (GTK_CONTAINER (grid), self->pv->label); - gtk_container_add (GTK_CONTAINER (grid), self->pv->arrow); - gtk_grid_set_row_spacing (GTK_GRID (grid), 3); - gtk_widget_set_hexpand (grid, TRUE); - gtk_widget_set_halign (grid, GTK_ALIGN_CENTER); - - gtk_widget_show (self->pv->label); - gtk_widget_show (grid); - - gtk_container_add (GTK_CONTAINER (self), grid); - - update_import_button (self); - - gcr_pkcs11_initialize_async (NULL, on_library_pkcs11_ready, g_object_ref (self)); -} - -static void -gcr_import_button_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (obj); - - switch (prop_id) { - case PROP_LABEL: - gtk_label_set_label (GTK_LABEL (self->pv->label), g_value_get_string (value)); - g_object_notify (obj, "label"); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_import_button_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (obj); - - switch (prop_id) { - case PROP_LABEL: - g_value_set_string (value, gtk_label_get_label (GTK_LABEL (self->pv->label))); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_import_button_dispose (GObject *obj) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (obj); - - gck_list_unref_free (self->pv->importers); - self->pv->importers = NULL; - g_cancellable_cancel (self->pv->cancellable); - g_clear_object (&self->pv->menu); - - g_list_free_full (self->pv->queued, gcr_parsed_unref); - self->pv->queued = NULL; - - G_OBJECT_CLASS (gcr_import_button_parent_class)->dispose (obj); -} - -static void -gcr_import_button_finalize (GObject *obj) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (obj); - - g_object_unref (self->pv->cancellable); - - G_OBJECT_CLASS (gcr_import_button_parent_class)->finalize (obj); -} - -static void -on_import_complete (GObject *importer, - GAsyncResult *result, - gpointer user_data) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (user_data); - GError *error = NULL; - - g_return_if_fail (self->pv->imported == NULL); - - self->pv->importing = FALSE; - - gcr_importer_import_finish (GCR_IMPORTER (importer), result, &error); - if (error == NULL) { - g_object_get (importer, "label", &self->pv->imported, NULL); - gck_list_unref_free (self->pv->importers); - self->pv->importers = NULL; - } - - g_signal_emit (self, signals[IMPORTED], 0, importer, error); - g_clear_error (&error); - - update_import_button (self); -} - -static void -begin_import (GcrImportButton *self, - GcrImporter *importer) -{ - GTlsInteraction *interaction; - GtkWindow *window; - - g_return_if_fail (self->pv->importing == FALSE); - - g_signal_emit (self, signals[IMPORTING], 0, importer); - - self->pv->importing = TRUE; - g_free (self->pv->imported); - self->pv->imported = NULL; - - /* TODO: Hack. Need to figure out how to pair these up... */ - if (g_strcmp0 (G_OBJECT_TYPE_NAME (importer), "GcrPkcs11Importer") == 0) { - window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))); - interaction = _gcr_pkcs11_import_interaction_new (window); - gcr_importer_set_interaction (importer, interaction); - g_object_unref (interaction); - } - - gcr_importer_import_async (importer, - self->pv->cancellable, - on_import_complete, - g_object_ref (self)); -} - -static void -on_importer_menu_activated (GtkMenuItem *menu_item, - gpointer user_data) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (user_data); - GcrImporter *importer; - - importer = g_object_get_qdata (G_OBJECT (menu_item), QUARK_IMPORTER); - g_return_if_fail (GCR_IMPORTER (importer)); - g_return_if_fail (self->pv->importing == FALSE); - - begin_import (self, importer); - update_import_button (self); -} - -static void -update_importer_menu (GcrImportButton *self) -{ - GtkWidget *menu_item; - GtkWidget *image; - GList *children, *l; - GIcon *icon; - gchar *label; - - if (!self->pv->menu) { - self->pv->menu = GTK_MENU (gtk_menu_new ()); - g_object_ref_sink (self->pv->menu); - } - - children = gtk_container_get_children (GTK_CONTAINER (self->pv->menu)); - for (l = children; l != NULL; l = g_list_next (l)) - gtk_container_remove (GTK_CONTAINER (self->pv->menu), l->data); - g_list_free (children); - - for (l = self->pv->importers; l != NULL; l = g_list_next (l)) { - g_object_get (l->data, "label", &label, "icon", &icon, NULL); - menu_item = egg_image_menu_item_new_with_label (label); - g_signal_connect (menu_item, "activate", G_CALLBACK (on_importer_menu_activated), self); - g_object_set_qdata (G_OBJECT (menu_item), QUARK_IMPORTER, l->data); - image = gtk_image_new_from_gicon (icon, GTK_ICON_SIZE_MENU); - egg_image_menu_item_set_image (EGG_IMAGE_MENU_ITEM (menu_item), image); - egg_image_menu_item_set_always_show_image (EGG_IMAGE_MENU_ITEM (menu_item), TRUE); - gtk_widget_show (image); - gtk_widget_show (menu_item); - gtk_container_add (GTK_CONTAINER (self->pv->menu), menu_item); - g_object_unref (icon); - g_free (label); - } -} - -#if !GTK_CHECK_VERSION (3,22,0) -static void -on_menu_position (GtkMenu *menu, - gint *x, - gint *y, - gboolean *push_in, - gpointer user_data) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (user_data); - GtkWidget *widget = GTK_WIDGET (self); - GtkAllocation allocation; - GtkRequisition menu_req; - GdkRectangle monitor; - GdkWindow *window; - GtkWidget *toplevel; - GdkScreen *screen; - gint monitor_num; - gint sx = 0; - gint sy = 0; - - g_return_if_fail (x != NULL); - g_return_if_fail (y != NULL); - g_return_if_fail (push_in != NULL); - - gtk_widget_get_allocation (widget, &allocation); - - if (!gtk_widget_get_has_window (widget)) { - sx += allocation.x; - sy += allocation.y; - } - - window = gtk_widget_get_window (widget); - gdk_window_get_root_coords (window, sx, sy, &sx, &sy); - - gtk_widget_get_preferred_size (GTK_WIDGET (menu), NULL, &menu_req); - if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR) - *x = sx; - else - *x = sx + allocation.width - menu_req.width; - *y = sy; - - screen = gtk_widget_get_screen (widget); - monitor_num = gdk_screen_get_monitor_at_window (screen, window); - if (monitor_num < 0) - monitor_num = 0; - gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); - - if (*x < monitor.x) - *x = monitor.x; - else if (*x + menu_req.width > monitor.x + monitor.width) - *x = monitor.x + monitor.width - menu_req.width; - - if (monitor.y + monitor.height - *y - allocation.height >= menu_req.height) - *y += allocation.height; - else if (*y - monitor.y >= menu_req.height) - *y -= menu_req.height; - else if (monitor.y + monitor.height - *y - allocation.height > *y - monitor.y) - *y += allocation.height; - else - *y -= menu_req.height; - - gtk_menu_set_monitor (menu, monitor_num); - - toplevel = gtk_widget_get_parent (GTK_WIDGET (menu)); - if (GTK_IS_WINDOW (toplevel) && gtk_widget_get_visible (toplevel)) - gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU); - - *push_in = FALSE; -} -#endif - -static void -gcr_import_button_clicked (GtkButton *button) -{ - GcrImportButton *self = GCR_IMPORT_BUTTON (button); - - g_return_if_fail (self->pv->importing == FALSE); - g_return_if_fail (self->pv->importers != NULL); - - /* More than one importer, show the menu */ - if (self->pv->importers->next) { - update_importer_menu (self); -#if GTK_CHECK_VERSION (3,22,0) - if (gtk_widget_get_direction (GTK_WIDGET (self)) == GTK_TEXT_DIR_LTR) - gtk_menu_popup_at_widget (self->pv->menu, - GTK_WIDGET (self), - GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, - NULL); - else - gtk_menu_popup_at_widget (self->pv->menu, - GTK_WIDGET (self), - GDK_GRAVITY_SOUTH_EAST, GDK_GRAVITY_NORTH_EAST, - NULL); - -#else - gtk_menu_popup (self->pv->menu, NULL, NULL, on_menu_position, - self, 1, gtk_get_current_event_time ()); -#endif - - /* Only one importer, import on click */ - } else { - begin_import (self, self->pv->importers->data); - } - - update_import_button (self); -} - -static void -gcr_import_button_class_init (GcrImportButtonClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass); - - gobject_class->constructed = gcr_import_button_constructed; - gobject_class->dispose = gcr_import_button_dispose; - gobject_class->finalize = gcr_import_button_finalize; - gobject_class->get_property = gcr_import_button_get_property; - gobject_class->set_property = gcr_import_button_set_property; - - button_class->clicked = gcr_import_button_clicked; - - g_object_class_override_property (gobject_class, PROP_LABEL, "label"); - - /** - * GcrImportButton::importing: - * @self: the import button - * @importer: the importer that will be imported to - * - * Signal emitted when an import begins. - */ - signals[IMPORTING] = g_signal_new ("importing", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GcrImportButtonClass, importing), - NULL, NULL, NULL, - G_TYPE_NONE, 1, G_TYPE_OBJECT); - - /** - * GcrImportButton::imported: - * @self: the import button - * @importer: the importer that was imported to - * @error: if import was successful %NULL, or an error - * - * Signal emitted when an import completes or fails. - */ - signals[IMPORTED] = g_signal_new ("imported", GCR_TYPE_IMPORT_BUTTON, G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GcrImportButtonClass, imported), - NULL, NULL, _gcr_marshal_VOID__OBJECT_BOXED, - G_TYPE_NONE, 2, G_TYPE_OBJECT, G_TYPE_ERROR); - - QUARK_IMPORTER = g_quark_from_static_string ("gcr-import-button-importer"); -} - -/** - * gcr_import_button_new: - * @label: (nullable): label to display on the button - * - * Create a new #GcrImportButton. - * - * Returns: (transfer full): a newly created #GcrImportButton - */ -GcrImportButton * -gcr_import_button_new (const gchar *label) -{ - return g_object_new (GCR_TYPE_IMPORT_BUTTON, - "label", label, - NULL); -} - -/** - * gcr_import_button_add_parsed: - * @self: an import button - * @parsed: a parsed item - * - * Queue an item to import via the button - */ -void -gcr_import_button_add_parsed (GcrImportButton *self, - GcrParsed *parsed) -{ - GList *importers; - - g_return_if_fail (GCR_IS_IMPORT_BUTTON (self)); - g_return_if_fail (parsed != NULL); - - if (!self->pv->ready) { - self->pv->queued = g_list_prepend (self->pv->queued, gcr_parsed_ref (parsed)); - update_import_button (self); - return; - } - - g_free (self->pv->imported); - self->pv->imported = NULL; - - if (self->pv->created) { - importers = gcr_importer_queue_and_filter_for_parsed (self->pv->importers, parsed); - } else { - importers = gcr_importer_create_for_parsed (parsed); - self->pv->created = TRUE; - } - - gck_list_unref_free (self->pv->importers); - self->pv->importers = importers; - - update_import_button (self); -} diff --git a/ui/gcr-import-button.h b/ui/gcr-import-button.h deleted file mode 100644 index 5a06408..0000000 --- a/ui/gcr-import-button.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_IMPORT_BUTTON_H__ -#define __GCR_IMPORT_BUTTON_H__ - -#include "gcr/gcr-importer.h" - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_IMPORT_BUTTON (gcr_import_button_get_type ()) -#define GCR_IMPORT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_IMPORT_BUTTON, GcrImportButton)) -#define GCR_IMPORT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_IMPORT_BUTTON, GcrImportButtonClass)) -#define GCR_IS_IMPORT_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_IMPORT_BUTTON)) -#define GCR_IS_IMPORT_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_IMPORT_BUTTON)) -#define GCR_IMPORT_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_IMPORT_BUTTON, GcrImportButtonClass)) - -typedef struct _GcrImportButton GcrImportButton; -typedef struct _GcrImportButtonClass GcrImportButtonClass; -typedef struct _GcrImportButtonPrivate GcrImportButtonPrivate; - -struct _GcrImportButton { - GtkButton parent; - - /*< private >*/ - GcrImportButtonPrivate *pv; -}; - -struct _GcrImportButtonClass { - GtkButtonClass parent_class; - - void (*importing) (GcrImportButton *self, - GcrImporter *importer); - - void (*imported) (GcrImportButton *self, - GcrImporter *importer, - GError *error); - - /*< private >*/ - gpointer padding[10]; -}; - -GType gcr_import_button_get_type (void) G_GNUC_CONST; - -GcrImportButton * gcr_import_button_new (const gchar *label); - -void gcr_import_button_add_parsed (GcrImportButton *self, - GcrParsed *parsed); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrImportButton, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_IMPORT_BUTTON_H__ */ diff --git a/ui/gcr-key-renderer.c b/ui/gcr-key-renderer.c deleted file mode 100644 index 850a2ca..0000000 --- a/ui/gcr-key-renderer.c +++ /dev/null @@ -1,481 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-fingerprint.h" -#include "gcr/gcr-icons.h" -#include "gcr/gcr-subject-public-key.h" - -#include "gcr-key-renderer.h" -#include "gcr-display-view.h" -#include "gcr-renderer.h" -#include "gcr-viewer.h" - -#include "gck/gck.h" - -#include "egg/egg-asn1x.h" - -#include <gdk/gdk.h> -#include <glib/gi18n-lib.h> - -/** - * GcrKeyRenderer: - * - * An implementation of #GcrRenderer which renders keys. - */ - -/** - * GcrKeyRendererClass: - * @parent_class: The parent class. - * - * The class for #GcrKeyRenderer. - */ - -enum { - PROP_0, - PROP_LABEL, - PROP_ATTRIBUTES, - PROP_OBJECT -}; - -struct _GcrKeyRendererPrivate { - guint key_size; - gchar *label; - GckAttributes *attributes; - GckObject *object; - GIcon *icon; - gulong notify_sig; - GBytes *spk; -}; - -static void gcr_key_renderer_renderer_iface (GcrRendererIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrKeyRenderer, gcr_key_renderer, G_TYPE_OBJECT, - G_ADD_PRIVATE (GcrKeyRenderer); - G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_key_renderer_renderer_iface)); - -/* ----------------------------------------------------------------------------- - * INTERNAL - */ - -static gchar* -calculate_label (GcrKeyRenderer *self) -{ - gchar *label; - - if (self->pv->label) - return g_strdup (self->pv->label); - - if (self->pv->attributes) { - if (gck_attributes_find_string (self->pv->attributes, CKA_LABEL, &label)) - return label; - } - - return g_strdup (_("Key")); -} - -static GckAttributes * -calculate_attrs (GcrKeyRenderer *self) -{ - if (self->pv->attributes) - return gck_attributes_ref (self->pv->attributes); - - if (GCK_IS_OBJECT_CACHE (self->pv->object)) - return gck_object_cache_get_attributes (GCK_OBJECT_CACHE (self->pv->object)); - - return NULL; -} - -static guchar * -calculate_fingerprint (GcrKeyRenderer *self, - GckAttributes *attrs, - GChecksumType algorithm, - gsize *n_fingerprint) -{ - if (self->pv->spk) - return gcr_fingerprint_from_subject_public_key_info (g_bytes_get_data (self->pv->spk, NULL), - g_bytes_get_size (self->pv->spk), - algorithm, n_fingerprint); - - return gcr_fingerprint_from_attributes (attrs, algorithm, n_fingerprint); -} - -static void -on_subject_public_key (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GcrKeyRenderer *self = GCR_KEY_RENDERER (user_data); - GError *error = NULL; - GNode *node; - - node = _gcr_subject_public_key_load_finish (result, &error); - if (error != NULL) { - g_message ("couldn't load key information: %s", error->message); - g_clear_error (&error); - - } else { - if (self->pv->spk) - g_bytes_unref (self->pv->spk); - self->pv->spk = NULL; - - self->pv->spk = egg_asn1x_encode (node, NULL); - if (self->pv->spk == NULL) - g_warning ("invalid subjectPublicKey loaded: %s", - egg_asn1x_message (node)); - egg_asn1x_destroy (node); - - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - } - - g_object_unref (self); -} - -static void -update_subject_public_key (GcrKeyRenderer *self) -{ - if (self->pv->spk) - g_bytes_unref (self->pv->spk); - self->pv->spk = NULL; - - if (!self->pv->object) - return; - - _gcr_subject_public_key_load_async (self->pv->object, NULL, - on_subject_public_key, - g_object_ref (self)); -} - -static void -on_object_cache_attributes (GObject *obj, - GParamSpec *spec, - gpointer user_data) -{ - GcrKeyRenderer *self = GCR_KEY_RENDERER (user_data); - update_subject_public_key (self); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); -} - -static void -gcr_key_renderer_init (GcrKeyRenderer *self) -{ - self->pv = gcr_key_renderer_get_instance_private (self); - self->pv->icon = g_themed_icon_new (GCR_ICON_KEY); -} - -static void -gcr_key_renderer_dispose (GObject *obj) -{ - GcrKeyRenderer *self = GCR_KEY_RENDERER (obj); - - if (self->pv->spk) - g_bytes_unref (self->pv->spk); - self->pv->spk = NULL; - - if (self->pv->object && self->pv->notify_sig) { - g_signal_handler_disconnect (self->pv->object, self->pv->notify_sig); - self->pv->notify_sig = 0; - } - g_clear_object (&self->pv->object); - - G_OBJECT_CLASS (gcr_key_renderer_parent_class)->dispose (obj); -} - -static void -gcr_key_renderer_finalize (GObject *obj) -{ - GcrKeyRenderer *self = GCR_KEY_RENDERER (obj); - - if (self->pv->attributes) - gck_attributes_unref (self->pv->attributes); - self->pv->attributes = NULL; - - g_free (self->pv->label); - self->pv->label = NULL; - - if (self->pv->icon) - g_object_unref (self->pv->icon); - self->pv->icon = NULL; - - G_OBJECT_CLASS (gcr_key_renderer_parent_class)->finalize (obj); -} - -static void -gcr_key_renderer_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrKeyRenderer *self = GCR_KEY_RENDERER (obj); - - switch (prop_id) { - case PROP_LABEL: - g_free (self->pv->label); - self->pv->label = g_value_dup_string (value); - g_object_notify (obj, "label"); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - break; - case PROP_ATTRIBUTES: - gck_attributes_unref (self->pv->attributes); - self->pv->attributes = g_value_dup_boxed (value); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - break; - case PROP_OBJECT: - g_clear_object (&self->pv->object); - self->pv->object = g_value_dup_object (value); - if (self->pv->object) { - gck_attributes_unref (self->pv->attributes); - self->pv->attributes = NULL; - } - if (GCK_IS_OBJECT_CACHE (self->pv->object)) { - self->pv->notify_sig = g_signal_connect (self->pv->object, - "notify::attributes", - G_CALLBACK (on_object_cache_attributes), - self); - on_object_cache_attributes (G_OBJECT (self->pv->object), NULL, self); - } - g_object_notify (obj, "attributes"); - g_object_notify (obj, "object"); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_key_renderer_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrKeyRenderer *self = GCR_KEY_RENDERER (obj); - - switch (prop_id) { - case PROP_LABEL: - g_value_take_string (value, calculate_label (self)); - break; - case PROP_ATTRIBUTES: - g_value_take_boxed (value, calculate_attrs (self)); - break; - case PROP_OBJECT: - g_value_set_object (value, self->pv->object); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_key_renderer_class_init (GcrKeyRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GckBuilder builder = GCK_BUILDER_INIT; - - gcr_key_renderer_parent_class = g_type_class_peek_parent (klass); - - gobject_class->dispose = gcr_key_renderer_dispose; - gobject_class->finalize = gcr_key_renderer_finalize; - gobject_class->set_property = gcr_key_renderer_set_property; - gobject_class->get_property = gcr_key_renderer_get_property; - - g_object_class_override_property (gobject_class, PROP_LABEL, "label"); - g_object_class_override_property (gobject_class, PROP_ATTRIBUTES, "attributes"); - - g_object_class_install_property (gobject_class, PROP_OBJECT, - g_param_spec_object ("object", "Object", "Key Object", GCK_TYPE_OBJECT, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /* Register this as a view which can be loaded */ - gck_builder_add_ulong (&builder, CKA_CLASS, CKO_PRIVATE_KEY); - gcr_renderer_register (GCR_TYPE_KEY_RENDERER, gck_builder_end (&builder)); -} - -static void -gcr_key_renderer_real_render (GcrRenderer *renderer, GcrViewer *viewer) -{ - GcrKeyRenderer *self; - GcrDisplayView *view; - const gchar *text = ""; - GckAttributes *attrs; - gpointer fingerprint; - gsize n_fingerprint; - gchar *display; - gulong klass; - gulong key_type; - guint size; - - self = GCR_KEY_RENDERER (renderer); - - if (GCR_IS_DISPLAY_VIEW (viewer)) { - view = GCR_DISPLAY_VIEW (viewer); - - } else { - g_warning ("GcrKeyRenderer only works with internal specific " - "GcrViewer returned by gcr_viewer_new()."); - return; - } - - _gcr_display_view_begin (view, renderer); - - attrs = calculate_attrs (self); - if (attrs == NULL) { - _gcr_display_view_end (view, renderer); - return; - } - - if (!gck_attributes_find_ulong (attrs, CKA_CLASS, &klass) || - !gck_attributes_find_ulong (attrs, CKA_KEY_TYPE, &key_type)) { - g_warning ("private key does not have the CKA_CLASS and CKA_KEY_TYPE attributes"); - _gcr_display_view_end (view, renderer); - gck_attributes_unref (attrs); - return; - } - - _gcr_display_view_set_icon (view, renderer, self->pv->icon); - - display = calculate_label (self); - _gcr_display_view_append_title (view, renderer, display); - g_free (display); - - if (klass == CKO_PRIVATE_KEY) { - if (key_type == CKK_RSA) - text = _("Private RSA Key"); - else if (key_type == CKK_DSA) - text = _("Private DSA Key"); - else if (key_type == CKK_EC) - text = _("Private Elliptic Curve Key"); - else - text = _("Private Key"); - } else if (klass == CKO_PUBLIC_KEY) { - if (key_type == CKK_RSA) - text = _("Public DSA Key"); - else if (key_type == CKK_DSA) - text = _("Public DSA Key"); - else if (key_type == CKK_EC) - text = _("Public Elliptic Curve Key"); - else - text = _("Public Key"); - } - - _gcr_display_view_append_content (view, renderer, text, NULL); - - size = _gcr_subject_public_key_attributes_size (attrs); - if (size > 0) { - display = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%u bit", "%u bits", size), size); - _gcr_display_view_append_content (view, renderer, _("Strength"), display); - g_free (display); - } - - _gcr_display_view_start_details (view, renderer); - - if (key_type == CKK_RSA) - text = _("RSA"); - else if (key_type == CKK_DSA) - text = _("DSA"); - else if (key_type == CKK_EC) - text = _("Elliptic Curve"); - else - text = _("Unknown"); - _gcr_display_view_append_value (view, renderer, _("Algorithm"), text, FALSE); - - if (size == 0) - display = g_strdup (_("Unknown")); - else - display = g_strdup_printf ("%u", size); - _gcr_display_view_append_value (view, renderer, _("Size"), display, FALSE); - g_free (display); - - /* Fingerprints */ - _gcr_display_view_append_heading (view, renderer, _("Fingerprints")); - - fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA1, &n_fingerprint); - if (fingerprint) { - _gcr_display_view_append_hex (view, renderer, _("SHA1"), fingerprint, n_fingerprint); - g_free (fingerprint); - } - fingerprint = calculate_fingerprint (self, attrs, G_CHECKSUM_SHA256, &n_fingerprint); - if (fingerprint) { - _gcr_display_view_append_hex (view, renderer, _("SHA256"), fingerprint, n_fingerprint); - g_free (fingerprint); - } - - _gcr_display_view_end (view, renderer); - gck_attributes_unref (attrs); -} - -static void -gcr_key_renderer_renderer_iface (GcrRendererIface *iface) -{ - iface->render_view = gcr_key_renderer_real_render; -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_key_renderer_new: - * @label: (nullable): label describing the key - * @attrs: (nullable): key to display, or %NULL - * - * Create a new key renderer which renders a given key in the attributes. - * - * Returns: (transfer full): a newly allocated #GcrKeyRenderer, which should be - * freed with g_object_unref() - */ -GcrKeyRenderer* -gcr_key_renderer_new (const gchar *label, GckAttributes *attrs) -{ - return g_object_new (GCR_TYPE_KEY_RENDERER, "label", label, "attributes", attrs, NULL); -} - -/** - * gcr_key_renderer_set_attributes: - * @self: The key renderer - * @attrs: (nullable): the attributes to display - * - * Get the attributes displayed in the renderer. The attributes should represent - * either an RSA, DSA, or EC key in PKCS#11 style. - */ -void -gcr_key_renderer_set_attributes (GcrKeyRenderer *self, GckAttributes *attrs) -{ - g_return_if_fail (GCR_IS_KEY_RENDERER (self)); - - if (self->pv->attributes) - gck_attributes_unref (self->pv->attributes); - self->pv->attributes = attrs; - if (self->pv->attributes) - gck_attributes_ref (self->pv->attributes); - - g_object_notify (G_OBJECT (self), "attributes"); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); -} - -/** - * gcr_key_renderer_get_attributes: - * @self: The key renderer - * - * Get the attributes displayed in the renderer. - * - * Returns: (transfer none) (nullable): the attributes, owned by the renderer - */ -GckAttributes* -gcr_key_renderer_get_attributes (GcrKeyRenderer *self) -{ - g_return_val_if_fail (GCR_IS_KEY_RENDERER (self), NULL); - return self->pv->attributes; -} diff --git a/ui/gcr-key-renderer.h b/ui/gcr-key-renderer.h deleted file mode 100644 index 0ff592f..0000000 --- a/ui/gcr-key-renderer.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_KEY_RENDERER_H__ -#define __GCR_KEY_RENDERER_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-types.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_KEY_RENDERER (gcr_key_renderer_get_type ()) -#define GCR_KEY_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_KEY_RENDERER, GcrKeyRenderer)) -#define GCR_KEY_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_KEY_RENDERER, GcrKeyRendererClass)) -#define GCR_IS_KEY_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_KEY_RENDERER)) -#define GCR_IS_KEY_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_KEY_RENDERER)) -#define GCR_KEY_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_KEY_RENDERER, GcrKeyRendererClass)) - -typedef struct _GcrKeyRenderer GcrKeyRenderer; -typedef struct _GcrKeyRendererClass GcrKeyRendererClass; -typedef struct _GcrKeyRendererPrivate GcrKeyRendererPrivate; - -struct _GcrKeyRenderer { - GObject parent; - - /*< private >*/ - GcrKeyRendererPrivate *pv; -}; - -struct _GcrKeyRendererClass { - GObjectClass parent_class; -}; - -GType gcr_key_renderer_get_type (void); - -GcrKeyRenderer* gcr_key_renderer_new (const gchar *label, - GckAttributes *attrs); - -void gcr_key_renderer_set_attributes (GcrKeyRenderer *self, - GckAttributes *attrs); - -GckAttributes* gcr_key_renderer_get_attributes (GcrKeyRenderer *self); - -G_END_DECLS - -#endif /* __GCR_KEY_RENDERER_H__ */ diff --git a/ui/gcr-key-widget.c b/ui/gcr-key-widget.c deleted file mode 100644 index 708671c..0000000 --- a/ui/gcr-key-widget.c +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-key-renderer.h" -#include "gcr-key-widget.h" -#include "gcr-renderer.h" -#include "gcr-viewer.h" - -#include "gck/gck.h" - -#include <gdk/gdk.h> -#include <glib/gi18n-lib.h> - -/** - * GcrKeyWidget: - * - * A key widget and renderer - * - * A key widget can be used to display a RSA, DSA or EC key. The widget is - * normally in a collapsed state showing only details, but can be expanded by - * the user. - * - * Use [ctor@KeyWidget.new] to create a new key widget. Only one key can be - * displayed. A key widget contains a [iface@Viewer] internally and - * [class@KeyRenderer] is used to render the key to the viewer. To show more - * than one key in a view, create the viewer and add renderers to it. - */ - -enum { - PROP_0, - PROP_ATTRIBUTES -}; - -struct _GcrKeyWidget { - GtkBin parent; - - /*< private >*/ - GcrKeyWidgetPrivate *pv; -}; - -struct _GcrKeyWidgetClass { - /*< private >*/ - GtkBinClass parent_class; -}; - -struct _GcrKeyWidgetPrivate { - GcrViewer *viewer; - GcrKeyRenderer *renderer; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GcrKeyWidget, gcr_key_widget, GTK_TYPE_BIN); - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static GObject* -gcr_key_widget_constructor (GType type, guint n_props, GObjectConstructParam *props) -{ - GObject *obj = G_OBJECT_CLASS (gcr_key_widget_parent_class)->constructor (type, n_props, props); - GcrKeyWidget *self = NULL; - - g_return_val_if_fail (obj, NULL); - - self = GCR_KEY_WIDGET (obj); - - self->pv->viewer = gcr_viewer_new_scrolled (); - gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->pv->viewer)); - gtk_widget_show (GTK_WIDGET (self->pv->viewer)); - - gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (self->pv->renderer)); - return obj; -} - -static void -gcr_key_widget_init (GcrKeyWidget *self) -{ - self->pv = gcr_key_widget_get_instance_private (self); - self->pv->renderer = gcr_key_renderer_new (NULL, NULL); -} - -static void -gcr_key_widget_finalize (GObject *obj) -{ - GcrKeyWidget *self = GCR_KEY_WIDGET (obj); - - g_assert (self->pv->renderer); - g_object_unref (self->pv->renderer); - self->pv->renderer = NULL; - - g_assert (self->pv->viewer); - self->pv->viewer = NULL; - - G_OBJECT_CLASS (gcr_key_widget_parent_class)->finalize (obj); -} - -static void -gcr_key_widget_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrKeyWidget *self = GCR_KEY_WIDGET (obj); - - switch (prop_id) { - case PROP_ATTRIBUTES: - gcr_key_widget_set_attributes (self, g_value_get_boxed (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_key_widget_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrKeyWidget *self = GCR_KEY_WIDGET (obj); - - switch (prop_id) { - case PROP_ATTRIBUTES: - g_value_set_boxed (value, gcr_key_widget_get_attributes (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_key_widget_class_init (GcrKeyWidgetClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gcr_key_widget_parent_class = g_type_class_peek_parent (klass); - - gobject_class->constructor = gcr_key_widget_constructor; - gobject_class->finalize = gcr_key_widget_finalize; - gobject_class->set_property = gcr_key_widget_set_property; - gobject_class->get_property = gcr_key_widget_get_property; - - g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, - g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the widget", - GCK_TYPE_ATTRIBUTES, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_key_widget_new: - * @attrs: (nullable): key to display, or %NULL - * - * Create a new key widget which displays a given key in the attributes. - * - * Returns: A newly allocated #GcrKeyWidget, which should be freed - * with g_object_unref(). - */ -GcrKeyWidget* -gcr_key_widget_new (GckAttributes *attrs) -{ - return g_object_new (GCR_TYPE_KEY_WIDGET, "attributes", attrs, NULL); -} - -/** - * gcr_key_widget_set_attributes: - * @self: The key widget - * @attrs: (nullable): the attributes to display - * - * Get the attributes displayed in the widget. The attributes should represent - * either an RSA, DSA or EC key in PKCS#11 style. - */ -void -gcr_key_widget_set_attributes (GcrKeyWidget *self, GckAttributes *attrs) -{ - g_return_if_fail (GCR_IS_KEY_WIDGET (self)); - gcr_key_renderer_set_attributes (self->pv->renderer, attrs); -} - -/** - * gcr_key_widget_get_attributes: - * @self: The key widget - * - * Get the attributes displayed in the widget. - * - * Returns: (nullable) (transfer none): The attributes, owned by the widget. - */ -GckAttributes* -gcr_key_widget_get_attributes (GcrKeyWidget *self) -{ - g_return_val_if_fail (GCR_IS_KEY_WIDGET (self), NULL); - return gcr_key_renderer_get_attributes (self->pv->renderer); -} diff --git a/ui/gcr-key-widget.h b/ui/gcr-key-widget.h deleted file mode 100644 index bdbb797..0000000 --- a/ui/gcr-key-widget.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_KEY_WIDGET_H__ -#define __GCR_KEY_WIDGET_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-types.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_KEY_WIDGET (gcr_key_widget_get_type ()) -#define GCR_KEY_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_KEY_WIDGET, GcrKeyWidget)) -#define GCR_KEY_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_KEY_WIDGET, GcrKeyWidgetClass)) -#define GCR_IS_KEY_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_KEY_WIDGET)) -#define GCR_IS_KEY_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_KEY_WIDGET)) -#define GCR_KEY_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_KEY_WIDGET, GcrKeyWidgetClass)) - -typedef struct _GcrKeyWidget GcrKeyWidget; -typedef struct _GcrKeyWidgetClass GcrKeyWidgetClass; -typedef struct _GcrKeyWidgetPrivate GcrKeyWidgetPrivate; - -/* - * TODO: GcrKeyWidget and GcrKeyWidgetClass are hidden until - * we can figure out what they should be derived from. - */ - -GType gcr_key_widget_get_type (void); - -GcrKeyWidget* gcr_key_widget_new (GckAttributes *attrs); - -void gcr_key_widget_set_attributes (GcrKeyWidget *self, - GckAttributes *attrs); - -GckAttributes* gcr_key_widget_get_attributes (GcrKeyWidget *self); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrKeyWidget, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_KEY_WIDGET_H__ */ diff --git a/ui/gcr-list-selector.c b/ui/gcr-list-selector.c deleted file mode 100644 index 9445c6a..0000000 --- a/ui/gcr-list-selector.c +++ /dev/null @@ -1,442 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#include "config.h" - -#include "gcr/gcr-internal.h" - -#include "gcr-collection-model.h" -#include "gcr-list-selector.h" -#include "gcr-list-selector-private.h" -#include "gcr-live-search.h" - -#include <glib/gi18n-lib.h> - -#include <string.h> - -/** - * GcrListSelector: - * - * A selector widget to select 1 or more certificates or keys from a list. - * - * Live search is available for quick filtering. - */ - -enum { - PROP_0, - PROP_COLLECTION -}; - -struct _GcrListSelectorPrivate { - GcrCollection *collection; - GcrCollectionModel *model; - - GtkTreeModelFilter *filter; - GtkWidget *search_widget; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GcrListSelector, gcr_list_selector, GTK_TYPE_TREE_VIEW); - -static gboolean -object_is_visible (GcrListSelector *self, GObject *object) -{ - gchar *text; - gboolean visible; - - if (g_object_class_find_property (G_OBJECT_GET_CLASS (object), "search-text")) - g_object_get (object, "search-text", &text, NULL); - else - g_object_get (object, "label", &text, NULL); - - visible = _gcr_live_search_match (GCR_LIVE_SEARCH (self->pv->search_widget), text); - g_free (text); - - return visible; -} - -static gboolean -on_tree_filter_visible_func (GtkTreeModel *model, GtkTreeIter *iter, - gpointer user_data) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (user_data); - GObject *object; - - if (self->pv->search_widget == NULL || - !gtk_widget_get_visible (self->pv->search_widget)) - return TRUE; - - object = gcr_collection_model_object_for_iter (self->pv->model, iter); - if (object != NULL) - return object_is_visible (self, object); - - return FALSE; -} - -static gboolean -on_tree_view_start_search (GtkTreeView *view, gpointer user_data) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (view); - - if (self->pv->search_widget == NULL) - return FALSE; - - if (gtk_widget_get_visible (self->pv->search_widget)) - gtk_widget_grab_focus (self->pv->search_widget); - else - gtk_widget_show (self->pv->search_widget); - - return TRUE; -} - -static void -on_search_widget_text_notify (GcrLiveSearch *search, GParamSpec *pspec, - gpointer user_data) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (user_data); -#if 0 - GtkTreeViewColumn *focus_column; - GtkTreeModel *model; - GtkTreeIter iter; - GtkTreePath *path; - gboolean set_cursor = FALSE; -#endif - - gtk_tree_model_filter_refilter (self->pv->filter); - -#if 0 - /* Set cursor on the first object. */ - - model = gtk_tree_view_get_model (GTK_TREE_VIEW (self)); - gtk_tree_view_get_cursor (GTK_TREE_VIEW (view), &path, &focus_column); - - if (path == NULL) { - path = gtk_tree_path_new_from_string ("0"); - set_cursor = TRUE; - } - - if (set_cursor) { - /* FIXME: Workaround for GTK bug #621651, we have to make sure - * the path is valid. */ - if (gtk_tree_model_get_iter (model, &iter, path)) { - gtk_tree_view_set_cursor (GTK_TREE_VIEW (view), path, - focus_column, FALSE); - } - } - - gtk_tree_path_free (path); -#endif -} - -static void -on_search_widget_activate (GtkWidget *search, gpointer user_data) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (user_data); - GtkTreePath *path; - GtkTreeViewColumn *focus_column; - - gtk_tree_view_get_cursor (GTK_TREE_VIEW (self), &path, &focus_column); - if (path != NULL) { - gtk_tree_view_row_activated (GTK_TREE_VIEW (self), path, focus_column); - gtk_tree_path_free (path); - - gtk_widget_hide (search); - } -} - -static gboolean -on_search_widget_key_navigation (GtkWidget *search, GdkEvent *event, gpointer user_data) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (user_data); - GdkEvent *new_event; - gboolean ret = FALSE; - - new_event = gdk_event_copy (event); - gtk_widget_grab_focus (GTK_WIDGET (self)); - ret = gtk_widget_event (GTK_WIDGET (self), new_event); - gtk_widget_grab_focus (search); - - gdk_event_free (new_event); - - return ret; -} - -static void -on_check_column_toggled (GtkCellRendererToggle *cell, gchar *path, gpointer user_data) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (user_data); - GtkTreeIter iter, model_iter; - - g_assert (path != NULL); - - if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (self->pv->filter), &iter, path)) { - gtk_tree_model_filter_convert_iter_to_child_iter (self->pv->filter, &model_iter, &iter); - gcr_collection_model_toggle_selected (self->pv->model, &model_iter); - } -} - -static void -gcr_list_selector_constructed (GObject *object) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (object); - GtkCellRenderer *cell; - GtkTreeViewColumn *column; - guint column_id; - - G_OBJECT_CLASS (gcr_list_selector_parent_class)->constructed (object); - - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (self), FALSE); - - self->pv->model = gcr_collection_model_new (self->pv->collection, - GCR_COLLECTION_MODEL_LIST, - "icon", G_TYPE_ICON, - "markup", G_TYPE_STRING, - NULL); - - self->pv->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new ( - GTK_TREE_MODEL (self->pv->model), NULL)); - gtk_tree_model_filter_set_visible_func (self->pv->filter, - on_tree_filter_visible_func, self, NULL); - - gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (self->pv->filter)); - - /* The check */ - - cell = gtk_cell_renderer_toggle_new (); - g_signal_connect (cell, "toggled", G_CALLBACK (on_check_column_toggled), self); - - column_id = gcr_collection_model_column_for_selected (self->pv->model); - column = gtk_tree_view_column_new_with_attributes ("", cell, "active", column_id, NULL); - gtk_tree_view_column_set_resizable (column, FALSE); - gtk_tree_view_append_column (GTK_TREE_VIEW (self), column); - - column = gtk_tree_view_column_new (); - - /* The icon */ - cell = gtk_cell_renderer_pixbuf_new (); - g_object_set (cell, "stock-size", GTK_ICON_SIZE_DND, NULL); - gtk_tree_view_column_pack_start (column, cell, FALSE); - gtk_tree_view_column_add_attribute (column, cell, "gicon", 0); - - /* The markup */ - cell = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start (column, cell, TRUE); - gtk_tree_view_column_add_attribute (column, cell, "markup", 1); - - gtk_tree_view_append_column (GTK_TREE_VIEW (self), column); -} - -static void -gcr_list_selector_init (GcrListSelector *self) -{ - self->pv = gcr_list_selector_get_instance_private (self); -} - -static void -gcr_list_selector_dispose (GObject *obj) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (obj); - - if (self->pv->filter) - g_object_unref (self->pv->filter); - self->pv->filter = NULL; - - if (self->pv->model) - g_object_unref (self->pv->model); - self->pv->model = NULL; - - if (self->pv->collection) - g_object_unref (self->pv->collection); - self->pv->collection = NULL; - - _gcr_list_selector_set_live_search (self, NULL); - - G_OBJECT_CLASS (gcr_list_selector_parent_class)->dispose (obj); -} - -static void -gcr_list_selector_finalize (GObject *obj) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (obj); - - g_assert (!self->pv->collection); - g_assert (!self->pv->model); - - G_OBJECT_CLASS (gcr_list_selector_parent_class)->finalize (obj); -} - -static void -gcr_list_selector_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (obj); - - switch (prop_id) { - case PROP_COLLECTION: - g_return_if_fail (!self->pv->collection); - self->pv->collection = g_value_dup_object (value); - g_return_if_fail (self->pv->collection); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_list_selector_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrListSelector *self = GCR_LIST_SELECTOR (obj); - - switch (prop_id) { - case PROP_COLLECTION: - g_value_set_object (value, gcr_list_selector_get_collection (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_list_selector_class_init (GcrListSelectorClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->constructed = gcr_list_selector_constructed; - gobject_class->dispose = gcr_list_selector_dispose; - gobject_class->finalize = gcr_list_selector_finalize; - gobject_class->set_property = gcr_list_selector_set_property; - gobject_class->get_property = gcr_list_selector_get_property; - - /** - * GcrListSelector:collection: - * - * The collection which contains the objects to display in the selector. - */ - g_object_class_install_property (gobject_class, PROP_COLLECTION, - g_param_spec_object ("collection", "Collection", "Collection to select from", - GCR_TYPE_COLLECTION, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_list_selector_new: - * @collection: The collection that contains the objects to display - * - * Create a new #GcrListSelector. - * - * Returns: (transfer full): a newly allocated selector, which should be - * released with g_object_unref() - */ -GcrListSelector * -gcr_list_selector_new (GcrCollection *collection) -{ - return g_object_new (GCR_TYPE_LIST_SELECTOR, - "collection", collection, - NULL); -} - -/** - * gcr_list_selector_get_collection: - * @self: The selector - * - * Get the collection that this selector is displaying objects from. - * - * Returns: (transfer none): The collection, owned by the selector. - */ -GcrCollection * -gcr_list_selector_get_collection (GcrListSelector *self) -{ - g_return_val_if_fail (GCR_IS_LIST_SELECTOR (self), NULL); - return self->pv->collection; -} - -/** - * gcr_list_selector_get_selected: - * @self: The selector - * - * Get a list of selected objects. - * - * Returns: (transfer container) (element-type GObject.Object): the list of - * selected objects, to be released with g_list_free() - */ -GList* -gcr_list_selector_get_selected (GcrListSelector *self) -{ - g_return_val_if_fail (GCR_IS_LIST_SELECTOR (self), NULL); - return gcr_collection_model_get_selected_objects (self->pv->model); -} - -/** - * gcr_list_selector_set_selected: - * @self: The selector - * @selected: (element-type GObject.Object): the list of objects to select - * - * Select certain objects in the selector. - */ -void -gcr_list_selector_set_selected (GcrListSelector *self, GList *selected) -{ - g_return_if_fail (GCR_IS_LIST_SELECTOR (self)); - gcr_collection_model_set_selected_objects (self->pv->model, selected); -} - - -void -_gcr_list_selector_set_live_search (GcrListSelector *self, GcrLiveSearch *search) -{ - g_return_if_fail (GCR_IS_LIST_SELECTOR (self)); - - /* remove old handlers if old search was not null */ - if (self->pv->search_widget != NULL) { - g_signal_handlers_disconnect_by_func (self, on_tree_view_start_search, NULL); - - g_signal_handlers_disconnect_by_func (self->pv->search_widget, - on_search_widget_text_notify, self); - g_signal_handlers_disconnect_by_func (self->pv->search_widget, - on_search_widget_activate, self); - g_signal_handlers_disconnect_by_func (self->pv->search_widget, - on_search_widget_key_navigation, self); - g_object_unref (self->pv->search_widget); - self->pv->search_widget = NULL; - } - - /* connect handlers if new search is not null */ - if (search != NULL) { - self->pv->search_widget = GTK_WIDGET (g_object_ref (search)); - - g_signal_connect (self, "start-interactive-search", - G_CALLBACK (on_tree_view_start_search), NULL); - - g_signal_connect (self->pv->search_widget, "notify::text", - G_CALLBACK (on_search_widget_text_notify), self); - g_signal_connect (self->pv->search_widget, "activate", - G_CALLBACK (on_search_widget_activate), self); - g_signal_connect (self->pv->search_widget, "key-navigation", - G_CALLBACK (on_search_widget_key_navigation), self); - } -} diff --git a/ui/gcr-list-selector.h b/ui/gcr-list-selector.h deleted file mode 100644 index 0d980bb..0000000 --- a/ui/gcr-list-selector.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_LIST_SELECTOR_H__ -#define __GCR_LIST_SELECTOR_H__ - -#include "gcr/gcr-types.h" - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_LIST_SELECTOR (gcr_list_selector_get_type ()) -#define GCR_LIST_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_LIST_SELECTOR, GcrListSelector)) -#define GCR_LIST_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_LIST_SELECTOR, GcrListSelectorClass)) -#define GCR_IS_LIST_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_LIST_SELECTOR)) -#define GCR_IS_LIST_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_LIST_SELECTOR)) -#define GCR_LIST_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_LIST_SELECTOR, GcrListSelectorClass)) - -typedef struct _GcrListSelector GcrListSelector; -typedef struct _GcrListSelectorClass GcrListSelectorClass; -typedef struct _GcrListSelectorPrivate GcrListSelectorPrivate; - -struct _GcrListSelector { - GtkTreeView parent; - - /*< private >*/ - GcrListSelectorPrivate *pv; -}; - -struct _GcrListSelectorClass { - - /*< private >*/ - GtkTreeViewClass parent_class; -}; - -GType gcr_list_selector_get_type (void); - -GcrListSelector* gcr_list_selector_new (GcrCollection *collection); - -GcrCollection* gcr_list_selector_get_collection (GcrListSelector *self); - -GList* gcr_list_selector_get_selected (GcrListSelector *self); - -void gcr_list_selector_set_selected (GcrListSelector *self, - GList *selected); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrListSelector, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_LIST_SELECTOR_H__ */ diff --git a/ui/gcr-live-search.c b/ui/gcr-live-search.c deleted file mode 100644 index a70bf30..0000000 --- a/ui/gcr-live-search.c +++ /dev/null @@ -1,656 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * Copyright (C) 2010 Collabora Ltd. - * Copyright (C) 2007-2010 Nokia Corporation. - * - * 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.1 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Authors: Felix Kaser <felix.kaser@collabora.co.uk> - * Xavier Claessens <xavier.claessens@collabora.co.uk> - * Claudio Saavedra <csaavedra@igalia.com> - * Stef Walter <stefw@collabora.co.uk> - */ - -/* Code borrowed from Empathy */ - -#include "config.h" - -#include "gcr-live-search.h" - -#include "gcr/gcr-marshal.h" - -#include <gtk/gtk.h> -#include <gdk/gdkkeysyms.h> - -#include <string.h> - -struct _GcrLiveSearchPrivate { - GtkWidget *search_entry; - GtkWidget *hook_widget; - GPtrArray *stripped_words; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GcrLiveSearch, _gcr_live_search, GTK_TYPE_BOX) - -enum { - PROP_0, - PROP_HOOK_WIDGET, - PROP_TEXT -}; - -enum { - ACTIVATE, - KEYNAV, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL]; - -static void on_hook_widget_destroy (GtkWidget *object, gpointer user_data); - -static gunichar -stripped_char (gunichar ch) -{ - gunichar retval = 0; - GUnicodeType utype; - gunichar decomp[4]; - gsize dlen; - - utype = g_unichar_type (ch); - - switch (utype) { - case G_UNICODE_CONTROL: - case G_UNICODE_FORMAT: - case G_UNICODE_UNASSIGNED: - case G_UNICODE_NON_SPACING_MARK: - case G_UNICODE_SPACING_MARK: - case G_UNICODE_ENCLOSING_MARK: - /* Ignore those */ - break; - case G_UNICODE_PRIVATE_USE: - case G_UNICODE_SURROGATE: - case G_UNICODE_LOWERCASE_LETTER: - case G_UNICODE_MODIFIER_LETTER: - case G_UNICODE_OTHER_LETTER: - case G_UNICODE_TITLECASE_LETTER: - case G_UNICODE_UPPERCASE_LETTER: - case G_UNICODE_DECIMAL_NUMBER: - case G_UNICODE_LETTER_NUMBER: - case G_UNICODE_OTHER_NUMBER: - case G_UNICODE_CONNECT_PUNCTUATION: - case G_UNICODE_DASH_PUNCTUATION: - case G_UNICODE_CLOSE_PUNCTUATION: - case G_UNICODE_FINAL_PUNCTUATION: - case G_UNICODE_INITIAL_PUNCTUATION: - case G_UNICODE_OTHER_PUNCTUATION: - case G_UNICODE_OPEN_PUNCTUATION: - case G_UNICODE_CURRENCY_SYMBOL: - case G_UNICODE_MODIFIER_SYMBOL: - case G_UNICODE_MATH_SYMBOL: - case G_UNICODE_OTHER_SYMBOL: - case G_UNICODE_LINE_SEPARATOR: - case G_UNICODE_PARAGRAPH_SEPARATOR: - case G_UNICODE_SPACE_SEPARATOR: - default: - ch = g_unichar_tolower (ch); - dlen = g_unichar_fully_decompose (ch, FALSE, decomp, 4); - if (dlen > 0) - retval = decomp[0]; - } - - return retval; -} - -static void -append_word (GPtrArray **word_array, GString **word) -{ - if (*word != NULL) { - if (*word_array == NULL) - *word_array = g_ptr_array_new_with_free_func (g_free); - g_ptr_array_add (*word_array, g_string_free (*word, FALSE)); - *word = NULL; - } -} - -GPtrArray * -_gcr_live_search_strip_utf8_string (const gchar *string) -{ - GPtrArray *word_array = NULL; - GString *word = NULL; - const gchar *p; - - if (string == NULL || *string == '\0') - return NULL; - - for (p = string; *p != '\0'; p = g_utf8_next_char (p)) { - gunichar sc; - - /* Make the char lower-case, remove its accentuation marks, and ignore it - * if it is just unicode marks */ - sc = stripped_char (g_utf8_get_char (p)); - if (sc == 0) - continue; - - /* If it is not alpha-num, it is separator between words */ - if (!g_unichar_isalnum (sc)) { - append_word (&word_array, &word); - continue; - } - - /* It is alpha-num, append this char to current word, or start new word */ - if (word == NULL) - word = g_string_new (NULL); - g_string_append_unichar (word, sc); - } - - append_word (&word_array, &word); - - return word_array; -} - -static gboolean -live_search_match_prefix (const gchar *string, const gchar *prefix) -{ - const gchar *p; - const gchar *prefix_p; - gboolean next_word = FALSE; - - if (prefix == NULL || prefix[0] == 0) - return TRUE; - - if (string == NULL || *string == '\0') - return FALSE; - - prefix_p = prefix; - for (p = string; *p != '\0'; p = g_utf8_next_char (p)) { - gunichar sc; - - /* Make the char lower-case, remove its accentuation marks, and ignore it - * if it is just unicode marks */ - sc = stripped_char (g_utf8_get_char (p)); - if (sc == 0) - continue; - - /* If we want to go to next word, ignore alpha-num chars */ - if (next_word && g_unichar_isalnum (sc)) - continue; - next_word = FALSE; - - /* Ignore word separators */ - if (!g_unichar_isalnum (sc)) - continue; - - /* If this char does not match prefix_p, go to next word and start again - * from the beginning of prefix */ - if (sc != g_utf8_get_char (prefix_p)) { - next_word = TRUE; - prefix_p = prefix; - continue; - } - - /* prefix_p match, verify to next char. If this was the last of prefix, - * it means it completely machted and we are done. */ - prefix_p = g_utf8_next_char (prefix_p); - if (*prefix_p == '\0') - return TRUE; - } - - return FALSE; -} - -gboolean -_gcr_live_search_match_words (const gchar *string, GPtrArray *words) -{ - guint i; - - if (words == NULL) - return TRUE; - - for (i = 0; i < words->len; i++) - if (!live_search_match_prefix (string, g_ptr_array_index (words, i))) - return FALSE; - - return TRUE; -} - -static gboolean -fire_key_navigation_sig (GcrLiveSearch *self, GdkEventKey *event) -{ - gboolean ret; - - g_signal_emit (self, signals[KEYNAV], 0, event, &ret); - return ret; -} - -static gboolean -on_search_entry_key_pressed (GtkEntry *entry, GdkEventKey *event, gpointer user_data) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); - - /* if esc key pressed, hide the search */ - if (event->keyval == GDK_KEY_Escape) { - gtk_widget_hide (GTK_WIDGET (self)); - return TRUE; - } - - /* emit key navigation signal, so other widgets can respond to it properly */ - if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down - || event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down) { - return fire_key_navigation_sig (self, event); - } - - if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End || - event->keyval == GDK_KEY_space) { - /* If the live search is visible, the entry should catch the Home/End - * and space events */ - if (!gtk_widget_get_visible (GTK_WIDGET (self))) { - return fire_key_navigation_sig (self, event); - } - } - - return FALSE; -} - -static void -on_search_entry_text_changed (GtkEntry *entry, gpointer user_data) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); - const gchar *text; - - text = gtk_entry_get_text (entry); - - if (text == NULL || *text == '\0') - gtk_widget_hide (GTK_WIDGET (self)); - else - gtk_widget_show (GTK_WIDGET (self)); - - if (self->pv->stripped_words != NULL) - g_ptr_array_unref (self->pv->stripped_words); - - self->pv->stripped_words = _gcr_live_search_strip_utf8_string (text); - - g_object_notify (G_OBJECT (self), "text"); -} - -static void -on_search_entry_close_pressed (GtkEntry *entry, GtkEntryIconPosition icon_pos, - GdkEvent *event, gpointer user_data) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); - gtk_widget_hide (GTK_WIDGET (self)); -} - -static gboolean -on_hook_widget_key_press_event (GtkWidget *widget, GdkEventKey *event, - gpointer user_data) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); - GdkEvent *new_event; - gboolean ret; - - /* dont forward this event to the entry, else the event is consumed by the - * entry and does not close the window */ - if (!gtk_widget_get_visible (GTK_WIDGET (self)) && - event->keyval == GDK_KEY_Escape) - return FALSE; - - /* do not show the search if CTRL and/or ALT are pressed with a key - * this is needed, because otherwise the CTRL + F accel would not work, - * because the entry consumes it */ - if (event->state & (GDK_MOD1_MASK | GDK_CONTROL_MASK) || - event->keyval == GDK_KEY_Control_L || - event->keyval == GDK_KEY_Control_R) - return FALSE; - - /* dont forward the up/down and Page Up/Down arrow keys to the entry, - * they are needed for navigation in the treeview and are not needed in - * the search entry */ - if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down || - event->keyval == GDK_KEY_Page_Up || event->keyval == GDK_KEY_Page_Down) - return FALSE; - - if (event->keyval == GDK_KEY_Home || event->keyval == GDK_KEY_End || - event->keyval == GDK_KEY_space) { - /* Home/End and space keys have to be forwarded to the entry only if - * the live search is visible (to move the cursor inside the entry). */ - if (!gtk_widget_get_visible (GTK_WIDGET (self))) - return FALSE; - } - - /* realize the widget if it is not realized yet */ - gtk_widget_realize (self->pv->search_entry); - if (!gtk_widget_has_focus (self->pv->search_entry)) { - gtk_widget_grab_focus (self->pv->search_entry); - gtk_editable_set_position (GTK_EDITABLE (self->pv->search_entry), -1); - } - - /* forward the event to the search entry */ - new_event = gdk_event_copy ((GdkEvent *) event); - ret = gtk_widget_event (self->pv->search_entry, new_event); - gdk_event_free (new_event); - - return ret; -} - -static void -on_search_entry_activate (GtkEntry *entry, GcrLiveSearch *self) -{ - g_signal_emit (self, signals[ACTIVATE], 0); -} - -static void -live_search_release_hook_widget (GcrLiveSearch *self) -{ - /* remove old handlers if old source was not null */ - if (self->pv->hook_widget != NULL) { - g_signal_handlers_disconnect_by_func (self->pv->hook_widget, - on_hook_widget_key_press_event, self); - g_signal_handlers_disconnect_by_func (self->pv->hook_widget, - on_hook_widget_destroy, self); - g_object_unref (self->pv->hook_widget); - self->pv->hook_widget = NULL; - } -} - -static void -on_hook_widget_destroy (GtkWidget *object, gpointer user_data) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (user_data); - - /* unref the hook widget and hide search */ - gtk_widget_hide (GTK_WIDGET (self)); - live_search_release_hook_widget (self); -} - -static void -live_search_dispose (GObject *obj) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (obj); - - live_search_release_hook_widget (self); - - G_OBJECT_CLASS (_gcr_live_search_parent_class)->dispose (obj); -} - -static void -live_search_finalize (GObject *obj) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (obj); - - if (self->pv->stripped_words != NULL) - g_ptr_array_unref (self->pv->stripped_words); - - G_OBJECT_CLASS (_gcr_live_search_parent_class)->finalize (obj); -} - -static void -live_search_get_property (GObject *object, guint param_id, - GValue *value, GParamSpec *pspec) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (object); - - switch (param_id) { - case PROP_HOOK_WIDGET: - g_value_set_object (value, _gcr_live_search_get_hook_widget (self)); - break; - case PROP_TEXT: - g_value_set_string (value, _gcr_live_search_get_text (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); - break; - } -} - -static void -live_search_set_property (GObject *object, guint param_id, - const GValue *value, GParamSpec *pspec) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (object); - - switch (param_id) { - case PROP_HOOK_WIDGET: - _gcr_live_search_set_hook_widget (self, g_value_get_object (value)); - break; - case PROP_TEXT: - _gcr_live_search_set_text (self, g_value_get_string (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); - break; - }; -} - -static void -live_search_unmap (GtkWidget *widget) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (widget); - - GTK_WIDGET_CLASS (_gcr_live_search_parent_class)->unmap (widget); - - /* unmap can happen if a parent gets hidden, in that case we want to hide - * the live search as well, so when it gets mapped again, the live search - * won't be shown. */ - gtk_widget_hide (widget); - - gtk_entry_set_text (GTK_ENTRY (self->pv->search_entry), ""); - gtk_widget_grab_focus (self->pv->hook_widget); -} - -static void -live_search_show (GtkWidget *widget) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (widget); - - if (!gtk_widget_has_focus (self->pv->search_entry)) - gtk_widget_grab_focus (self->pv->search_entry); - - GTK_WIDGET_CLASS (_gcr_live_search_parent_class)->show (widget); -} - -static void -live_search_grab_focus (GtkWidget *widget) -{ - GcrLiveSearch *self = GCR_LIVE_SEARCH (widget); - - if (!gtk_widget_has_focus (self->pv->search_entry)) { - gtk_widget_grab_focus (self->pv->search_entry); - gtk_editable_set_position (GTK_EDITABLE (self->pv->search_entry), -1); - } -} - -static void -_gcr_live_search_class_init (GcrLiveSearchClass *klass) -{ - GObjectClass *object_class = (GObjectClass *) klass; - GtkWidgetClass *widget_class = (GtkWidgetClass *) klass; - GParamSpec *param_spec; - - object_class->finalize = live_search_finalize; - object_class->dispose = live_search_dispose; - object_class->get_property = live_search_get_property; - object_class->set_property = live_search_set_property; - - widget_class->unmap = live_search_unmap; - widget_class->show = live_search_show; - widget_class->grab_focus = live_search_grab_focus; - - signals[ACTIVATE] = g_signal_new ("activate", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - 0, - NULL, NULL, NULL, - G_TYPE_NONE, 0); - - signals[KEYNAV] = g_signal_new ("key-navigation", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST, - 0, - g_signal_accumulator_true_handled, NULL, - _gcr_marshal_BOOLEAN__BOXED, - G_TYPE_BOOLEAN, 1, GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); - - param_spec = g_param_spec_object ("hook-widget", "Live Search Hook Widget", - "The live search catches key-press-events on this widget", - GTK_TYPE_WIDGET, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_HOOK_WIDGET, param_spec); - - param_spec = g_param_spec_string ("text", "Live Search Text", - "The text of the live search entry", - "", - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_STATIC_STRINGS); - g_object_class_install_property (object_class, PROP_TEXT, param_spec); -} - -static void -_gcr_live_search_init (GcrLiveSearch *self) -{ - self->pv = _gcr_live_search_get_instance_private (self); - - gtk_widget_set_no_show_all (GTK_WIDGET (self), TRUE); - - self->pv->search_entry = gtk_entry_new (); - gtk_entry_set_icon_from_icon_name (GTK_ENTRY (self->pv->search_entry), - GTK_ENTRY_ICON_SECONDARY, "window-close"); - gtk_entry_set_icon_activatable (GTK_ENTRY (self->pv->search_entry), - GTK_ENTRY_ICON_SECONDARY, TRUE); - gtk_entry_set_icon_sensitive (GTK_ENTRY (self->pv->search_entry), - GTK_ENTRY_ICON_SECONDARY, TRUE); - gtk_widget_show (self->pv->search_entry); - - gtk_box_pack_start (GTK_BOX (self), self->pv->search_entry, TRUE, TRUE, 0); - - g_signal_connect (self->pv->search_entry, "icon_release", - G_CALLBACK (on_search_entry_close_pressed), self); - g_signal_connect (self->pv->search_entry, "changed", - G_CALLBACK (on_search_entry_text_changed), self); - g_signal_connect (self->pv->search_entry, "key-press-event", - G_CALLBACK (on_search_entry_key_pressed), self); - g_signal_connect (self->pv->search_entry, "activate", - G_CALLBACK (on_search_entry_activate), self); - - self->pv->hook_widget = NULL; -} - -/** - * _gcr_live_search_new: - * @hook: (nullable): the widget to hook - * - * Create a new #GcrLiveSearch. - * - * Returns: (transfer full) (type GcrUi.LiveSearch): The new widget - */ -GtkWidget * -_gcr_live_search_new (GtkWidget *hook) -{ - g_return_val_if_fail (hook == NULL || GTK_IS_WIDGET (hook), NULL); - - return g_object_new (GCR_TYPE_LIVE_SEARCH, - "hook-widget", hook, - NULL); -} - -/* public methods */ - -GtkWidget * -_gcr_live_search_get_hook_widget (GcrLiveSearch *self) -{ - g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), NULL); - - return self->pv->hook_widget; -} - -void -_gcr_live_search_set_hook_widget (GcrLiveSearch *self, GtkWidget *hook) -{ - g_return_if_fail (GCR_IS_LIVE_SEARCH (self)); - g_return_if_fail (hook == NULL || GTK_IS_WIDGET (hook)); - - /* release the actual widget */ - live_search_release_hook_widget (self); - - /* connect handlers if new source is not null */ - if (hook != NULL) { - self->pv->hook_widget = g_object_ref (hook); - g_signal_connect (self->pv->hook_widget, "key-press-event", - G_CALLBACK (on_hook_widget_key_press_event), - self); - g_signal_connect (self->pv->hook_widget, "destroy", - G_CALLBACK (on_hook_widget_destroy), - self); - } -} - -const gchar * -_gcr_live_search_get_text (GcrLiveSearch *self) -{ - g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), NULL); - - return gtk_entry_get_text (GTK_ENTRY (self->pv->search_entry)); -} - -void -_gcr_live_search_set_text (GcrLiveSearch *self, const gchar *text) -{ - g_return_if_fail (GCR_IS_LIVE_SEARCH (self)); - g_return_if_fail (text != NULL); - - gtk_entry_set_text (GTK_ENTRY (self->pv->search_entry), text); -} - -/** - * _gcr_live_search_match: - * @self: a #GcrLiveSearch - * @string: a string where to search, must be valid UTF-8. - * - * Search if one of the words in @string string starts with the current text - * of @self. - * - * Searching for "aba" in "Abasto" will match, searching in "Moraba" will not, - * and searching in "A tool (abacus)" will do. - * - * The match is not case-sensitive, and regardless of the accentuation marks. - * - * Returns: %TRUE if a match is found, %FALSE otherwise. - * - **/ -gboolean -_gcr_live_search_match (GcrLiveSearch *self, const gchar *string) -{ - g_return_val_if_fail (GCR_IS_LIVE_SEARCH (self), FALSE); - - return _gcr_live_search_match_words (string, self->pv->stripped_words); -} - -gboolean -_gcr_live_search_match_string (const gchar *string, const gchar *prefix) -{ - GPtrArray *words; - gboolean match; - - words = _gcr_live_search_strip_utf8_string (prefix); - match = _gcr_live_search_match_words (string, words); - if (words != NULL) - g_ptr_array_unref (words); - - return match; -} - -GPtrArray * -_gcr_live_search_get_words (GcrLiveSearch *self) -{ - return self->pv->stripped_words; -} diff --git a/ui/gcr-live-search.h b/ui/gcr-live-search.h deleted file mode 100644 index cf048fd..0000000 --- a/ui/gcr-live-search.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * Copyright (C) 2010 Collabora Ltd. - * Copyright (C) 2007-2010 Nokia Corporation. - * - * 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.1 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - * Authors: Felix Kaser <felix.kaser@collabora.co.uk> - * Xavier Claessens <xavier.claessens@collabora.co.uk> - * Claudio Saavedra <csaavedra@igalia.com> - * Stef Walter <stefw@collabora.co.uk> - */ - -/* Code borrowed from Empathy */ - -#ifndef __GCR_LIVE_SEARCH_H__ -#define __GCR_LIVE_SEARCH_H__ - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_LIVE_SEARCH (_gcr_live_search_get_type ()) -#define GCR_LIVE_SEARCH(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GCR_TYPE_LIVE_SEARCH, GcrLiveSearch)) -#define GCR_LIVE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GCR_TYPE_LIVE_SEARCH, GcrLiveSearchClass)) -#define GCR_IS_LIVE_SEARCH(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GCR_TYPE_LIVE_SEARCH)) -#define GCR_IS_LIVE_SEARCH_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GCR_TYPE_LIVE_SEARCH)) -#define GCR_LIVE_SEARCH_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GCR_TYPE_LIVE_SEARCH, GcrLiveSearchClass)) - -typedef struct _GcrLiveSearch GcrLiveSearch; -typedef struct _GcrLiveSearchClass GcrLiveSearchClass; -typedef struct _GcrLiveSearchPrivate GcrLiveSearchPrivate; - -struct _GcrLiveSearch { - /*< private >*/ - GtkBox parent; - GcrLiveSearchPrivate *pv; -}; - -struct _GcrLiveSearchClass { - GtkBoxClass parent_class; -}; - -GType _gcr_live_search_get_type (void) G_GNUC_CONST; - -GtkWidget * _gcr_live_search_new (GtkWidget *hook); - -GtkWidget * _gcr_live_search_get_hook_widget (GcrLiveSearch *self); -void _gcr_live_search_set_hook_widget (GcrLiveSearch *self, - GtkWidget *hook); - -const gchar * _gcr_live_search_get_text (GcrLiveSearch *self); -void _gcr_live_search_set_text (GcrLiveSearch *self, - const gchar *text); - -gboolean _gcr_live_search_match (GcrLiveSearch *self, - const gchar *string); - -GPtrArray * _gcr_live_search_strip_utf8_string (const gchar *string); - -gboolean _gcr_live_search_match_words (const gchar *string, - GPtrArray *words); - -GPtrArray * _gcr_live_search_get_words (GcrLiveSearch *self); - -/* Made public for unit tests */ -gboolean _gcr_live_search_match_string (const gchar *string, - const gchar *prefix); - -G_END_DECLS - -#endif /* __GCR_LIVE_SEARCH_H__ */ diff --git a/ui/gcr-pkcs11-import-dialog.c b/ui/gcr-pkcs11-import-dialog.c deleted file mode 100644 index 746b946..0000000 --- a/ui/gcr-pkcs11-import-dialog.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2008 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-icons.h" - -#include "gcr-dialog-util.h" -#include "gcr-secure-entry-buffer.h" -#include "gcr-pkcs11-import-dialog.h" - -#include "egg/egg-secure-memory.h" - -#include <gtk/gtk.h> - -#include <glib/gi18n-lib.h> - -EGG_SECURE_DECLARE (import_dialog); - -enum { - PROP_0, - PROP_IMPORTER -}; - -struct _GcrPkcs11ImportDialog { - GtkDialog parent; - GtkBuilder *builder; - GtkWidget *password_area; - GtkLabel *token_label; - GtkImage *token_image; - GtkEntry *password_entry; - GtkEntry *label_entry; - gboolean label_changed; -}; - -G_DEFINE_TYPE (GcrPkcs11ImportDialog, _gcr_pkcs11_import_dialog, GTK_TYPE_DIALOG); - -static void -on_label_changed (GtkEditable *editable, - gpointer user_data) -{ - GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (user_data); - self->label_changed = TRUE; -} - -static void -_gcr_pkcs11_import_dialog_constructed (GObject *obj) -{ - GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (obj); - GError *error = NULL; - GtkEntryBuffer *buffer; - GtkWidget *widget; - GtkBox *contents; - GtkWidget *button; - - G_OBJECT_CLASS (_gcr_pkcs11_import_dialog_parent_class)->constructed (obj); - - if (!gtk_builder_add_from_resource (self->builder, "/org/gnome/gcr/ui/gcr-pkcs11-import-dialog.ui", &error)) { - g_warning ("couldn't load ui builder file: %s", error->message); - return; - } - - /* Fill in the dialog from builder */ - widget = GTK_WIDGET (gtk_builder_get_object (self->builder, "pkcs11-import-dialog")); - contents = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (self))); - gtk_box_pack_start (contents, widget, TRUE, TRUE, 0); - - /* The password area */ - self->password_area = GTK_WIDGET (gtk_builder_get_object (self->builder, "unlock-area")); - gtk_widget_hide (self->password_area); - - /* Add a secure entry */ - buffer = gcr_secure_entry_buffer_new (); - self->password_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "password-entry")); - gtk_entry_set_buffer (self->password_entry, buffer); - gtk_entry_set_activates_default (self->password_entry, TRUE); - g_object_unref (buffer); - - self->token_label = GTK_LABEL (gtk_builder_get_object (self->builder, "token-description")); - self->token_image = GTK_IMAGE (gtk_builder_get_object (self->builder, "token-image")); - - /* Setup the label */ - self->label_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "label-entry")); - g_signal_connect (self->label_entry, "changed", G_CALLBACK (on_label_changed), self); - gtk_entry_set_activates_default (self->label_entry, TRUE); - - /* Add our various buttons */ - button = gtk_dialog_add_button (GTK_DIALOG (self), _("_Cancel"), GTK_RESPONSE_CANCEL); - gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); - button = gtk_dialog_add_button (GTK_DIALOG (self), _("_OK"), GTK_RESPONSE_OK); - gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); - gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_OK); - - gtk_window_set_modal (GTK_WINDOW (self), TRUE); -} - -static void -_gcr_pkcs11_import_dialog_init (GcrPkcs11ImportDialog *self) -{ - self->builder = gtk_builder_new (); -} - -static void -_gcr_pkcs11_import_dialog_finalize (GObject *obj) -{ - GcrPkcs11ImportDialog *self = GCR_PKCS11_IMPORT_DIALOG (obj); - - g_object_unref (self->builder); - - G_OBJECT_CLASS (_gcr_pkcs11_import_dialog_parent_class)->finalize (obj); -} - -static void -_gcr_pkcs11_import_dialog_class_init (GcrPkcs11ImportDialogClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->constructed = _gcr_pkcs11_import_dialog_constructed; - gobject_class->finalize = _gcr_pkcs11_import_dialog_finalize; -} - -GcrPkcs11ImportDialog * -_gcr_pkcs11_import_dialog_new (GtkWindow *parent) -{ - GcrPkcs11ImportDialog *dialog; - - g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL); - - dialog = g_object_new (GCR_TYPE_PKCS11_IMPORT_DIALOG, - "transient-for", parent, - NULL); - - return g_object_ref_sink (dialog); -} - -void -_gcr_pkcs11_import_dialog_get_supplements (GcrPkcs11ImportDialog *self, - GckBuilder *builder) -{ - const gchar *label; - - g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self)); - g_return_if_fail (builder != NULL); - - label = gtk_entry_get_text (self->label_entry); - if (self->label_changed && label != NULL && label[0]) - gck_builder_set_string (builder, CKA_LABEL, label); -} - -void -_gcr_pkcs11_import_dialog_set_supplements (GcrPkcs11ImportDialog *self, - GckBuilder *builder) -{ - gchar *label; - - g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self)); - g_return_if_fail (builder != NULL); - - if (!gck_builder_find_string (builder, CKA_LABEL, &label)) - label = NULL; - - if (label == NULL) - gtk_entry_set_placeholder_text (self->label_entry, _("Automatically chosen")); - gtk_entry_set_text (self->label_entry, label == NULL ? "" : label); - g_free (label); - - self->label_changed = FALSE; -} - -gboolean -_gcr_pkcs11_import_dialog_run (GcrPkcs11ImportDialog *self) -{ - gboolean ret = FALSE; - - g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), FALSE); - - if (gtk_dialog_run (GTK_DIALOG (self)) == GTK_RESPONSE_OK) { - ret = TRUE; - } - - gtk_widget_hide (GTK_WIDGET (self)); - - return ret; -} - -void -_gcr_pkcs11_import_dialog_run_async (GcrPkcs11ImportDialog *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - g_return_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self)); - - _gcr_dialog_util_run_async (GTK_DIALOG (self), cancellable, callback, user_data); -} - -gboolean -_gcr_pkcs11_import_dialog_run_finish (GcrPkcs11ImportDialog *self, - GAsyncResult *result) -{ - gint response; - - g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), FALSE); - - response = _gcr_dialog_util_run_finish (GTK_DIALOG (self), result); - - gtk_widget_hide (GTK_WIDGET (self)); - - return (response == GTK_RESPONSE_OK) ? TRUE : FALSE; -} - -GTlsInteractionResult -_gcr_pkcs11_import_dialog_run_ask_password (GcrPkcs11ImportDialog *self, - GTlsPassword *password, - GCancellable *cancellable, - GError **error) -{ - GckTokenInfo *token_info; - const gchar *value; - GckSlot *slot; - GIcon *icon; - gboolean ret; - - g_return_val_if_fail (GCR_IS_PKCS11_IMPORT_DIALOG (self), G_TLS_INTERACTION_UNHANDLED); - g_return_val_if_fail (G_IS_TLS_PASSWORD (password), G_TLS_INTERACTION_UNHANDLED); - g_return_val_if_fail (error == NULL || *error == NULL, G_TLS_INTERACTION_UNHANDLED); - - if (GCK_IS_PASSWORD (password)) { - slot = gck_password_get_token (GCK_PASSWORD (password)); - token_info = gck_slot_get_token_info (slot); - icon = gcr_icon_for_token (token_info); - gtk_image_set_from_gicon (self->token_image, icon, GTK_ICON_SIZE_BUTTON); - gck_token_info_free (token_info); - g_object_unref (icon); - } - - gtk_label_set_text (self->token_label, g_tls_password_get_description (password)); - - gtk_widget_show (self->password_area); - - ret = _gcr_pkcs11_import_dialog_run (self); - - gtk_widget_hide (self->password_area); - - if (!ret) { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED, - _("The user cancelled the operation")); - return G_TLS_INTERACTION_FAILED; - } - - value = gtk_entry_get_text (self->password_entry); - g_tls_password_set_value_full (password, egg_secure_strdup (value), - -1, egg_secure_free); - return G_TLS_INTERACTION_HANDLED; -} diff --git a/ui/gcr-pkcs11-import-dialog.h b/ui/gcr-pkcs11-import-dialog.h deleted file mode 100644 index 57f799a..0000000 --- a/ui/gcr-pkcs11-import-dialog.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2008 Stefan Walter - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_PKCS11_IMPORT_DIALOG_H__ -#define __GCR_PKCS11_IMPORT_DIALOG_H__ - -#include <gck/gck.h> - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_PKCS11_IMPORT_DIALOG (_gcr_pkcs11_import_dialog_get_type ()) -G_DECLARE_FINAL_TYPE (GcrPkcs11ImportDialog, _gcr_pkcs11_import_dialog, - GCR, PKCS11_IMPORT_DIALOG, - GtkDialog) - -GcrPkcs11ImportDialog * _gcr_pkcs11_import_dialog_new (GtkWindow *parent); - -void _gcr_pkcs11_import_dialog_get_supplements (GcrPkcs11ImportDialog *self, - GckBuilder *builder); - -void _gcr_pkcs11_import_dialog_set_supplements (GcrPkcs11ImportDialog *self, - GckBuilder *builder); - -gboolean _gcr_pkcs11_import_dialog_run (GcrPkcs11ImportDialog *self); - -void _gcr_pkcs11_import_dialog_run_async (GcrPkcs11ImportDialog *self, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); - -gboolean _gcr_pkcs11_import_dialog_run_finish (GcrPkcs11ImportDialog *self, - GAsyncResult *result); - -GTlsInteractionResult _gcr_pkcs11_import_dialog_run_ask_password (GcrPkcs11ImportDialog *self, - GTlsPassword *password, - GCancellable *cancellable, - GError **error); - -G_END_DECLS - -#endif /* __GCR_PKCS11_IMPORT_DIALOG_H__ */ diff --git a/ui/gcr-pkcs11-import-dialog.ui b/ui/gcr-pkcs11-import-dialog.ui deleted file mode 100644 index b95d0ff..0000000 --- a/ui/gcr-pkcs11-import-dialog.ui +++ /dev/null @@ -1,255 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <!-- interface-requires gtk+ 2.12 --> - <object class="GtkVBox" id="pkcs11-import-dialog"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="border_width">6</property> - <property name="spacing">6</property> - <child> - <object class="GtkFrame" id="unlock-area"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkAlignment" id="alignment2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="left_padding">12</property> - <child> - <object class="GtkBox" id="box1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkLabel" id="password-description"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">In order to import, please enter the password.</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkGrid" id="grid2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">12</property> - <child> - <object class="GtkEntry" id="password-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - <property name="visibility">False</property> - <property name="width_chars">20</property> - <property name="invisible_char_set">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="password-label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Password:</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="token-label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Token:</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkBox" id="box2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">6</property> - <child> - <object class="GtkImage" id="token-image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="stock">gtk-missing-image</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="token-description"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label"></property> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label5"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Unlock</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkFrame" id="settings-area"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> - <child> - <object class="GtkAlignment" id="alignment1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="left_padding">12</property> - <child> - <object class="GtkGrid" id="grid1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="row_spacing">6</property> - <property name="column_spacing">12</property> - <child> - <object class="GtkLabel" id="label-label"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Label:</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="label-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">●</property> - <property name="width_chars">20</property> - <property name="invisible_char_set">True</property> - </object> - <packing> - <property name="left_attach">1</property> - <property name="top_attach">0</property> - <property name="width">1</property> - <property name="height">1</property> - </packing> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - </object> - </child> - </object> - </child> - <child type="label"> - <object class="GtkLabel" id="label4"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="margin_bottom">6</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Import settings</property> - <attributes> - <attribute name="weight" value="bold"/> - </attributes> - </object> - </child> - </object> - <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - </object> - <object class="GtkSizeGroup" id="entry-size-group"> - <property name="mode">GTK_SIZE_GROUP_HORIZONTAL</property> - <widgets> - <widget name="password-label"/> - <widget name="token-label"/> - <widget name="label-label"/> - </widgets> - </object> -</interface> diff --git a/ui/gcr-pkcs11-import-interaction.c b/ui/gcr-pkcs11-import-interaction.c deleted file mode 100644 index bb0dc5d..0000000 --- a/ui/gcr-pkcs11-import-interaction.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2008 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-import-interaction.h" - -#include "gcr-dialog-util.h" -#include "gcr-pkcs11-import-interaction.h" - -#include <glib/gi18n-lib.h> - -enum { - PROP_0, - PROP_PARENT_WINDOW -}; - -struct _GcrPkcs11ImportInteraction { - GTlsInteraction parent; - gboolean supplemented; - GtkWindow *parent_window; - GcrPkcs11ImportDialog *dialog; -}; - -static void _gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface); - -G_DEFINE_TYPE_WITH_CODE(GcrPkcs11ImportInteraction, _gcr_pkcs11_import_interaction, G_TYPE_TLS_INTERACTION, - G_IMPLEMENT_INTERFACE (GCR_TYPE_IMPORT_INTERACTION, _gcr_pkcs11_import_interaction_iface_init)); - -static void -_gcr_pkcs11_import_interaction_init (GcrPkcs11ImportInteraction *self) -{ - self->dialog = _gcr_pkcs11_import_dialog_new (self->parent_window); -} - -static void -_gcr_pkcs11_import_interaction_dispose (GObject *obj) -{ - GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj); - - g_clear_object (&self->dialog); - - G_OBJECT_CLASS (_gcr_pkcs11_import_interaction_parent_class)->dispose (obj); -} - -static void -_gcr_pkcs11_import_interaction_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj); - - switch (prop_id) { - case PROP_PARENT_WINDOW: - gtk_window_set_transient_for (GTK_WINDOW (self->dialog), - g_value_get_object (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_pkcs11_import_interaction_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (obj); - - switch (prop_id) { - case PROP_PARENT_WINDOW: - g_value_set_object (value, gtk_window_get_transient_for (GTK_WINDOW (self->dialog))); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static GTlsInteractionResult -_gcr_pkcs11_import_interaction_ask_password (GTlsInteraction *interaction, - GTlsPassword *password, - GCancellable *cancellable, - GError **error) -{ - GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); - - g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED); - - self->supplemented = TRUE; - return _gcr_pkcs11_import_dialog_run_ask_password (self->dialog, password, cancellable, error); -} - -static void -_gcr_pkcs11_import_interaction_supplement_prep (GcrImportInteraction *interaction, - GckBuilder *builder) -{ - GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); - - self->supplemented = FALSE; - _gcr_pkcs11_import_dialog_set_supplements (self->dialog, builder); -} - -static GTlsInteractionResult -_gcr_pkcs11_import_interaction_supplement (GcrImportInteraction *interaction, - GckBuilder *builder, - GCancellable *cancellable, - GError **error) -{ - GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); - - g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED); - - if (self->supplemented) - return G_TLS_INTERACTION_HANDLED; - - self->supplemented = TRUE; - if (_gcr_pkcs11_import_dialog_run (self->dialog)) { - _gcr_pkcs11_import_dialog_get_supplements (self->dialog, builder); - return G_TLS_INTERACTION_HANDLED; - - } else { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED, _("The user cancelled the operation")); - return G_TLS_INTERACTION_FAILED; - } -} - -static void -on_dialog_run_async (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GTask *task = G_TASK (user_data); - GckBuilder *builder = g_task_get_task_data (task); - - if (_gcr_pkcs11_import_dialog_run_finish (GCR_PKCS11_IMPORT_DIALOG (source), result)) { - _gcr_pkcs11_import_dialog_get_supplements (GCR_PKCS11_IMPORT_DIALOG (source), builder); - g_task_return_boolean (task, TRUE); - - } else { - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED, - _("The user cancelled the operation")); - } - - g_clear_object (&task); -} - -static void -_gcr_pkcs11_import_interaction_supplement_async (GcrImportInteraction *interaction, - GckBuilder *builder, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); - GTask *task; - - g_return_if_fail (self->dialog != NULL); - - task = g_task_new (interaction, cancellable, callback, user_data); - g_task_set_source_tag (task, _gcr_pkcs11_import_interaction_supplement_async); - - /* If dialog was already shown, then short circuit */ - if (self->supplemented) { - g_task_return_boolean (task, TRUE); - - } else { - self->supplemented = TRUE; - g_task_set_task_data (task, gck_builder_ref (builder), - (GDestroyNotify) gck_builder_unref); - _gcr_pkcs11_import_dialog_run_async (self->dialog, cancellable, - on_dialog_run_async, - g_object_ref (task)); - } - - g_clear_object (&task); -} - -static GTlsInteractionResult -_gcr_pkcs11_import_interaction_supplement_finish (GcrImportInteraction *interaction, - GAsyncResult *result, - GError **error) -{ - GcrPkcs11ImportInteraction *self = GCR_PKCS11_IMPORT_INTERACTION (interaction); - - g_return_val_if_fail (self->dialog != NULL, G_TLS_INTERACTION_UNHANDLED); - g_return_val_if_fail (g_task_is_valid (result, interaction), G_TLS_INTERACTION_UNHANDLED); - - if (!g_task_propagate_boolean (G_TASK (result), error)) - return G_TLS_INTERACTION_FAILED; - - return G_TLS_INTERACTION_HANDLED; - -} - -static void -_gcr_pkcs11_import_interaction_iface_init (GcrImportInteractionIface *iface) -{ - iface->supplement_prep = _gcr_pkcs11_import_interaction_supplement_prep; - iface->supplement = _gcr_pkcs11_import_interaction_supplement; - iface->supplement_async = _gcr_pkcs11_import_interaction_supplement_async; - iface->supplement_finish = _gcr_pkcs11_import_interaction_supplement_finish; -} - -static void -_gcr_pkcs11_import_interaction_class_init (GcrPkcs11ImportInteractionClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GTlsInteractionClass *interaction_class = G_TLS_INTERACTION_CLASS (klass); - - gobject_class->dispose = _gcr_pkcs11_import_interaction_dispose; - gobject_class->set_property = _gcr_pkcs11_import_interaction_set_property; - gobject_class->get_property = _gcr_pkcs11_import_interaction_get_property; - - interaction_class->ask_password = _gcr_pkcs11_import_interaction_ask_password; - - g_object_class_install_property (gobject_class, PROP_PARENT_WINDOW, - g_param_spec_object ("parent-window", "Parent Window", "Prompt Parent Window", - GTK_TYPE_WINDOW, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -} - -GTlsInteraction * -_gcr_pkcs11_import_interaction_new (GtkWindow *parent_window) -{ - g_return_val_if_fail (parent_window == NULL || GTK_IS_WINDOW (parent_window), NULL); - return g_object_new (GCR_TYPE_PKCS11_IMPORT_INTERACTION, - "parent-window", parent_window, - NULL); -} diff --git a/ui/gcr-pkcs11-import-interaction.h b/ui/gcr-pkcs11-import-interaction.h deleted file mode 100644 index a36db2e..0000000 --- a/ui/gcr-pkcs11-import-interaction.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef __GCR_PKCS11_IMPORT_INTERACTION_H__ -#define __GCR_PKCS11_IMPORT_INTERACTION_H__ - -#include "gcr-pkcs11-import-dialog.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_PKCS11_IMPORT_INTERACTION (_gcr_pkcs11_import_interaction_get_type ()) -G_DECLARE_FINAL_TYPE (GcrPkcs11ImportInteraction, _gcr_pkcs11_import_interaction, - GCR, PKCS11_IMPORT_INTERACTION, - GTlsInteraction) - -GTlsInteraction * _gcr_pkcs11_import_interaction_new (GtkWindow *parent_window); - -G_END_DECLS - -#endif /* __GCR_PKCS11_IMPORT_INTERACTION_H__ */ diff --git a/ui/gcr-prompt-dialog.c b/ui/gcr-prompt-dialog.c deleted file mode 100644 index 80726ba..0000000 --- a/ui/gcr-prompt-dialog.c +++ /dev/null @@ -1,1060 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stef@thewalter.net> - */ - -#include "config.h" - -#include "gcr/gcr-prompt.h" - -#include "gcr-prompt-dialog.h" -#include "gcr-secure-entry-buffer.h" - -#include <gtk/gtk.h> -#ifdef GDK_WINDOWING_X11 -#include <gdk/gdkx.h> -#endif -#ifdef GDK_WINDOWING_WAYLAND -#include <gdk/gdkwayland.h> -#endif -#include <glib/gi18n.h> - -/** - * GcrPromptDialog: - * - * A [iface@Gcr.Prompt] implementation which shows a GTK dialog. The dialog - * will remain visible (but insensitive) between prompts. If the user cancels - * the dialog between prompts, then the dialog will be hidden. - */ - -#ifdef GCR_DISABLE_GRABS -#define GRAB_KEYBOARD 0 -#else -#define GRAB_KEYBOARD 1 -#endif - -typedef enum { - PROMPT_NONE, - PROMPT_CONFIRMING, - PROMPT_PASSWORDING -} PromptMode; - -enum { - PROP_0, - PROP_MESSAGE, - PROP_DESCRIPTION, - PROP_WARNING, - PROP_CHOICE_LABEL, - PROP_CHOICE_CHOSEN, - PROP_PASSWORD_NEW, - PROP_PASSWORD_STRENGTH, - PROP_CALLER_WINDOW, - PROP_CONTINUE_LABEL, - PROP_CANCEL_LABEL, - - PROP_PASSWORD_VISIBLE, - PROP_CONFIRM_VISIBLE, - PROP_WARNING_VISIBLE, - PROP_CHOICE_VISIBLE, -}; - -struct _GcrPromptDialogPrivate { - gchar *title; - gchar *message; - gchar *description; - gchar *warning; - gchar *choice_label; - gboolean choice_chosen; - gboolean password_new; - guint password_strength; - gchar *caller_window; - gchar *continue_label; - gchar *cancel_label; - - GSimpleAsyncResult *async_result; - GcrPromptReply last_reply; - GtkWidget *widget_grid; - GtkWidget *continue_button; - GtkWidget *spinner; - GtkWidget *image; - GtkWidget *password_entry; - GtkEntryBuffer *password_buffer; - GtkEntryBuffer *confirm_buffer; - PromptMode mode; -#if GTK_CHECK_VERSION (3,20,0) - GdkSeat *grabbed_seat; -#else - GdkDevice *grabbed_device; -#endif - gulong grab_broken_id; - gboolean grab_disabled; - gboolean was_closed; -}; - -static void gcr_prompt_dialog_prompt_iface (GcrPromptIface *iface); - -static gboolean ungrab_keyboard (GtkWidget *win, - GdkEvent *event, - gpointer unused); - -G_DEFINE_TYPE_WITH_CODE (GcrPromptDialog, gcr_prompt_dialog, GTK_TYPE_DIALOG, - G_ADD_PRIVATE (GcrPromptDialog); - G_IMPLEMENT_INTERFACE (GCR_TYPE_PROMPT, gcr_prompt_dialog_prompt_iface); -); - -#ifdef GDK_WINDOWING_X11 -static gboolean -update_transient_for_x11 (GcrPromptDialog *self, GdkWindow *window) -{ - gint64 handle; - gchar *end; - GdkDisplay *display; - GdkWindow *transient_for; - - if (!GDK_IS_X11_WINDOW (window)) - return FALSE; - - handle = g_ascii_strtoll (self->pv->caller_window, &end, 10); - if (!end || *end != '\0') { - g_warning ("couldn't parse caller-window property: %s", self->pv->caller_window); - return FALSE; - } - - display = gtk_widget_get_display (GTK_WIDGET (self)); - transient_for = gdk_x11_window_foreign_new_for_display (display, (Window)handle); - if (transient_for == NULL) { - g_warning ("caller-window property doesn't represent a window on current display: %s", - self->pv->caller_window); - return FALSE; - } - - gdk_window_set_transient_for (window, transient_for); - g_object_unref (transient_for); - return TRUE; -} -#endif - -#ifdef GDK_WINDOWING_WAYLAND -static gboolean -update_transient_for_wl (GcrPromptDialog *self, GdkWindow *window) -{ - if (!GDK_IS_WAYLAND_WINDOW (window)) - return FALSE; - - if (gdk_wayland_window_set_transient_for_exported (window, self->pv->caller_window)) { - g_debug ("Succesfully set transient for WL window %s", self->pv->caller_window); - return TRUE; - } - - g_warning ("caller-window property doesn't represent a window on current display: %s", - self->pv->caller_window); - return FALSE; -} -#endif - -static void -update_transient_for (GcrPromptDialog *self) -{ - GdkWindow *window; - gboolean success = FALSE; - - if (self->pv->caller_window == NULL || g_str_equal (self->pv->caller_window, "")) { - gtk_window_set_modal (GTK_WINDOW (self), FALSE); - return; - } - - window = gtk_widget_get_window (GTK_WIDGET (self)); - if (window == NULL) - return; - -#ifdef GDK_WINDOWING_X11 - if (!success) - success |= update_transient_for_x11 (self, window); -#endif -#ifdef GDK_WINDOWING_WAYLAND - if (!success) - success |= update_transient_for_wl (self, window); -#endif - - if (!success) { - g_warning ("Couldn't set transient to caller window"); - } - - gtk_window_set_modal (GTK_WINDOW (self), TRUE); -} - -static void -gcr_prompt_dialog_init (GcrPromptDialog *self) -{ - self->pv = gcr_prompt_dialog_get_instance_private (self); - - /* - * This is a stupid hack to work around to help the window act like - * a normal object with regards to reference counting and unref. - */ - gtk_window_set_has_user_ref_count (GTK_WINDOW (self), FALSE); -} - -static void -gcr_prompt_dialog_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); - - switch (prop_id) { - case PROP_MESSAGE: - g_free (self->pv->message); - self->pv->message = g_value_dup_string (value); - g_object_notify (obj, "message"); - break; - case PROP_DESCRIPTION: - g_free (self->pv->description); - self->pv->description = g_value_dup_string (value); - g_object_notify (obj, "description"); - break; - case PROP_WARNING: - g_free (self->pv->warning); - self->pv->warning = g_value_dup_string (value); - if (self->pv->warning && self->pv->warning[0] == '\0') { - g_free (self->pv->warning); - self->pv->warning = NULL; - } - g_object_notify (obj, "warning"); - g_object_notify (obj, "warning-visible"); - break; - case PROP_CHOICE_LABEL: - g_free (self->pv->choice_label); - self->pv->choice_label = g_value_dup_string (value); - if (self->pv->choice_label && self->pv->choice_label[0] == '\0') { - g_free (self->pv->choice_label); - self->pv->choice_label = NULL; - } - g_object_notify (obj, "choice-label"); - g_object_notify (obj, "choice-visible"); - break; - case PROP_CHOICE_CHOSEN: - self->pv->choice_chosen = g_value_get_boolean (value); - g_object_notify (obj, "choice-chosen"); - break; - case PROP_PASSWORD_NEW: - self->pv->password_new = g_value_get_boolean (value); - g_object_notify (obj, "password-new"); - g_object_notify (obj, "confirm-visible"); - break; - case PROP_CALLER_WINDOW: - g_free (self->pv->caller_window); - self->pv->caller_window = g_value_dup_string (value); - if (self->pv->caller_window && self->pv->caller_window[0] == '\0') { - g_free (self->pv->caller_window); - self->pv->caller_window = NULL; - } - update_transient_for (self); - g_object_notify (obj, "caller-window"); - break; - case PROP_CONTINUE_LABEL: - g_free (self->pv->continue_label); - self->pv->continue_label = g_value_dup_string (value); - g_object_notify (obj, "continue-label"); - break; - case PROP_CANCEL_LABEL: - g_free (self->pv->cancel_label); - self->pv->cancel_label = g_value_dup_string (value); - g_object_notify (obj, "cancel-label"); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_prompt_dialog_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); - - switch (prop_id) { - case PROP_MESSAGE: - g_value_set_string (value, self->pv->message); - break; - case PROP_DESCRIPTION: - g_value_set_string (value, self->pv->description); - break; - case PROP_WARNING: - g_value_set_string (value, self->pv->warning); - break; - case PROP_CHOICE_LABEL: - g_value_set_string (value, self->pv->choice_label); - break; - case PROP_CHOICE_CHOSEN: - g_value_set_boolean (value, self->pv->choice_chosen); - break; - case PROP_PASSWORD_NEW: - g_value_set_boolean (value, self->pv->password_new); - break; - case PROP_PASSWORD_STRENGTH: - g_value_set_int (value, self->pv->password_strength); - break; - case PROP_CALLER_WINDOW: - g_value_set_string (value, self->pv->caller_window); - break; - case PROP_PASSWORD_VISIBLE: - g_value_set_boolean (value, self->pv->mode == PROMPT_PASSWORDING); - break; - case PROP_CONFIRM_VISIBLE: - g_value_set_boolean (value, self->pv->password_new && - self->pv->mode == PROMPT_PASSWORDING); - break; - case PROP_WARNING_VISIBLE: - g_value_set_boolean (value, self->pv->warning && self->pv->warning[0]); - break; - case PROP_CHOICE_VISIBLE: - g_value_set_boolean (value, self->pv->choice_label && self->pv->choice_label[0]); - break; - case PROP_CONTINUE_LABEL: - g_value_set_string (value, self->pv->continue_label); - break; - case PROP_CANCEL_LABEL: - g_value_set_string (value, self->pv->cancel_label); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - - -static void -on_password_changed (GtkEditable *editable, - gpointer user_data) -{ - int upper, lower, digit, misc; - const char *password; - gdouble pwstrength; - int length, i; - - password = gtk_entry_get_text (GTK_ENTRY (editable)); - - /* - * This code is based on the Master Password dialog in Firefox - * (pref-masterpass.js) - * Original code triple-licensed under the MPL, GPL, and LGPL - * so is license-compatible with this file - */ - - length = strlen (password); - upper = 0; - lower = 0; - digit = 0; - misc = 0; - - for ( i = 0; i < length ; i++) { - if (g_ascii_isdigit (password[i])) - digit++; - else if (g_ascii_islower (password[i])) - lower++; - else if (g_ascii_isupper (password[i])) - upper++; - else - misc++; - } - - if (length > 5) - length = 5; - if (digit > 3) - digit = 3; - if (upper > 3) - upper = 3; - if (misc > 3) - misc = 3; - - pwstrength = ((length * 0.1) - 0.2) + - (digit * 0.1) + - (misc * 0.15) + - (upper * 0.1); - - if (pwstrength < 0.0) - pwstrength = 0.0; - if (pwstrength > 1.0) - pwstrength = 1.0; - - gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (user_data), pwstrength); -} - - -static const gchar* -grab_status_message (GdkGrabStatus status) -{ - switch (status) { - case GDK_GRAB_SUCCESS: - g_return_val_if_reached (""); - break; - case GDK_GRAB_ALREADY_GRABBED: - return "already grabbed"; - case GDK_GRAB_INVALID_TIME: - return "invalid time"; - case GDK_GRAB_NOT_VIEWABLE: - return "not viewable"; - case GDK_GRAB_FROZEN: - return "frozen"; - default: - g_message ("unknown grab status: %d", (int)status); - return "unknown"; - } -} - -static gboolean -on_grab_broken (GtkWidget *widget, - GdkEventGrabBroken * event, - gpointer user_data) -{ - ungrab_keyboard (widget, (GdkEvent *)event, user_data); - return TRUE; -} - -#if GTK_CHECK_VERSION (3,20,0) -static gboolean -grab_keyboard (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data); - GdkGrabStatus status; - GdkSeat *seat; - GdkDisplay *display; - - if (self->pv->grabbed_seat || !GRAB_KEYBOARD) - return FALSE; - - display = gtk_widget_get_display (widget); - seat = gdk_display_get_default_seat (display); - status = gdk_seat_grab (seat, gtk_widget_get_window (widget), - GDK_SEAT_CAPABILITY_ALL, - TRUE, NULL, event, NULL, NULL); - if (status == GDK_GRAB_SUCCESS) { - self->pv->grab_broken_id = g_signal_connect (widget, "grab-broken-event", - G_CALLBACK (on_grab_broken), self); - gtk_grab_add (widget); - self->pv->grabbed_seat = seat; - } else { - g_message ("could not grab keyboard: %s", grab_status_message (status)); - } - - /* Always return false, so event is handled elsewhere */ - return FALSE; -} - -static gboolean -ungrab_keyboard (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data); - - if (self->pv->grabbed_seat) { - g_signal_handler_disconnect (widget, self->pv->grab_broken_id); - gdk_seat_ungrab (self->pv->grabbed_seat); - gtk_grab_remove (widget); - self->pv->grabbed_seat = NULL; - self->pv->grab_broken_id = 0; - } - - /* Always return false, so event is handled elsewhere */ - return FALSE; -} -#else -static gboolean -grab_keyboard (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data); - GdkGrabStatus status; - guint32 at; - GdkDevice *device = NULL; - GdkDeviceManager *manager; - GdkDisplay *display; - GList *devices, *l; - - if (self->pv->grabbed_device || !GRAB_KEYBOARD) - return FALSE; - - display = gtk_widget_get_display (widget); - manager = gdk_display_get_device_manager (display); - devices = gdk_device_manager_list_devices (manager, GDK_DEVICE_TYPE_MASTER); - for (l = devices; l; l = g_list_next (l)) { - device = l->data; - if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) - break; - } - g_list_free (devices); - - if (!device) { - g_message ("couldn't find device to grab"); - return FALSE; - } - - at = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME; - status = gdk_device_grab (device, gtk_widget_get_window (widget), - GDK_OWNERSHIP_APPLICATION, TRUE, - GDK_KEY_PRESS | GDK_KEY_RELEASE, NULL, at); - if (status == GDK_GRAB_SUCCESS) { - self->pv->grab_broken_id = g_signal_connect (widget, "grab-broken-event", - G_CALLBACK (on_grab_broken), self); - gtk_device_grab_add (widget, device, TRUE); - self->pv->grabbed_device = device; - } else { - g_message ("could not grab keyboard: %s", grab_status_message (status)); - } - - /* Always return false, so event is handled elsewhere */ - return FALSE; -} - -static gboolean -ungrab_keyboard (GtkWidget *widget, - GdkEvent *event, - gpointer user_data) -{ - guint32 at = event ? gdk_event_get_time (event) : GDK_CURRENT_TIME; - GcrPromptDialog *self = GCR_PROMPT_DIALOG (user_data); - - if (self->pv->grabbed_device) { - g_signal_handler_disconnect (widget, self->pv->grab_broken_id); - gdk_device_ungrab (self->pv->grabbed_device, at); - gtk_device_grab_remove (widget, self->pv->grabbed_device); - self->pv->grabbed_device = NULL; - self->pv->grab_broken_id = 0; - } - - /* Always return false, so event is handled elsewhere */ - return FALSE; -} -#endif - -static gboolean -window_state_changed (GtkWidget *win, GdkEventWindowState *event, gpointer data) -{ - GdkWindowState state = gdk_window_get_state (gtk_widget_get_window (win)); - GcrPromptDialog *self = GCR_PROMPT_DIALOG (data); - - if (state & GDK_WINDOW_STATE_WITHDRAWN || - state & GDK_WINDOW_STATE_ICONIFIED || - state & GDK_WINDOW_STATE_FULLSCREEN || - state & GDK_WINDOW_STATE_MAXIMIZED) { - self->pv->grab_disabled = TRUE; - ungrab_keyboard (win, (GdkEvent*)event, data); - } else if (self->pv->grab_disabled) { - self->pv->grab_disabled = FALSE; - grab_keyboard (win, (GdkEvent*)event, data); - } - - return FALSE; -} - -static void -gcr_prompt_dialog_constructed (GObject *obj) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); - GtkDialog *dialog; - PangoAttrList *attrs; - GtkWidget *widget; - GtkWidget *entry; - GtkWidget *content; - GtkWidget *button; - GtkGrid *grid; - - G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->constructed (obj); - - dialog = GTK_DIALOG (self); - button = gtk_dialog_add_button (dialog, _("_Cancel"), GTK_RESPONSE_CANCEL); - g_object_bind_property (self, "cancel-label", button, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); - gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); - button = gtk_dialog_add_button (dialog, _("_OK"), GTK_RESPONSE_OK); - g_object_bind_property (self, "continue-label", button, "label", G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE); - gtk_button_set_use_underline (GTK_BUTTON (button), TRUE); - self->pv->continue_button = button; - - gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_NORMAL); - gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); - gtk_window_set_keep_above (GTK_WINDOW (dialog), TRUE); - gtk_dialog_set_default_response (dialog, GTK_RESPONSE_OK); - - content = gtk_dialog_get_content_area (dialog); - - grid = GTK_GRID (gtk_grid_new ()); - gtk_container_set_border_width (GTK_CONTAINER (grid), 6); - gtk_widget_set_hexpand (GTK_WIDGET (grid), TRUE); - gtk_grid_set_column_homogeneous (grid, FALSE); - gtk_grid_set_column_spacing (grid, 12); - gtk_grid_set_row_spacing (grid, 6); - - /* The prompt image */ - self->pv->image = gtk_image_new_from_icon_name ("dialog-password", GTK_ICON_SIZE_DIALOG); - gtk_widget_set_valign (self->pv->image, GTK_ALIGN_START); - gtk_grid_attach (grid, self->pv->image, -1, 0, 1, 4); - gtk_widget_show (self->pv->image); - - /* The prompt spinner on the continue button */ - widget = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), - GTK_RESPONSE_OK); - self->pv->spinner = gtk_spinner_new (); - gtk_button_set_image (GTK_BUTTON (widget), self->pv->spinner); - gtk_button_set_image_position (GTK_BUTTON (widget), GTK_POS_LEFT); - - /* The message label */ - widget = gtk_label_new (""); - attrs = pango_attr_list_new (); - pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD)); - pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_LARGE)); - gtk_label_set_attributes (GTK_LABEL (widget), attrs); - pango_attr_list_unref (attrs); - gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); - gtk_widget_set_halign (widget, GTK_ALIGN_START); - gtk_widget_set_hexpand (widget, TRUE); - gtk_widget_set_margin_bottom (widget, 8); - g_object_bind_property (self, "message", widget, "label", G_BINDING_DEFAULT); - gtk_grid_attach (grid, widget, 0, 0, 2, 1); - gtk_widget_show (widget); - - /* The description label */ - widget = gtk_label_new (""); - gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE); - gtk_widget_set_halign (widget, GTK_ALIGN_START); - gtk_widget_set_hexpand (widget, TRUE); - gtk_widget_set_margin_bottom (widget, 4); - g_object_bind_property (self, "description", widget, "label", G_BINDING_DEFAULT); - gtk_grid_attach (grid, widget, 0, 1, 2, 1); - gtk_widget_show (widget); - - /* The password label */ - widget = gtk_label_new (_("Password:")); - gtk_widget_set_halign (widget, GTK_ALIGN_START); - gtk_widget_set_hexpand (widget, FALSE); - g_object_bind_property (self, "password-visible", widget, "visible", G_BINDING_DEFAULT); - gtk_grid_attach (grid, widget, 0, 2, 1, 1); - - /* The password entry */ - self->pv->password_buffer = gcr_secure_entry_buffer_new (); - entry = gtk_entry_new_with_buffer (self->pv->password_buffer); - gtk_entry_set_visibility (GTK_ENTRY (entry), FALSE); - gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE); - gtk_widget_set_hexpand (entry, TRUE); - g_object_bind_property (self, "password-visible", entry, "visible", G_BINDING_DEFAULT); - gtk_grid_attach (grid, entry, 1, 2, 1, 1); - self->pv->password_entry = entry; - - /* The confirm label */ - widget = gtk_label_new (_("Confirm:")); - gtk_widget_set_halign (widget, GTK_ALIGN_START); - gtk_widget_set_hexpand (widget, FALSE); - g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT); - gtk_grid_attach (grid, widget, 0, 3, 1, 1); - - /* The confirm entry */ - self->pv->confirm_buffer = gcr_secure_entry_buffer_new (); - widget = gtk_entry_new_with_buffer (self->pv->confirm_buffer); - gtk_widget_set_hexpand (widget, TRUE); - gtk_entry_set_visibility (GTK_ENTRY (widget), FALSE); - gtk_entry_set_activates_default (GTK_ENTRY (widget), TRUE); - g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT); - gtk_grid_attach (grid, widget, 1, 3, 1, 1); - - /* The quality progress bar */ - widget = gtk_progress_bar_new (); - gtk_widget_set_hexpand (widget, TRUE); - g_object_bind_property (self, "confirm-visible", widget, "visible", G_BINDING_DEFAULT); - gtk_grid_attach (grid, widget, 1, 4, 1, 1); - g_signal_connect (entry, "changed", G_CALLBACK (on_password_changed), widget); - - /* The warning */ - widget = gtk_label_new (""); - attrs = pango_attr_list_new (); - pango_attr_list_insert (attrs, pango_attr_style_new (PANGO_STYLE_ITALIC)); - gtk_label_set_attributes (GTK_LABEL (widget), attrs); - pango_attr_list_unref (attrs); - gtk_widget_set_hexpand (widget, FALSE); - g_object_bind_property (self, "warning", widget, "label", G_BINDING_DEFAULT); - g_object_bind_property (self, "warning-visible", widget, "visible", G_BINDING_DEFAULT); - gtk_grid_attach (grid, widget, 0, 5, 2, 1); - gtk_widget_show (widget); - - /* The checkbox */ - widget = g_object_new (GTK_TYPE_CHECK_BUTTON, "use-underline", TRUE, NULL); - g_object_bind_property (self, "choice-label", widget, "label", G_BINDING_DEFAULT); - g_object_bind_property (self, "choice-visible", widget, "visible", G_BINDING_DEFAULT); - g_object_bind_property (self, "choice-chosen", widget, "active", G_BINDING_BIDIRECTIONAL); - gtk_widget_set_hexpand (widget, FALSE); - gtk_grid_attach (grid, widget, 0, 6, 2, 1); - - gtk_container_add (GTK_CONTAINER (content), GTK_WIDGET (grid)); - gtk_widget_show (GTK_WIDGET (grid)); - self->pv->widget_grid = GTK_WIDGET (grid); - - g_signal_connect (self, "map-event", G_CALLBACK (grab_keyboard), self); - g_signal_connect (self, "unmap-event", G_CALLBACK (ungrab_keyboard), self); - g_signal_connect (self, "window-state-event", G_CALLBACK (window_state_changed), self); - -} - -static gboolean -handle_password_response (GcrPromptDialog *self) -{ - const gchar *password; - const gchar *confirm; - const gchar *env; - gint strength; - - password = gtk_entry_buffer_get_text (self->pv->password_buffer); - - /* Is it a new password? */ - if (self->pv->password_new) { - confirm = gtk_entry_buffer_get_text (self->pv->confirm_buffer); - - /* Do the passwords match? */ - if (!g_str_equal (password, confirm)) { - gcr_prompt_set_warning (GCR_PROMPT (self), _("Passwords do not match.")); - return FALSE; - } - - /* Don't allow blank passwords if in paranoid mode */ - env = g_getenv ("GNOME_KEYRING_PARANOID"); - if (env && *env) { - gcr_prompt_set_warning (GCR_PROMPT (self), _("Password cannot be blank")); - return FALSE; - } - } - - if (g_str_equal (password, "")) - strength = 0; - else - strength = 1; - - self->pv->password_strength = strength; - g_object_notify (G_OBJECT (self), "password-strength"); - return TRUE; -} - -static void -gcr_prompt_dialog_response (GtkDialog *dialog, - gint response_id) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (dialog); - GSimpleAsyncResult *res; - - /* - * If this is called while no prompting is going on, then the dialog - * is waiting for the caller to perform some action. Close the dialog. - */ - - if (self->pv->mode == PROMPT_NONE) { - g_return_if_fail (response_id != GTK_RESPONSE_OK); - gcr_prompt_close (GCR_PROMPT (self)); - return; - } - - switch (response_id) { - case GTK_RESPONSE_OK: - switch (self->pv->mode) { - case PROMPT_PASSWORDING: - if (!handle_password_response (self)) - return; - break; - default: - break; - } - self->pv->last_reply = GCR_PROMPT_REPLY_CONTINUE; - break; - - default: - self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL; - break; - } - - gtk_widget_set_sensitive (self->pv->continue_button, FALSE); - gtk_widget_set_sensitive (self->pv->widget_grid, FALSE); - gtk_widget_show (self->pv->spinner); - gtk_spinner_start (GTK_SPINNER (self->pv->spinner)); - self->pv->mode = PROMPT_NONE; - - res = self->pv->async_result; - self->pv->async_result = NULL; - - g_simple_async_result_complete (res); - g_object_unref (res); -} - -static void -gcr_prompt_dialog_dispose (GObject *obj) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); - - gcr_prompt_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_DELETE_EVENT); - g_assert (self->pv->async_result == NULL); - - gcr_prompt_close (GCR_PROMPT (self)); - - ungrab_keyboard (GTK_WIDGET (self), NULL, self); -#if GTK_CHECK_VERSION (3,20,0) - g_assert (self->pv->grabbed_seat == NULL); -#else - g_assert (self->pv->grabbed_device == NULL); -#endif - - G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->dispose (obj); -} - -static void -gcr_prompt_dialog_finalize (GObject *obj) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (obj); - - g_free (self->pv->title); - g_free (self->pv->message); - g_free (self->pv->description); - g_free (self->pv->warning); - g_free (self->pv->choice_label); - g_free (self->pv->caller_window); - - g_object_unref (self->pv->password_buffer); - g_object_unref (self->pv->confirm_buffer); - - G_OBJECT_CLASS (gcr_prompt_dialog_parent_class)->finalize (obj); -} - -static void -gcr_prompt_dialog_class_init (GcrPromptDialogClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - GtkDialogClass *dialog_class = GTK_DIALOG_CLASS (klass); - - gobject_class->constructed = gcr_prompt_dialog_constructed; - gobject_class->get_property = gcr_prompt_dialog_get_property; - gobject_class->set_property = gcr_prompt_dialog_set_property; - gobject_class->dispose = gcr_prompt_dialog_dispose; - gobject_class->finalize = gcr_prompt_dialog_finalize; - - dialog_class->response = gcr_prompt_dialog_response; - - g_object_class_override_property (gobject_class, PROP_MESSAGE, "message"); - - g_object_class_override_property (gobject_class, PROP_DESCRIPTION, "description"); - - g_object_class_override_property (gobject_class, PROP_WARNING, "warning"); - - g_object_class_override_property (gobject_class, PROP_PASSWORD_NEW, "password-new"); - - g_object_class_override_property (gobject_class, PROP_PASSWORD_STRENGTH, "password-strength"); - - g_object_class_override_property (gobject_class, PROP_CHOICE_LABEL, "choice-label"); - - g_object_class_override_property (gobject_class, PROP_CHOICE_CHOSEN, "choice-chosen"); - - g_object_class_override_property (gobject_class, PROP_CALLER_WINDOW, "caller-window"); - - g_object_class_override_property (gobject_class, PROP_CONTINUE_LABEL, "continue-label"); - - g_object_class_override_property (gobject_class, PROP_CANCEL_LABEL, "cancel-label"); - - /** - * GcrPromptDialog:password-visible: - * - * Whether the password entry is visible or not. - */ - g_object_class_install_property (gobject_class, PROP_PASSWORD_VISIBLE, - g_param_spec_boolean ("password-visible", "Password visible", "Password field is visible", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrPromptDialog:confirm-visible: - * - * Whether the password confirm entry is visible or not. - */ - g_object_class_install_property (gobject_class, PROP_CONFIRM_VISIBLE, - g_param_spec_boolean ("confirm-visible", "Confirm visible", "Confirm field is visible", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrPromptDialog:warning-visible: - * - * Whether the warning label is visible or not. - */ - g_object_class_install_property (gobject_class, PROP_WARNING_VISIBLE, - g_param_spec_boolean ("warning-visible", "Warning visible", "Warning is visible", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrPromptDialog:choice-visible: - * - * Whether the choice check box is visible or not. - */ - g_object_class_install_property (gobject_class, PROP_CHOICE_VISIBLE, - g_param_spec_boolean ("choice-visible", "Choice visible", "Choice is visible", - FALSE, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); -} - -static void -gcr_prompt_dialog_password_async (GcrPrompt *prompt, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); - GObject *obj; - - if (self->pv->async_result != NULL) { - g_warning ("this prompt is already prompting"); - return; - } - - self->pv->mode = PROMPT_PASSWORDING; - self->pv->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, - gcr_prompt_dialog_password_async); - - gtk_entry_buffer_set_text (self->pv->password_buffer, "", 0); - gtk_entry_buffer_set_text (self->pv->confirm_buffer, "", 0); - - if (self->pv->was_closed) { - self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL; - g_simple_async_result_complete_in_idle (self->pv->async_result); - return; - } - - gtk_image_set_from_icon_name (GTK_IMAGE (self->pv->image), - "dialog-password", GTK_ICON_SIZE_DIALOG); - gtk_widget_set_sensitive (self->pv->continue_button, TRUE); - gtk_widget_set_sensitive (self->pv->widget_grid, TRUE); - gtk_widget_hide (self->pv->spinner); - gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); - - obj = G_OBJECT (self); - g_object_notify (obj, "password-visible"); - g_object_notify (obj, "confirm-visible"); - g_object_notify (obj, "warning-visible"); - g_object_notify (obj, "choice-visible"); - - gtk_widget_grab_focus (self->pv->password_entry); - gtk_widget_show (GTK_WIDGET (self)); -} - -static const gchar * -gcr_prompt_dialog_password_finish (GcrPrompt *prompt, - GAsyncResult *result, - GError **error) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); - - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt), - gcr_prompt_dialog_password_async), NULL); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return NULL; - - if (self->pv->last_reply == GCR_PROMPT_REPLY_CONTINUE) - return gtk_entry_buffer_get_text (self->pv->password_buffer); - return NULL; -} - -static void -gcr_prompt_dialog_confirm_async (GcrPrompt *prompt, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); - GtkWidget *button; - GObject *obj; - - if (self->pv->async_result != NULL) { - g_warning ("this prompt is already prompting"); - return; - } - - self->pv->mode = PROMPT_CONFIRMING; - self->pv->async_result = g_simple_async_result_new (G_OBJECT (self), callback, user_data, - gcr_prompt_dialog_confirm_async); - - if (self->pv->was_closed) { - self->pv->last_reply = GCR_PROMPT_REPLY_CANCEL; - g_simple_async_result_complete_in_idle (self->pv->async_result); - return; - } - - gtk_image_set_from_icon_name (GTK_IMAGE (self->pv->image), - "dialog-question", GTK_ICON_SIZE_DIALOG); - gtk_widget_set_sensitive (self->pv->continue_button, TRUE); - gtk_widget_set_sensitive (self->pv->widget_grid, TRUE); - gtk_widget_hide (self->pv->spinner); - gtk_spinner_stop (GTK_SPINNER (self->pv->spinner)); - - button = gtk_dialog_get_widget_for_response (GTK_DIALOG (self), GTK_RESPONSE_OK); - gtk_widget_grab_focus (button); - - obj = G_OBJECT (self); - g_object_notify (obj, "password-visible"); - g_object_notify (obj, "confirm-visible"); - g_object_notify (obj, "warning-visible"); - g_object_notify (obj, "choice-visible"); - - gtk_widget_show (GTK_WIDGET (self)); -} - -static GcrPromptReply -gcr_prompt_dialog_confirm_finish (GcrPrompt *prompt, - GAsyncResult *result, - GError **error) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); - - g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (prompt), - gcr_prompt_dialog_confirm_async), GCR_PROMPT_REPLY_CANCEL); - - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (result), error)) - return GCR_PROMPT_REPLY_CANCEL; - - return self->pv->last_reply; -} - -static void -gcr_prompt_dialog_close (GcrPrompt *prompt) -{ - GcrPromptDialog *self = GCR_PROMPT_DIALOG (prompt); - if (!self->pv->was_closed) { - self->pv->was_closed = TRUE; - gtk_widget_hide (GTK_WIDGET (self)); - } -} - -static void -gcr_prompt_dialog_prompt_iface (GcrPromptIface *iface) -{ - iface->prompt_password_async = gcr_prompt_dialog_password_async; - iface->prompt_password_finish = gcr_prompt_dialog_password_finish; - iface->prompt_confirm_async = gcr_prompt_dialog_confirm_async; - iface->prompt_confirm_finish = gcr_prompt_dialog_confirm_finish; - iface->prompt_close = gcr_prompt_dialog_close; -} diff --git a/ui/gcr-prompt-dialog.h b/ui/gcr-prompt-dialog.h deleted file mode 100644 index 9a94457..0000000 --- a/ui/gcr-prompt-dialog.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2011 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stef@thewalter.net> - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_PROMPT_DIALOG_H__ -#define __GCR_PROMPT_DIALOG_H__ - -#include <gtk/gtk.h> - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_PROMPT_DIALOG (gcr_prompt_dialog_get_type ()) -#define GCR_PROMPT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialog)) -#define GCR_PROMPT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialogClass)) -#define GCR_IS_PROMPT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_PROMPT_DIALOG)) -#define GCR_IS_PROMPT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_PROMPT_DIALOG)) -#define GCR_PROMPT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_PROMPT_DIALOG, GcrPromptDialogClass)) - -typedef struct _GcrPromptDialog GcrPromptDialog; -typedef struct _GcrPromptDialogClass GcrPromptDialogClass; -typedef struct _GcrPromptDialogPrivate GcrPromptDialogPrivate; - -struct _GcrPromptDialog { - GtkDialog parent; - - /*< private >*/ - GcrPromptDialogPrivate *pv; -}; - -struct _GcrPromptDialogClass { - GtkDialogClass parent_class; -}; - -GType gcr_prompt_dialog_get_type (void); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrPromptDialog, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_PROMPT_DIALOG_H__ */ diff --git a/ui/gcr-prompter-tool.c b/ui/gcr-prompter-tool.c deleted file mode 100644 index 2d3f71e..0000000 --- a/ui/gcr-prompter-tool.c +++ /dev/null @@ -1,257 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* gcr-viewer-tool.c: Command line utility - - Copyright (C) 2011 Collabora Ltd. - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#include "config.h" - -#include "gcr/gcr.h" -#include "gcr/gcr-dbus-constants.h" - -#include <glib/gi18n.h> -#include <gtk/gtk.h> - -#include <locale.h> -#include <stdlib.h> -#include <string.h> -#include <syslog.h> - -#define QUIT_TIMEOUT 10 - -static GcrSystemPrompter *the_prompter = NULL; -static gboolean registered_prompter = FALSE; -static gboolean acquired_system_prompter = FALSE; -static gboolean acquired_private_prompter = FALSE; -static guint timeout_source = 0; - -static gboolean -on_timeout_quit (gpointer unused) -{ - g_debug ("%d second inactivity timeout, quitting", QUIT_TIMEOUT); - gtk_main_quit (); - - return FALSE; /* Don't run again */ -} - -static void -start_timeout (void) -{ - if (g_getenv ("GCR_PERSIST") != NULL) - return; - - if (!timeout_source) - timeout_source = g_timeout_add_seconds (QUIT_TIMEOUT, on_timeout_quit, NULL); -} - -static void -stop_timeout (void) -{ - if (timeout_source) - g_source_remove (timeout_source); - timeout_source = 0; -} - -static void -on_prompter_prompting (GObject *obj, - GParamSpec *param, - gpointer user_data) -{ - if (gcr_system_prompter_get_prompting (the_prompter)) - stop_timeout (); - else - start_timeout (); -} - -static void -on_bus_acquired (GDBusConnection *connection, - const gchar *name, - gpointer user_data) -{ - g_debug ("bus acquired: %s", name); - - if (!registered_prompter) - gcr_system_prompter_register (the_prompter, connection); - - registered_prompter = TRUE; -} - -static void -on_name_acquired (GDBusConnection *connection, - const gchar *name, - gpointer user_data) -{ - g_debug ("acquired name: %s", name); - - if (g_strcmp0 (name, GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME) == 0) - acquired_system_prompter = TRUE; - - else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME) == 0) - acquired_private_prompter = TRUE; -} - -static void -on_name_lost (GDBusConnection *connection, - const gchar *name, - gpointer user_data) -{ - g_debug ("lost name: %s", name); - - /* Called like so when no connection can be made */ - if (connection == NULL) { - g_warning ("couldn't connect to session bus"); - gtk_main_quit (); - - } else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME) == 0) { - acquired_system_prompter = FALSE; - - } else if (g_strcmp0 (name, GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME) == 0) { - acquired_private_prompter = FALSE; - - } -} - -static void -log_handler (const gchar *log_domain, - GLogLevelFlags log_level, - const gchar *message, - gpointer user_data) -{ - int level; - - /* Note that crit and err are the other way around in syslog */ - - switch (G_LOG_LEVEL_MASK & log_level) { - case G_LOG_LEVEL_ERROR: - level = LOG_CRIT; - break; - case G_LOG_LEVEL_CRITICAL: - level = LOG_ERR; - break; - case G_LOG_LEVEL_WARNING: - level = LOG_WARNING; - break; - case G_LOG_LEVEL_MESSAGE: - level = LOG_NOTICE; - break; - case G_LOG_LEVEL_INFO: - level = LOG_INFO; - break; - case G_LOG_LEVEL_DEBUG: - level = LOG_DEBUG; - break; - default: - level = LOG_ERR; - break; - } - - /* Log to syslog first */ - if (log_domain) - syslog (level, "%s: %s", log_domain, message); - else - syslog (level, "%s", message); - - /* And then to default handler for aborting and stuff like that */ - g_log_default_handler (log_domain, log_level, message, user_data); -} - -static void -printerr_handler (const gchar *string) -{ - /* Print to syslog and stderr */ - syslog (LOG_WARNING, "%s", string); - fprintf (stderr, "%s", string); -} - -static void -prepare_logging () -{ - GLogLevelFlags flags = G_LOG_FLAG_FATAL | G_LOG_LEVEL_ERROR | - G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | - G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO; - - openlog ("gcr-prompter", LOG_PID, LOG_AUTH); - - g_log_set_handler (NULL, flags, log_handler, NULL); - g_log_set_handler ("Glib", flags, log_handler, NULL); - g_log_set_handler ("Gtk", flags, log_handler, NULL); - g_log_set_handler ("Gnome", flags, log_handler, NULL); - g_log_set_handler ("Gcr", flags, log_handler, NULL); - g_log_set_handler ("Gck", flags, log_handler, NULL); - g_log_set_default_handler (log_handler, NULL); - g_set_printerr_handler (printerr_handler); -} - -int -main (int argc, char *argv[]) -{ - guint system_owner_id; - guint private_owner_id; - - gtk_init (&argc, &argv); - -#ifdef HAVE_LOCALE_H - /* internationalisation */ - setlocale (LC_ALL, ""); -#endif - -#ifdef HAVE_GETTEXT - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - textdomain (GETTEXT_PACKAGE); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); -#endif - - prepare_logging (); - - the_prompter = gcr_system_prompter_new (GCR_SYSTEM_PROMPTER_SINGLE, - GCR_TYPE_PROMPT_DIALOG); - g_signal_connect (the_prompter, "notify::prompting", - G_CALLBACK (on_prompter_prompting), NULL); - - system_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, - GCR_DBUS_PROMPTER_SYSTEM_BUS_NAME, - G_BUS_NAME_OWNER_FLAGS_REPLACE, - on_bus_acquired, - on_name_acquired, - on_name_lost, - NULL, - NULL); - - private_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, - GCR_DBUS_PROMPTER_PRIVATE_BUS_NAME, - G_BUS_NAME_OWNER_FLAGS_REPLACE, - on_bus_acquired, - on_name_acquired, - on_name_lost, - NULL, - NULL); - - start_timeout (); - gtk_main (); - - if (registered_prompter) - gcr_system_prompter_unregister (the_prompter, TRUE); - - g_bus_unown_name (system_owner_id); - g_bus_unown_name (private_owner_id); - - g_object_unref (the_prompter); - - return 0; -} diff --git a/ui/gcr-prompter.desktop.in.in b/ui/gcr-prompter.desktop.in.in deleted file mode 100644 index 086ec17..0000000 --- a/ui/gcr-prompter.desktop.in.in +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Name=Access Prompt -Comment=Unlock access to passwords and other secrets -# Translators: Do NOT translate or transliterate this text (this is an icon file name)! -Icon=security-medium -Exec=@libexecdir@/gcr-prompter -Terminal=false -Type=Application -NoDisplay=true diff --git a/ui/gcr-renderer.c b/ui/gcr-renderer.c deleted file mode 100644 index 46adae5..0000000 --- a/ui/gcr-renderer.c +++ /dev/null @@ -1,326 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-deprecated.h" -#include "gcr-renderer.h" - -#include "gcr-certificate-renderer.h" -#include "gcr-certificate-request-renderer.h" -#include "gcr-gnupg-renderer.h" -#include "gcr-key-renderer.h" - -#include "gck/gck.h" - -#include <gtk/gtk.h> - -/** - * GcrRenderer: - * - * An interface that's implemented by renderers which wish to render data to a - * [iface@Viewer]. - * - * The interaction between [iface@Renderer] and [iface@Viewer] is not stable - * yet, and so new renderers cannot be implemented outside the Gcr library at - * this time. - * - * To lookup a renderer for a given set of attributes, use the gcr_renderer_create() - * function. This will create and initialize a renderer that's capable of viewing - * the data in those attributes. - */ - -/** - * GcrRendererIface: - * @parent: the parent interface type - * @data_changed: signal emitted when data being rendered changes - * @render_view: method invoked to render the data into a viewer - * @populate_popup: method invoked to populate a popup menu with additional - * renderer options - * - * The interface for #GcrRenderer - */ - -enum { - DATA_CHANGED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -typedef struct _GcrRegistered { - GckAttributes *attrs; - GType renderer_type; -} GcrRegistered; - -static GArray *registered_renderers = NULL; -static gboolean registered_sorted = FALSE; - -static void -gcr_renderer_default_init (GcrRendererIface *iface) -{ - static gboolean initialized = FALSE; - if (!initialized) { - - /** - * GcrRenderer:label: - * - * The label to display. - */ - g_object_interface_install_property (iface, - g_param_spec_string ("label", "Label", "The label for the renderer", - "", - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrRenderer:attributes: - * - * The attributes to display. - */ - g_object_interface_install_property (iface, - g_param_spec_boxed ("attributes", "Attributes", "The data displayed in the renderer", - GCK_TYPE_ATTRIBUTES, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrRenderer::data-changed: - * - * A signal that is emitted by the renderer when it's data - * changed and should be rerendered. - */ - signals[DATA_CHANGED] = g_signal_new ("data-changed", GCR_TYPE_RENDERER, G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GcrRendererIface, data_changed), - NULL, NULL, NULL, G_TYPE_NONE, 0); - - initialized = TRUE; - } -} - -typedef GcrRendererIface GcrRendererInterface; - -G_DEFINE_INTERFACE (GcrRenderer, gcr_renderer, G_TYPE_OBJECT); - -/** - * gcr_renderer_render_view: - * @self: The renderer - * @viewer: The viewer to render to. - * - * Render the contents of the renderer to the given viewer. - */ -void -gcr_renderer_render_view (GcrRenderer *self, GcrViewer *viewer) -{ - g_return_if_fail (GCR_IS_RENDERER (self)); - g_return_if_fail (GCR_RENDERER_GET_INTERFACE (self)->render_view); - GCR_RENDERER_GET_INTERFACE (self)->render_view (self, viewer); -} - -/** - * gcr_renderer_render: - * @self: the renderer - * @viewer: the viewer to render to - * - * Render a renderer to the viewer. - * - * Deprecated: 3.2: Use gcr_renderer_render_view() instead - */ -void -gcr_renderer_render (GcrRenderer *self, - GcrViewer *viewer) -{ - gcr_renderer_render_view (self, viewer); -} - -/** - * gcr_renderer_popuplate_popup: - * @self: The renderer - * @viewer: The viewer that is displaying a popup - * @menu: The popup menu being displayed - * - * Called by #GcrViewer when about to display a popup menu for the content - * displayed by the renderer. The renderer can add a menu item if desired. - */ -void -gcr_renderer_popuplate_popup (GcrRenderer *self, GcrViewer *viewer, - GtkMenu *menu) -{ - g_return_if_fail (GCR_IS_RENDERER (self)); - if (GCR_RENDERER_GET_INTERFACE (self)->populate_popup) - GCR_RENDERER_GET_INTERFACE (self)->populate_popup (self, viewer, menu); -} - -/** - * gcr_renderer_emit_data_changed: - * @self: The renderer - * - * Emit the #GcrRenderer::data-changed signal on the renderer. This is used by - * renderer implementations. - */ -void -gcr_renderer_emit_data_changed (GcrRenderer *self) -{ - g_return_if_fail (GCR_IS_RENDERER (self)); - g_signal_emit (self, signals[DATA_CHANGED], 0); -} - -/** - * gcr_renderer_get_attributes: - * @self: The renderer - * - * Get the PKCS#11 attributes, if any, set for this renderer to display. - * - * Returns: (nullable) (transfer none): the attributes, owned by the renderer - */ -GckAttributes * -gcr_renderer_get_attributes (GcrRenderer *self) -{ - GckAttributes *attrs; - - g_return_val_if_fail (GCR_IS_RENDERER (self), NULL); - - g_object_get (self, "attributes", &attrs, NULL); - if (attrs != NULL) - gck_attributes_unref (attrs); - return attrs; -} - -/** - * gcr_renderer_set_attributes: - * @self: The renderer - * @attrs: (nullable): attributes to set - * - * Set the PKCS#11 attributes for this renderer to display. - */ -void -gcr_renderer_set_attributes (GcrRenderer *self, - GckAttributes *attrs) -{ - g_return_if_fail (GCR_IS_RENDERER (self)); - - g_object_set (self, "attributes", attrs, NULL); -} - -static gint -sort_registered_by_n_attrs (gconstpointer a, gconstpointer b) -{ - const GcrRegistered *ra = a; - const GcrRegistered *rb = b; - gulong na, nb; - - g_assert (a); - g_assert (b); - - na = gck_attributes_count (ra->attrs); - nb = gck_attributes_count (rb->attrs); - - /* Note we're sorting in reverse order */ - if (na < nb) - return 1; - return (na == nb) ? 0 : -1; -} - -/** - * gcr_renderer_create: - * @label: (nullable): The label for the renderer - * @attrs: The attributes to render - * - * Create and initialize a renderer for the given attributes and label. These - * renderers should have been preregistered via gcr_renderer_register(). - * - * Returns: (transfer full) (nullable): a new renderer, or %NULL if no renderer - * matched the attributes; the render should be released with g_object_unref() - */ -GcrRenderer * -gcr_renderer_create (const gchar *label, GckAttributes *attrs) -{ - GcrRegistered *registered; - gboolean matched; - gulong n_attrs; - gulong j; - gsize i; - - g_return_val_if_fail (attrs, NULL); - - gcr_renderer_register_well_known (); - - if (!registered_renderers) - return NULL; - - if (!registered_sorted) { - g_array_sort (registered_renderers, sort_registered_by_n_attrs); - registered_sorted = TRUE; - } - - for (i = 0; i < registered_renderers->len; ++i) { - registered = &(g_array_index (registered_renderers, GcrRegistered, i)); - n_attrs = gck_attributes_count (registered->attrs); - - matched = TRUE; - - for (j = 0; j < n_attrs; ++j) { - if (!gck_attributes_contains (attrs, gck_attributes_at (registered->attrs, j))) { - matched = FALSE; - break; - } - } - - if (matched) - return g_object_new (registered->renderer_type, "label", label, - "attributes", attrs, NULL); - } - - return NULL; -} - -/** - * gcr_renderer_register: - * @renderer_type: The renderer class type - * @attrs: The attributes to match - * - * Register a renderer to be created when matching attributes are passed to - * gcr_renderer_create(). - */ -void -gcr_renderer_register (GType renderer_type, GckAttributes *attrs) -{ - GcrRegistered registered; - - if (!registered_renderers) - registered_renderers = g_array_new (FALSE, FALSE, sizeof (GcrRegistered)); - - registered.renderer_type = renderer_type; - registered.attrs = gck_attributes_ref_sink (attrs); - g_array_append_val (registered_renderers, registered); - registered_sorted = FALSE; -} - -/** - * gcr_renderer_register_well_known: - * - * Register all the well known renderers for certificates and keys known to the - * Gcr library. - */ -void -gcr_renderer_register_well_known (void) -{ - g_type_class_unref (g_type_class_ref (GCR_TYPE_CERTIFICATE_RENDERER)); - g_type_class_unref (g_type_class_ref (GCR_TYPE_CERTIFICATE_REQUEST_RENDERER)); - g_type_class_unref (g_type_class_ref (GCR_TYPE_KEY_RENDERER)); - g_type_class_unref (g_type_class_ref (GCR_TYPE_GNUPG_RENDERER)); -} diff --git a/ui/gcr-renderer.h b/ui/gcr-renderer.h deleted file mode 100644 index 1b81469..0000000 --- a/ui/gcr-renderer.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_RENDERER_H__ -#define __GCR_RENDERER_H__ - -#include <glib-object.h> - -#include "gcr/gcr-column.h" -#include "gcr/gcr-types.h" - -#include "gcr-viewer.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_RENDERER (gcr_renderer_get_type()) -#define GCR_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_RENDERER, GcrRenderer)) -#define GCR_IS_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_RENDERER)) -#define GCR_RENDERER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_RENDERER, GcrRendererIface)) - -typedef struct _GcrRendererIface GcrRendererIface; - -struct _GcrRendererIface { - GTypeInterface parent; - - /* signals */ - void (*data_changed) (GcrRenderer *self); - - /* virtual */ - void (*render_view) (GcrRenderer *self, GcrViewer *viewer); - - void (*populate_popup) (GcrRenderer *self, GcrViewer *viewer, GtkMenu *menu); - - /*< private >*/ - gpointer dummy1; - - gpointer dummy2; - gpointer dummy3; - gpointer dummy4; - gpointer dummy5; - gpointer dummy6; - gpointer dummy7; - -}; - -GType gcr_renderer_get_type (void) G_GNUC_CONST; - -void gcr_renderer_render_view (GcrRenderer *self, - GcrViewer *viewer); - -void gcr_renderer_popuplate_popup (GcrRenderer *self, - GcrViewer *viewer, - GtkMenu *menu); - -void gcr_renderer_emit_data_changed (GcrRenderer *self); - -GcrRenderer* gcr_renderer_create (const gchar *label, - GckAttributes *attrs); - -void gcr_renderer_register (GType renderer_type, - GckAttributes *attrs); - -GckAttributes * gcr_renderer_get_attributes (GcrRenderer *self); - -void gcr_renderer_set_attributes (GcrRenderer *self, - GckAttributes *attrs); - -void gcr_renderer_register_well_known (void); - -G_END_DECLS - -#endif /* __GCR_RENDERER_H__ */ diff --git a/ui/gcr-tree-selector.c b/ui/gcr-tree-selector.c deleted file mode 100644 index e4db6ea..0000000 --- a/ui/gcr-tree-selector.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-internal.h" - -#include "gcr-collection-model.h" -#include "gcr-tree-selector.h" - -#include <glib/gi18n-lib.h> - -#include <string.h> - -/** - * GcrTreeSelector: - * - * A tree selector can be used to select certificates or keys. It allows - * the user to select multiple objects from a tree. - */ - -enum { - PROP_0, - PROP_COLLECTION, - PROP_COLUMNS -}; - -struct _GcrTreeSelectorPrivate { - GcrCollection *collection; - const GcrColumn *columns; - GcrCollectionModel *model; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GcrTreeSelector, gcr_tree_selector, GTK_TYPE_TREE_VIEW); - -/* ----------------------------------------------------------------------------- - * INTERNAL - */ - -static void -on_check_column_toggled (GtkCellRendererToggle *cell, gchar *path, GcrCollectionModel *model) -{ - GtkTreeIter iter; - - g_assert (path != NULL); - - if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL (model), &iter, path)) - gcr_collection_model_toggle_selected (model, &iter); -} - -static void -add_string_column (GcrTreeSelector *self, const GcrColumn *column, gint column_id) -{ - GtkCellRenderer *cell; - GtkTreeViewColumn *col; - const gchar *label; - - g_assert (column->column_type == G_TYPE_STRING); - g_assert (!(column->flags & GCR_COLUMN_HIDDEN)); - - cell = gtk_cell_renderer_text_new (); - g_object_set (G_OBJECT (cell), "ellipsize", PANGO_ELLIPSIZE_END, NULL); - label = column->label ? g_dpgettext2 (NULL, "column", column->label) : ""; - col = gtk_tree_view_column_new_with_attributes (label, cell, "text", column_id, NULL); - gtk_tree_view_column_set_resizable (col, TRUE); - if (column->flags & GCR_COLUMN_SORTABLE) - gtk_tree_view_column_set_sort_column_id (col, column_id); - gtk_tree_view_append_column (GTK_TREE_VIEW (self), col); -} - -static void -add_icon_column (GcrTreeSelector *self, const GcrColumn *column, gint column_id) -{ - GtkCellRenderer *cell; - GtkTreeViewColumn *col; - const gchar *label; - - g_assert (column->column_type == G_TYPE_ICON); - g_assert (!(column->flags & GCR_COLUMN_HIDDEN)); - - cell = gtk_cell_renderer_pixbuf_new (); - g_object_set (cell, "stock-size", GTK_ICON_SIZE_BUTTON, NULL); - label = column->label ? g_dpgettext2 (NULL, "column", column->label) : ""; - col = gtk_tree_view_column_new_with_attributes (label, cell, "gicon", column_id, NULL); - gtk_tree_view_column_set_resizable (col, TRUE); - if (column->flags & GCR_COLUMN_SORTABLE) - gtk_tree_view_column_set_sort_column_id (col, column_id); - gtk_tree_view_append_column (GTK_TREE_VIEW (self), col); -} - -static void -add_check_column (GcrTreeSelector *self, guint column_id) -{ - GtkCellRenderer *cell; - GtkTreeViewColumn *col; - - cell = gtk_cell_renderer_toggle_new (); - g_signal_connect (cell, "toggled", G_CALLBACK (on_check_column_toggled), self->pv->model); - - col = gtk_tree_view_column_new_with_attributes ("", cell, "active", column_id, NULL); - gtk_tree_view_column_set_resizable (col, FALSE); - gtk_tree_view_append_column (GTK_TREE_VIEW (self), col); -} - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - -static GObject* -gcr_tree_selector_constructor (GType type, guint n_props, GObjectConstructParam *props) -{ - GcrTreeSelector *self = GCR_TREE_SELECTOR (G_OBJECT_CLASS (gcr_tree_selector_parent_class)->constructor(type, n_props, props)); - const GcrColumn *column; - guint i; - - g_return_val_if_fail (self, NULL); - g_return_val_if_fail (self->pv->columns, NULL); - - self->pv->model = gcr_collection_model_new_full (self->pv->collection, - GCR_COLLECTION_MODEL_TREE, - self->pv->columns); - - gtk_tree_view_set_model (GTK_TREE_VIEW (self), GTK_TREE_MODEL (self->pv->model)); - - /* First add the check mark column */ - add_check_column (self, gcr_collection_model_column_for_selected (self->pv->model)); - - for (column = self->pv->columns, i = 0; column->property_name; ++column, ++i) { - if (column->flags & GCR_COLUMN_HIDDEN) - continue; - - if (column->column_type == G_TYPE_STRING) - add_string_column (self, column, i); - else if (column->column_type == G_TYPE_ICON) - add_icon_column (self, column, i); - else - g_warning ("skipping unsupported column '%s' of type: %s", - column->property_name, g_type_name (column->column_type)); - } - - return G_OBJECT (self); -} - -static void -gcr_tree_selector_init (GcrTreeSelector *self) -{ - self->pv = gcr_tree_selector_get_instance_private (self); -} - -static void -gcr_tree_selector_dispose (GObject *obj) -{ - GcrTreeSelector *self = GCR_TREE_SELECTOR (obj); - - if (self->pv->model) - g_object_unref (self->pv->model); - self->pv->model = NULL; - - if (self->pv->collection) - g_object_unref (self->pv->collection); - self->pv->collection = NULL; - - G_OBJECT_CLASS (gcr_tree_selector_parent_class)->dispose (obj); -} - -static void -gcr_tree_selector_finalize (GObject *obj) -{ - GcrTreeSelector *self = GCR_TREE_SELECTOR (obj); - - g_assert (!self->pv->collection); - g_assert (!self->pv->model); - - G_OBJECT_CLASS (gcr_tree_selector_parent_class)->finalize (obj); -} - -static void -gcr_tree_selector_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrTreeSelector *self = GCR_TREE_SELECTOR (obj); - switch (prop_id) { - case PROP_COLLECTION: - g_return_if_fail (!self->pv->collection); - self->pv->collection = g_value_dup_object (value); - g_return_if_fail (self->pv->collection); - break; - case PROP_COLUMNS: - g_return_if_fail (!self->pv->columns); - self->pv->columns = g_value_get_pointer (value); - g_return_if_fail (self->pv->columns); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_tree_selector_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrTreeSelector *self = GCR_TREE_SELECTOR (obj); - - switch (prop_id) { - case PROP_COLLECTION: - g_value_set_object (value, gcr_tree_selector_get_collection (self)); - break; - case PROP_COLUMNS: - g_value_set_pointer (value, (gpointer)gcr_tree_selector_get_columns (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_tree_selector_class_init (GcrTreeSelectorClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->constructor = gcr_tree_selector_constructor; - gobject_class->dispose = gcr_tree_selector_dispose; - gobject_class->finalize = gcr_tree_selector_finalize; - gobject_class->set_property = gcr_tree_selector_set_property; - gobject_class->get_property = gcr_tree_selector_get_property; - - /** - * GcrTreeSelector:collection: - * - * The collection which contains the objects to display in the selector. - */ - g_object_class_install_property (gobject_class, PROP_COLLECTION, - g_param_spec_object ("collection", "Collection", "Collection to select from", - GCR_TYPE_COLLECTION, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); - - /** - * GcrTreeSelector:columns: - * - * The columns to use to display the objects. - */ - g_object_class_install_property (gobject_class, PROP_COLUMNS, - g_param_spec_pointer ("columns", "Columns", "Columns to display in selector", - G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_tree_selector_new: (skip) - * @collection: The collection that contains the objects to display - * @columns: The columns to use to display the objects - * - * Create a new #GcrTreeSelector. - * - * Returns: (transfer full): a newly allocated selector, which should be - * released with g_object_unref() - */ -GcrTreeSelector * -gcr_tree_selector_new (GcrCollection *collection, const GcrColumn *columns) -{ - return g_object_new (GCR_TYPE_TREE_SELECTOR, - "collection", collection, - "columns", columns, - NULL); -} - -/** - * gcr_tree_selector_get_collection: - * @self: The selector - * - * Get the collection that this selector is displaying objects from. - * - * Returns: (transfer none): the collection, owned by the selector - */ -GcrCollection * -gcr_tree_selector_get_collection (GcrTreeSelector *self) -{ - g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL); - return self->pv->collection; -} - -/** - * gcr_tree_selector_get_columns: (skip) - * @self: The selector - * - * Get the columns displayed in a selector in multiple mode. - * - * Returns: (transfer none): The columns, owned by the selector. - */ -const GcrColumn * -gcr_tree_selector_get_columns (GcrTreeSelector *self) -{ - g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL); - return self->pv->columns; -} - -/** - * gcr_tree_selector_get_selected: - * @self: The selector - * - * Get a list of selected objects. - * - * Returns: (transfer container) (element-type GObject.Object): the list of selected - * objects, to be released with g_list_free() - */ -GList* -gcr_tree_selector_get_selected (GcrTreeSelector *self) -{ - g_return_val_if_fail (GCR_IS_TREE_SELECTOR (self), NULL); - return gcr_collection_model_get_selected_objects (self->pv->model); -} - -/** - * gcr_tree_selector_set_selected: - * @self: The selector - * @selected: (element-type GObject.Object): the list of objects to select - * - * Select certain objects in the selector. - */ -void -gcr_tree_selector_set_selected (GcrTreeSelector *self, GList *selected) -{ - g_return_if_fail (GCR_IS_TREE_SELECTOR (self)); - gcr_collection_model_set_selected_objects (self->pv->model, selected); -} diff --git a/ui/gcr-tree-selector.h b/ui/gcr-tree-selector.h deleted file mode 100644 index de16602..0000000 --- a/ui/gcr-tree-selector.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_TREE_SELECTOR_H__ -#define __GCR_TREE_SELECTOR_H__ - -#include "gcr/gcr-types.h" - -#include <gtk/gtk.h> - -G_BEGIN_DECLS - -#define GCR_TYPE_TREE_SELECTOR (gcr_tree_selector_get_type ()) -#define GCR_TREE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_TREE_SELECTOR, GcrTreeSelector)) -#define GCR_TREE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorClass)) -#define GCR_IS_TREE_SELECTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_TREE_SELECTOR)) -#define GCR_IS_TREE_SELECTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_TREE_SELECTOR)) -#define GCR_TREE_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_TREE_SELECTOR, GcrTreeSelectorClass)) - -typedef struct _GcrTreeSelector GcrTreeSelector; -typedef struct _GcrTreeSelectorClass GcrTreeSelectorClass; -typedef struct _GcrTreeSelectorPrivate GcrTreeSelectorPrivate; - -struct _GcrTreeSelector { - GtkTreeView parent; - - /*< private >*/ - GcrTreeSelectorPrivate *pv; -}; - -struct _GcrTreeSelectorClass { - /*< private >*/ - GtkTreeViewClass parent_class; -}; - -GType gcr_tree_selector_get_type (void); - -GcrTreeSelector* gcr_tree_selector_new (GcrCollection *collection, - const GcrColumn *columns); - -GcrCollection* gcr_tree_selector_get_collection (GcrTreeSelector *self); - -const GcrColumn* gcr_tree_selector_get_columns (GcrTreeSelector *self); - -GList* gcr_tree_selector_get_selected (GcrTreeSelector *self); - -void gcr_tree_selector_set_selected (GcrTreeSelector *self, - GList *selected); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrTreeSelector, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_TREE_SELECTOR_H__ */ diff --git a/ui/gcr-ui.h b/ui/gcr-ui.h deleted file mode 100644 index cbec5b3..0000000 --- a/ui/gcr-ui.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * gnome-keyring - * - * Copyright (C) 2010 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#ifndef GCR_API_SUBJECT_TO_CHANGE -#error "This API has not yet reached stability." -#endif - -#ifndef __GCR_UI_H__ -#define __GCR_UI_H__ - -#include <glib.h> - -#include <gcr/gcr-base.h> - -#define __GCR_INSIDE_HEADER__ - -#include <ui/gcr-certificate-renderer.h> -#include <ui/gcr-certificate-widget.h> -#include <ui/gcr-collection-model.h> -#include <ui/gcr-combo-selector.h> -#include <ui/gcr-deprecated.h> -#include <ui/gcr-enum-types.h> -#include <ui/gcr-key-renderer.h> -#include <ui/gcr-key-widget.h> -#include <ui/gcr-failure-renderer.h> -#include <ui/gcr-key-renderer.h> -#include <ui/gcr-key-widget.h> -#include <ui/gcr-import-button.h> -#include <ui/gcr-list-selector.h> -#include <ui/gcr-prompt-dialog.h> -#include <ui/gcr-renderer.h> -#include <ui/gcr-secure-entry-buffer.h> -#include <ui/gcr-tree-selector.h> -#include <ui/gcr-unlock-options-widget.h> -#include <ui/gcr-viewer.h> -#include <ui/gcr-viewer-widget.h> - -#undef __GCR_INSIDE_HEADER__ - -#endif /* __GCR_UI_H__ */ diff --git a/ui/gcr-unlock-options-widget.c b/ui/gcr-unlock-options-widget.c deleted file mode 100644 index 7db3257..0000000 --- a/ui/gcr-unlock-options-widget.c +++ /dev/null @@ -1,501 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-unlock-options-widget.h" - -#include <glib/gi18n-lib.h> - -/** - * GcrUnlockOptionsWidget: - * - * This widget displays a set of unlock options for the user to select. - * - * The user can choose between keeping caching the unlock indefinitely, or for - * a given amount of time. - * - * Each option has a different name, for example #GCR_UNLOCK_OPTION_ALWAYS. These - * names are used together with the various functions like - * [method@UnlockOptionsWidget.get_choice]. - */ - -/** - * GCR_UNLOCK_OPTION_ALWAYS: - * - * Option name for caching unlock indefinitely. - */ - -/** - * GCR_UNLOCK_OPTION_IDLE: - * - * Option name for caching unlock for a certain amount of idle time. - */ - -/** - * GCR_UNLOCK_OPTION_SESSION: - * - * Option name for caching unlock for the current session. - */ - -/** - * GCR_UNLOCK_OPTION_TIMEOUT: - * - * Option name for caching unlock for a certain amount of time. - */ - -enum { - PROP_0, - PROP_CHOICE, - PROP_TTL -}; - -struct _GcrUnlockOptionsWidget { - GtkBin parent; - - /*< private >*/ - GcrUnlockOptionsWidgetPrivate *pv; -}; - -struct _GcrUnlockOptionsWidgetClass { - GtkBinClass parent_class; -}; - -struct _GcrUnlockOptionsWidgetPrivate { - GtkBuilder *builder; - gchar *choice; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GcrUnlockOptionsWidget, gcr_unlock_options_widget, GTK_TYPE_BIN); - -/* ----------------------------------------------------------------------------- - * INTERNAL - */ - -static GtkToggleButton* -builder_get_toggle_button (GtkBuilder *builder, const gchar *name) -{ - GObject *object = gtk_builder_get_object (builder, name); - g_return_val_if_fail (GTK_IS_TOGGLE_BUTTON (object), NULL); - return GTK_TOGGLE_BUTTON (object); -} - -static GtkSpinButton* -builder_get_spin_button (GtkBuilder *builder, const gchar *name) -{ - GObject *object = gtk_builder_get_object (builder, name); - g_return_val_if_fail (GTK_IS_SPIN_BUTTON (object), NULL); - return GTK_SPIN_BUTTON (object); -} - -static const gchar* -widget_name_for_option (const gchar *option) -{ - g_return_val_if_fail (option, NULL); - if (g_str_equal (option, GCR_UNLOCK_OPTION_ALWAYS)) - return "lock_always_choice"; - else if (g_str_equal (option, GCR_UNLOCK_OPTION_SESSION)) - return "lock_session_choice"; - else if (g_str_equal (option, GCR_UNLOCK_OPTION_TIMEOUT)) - return "lock_timeout_choice"; - else if (g_str_equal (option, GCR_UNLOCK_OPTION_IDLE)) - return "lock_idle_choice"; - else - return NULL; -} - -static GtkToggleButton* -widget_button_for_option (GcrUnlockOptionsWidget *self, const gchar *option) -{ - const gchar *name = widget_name_for_option (option); - g_return_val_if_fail (name, NULL); - return builder_get_toggle_button (self->pv->builder, name); -} - -static const gchar* -widget_button_to_option (GcrUnlockOptionsWidget *self, GtkToggleButton *button) -{ - const gchar *option; - g_return_val_if_fail (button, NULL); - option = g_object_get_data (G_OBJECT (button), "unlock-choice"); - g_return_val_if_fail (option, NULL); - return option; -} - -static void -on_choice_toggled (GtkToggleButton *button, GcrUnlockOptionsWidget *self) -{ - GtkWidget *spin; - GtkToggleButton *after, *idle; - - spin = GTK_WIDGET (gtk_builder_get_object (self->pv->builder, "lock_minutes_spin")); - after = builder_get_toggle_button (self->pv->builder, "lock_timeout_choice"); - idle = builder_get_toggle_button (self->pv->builder, "lock_idle_choice"); - gtk_widget_set_sensitive (spin, gtk_toggle_button_get_active (after) || - gtk_toggle_button_get_active (idle)); - - if (gtk_toggle_button_get_active (button)) { - g_free (self->pv->choice); - self->pv->choice = g_strdup (widget_button_to_option (self, button)); - } -} - -/* ----------------------------------------------------------------------------- - * OBJECT - */ - - -static GObject* -gcr_unlock_options_widget_constructor (GType type, guint n_props, GObjectConstructParam *props) -{ - GObject *obj = G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->constructor (type, n_props, props); - GcrUnlockOptionsWidget *self = NULL; - GtkToggleButton *button; - GtkWidget *widget; - - if (obj) { - self = GCR_UNLOCK_OPTIONS_WIDGET (obj); - - if (!gtk_builder_add_from_resource (self->pv->builder, "/org/gnome/gcr/ui/gcr-unlock-options-widget.ui", NULL)) - g_return_val_if_reached (obj); - - widget = GTK_WIDGET (gtk_builder_get_object (self->pv->builder, "unlock-options-widget")); - g_return_val_if_fail (GTK_IS_WIDGET (widget), obj); - gtk_container_add (GTK_CONTAINER (self), widget); - gtk_widget_show (widget); - - button = builder_get_toggle_button (self->pv->builder, "lock_always_choice"); - g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self); - g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_ALWAYS); - - button = builder_get_toggle_button (self->pv->builder, "lock_session_choice"); - g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self); - g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_SESSION); - on_choice_toggled (button, self); - - button = builder_get_toggle_button (self->pv->builder, "lock_timeout_choice"); - g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self); - g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_TIMEOUT); - - button = builder_get_toggle_button (self->pv->builder, "lock_idle_choice"); - g_signal_connect (button, "toggled", G_CALLBACK (on_choice_toggled), self); - g_object_set_data (G_OBJECT (button), "unlock-choice", GCR_UNLOCK_OPTION_IDLE); - } - - return obj; -} - -static void -gcr_unlock_options_widget_init (GcrUnlockOptionsWidget *self) -{ - self->pv = gcr_unlock_options_widget_get_instance_private (self); - self->pv->builder = gtk_builder_new (); -} - -static void -gcr_unlock_options_widget_dispose (GObject *obj) -{ - GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj); - - if (self->pv->builder) - g_object_unref (self->pv->builder); - self->pv->builder = NULL; - - G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->dispose (obj); -} - -static void -gcr_unlock_options_widget_finalize (GObject *obj) -{ - GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj); - - g_assert (!self->pv->builder); - g_free (self->pv->choice); - self->pv->choice = NULL; - - G_OBJECT_CLASS (gcr_unlock_options_widget_parent_class)->finalize (obj); -} - -static void -gcr_unlock_options_widget_set_property (GObject *obj, guint prop_id, const GValue *value, - GParamSpec *pspec) -{ - GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj); - - switch (prop_id) { - case PROP_CHOICE: - gcr_unlock_options_widget_set_choice (self, g_value_get_string (value)); - break; - case PROP_TTL: - gcr_unlock_options_widget_set_ttl (self, g_value_get_uint (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_unlock_options_widget_get_property (GObject *obj, guint prop_id, GValue *value, - GParamSpec *pspec) -{ - GcrUnlockOptionsWidget *self = GCR_UNLOCK_OPTIONS_WIDGET (obj); - - switch (prop_id) { - case PROP_CHOICE: - g_value_set_string (value, gcr_unlock_options_widget_get_choice (self)); - break; - case PROP_TTL: - g_value_set_uint (value, gcr_unlock_options_widget_get_ttl (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_unlock_options_widget_class_init (GcrUnlockOptionsWidgetClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gcr_unlock_options_widget_parent_class = g_type_class_peek_parent (klass); - - gobject_class->constructor = gcr_unlock_options_widget_constructor; - gobject_class->dispose = gcr_unlock_options_widget_dispose; - gobject_class->finalize = gcr_unlock_options_widget_finalize; - gobject_class->set_property = gcr_unlock_options_widget_set_property; - gobject_class->get_property = gcr_unlock_options_widget_get_property; - - g_object_class_install_property (gobject_class, PROP_CHOICE, - g_param_spec_string ("choice", "Choice", "Unlock Option Choice", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_TTL, - g_param_spec_uint ("ttl", "TTL", "Unlock Option Timeout in Seconds", - 0, G_MAXUINT, 0, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_unlock_options_widget_new: - * - * Create a new #GcrUnlockOptionsWidget. - * - * Returns: (transfer full) (type GcrUi.UnlockOptionsWidget): a new #GcrUnlockOptionsWidget - */ -GtkWidget * -gcr_unlock_options_widget_new (void) -{ - return g_object_new (GCR_TYPE_UNLOCK_OPTIONS_WIDGET, NULL); -} - -/** - * gcr_unlock_options_widget_get_choice: - * @self: The unlock options widget - * - * Get the currently selected option, like %GCR_UNLOCK_OPTION_ALWAYS. - * - * Returns: The currently selected option name. - */ -const gchar* -gcr_unlock_options_widget_get_choice (GcrUnlockOptionsWidget *self) -{ - g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), NULL); - return self->pv->choice; -} - -/** - * gcr_unlock_options_widget_set_choice: - * @self: The unlock options widget - * @option: The option name - * - * Set the currently selected option. Use an option name like - * %GCR_UNLOCK_OPTION_ALWAYS. - */ -void -gcr_unlock_options_widget_set_choice (GcrUnlockOptionsWidget *self, const gchar *option) -{ - GtkToggleButton *button; - - g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self)); - g_return_if_fail (option); - - button = widget_button_for_option (self, option); - gtk_toggle_button_set_active (button, TRUE); -} - -/** - * gcr_unlock_options_widget_get_ttl: - * @self: The unlock options widget - * - * Get the timeout setting set for unlock options that have a timeout. - * This will also return a valid value if the currently selected option - * does not have a timeout. - * - * Returns: The unlock timeout in seconds. - */ -guint -gcr_unlock_options_widget_get_ttl (GcrUnlockOptionsWidget *self) -{ - GtkSpinButton *spin; - gint amount; - - g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), 0); - - spin = builder_get_spin_button (self->pv->builder, "lock_minutes_spin"); - amount = gtk_spin_button_get_value_as_int (spin); - return amount * 60; -} - -/** - * gcr_unlock_options_widget_set_ttl: - * @self: The unlock options widget - * @ttl: The timeout to set, in seconds - * - * Set the current setting for the timeout. This can be set even when the - * currently selected option does not have a timeout. - */ -void -gcr_unlock_options_widget_set_ttl (GcrUnlockOptionsWidget *self, guint ttl) -{ - GtkSpinButton *spin; - guint amount; - - g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self)); - - amount = ttl / 60; - if (!amount || ttl % 60) - amount += 1; - - spin = builder_get_spin_button (self->pv->builder, "lock_minutes_spin"); - gtk_spin_button_set_value (spin, amount); -} - -/** - * gcr_unlock_options_widget_get_label: - * @self: The unlock options widget - * @option: The option name - * - * Get the label for one of the options. Use an option name like - * %GCR_UNLOCK_OPTION_ALWAYS. - * - * Returns: The current label for the option. - */ -const gchar* -gcr_unlock_options_widget_get_label (GcrUnlockOptionsWidget *self, const gchar *option) -{ - GtkToggleButton *button; - const gchar *name; - - g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), NULL); - g_return_val_if_fail (option, NULL); - - name = widget_name_for_option (option); - g_return_val_if_fail (name, NULL); - - button = builder_get_toggle_button (self->pv->builder, name); - g_return_val_if_fail (button, NULL); - - return gtk_button_get_label (GTK_BUTTON (button)); -} - -/** - * gcr_unlock_options_widget_set_label: - * @self: The unlock options widget - * @option: The option name - * @text: The new label - * - * Set the label for one of the options. Use an option name like - * %GCR_UNLOCK_OPTION_ALWAYS. - */ -void -gcr_unlock_options_widget_set_label (GcrUnlockOptionsWidget *self, const gchar *option, - const gchar *text) -{ - GtkToggleButton *button; - const gchar *name; - - g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self)); - g_return_if_fail (option); - g_return_if_fail (text); - - name = widget_name_for_option (option); - g_return_if_fail (name); - - button = builder_get_toggle_button (self->pv->builder, name); - g_return_if_fail (button); - - gtk_button_set_label (GTK_BUTTON (button), text); -} - -/** - * gcr_unlock_options_widget_get_sensitive: - * @self: The unlock options widget - * @option: The option name - * - * Get the sensitivity state for one of the options. Use an option name like - * %GCR_UNLOCK_OPTION_ALWAYS. - * - * Returns: Whether the option is sensitive or not. - */ -gboolean -gcr_unlock_options_widget_get_sensitive (GcrUnlockOptionsWidget *self, const gchar *option) -{ - GtkToggleButton *button; - GtkStateType state; - - g_return_val_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self), FALSE); - g_return_val_if_fail (option, FALSE); - - button = widget_button_for_option (self, option); - state = gtk_widget_get_state_flags (GTK_WIDGET (button)); - return (state & GTK_STATE_FLAG_INSENSITIVE) != GTK_STATE_FLAG_INSENSITIVE; -} - -/** - * gcr_unlock_options_widget_set_sensitive: - * @self: The unlock options widget - * @option: The option name - * @sensitive: The sensitivity state. - * @reason: A user displayable string which contains the reason for the sensitivity. - * - * Set the sensitivity state for one of the options. Use an option name like - * %GCR_UNLOCK_OPTION_ALWAYS. The reason will be displayed as a tooltip. - */ -void -gcr_unlock_options_widget_set_sensitive (GcrUnlockOptionsWidget *self, const gchar *option, - gboolean sensitive, const gchar *reason) -{ - GtkToggleButton *button; - - g_return_if_fail (GCR_IS_UNLOCK_OPTIONS_WIDGET (self)); - g_return_if_fail (option); - - button = widget_button_for_option (self, option); - gtk_widget_set_sensitive (GTK_WIDGET (button), sensitive); - - if (!sensitive && reason) - gtk_widget_set_tooltip_text (GTK_WIDGET (button), reason); - else if (sensitive) - gtk_widget_set_has_tooltip (GTK_WIDGET (button), FALSE); -} diff --git a/ui/gcr-unlock-options-widget.h b/ui/gcr-unlock-options-widget.h deleted file mode 100644 index bd1f396..0000000 --- a/ui/gcr-unlock-options-widget.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_UNLOCK_OPTIONS_WIDGET_H__ -#define __GCR_UNLOCK_OPTIONS_WIDGET_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-types.h" -#include "gcr/gcr-unlock-options.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_UNLOCK_OPTIONS_WIDGET (gcr_unlock_options_widget_get_type ()) -#define GCR_UNLOCK_OPTIONS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidget)) -#define GCR_UNLOCK_OPTIONS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetClass)) -#define GCR_IS_UNLOCK_OPTIONS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET)) -#define GCR_IS_UNLOCK_OPTIONS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_UNLOCK_OPTIONS_WIDGET)) -#define GCR_UNLOCK_OPTIONS_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_UNLOCK_OPTIONS_WIDGET, GcrUnlockOptionsWidgetClass)) - -typedef struct _GcrUnlockOptionsWidget GcrUnlockOptionsWidget; -typedef struct _GcrUnlockOptionsWidgetClass GcrUnlockOptionsWidgetClass; -typedef struct _GcrUnlockOptionsWidgetPrivate GcrUnlockOptionsWidgetPrivate; - -/* - * TODO: GcrUnlockOptionsWidget and GcrUnlockOptionsWidgetClass are hidden until - * we can figure out what they should be derived from. - */ - -GType gcr_unlock_options_widget_get_type (void); - -GtkWidget* gcr_unlock_options_widget_new (void); - -const gchar* gcr_unlock_options_widget_get_choice (GcrUnlockOptionsWidget *self); - -void gcr_unlock_options_widget_set_choice (GcrUnlockOptionsWidget *self, - const gchar *option); - -guint gcr_unlock_options_widget_get_ttl (GcrUnlockOptionsWidget *self); - -void gcr_unlock_options_widget_set_ttl (GcrUnlockOptionsWidget *self, - guint ttl); - -const gchar* gcr_unlock_options_widget_get_label (GcrUnlockOptionsWidget *self, - const gchar *option); - -void gcr_unlock_options_widget_set_label (GcrUnlockOptionsWidget *self, - const gchar *option, - const gchar *text); - -gboolean gcr_unlock_options_widget_get_sensitive (GcrUnlockOptionsWidget *self, - const gchar *option); - -void gcr_unlock_options_widget_set_sensitive (GcrUnlockOptionsWidget *self, - const gchar *option, - gboolean sensitive, - const gchar *reason); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrUnlockOptionsWidget, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_UNLOCK_OPTIONS_WIDGET_H__ */ diff --git a/ui/gcr-unlock-options-widget.ui b/ui/gcr-unlock-options-widget.ui deleted file mode 100644 index d8e786e..0000000 --- a/ui/gcr-unlock-options-widget.ui +++ /dev/null @@ -1,117 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy project-wide --> - <object class="GtkAdjustment" id="spin_adjustment"> - <property name="lower">1</property> - <property name="upper">999</property> - <property name="step_increment">1</property> - <property name="page_increment">10</property> - </object> - <object class="GtkVBox" id="unlock-options-widget"> - <property name="visible">True</property> - <property name="spacing">6</property> - <child> - <object class="GtkRadioButton" id="lock_always_choice"> - <property name="label" translatable="yes">Automatically unlock this keyring whenever I’m logged in</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - <property name="group">lock_session_choice</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkRadioButton" id="lock_session_choice"> - <property name="label" translatable="yes">Lock this keyring when I log out</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkHBox" id="hbox2"> - <property name="visible">True</property> - <property name="spacing">6</property> - <child> - <object class="GtkVBox" id="vbox5"> - <property name="visible">True</property> - <property name="spacing">6</property> - <child> - <object class="GtkRadioButton" id="lock_timeout_choice"> - <property name="label" translatable="yes">Lock this keyring after</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - <property name="group">lock_session_choice</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkRadioButton" id="lock_idle_choice"> - <property name="label" translatable="yes">Lock this keyring if idle for</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - <property name="group">lock_session_choice</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkSpinButton" id="lock_minutes_spin"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">•</property> - <property name="adjustment">spin_adjustment</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="label2"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes" comments="Translators: The 'minutes' from 'Lock this keyring if idle for x minutes'.">minutes</property> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - </object> -</interface> diff --git a/ui/gcr-unlock-renderer.c b/ui/gcr-unlock-renderer.c deleted file mode 100644 index f32dfef..0000000 --- a/ui/gcr-unlock-renderer.c +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr/gcr-icons.h" -#include "gcr/gcr-parser.h" - -#include "gcr-display-view.h" -#include "gcr-secure-entry-buffer.h" -#include "gcr-unlock-renderer.h" - -#include <gdk/gdk.h> -#include <glib/gi18n-lib.h> - -enum { - PROP_0, - PROP_LABEL, - PROP_ATTRIBUTES -}; - -struct _GcrUnlockRendererPrivate { - GtkEntry *entry; - GtkLabel *warning; - - GBytes *locked_data; - gchar *label; - gboolean unlocked; - GList *renderers; - guint unlock_tries; - - /* block widget destroys during render */ - gint no_destroy; -}; - -enum { - UNLOCK_CLICKED, - LAST_SIGNAL, -}; - -static guint signals[LAST_SIGNAL] = { 0 }; - -static void gcr_renderer_iface_init (GcrRendererIface *iface); - -G_DEFINE_TYPE_WITH_CODE (GcrUnlockRenderer, _gcr_unlock_renderer, GTK_TYPE_BIN, - G_ADD_PRIVATE (GcrUnlockRenderer); - G_IMPLEMENT_INTERFACE (GCR_TYPE_RENDERER, gcr_renderer_iface_init); -); - -static gchar* -calculate_label (GcrUnlockRenderer *self) -{ - if (self->pv->label) - return g_strdup_printf (_("Unlock: %s"), self->pv->label); - - return g_strdup (_("Unlock")); -} - -void -_gcr_unlock_renderer_show_warning (GcrUnlockRenderer *self, - const gchar *message) -{ - gchar *text; - - g_return_if_fail (GCR_UNLOCK_RENDERER (self)); - g_return_if_fail (message != NULL); - - text = g_strdup_printf ("<i>%s</i>", message); - gtk_label_set_markup (self->pv->warning, text); - g_free (text); - - gtk_widget_show (GTK_WIDGET (self->pv->warning)); -} - -static void -on_unlock_button_clicked (GtkButton *button, - gpointer user_data) -{ - GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (user_data); - g_signal_emit (self, signals[UNLOCK_CLICKED], 0); -} - -static void -on_entry_activated (GtkEntry *entry, - gpointer user_data) -{ - GtkButton *button = GTK_BUTTON (user_data); - gtk_button_clicked (button); -} - -static void -_gcr_unlock_renderer_init (GcrUnlockRenderer *self) -{ - GtkWidget *box, *vbox; - GtkWidget *button; - GtkEntryBuffer *buffer; - - self->pv = _gcr_unlock_renderer_get_instance_private (self); - - box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); - - buffer = gcr_secure_entry_buffer_new (); - self->pv->entry = GTK_ENTRY (gtk_entry_new_with_buffer (buffer)); - gtk_entry_set_visibility (self->pv->entry, FALSE); - gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (self->pv->entry), TRUE, FALSE, 0); - gtk_widget_show (GTK_WIDGET (self->pv->entry)); - g_object_unref (buffer); - gtk_entry_set_placeholder_text (self->pv->entry, _("Password")); - - button = gtk_button_new_with_label (_("Unlock")); - gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0); - g_signal_connect (button, "clicked", G_CALLBACK (on_unlock_button_clicked), self); - g_signal_connect (self->pv->entry, "activate", G_CALLBACK (on_entry_activated), button); - gtk_widget_show (button); - - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); - gtk_box_pack_start (GTK_BOX (vbox), box, FALSE, FALSE, 0); - gtk_widget_show (box); - - self->pv->warning = GTK_LABEL (gtk_label_new ("")); - gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (self->pv->warning), FALSE, FALSE, 0); - gtk_widget_hide (GTK_WIDGET (self->pv->warning)); - - gtk_container_add (GTK_CONTAINER (self), vbox); - gtk_widget_show (vbox); -} - -static void -_gcr_unlock_renderer_finalize (GObject *obj) -{ - GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj); - - g_bytes_unref (self->pv->locked_data); - g_free (self->pv->label); - g_list_free_full (self->pv->renderers, g_object_unref); - - G_OBJECT_CLASS (_gcr_unlock_renderer_parent_class)->finalize (obj); -} - -static void -_gcr_unlock_renderer_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj); - - switch (prop_id) { - case PROP_LABEL: - g_free (self->pv->label); - self->pv->label = g_value_dup_string (value); - g_object_notify (obj, "label"); - gcr_renderer_emit_data_changed (GCR_RENDERER (self)); - break; - case PROP_ATTRIBUTES: - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_unlock_renderer_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (obj); - - switch (prop_id) { - case PROP_LABEL: - g_value_take_string (value, calculate_label (self)); - break; - case PROP_ATTRIBUTES: - g_value_set_boxed (value, NULL); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -_gcr_unlock_renderer_class_init (GcrUnlockRendererClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->finalize = _gcr_unlock_renderer_finalize; - gobject_class->set_property = _gcr_unlock_renderer_set_property; - gobject_class->get_property = _gcr_unlock_renderer_get_property; - - g_object_class_install_property (gobject_class, PROP_LABEL, - g_param_spec_string ("label", "Label", "Unlock Label", - "", - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - g_object_class_install_property (gobject_class, PROP_ATTRIBUTES, - g_param_spec_boxed ("attributes", "Attributes", "Certificate pkcs11 attributes", - GCK_TYPE_ATTRIBUTES, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - signals[UNLOCK_CLICKED] = g_signal_new ("unlock-clicked", GCR_TYPE_UNLOCK_RENDERER, G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (GcrUnlockRendererClass, unlock_clicked), - NULL, NULL, NULL, G_TYPE_NONE, 0); -} - -static void -gcr_unlock_renderer_render (GcrRenderer *renderer, - GcrViewer *viewer) -{ - GcrUnlockRenderer *self = GCR_UNLOCK_RENDERER (renderer); - GcrDisplayView *view; - gchar *display; - GList *renderers; - GIcon *icon; - GList *l; - - if (GCR_IS_DISPLAY_VIEW (viewer)) { - view = GCR_DISPLAY_VIEW (viewer); - - } else { - g_warning ("GcrUnlockRenderer only works with internal specific " - "GcrViewer returned by gcr_viewer_new()."); - return; - } - - /* - * If we were successfully unlocked, then this will contain a list of - * renderers to add to the viewer. - */ - if (self->pv->unlocked) { - - /* We used prepend above, so list is backwards */ - renderers = g_list_reverse (self->pv->renderers); - self->pv->renderers = NULL; - - for (l = renderers; l != NULL; l = g_list_next (l)) - gcr_viewer_insert_renderer (viewer, l->data, renderer); - g_list_free_full (renderers, g_object_unref); - - /* And finally remove ourselves from the viewer */ - gcr_viewer_remove_renderer (viewer, GCR_RENDERER (self)); - /* - * Not yet unlocked, display the unlock dialog. - */ - } else { - - _gcr_display_view_begin (view, renderer); - - icon = g_themed_icon_new ("emblem-readonly"); - _gcr_display_view_set_icon (view, renderer, icon); - g_object_unref (icon); - - display = calculate_label (self); - _gcr_display_view_append_title (view, renderer, display); - g_free (display); - - if (self->pv->label) - display = g_strdup_printf (_("The contents of “%s” are locked. In order to view the contents, enter the correct password."), - self->pv->label); - else - display = g_strdup (_("The contents are locked. In order to view the contents, enter the correct password.")); - _gcr_display_view_append_content (view, renderer, display, NULL); - g_free (display); - - _gcr_display_view_add_widget_area (view, renderer, GTK_WIDGET (self)); - gtk_widget_show (GTK_WIDGET (self)); - - _gcr_display_view_end (view, renderer); - } -} - -static void -gcr_renderer_iface_init (GcrRendererIface *iface) -{ - iface->render_view = gcr_unlock_renderer_render; -} - -GcrUnlockRenderer* -_gcr_unlock_renderer_new (const gchar *label, - GBytes *locked_data) -{ - GcrUnlockRenderer *renderer; - - renderer = g_object_new (GCR_TYPE_UNLOCK_RENDERER, - "label", label, - NULL); - g_object_ref_sink (renderer); - - renderer->pv->locked_data = g_bytes_ref (locked_data); - return renderer; -} - -GcrUnlockRenderer * -_gcr_unlock_renderer_new_for_parsed (GcrParser *parser) -{ - g_return_val_if_fail (GCR_IS_PARSER (parser), NULL); - return _gcr_unlock_renderer_new (gcr_parser_get_parsed_label (parser), - gcr_parser_get_parsed_bytes (parser)); -} - -const gchar * -_gcr_unlock_renderer_get_password (GcrUnlockRenderer *self) -{ - g_return_val_if_fail (GCR_IS_UNLOCK_RENDERER (self), NULL); - return gtk_entry_get_text (self->pv->entry); -} - -void -_gcr_unlock_renderer_set_password (GcrUnlockRenderer *self, - const gchar *text) -{ - g_return_if_fail (GCR_IS_UNLOCK_RENDERER (self)); - g_return_if_fail (text != NULL); - gtk_entry_set_text (self->pv->entry, text); -} - -void -_gcr_unlock_renderer_focus_password (GcrUnlockRenderer *self) -{ - g_return_if_fail (GCR_IS_UNLOCK_RENDERER (self)); - gtk_widget_grab_focus (GTK_WIDGET (self->pv->entry)); -} - -GBytes * -_gcr_unlock_renderer_get_locked_data (GcrUnlockRenderer *self) -{ - g_return_val_if_fail (GCR_IS_UNLOCK_RENDERER (self), NULL); - return self->pv->locked_data; -} diff --git a/ui/gcr-unlock-renderer.h b/ui/gcr-unlock-renderer.h deleted file mode 100644 index 32de573..0000000 --- a/ui/gcr-unlock-renderer.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2011 Collabora Ltd. - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Stef Walter <stefw@collabora.co.uk> - */ - -#if !defined (__GCR_INSIDE_HEADER__) && !defined (GCR_COMPILATION) -#error "Only <gcr/gcr.h> or <gcr/gcr-base.h> can be included directly." -#endif - -#ifndef __GCR_UNLOCK_RENDERER_H__ -#define __GCR_UNLOCK_RENDERER_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-types.h" - -#include "gcr-renderer.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_UNLOCK_RENDERER (_gcr_unlock_renderer_get_type ()) -#define GCR_UNLOCK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRenderer)) -#define GCR_UNLOCK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRendererClass)) -#define GCR_IS_UNLOCK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_UNLOCK_RENDERER)) -#define GCR_IS_UNLOCK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_UNLOCK_RENDERER)) -#define GCR_UNLOCK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_UNLOCK_RENDERER, GcrUnlockRendererClass)) - -typedef struct _GcrUnlockRenderer GcrUnlockRenderer; -typedef struct _GcrUnlockRendererClass GcrUnlockRendererClass; -typedef struct _GcrUnlockRendererPrivate GcrUnlockRendererPrivate; - -struct _GcrUnlockRenderer { - /*< private >*/ - GtkBin parent; - GcrUnlockRendererPrivate *pv; -}; - -struct _GcrUnlockRendererClass { - GtkBinClass parent_class; - - /* signals */ - void (*unlock_clicked) (GcrUnlockRenderer *unlock); -}; - -GType _gcr_unlock_renderer_get_type (void); - -GcrUnlockRenderer * _gcr_unlock_renderer_new (const gchar *label, - GBytes *locked_data); - -GcrUnlockRenderer * _gcr_unlock_renderer_new_for_parsed (GcrParser *parser); - -const gchar * _gcr_unlock_renderer_get_password (GcrUnlockRenderer *self); - -void _gcr_unlock_renderer_set_password (GcrUnlockRenderer *self, - const gchar *text); - -void _gcr_unlock_renderer_focus_password (GcrUnlockRenderer *self); - -void _gcr_unlock_renderer_show_warning (GcrUnlockRenderer *self, - const gchar *message); - -GBytes * _gcr_unlock_renderer_get_locked_data (GcrUnlockRenderer *self); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrUnlockRenderer, g_object_unref) - -G_END_DECLS - -#endif /* __GCR_UNLOCK_RENDERER_H__ */ diff --git a/ui/gcr-viewer-tool.c b/ui/gcr-viewer-tool.c deleted file mode 100644 index 0117d70..0000000 --- a/ui/gcr-viewer-tool.c +++ /dev/null @@ -1,126 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* gcr-viewer-tool.c: Command line utility - - Copyright (C) 2011 Collabora Ltd. - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#include "config.h" - -#include "gcr-viewer-window.h" - -#include <glib/gi18n.h> -#include <gtk/gtk.h> - -#include <locale.h> -#include <stdlib.h> -#include <string.h> - -static gchar **remaining_args = NULL; - -static gboolean -print_version_and_exit (const gchar *option_name, const gchar *value, - gpointer data, GError **error) -{ - g_print("%s -- %s\n", _("GCR Certificate and Key Viewer"), VERSION); - exit (0); - return TRUE; -} - -static const GOptionEntry options[] = { - { "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, - print_version_and_exit, N_("Show the application's version"), NULL}, - { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, - &remaining_args, NULL, N_("[file...]") }, - { NULL } -}; - -static gboolean -on_idle_load_files (gpointer user_data) -{ - GcrViewerWindow *window = GCR_VIEWER_WINDOW (user_data); - GFile *file; - gint i; - - if (remaining_args) { - for (i = 0; remaining_args[i] != NULL; ++i) { - file = g_file_new_for_commandline_arg (remaining_args[i]); - gcr_viewer_window_load (window, file); - g_object_unref (file); - } - - g_strfreev (remaining_args); - remaining_args = NULL; - } - - return FALSE; /* Don't run this again */ -} - -static void -on_window_destroy (GtkWidget *widget, - gpointer unused) -{ - gtk_widget_hide (widget); - gtk_main_quit (); -} - -int -main (int argc, char *argv[]) -{ - GOptionContext *context; - GError *error = NULL; - GtkWindow *window; - -#ifdef HAVE_LOCALE_H - /* internationalisation */ - setlocale (LC_ALL, ""); -#endif - -#ifdef HAVE_GETTEXT - bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); - textdomain (GETTEXT_PACKAGE); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); -#endif - - context = g_option_context_new (N_("- View certificate and key files")); - g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); - g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE); - - g_option_context_add_group (context, gtk_get_option_group (TRUE)); - - if (! g_option_context_parse (context, &argc, &argv, &error)) { - g_critical ("Failed to parse arguments: %s", error->message); - g_error_free (error); - g_option_context_free (context); - return 1; - } - - g_option_context_free (context); - g_set_application_name (_("Certificate Viewer")); - - gtk_init (&argc, &argv); - - window = gcr_viewer_window_new (); - gtk_widget_show (GTK_WIDGET (window)); - - g_idle_add (on_idle_load_files, window); - g_signal_connect (window, "destroy", G_CALLBACK (on_window_destroy), NULL); - gtk_main (); - - return 0; -} diff --git a/ui/gcr-viewer-widget.c b/ui/gcr-viewer-widget.c deleted file mode 100644 index 4a03d5c..0000000 --- a/ui/gcr-viewer-widget.c +++ /dev/null @@ -1,680 +0,0 @@ -/* gcr-viewer-widget: Widget for viewer - - Copyright (C) 2011 Collabora Ltd. - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#include "config.h" - -#include "gcr/gcr-importer.h" -#include "gcr/gcr-marshal.h" -#include "gcr/gcr-parser.h" - -#include "gcr-display-scrolled.h" -#include "gcr-failure-renderer.h" -#include "gcr-renderer.h" -#include "gcr-unlock-renderer.h" -#include "gcr-viewer-widget.h" -#include "gcr-viewer.h" - -#include <glib/gi18n-lib.h> -#include <gtk/gtk.h> - -#include <locale.h> -#include <string.h> - -/** - * GcrViewerWidget: - * - * A viewer widget which can display certificates and keys that are - * located in files. - */ - -enum { - PROP_0, - PROP_PARSER, - PROP_DISPLAY_NAME -}; - -/* - * Not yet figured out how to expose these without locking down our - * implementation, the parent class we derive from. - */ - -typedef struct _GcrViewerWidgetPrivate GcrViewerWidgetPrivate; - -struct _GcrViewerWidget { - /*< private >*/ - GtkBox parent; - GcrViewerWidgetPrivate *pv; -}; - -struct _GcrViewerWidgetPrivate { - GcrViewer *viewer; - GtkInfoBar *message_bar; - GtkLabel *message_label; - GQueue *files_to_load; - GcrParser *parser; - GCancellable *cancellable; - GList *unlocks; - gboolean loading; - gchar *display_name; - gboolean display_name_explicit; -}; - -enum { - ADDED, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL] = { 0, }; - -static void viewer_load_next_file (GcrViewerWidget *self); -static void viewer_stop_loading_files (GcrViewerWidget *self); - -G_DEFINE_TYPE_WITH_PRIVATE (GcrViewerWidget, gcr_viewer_widget, GTK_TYPE_BOX); - -static const gchar * -get_parsed_label_or_display_name (GcrViewerWidget *self, - GcrParser *parser) -{ - const gchar *label; - - label = gcr_parser_get_parsed_label (parser); - if (label == NULL) - label = self->pv->display_name; - - return label; -} - -static void -on_parser_parsed (GcrParser *parser, - gpointer user_data) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); - GckAttributes *attrs; - GcrRenderer *renderer; - const gchar *label; - gboolean actual = TRUE; - - label = get_parsed_label_or_display_name (self, parser); - attrs = gcr_parser_get_parsed_attributes (parser); - - renderer = gcr_renderer_create (label, attrs); - - if (renderer == NULL) { - renderer = gcr_failure_renderer_new_unsupported (label); - actual = FALSE; - } - - /* And show the data */ - gcr_viewer_add_renderer (self->pv->viewer, renderer); - - /* Let callers know we're rendering data */ - if (actual == TRUE) - g_signal_emit (self, signals[ADDED], 0, renderer, - gcr_parser_get_parsed (parser)); - - g_object_unref (renderer); -} - -static gboolean -on_parser_authenticate_for_unlock (GcrParser *parser, - guint count, - gpointer user_data) -{ - GcrUnlockRenderer *unlock = GCR_UNLOCK_RENDERER (user_data); - const gchar *password; - - if (count == 0) { - password = _gcr_unlock_renderer_get_password (unlock); - gcr_parser_add_password (parser, password); - } - - return TRUE; -} - -static void -on_unlock_renderer_clicked (GcrUnlockRenderer *unlock, - gpointer user_data) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); - GError *error = NULL; - GBytes *data; - gulong sig; - - /* Override our main authenticate signal handler */ - sig = g_signal_connect (self->pv->parser, "authenticate", - G_CALLBACK (on_parser_authenticate_for_unlock), unlock); - - data = _gcr_unlock_renderer_get_locked_data (unlock); - if (gcr_parser_parse_bytes (self->pv->parser, data, &error)) { - - /* Done with this unlock renderer */ - gcr_viewer_remove_renderer (self->pv->viewer, GCR_RENDERER (unlock)); - self->pv->unlocks = g_list_remove (self->pv->unlocks, unlock); - g_object_unref (unlock); - - } else if (g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_LOCKED)){ - _gcr_unlock_renderer_show_warning (unlock, _("The password was incorrect")); - _gcr_unlock_renderer_focus_password (unlock); - _gcr_unlock_renderer_set_password (unlock, ""); - g_error_free (error); - - } else { - _gcr_unlock_renderer_show_warning (unlock, error->message); - g_error_free (error); - } - - g_signal_handler_disconnect (self->pv->parser, sig); -} - -static gboolean -on_parser_authenticate_for_data (GcrParser *parser, - guint count, - gpointer user_data) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); - GcrUnlockRenderer *unlock; - - unlock = _gcr_unlock_renderer_new_for_parsed (parser); - if (unlock != NULL) { - g_object_set (unlock, "label", get_parsed_label_or_display_name (self, parser), NULL); - gcr_viewer_add_renderer (self->pv->viewer, GCR_RENDERER (unlock)); - g_signal_connect (unlock, "unlock-clicked", G_CALLBACK (on_unlock_renderer_clicked), self); - self->pv->unlocks = g_list_prepend (self->pv->unlocks, unlock); - } - - return TRUE; -} - -static void -gcr_viewer_widget_init (GcrViewerWidget *self) -{ - GtkWidget *area; - - self->pv = gcr_viewer_widget_get_instance_private (self); - - gtk_orientable_set_orientation (GTK_ORIENTABLE (self), - GTK_ORIENTATION_VERTICAL); - - self->pv->viewer = gcr_viewer_new_scrolled (); - gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->pv->viewer), TRUE, TRUE, 0); - gtk_widget_show (GTK_WIDGET (self->pv->viewer)); - - self->pv->message_label = GTK_LABEL (gtk_label_new ("")); - gtk_label_set_use_markup (self->pv->message_label, TRUE); - gtk_label_set_ellipsize (self->pv->message_label, PANGO_ELLIPSIZE_END); - gtk_widget_show (GTK_WIDGET (self->pv->message_label)); - - self->pv->message_bar = GTK_INFO_BAR (gtk_info_bar_new ()); - gtk_box_pack_start (GTK_BOX (self), GTK_WIDGET (self->pv->message_bar), FALSE, TRUE, 0); - area = gtk_info_bar_get_content_area (self->pv->message_bar); - gtk_container_add (GTK_CONTAINER (area), GTK_WIDGET (self->pv->message_label)); - - self->pv->files_to_load = g_queue_new (); - self->pv->parser = gcr_parser_new (); - self->pv->cancellable = g_cancellable_new (); - self->pv->unlocks = NULL; - - g_signal_connect (self->pv->parser, "parsed", G_CALLBACK (on_parser_parsed), self); - g_signal_connect_after (self->pv->parser, "authenticate", G_CALLBACK (on_parser_authenticate_for_data), self); -} - -static void -gcr_viewer_widget_get_property (GObject *obj, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj); - - switch (prop_id) { - case PROP_PARSER: - g_value_set_object (value, gcr_viewer_widget_get_parser (self)); - break; - case PROP_DISPLAY_NAME: - g_value_set_string (value, gcr_viewer_widget_get_display_name (self)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_viewer_widget_set_property (GObject *obj, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj); - - switch (prop_id) { - case PROP_DISPLAY_NAME: - gcr_viewer_widget_set_display_name (self, g_value_get_string (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec); - break; - } -} - -static void -gcr_viewer_widget_dispose (GObject *obj) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj); - GList *l; - - g_signal_handlers_disconnect_by_func (self->pv->parser, on_parser_parsed, self); - - for (l = self->pv->unlocks; l != NULL; l = g_list_next (l)) { - g_signal_handlers_disconnect_by_func (l->data, on_unlock_renderer_clicked, self); - g_object_unref (l->data); - } - g_list_free (self->pv->unlocks); - self->pv->unlocks = NULL; - - while (!g_queue_is_empty (self->pv->files_to_load)) - g_object_unref (g_queue_pop_head (self->pv->files_to_load)); - - g_cancellable_cancel (self->pv->cancellable); - - G_OBJECT_CLASS (gcr_viewer_widget_parent_class)->dispose (obj); -} - -static void -gcr_viewer_widget_finalize (GObject *obj) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (obj); - - g_assert (g_queue_is_empty (self->pv->files_to_load)); - g_queue_free (self->pv->files_to_load); - - g_free (self->pv->display_name); - g_object_unref (self->pv->cancellable); - g_object_unref (self->pv->parser); - - G_OBJECT_CLASS (gcr_viewer_widget_parent_class)->finalize (obj); -} - -static void -gcr_viewer_widget_class_init (GcrViewerWidgetClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->dispose = gcr_viewer_widget_dispose; - gobject_class->finalize = gcr_viewer_widget_finalize; - gobject_class->get_property = gcr_viewer_widget_get_property; - gobject_class->set_property = gcr_viewer_widget_set_property; - - /** - * GcrViewerWidget:parser: - * - * The parser used to parse loaded data into viewable items. - */ - g_object_class_install_property (gobject_class, PROP_PARSER, - g_param_spec_object ("parser", "Parser", "Parser used to parse viewable items", - GCR_TYPE_PARSER, - G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrViewerWidget:display-name: - * - * Display name for data being displayed. This is automatically - * calculated from a loaded file, or can be explicitly set. - * - * Used as a hint when displaying a title for the data, but may be - * overridden by the parsed data. - */ - g_object_class_install_property (gobject_class, PROP_DISPLAY_NAME, - g_param_spec_string ("display-name", "Display name", "Display name", - NULL, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - - /** - * GcrViewerWidget::added: - * @self: the viewer widget - * @renderer: (type GcrUi.Renderer): the renderer that was added - * @parsed: (type Gcr.Parsed): the parsed item that was added - * - * This signal is emitted when an item is added to the viewer widget. - */ - signals[ADDED] = g_signal_new ("added", GCR_TYPE_VIEWER_WIDGET, G_SIGNAL_RUN_LAST, - 0, NULL, NULL, _gcr_marshal_VOID__OBJECT_BOXED, - G_TYPE_NONE, 2, G_TYPE_OBJECT, GCR_TYPE_PARSED); -} - -static void -on_parser_parse_stream_returned (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); - GError *error = NULL; - GcrRenderer *renderer; - - gcr_parser_parse_stream_finish (self->pv->parser, result, &error); - - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED) || - g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_CANCELLED)) { - viewer_stop_loading_files (self); - - } else if (g_error_matches (error, GCR_DATA_ERROR, GCR_ERROR_LOCKED)) { - /* Just skip this one, an unlock renderer was added */ - - } else if (error) { - renderer = gcr_failure_renderer_new (self->pv->display_name, error); - gcr_viewer_add_renderer (self->pv->viewer, renderer); - g_object_unref (renderer); - g_error_free (error); - } - - viewer_load_next_file (self); -} - -static void -update_display_name (GcrViewerWidget *self, - gchar *display_name) -{ - if (!self->pv->display_name_explicit) { - g_free (self->pv->display_name); - self->pv->display_name = g_strdup (display_name); - g_object_notify (G_OBJECT (self), "display-name"); - } -} - -static void -on_file_read_returned (GObject *source, - GAsyncResult *result, - gpointer user_data) -{ - GcrViewerWidget *self = GCR_VIEWER_WIDGET (user_data); - GFile *file = G_FILE (source); - GError *error = NULL; - GFileInputStream *fis; - GcrRenderer *renderer; - gchar *basename, *display_name; - - fis = g_file_read_finish (file, result, &error); - - basename = g_file_get_basename (file); - display_name = g_filename_display_name (basename); - g_free (basename); - - update_display_name (self, display_name); - - if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { - viewer_stop_loading_files (self); - - } else if (error) { - renderer = gcr_failure_renderer_new (self->pv->display_name, error); - gcr_viewer_add_renderer (self->pv->viewer, renderer); - g_object_unref (renderer); - g_error_free (error); - - viewer_load_next_file (self); - - } else { - gcr_parser_set_filename (self->pv->parser, display_name); - gcr_parser_parse_stream_async (self->pv->parser, - G_INPUT_STREAM (fis), - self->pv->cancellable, - on_parser_parse_stream_returned, - self); - g_object_unref (fis); - } - g_free (display_name); -} - -static void -viewer_stop_loading_files (GcrViewerWidget *self) -{ - self->pv->loading = FALSE; -} - -static void -viewer_load_next_file (GcrViewerWidget *self) -{ - GFile* file; - - file = g_queue_pop_head (self->pv->files_to_load); - if (file == NULL) { - viewer_stop_loading_files (self); - return; - } - - g_file_read_async (file, G_PRIORITY_DEFAULT, self->pv->cancellable, - on_file_read_returned, self); - - g_object_unref (file); -} - -/** - * gcr_viewer_widget_new: - * - * Create a new viewer widget. - * - * Returns: (transfer full): A new #GcrViewerWidget object - */ -GcrViewerWidget * -gcr_viewer_widget_new (void) -{ - return g_object_new (GCR_TYPE_VIEWER_WIDGET, NULL); -} - -/** - * gcr_viewer_widget_load_file: - * @self: a viewer widget - * @file: a file to load - * - * Display contents of a file in the viewer widget. Multiple files can - * be loaded. - */ -void -gcr_viewer_widget_load_file (GcrViewerWidget *self, - GFile *file) -{ - g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); - g_return_if_fail (G_IS_FILE (file)); - - g_queue_push_tail (self->pv->files_to_load, g_object_ref (file)); - - if (!self->pv->loading) - viewer_load_next_file (self); -} - -/** - * gcr_viewer_widget_load_bytes: - * @self: a viewer widget - * @display_name: (nullable): label for the loaded data - * @data: data to load - * - * Parse and load some data to be displayed into the viewer widgets. The data - * may contain multiple parseable items if the format can contain multiple - * items. - */ -void -gcr_viewer_widget_load_bytes (GcrViewerWidget *self, - const gchar *display_name, - GBytes *data) -{ - GError *error = NULL; - GcrRenderer *renderer; - - g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); - g_return_if_fail (data != NULL); - - g_free (self->pv->display_name); - self->pv->display_name = g_strdup (display_name); - - if (!gcr_parser_parse_bytes (self->pv->parser, data, &error)) { - renderer = gcr_failure_renderer_new (display_name, error); - gcr_viewer_add_renderer (self->pv->viewer, renderer); - g_object_unref (renderer); - g_error_free (error); - } -} - -/** - * gcr_viewer_widget_load_data: - * @self: a viewer widget - * @display_name: (nullable): label for the loaded data - * @data: (array length=n_data): data to load - * @n_data: length of data to load - * - * Parse and load some data to be displayed into the viewer widgets. The data - * may contain multiple parseable items if the format can contain multiple - * items. - * - * This function will copy the data. Use [method@ViewerWidget.load_bytes] to avoid - * copying the data. - */ -void -gcr_viewer_widget_load_data (GcrViewerWidget *self, - const gchar *display_name, - const guchar *data, - gsize n_data) -{ - GBytes *bytes; - - g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); - - bytes = g_bytes_new (data, n_data); - gcr_viewer_widget_load_bytes (self, display_name, bytes); - g_bytes_unref (bytes); -} - -/** - * gcr_viewer_widget_get_viewer: - * @self: a viewer widget - * - * Get the viewer used to display the viewable items. - * - * Returns: (transfer none): the viewer - */ -GcrViewer * -gcr_viewer_widget_get_viewer (GcrViewerWidget *self) -{ - g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL); - return self->pv->viewer; -} - -/** - * gcr_viewer_widget_get_parser: - * @self: a viewer widget - * - * Get the parser used to parse loaded data into viewable items. - * - * Returns: (transfer none): the parser - */ -GcrParser * -gcr_viewer_widget_get_parser (GcrViewerWidget *self) -{ - g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL); - return self->pv->parser; -} - -/** - * gcr_viewer_widget_show_error: - * @self: a viewer widget - * @message: descriptive error message - * @error: (nullable): detailed error - * - * Show an error on the viewer widget. This is displayed on a info bar near - * the edge of the widget. - */ -void -gcr_viewer_widget_show_error (GcrViewerWidget *self, - const gchar *message, - GError *error) -{ - gchar *markup; - - g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); - g_return_if_fail (message != NULL); - - if (error) - markup = g_markup_printf_escaped ("<b>%s</b>: %s", message, error->message); - else - markup = g_markup_printf_escaped ("%s", message); - - gtk_info_bar_set_message_type (self->pv->message_bar, GTK_MESSAGE_ERROR); - gtk_label_set_markup (self->pv->message_label, markup); - gtk_widget_show (GTK_WIDGET (self->pv->message_bar)); - g_free (markup); -} - -/** - * gcr_viewer_widget_clear_error: - * @self: a viewer widget - * - * Clear the error displayed on the viewer widget. - */ -void -gcr_viewer_widget_clear_error (GcrViewerWidget *self) -{ - g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); - gtk_widget_hide (GTK_WIDGET (self->pv->message_bar)); -} - -/** - * gcr_viewer_widget_get_display_name: - * @self: a viewer widget - * - * Get the display name for data being displayed. This is automatically - * calculated from a loaded file, or can be explicitly set. - * - * Used as a hint when displaying a title for the data, but may be - * overridden by the parsed data. - * - * Returns: the display name - */ -const gchar * -gcr_viewer_widget_get_display_name (GcrViewerWidget *self) -{ - g_return_val_if_fail (GCR_IS_VIEWER_WIDGET (self), NULL); - - if (!self->pv->display_name_explicit && !self->pv->display_name) - self->pv->display_name = g_strdup (_("Certificate Viewer")); - - return self->pv->display_name; -} - -/** - * gcr_viewer_widget_set_display_name: - * @self: a viewer widget - * @display_name: the display name - * - * Set the display name for data being displayed. Once explicitly - * set it will no longer be calculated automatically by loading data. - * - * Used as a hint when displaying a title for the data, but may be - * overridden by the parsed data. - */ -void -gcr_viewer_widget_set_display_name (GcrViewerWidget *self, - const gchar *display_name) -{ - g_return_if_fail (GCR_IS_VIEWER_WIDGET (self)); - - g_free (self->pv->display_name); - self->pv->display_name = g_strdup (display_name); - self->pv->display_name_explicit = TRUE; - g_object_notify (G_OBJECT (self), "display-name"); -} diff --git a/ui/gcr-viewer-widget.h b/ui/gcr-viewer-widget.h deleted file mode 100644 index 93515c5..0000000 --- a/ui/gcr-viewer-widget.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* gcr-viewer-widget.h: Widget for viewer - - Copyright (C) 2011 Collabora Ltd. - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#ifndef GCR_VIEWER_WIDGET_H -#define GCR_VIEWER_WIDGET_H - -#include <gtk/gtk.h> - -#define GCR_TYPE_VIEWER_WIDGET (gcr_viewer_widget_get_type ()) -G_DECLARE_FINAL_TYPE (GcrViewerWidget, gcr_viewer_widget, - GCR, VIEWER_WIDGET, - GtkBox) - -GcrViewerWidget * gcr_viewer_widget_new (void); - -void gcr_viewer_widget_load_file (GcrViewerWidget *self, - GFile *file); - -void gcr_viewer_widget_load_bytes (GcrViewerWidget *self, - const gchar *display_name, - GBytes *data); - -void gcr_viewer_widget_load_data (GcrViewerWidget *self, - const gchar *display_name, - const guchar *data, - gsize n_data); - -GcrViewer * gcr_viewer_widget_get_viewer (GcrViewerWidget *self); - -GcrParser * gcr_viewer_widget_get_parser (GcrViewerWidget *self); - -void gcr_viewer_widget_show_error (GcrViewerWidget *self, - const gchar *message, - GError *error); - -void gcr_viewer_widget_clear_error (GcrViewerWidget *self); - -const gchar * gcr_viewer_widget_get_display_name (GcrViewerWidget *self); - -void gcr_viewer_widget_set_display_name (GcrViewerWidget *self, - const gchar *display_name); - -#endif /* GCR_VIEWER_WIDGET_H */ diff --git a/ui/gcr-viewer-window.c b/ui/gcr-viewer-window.c deleted file mode 100644 index a25e10e..0000000 --- a/ui/gcr-viewer-window.c +++ /dev/null @@ -1,201 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* gcr-viewer-window.c: Window for viewer - - Copyright (C) 2011 Collabora Ltd. - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#include "config.h" - -#include "gcr-viewer-window.h" - -#include <glib/gi18n-lib.h> -#include <gtk/gtk.h> - -#include <locale.h> -#include <string.h> - -struct _GcrViewerWindowPrivate { - GcrViewerWidget *viewer; - GcrImportButton *import; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (GcrViewerWindow, gcr_viewer_window, GTK_TYPE_WINDOW); - -static void -on_viewer_renderer_added (GcrViewerWidget *viewer, - GcrRenderer *renderer, - GcrParsed *parsed, - gpointer user_data) -{ - GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data); - gcr_import_button_add_parsed (self->pv->import, parsed); -} - -static void -gcr_viewer_window_init (GcrViewerWindow *self) -{ - self->pv = gcr_viewer_window_get_instance_private (self); -} - -static void -on_import_button_importing (GcrImportButton *button, - GcrImporter *importer, - gpointer user_data) -{ - GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data); - gcr_viewer_widget_clear_error (self->pv->viewer); -} - -static void -on_import_button_imported (GcrImportButton *button, - GcrImporter *importer, - GError *error, - gpointer user_data) -{ - GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data); - - if (error == NULL) { - g_object_set (button, "label", _("Imported"), NULL); - - } else { - if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - gcr_viewer_widget_show_error (self->pv->viewer, _("Import failed"), error); - } -} - -static void -on_close_clicked (GtkButton *button, - gpointer user_data) -{ - GcrViewerWindow *self = GCR_VIEWER_WINDOW (user_data); - gtk_widget_destroy (GTK_WIDGET (self)); -} - -static void -gcr_viewer_window_constructed (GObject *obj) -{ - GcrViewerWindow *self = GCR_VIEWER_WINDOW (obj); - GtkWidget *bbox; - GtkWidget *box; - GtkWidget *button; - - G_OBJECT_CLASS (gcr_viewer_window_parent_class)->constructed (obj); - - bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL); - gtk_box_set_spacing (GTK_BOX (bbox), 12); - gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END); - gtk_widget_show (bbox); - - self->pv->import = gcr_import_button_new (_("Import")); - g_signal_connect_object (self->pv->import, "importing", - G_CALLBACK (on_import_button_importing), - self, 0); - g_signal_connect_object (self->pv->import, "imported", - G_CALLBACK (on_import_button_imported), - self, 0); - gtk_widget_show (GTK_WIDGET (self->pv->import)); - - button = gtk_button_new_with_mnemonic (_("_Close")); - g_signal_connect_object (button, "clicked", - G_CALLBACK (on_close_clicked), - self, 0); - gtk_widget_show (button); - - gtk_box_pack_start (GTK_BOX (bbox), button, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (bbox), GTK_WIDGET (self->pv->import), FALSE, TRUE, 0); - - gtk_widget_set_halign (bbox, 0.5); - gtk_widget_set_valign (bbox, 0.5); -#if GTK_CHECK_VERSION (3, 12, 0) - gtk_widget_set_margin_end (bbox, 12); -#else - gtk_widget_set_margin_right (bbox, 12); -#endif - - self->pv->viewer = gcr_viewer_widget_new (); - g_object_bind_property (self->pv->viewer, "display-name", - self, "title", G_BINDING_SYNC_CREATE); - g_signal_connect_object (self->pv->viewer, "added", - G_CALLBACK (on_viewer_renderer_added), - self, 0); - gtk_widget_show (GTK_WIDGET (self->pv->viewer)); - - box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_show (box); - - gtk_box_pack_start (GTK_BOX (box), GTK_WIDGET (self->pv->viewer), TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (box), bbox, FALSE, FALSE, 6); - - gtk_container_add (GTK_CONTAINER (self), box); - - gtk_window_set_default_size (GTK_WINDOW (self), 250, 400); -} - -static void -gcr_viewer_window_class_init (GcrViewerWindowClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->constructed = gcr_viewer_window_constructed; -} - -/** - * gcr_viewer_window_new: - * - * Create a new viewer window. - * - * Returns: (transfer full) (type GcrUi.ViewerWindow): a new viewer window - */ -GtkWindow * -gcr_viewer_window_new (void) -{ - return g_object_new (GCR_TYPE_VIEWER_WINDOW, NULL); -} - -/** - * gcr_viewer_window_load: - * @self: a viewer window - * @file: file to load - * - * Load a file into a viewer window. It may not appear immediately. - */ -void -gcr_viewer_window_load (GcrViewerWindow *self, - GFile *file) -{ - g_return_if_fail (GCR_IS_VIEWER_WINDOW (self)); - g_return_if_fail (G_IS_FILE (file)); - - return gcr_viewer_widget_load_file (self->pv->viewer, file); -} - -/** - * gcr_viewer_window_get_viewer: - * @self: a viewer window - * - * Get the actual viewer showing information in the window. - * - * Returns: the viewer - */ -GcrViewer * -gcr_viewer_window_get_viewer (GcrViewerWindow *self) -{ - g_return_val_if_fail (GCR_IS_VIEWER_WINDOW (self), NULL); - return gcr_viewer_widget_get_viewer (self->pv->viewer); -} diff --git a/ui/gcr-viewer-window.h b/ui/gcr-viewer-window.h deleted file mode 100644 index de42926..0000000 --- a/ui/gcr-viewer-window.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ -/* gcr-viewer-window.h: Window for viewer - - Copyright (C) 2011 Collabora Ltd. - - The Gnome Keyring Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The Gnome Keyring 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the Gnome Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - - Author: Stef Walter <stefw@collabora.co.uk> -*/ - -#ifndef GCR_VIEWER_WINDOW_H -#define GCR_VIEWER_WINDOW_H - -#include <gtk/gtk.h> - -#ifndef GCR_DISABLE_DEPRECATED - -#include "gcr/gcr.h" - -#define GCR_TYPE_VIEWER_WINDOW (gcr_viewer_window_get_type ()) -#define GCR_VIEWER_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindow)) -#define GCR_VIEWER_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindowClass)) -#define GCR_IS_VIEWER_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER_WINDOW)) -#define GCR_IS_VIEWER_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GCR_TYPE_VIEWER_WINDOW)) -#define GCR_VIEWER_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GCR_TYPE_VIEWER_WINDOW, GcrViewerWindowClass)) - -typedef struct _GcrViewerWindow GcrViewerWindow; -typedef struct _GcrViewerWindowClass GcrViewerWindowClass; -typedef struct _GcrViewerWindowPrivate GcrViewerWindowPrivate; - -struct _GcrViewerWindow { - /*< private >*/ - GtkWindow parent; - GcrViewerWindowPrivate *pv; -}; - -struct _GcrViewerWindowClass { - /*< private >*/ - GtkWindowClass parent_class; -}; - -GType gcr_viewer_window_get_type (void); - -GtkWindow * gcr_viewer_window_new (void); - -void gcr_viewer_window_load (GcrViewerWindow *self, - GFile *file); - -GcrViewer * gcr_viewer_window_get_viewer (GcrViewerWindow *self); - -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcrViewerWindow, g_object_unref) - -#endif /* GCR_DISABLE_DEPRECATED */ - -#endif /* GCR_VIEWER_WINDOW_H */ diff --git a/ui/gcr-viewer.c b/ui/gcr-viewer.c deleted file mode 100644 index fe71402..0000000 --- a/ui/gcr-viewer.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2008 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#include "config.h" - -#include "gcr-display-scrolled.h" -#include "gcr-display-view.h" -#include "gcr-renderer.h" -#include "gcr-viewer.h" - -/** - * GcrViewer: - * - * An abstract interface that represents a widget that can hold - * various renderers and display their contents. - * - * The interaction between [iface@Renderer] and [iface@Viewer] is not stable - * yet, and so viewers cannot be implemented outside the Gcr library at this - * time. - * - * Use the [func@Viewer.new] and [func@Viewer.new_scrolled] to get default - * implementations of viewers. - */ - -/** - * GcrViewerIface: - * @parent: The parent interface - * @add_renderer: Virtual method to add a renderer - * @insert_renderer: Virtual method to insert a renderer - * @remove_renderer: Virtual method to remove a renderer - * @count_renderers: Virtual method to count renderers - * @get_renderer: Virtual method to get a renderer - * - * The interface for #GcrViewer - */ - -typedef GcrViewerIface GcrViewerInterface; - -G_DEFINE_INTERFACE (GcrViewer, gcr_viewer, GTK_TYPE_WIDGET); - -static void -gcr_viewer_default_init (GcrViewerIface *iface) -{ - -} - -/* ----------------------------------------------------------------------------- - * PUBLIC - */ - -/** - * gcr_viewer_new: - * - * Get an implementation of #GcrViewer that supports a view - * of multiple renderers. - * - * Returns: (transfer full): a newly allocated #GcrViewer, which should be - * released with g_object_unref() - */ -GcrViewer * -gcr_viewer_new (void) -{ - return GCR_VIEWER (_gcr_display_view_new ()); -} - -/** - * gcr_viewer_new_scrolled: - * - * Get an implementation of #GcrViewer that supports a scrolled view - * of multiple renderers. - * - * Returns: (transfer floating): a #GcrViewer which is also a #GtkWidget - */ -GcrViewer* -gcr_viewer_new_scrolled (void) -{ - return GCR_VIEWER (_gcr_display_scrolled_new ()); -} - -/** - * gcr_viewer_add_renderer: (virtual add_renderer) - * @viewer: The viewer - * @renderer: The renderer to add - * - * Add a renderer to this viewer. - */ -void -gcr_viewer_add_renderer (GcrViewer *viewer, - GcrRenderer *renderer) -{ - g_return_if_fail (GCR_IS_VIEWER (viewer)); - g_return_if_fail (GCR_IS_RENDERER (renderer)); - g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->add_renderer); - GCR_VIEWER_GET_INTERFACE (viewer)->add_renderer (viewer, renderer); -} - -/** - * gcr_viewer_insert_renderer: (virtual insert_renderer) - * @viewer: the viewer - * @renderer: the renderer to insert - * @before: (nullable): the renderer to insert before - * - * Insert a renderer at a specific point in the viewer - */ -void -gcr_viewer_insert_renderer (GcrViewer *viewer, - GcrRenderer *renderer, - GcrRenderer *before) -{ - g_return_if_fail (GCR_IS_VIEWER (viewer)); - g_return_if_fail (GCR_IS_RENDERER (renderer)); - g_return_if_fail (!before || GCR_IS_RENDERER (before)); - g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->insert_renderer); - GCR_VIEWER_GET_INTERFACE (viewer)->insert_renderer (viewer, renderer, before); -} - -/** - * gcr_viewer_remove_renderer: (virtual remove_renderer) - * @viewer: The viewer - * @renderer: The renderer to remove - * - * Remove a renderer from this viewer. - */ -void -gcr_viewer_remove_renderer (GcrViewer *viewer, - GcrRenderer *renderer) -{ - g_return_if_fail (GCR_IS_VIEWER (viewer)); - g_return_if_fail (GCR_IS_RENDERER (renderer)); - g_return_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->remove_renderer); - GCR_VIEWER_GET_INTERFACE (viewer)->remove_renderer (viewer, renderer); -} - -/** - * gcr_viewer_count_renderers: (virtual count_renderers) - * @viewer: The viewer - * - * Get the number of renderers present in the viewer. - * - * Returns: The number of renderers. - */ -guint -gcr_viewer_count_renderers (GcrViewer *viewer) -{ - g_return_val_if_fail (GCR_IS_VIEWER (viewer), 0); - g_return_val_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->count_renderers, 0); - return GCR_VIEWER_GET_INTERFACE (viewer)->count_renderers (viewer); -} - -/** - * gcr_viewer_get_renderer: (virtual get_renderer) - * @viewer: The viewer - * @index_: The index of the renderer to get - * - * Get a pointer to the renderer at the given index. It is an error to request - * an index that is out of bounds. - * - * Returns: (transfer none): the render, owned by the viewer - */ -GcrRenderer* -gcr_viewer_get_renderer (GcrViewer *viewer, - guint index_) -{ - g_return_val_if_fail (GCR_IS_VIEWER (viewer), NULL); - g_return_val_if_fail (GCR_VIEWER_GET_INTERFACE (viewer)->get_renderer, NULL); - return GCR_VIEWER_GET_INTERFACE (viewer)->get_renderer (viewer, index_); -} diff --git a/ui/gcr-viewer.desktop.in.in b/ui/gcr-viewer.desktop.in.in deleted file mode 100644 index d3b0f57..0000000 --- a/ui/gcr-viewer.desktop.in.in +++ /dev/null @@ -1,7 +0,0 @@ -[Desktop Entry] -Name=View file -MimeType=application/pkcs12;application/pkcs12+pem;application/pkcs7-mime;application/pkcs7-mime+pem;application/pkcs8;application/pkcs8+pem;application/pkix-cert;application/pkix-cert+pem;application/pkix-crl;application/pkix-crl+pem;application/x-pem-file;application/x-pem-key;application/x-pkcs12;application/x-pkcs7-certificates;application/x-x509-ca-cert;application/x-x509-user-cert;application/pkcs10;application/pkcs10+pem;application/x-spkac;application/x-spkac+base64; -Exec=@bindir@/gcr-viewer -Type=Application -Terminal=false -NoDisplay=true diff --git a/ui/gcr-viewer.h b/ui/gcr-viewer.h deleted file mode 100644 index fe8df50..0000000 --- a/ui/gcr-viewer.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2010 Stefan Walter - * - * This program 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.1 of - * the License, or (at your option) any later version. - * - * This program 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 program; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __GCR_VIEWER_H__ -#define __GCR_VIEWER_H__ - -#include <glib-object.h> -#include <gtk/gtk.h> - -#include "gcr/gcr-types.h" - -G_BEGIN_DECLS - -#define GCR_TYPE_VIEWER (gcr_viewer_get_type()) -#define GCR_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GCR_TYPE_VIEWER, GcrViewer)) -#define GCR_IS_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GCR_TYPE_VIEWER)) -#define GCR_VIEWER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GCR_TYPE_VIEWER, GcrViewerIface)) - -typedef struct _GcrRenderer GcrRenderer; -typedef struct _GcrViewer GcrViewer; -typedef struct _GcrViewerIface GcrViewerIface; - -struct _GcrViewerIface { - GTypeInterface parent; - - void (*add_renderer) (GcrViewer *viewer, - GcrRenderer *renderer); - - void (*insert_renderer) (GcrViewer *viewer, - GcrRenderer *renderer, - GcrRenderer *before); - - void (*remove_renderer) (GcrViewer *viewer, - GcrRenderer *renderer); - - guint (*count_renderers) (GcrViewer *viewer); - - GcrRenderer* (*get_renderer) (GcrViewer *viewer, - guint index_); - - /*< private >*/ - gpointer dummy1; - gpointer dummy2; - gpointer dummy3; - gpointer dummy4; -}; - -GType gcr_viewer_get_type (void); - -GcrViewer* gcr_viewer_new (void); - -GcrViewer* gcr_viewer_new_scrolled (void); - -void gcr_viewer_add_renderer (GcrViewer *viewer, - GcrRenderer *renderer); - -void gcr_viewer_insert_renderer (GcrViewer *viewer, - GcrRenderer *renderer, - GcrRenderer *before); - -void gcr_viewer_remove_renderer (GcrViewer *viewer, - GcrRenderer *renderer); - -guint gcr_viewer_count_renderers (GcrViewer *viewer); - -GcrRenderer* gcr_viewer_get_renderer (GcrViewer *viewer, - guint index_); - -G_END_DECLS - -#endif /* __GCR_VIEWER_H__ */ diff --git a/ui/meson.build b/ui/meson.build deleted file mode 100644 index 69144ce..0000000 --- a/ui/meson.build +++ /dev/null @@ -1,265 +0,0 @@ -subdir('icons') - -gcr_ui_headers_install_dir = gcr_base_headers_subdir / 'ui' - -gcr_ui_public_sources = files( - 'gcr-certificate-renderer.c', - 'gcr-certificate-widget.c', - 'gcr-collection-model.c', - 'gcr-combo-selector.c', - 'gcr-failure-renderer.c', - 'gcr-key-renderer.c', - 'gcr-key-widget.c', - 'gcr-import-button.c', - 'gcr-list-selector.c', - 'gcr-prompt-dialog.c', - 'gcr-renderer.c', - 'gcr-secure-entry-buffer.c', - 'gcr-tree-selector.c', - 'gcr-unlock-options-widget.c', - 'gcr-viewer.c', - 'gcr-viewer-widget.c', -) - -gcr_ui_private_sources = files( - 'eggimagemenuitem.c', - 'gcr-certificate-basics-widget.c', - 'gcr-certificate-details-widget.c', - 'gcr-certificate-exporter.c', - 'gcr-certificate-request-renderer.c', - 'gcr-dialog-util.c', - 'gcr-display-scrolled.c', - 'gcr-display-view.c', - 'gcr-gnupg-renderer.c', - 'gcr-live-search.c', - 'gcr-pkcs11-import-dialog.c', - 'gcr-pkcs11-import-interaction.c', - 'gcr-unlock-renderer.c', - 'gcr-viewer-window.c', -) - -gcr_ui_headers = files( - 'gcr-ui.h', - 'gcr-certificate-renderer.h', - 'gcr-certificate-widget.h', - 'gcr-collection-model.h', - 'gcr-combo-selector.h', - 'gcr-deprecated.h', - 'gcr-failure-renderer.h', - 'gcr-key-renderer.h', - 'gcr-key-widget.h', - 'gcr-import-button.h', - 'gcr-list-selector.h', - 'gcr-prompt-dialog.h', - 'gcr-renderer.h', - 'gcr-secure-entry-buffer.h', - 'gcr-tree-selector.h', - 'gcr-unlock-options-widget.h', - 'gcr-viewer.h', - 'gcr-viewer-widget.h', -) - -gcr_ui_deprecated_headers = files( - 'gcr-certificate-basics-widget.h', - 'gcr-certificate-details-widget.h', -) - -# Generated sources -gcr_ui_enums_gen = gnome.mkenums_simple('gcr-enum-types', - sources: gcr_ui_headers, - install_header: true, - install_dir: get_option('includedir') / gcr_ui_headers_install_dir, -) - -gcr_ui_sources = [ - gcr_ui_private_sources, - gcr_ui_public_sources, - gcr_ui_enums_gen, -] - -gcr_ui_deps = [ - glib_deps, - p11kit_dep, - libegg_dep, - gck_dep, - gcr_base_dep, - gtk_dep, -] - -gcr_ui_cflags = [ - '-DG_LOG_DOMAIN="Gcr"', - '-DGCR_COMPILATION', - '-DGCR_API_SUBJECT_TO_CHANGE', - '-DGCK_API_SUBJECT_TO_CHANGE', - '-DP11_KIT_API_SUBJECT_TO_CHANGE', -] - -gcr_ui_symbolmap = meson.current_source_dir() / 'libgcr-ui.map' -gcr_ui_linkflags = cc.get_supported_link_arguments( - '-Wl,--version-script,@0@'.format(gcr_ui_symbolmap), -) - -# gcr-XX is just the same as gcr-ui-XX -gcr_ui_lib = shared_library(gcr_ui_basename, - gcr_ui_sources, - dependencies: gcr_ui_deps, - c_args: gcr_ui_cflags, - link_args: gcr_ui_linkflags, - link_depends: gcr_ui_symbolmap, - include_directories: config_h_dir, - version: gcr_soversion, - install: true, -) - -gcr_ui_pkgconf_deps = [ - glib_dep, - gio_dep, - gobject_dep, - gck_lib, - gcr_base_lib, - gtk_dep, -] -pkgconfig.generate(gcr_ui_lib, - subdirs: gcr_base_headers_subdir, - requires: gcr_ui_pkgconf_deps, - description: 'GObject and GUI library for high level crypto parsing and display', -) -pkgconfig.generate(gcr_ui_lib, - filebase: gcr_basename, - name: gcr_basename, - subdirs: gcr_base_headers_subdir, - requires: gcr_ui_pkgconf_deps, - description: 'GObject and GUI library for high level crypto parsing and display', -) - -install_headers([gcr_ui_headers, gcr_ui_deprecated_headers ], - subdir: gcr_ui_headers_install_dir, -) - -gcr_ui_dep = declare_dependency( - link_with: gcr_ui_lib, - sources: gcr_ui_enums_gen[1], # Make sure gcr-enum-types.h can be included -) - -if get_option('introspection') - gcr_ui_gir = gnome.generate_gir(gcr_ui_lib, - sources: [ gcr_ui_headers, gcr_ui_public_sources ], - namespace: 'GcrUi', - nsversion: gcr_api_version, - export_packages: gcr_ui_basename, - identifier_prefix: 'Gcr', - symbol_prefix: 'gcr', - includes: [ - 'GObject-2.0', - 'Gio-2.0', - 'Gtk-3.0', - gck_gir[0], - gcr_gir[0], - ], - header: 'ui/gcr-ui.h', - extra_args: [ - '-DGCR_COMPILATION', - '-DGCR_API_SUBJECT_TO_CHANGE', - ], - install: true, - ) - - gcr_ui_vapi = gnome.generate_vapi(gcr_ui_basename, - sources: gcr_ui_gir[0], - packages: [ - 'glib-2.0', - 'gio-2.0', - gck_vapi, - gcr_vapi, - 'gtk+-3.0' - ], - metadata_dirs: meson.current_source_dir(), - vapi_dirs: [ - build_root / 'gck', - build_root / 'gcr', - ], - gir_dirs: [ - build_root / 'gck', - build_root / 'gcr', - ], - install: true, - ) -endif - -# gcr-viewer -gcr_viewer = executable('gcr-viewer', - 'gcr-viewer-tool.c', - dependencies: [ gcr_ui_dep, gcr_ui_deps ], - c_args: gcr_ui_cflags, - include_directories: config_h_dir, - install: true, -) - -i18n.merge_file( - input: configure_file( - input: 'gcr-viewer.desktop.in.in', - output: '@BASENAME@', - configuration: { 'bindir': gcr_prefix / get_option('bindir') }, - ), - output: '@BASENAME@', - type: 'desktop', - po_dir: podir, - install: true, - install_dir: get_option('datadir') / 'applications', -) - -# gcr-prompter -gcr_prompter = executable('gcr-prompter', - 'gcr-prompter-tool.c', - dependencies: [ gcr_ui_dep, gcr_ui_deps ], - c_args: gcr_ui_cflags, - include_directories: config_h_dir, - install: true, - install_dir: get_option('libexecdir'), -) - -i18n.merge_file( - input: configure_file( - input: 'gcr-prompter.desktop.in.in', - output: '@BASENAME@', - configuration: { 'libexecdir': gcr_prefix / get_option('libexecdir') }, - ), - output: '@BASENAME@', - type: 'desktop', - po_dir: podir, - install: true, - install_dir: get_option('datadir') / 'applications', -) - -# Register new mime types -install_data('gcr-crypto-types.xml', - install_dir: get_option('datadir') / 'mime' / 'packages', -) - -# Manual UI testing programs -gcr_ui_manual_tests = [ - 'frob-certificate', - 'frob-combo-selector', - 'frob-gnupg-selector', - 'frob-import-button', - 'frob-key', - 'frob-tree-selector', - 'frob-prompt', - 'frob-request', - 'frob-system-prompt', - 'frob-unlock', - 'frob-unlock-options', -] - -gcr_ui_test_cflags = [ - '-DSRCDIR="@0@"'.format(source_root), -] - -foreach _test : gcr_ui_manual_tests - test_bin = executable('test-'+_test, - '@0@.c'.format(_test), - dependencies: [ gcr_ui_deps, gcr_ui_dep ], - c_args: [ gcr_ui_cflags, gcr_ui_test_cflags ], - include_directories: config_h_dir, - ) -endforeach |