WP Manifestindependent plugin directory
manifest / social / orbita-wp

Órbita WP Registry grade D+. High-severity findings · 4 findingsWP RegistryHigh-severity findings · 4 findingsOpen the reportD+ #10 in Social & Sharing

Plugin de Wordpress para criar um Hacker News-like para o ManualdoUsuario.net

★ 33stars
10release downloads
2.0.1latest · 8mo ago

Install

Download orbita.zip From the 2.0.1 release on GitHub, Feb 5, 2026

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

Install straight from GitHub with WP-CLI:

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

Plugin de WordPress para criar um painel de debates baseado em links, similar ao Hacker News, para o Manual do Usuário.

Rodar o projeto

Requisitos

  • Node.js

Clone o repositório

git clone git@github.com:manualdousuario/orbita.git

Instale as dependências

cd orbita
npm install
npm install --global grunt sass ruby

Caso queira alterar o arquivo de estilo main.scss

grunt watch

Minificar arquivo JavaScript

grunt concat && grunt uglify

Gerar arquivo orbita.zip

grunt compress

Shortcodes

[orbita-form]: formulário de postagem

[orbita-ranking]: ranking com posts mais votados

[orbita-posts]: listagem de post

[orbita-header]: menu

[orbita-vote]: componente de votoção

[orbita-my-comments]: listagem de todos os comentários do usuario

[orbita-my-posts]: listagem de todos os tópicos do usuario

WP-CLI

wp orbita ogimage update [--posts_per_page=<posts_per_page>]: busca pelas ogimage em posts com url externas sem thumbnail

[--posts_per_page=<posts_per_page>]
    quantidade de posts a serem verificados, se não preencher o valor padrão é 10

wp orbita ogimage search [--posts_per_page=<posts_per_page>] [--external_url_ogimage=<external_url_ogimage>]: busca por valores no campo external_url_ogimage

[--posts_per_page=<posts_per_page>]
    quantidade de posts a serem verificados, se não preencher o valor padrão é -1

[--external_url_ogimage=<external_url_ogimage>]
    filtrar informações no campo external_url_ogimage, guia de parametros de erros:
    // e_001 = error downloading source code from external url
    // e_002 = og:image not found after request
    // e_003 = error downloading image received in og:image
    // e_004 = did not recognize a mime type as an image extension

Instalar o plugin

  1. Faça login no seu admin do WordPress
  2. Visite Plugins > Adicionar novo > Enviar plugin
  3. "Escolher arquivo" e selecione o orbita.zip
  4. Clique em "Instalar agora" e depois em "Ativar plugin"

Contribuição

Você pode ajudar abrindo um pull request (verifique as issues abertas ou, se preferir, abra uma nova) ou reportando um bug.

Para manter o repositório padronizado:

Releases

Newest 25 of 60 recorded releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
2.0.1 latest
Feb 5, 2026 8mo ago
orbita.zip
7
2.0
Jan 31, 2026 8mo ago
orbita.zip
3
May 10, 2025 1 year ago
tag only
—
May 3, 2025 1 year ago
tag only
—
Apr 27, 2025 1 year ago
tag only
—
Feb 17, 2025 1 year ago
tag only
—
Feb 14, 2025 1 year ago
tag only
—
Jan 20, 2025 1 year ago
tag only
—
Nov 18, 2024 1 year ago
tag only
—
Nov 14, 2024 1 year ago
tag only
—
Nov 13, 2024 1 year ago
tag only
—
Sep 2, 2024 2 years ago
tag only
—
Jun 14, 2024 2 years ago
tag only
—
Jun 7, 2024 2 years ago
tag only
—
Apr 16, 2024 2 years ago
tag only
—
Apr 8, 2024 2 years ago
tag only
—
Mar 27, 2024 2 years ago
tag only
—
Mar 20, 2024 2 years ago
tag only
—
Jan 29, 2024 2 years ago
tag only
—
Dec 30, 2023 2 years ago
tag only
—
Dec 19, 2023 2 years ago
tag only
—
Dec 18, 2023 2 years ago
tag only
—
Dec 15, 2023 2 years ago
tag only
—
Dec 15, 2023 2 years ago
tag only
—
Dec 15, 2023 2 years ago
tag only
—
All releases on GitHub →
D+ grade

Security

Órbita 2.0.1 · audited by WP Registry

High-severity findings.

2 high 2 medium
Audited release
2.0.1
Findings
4
Worst severity
high
Content hash
fc747d330b888131e066eff5…

Findings

  • high Authenticated reflected XSS in [orbita-form] via t and u query parameters

    xss_reflected

    orbita_form_shortcode() copies $_GET['t'] and $_GET['u'] through sanitize_text_field() (strips tags, does not encode quotes) and concatenates them into HTML attributes without esc_attr(). The form is shown only after is_user_logged_in(), so any Subscriber (the plugin adds publish_orbitas to that role and links wp_registration_url()) or higher who opens a crafted URL such as /orbita/postar/?t=%22%20onfocus%3Dalert%28document.domain%29%20autofocus%3D%22x or the same in u= executes attacker JavaScript in the site origin. The bookmarklet documented in the shortcode is designed to pass document.title/location through these params. SameSite=Lax still sends auth cookies on this GET navigation, so an administrator who uses the board can be hit by a mailed/posted link (session takeover: plugin install, user create). Unauthenticated visitors hit the login prompt and never reach the sink.

    orbita.php:804-825

    Recommendation

    Escape both values with esc_attr() (and put the title into the textarea body, not a value attribute). Prefer sanitize_url() for u. Keep the logged-in gate.

  • high CSRF publishes orbita_post as any logged-in user (nonce checked only on the display shortcode)

    csrf

    add_action('wp_loaded','orbita_form_post') treats any POST with orbita_post_title as a submit. The handler never calls wp_verify_nonce or current_user_can. The orbita_nonce field is created in orbita_form_shortcode() and verified there only when rendering the form, which does not run before this writer (and a successful submit wp_redirect()s away). After is_user_logged_in(), it wp_insert_post()s a published orbita_post with unsanitized title/content (kses applies only for users without unfiltered_html), stores external_url, optionally fetches og:image via wp_safe_remote_request, and auto-upvotes. A cross-site form can therefore publish spam/malware links as a Subscriber, or, if the victim is an administrator, store raw HTML/JS. orbita_get_post_html() then echoes get_the_title() into a title="..." attribute and link text without esc_attr/esc_html, so that admin CSRF becomes stored XSS on [orbita-posts]/[orbita-ranking] for every visitor. File inputs cannot be filled cross-origin, so the upload branch is not a practical CSRF vector; URL/title/content are.

    orbita.php:882-1021

    Recommendation

    Move processing into the same request as the form, require wp_verify_nonce($_POST['orbita_nonce'], 'orbita_nonce') and current_user_can('publish_orbitas') before wp_insert_post, and reject missing nonces. Escape titles on output with esc_attr/esc_html in orbita_get_post_html() and single-orbita.php.

  • medium REST likes route has no permission_callback and writes vote meta on arbitrary posts

    missing_permission_callback

    register_rest_route('orbitaApi/v1','/likes/') registers POST with callback orbita_update_post_likes and no permission_callback, so WordPress does not run a REST permission check (public at the routing layer; _doing_it_wrong since 5.5). The callback returns if get_current_user_id() is 0, so unauthenticated and cookie-auth-without-nonce requests do nothing. Any logged-in user who can present a wp_rest nonce (localized as orbitaApi.restNonce on every orbita shortcode/singular page) can POST post_id for any post type. orbita_increase_post_like() does not verify orbita_post; it appends the user id to post_users_vote and increments post_like_count on that post. Observable: a Subscriber can stamp those keys onto pages, attachments, or WooCommerce products; ranking reads post_like_count as score and public/main.js assigns jsonData.count via innerHTML (integer increment, not HTML XSS).

    orbita.php:1227-1273

    Recommendation

    Set permission_callback to a function that requires is_user_logged_in() (REST cookie nonce still applies). Accept post_id from WP_REST_Request, absint it, and refuse IDs that are not a published orbita_post. Keep one-user-one-vote.

  • medium Unauthenticated GET of a discussion post overwrites orbita_category

    missing_auth

    single-orbita.php is loaded via the single_template filter for orbita_post. On every view, if external_url meta is empty it looks up the term named 'conversas' and calls wp_set_object_terms( $post_id, $term_id, 'orbita_category' ) with default append=false, replacing all terms. There is no capability check, nonce, or request-method guard. Any visitor (including unauthenticated) who opens such a permalink mutates taxonomy. Impact is limited to the conversas classification used by this board and is a no-op if that term has not been created, but on the intended Manual do Usuário-style install it is a persistent unauthenticated write.

    single-orbita.php:31-38

    Recommendation

    Assign the conversas term at publish time in orbita_form_post (or a save_post hook) with current_user_can, not in the public template. If a template-side fix is needed, set terms only when empty and only for users who can edit the post.

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.