Skip to main content
Version: 4.1

3.7.4

Two of these were the product claiming something it did not do. One is a security setting that charged three protections for the one somebody needed. One is a conferencing feature we did not have. And one is a suite that had been red for long enough that nobody read it.

Upgrading is hitechcloudcli update.

The meeting room stops overstating itself​

  • It said the media was end-to-end encrypted. It was not, and the recording feature is the proof. The join page carried a green badge reading "Mã hoá đầu cuối E2EE"; the room showed "🔒 E2EE" titled "End-to-End Encrypted (SFrame/WebRTC DTLS-SRTP)". There is no SFrame anywhere in the client or the server — the search for it turns up only those labels and a CSS class. What exists is DTLS-SRTP, which every WebRTC connection has and which ends at the server: the conferencing service decrypts in order to forward, and writes each participant's camera and screen to disk as WebM when a meeting is recorded. A server that can hand you a playable recording is a server that can read the media. Every one of those labels now says encrypted in transit, and says plainly that the server decrypts to forward, record and stream. Real end-to-end encryption is worth having and is scheduled; it cannot coexist with server-side recording or live streaming, so it belongs in front of the person creating the meeting as a choice, not as a badge.
  • "Khử ồn AI" is now true. Behind that pill were echoCancellation, noiseSuppression and autoGainControl — three browser constraints that have existed for years — and the pill was unconditional, so it kept claiming "AI" on a browser with no such thing. RNNoise now runs over the microphone in a worker, and the pill appears only while that is actually happening. Measured: noise alone drops 96 dB, a voice passes through at the level it went in, and a voice in noise loses 11 dB of noise floor while staying a voice. It is a switch, because the model gates on speech and will take music away with the noise.
  • The file picker and URL field that offered to play a video into the room now do it. The handler behind them took the URL, dropped it, and reported success. It plays as a shared source, so a person's camera keeps working alongside it. The YouTube and Facebook part of that promise is gone: a browser will not let a page read back their frames, and never could.

Breakout rooms​

A host can split a meeting into rooms, move people between them, speak into all of them at once, and bring everybody back. A breakout is a room of its own rather than a label on a participant — the alternative would mean every path that forwards media had to respect the label, and the one that forgot would carry a private conversation to the wrong people. The recording, the lobby, the polls and the question list stay with the main meeting; a breakout is for talking. Everybody can see which room somebody went to, which is not the same as being able to hear them.

Security​

  • An identity provider on your own network no longer costs you TLS. allow_insecure turned off three independent things at once: a plain-HTTP issuer, the private-address guard, and certificate verification — for discovery, for the keys, and for the token exchange. Anyone whose provider sits inside their network, with a perfectly good certificate from their own CA, had to give up all three to reach it, and the authorization-code exchange then ran unverified. Its own help text said what it was for: "Use only for LAN-only providers" — which is the address guard, and says nothing about a certificate. There is now a setting for exactly that one permission, and the old flag keeps working for anyone already using it.
  • Mail leaving this server says what sent it. The parser reads X-Mailer when judging a message that arrives and nothing ever set it on one that leaves, which is unusual enough to count against a message. It carries neither the operator's brand — that would tell every recipient whose customer the sender is — nor a version, unless an operator chooses to publish one.

Fixed​

  • The plan form says what the server actually has. A plan offering 30 cores and 2048 GB on a 20-core, 8 GB machine is not a typo: the field is labelled "Total Memory (GB)" and somebody typed 2048. Nothing on the form mentioned the machine, and from then on every usage bar for those accounts read zero, because a percentage of an unreachable number is always zero. The two fields now end with what this server has, and a plan that promises more says so on save.
  • Inode counts are readable. 8,827 was shown as 8.827 whatever the reader's locale, and a five-billion allowance as 5000.00M.
  • A diagnostics page nobody could reach. The meeting service's ports, public addresses and TURN configuration — what an administrator needs when a participant cannot connect — had been written and translated with no tab leading to it. Its own text contains an exact description of the encryption, which had been sitting in unreachable code while four badges on screen said E2EE.

Internal​

  • The webmail's test suite and its lint are checked by CI, and pass. Neither had ever been run there. That is how the frontend suite could sit at seven failures — six of them one cause, a state module importing a React component so that thirty-nine tests could not even load — and its lint at twenty-one warnings against a zero-warning setting. Both are green and both now gate the build.
  • Resolving a thread no longer scans every message an account owns: 31.9 ms to 1.6 ms on 200,000 messages. The index existed; it was partial, and the statement did not carry the predicate that would let PostgreSQL read it.
Was this helpful?