tls-fingerprint-default.test.ts 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /// <reference types="vite/client" />
  2. import { describe, expect, it } from 'vitest';
  3. import { TlsStreamSettingsSchema } from '@/schemas/protocols/security/tls';
  4. import {
  5. createTlsSettingsWithDefaultCert,
  6. createHysteriaTlsSettingsWithDefaultCert,
  7. } from '@/lib/xray/inbound-tls-defaults';
  8. import { genHysteriaLink } from '@/lib/xray/inbound-link';
  9. import type { Inbound } from '@/schemas/api/inbound';
  10. // uTLS None ('') must survive a schema parse; the old default flipped it to
  11. // chrome on every save.
  12. describe('TlsClientSettingsSchema fingerprint default', () => {
  13. it('parses an omitted fingerprint as None, not chrome', () => {
  14. const parsed = TlsStreamSettingsSchema.parse({});
  15. expect(parsed.settings.fingerprint).toBe('');
  16. });
  17. it('keeps an explicit empty-string fingerprint through parse', () => {
  18. const parsed = TlsStreamSettingsSchema.parse({
  19. settings: {
  20. fingerprint: '',
  21. echConfigList: '',
  22. pinnedPeerCertSha256: [],
  23. verifyPeerCertByName: '',
  24. },
  25. });
  26. expect(parsed.settings.fingerprint).toBe('');
  27. });
  28. it('initializes generic TLS inbounds with chrome fingerprint default', () => {
  29. const tls = createTlsSettingsWithDefaultCert();
  30. expect((tls.settings as Record<string, unknown>)?.fingerprint).toBe('chrome');
  31. });
  32. it('initializes hysteria TLS inbounds with empty fingerprint default', () => {
  33. const tls = createHysteriaTlsSettingsWithDefaultCert();
  34. expect((tls.settings as Record<string, unknown>)?.fingerprint).toBe('');
  35. });
  36. it('does not inject fp into the hysteria share link when fingerprint is None', () => {
  37. const raw = {
  38. id: 1,
  39. port: 443,
  40. protocol: 'hysteria',
  41. settings: { version: 2, clients: [{ auth: 'secret' }] },
  42. streamSettings: {
  43. security: 'tls',
  44. tlsSettings: {
  45. serverName: 'hy.test',
  46. alpn: ['h3'],
  47. settings: {
  48. fingerprint: '',
  49. echConfigList: '',
  50. pinnedPeerCertSha256: [],
  51. verifyPeerCertByName: '',
  52. },
  53. },
  54. finalmask: {
  55. udp: [{ type: 'salamander', settings: { password: 'pw', packetSize: '512-1200' } }],
  56. },
  57. },
  58. };
  59. const link = genHysteriaLink({
  60. inbound: raw as unknown as Inbound,
  61. address: 'example.test',
  62. remark: 'gecko',
  63. clientAuth: 'secret',
  64. });
  65. expect(link).toContain('obfs=gecko');
  66. expect(link).toContain('minPacketSize=512');
  67. expect(link).toContain('maxPacketSize=1200');
  68. expect(link).not.toContain('fp=');
  69. expect(link).not.toContain('fm=');
  70. });
  71. });