Skip to content

NethVoice: blind transfer callback never returns the call #8310

Closed

Description

@edospadoni

Steps to reproduce

  1. In FreePBX, open Applications → Blind transfer callback (Return On Transfer), set Enabled to Yes and save.
  2. Extension A calls extension B, B answers.
  3. B blind-transfers the call (SIP REFER) to extension C, and C does not answer.

Expected behavior

After the configured timeout the call stops ringing C and comes back to B, with the configured caller-name prefix and Alertinfo.

Actual behavior

C keeps ringing past the timeout and the call never comes back to B. The [blindxfer_ringback] context is generated, but no call goes through it: the transferred call goes through from-internal-xfer-dest → from-internal-xfer instead.

Reproduced on NethVoice with FreePBX 17 (image pr-1194.1684-1.e51fb5b, same core as 1.8.0) using SIP clients 201 → 202, 202 REFER to 203 (no answer), timeout 27 s. The TRANSFER_CONTEXT setting was blindxfer_ringback, while the dialplan global was TRANSFER_CONTEXT = from-internal-xfer-dest.

The module sets the FreePBX TRANSFER_CONTEXT setting to blindxfer_ringback. Upstream FreePBX core 17.0.18.54 adds that setting as a global, then overrides it with $ext->addGlobal('TRANSFER_CONTEXT', 'from-internal-xfer-dest') (functions.inc.php, around line 2050). The nethcti3 transfer hook (#1126) then routes from-internal-xfer-dest through func-nethvoice-transfer-context to from-internal-xfer. So the callback works on FreePBX 16 (NethVoice 1.7) but never triggers on the FreePBX 17 line.

Components

NethVoice 1.8 (FreePBX core 17.0.18.54), Return On Transfer module 1.2.x, nethcti3 transfer profile hook.

Proposed correction

When the callback is enabled, route blind transfers through blindxfer_ringback again, for example from the nethcti3 transfer hook in from-internal-xfer-dest (blind transfers have BLINDTRANSFER set), keeping the profile-based transfer context from #1126 for the final dial.

See also

Activity

  1. added this to the NethVoice 1.8 milestone on Nov 11, 2026
  2. added
    nethvoiceBug or features releted to the NethVoice project
    on Nov 11, 2026
  3. added theissue type on Nov 11, 2026
  4. moved this from Todo to In Progress in NethVoiceon Nov 11, 2026
  5. edospadoni commented on Nov 11, 2026

    @edospadoni
    MemberAuthor

    Test

    PRs: nethesis/ns8-nethvoice#1196

    Setup: three extensions A, B and C (physical phones or softphones that support blind transfer). In FreePBX, Applications → Blind transfer callback: Enabled = Yes, note the timeout (default 15 s) and the Caller ID prefix. For Test Case 3 also a trunk to call from and to an external number.

    Test Case 1 - Blind transfer not answered returns to the transferer

    • A calls B, B answers and blind-transfers the call to C; C does not answer
    • C rings for the configured timeout, then stops ringing and the call rings back on B
    • B answers and talks with A (A stays connected the whole time)
    • Same check with C busy (e.g. DND or already in a call): the call comes back to B

    Test Case 2 - Blind transfer answered

    • A calls B, B blind-transfers to C and C answers before the timeout: A and C talk, B does not ring back
    • The call is shown correctly in the CTI history and in the CDR (destination C)

    Test Case 3 - External calls

    • An external caller reaches B (inbound route), B blind-transfers to C, C does not answer: the call comes back to B showing the configured prefix (e.g. RT: <C> <caller name>)
    • B receives a call from A and blind-transfers it to an external number allowed for B's profile: the external number is dialed (profile from #1126 still applied)
    • B blind-transfers to an external number not allowed for B's profile: the call is not placed

    Test Case 4 - Regressions

    Note: when A is an internal extension, the ring back on B shows A's name instead of the configured prefix (FreePBX replaces the caller name of internal users); this is not changed by the PR.

    Testing release: 1.8.2-testing.1 (nethesis/ns8-nethvoice#1196)

    ghcr.io/nethesis/nethvoice:1.8.2-testing.1
    

    Update command (replace nethvoiceX with the NethVoice instance):

    api-cli run update-module --data '{"module_url":"ghcr.io/nethesis/nethvoice:1.8.2-testing.1","instances":["nethvoiceX"],"force":true}'
    
  6. added
    testingPackages are available from testing repositories
    on Nov 11, 2026
  7. moved this from In Progress to Testing in NethVoiceon Nov 11, 2026
  8. removed their assignment
    on Nov 11, 2026
  9. removed their assignment
    on Nov 12, 2026
  10. removed
    testingPackages are available from testing repositories
    on Nov 12, 2026
  11. moved this from Testing to Verified in NethVoiceon Nov 12, 2026
  12. Stell0 commented on Nov 12, 2026

    @Stell0

    Release nethesis/ns8-nethvoice 1.8.2

  13. moved this from Verified to Done in NethVoiceon Nov 12, 2026
  14. removed
    verifiedAll test cases were verified successfully
    on Nov 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    nethvoiceBug or features releted to the NethVoice project

    Type

    Projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions