Wed, 16 Nov 2022 22:36:02 -0600
Add a permission property to PurpleContact
This property is intended to handle the majority of our privacy use cases in
the future. It won't get everything, but it's a simple start that will make a
lot of impact.
Testing Done:
Compiled and ran the unit tests.
Reviewed at https://reviews.imfreedom.org/r/2066/
--- a/libpurple/meson.build Wed Nov 16 22:34:18 2022 -0600 +++ b/libpurple/meson.build Wed Nov 16 22:36:02 2022 -0600 @@ -260,6 +260,7 @@ 'plugins.h', 'purplechatuser.h', 'purpleconnectionerrorinfo.h', + 'purplecontact.h', 'purpleconversation.h', 'purpleimconversation.h', 'purplemessage.h',
--- a/libpurple/purplecontact.c Wed Nov 16 22:34:18 2022 -0600 +++ b/libpurple/purplecontact.c Wed Nov 16 22:36:02 2022 -0600 @@ -18,6 +18,8 @@ #include "purplecontact.h" +#include "purpleenums.h" + struct _PurpleContact { GObject parent; @@ -35,6 +37,8 @@ PurpleTags *tags; PurplePerson *person; + + PurpleContactPermission permission; }; enum { @@ -48,6 +52,7 @@ PROP_PRESENCE, PROP_TAGS, PROP_PERSON, + PROP_PERMISSION, N_PROPERTIES }; static GParamSpec *properties[N_PROPERTIES] = {NULL, }; @@ -119,6 +124,9 @@ case PROP_PERSON: g_value_set_object(value, purple_contact_get_person(contact)); break; + case PROP_PERMISSION: + g_value_set_enum(value, purple_contact_get_permission(contact)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); break; @@ -153,6 +161,9 @@ case PROP_PERSON: purple_contact_set_person(contact, g_value_get_object(value)); break; + case PROP_PERMISSION: + purple_contact_set_permission(contact, g_value_get_enum(value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); break; @@ -206,11 +217,11 @@ purple_contact_class_init(PurpleContactClass *klass) { GObjectClass *obj_class = G_OBJECT_CLASS(klass); - obj_class->get_property = purple_contact_get_property; - obj_class->set_property = purple_contact_set_property; obj_class->constructed = purple_contact_constructed; obj_class->dispose = purple_contact_dispose; obj_class->finalize = purple_contact_finalize; + obj_class->get_property = purple_contact_get_property; + obj_class->set_property = purple_contact_set_property; /** * PurpleContact:id: @@ -334,6 +345,20 @@ PURPLE_TYPE_PERSON, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + /** + * PurpleContact:permission: + * + * The permission level for the contact. + * + * Since: 3.0.0 + */ + properties[PROP_PERMISSION] = g_param_spec_enum( + "permission", "permission", + "The permission level of the contact", + PURPLE_TYPE_CONTACT_PERMISSION, + PURPLE_CONTACT_PERMISSION_UNSET, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); } @@ -463,3 +488,22 @@ return contact->person; } + +PurpleContactPermission +purple_contact_get_permission(PurpleContact *contact) { + g_return_val_if_fail(PURPLE_IS_CONTACT(contact), + PURPLE_CONTACT_PERMISSION_UNSET); + + return contact->permission; +} + +void +purple_contact_set_permission(PurpleContact *contact, + PurpleContactPermission permission) +{ + g_return_if_fail(PURPLE_IS_CONTACT(contact)); + + contact->permission = permission; + + g_object_notify_by_pspec(G_OBJECT(contact), properties[PROP_PERMISSION]); +}
--- a/libpurple/purplecontact.h Wed Nov 16 22:34:18 2022 -0600 +++ b/libpurple/purplecontact.h Wed Nov 16 22:36:02 2022 -0600 @@ -37,6 +37,25 @@ #define PURPLE_TYPE_CONTACT (purple_contact_get_type()) G_DECLARE_FINAL_TYPE(PurpleContact, purple_contact, PURPLE, CONTACT, GObject) +/** + * PurpleContactPermission: + * @PURPLE_CONTACT_PERMISSION_UNSET: The value is unset. + * @PURPLE_CONTACT_PERMISSION_ALLOW: The contact is allowed to contact the + * user. + * @PURPLE_CONTACT_PERMISSION_DENY: The contact is not allowed to contact the + * user. + * + * A representation of whether or not a contact has permission to contact the + * user. + * + * Since: 3.0.0 + */ +typedef enum { + PURPLE_CONTACT_PERMISSION_UNSET = 0, + PURPLE_CONTACT_PERMISSION_ALLOW, + PURPLE_CONTACT_PERMISSION_DENY, +} PurpleContactPermission; + #include <libpurple/purpleperson.h> /** @@ -243,6 +262,29 @@ */ PurplePerson *purple_contact_get_person(PurpleContact *contact); +/** + * purple_contact_get_permission: + * @contact: The instance. + * + * Gets the [enum@Purple.ContactPermission] for @contact. + * + * Returns: The permission for @contact. + * + * Since: 3.0.0 + */ +PurpleContactPermission purple_contact_get_permission(PurpleContact *contact); + +/** + * purple_contact_set_permission: + * @contact: The instance. + * @permission: The new permission of the contact. + * + * Sets the permission of @contact to @permission. + * + * Since: 3.0.0 + */ +void purple_contact_set_permission(PurpleContact *contact, PurpleContactPermission permission); + G_END_DECLS #endif /* PURPLE_CONTACT_H */
--- a/libpurple/tests/test_contact.c Wed Nov 16 22:34:18 2022 -0600 +++ b/libpurple/tests/test_contact.c Wed Nov 16 22:36:02 2022 -0600 @@ -45,6 +45,7 @@ PurpleAccount *account = NULL; PurpleAccount *account1 = NULL; PurpleContact *contact = NULL; + PurpleContactPermission permission; PurplePerson *person = NULL; PurplePerson *person1 = NULL; PurplePresence *presence1 = NULL; @@ -73,6 +74,7 @@ "alias", "alias", "avatar", avatar, "person", person, + "permission", PURPLE_CONTACT_PERMISSION_ALLOW, NULL); /* Now use g_object_get to read all of the properties. */ @@ -86,6 +88,7 @@ "presence", &presence1, "tags", &tags, "person", &person1, + "permission", &permission, NULL); /* Compare all the things. */ @@ -98,6 +101,7 @@ g_assert_nonnull(presence1); g_assert_nonnull(tags); g_assert_true(person1 == person); + g_assert_true(permission == PURPLE_CONTACT_PERMISSION_ALLOW); /* Free/unref all the things. */ g_clear_pointer(&id, g_free); @@ -131,4 +135,4 @@ test_purple_contact_properties); return g_test_run(); -} \ No newline at end of file +}