Skip to content

Navigation Menu

Sign in
Sign up

Repository files navigation

๐Ÿ˜ Tusk โ€” KeePass Browser Extension

๐Ÿ”’ ๅช่ฏป KeePass ๅฏ†็ ๆ•ฐๆฎๅบ“ๆต่งˆๅ™จ้›†ๆˆ ยท Chrome & Firefox ๅŒๅนณๅฐๆ”ฏๆŒ

Version License CI

Fork ่‡ช subdavis/Tusk,ๅœจๅŽŸๅง‹้กน็›ฎๅŸบ็ก€ไธŠ่ฟ›่กŒไบ†ๅคง้‡ๅŠŸ่ƒฝๅขžๅผบๅ’Œไฝ“้ชŒไผ˜ๅŒ–ใ€‚


๐Ÿ“‹ ็›ฎๅฝ•


โœจ ๅŠŸ่ƒฝ็‰นๆ€ง

ๅŠŸ่ƒฝ ่ฏดๆ˜Ž
๐Ÿ”’ ่‡ชๅŠจ่งฃ้” ๆต่งˆๅ™จๅฏๅŠจๆ—ถ่‡ชๅŠจ่งฃๅฏ†ๆ•ฐๆฎๅบ“,่ฎฐไฝๅฏ†็ ๅŽๆ— ้œ€ๆ‰‹ๅŠจ่พ“ๅ…ฅ
๐Ÿ”ข ๅพฝ็ซ ่ฎกๆ•ฐ ๆ‰ฉๅฑ•ๅ›พๆ ‡ๅณไธŠ่ง’ๅฎžๆ—ถๆ˜พ็คบๅฝ“ๅ‰้กต้ขๅŒน้…็š„ๅฏ†็ ๆก็›ฎๆ•ฐ้‡
โšก ไธ€้”ฎๅกซๅ…… ็‚นๅ‡ปๆก็›ฎๆˆ–ๆŒ‰ๅ›ž่ฝฆ้”ฎๅณๅฏ่‡ชๅŠจๅกซๅ……็”จๆˆทๅๅ’Œๅฏ†็ 
๐Ÿง  ๅˆ†็บงๅŒน้… ็‹ฌๅˆ›็š„ 4 ็บง URL ๅŒน้…็ฎ—ๆณ•,็ฒพๅ‡†ๆŽ’ๅบๆœ€ไฝณๅŒน้…ๆก็›ฎ
โœ๏ธ ็ผ–่พ‘ไฟๅญ˜ ็›ดๆŽฅๅœจๅผน็ช—ไธญ็ผ–่พ‘ๆ ‡้ข˜ใ€็”จๆˆทๅใ€ๅฏ†็ ใ€URLใ€ๅค‡ๆณจ,ไฟๅญ˜ๅ›ž KDBX ๆ–‡ไปถ
๐Ÿ”— ๅค–้ƒจ้“พๆŽฅ ๆฏไธชๆก็›ฎ้ƒฝๆœ‰ไธ€้”ฎๆ‰“ๅผ€ URL ๆŒ‰้’ฎ,ๆ–ฐๆ ‡็ญพ้กต็›ด่พพ็ฝ‘็ซ™
๐ŸชŸ Iframe ๅกซๅ…… ๆ”ฏๆŒ่ทจๅŸŸ iframe ็™ปๅฝ•่กจๅ•(ๅฆ‚้˜ฟ้‡Œไบ‘ใ€้“ถ่กŒ็ญ‰)
๐Ÿ” TOTP ๅŒๅ› ็ด  ๅฎžๆ—ถๆ˜พ็คบ TOTP ๅŠจๆ€้ชŒ่ฏ็ ,ๅธฆๅ€’่ฎกๆ—ถ่ฟ›ๅบฆๆก
๐ŸŒ ไธญๆ–‡ๅ›ฝ้™…ๅŒ– ๅฎŒๆ•ด็š„ไธญๆ–‡็•Œ้ข็ฟป่ฏ‘,่‡ชๅŠจๆฃ€ๆต‹ๆต่งˆๅ™จ่ฏญ่จ€
๐Ÿ”‘ ้šๆœบๅฏ†็ ็”Ÿๆˆ ๆ–ฐๅปบ/็ผ–่พ‘ๆก็›ฎๆ—ถไธ€้”ฎ็”Ÿๆˆ้ซ˜ๅผบๅบฆ้šๆœบๅฏ†็ 
๐Ÿ—๏ธ ๅฏ†้’ฅๆ–‡ไปถๆ”ฏๆŒ ๆ”ฏๆŒ KeePass Keyfile(XML/32 ๅญ—่Š‚/ๅๅ…ญ่ฟ›ๅˆถ/ๅ“ˆๅธŒ),ๅฏไธŽๅฏ†็ ็ป„ๅˆๆˆ–ๅ•็‹ฌไฝฟ็”จ
๐Ÿ”„ ๅคšไบ‘็ซฏๅŒๆญฅ ๆ”ฏๆŒ 8 ็งๅญ˜ๅ‚จๅŽ็ซฏ,่ฆ†็›–ไธปๆตไบ‘ๆœๅŠกๅ’Œ็งๆœ‰้ƒจ็ฝฒ
๐Ÿ“‚ ๅˆ†็ป„็ฎก็† ๅˆ›ๅปบใ€้‡ๅ‘ฝๅใ€ๅˆ ้™คๅˆ†็ป„,ๆก็›ฎๅœจๅˆ†็ป„้—ด่‡ช็”ฑ็งปๅŠจ
๐Ÿ• ้—ๅฟ˜ๅฎšๆ—ถๅ™จ ๅฏ้…็ฝฎๅฏ†็ ่ฎฐๅฟ†ๆ—ถ้•ฟ:30 ๅˆ†้’Ÿ โ†’ ๆฐธไน…,ๅˆฐๆœŸ่‡ชๅŠจๆธ…้™ค
๐Ÿ›ก๏ธ Manifest V3 ๅฎŒๆ•ดๅ…ผๅฎน Chrome MV3,ๅŒๆ—ถๆ”ฏๆŒ Firefox MV2

๐Ÿง  ๆ ธๅฟƒ่ฎพ่ฎก:ๅˆ†็บง URL ๅŒน้…็ญ–็•ฅ

Tusk ็š„ๆ ธๅฟƒ็ซžไบ‰ๅŠ›ๅœจไบŽ4 ็บง URL ๅŒน้…็ฎ—ๆณ•,ๅฎƒๅŒๆ—ถ้ฉฑๅŠจๅพฝ็ซ ่ฎกๆ•ฐๅ’Œ่‡ชๅŠจๅกซๅ……ไผ˜ๅ…ˆๆŽ’ๅบ,็กฎไฟๆœ€็›ธๅ…ณ็š„ๅฏ†็ ๆก็›ฎๅง‹็ปˆๆŽ’ๅœจ็ฌฌไธ€ไฝใ€‚

ๅŒน้…็ญ‰็บง

็บงๅˆซ ๆกไปถ ็คบไพ‹ ๅพ—ๅˆ†
4 ๆก็›ฎ็š„ URL ๅฎŒๆ•ดๅŒ…ๅซๅœจ้กต้ข URL ไธญ ๆก็›ฎ a.com/admin โ†’ ้กต้ข a.com/admin/login 100
3 ๅ่ฎฎ + ไธปๆœบๅ + ็ซฏๅฃๅฎŒๅ…จไธ€่‡ด ๆก็›ฎ https://a.com โ†’ ้กต้ข https://a.com/any 75
2 ็›ธๅŒๅŸŸๅ(ๆœ€ๅŽไธคๆฎต) ๆก็›ฎ a.example.com โ†’ ้กต้ข b.example.com 50
1 ๆญฃๅˆ™่กจ่พพๅผๅŒน้… ๆก็›ฎ regex:login\..*\.com โ†’ ้กต้ข login.test.com 25
0 ๆ— ๅŒน้… ไปปๆ„ไธ็›ธๅ…ณ URL 0

ๅŒน้…ๆต็จ‹

้กต้ข URL โ”€โ”€โ†’ Level 4: ๅŒ…ๅซๅŒน้…? โ”€โ”€โ†’ โœ… ไผ˜ๅ…ˆๅฑ•็คบ
 โ”‚ โ”‚
 โ”‚ โ””โ”€โ”€โ†’ Level 3: ๅŒๆบๅŒน้…? โ”€โ”€โ†’ โœ… ็ฌฌไบŒไผ˜ๅ…ˆ
 โ”‚ โ”‚
 โ”‚ โ””โ”€โ”€โ†’ Level 2: ๅŒๅŸŸๅ? โ”€โ”€โ†’ โœ… ็ฌฌไธ‰ไผ˜ๅ…ˆ
 โ”‚ โ”‚
 โ”‚ โ””โ”€โ”€โ†’ Level 1: ๆญฃๅˆ™ๅŒน้…? โ”€โ”€โ†’ โœ… ๅ…œๅบ•
 โ”‚ โ”‚
 โ”‚ โ””โ”€โ”€โ†’ Level 0: ๆ— ๅŒน้…

ๅพฝ็ซ ่ฎกๆ•ฐ้€ป่พ‘

1. ้ๅކๆ‰€ๆœ‰็ผ“ๅญ˜ๆก็›ฎ,ๅฏนๆฏไธชๆก็›ฎ่ฎก็ฎ—ๆœ€้ซ˜ๅŒน้…็ญ‰็บง
2. ็ปŸ่ฎก่พพๅˆฐๆœ€้ซ˜็ญ‰็บง็š„ๆ‰€ๆœ‰ๆก็›ฎๆ•ฐ้‡
3. ๅœจๆ‰ฉๅฑ•ๅ›พๆ ‡ไธŠๆ˜พ็คบ่ฏฅๆ•ฐๅญ—
4. ๅˆ‡ๆขๆ ‡็ญพ้กตๆ—ถ่‡ชๅŠจๆ›ดๆ–ฐ

ๆญฃๅˆ™่กจ่พพๅผๅŒน้…

ๅœจๆก็›ฎ URL ๅญ—ๆฎตไปฅ regex: ๅ‰็ผ€ๅผ€ๅคดๅณๅฏไฝฟ็”จๆญฃๅˆ™:

regex:login\..*\.com โ†’ ๅŒน้…ๆ‰€ๆœ‰ login.*.com ๅญๅŸŸๅ
regex:10\.0\.\d+\.\d+ โ†’ ๅŒน้…ๆ‰€ๆœ‰ 10.0.x.x ๅ†…็ฝ‘ IP
regex:192\.168\.\d+\.\d+:8080 โ†’ ๅŒน้…็‰นๅฎš็ฝ‘ๆฎตๅ’Œ็ซฏๅฃ

โšก ่‡ชๅŠจๅกซๅ……ๅผ•ๆ“Ž

ไธ‰็ง่งฆๅ‘ๆ–นๅผ

ๆ–นๅผ ๆ“ไฝœ ้€‚็”จๅœบๆ™ฏ
๐Ÿ–ฑ๏ธ ๅผน็ช—็‚นๅ‡ป ๆ‰“ๅผ€ Tusk ๅผน็ช—,็‚นๅ‡ปๆก็›ฎ ๆœ€ๅธธ็”จ,ๅฏๆต่งˆ้€‰ๆ‹ฉ
โŒจ๏ธ ๅฟซๆท้”ฎ Ctrl+Shift+X ๅฟซ้€Ÿๅกซๅ……,ๆ— ้œ€้ผ ๆ ‡
๐ŸŽฏ ๅญ—ๆฎต็บงๅกซๅ…… Ctrl+Shift+1/2/3(้œ€ๆ‰‹ๅŠจ็ป‘ๅฎš) ๅชๅกซๅ……็”จๆˆทๅ/ๅฏ†็ /ๅค‡ๆณจ

ๅญ—ๆฎตๆฃ€ๆต‹็ฎ—ๆณ•

Tusk ไฝฟ็”จๅŒๆ–นๆณ•ๆฃ€ๆต‹ๆฅๅฎšไฝ้กต้ขไธŠ็š„็”จๆˆทๅๅ’Œๅฏ†็ ่พ“ๅ…ฅๆก†:

ๆ–นๆณ•ไธ€:็„ฆ็‚นๆณ•(ไผ˜ๅ…ˆ)

็”จๆˆทๅ…‰ๆ ‡ๆ‰€ๅœจไฝ็ฝฎ โ†’ ๆฃ€ๆต‹็›ธ้‚ป่พ“ๅ…ฅๆก† โ†’ ่ทณ่ฟ‡้š่—/ไธๅฏ่งๅ…ƒ็ด  โ†’ ็ฒพๅ‡†ๅฎšไฝ
  • ๅฆ‚ๆžœ่š็„ฆๅœจ็”จๆˆทๅๆก† โ†’ ๅ‘ๅŽๆœ็ดขๆ‰พๅˆฐ็ฌฌไธ€ไธชๅฏ่ง็š„ type="password" ่พ“ๅ…ฅๆก†
  • ๅฆ‚ๆžœ่š็„ฆๅœจๅฏ†็ ๆก† โ†’ ๅ‘ๅ‰ๆœ็ดขๆ‰พๅˆฐ็ฌฌไธ€ไธชๅฏ่ง็š„้žๅฏ†็ ่พ“ๅ…ฅๆก†
  • ่‡ชๅŠจ่ทณ่ฟ‡ type="hidden" ็ญ‰ไธๅฏ่งๅ…ƒ็ด 

ๆ–นๆณ•ไบŒ:ๅ…จๅฑ€ๆ‰ซๆๆณ•(ๅ…œๅบ•)

้ๅކๆ‰€ๆœ‰ๅฏ่ง input โ†’ ๆŒ‰็ฑปๅž‹้…ๅฏน โ†’ ็”Ÿๆˆ ็”จๆˆทๅ-ๅฏ†็  ๅฏนๅˆ—่กจ
  • ่ฏ†ๅˆซๆณจๅ†Œ่กจๅ•(่ฟž็ปญไธคไธชๅฏ†็ ๆก†)ๅนถ่‡ชๅŠจๆŽ’้™ค
  • ๅค„็†็‹ฌ็ซ‹ๅฏ†็ ๆก†(ๆ— ็”จๆˆทๅ้…ๅฏน็š„ๆƒ…ๅ†ต)

Iframe ่ทจๅŸŸๅกซๅ……

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ไธป้กต้ข (gitee.com) โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ iframe (udesk.cn) โ”‚ โ”‚
โ”‚ โ”‚ [็”จๆˆทๅ] [ๅฏ†็ ] [็™ปๅฝ•] โ”‚ โ”‚ โ† ไนŸ่ƒฝๅกซๅ……!
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • ๅ†…ๅฎน่„šๆœฌๆณจๅ…ฅๅˆฐๆ‰€ๆœ‰ frame
  • ๆฏไธช frame ็‹ฌ็ซ‹่ฟ›่กŒๆฅๆบๅฎ‰ๅ…จๆฃ€ๆŸฅ
  • ็™ฝๅๅ•ๆœบๅˆถ่งฃๅ†ณๅทฒ็Ÿฅ็š„่ทจๅŸŸๅœบๆ™ฏ(ๅฆ‚้“ถ่กŒ็ฝ‘็ซ™)

โ˜๏ธ ไบ‘็ซฏๅญ˜ๅ‚จๆ”ฏๆŒ

Tusk ๆ”ฏๆŒ 8 ็งๅญ˜ๅ‚จๅŽ็ซฏ,่ฆ†็›–ๆ‰€ๆœ‰ไธปๆตๅœบๆ™ฏ:

ๅญ˜ๅ‚จๅŽ็ซฏ ็ฑปๅž‹ ่ฏดๆ˜Ž
๐Ÿ”— WebDAV ็งๆœ‰้ƒจ็ฝฒ ๆ”ฏๆŒๅšๆžœไบ‘็ญ‰ WebDAV ๆœๅŠก,ๆ‰ซๆ็›ฎๅฝ•่‡ชๅŠจๅ‘็Žฐ .kdbx ๆ–‡ไปถ,ๆ”ฏๆŒไธŠไผ ไฟๅญ˜
๐Ÿ“ ๆœฌๅœฐๆ–‡ไปถ ๆต่งˆๅ™จๅญ˜ๅ‚จ ไธŠไผ  .kdbx ๆ–‡ไปถๅˆฐๆต่งˆๅ™จๆœฌๅœฐๅญ˜ๅ‚จ,Base64 ็ผ–็ ๆŒไน…ๅŒ–
๐Ÿ”— ๅ…ฑไบซ้“พๆŽฅ ็›ด้“พ่ฎฟ้—ฎ ้€š่ฟ‡ HTTP/HTTPS ็›ดๆŽฅ้“พๆŽฅ่ฎฟ้—ฎๆ•ฐๆฎๅบ“ๆ–‡ไปถ
๐Ÿ“ฆ ็คบไพ‹ๆ•ฐๆฎๅบ“ ๆผ”็คบ ๅ†…็ฝฎ็คบไพ‹ๆ•ฐๆฎๅบ“(ๅฏ†็  123),ๆ— ้œ€้…็ฝฎๅณๅฏไฝ“้ชŒ
โ˜๏ธ Google Drive OAuth ๆœ็ดข .kdbx ๆ–‡ไปถ,ๆ”ฏๆŒๆ–‡ไปถ้€‰ๆ‹ฉๅ™จๆˆ–็›ดๆŽฅๆœ็ดข
๐Ÿ—‚๏ธ Dropbox OAuth ๆœ็ดข .kdbx ๆ–‡ไปถ,ๆ”ฏๆŒ็›ดๆŽฅไธ‹่ฝฝ
๐Ÿ’ผ OneDrive OAuth ๆœ็ดข .kdbx ๆ–‡ไปถ,ๅฎŒๆ•ด่ทฏๅพ„ๆ˜พ็คบ
๐ŸŒ pCloud OAuth ้€’ๅฝ’ๆœ็ดขๆ‰€ๆœ‰ๆ–‡ไปถๅคน,ๆ”ฏๆŒ็›ดๆŽฅไธ‹่ฝฝ้“พๆŽฅ

้™คไปฅไธŠ 8 ็งๅŽ็ซฏๅค–,OauthManager ้€š็”จๆก†ๆžถๅฏ่ฎฉไฝ ่ฝปๆพๆŽฅๅ…ฅไปปๆ„ OAuth2 ๆœๅŠก,ๅฎž็Žฐ่‡ชๅฎšไน‰ไบ‘็ซฏๅŽ็ซฏใ€‚

ๅญ˜ๅ‚จๅŽ็ซฏๆžถๆž„

PasswordFileStoreRegistry (ๆณจๅ†Œไธญๅฟƒ)
 โ”œโ”€โ”€ LocalChromePasswordFileManager (ๆœฌๅœฐๆ–‡ไปถ)
 โ”œโ”€โ”€ GoogleDrivePasswordFileManager (Google Drive)
 โ”œโ”€โ”€ DropboxFileManager (Dropbox)
 โ”œโ”€โ”€ OneDriveFileManager (OneDrive)
 โ”œโ”€โ”€ PCloudFileManager (pCloud)
 โ”œโ”€โ”€ SharedUrlFileManager (ๅ…ฑไบซ้“พๆŽฅ)
 โ”œโ”€โ”€ SampleDatabaseFileManager (็คบไพ‹ๆ•ฐๆฎๅบ“)
 โ””โ”€โ”€ WebdavFileManager (WebDAV)

ๆ‰€ๆœ‰ๅŽ็ซฏ็ปŸไธ€ๅฎž็Žฐ FileManager ๆŽฅๅฃ,้€š่ฟ‡ PasswordFileStoreRegistry ๆณจๅ†Œๅ’Œ่ฐƒๅบฆใ€‚


๐Ÿ” ๅฎ‰ๅ…จ่ฎพ่ฎก

ๅŠ ๅฏ†ๅญ˜ๅ‚จ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” AES-CBC โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๆ˜Žๆ–‡ๆ•ฐๆฎ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ โ”‚ chrome.storage โ”‚
โ”‚ (ๅฏ†็ /ๆก็›ฎ) โ”‚ 256-bit key โ”‚ (ๅŠ ๅฏ†ๆ€) โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • ไฝฟ็”จ AES-CBC 256 ไฝๅŠ ๅฏ†ๅญ˜ๅ‚จๅœจ chrome.storage.session ๆˆ– chrome.storage.local
  • ๅฏ†้’ฅๅœจ่ฟ่กŒๆ—ถ้€š่ฟ‡ Web Crypto API ็”Ÿๆˆ,ไธ่ฝ็›˜
  • ่‡ชๅฎšไน‰ๅบๅˆ—ๅŒ–ๅ่ฎฎๅค„็†ไบŒ่ฟ›ๅˆถๆ•ฐๆฎ(ArrayBuffer โ†’ Base64)

ๅŒๅฑ‚่ฎฐๅฟ†็ณป็ปŸ

ๅญ˜ๅ‚จๅฑ‚ ๅญ˜ๅ‚จไป‹่ดจ ็”Ÿๅ‘ฝๅ‘จๆœŸ ็”จ้€”
Session ๅฑ‚ storage.session ๆต่งˆๅ™จไผš่ฏ ไธดๆ—ถ็ผ“ๅญ˜,ไผš่ฏ็ป“ๆŸ่‡ชๅŠจๆธ…้™ค
Local ๅฑ‚ storage.local ๆŒไน…ๅŒ– "ๆฐธไน…่ฎฐไฝ"ๆจกๅผ,่ทจๆต่งˆๅ™จ้‡ๅฏ

้—ๅฟ˜ๅฎšๆ—ถๅ™จ

่ฎฐไฝๆ—ถ้•ฟ: [ไธ่ฎฐไฝ] [30ๅˆ†้’Ÿ] [2ๅฐๆ—ถ] [4ๅฐๆ—ถ] [8ๅฐๆ—ถ] [24ๅฐๆ—ถ] [ๆœฌๆฌกไผš่ฏ] [ๆฐธไน…]
 โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’
  • ๅˆฐๆœŸๅŽ่‡ชๅŠจๆธ…้™คไธปๅฏ†็ ๅ’Œ็ผ“ๅญ˜็š„ๆก็›ฎๆ•ฐๆฎ
  • ๆฏ 2 ๅˆ†้’Ÿๆฃ€ๆŸฅไธ€ๆฌก่ฟ‡ๆœŸๅฎšๆ—ถๅ™จ
  • ๆ”ฏๆŒๅฏ†็ ่ฟ‡ๆœŸใ€ๅ‰ช่ดดๆฟ่ฟ‡ๆœŸไธค็ง้€š็Ÿฅ็ฑปๅž‹

ๅฎ‰ๅ…จๅŽŸๅˆ™

  • ๐Ÿ”’ ไธปๅฏ†็ ๅชๅœจๅ†…ๅญ˜ไธญ่งฃๅฏ†,ไธๆŒไน…ๅŒ–ๆ˜Žๆ–‡
  • ๐Ÿšซ ไธๅœจๆŽงๅˆถๅฐ่พ“ๅ‡บๆ•ๆ„Ÿไฟกๆฏ
  • โœ… ๅช่ฏปๆจกๅผ,ไธไฟฎๆ”นๅŽŸๅง‹ KDBX ๆ–‡ไปถ(้™ค้ž็”จๆˆทไธปๅŠจ็ผ–่พ‘ไฟๅญ˜)
  • ๐Ÿ›ก๏ธ ๆฅๆบๆฃ€ๆŸฅ:ๅกซๅ……ๅ‰้ชŒ่ฏ frame ไธŽ็›ฎๆ ‡้กต้ข็š„ hostname ไธ€่‡ดๆ€ง

ๅฏ†้’ฅๆ–‡ไปถ (Keyfile)

  • ๆ”ฏๆŒ KeePass ๅ…จ้ƒจๅ››็ง Keyfile ๆ ผๅผ:XML(ๆŽจ่)ใ€32 ๅญ—่Š‚ใ€ๅๅ…ญ่ฟ›ๅˆถใ€ๅ“ˆๅธŒ
  • ๅฏ†้’ฅๆ–‡ไปถๅฏไธŽไธปๅฏ†็ ็ป„ๅˆไฝฟ็”จ,ไนŸๅฏๅ•็‹ฌไฝœไธบ่ฎค่ฏๆ–นๅผ
  • ๅฏ†้’ฅๆ–‡ไปถๅญ˜ๅ‚จๅœจๆต่งˆๅ™จๆœฌๅœฐๅญ˜ๅ‚จไธญ,็ฝ‘็ซ™ไธŽๅ…ถไป–ๆ‰ฉๅฑ•ๆ— ๆณ•่ฎฟ้—ฎ

๐Ÿ—„๏ธ ๆ•ฐๆฎๅบ“็ฎก็†

ๆก็›ฎๆ“ไฝœ

ๆ“ไฝœ ่ฏดๆ˜Ž
โž• ๆ–ฐๅปบ ๅกซๅ†™ๆ ‡้ข˜ใ€็”จๆˆทๅใ€ๅฏ†็ ใ€URLใ€ๅค‡ๆณจ,้€‰ๆ‹ฉๅˆ†็ป„
โœ๏ธ ็ผ–่พ‘ ็‚นๅ‡ป้“…็ฌ”ๅ›พๆ ‡,ไฟฎๆ”นไปปๆ„ๅญ—ๆฎต,็‚นๅ‡ปไฟๅญ˜
๐Ÿ—‘๏ธ ๅˆ ้™ค ไบŒๆฌก็กฎ่ฎค้˜ฒ่ฏฏๅˆ ,ๅˆ ้™คๅŽ่‡ชๅŠจไธŠไผ ๆ›ดๆ–ฐ
๐Ÿ“‹ ๅคๅˆถ ไธ€้”ฎๅคๅˆถ็”จๆˆทๅๆˆ–ๅฏ†็ ๅˆฐๅ‰ช่ดดๆฟ
๐Ÿ”— ๆ‰“ๅผ€ ็‚นๅ‡ปๅœฐ็ƒๅ›พๆ ‡,ๆ–ฐๆ ‡็ญพ้กตๆ‰“ๅผ€ๆก็›ฎ URL
๐Ÿ”‘ ็”Ÿๆˆๅฏ†็  ็ผ–่พ‘ๆ—ถ็‚นๅ‡ป้’ฅๅŒ™ๅ›พๆ ‡,็”Ÿๆˆ 16-20 ไฝๆททๅˆๅฏ†็ 

ๅˆ†็ป„็ฎก็†

๐Ÿ“ ็คพไบค
 โ”œโ”€โ”€ ๐Ÿ”‘ Twitter
 โ”œโ”€โ”€ ๐Ÿ”‘ Facebook
 โ””โ”€โ”€ ๐Ÿ”‘ Instagram
๐Ÿ“ ๅทฅไฝœ
 โ”œโ”€โ”€ ๐Ÿ”‘ ๅ…ฌๅธ้‚ฎ็ฎฑ
 โ”œโ”€โ”€ ๐Ÿ”‘ ๅ†…้ƒจ็ณป็ปŸ
 โ””โ”€โ”€ ๐Ÿ”‘ VPN
๐Ÿ“ ้“ถ่กŒ
 โ”œโ”€โ”€ ๐Ÿ”‘ ๅทฅๅ•†้“ถ่กŒ
 โ””โ”€โ”€ ๐Ÿ”‘ ๆ‹›ๅ•†้“ถ่กŒ
  • ๅˆ›ๅปบ / ้‡ๅ‘ฝๅ / ๅˆ ้™คๅˆ†็ป„
  • ๆก็›ฎๅœจๅˆ†็ป„้—ด่‡ช็”ฑ็งปๅŠจ
  • ๆ ‘ๅฝข็ป“ๆž„ๆต่งˆ,ๆ”ฏๆŒๅฑ•ๅผ€/ๆŠ˜ๅ 

TOTP ๅŒๅ› ็ด ่ฎค่ฏ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ๐Ÿ” ้ชŒ่ฏ็ : 482 391 โ”‚
โ”‚ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘ 18s โ”‚
โ”‚ (ๅ€’่ฎกๆ—ถ่ฟ›ๅบฆๆก) โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  • ๆ”ฏๆŒ otpauth:// ๆ ‡ๅ‡†ๆ ผๅผ
  • ๅ…ผๅฎน KeePassXC ็š„ tOTPSeed + tOTPSettings ๆ ผๅผ
  • ๆ”ฏๆŒ SHA1 / SHA256 / SHA512 ็ฎ—ๆณ•
  • 6-8 ไฝ้ชŒ่ฏ็ ,ๅซ Steam ๆ ผๅผ
  • ๆฏ็ง’่‡ชๅŠจๅˆทๆ–ฐ,็ปฟ่‰ฒ่ฟ›ๅบฆๆกๅฏ่ง†ๅŒ–ๅ€’่ฎกๆ—ถ

โŒจ๏ธ ้”ฎ็›˜ๅฟซๆท้”ฎ

ๅฟซๆท้”ฎ ๅ‘ฝไปค ่ฏดๆ˜Ž
Ctrl+Shift+Space ๆ‰“ๅผ€ๅผน็ช— ๆ‰“ๅผ€ Tusk ๅผน็ช—
Ctrl+Shift+X ๆœ€ไฝณๅŒน้…ๅกซๅ…… ่‡ชๅŠจๅกซๅ……ๅฝ“ๅ‰้กต้ขๆœ€ไฝณๅŒน้…ๆก็›ฎ
Ctrl+Shift+1(้œ€ๆ‰‹ๅŠจ็ป‘ๅฎš) ๅกซๅ……็”จๆˆทๅ ไป…ๅกซๅ……็”จๆˆทๅๅˆฐๅฝ“ๅ‰็„ฆ็‚น่พ“ๅ…ฅๆก†
Ctrl+Shift+2(้œ€ๆ‰‹ๅŠจ็ป‘ๅฎš) ๅกซๅ……ๅฏ†็  ไป…ๅกซๅ……ๅฏ†็ ๅˆฐๅฝ“ๅ‰็„ฆ็‚น่พ“ๅ…ฅๆก†
Ctrl+Shift+3(้œ€ๆ‰‹ๅŠจ็ป‘ๅฎš) ๅกซๅ……ๅค‡ๆณจ ไป…ๅกซๅ……ๅค‡ๆณจๅˆฐๅฝ“ๅ‰็„ฆ็‚น่พ“ๅ…ฅๆก†

ๅฟซๆท้”ฎๅฏๅœจ Chrome ๆ‰ฉๅฑ•็ฎก็†้กต้ข chrome://extensions/shortcuts ่‡ชๅฎšไน‰ใ€‚ๅ…ถไธญ Ctrl+Shift+1/2/3 ้ป˜่ฎคๆœช็ป‘ๅฎš,้œ€ๆ‰‹ๅŠจ่ฎพ็ฝฎใ€‚


๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

ๅฎ‰่ฃ…

  1. ไปŽ Releases ไธ‹่ฝฝๆœ€ๆ–ฐ็‰ˆๆœฌ
  2. ่งฃๅŽ‹ๅˆฐๆœฌๅœฐ็›ฎๅฝ•
  3. ๆ‰“ๅผ€ chrome://extensions,ๅผ€ๅฏใ€Œๅผ€ๅ‘่€…ๆจกๅผใ€
  4. ็‚นๅ‡ปใ€ŒๅŠ ่ฝฝๅทฒ่งฃๅŽ‹็š„ๆ‰ฉๅฑ•็จ‹ๅบใ€,้€‰ๆ‹ฉ่งฃๅŽ‹็›ฎๅฝ•

ๅผ€ๅ‘

# ๅ…‹้š†ไป“ๅบ“
git clone https://github.com/helloworldbugs/Tusk.git
cd Tusk
# ๅฎ‰่ฃ…ไพ่ต–
npm install --legacy-peer-deps
# ๅผ€ๅ‘ๆจกๅผ(็ƒญ้‡่ฝฝ)
npm run dev
# ็”Ÿไบงๆž„ๅปบ
npm run build
# ไป…ๆž„ๅปบๅ†…ๅฎน่„šๆœฌ
npm run build:js
# ไป…ๆž„ๅปบๅŽๅฐ่„šๆœฌ
npm run build:background

ๆž„ๅปบไบง็‰ฉ

ๅ‘ฝไปค ่พ“ๅ…ฅ ่พ“ๅ‡บ
build:web src/ (Vue ๅผน็ช—/้€‰้กน้กต) extension/dist/
build:background background/background.js extension/dist/background/index.mjs
build:js background/inject.js (ๅ†…ๅฎน่„šๆœฌ) extension/dist/contentScripts/index.global.js

๐Ÿ—๏ธ ๆŠ€ๆœฏๆ ˆ

ๆŠ€ๆœฏ ็”จ้€”
Vue 3 (@vue/compat) ๅผน็ช— UI ๆก†ๆžถ
Vite ๆž„ๅปบๅทฅๅ…ท
kdbxweb KeePass ๆ•ฐๆฎๅบ“่งฃๆž
Argon2 KDF ๅฏ†้’ฅๆดพ็”Ÿ
webdav WebDAV ๅฎขๆˆท็ซฏ
Chrome Extensions API ๆต่งˆๅ™จๆ‰ฉๅฑ• API
GitHub Actions CI/CD ่‡ชๅŠจๆž„ๅปบ

๐Ÿ“ ๆžถๆž„ๆฆ‚่งˆ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Popup (Vue 3) โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ Startup โ”‚ โ”‚FilePickerโ”‚ โ”‚ Unlock โ”‚ โ”‚ Edit โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ UnlockedState โ”‚
โ”‚ (็Šถๆ€็ฎก็† + ๅ‰ช่ดดๆฟ + ่‡ชๅŠจๅกซๅ……) โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ SecureCacheMemory โ”‚
โ”‚ (็ซฏๅฃ้€šไฟกๆกฅๆŽฅ popup โ†” background) โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Background Service Worker โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ProtectedMemory โ”‚ Settings โ”‚ Badge ๆ›ดๆ–ฐ โ”‚ โ”‚
โ”‚ โ”‚ (AES-CBC ๅŠ ๅฏ†) โ”‚ (้…็ฝฎ) โ”‚ (ๅ›พๆ ‡่ฎกๆ•ฐ) โ”‚ โ”‚
โ”‚ โ”‚ LocalMemory โ”‚ โ”‚ ๅฟซๆท้”ฎๅค„็† โ”‚ โ”‚
โ”‚ โ”‚ (ๆŒไน…ๅŒ–ๅŠ ๅฏ†) โ”‚ โ”‚ ไผš่ฏ็ฎก็† โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Content Script (inject.js) โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ๅญ—ๆฎตๆฃ€ๆต‹ โ”‚ fillPassword โ”‚ ๆฅๆบๅฎ‰ๅ…จๆฃ€ๆŸฅ โ”‚ โ”‚
โ”‚ โ”‚ (็„ฆ็‚นๆณ•+ โ”‚ (ๅ€ผๅกซๅ……+ โ”‚ (hostname โ”‚ โ”‚
โ”‚ โ”‚ ๅ…จๅฑ€ๆ‰ซๆ) โ”‚ DOMไบ‹ไปถ่งฆๅ‘) โ”‚ ้ชŒ่ฏ) โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Services โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ Keepass โ”‚ โ”‚ Keepass โ”‚ โ”‚ PasswordFileStoreโ”‚ โ”‚
โ”‚ โ”‚ Service โ”‚ โ”‚ Reference โ”‚ โ”‚ Registry (8ๅŽ็ซฏ) โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ๆ•ฐๆฎๆต

็”จๆˆท็‚นๅ‡ปๆก็›ฎ
 โ”‚
 โ–ผ
UnlockedState.autofill(entry)
 โ”‚
 โ–ผ
Background: autofill ๆถˆๆฏ
 โ”‚
 โ”œโ”€โ”€โ†’ ๆณจๅ…ฅ content script ๅˆฐๆ‰€ๆœ‰ frame
 โ”‚
 โ””โ”€โ”€โ†’ ๅ‘ๆฏไธช frame ๅ‘้€ fillPassword
 โ”‚
 โ”œโ”€โ”€ ๆฅๆบๅฎ‰ๅ…จๆฃ€ๆŸฅ (hostname ๅŒน้…)
 โ”‚
 โ””โ”€โ”€ filler.fillPassword(user, pass)
 โ”‚
 โ”œโ”€โ”€ ๆ–นๆณ•1: ็„ฆ็‚นๆณ• (ไผ˜ๅ…ˆ)
 โ”‚ โ””โ”€โ”€ ่ทณ่ฟ‡้š่—ๅ…ƒ็ด ,ๆœ็ดข็œŸๆญฃ็š„ๅฏ†็ ๆก†
 โ”‚
 โ””โ”€โ”€ ๆ–นๆณ•2: ๅ…จๅฑ€ๆ‰ซๆ (ๅ…œๅบ•)
 โ””โ”€โ”€ ้ๅކๆ‰€ๆœ‰ๅฏ่ง input,้…ๅฏนๅกซๅ……

๐Ÿงช ๆต‹่ฏ•

โš ๏ธ ๅฝ“ๅ‰ tests/ ็›ฎๅฝ•ไธ‹็š„ๆต‹่ฏ•ไธบๅŽŸ AngularJS ไปฃ็ ๅบ“้—็•™,ๅฐšๆœช่ฟ็งปๅˆฐ็Žฐๆœ‰ Vue 3 + Vite ๆŠ€ๆœฏๆ ˆ,ไธ” package.json ๆœช้…็ฝฎ test ่„šๆœฌ,ๆš‚ๆ— ๆณ•้€š่ฟ‡ npm test ่ฟ่กŒใ€‚ๆต‹่ฏ•ๅŸบ็ก€่ฎพๆ–ฝๆœ‰ๅพ…ๅฎŒๅ–„(่ฎกๅˆ’ๆŽฅๅ…ฅ Vitest)ใ€‚


๐Ÿ™ ่‡ด่ฐข


Made with โค๏ธ by the Tusk community

About

๐Ÿ˜ ๐Ÿ”’ KeePass-compatible browser extension for filling passwords.

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

AltStyle ใซใ‚ˆใฃใฆๅค‰ๆ›ใ•ใ‚ŒใŸใƒšใƒผใ‚ธ (->ใ‚ชใƒชใ‚ธใƒŠใƒซ) /