WP Manifestindependent plugin directory
manifest / integrations / touchpoint-wp

TouchPoint WP WP Registry grade D. High-severity findings · 6 findingsWP RegistryHigh-severity findings · 6 findingsOpen the reportD

A WordPress Plugin for integrating with TouchPoint Church Management Software.

★ 4stars
128release downloads
≈10active sites
v0.0.37latest · 2 years ago

Install

Download touchpoint-wp.zip From the v0.0.95 release on GitHub, Nov 22, 2024

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/tenthpres/touchpoint-wp/releases/download/v0.0.95/touchpoint-wp.zip
No built-in updater. New versions won't appear under Dashboard → Updates. Install new releases yourself, or let Git Updater track the repository.

A WordPress Plugin for integrating with TouchPoint Church Management Software.

Developed by Tenth Presbyterian Church for their website and released under the AGPL License. This plugin is not developed or supported by TouchPoint. While their support team is stellar, they probably won't be able to help you with this.

See the Wiki for Installation instructions and other documentation. Sign up here for occasional, non-annoying email updates.

If you're a developer looking to leverage this for a church, you're welcome to browse the source code, but we also have API docs here.

Features

Involvement Lists & Small Group Finder

  • Publish a list and map of involvements, with dynamic filtering based on actual data, such as demographics and location.
    • e.g. filter Small Groups by Age and Prevailing Marital Status based on the people in the involvement. You don't need to change any per-group settings, just keep the roster up to date.
  • Suggest Small Groups physically nearby based on geolocation.
  • Allow website guests to easily contact leaders or join a group, without exposing leaders' contact info publicly.
  • Includes Search Engine optimizing metadata.

Small Groups Example. Classes Example.

Crazy-Simple RSVP interface

Let folks RSVP for an event for each member in their family in just a few clicks. No login required, just an email address and zip code.

People Lists

Show your Staff members, Elders, or other collections of people, automatically kept in sync with TouchPoint. Example. (This example and others like is are 100% updated from TouchPoint, including the titles and social links.)

Outreach Partners

Automatically import partner bios and info from TouchPoint for display on your public website, with appropriate care for their security. Example.

Events

Improve display of events in the TouchPoint Custom Mobile App by providing content from The Events Calendar Plugin by ModernTribe. This is compatible with both the free and "Pro" versions.

Authentication (Beta)

Authenticate TouchPoint users to WordPress, so you can know your website users.

Costs & Considerations

This plugin is FREE! We developed this plugin for us, but want to share it with any other churches that would benefit from it. If you already have a WordPress website, you can probably get started in about five minutes.

If you're considering whether WordPress is the right tool for your church, here were the factors that led us this direction:

  • WordPress is very widely supported, and it's easy to find developers who are familiar with it when custom work is needed.
  • The WordPress ecosystem has thousands of themes and plugins available to do just about anything.
  • WordPress itself is free, very powerful, ridiculously flexible, and extremely well documented.
  • Other bespoke CMS platforms come and go with the startups that create them. WordPress isn't going anywhere.
  • We own 100% of our content, and we have total control over it.
  • WordPress can be complicated, but we have the technical staff to support and configure it.

If you're not sure whether WordPress is the right tool for you, feel free to get in touch. We can also have good relationships with several firms who could help with the setup and technical maintenance if you're interested. But, it's probably not the right tool for every church.

Future Features

  • Authenticate
    • Track viewership of webpages and web resources non-anonymously. (Know who attended your virtual worship service.)
    • Sync WordPress Permissions with TouchPoint involvements or roles.
  • Events
    • Sync TouchPoint Meetings with events on your public web calendar.
  • Small Groups
    • Suggest demographically-targeted small groups.
  • Integrated Directory
    • Find someone's contact info by typing their name into the standard site search bar.
  • Prayer Requests
    • Collect prayer requests through a form, and display them to people with the appropriate access roles.

Requirements

Making this work requires notable configuration of your TouchPoint database. We've scripted what we can, and the remainder is in the Installation Instructions.

Some features require other plugins, which may have fees attached.

You will need a TouchPoint user account with API-level access. New TouchPoint databases do not have one by default. If your church doesn't have one, open a support ticket with TouchPoint to create one, referencing this plugin.

If you're using the Authentication component, your WordPress site MUST use HTTPS with a valid certificate.

We don't promise support for old versions of WordPress or PHP. You will need to keep both up to date.

Multisite Support

At the moment, this plugin won't perform very well in a multisite environment. We're working on that, though, as we plan on moving our own infrastructure toward multisite soon. As currently planned, ALL sites in a multisite network will share ONE TouchPoint connection, and many (though not all) of the settings would be shared across the network. If you're interested in using this plugin in a multisite environment, please get in touch.

Credit & Hat-Tips

This plugin uses PSR-12 coding standards, which are significantly different from the WordPress standards, but are easier for working in OOP. This plugin heavily uses OOP.

Several plugins have lended structure, code, or inspiration to this plugin:

Other Software Used Within this Software

License

This plugin is released under the AGPL, which is "very strong copy-left". Therefore, if you change this code and use it in production, you MUST make your changes available.

Support

We're a church, not a software company. However, we really do want to see you thrive. While we won't make any guarantees about support, we do try to be pretty responsive in troubleshooting. Get in touch or open an issue if you have questions.

Releases

19 releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
Nov 22, 2024 1 year ago
touchpoint-wp.zip
16
v0.0.37 latest
Feb 7, 2024 2 years ago
touchpoint-wp.zip
31
Oct 22, 2023 3 years ago
touchpoint-wp.zip
12
Oct 17, 2023 3 years ago
touchpoint-wp.zip
6
Aug 14, 2023 3 years ago
touchpoint-wp.zip
9
Jun 28, 2023 3 years ago
touchpoint-wp.zip
9
May 24, 2023 3 years ago
touchpoint-wp.zip
11
May 3, 2023 3 years ago
touchpoint-wp.zip
3
Mar 31, 2023 3 years ago
touchpoint-wp.zip
9
Jan 24, 2023 3 years ago
touchpoint-wp.zip
14
Jan 2, 2023 3 years ago
TouchPoint-WP.zip
8
Dec 2, 2022 3 years ago
tag only
—
Aug 17, 2022 4 years ago
tag only
—
Aug 17, 2022 4 years ago
tag only
—
May 25, 2022 4 years ago
tag only
—
May 14, 2022 4 years ago
tag only
—
Apr 20, 2022 4 years ago
tag only
—
Jul 5, 2021 5 years ago
tag only
—
Jun 2, 2021 5 years ago
tag only
—

Active-site estimate ≈10 comes from the median of recent superseded releases. Method.

D grade

Security

TouchPoint WP 0.0.95 · audited by WP Registry

High-severity findings.

4 high 2 medium
Audited release
0.0.95
Findings
6
Worst severity
high
Content hash
fd251d831dd349ebf16e50f0…

Findings

  • high Unauthenticated ident creates or updates church people and returns family PII

    information_disclosure

    POST /touchpoint-api/person/ident has no capability or nonce. After an optional CleanTalk check (skipped if that plugin is absent), Person::ident() posts the JSON to TouchPoint. If firstName and lastName are present, WebApi.py calls model.FindAddPeopleId() (creates a person in the ChMS) and may UpdatePerson with attacker zip/phone/email. If only email+zip are sent, matching family members are returned (goesBy, last initial, familyId, peopleId) and stored for RSVP/join. If fid is supplied, PHP only unsets pid, so arbitrary family IDs are enumerated. Observable: unauthenticated POST {"firstName":"A","lastName":"B","email":"x@y.z","zip":"12345"} creates a TouchPoint person; POST {"fid":[1],"email":"a@b.c"} lists that family's people IDs for use in RSVP/join/auth token minting.

    src/TouchPoint-WP/Person.php:1580-1606,1760-1764

    Recommendation

    Rate-limit ident. Require a CAPTCHA or similar always, not only when CleanTalk is installed. Ignore client-supplied fid/pid. Do not call FindAddPeopleId from an unauthenticated WordPress request; look up existing people only and return the minimum fields. Bind subsequent RSVP/join to peopleIds actually returned into the server-side session.

  • high Unauthenticated force-sync creates a persistent administrator and runs as that user

    missing_auth

    GET /touchpoint-api/person/force-sync, /inv/force-sync, /global/force-sync, and /report/force-sync (and report/sync) have no capability or nonce. Each calls setTpWpUserAsCurrent(), which validateThatTpWpUserExists(): if username touchpoint-wp is missing, wp_create_user('touchpoint-wp', random, 'tpwp@tenth.org') and set_role('administrator'). The remainder of the request then creates/updates/deletes WP users and posts as that administrator (wp_set_current_user, no auth cookie, but all in-request caps are admin). Cron also creates the account. Observable: unauthenticated GET /touchpoint-api/person/force-sync creates user touchpoint-wp with vendor email tpwp@tenth.org as administrator if it did not exist; password reset to that mailbox is a standing recovery path. The same request is a CPU/API DoS (Involvement sync sets memory_limit 512M and max_execution_time 300).

    src/TouchPoint-WP/TouchPointWP.php:2575-2636

    Recommendation

    Do not create an administrator from a public URL. If a service account is required, create it only in activation/migration under manage_options, use a site-local email, and grant only the caps needed for sync. Gate force-sync behind current_user_can('manage_options') plus a nonce (or a high-entropy cron secret). Never wp_set_current_user to an administrator on an unauthenticated request.

  • high Unauthenticated RSVP and involvement join accept arbitrary TouchPoint people IDs

    missing_auth

    POST /touchpoint-api/mtg/rsvp and (when involvements are enabled) POST /touchpoint-api/inv/join have no capability, nonce, or session check that the people[] IDs were previously ident'd. ajaxSubmitRsvps() json_decodes php://input and apiPost('mtg_rsvp'); WebApi.py calls model.EditCommitment(mid, pid, 'Attending'|'Regrets') for every ID in responses.Yes/No. ajaxInvJoin() forwards invId and people[].peopleId to model.AddMemberToOrg / SetMemberType Prospect. Combined with ident (or sequential PeopleId guessing), an unauthenticated visitor can RSVP or join groups as any congregation member. README advertises email+zip RSVP, but the server does not enforce that binding.

    src/TouchPoint-WP/Meeting.php:612-730

    Recommendation

    On ident, store allowed peopleIds in a server-side session (start the session on the API request). Reject RSVP/join peopleIds that are not in that session. Cap invId to involvements actually published as WP posts. Add CSRF tokens to the JSON POSTs.

  • high Web-accessible generateDocs.php downloads a PHAR and executes shell commands

    dev_tool_in_production

    generateDocs.php has no ABSPATH / CLI / capability guard. A default WordPress install serves plugin PHP over HTTP. Visiting /wp-content/plugins/touchpoint-wp/generateDocs.php file_put_contents a phpdoc.phar from phpdoc.org, exec()s php vendor binaries and that PHAR, rewrites docs/*.md, and exec()s git add/commit/push. Observable: unauthenticated GET of that URL performs remote file write into the plugin directory and process execution as the web user; if git credentials exist, it pushes. This is a shipped development tool, not a runtime feature.

    generateDocs.php:1-73

    Recommendation

    Delete generateDocs.php from release zips, or guard with `PHP_SAPI === 'cli'` and exit. Do not download or exec PHAR/binaries from a web-reachable file. Keep documentation generation in CI.

  • medium Unauthenticated cleanup endpoint deletes extra-value user and post meta

    missing_auth

    GET/POST /touchpoint-api/cleanup has no capability or nonce and always runs Cleanup::cronCleanup(true). cleanupPersonEVs() / cleanupFamilyEVs() DELETE FROM usermeta/postmeta rows whose meta_key LIKE 'tp_pev_%' and is not in the configured extra-value allowlist. Observable: any visitor can trigger mass deletion of imported person extra values (bios and custom EVs) and partner family EVs, wiping public staff/partner fields until the next sync.

    src/TouchPoint-WP/Utilities/Cleanup.php:74-78,117-157

    Recommendation

    Remove the public API route. Keep cleanup on the existing cron hook only, or require manage_options plus a nonce.

  • medium Admin API endpoints have capability checks but no nonce (phpinfo, debug, migrate, script zip)

    missing_nonce

    TouchPointWP_AdminAPI::api() gates scriptzip, script-update, debug-enable/disable, force-migrate, and phpinfo with currentUserIsAdmin() (manage_options) only. There is no wp_verify_nonce or referer check. A CSRF GET from an administrator's browser to /touchpoint-api/admin/phpinfo dumps phpinfo(); debug-enable sets option tp_DEBUG=true (verbose API URLs/errors); force-migrate reruns migrations; scriptzip downloads the Python package that is deployed with API privileges on TouchPoint. memtypes is not even admin-gated and proxies division IDs to the TouchPoint API.

    src/TouchPoint-WP/TouchPointWP_AdminAPI.php:42-104

    Recommendation

    Require check_admin_referer / wp_verify_nonce on every admin API action. Drop phpinfo() from production. Give memtypes the same admin+nonce gate. Prefer admin-ajax or REST with permission_callback.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.