From cdf839bcc8ad5731582c4f8588c4aea7b697494e Mon Sep 17 00:00:00 2001 From: naskya Date: Mon, 16 Oct 2023 17:05:32 +0000 Subject: [PATCH] Remove integrations --- docs/api-change.md | 18 + locales/ar-SA.yml | 3 - locales/bn-BD.yml | 3 - locales/ca-ES.yml | 3 - locales/cs-CZ.yml | 3 - locales/de-DE.yml | 3 - locales/el-GR.yml | 3 - locales/en-US.yml | 3 - locales/es-ES.yml | 3 - locales/fi.yml | 3 - locales/fr-FR.yml | 3 - locales/id-ID.yml | 3 - locales/it-IT.yml | 3 - locales/ja-JP.yml | 3 - locales/ja-KS.yml | 3 - locales/kab-KAB.yml | 1 - locales/ko-KR.yml | 3 - locales/nl-NL.yml | 3 - locales/no-NO.yml | 3 - locales/pl-PL.yml | 3 - locales/pt-PT.yml | 3 - locales/ro-RO.yml | 3 - locales/ru-RU.yml | 3 - locales/sk-SK.yml | 3 - locales/sv-SE.yml | 3 - locales/th-TH.yml | 3 - locales/tr-TR.yml | 3 - locales/uk-UA.yml | 3 - locales/vi-VN.yml | 3 - locales/zh-CN.yml | 3 - locales/zh-TW.yml | 3 - packages/backend/assets/robots.txt | 16 +- .../backend/native-utils/migration/src/lib.rs | 2 + .../m20231002_143323_remove_integrations.rs | 117 ++++++ .../native-utils/src/model/entity/meta.rs | 18 - .../src/model/entity/user_profile.rs | 2 - packages/backend/package.json | 1 - packages/backend/src/models/entities/meta.ts | 51 --- .../src/models/entities/user-profile.ts | 5 - .../backend/src/models/repositories/user.ts | 1 - packages/backend/src/models/schema/user.ts | 5 - .../src/remote/activitypub/models/person.ts | 50 +-- .../src/server/api/endpoints/admin/meta.ts | 54 --- .../server/api/endpoints/admin/show-user.ts | 8 - .../server/api/endpoints/admin/update-meta.ts | 45 --- .../backend/src/server/api/endpoints/meta.ts | 37 -- packages/backend/src/server/api/index.ts | 7 - .../backend/src/server/api/service/discord.ts | 333 ------------------ .../backend/src/server/api/service/github.ts | 296 ---------------- .../backend/src/server/api/service/twitter.ts | 226 ------------ packages/client/src/components/MkSignin.vue | 35 -- packages/client/src/pages/admin/index.vue | 8 - .../src/pages/admin/integrations.discord.vue | 70 ---- .../src/pages/admin/integrations.github.vue | 70 ---- .../client/src/pages/admin/integrations.vue | 68 ---- packages/client/src/pages/settings/index.vue | 6 - .../client/src/pages/settings/integration.vue | 118 ------- packages/client/src/router.ts | 10 - pnpm-lock.yaml | 3 - 59 files changed, 156 insertions(+), 1612 deletions(-) create mode 100644 packages/backend/native-utils/migration/src/m20231002_143323_remove_integrations.rs delete mode 100644 packages/backend/src/server/api/service/discord.ts delete mode 100644 packages/backend/src/server/api/service/github.ts delete mode 100644 packages/backend/src/server/api/service/twitter.ts delete mode 100644 packages/client/src/pages/admin/integrations.discord.vue delete mode 100644 packages/client/src/pages/admin/integrations.github.vue delete mode 100644 packages/client/src/pages/admin/integrations.vue delete mode 100644 packages/client/src/pages/settings/integration.vue diff --git a/docs/api-change.md b/docs/api-change.md index da170cfa0..28087428d 100644 --- a/docs/api-change.md +++ b/docs/api-change.md @@ -4,6 +4,24 @@ Breaking changes are indicated by the :warning: icon. ## v1.0.5 (unreleased) +### dev18 + +- :warning: response of `meta` no longer includes the following: + - `enableTwitterIntegration` + - `enableGithubIntegration` + - `enableDiscordIntegration` +- :warning: parameter of `admin/update-meta` and response of `admin/meta` no longer include the following: + - `enableTwitterIntegration` + - `enableGithubIntegration` + - `enableDiscordIntegration` + - `twitterConsumerKey` + - `twitterConsumerSecret` + - `githubClientId` + - `githubClientSecret` + - `discordClientId` + - `discordClientSecret` +- :warning: response of `admin/show-user` no longer includes `integrations`. + ### dev17 - Added `lang` parameter to `notes/create` and `notes/edit`. diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml index e1701e9c9..e64bc95e7 100644 --- a/locales/ar-SA.yml +++ b/locales/ar-SA.yml @@ -312,9 +312,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "الصفحات" -integration: "التكامل" -connectService: "اتصل" -disconnectService: "اقطع الاتصال" enableLocalTimeline: "تفعيل الخيط المحلي" enableGlobalTimeline: "تفعيل الخيط الزمني الشامل" disablingTimelinesInfo: "سيتمكن المديرون والمشرفون من الوصول إلى كل الخيوط الزمنية حتى وإن لم تفعّل." diff --git a/locales/bn-BD.yml b/locales/bn-BD.yml index abafc4953..10472516d 100644 --- a/locales/bn-BD.yml +++ b/locales/bn-BD.yml @@ -316,9 +316,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "পৃষ্ঠা" -integration: "ইন্টিগ্রেশন" -connectService: "সংযুক্ত করুন" -disconnectService: "সংযোগ বিচ্ছিন্ন করুন" enableLocalTimeline: "স্থানীয় টাইমলাইন চালু করুন" enableGlobalTimeline: "গ্লোবাল টাইমলাইন চালু করুন" disablingTimelinesInfo: "আপনি এই টাইমলাইনগুলি বন্ধ করলেও প্রশাসক এবং মডারেটররা এই টাইমলাইনগুলি ব্যাবহার করতে পারবে" diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml index e04c7a667..341b66cb3 100644 --- a/locales/ca-ES.yml +++ b/locales/ca-ES.yml @@ -944,7 +944,6 @@ dayX: '{day}' tosUrl: URL de les Condicions d'ús thisYear: Any thisMonth: Mes -integration: Integracions driveCapacityPerRemoteAccount: Capacitat del Disc per usuari remot inMb: En megabytes iconUrl: Adreça URL de la icona @@ -1036,8 +1035,6 @@ accept: Accepta reject: Rebutja yearX: '{year}' pages: Pàgines -disconnectService: Desconnectar -connectService: Connectar enableLocalTimeline: Activa la línea de temps local enableRecommendedTimeline: Activa la línea de temps de recomanacions pinnedClipId: ID del clip que vols fixar diff --git a/locales/cs-CZ.yml b/locales/cs-CZ.yml index a92f414c4..4fa113353 100644 --- a/locales/cs-CZ.yml +++ b/locales/cs-CZ.yml @@ -310,9 +310,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Stránky" -integration: "Integrace" -connectService: "Připojit" -disconnectService: "Odpojit" enableLocalTimeline: "Povolit lokální čas" enableGlobalTimeline: "Povolit globální čas" registration: "Registrace" diff --git a/locales/de-DE.yml b/locales/de-DE.yml index c9eeb3405..9521870fd 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -350,9 +350,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Nutzer-Seiten" -integration: "Integration" -connectService: "Verbinden" -disconnectService: "Trennen" enableLocalTimeline: "Local-Timeline aktivieren" enableGlobalTimeline: "Global-Timeline aktivieren" disablingTimelinesInfo: "Administratoren und Moderatoren haben immer Zugriff auf alle diff --git a/locales/el-GR.yml b/locales/el-GR.yml index 68556cb38..5f9f370ef 100644 --- a/locales/el-GR.yml +++ b/locales/el-GR.yml @@ -215,8 +215,6 @@ thisMonth: "Μήνας" today: "Σήμερα" dayX: "{day}" pages: "Σελίδες" -connectService: "Σύνδεση" -disconnectService: "Αποσύνδεση" registration: "Εγγραφή" pinnedPages: "Καρφιτσωμένες Σελίδες" pinnedNotes: "Καρφιτσωμένες δημοσιεύσεις" @@ -730,7 +728,6 @@ lightThemes: Φωτεινά θέματα darkThemes: Σκοτεινά θέματα inputNewFolderName: Πληκτρολογήστε ένα νέο όνομα φακέλου hasChildFilesOrFolders: Εφόσον αυτός ο φάκελος δεν είναι άδειος, δεν μπορεί να διαγραφεί. -integration: Ενσωματώσεις enableRecommendedTimeline: Ενεργοποίηση χρονολογίου προτεινόμενων driveCapacityPerLocalAccount: Μέγεθος Αποθηκευτικού Χώρου ανά τοπικό μέλος driveCapacityPerRemoteAccount: Μέγεθος Αποθηκευτικού Χώρου ανά απομακρυσμένο μέλος diff --git a/locales/en-US.yml b/locales/en-US.yml index ae04dd25e..df9d85a5a 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -371,9 +371,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Pages" -integration: "Integrations" -connectService: "Connect" -disconnectService: "Disconnect" enableLocalTimeline: "Enable local timeline" enableGlobalTimeline: "Enable global timeline" enableRecommendedTimeline: "Enable recommended timeline" diff --git a/locales/es-ES.yml b/locales/es-ES.yml index 9c8c83a22..442fec1e3 100644 --- a/locales/es-ES.yml +++ b/locales/es-ES.yml @@ -340,9 +340,6 @@ dayX: "Día {day}" monthX: "Mes {month}" yearX: "Año {year}" pages: "Páginas" -integration: "Integraciones" -connectService: "Conectar" -disconnectService: "Desconectar" enableLocalTimeline: "Habilitar linea de tiempo local" enableGlobalTimeline: "Habilitar linea de tiempo global" disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia diff --git a/locales/fi.yml b/locales/fi.yml index c4bd16ed2..7ccfb32f4 100644 --- a/locales/fi.yml +++ b/locales/fi.yml @@ -339,8 +339,6 @@ instanceName: Instanssin nimi thisMonth: Kuukausi today: Tänään monthX: '{month}' -connectService: Yhdistä -disconnectService: Katkaise yhteys enableLocalTimeline: Ota käyttöön paikallinen aikajana enableGlobalTimeline: Ota käyttöön globaali aikajana enableRecommendedTimeline: Ota käyttöön suositellut -aikajana @@ -385,7 +383,6 @@ disablingTimelinesInfo: Järjestelmänvalvojilla ja moderaattoreilla on aina pä dayX: '{day}' yearX: '{year}' pages: Sivut -integration: Integraatiot instanceDescription: Instanssin kuvaus invite: Kutsu iconUrl: Ikoni URL-linkki diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml index d7cdd0da7..9cd2d1e3c 100644 --- a/locales/fr-FR.yml +++ b/locales/fr-FR.yml @@ -341,9 +341,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Pages" -integration: "Intégrations" -connectService: "Connexion" -disconnectService: "Déconnexion" enableLocalTimeline: "Activer le fil local" enableGlobalTimeline: "Activer le fil global" disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur·rice·s diff --git a/locales/id-ID.yml b/locales/id-ID.yml index 2a995c231..9bd99d40c 100644 --- a/locales/id-ID.yml +++ b/locales/id-ID.yml @@ -342,9 +342,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Halaman" -integration: "Integrasi" -connectService: "Sambungkan" -disconnectService: "Putuskan" enableLocalTimeline: "Nyalakan linimasa lokal" enableGlobalTimeline: "Nyalakan linimasa global" disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa diff --git a/locales/it-IT.yml b/locales/it-IT.yml index 360f15560..dc9da6dc7 100644 --- a/locales/it-IT.yml +++ b/locales/it-IT.yml @@ -331,9 +331,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Pagine" -integration: "Integrazioni" -connectService: "Connetti" -disconnectService: "Disconnetti" enableLocalTimeline: "Abilita timeline locale" enableGlobalTimeline: "Abilita timeline federata" disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 6f22c9d41..5b6653a32 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -334,9 +334,6 @@ dayX: "{day}日" monthX: "{month}月" yearX: "{year}年" pages: "ページ" -integration: "連携" -connectService: "接続する" -disconnectService: "切断する" enableLocalTimeline: "ローカルタイムラインを有効にする" enableGlobalTimeline: "グローバルタイムラインを有効にする" enableRecommendedTimeline: "おすすめタイムラインを有効にする" diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml index 7db8a4f4a..c76808436 100644 --- a/locales/ja-KS.yml +++ b/locales/ja-KS.yml @@ -317,9 +317,6 @@ dayX: "{day}日" monthX: "{month}月" yearX: "{year}年" pages: "ページ" -integration: "連携" -connectService: "つなげるで" -disconnectService: "切るで" enableLocalTimeline: "ローカルタイムラインを使えるようにする" enableGlobalTimeline: "グローバルタイムラインを使えるようにする" disablingTimelinesInfo: "ここらへんのタイムラインを使えんようにしてしもても、管理者とモデレーターは使えるままになってるで、そうやなかったら不便やからな。" diff --git a/locales/kab-KAB.yml b/locales/kab-KAB.yml index 29eca64c7..410133fca 100644 --- a/locales/kab-KAB.yml +++ b/locales/kab-KAB.yml @@ -36,7 +36,6 @@ selectList: "Fren tabdart" youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart" security: "Taɣellist" remove: "Kkes" -connectService: "Qqen" userList: "Tibdarin" securityKey: "Tasarutt n tɣellist" securityKeyName: "Isem n tsarutt" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index f2e2d57b9..c27077b17 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -323,9 +323,6 @@ dayX: "{day}일" monthX: "{month}월" yearX: "{year}년" pages: "페이지" -integration: "연동" -connectService: "계정 연동" -disconnectService: "계정 연동 해제" enableLocalTimeline: "로컬 타임라인 활성화" enableGlobalTimeline: "글로벌 타임라인 활성화" disablingTimelinesInfo: "특정 타임라인을 비활성화하더라도 관리자 및 모더레이터는 계속 사용할 수 있습니다." diff --git a/locales/nl-NL.yml b/locales/nl-NL.yml index 8e195c73c..a797a98c2 100644 --- a/locales/nl-NL.yml +++ b/locales/nl-NL.yml @@ -483,8 +483,6 @@ accept: Accepteren reject: Afwijzen normal: Normaal pages: Pagina's -integration: Integraties -connectService: Koppelen monthX: '{month}' yearX: '{year}' instanceName: Servernaam @@ -492,7 +490,6 @@ instanceDescription: Server omschrijving maintainerName: Onderhouder maintainerEmail: Onderhouder email tosUrl: Algemene Voorwaarden URL -disconnectService: Ontkoppelen unread: Ongelezen manageGroups: Beheer groepen subscribePushNotification: Pushmeldingen inschakelen diff --git a/locales/no-NO.yml b/locales/no-NO.yml index fbe8904b9..0fe80ad4d 100644 --- a/locales/no-NO.yml +++ b/locales/no-NO.yml @@ -225,8 +225,6 @@ instanceDescription: Tjenerbeskrivelse maintainerName: Administrator maintainerEmail: Administrator-epost monthX: '{month}' -connectService: Koble til -disconnectService: Koble fra enableLocalTimeline: Aktiver lokal tidslinje enableRegistration: Tillat registrering av nye brukere invite: Inviter @@ -449,7 +447,6 @@ watch: Følg med på thisMonth: Måned today: I dag dayX: '{day}' -integration: Integrasjoner yearX: '{year}' pages: Sider enableRecaptcha: Slå på reCAPTCHA diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml index e0af7d72e..5b83762cd 100644 --- a/locales/pl-PL.yml +++ b/locales/pl-PL.yml @@ -331,9 +331,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Strony" -integration: "Integracje" -connectService: "Połącz" -disconnectService: "Rozłącz" enableLocalTimeline: "Włącz lokalną oś czasu" enableGlobalTimeline: "Włącz globalną oś czasu" disablingTimelinesInfo: "Administratorzy i moderatorzy będą zawsze mieć dostęp do diff --git a/locales/pt-PT.yml b/locales/pt-PT.yml index 9df04022b..cb5ebabdc 100644 --- a/locales/pt-PT.yml +++ b/locales/pt-PT.yml @@ -339,9 +339,6 @@ dayX: " Dia {day}" monthX: "mês de {month}" yearX: "Ano {year}" pages: "Páginas" -integration: "Integração" -connectService: "Conectar" -disconnectService: "Desconectar" enableLocalTimeline: "Ativar linha do tempo local" enableGlobalTimeline: "Ativar linha do tempo global" disablingTimelinesInfo: "Se você desabilitar essas linhas do tempo, administradores diff --git a/locales/ro-RO.yml b/locales/ro-RO.yml index e9fa49f6c..51c7b3081 100644 --- a/locales/ro-RO.yml +++ b/locales/ro-RO.yml @@ -316,9 +316,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Pagini" -integration: "Integrare" -connectService: "Conectează" -disconnectService: "Deconectează" enableLocalTimeline: "Activează cronologia locală" enableGlobalTimeline: "Activeaza cronologia globală" disablingTimelinesInfo: "Administratorii și Moderatorii vor avea mereu access la toate cronologiile, chiar dacă nu sunt activate." diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml index fada843e7..7b9a24e2c 100644 --- a/locales/ru-RU.yml +++ b/locales/ru-RU.yml @@ -335,9 +335,6 @@ dayX: "{day} день" monthX: "{month} месяц" yearX: "{year} год" pages: "Страницы" -integration: "Интеграции" -connectService: "Подключиться" -disconnectService: "Отключиться" enableLocalTimeline: "Включить локальную ленту" enableGlobalTimeline: "Включить глобальную ленту" disablingTimelinesInfo: "У администраторов и модераторов есть доступ ко всем лентам, diff --git a/locales/sk-SK.yml b/locales/sk-SK.yml index cdf0c807d..70609220b 100644 --- a/locales/sk-SK.yml +++ b/locales/sk-SK.yml @@ -317,9 +317,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Stránky" -integration: "Integrácia" -connectService: "Pripojiť" -disconnectService: "Odpojiť" enableLocalTimeline: "Povoliť lokálnu časovú os" enableGlobalTimeline: "Povoliť globálnu časovú os" disablingTimelinesInfo: "Administrátori a moderátori majú vždy prístup ku všetkým časovým osiam, aj keď sú vypnuté." diff --git a/locales/sv-SE.yml b/locales/sv-SE.yml index 6c28196f1..7541467d2 100644 --- a/locales/sv-SE.yml +++ b/locales/sv-SE.yml @@ -365,8 +365,6 @@ today: Idag dayX: '{day}' monthX: '{month}' yearX: '{year}' -connectService: Anslut -disconnectService: Bortkoppla enableLocalTimeline: Anslut till lokal tidslinje invite: Bjud in driveCapacityPerLocalAccount: Enhetens kapacitet per lokal användare @@ -779,7 +777,6 @@ serverLogs: Serverloggar deleteAll: Radera alla removeAllFollowing: Sluta följa alla följda användare medium: Mellan -integration: Integreringar xl: XL desktop: Skrivbord createNew: Skapa nya diff --git a/locales/th-TH.yml b/locales/th-TH.yml index 4d34471ca..8f3e2595e 100644 --- a/locales/th-TH.yml +++ b/locales/th-TH.yml @@ -327,9 +327,6 @@ dayX: "{วัน}" monthX: "{เดือน}" yearX: "{ปี}" pages: "หน้า" -integration: "รวบรวม" -connectService: "เชื่อมต่อ" -disconnectService: "ตัดการเชื่อมต่อ" enableLocalTimeline: "เปิดใช้งานไทม์ไลน์ในพื้นที่" enableGlobalTimeline: "เปิดใช้งานไทม์ไลน์ทั่วโลก" disablingTimelinesInfo: "ผู้ดูแลระบบและผู้ควบคุมจะสามารถเข้าถึงไทม์ไลน์ทั้งหมด ถึงแม้ว่าจะไม่ได้เปิดใช้งานก็ตาม" diff --git a/locales/tr-TR.yml b/locales/tr-TR.yml index 6b18bc35f..5e71dea26 100644 --- a/locales/tr-TR.yml +++ b/locales/tr-TR.yml @@ -760,7 +760,6 @@ banner: Banner nsfw: NSFW doNothing: Görmezden Gel watch: İzle -connectService: Bağlan registration: Kayıt hcaptcha: hCaptcha pinnedNotes: Sabitlenmiş gönderiler @@ -885,7 +884,6 @@ deleteFolder: Bu klasörü sil addFile: Dosya ekle dayX: '{day}' enableLocalTimeline: Yerel zaman çizgisini aktif et -disconnectService: Bağlantıyı kes enableGlobalTimeline: Global zaman çizgisini aktif et enableRegistration: Yeni kullanıcı kaydını aktif et invite: Davet et @@ -1206,7 +1204,6 @@ location: Konum registeredDate: Katılım tarihi yearX: '{year}' pages: Sayfalar -integration: Entegrasyonlar antennasDesc: "Antenler, belirlediğiniz kriterlere uyan yeni gönderiler görüntüler!\n  Zaman çizelgeleri sayfasından erişilebilirler." notesAndReplies: Gönderiler ve yanıtlar diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml index f1c9dab4b..701078ce6 100644 --- a/locales/uk-UA.yml +++ b/locales/uk-UA.yml @@ -336,9 +336,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Сторінки" -integration: "Інтеграції" -connectService: "Під’єднати" -disconnectService: "Відключитися" enableLocalTimeline: "Увімкнути локальну стрічку" enableGlobalTimeline: "Увімкнути глобальну стрічку" disablingTimelinesInfo: "Адміністратори та модератори завжди мають доступ до всіх diff --git a/locales/vi-VN.yml b/locales/vi-VN.yml index 297be51e1..23af18e72 100644 --- a/locales/vi-VN.yml +++ b/locales/vi-VN.yml @@ -338,9 +338,6 @@ dayX: "{day}" monthX: "{month}" yearX: "{year}" pages: "Trang" -integration: "Tương tác" -connectService: "Kết nối" -disconnectService: "Ngắt kết nối" enableLocalTimeline: "Bật bảng tin máy chủ" enableGlobalTimeline: "Bật bảng tin liên hợp" disablingTimelinesInfo: "Quản trị viên và Kiểm duyệt viên luôn có quyền truy cập mọi diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml index 42834e28b..31ce5fb36 100644 --- a/locales/zh-CN.yml +++ b/locales/zh-CN.yml @@ -321,9 +321,6 @@ dayX: "{day} 日" monthX: "{month} 月" yearX: "{year} 年" pages: "页面" -integration: "整合" -connectService: "连接" -disconnectService: "断开连接" enableLocalTimeline: "启用本地时间线功能" enableGlobalTimeline: "启用全局时间线" disablingTimelinesInfo: "管理员和监察员将始终拥有对所有时间线的访问权,即使它们没有被启用。" diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml index 0eaf79f7b..d02e18d78 100644 --- a/locales/zh-TW.yml +++ b/locales/zh-TW.yml @@ -320,9 +320,6 @@ dayX: "{day}日" monthX: "{month}月" yearX: "{year}年" pages: "頁面" -integration: "整合" -connectService: "己連結" -disconnectService: "己斷開" enableLocalTimeline: "開啟本地時間軸" enableGlobalTimeline: "啟用公開時間軸" disablingTimelinesInfo: "即使您關閉了時間軸功能,管理員和板主仍可訪問所有的時間軸。" diff --git a/packages/backend/assets/robots.txt b/packages/backend/assets/robots.txt index dc17e04e3..cedb5b6cf 100644 --- a/packages/backend/assets/robots.txt +++ b/packages/backend/assets/robots.txt @@ -1,4 +1,14 @@ -user-agent: * -allow: / +User-agent: * +Allow: / -# todo: sitemap +# Uncomment the following to block CommonCrawl +# +# User-agent: CCBot +# User-agent: CCBot/2.0 +# User-agent: CCBot/3.1 +# Disallow: / + +# Uncomment the following to block ChatGPT +# +# User-agent: GPTBot +# Disallow: / diff --git a/packages/backend/native-utils/migration/src/lib.rs b/packages/backend/native-utils/migration/src/lib.rs index f8be136f4..a0f8fc85b 100644 --- a/packages/backend/native-utils/migration/src/lib.rs +++ b/packages/backend/native-utils/migration/src/lib.rs @@ -7,6 +7,7 @@ mod m20230627_185451_index_note_url; mod m20230709_000510_move_antenna_to_cache; mod m20230806_170616_fix_antenna_stream_ids; mod m20230904_013244_is_indexable; +mod m20231002_143323_remove_integrations; pub struct Migrator; @@ -19,6 +20,7 @@ impl MigratorTrait for Migrator { Box::new(m20230709_000510_move_antenna_to_cache::Migration), Box::new(m20230806_170616_fix_antenna_stream_ids::Migration), Box::new(m20230904_013244_is_indexable::Migration), + Box::new(m20231002_143323_remove_integrations::Migration), ] } } diff --git a/packages/backend/native-utils/migration/src/m20231002_143323_remove_integrations.rs b/packages/backend/native-utils/migration/src/m20231002_143323_remove_integrations.rs new file mode 100644 index 000000000..a8ef8fdbb --- /dev/null +++ b/packages/backend/native-utils/migration/src/m20231002_143323_remove_integrations.rs @@ -0,0 +1,117 @@ +use sea_orm_migration::prelude::*; + +#[derive(DeriveMigrationName)] +pub struct Migration; + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(UserProfile::Table) + .drop_column(UserProfile::Integrations) + .to_owned(), + ) + .await?; + + manager + .alter_table( + Table::alter() + .table(Meta::Table) + .drop_column(Meta::EnableTwitterIntegration) + .drop_column(Meta::TwitterConsumerKey) + .drop_column(Meta::TwitterConsumerSecret) + .drop_column(Meta::EnableGithubIntegration) + .drop_column(Meta::GithubClientId) + .drop_column(Meta::GithubClientSecret) + .drop_column(Meta::EnableDiscordIntegration) + .drop_column(Meta::DiscordClientId) + .drop_column(Meta::DiscordClientSecret) + .to_owned(), + ) + .await?; + + Ok(()) + } + + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .alter_table( + Table::alter() + .table(Meta::Table) + .add_column(ColumnDef::new(Meta::DiscordClientSecret).string()) + .add_column(ColumnDef::new(Meta::DiscordClientId).string()) + .add_column( + ColumnDef::new(Meta::EnableDiscordIntegration) + .boolean() + .not_null() + .default(false), + ) + .add_column(ColumnDef::new(Meta::GithubClientSecret).string()) + .add_column(ColumnDef::new(Meta::GithubClientId).string()) + .add_column( + ColumnDef::new(Meta::EnableGithubIntegration) + .boolean() + .not_null() + .default(false), + ) + .add_column(ColumnDef::new(Meta::TwitterConsumerSecret).string()) + .add_column(ColumnDef::new(Meta::TwitterConsumerKey).string()) + .add_column( + ColumnDef::new(Meta::EnableTwitterIntegration) + .boolean() + .not_null() + .default(false), + ) + .to_owned(), + ) + .await?; + + manager + .alter_table( + Table::alter() + .table(UserProfile::Table) + .add_column( + ColumnDef::new(UserProfile::Integrations) + .json() + .default("{}"), + ) + .to_owned(), + ) + .await?; + + Ok(()) + } +} + +#[derive(Iden)] + +enum UserProfile { + Table, + #[iden = "integrations"] + Integrations, +} + +#[derive(Iden)] +enum Meta { + Table, + #[iden = "enableTwitterIntegration"] + EnableTwitterIntegration, + #[iden = "twitterConsumerKey"] + TwitterConsumerKey, + #[iden = "twitterConsumerSecret"] + TwitterConsumerSecret, + #[iden = "enableGithubIntegration"] + EnableGithubIntegration, + #[iden = "githubClientId"] + GithubClientId, + #[iden = "githubClientSecret"] + GithubClientSecret, + #[iden = "enableDiscordIntegration"] + EnableDiscordIntegration, + #[iden = "discordClientId"] + DiscordClientId, + #[iden = "discordClientSecret"] + DiscordClientSecret, +} diff --git a/packages/backend/native-utils/src/model/entity/meta.rs b/packages/backend/native-utils/src/model/entity/meta.rs index ac43a7842..3d203a015 100644 --- a/packages/backend/native-utils/src/model/entity/meta.rs +++ b/packages/backend/native-utils/src/model/entity/meta.rs @@ -71,24 +71,6 @@ pub struct Model { pub sw_public_key: Option, #[sea_orm(column_name = "swPrivateKey")] pub sw_private_key: Option, - #[sea_orm(column_name = "enableTwitterIntegration")] - pub enable_twitter_integration: bool, - #[sea_orm(column_name = "twitterConsumerKey")] - pub twitter_consumer_key: Option, - #[sea_orm(column_name = "twitterConsumerSecret")] - pub twitter_consumer_secret: Option, - #[sea_orm(column_name = "enableGithubIntegration")] - pub enable_github_integration: bool, - #[sea_orm(column_name = "githubClientId")] - pub github_client_id: Option, - #[sea_orm(column_name = "githubClientSecret")] - pub github_client_secret: Option, - #[sea_orm(column_name = "enableDiscordIntegration")] - pub enable_discord_integration: bool, - #[sea_orm(column_name = "discordClientId")] - pub discord_client_id: Option, - #[sea_orm(column_name = "discordClientSecret")] - pub discord_client_secret: Option, #[sea_orm(column_name = "pinnedUsers")] pub pinned_users: StringVec, #[sea_orm(column_name = "ToSUrl")] diff --git a/packages/backend/native-utils/src/model/entity/user_profile.rs b/packages/backend/native-utils/src/model/entity/user_profile.rs index 5fd09dea3..2da562ed7 100644 --- a/packages/backend/native-utils/src/model/entity/user_profile.rs +++ b/packages/backend/native-utils/src/model/entity/user_profile.rs @@ -46,8 +46,6 @@ pub struct Model { pub pinned_page_id: Option, #[sea_orm(column_type = "JsonBinary")] pub room: Json, - #[sea_orm(column_type = "JsonBinary")] - pub integrations: Json, #[sea_orm(column_name = "injectFeaturedNote")] pub inject_featured_note: bool, #[sea_orm(column_name = "enableWordMute")] diff --git a/packages/backend/package.json b/packages/backend/package.json index 26920a151..2a84da576 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -98,7 +98,6 @@ "node-fetch": "3.3.2", "nodemailer": "6.9.4", "nsfwjs": "2.4.2", - "oauth": "^0.10.0", "opencc-js": "^1.0.5", "os-utils": "0.0.14", "otpauth": "^9.1.4", diff --git a/packages/backend/src/models/entities/meta.ts b/packages/backend/src/models/entities/meta.ts index 6a19cdde7..90dff4066 100644 --- a/packages/backend/src/models/entities/meta.ts +++ b/packages/backend/src/models/entities/meta.ts @@ -354,57 +354,6 @@ export class Meta { }) public swPrivateKey: string | null; - @Column("boolean", { - default: false, - }) - public enableTwitterIntegration: boolean; - - @Column("varchar", { - length: 128, - nullable: true, - }) - public twitterConsumerKey: string | null; - - @Column("varchar", { - length: 128, - nullable: true, - }) - public twitterConsumerSecret: string | null; - - @Column("boolean", { - default: false, - }) - public enableGithubIntegration: boolean; - - @Column("varchar", { - length: 128, - nullable: true, - }) - public githubClientId: string | null; - - @Column("varchar", { - length: 128, - nullable: true, - }) - public githubClientSecret: string | null; - - @Column("boolean", { - default: false, - }) - public enableDiscordIntegration: boolean; - - @Column("varchar", { - length: 128, - nullable: true, - }) - public discordClientId: string | null; - - @Column("varchar", { - length: 128, - nullable: true, - }) - public discordClientSecret: string | null; - @Column("varchar", { length: 128, nullable: true, diff --git a/packages/backend/src/models/entities/user-profile.ts b/packages/backend/src/models/entities/user-profile.ts index 0b8863867..a4c2e0975 100644 --- a/packages/backend/src/models/entities/user-profile.ts +++ b/packages/backend/src/models/entities/user-profile.ts @@ -215,11 +215,6 @@ export class UserProfile { @JoinColumn() public pinnedPage: Page | null; - @Column("jsonb", { - default: {}, - }) - public integrations: Record; - @Index() @Column("boolean", { default: false, diff --git a/packages/backend/src/models/repositories/user.ts b/packages/backend/src/models/repositories/user.ts index 86bef413b..e4284f935 100644 --- a/packages/backend/src/models/repositories/user.ts +++ b/packages/backend/src/models/repositories/user.ts @@ -565,7 +565,6 @@ export const UserRepository = db.getRepository(User).extend({ hasUnreadNotification: this.getHasUnreadNotification(user.id), hasPendingReceivedFollowRequest: this.getHasPendingReceivedFollowRequest(user.id), - integrations: profile!.integrations, mutedWords: profile!.mutedWords, mutedInstances: profile!.mutedInstances, mutingNotificationTypes: profile!.mutingNotificationTypes, diff --git a/packages/backend/src/models/schema/user.ts b/packages/backend/src/models/schema/user.ts index 61c20a898..955011101 100644 --- a/packages/backend/src/models/schema/user.ts +++ b/packages/backend/src/models/schema/user.ts @@ -459,11 +459,6 @@ export const packedMeDetailedOnlySchema = { nullable: false, optional: false, }, - integrations: { - type: "object", - nullable: true, - optional: false, - }, mutedWords: { type: "array", nullable: false, diff --git a/packages/backend/src/remote/activitypub/models/person.ts b/packages/backend/src/remote/activitypub/models/person.ts index 15925b8b0..1db90ad7f 100644 --- a/packages/backend/src/remote/activitypub/models/person.ts +++ b/packages/backend/src/remote/activitypub/models/person.ts @@ -185,7 +185,7 @@ export async function createPerson( const host = toPuny(new URL(object.id).hostname); - const { fields } = analyzeAttachments(person.attachment || []); + const fields = analyzeAttachments(person.attachment || []); const tags = extractApHashtags(person.tag) .map((tag) => normalizeForSearch(tag)) @@ -642,39 +642,6 @@ export async function resolvePerson( return await createPerson(uri, resolver); } -const services: { - [x: string]: (id: string, username: string) => any; -} = { - "misskey:authentication:twitter": (userId, screenName) => ({ - userId, - screenName, - }), - "misskey:authentication:github": (id, login) => ({ id, login }), - "misskey:authentication:discord": (id, name) => $discord(id, name), -}; - -const $discord = (id: string, name: string) => { - if (typeof name !== "string") { - name = "unknown#0000"; - } - const [username, discriminator] = name.split("#"); - return { id, username, discriminator }; -}; - -function addService(target: { [x: string]: any }, source: IApPropertyValue) { - const service = services[source.name]; - - if (typeof source.value !== "string") { - source.value = "unknown"; - } - - const [id, username] = source.value.split("@"); - - if (service) { - target[source.name.split(":")[2]] = service(id, username); - } -} - export function analyzeAttachments( attachments: IObject | IObject[] | undefined, ) { @@ -682,22 +649,17 @@ export function analyzeAttachments( name: string; value: string; }[] = []; - const services: { [x: string]: any } = {}; if (Array.isArray(attachments)) { for (const attachment of attachments.filter(isPropertyValue)) { - if (isPropertyValue(attachment.identifier)) { - addService(services, attachment.identifier); - } else { - fields.push({ - name: attachment.name, - value: fromHtml(attachment.value), - }); - } + fields.push({ + name: attachment.name, + value: fromHtml(attachment.value), + }); } } - return { fields, services }; + return fields; } export async function updateFeatured(userId: User["id"], resolver?: Resolver) { diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts index 15f2c9660..2a0a7cfbb 100644 --- a/packages/backend/src/server/api/endpoints/admin/meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/meta.ts @@ -170,21 +170,6 @@ export const meta = { optional: false, nullable: false, }, - enableTwitterIntegration: { - type: "boolean", - optional: false, - nullable: false, - }, - enableGithubIntegration: { - type: "boolean", - optional: false, - nullable: false, - }, - enableDiscordIntegration: { - type: "boolean", - optional: false, - nullable: false, - }, enableServiceWorker: { type: "boolean", optional: false, @@ -326,36 +311,6 @@ export const meta = { nullable: true, format: "id", }, - twitterConsumerKey: { - type: "string", - optional: true, - nullable: true, - }, - twitterConsumerSecret: { - type: "string", - optional: true, - nullable: true, - }, - githubClientId: { - type: "string", - optional: true, - nullable: true, - }, - githubClientSecret: { - type: "string", - optional: true, - nullable: true, - }, - discordClientId: { - type: "string", - optional: true, - nullable: true, - }, - discordClientSecret: { - type: "string", - optional: true, - nullable: true, - }, summaryProxy: { type: "string", optional: true, @@ -544,9 +499,6 @@ export default define(meta, paramDef, async (ps, me) => { defaultLightTheme: instance.defaultLightTheme, defaultDarkTheme: instance.defaultDarkTheme, enableEmail: instance.enableEmail, - enableTwitterIntegration: instance.enableTwitterIntegration, - enableGithubIntegration: instance.enableGithubIntegration, - enableDiscordIntegration: instance.enableDiscordIntegration, enableServiceWorker: instance.enableServiceWorker, translatorAvailable: instance.deeplAuthKey != null || instance.libreTranslateApiUrl != null, @@ -573,12 +525,6 @@ export default define(meta, paramDef, async (ps, me) => { enableSensitiveMediaDetectionForVideos: instance.enableSensitiveMediaDetectionForVideos, proxyAccountId: instance.proxyAccountId, - twitterConsumerKey: instance.twitterConsumerKey, - twitterConsumerSecret: instance.twitterConsumerSecret, - githubClientId: instance.githubClientId, - githubClientSecret: instance.githubClientSecret, - discordClientId: instance.discordClientId, - discordClientSecret: instance.discordClientSecret, summalyProxy: instance.summalyProxy, email: instance.email, smtpSecure: instance.smtpSecure, diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts index 3c3a0913d..cbc86a5c1 100644 --- a/packages/backend/src/server/api/endpoints/admin/show-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts @@ -46,13 +46,6 @@ export default define(meta, paramDef, async (ps, me) => { }; } - const maskedKeys = ["accessToken", "accessTokenSecret", "refreshToken"]; - Object.keys(profile.integrations).forEach((integration) => { - maskedKeys.forEach( - (key) => (profile.integrations[integration][key] = ""), - ); - }); - const signins = await Signins.findBy({ userId: user.id }); return { @@ -67,7 +60,6 @@ export default define(meta, paramDef, async (ps, me) => { carefulBot: profile.carefulBot, injectFeaturedNote: profile.injectFeaturedNote, receiveAnnouncementEmail: profile.receiveAnnouncementEmail, - integrations: profile.integrations, mutedWords: profile.mutedWords, mutedInstances: profile.mutedInstances, mutingNotificationTypes: profile.mutingNotificationTypes, diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts index 2142c7df7..00a472ed3 100644 --- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts +++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts @@ -132,15 +132,6 @@ export const paramDef = { deeplIsPro: { type: "boolean" }, libreTranslateApiUrl: { type: "string", nullable: true }, libreTranslateApiKey: { type: "string", nullable: true }, - enableTwitterIntegration: { type: "boolean" }, - twitterConsumerKey: { type: "string", nullable: true }, - twitterConsumerSecret: { type: "string", nullable: true }, - enableGithubIntegration: { type: "boolean" }, - githubClientId: { type: "string", nullable: true }, - githubClientSecret: { type: "string", nullable: true }, - enableDiscordIntegration: { type: "boolean" }, - discordClientId: { type: "string", nullable: true }, - discordClientSecret: { type: "string", nullable: true }, enableEmail: { type: "boolean" }, email: { type: "string", nullable: true }, smtpSecure: { type: "boolean" }, @@ -395,42 +386,6 @@ export default define(meta, paramDef, async (ps, me) => { set.summalyProxy = ps.summalyProxy; } - if (ps.enableTwitterIntegration !== undefined) { - set.enableTwitterIntegration = ps.enableTwitterIntegration; - } - - if (ps.twitterConsumerKey !== undefined) { - set.twitterConsumerKey = ps.twitterConsumerKey; - } - - if (ps.twitterConsumerSecret !== undefined) { - set.twitterConsumerSecret = ps.twitterConsumerSecret; - } - - if (ps.enableGithubIntegration !== undefined) { - set.enableGithubIntegration = ps.enableGithubIntegration; - } - - if (ps.githubClientId !== undefined) { - set.githubClientId = ps.githubClientId; - } - - if (ps.githubClientSecret !== undefined) { - set.githubClientSecret = ps.githubClientSecret; - } - - if (ps.enableDiscordIntegration !== undefined) { - set.enableDiscordIntegration = ps.enableDiscordIntegration; - } - - if (ps.discordClientId !== undefined) { - set.discordClientId = ps.discordClientId; - } - - if (ps.discordClientSecret !== undefined) { - set.discordClientSecret = ps.discordClientSecret; - } - if (ps.enableEmail !== undefined) { set.enableEmail = ps.enableEmail; } diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts index 29a0e7a1a..8c521fcff 100644 --- a/packages/backend/src/server/api/endpoints/meta.ts +++ b/packages/backend/src/server/api/endpoints/meta.ts @@ -268,21 +268,6 @@ export const meta = { optional: false, nullable: false, }, - enableTwitterIntegration: { - type: "boolean", - optional: false, - nullable: false, - }, - enableGithubIntegration: { - type: "boolean", - optional: false, - nullable: false, - }, - enableDiscordIntegration: { - type: "boolean", - optional: false, - nullable: false, - }, enableServiceWorker: { type: "boolean", optional: false, @@ -343,21 +328,6 @@ export const meta = { optional: false, nullable: false, }, - twitter: { - type: "boolean", - optional: false, - nullable: false, - }, - github: { - type: "boolean", - optional: false, - nullable: false, - }, - discord: { - type: "boolean", - optional: false, - nullable: false, - }, serviceWorker: { type: "boolean", optional: false, @@ -493,10 +463,6 @@ export default define(meta, paramDef, async (ps, me) => { })), enableEmail: instance.enableEmail, - enableTwitterIntegration: instance.enableTwitterIntegration, - enableGithubIntegration: instance.enableGithubIntegration, - enableDiscordIntegration: instance.enableDiscordIntegration, - enableServiceWorker: instance.enableServiceWorker, translatorAvailable: @@ -539,9 +505,6 @@ export default define(meta, paramDef, async (ps, me) => { hcaptcha: instance.enableHcaptcha, recaptcha: instance.enableRecaptcha, objectStorage: instance.useObjectStorage, - twitter: instance.enableTwitterIntegration, - github: instance.enableGithubIntegration, - discord: instance.enableDiscordIntegration, serviceWorker: instance.enableServiceWorker, postEditing: true, postImports: instance.experimentalFeatures?.postImports || false, diff --git a/packages/backend/src/server/api/index.ts b/packages/backend/src/server/api/index.ts index 9e8c45886..bf617f06f 100644 --- a/packages/backend/src/server/api/index.ts +++ b/packages/backend/src/server/api/index.ts @@ -21,9 +21,6 @@ import signup from "./private/signup.js"; import signin from "./private/signin.js"; import signupPending from "./private/signup-pending.js"; import verifyEmail from "./private/verify-email.js"; -import discord from "./service/discord.js"; -import github from "./service/github.js"; -import twitter from "./service/twitter.js"; import { koaBody } from "koa-body"; import { convertId, @@ -181,10 +178,6 @@ router.post("/signin", signin); router.post("/signup-pending", signupPending); router.post("/verify-email", verifyEmail); -router.use(discord.routes()); -router.use(github.routes()); -router.use(twitter.routes()); - router.post("/miauth/:session/check", async (ctx) => { const token = await AccessTokens.findOneBy({ session: ctx.params.session, diff --git a/packages/backend/src/server/api/service/discord.ts b/packages/backend/src/server/api/service/discord.ts deleted file mode 100644 index 848a70d4a..000000000 --- a/packages/backend/src/server/api/service/discord.ts +++ /dev/null @@ -1,333 +0,0 @@ -import type Koa from "koa"; -import Router from "@koa/router"; -import { OAuth2 } from "oauth"; -import { v4 as uuid } from "uuid"; -import { IsNull } from "typeorm"; -import { getJson } from "@/misc/fetch.js"; -import config from "@/config/index.js"; -import { publishMainStream } from "@/services/stream.js"; -import { fetchMeta } from "@/misc/fetch-meta.js"; -import { Users, UserProfiles } from "@/models/index.js"; -import type { ILocalUser } from "@/models/entities/user.js"; -import { redisClient } from "../../../db/redis.js"; -import signin from "../common/signin.js"; - -function getUserToken(ctx: Koa.BaseContext): string | null { - return ((ctx.headers["cookie"] || "").match(/igi=(\w+)/) || [null, null])[1]; -} - -function compareOrigin(ctx: Koa.BaseContext): boolean { - function normalizeUrl(url?: string): string { - return url ? (url.endsWith("/") ? url.slice(0, url.length - 1) : url) : ""; - } - - const referer = ctx.headers["referer"]; - - return normalizeUrl(referer) === normalizeUrl(config.url); -} - -// Init router -const router = new Router(); - -router.get("/disconnect/discord", async (ctx) => { - if (!compareOrigin(ctx)) { - ctx.throw(400, "invalid origin"); - return; - } - - const userToken = getUserToken(ctx); - if (!userToken) { - ctx.throw(400, "signin required"); - return; - } - - const user = await Users.findOneByOrFail({ - host: IsNull(), - token: userToken, - }); - - const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); - - profile.integrations.discord = undefined; - - await UserProfiles.update(user.id, { - integrations: profile.integrations, - }); - - ctx.body = "Discordの連携を解除しました :v:"; - - // Publish i updated event - publishMainStream( - user.id, - "meUpdated", - await Users.pack(user, user, { - detail: true, - includeSecrets: true, - }), - ); -}); - -async function getOAuth2() { - const meta = await fetchMeta(true); - - if (meta.enableDiscordIntegration) { - return new OAuth2( - meta.discordClientId!, - meta.discordClientSecret!, - "https://discord.com/", - "api/oauth2/authorize", - "api/oauth2/token", - ); - } else { - return null; - } -} - -router.get("/connect/discord", async (ctx) => { - if (!compareOrigin(ctx)) { - ctx.throw(400, "invalid origin"); - return; - } - - const userToken = getUserToken(ctx); - if (!userToken) { - ctx.throw(400, "signin required"); - return; - } - - const params = { - redirect_uri: `${config.url}/api/dc/cb`, - scope: ["identify"], - state: uuid(), - response_type: "code", - }; - - redisClient.set(userToken, JSON.stringify(params)); - - const oauth2 = await getOAuth2(); - ctx.redirect(oauth2!.getAuthorizeUrl(params)); -}); - -router.get("/signin/discord", async (ctx) => { - const sessid = uuid(); - - const params = { - redirect_uri: `${config.url}/api/dc/cb`, - scope: ["identify"], - state: uuid(), - response_type: "code", - }; - - ctx.cookies.set("signin_with_discord_sid", sessid, { - path: "/", - secure: config.url.startsWith("https"), - httpOnly: true, - }); - - redisClient.set(sessid, JSON.stringify(params)); - - const oauth2 = await getOAuth2(); - ctx.redirect(oauth2!.getAuthorizeUrl(params)); -}); - -router.get("/dc/cb", async (ctx) => { - const userToken = getUserToken(ctx); - - const oauth2 = await getOAuth2(); - - if (!userToken) { - const sessid = ctx.cookies.get("signin_with_discord_sid"); - - if (!sessid) { - ctx.throw(400, "invalid session"); - return; - } - - const code = ctx.query.code; - - if (!code || typeof code !== "string") { - ctx.throw(400, "invalid session"); - return; - } - - const { redirect_uri, state } = await new Promise((res, rej) => { - redisClient.get(sessid, async (_, state) => { - res(JSON.parse(state)); - }); - }); - - if (ctx.query.state !== state) { - ctx.throw(400, "invalid session"); - return; - } - - const { accessToken, refreshToken, expiresDate } = await new Promise( - (res, rej) => - oauth2!.getOAuthAccessToken( - code, - { - grant_type: "authorization_code", - redirect_uri, - }, - (err, accessToken, refreshToken, result) => { - if (err) { - rej(err); - } else if (result.error) { - rej(result.error); - } else { - res({ - accessToken, - refreshToken, - expiresDate: Date.now() + Number(result.expires_in) * 1000, - }); - } - }, - ), - ); - - const { id, username, discriminator } = (await getJson( - "https://discord.com/api/users/@me", - "*/*", - 10 * 1000, - { - Authorization: `Bearer ${accessToken}`, - }, - )) as Record; - - if ( - typeof id !== "string" || - typeof username !== "string" || - typeof discriminator !== "string" - ) { - ctx.throw(400, "invalid session"); - return; - } - - const profile = await UserProfiles.createQueryBuilder() - .where("\"integrations\"->'discord'->>'id' = :id", { id: id }) - .andWhere('"userHost" IS NULL') - .getOne(); - - if (profile == null) { - ctx.throw( - 404, - `@${username}#${discriminator}と連携しているMisskeyアカウントはありませんでした...`, - ); - return; - } - - await UserProfiles.update(profile.userId, { - integrations: { - ...profile.integrations, - discord: { - id: id, - accessToken: accessToken, - refreshToken: refreshToken, - expiresDate: expiresDate, - username: username, - discriminator: discriminator, - }, - }, - }); - - signin( - ctx, - (await Users.findOneBy({ id: profile.userId })) as ILocalUser, - true, - ); - } else { - const code = ctx.query.code; - - if (!code || typeof code !== "string") { - ctx.throw(400, "invalid session"); - return; - } - - const { redirect_uri, state } = await new Promise((res, rej) => { - redisClient.get(userToken, async (_, state) => { - res(JSON.parse(state)); - }); - }); - - if (ctx.query.state !== state) { - ctx.throw(400, "invalid session"); - return; - } - - const { accessToken, refreshToken, expiresDate } = await new Promise( - (res, rej) => - oauth2!.getOAuthAccessToken( - code, - { - grant_type: "authorization_code", - redirect_uri, - }, - (err, accessToken, refreshToken, result) => { - if (err) { - rej(err); - } else if (result.error) { - rej(result.error); - } else { - res({ - accessToken, - refreshToken, - expiresDate: Date.now() + Number(result.expires_in) * 1000, - }); - } - }, - ), - ); - - const { id, username, discriminator } = (await getJson( - "https://discord.com/api/users/@me", - "*/*", - 10 * 1000, - { - Authorization: `Bearer ${accessToken}`, - }, - )) as Record; - if ( - typeof id !== "string" || - typeof username !== "string" || - typeof discriminator !== "string" - ) { - ctx.throw(400, "invalid session"); - return; - } - - const user = await Users.findOneByOrFail({ - host: IsNull(), - token: userToken, - }); - - const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); - - await UserProfiles.update(user.id, { - integrations: { - ...profile.integrations, - discord: { - accessToken: accessToken, - refreshToken: refreshToken, - expiresDate: expiresDate, - id: id, - username: username, - discriminator: discriminator, - }, - }, - }); - - ctx.body = `Discord: @${username}#${discriminator} を、Misskey: @${user.username} に接続しました!`; - - // Publish i updated event - publishMainStream( - user.id, - "meUpdated", - await Users.pack(user, user, { - detail: true, - includeSecrets: true, - }), - ); - } -}); - -export default router; diff --git a/packages/backend/src/server/api/service/github.ts b/packages/backend/src/server/api/service/github.ts deleted file mode 100644 index fd015fb8a..000000000 --- a/packages/backend/src/server/api/service/github.ts +++ /dev/null @@ -1,296 +0,0 @@ -import type Koa from "koa"; -import Router from "@koa/router"; -import { OAuth2 } from "oauth"; -import { v4 as uuid } from "uuid"; -import { IsNull } from "typeorm"; -import { getJson } from "@/misc/fetch.js"; -import config from "@/config/index.js"; -import { publishMainStream } from "@/services/stream.js"; -import { fetchMeta } from "@/misc/fetch-meta.js"; -import { Users, UserProfiles } from "@/models/index.js"; -import type { ILocalUser } from "@/models/entities/user.js"; -import { redisClient } from "../../../db/redis.js"; -import signin from "../common/signin.js"; - -function getUserToken(ctx: Koa.BaseContext): string | null { - return ((ctx.headers["cookie"] || "").match(/igi=(\w+)/) || [null, null])[1]; -} - -function compareOrigin(ctx: Koa.BaseContext): boolean { - function normalizeUrl(url?: string): string { - return url ? (url.endsWith("/") ? url.slice(0, url.length - 1) : url) : ""; - } - - const referer = ctx.headers["referer"]; - - return normalizeUrl(referer) === normalizeUrl(config.url); -} - -// Init router -const router = new Router(); - -router.get("/disconnect/github", async (ctx) => { - if (!compareOrigin(ctx)) { - ctx.throw(400, "invalid origin"); - return; - } - - const userToken = getUserToken(ctx); - if (!userToken) { - ctx.throw(400, "signin required"); - return; - } - - const user = await Users.findOneByOrFail({ - host: IsNull(), - token: userToken, - }); - - const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); - - profile.integrations.github = undefined; - - await UserProfiles.update(user.id, { - integrations: profile.integrations, - }); - - ctx.body = "GitHubの連携を解除しました :v:"; - - // Publish i updated event - publishMainStream( - user.id, - "meUpdated", - await Users.pack(user, user, { - detail: true, - includeSecrets: true, - }), - ); -}); - -async function getOath2() { - const meta = await fetchMeta(true); - - if ( - meta.enableGithubIntegration && - meta.githubClientId && - meta.githubClientSecret - ) { - return new OAuth2( - meta.githubClientId, - meta.githubClientSecret, - "https://github.com/", - "login/oauth/authorize", - "login/oauth/access_token", - ); - } else { - return null; - } -} - -router.get("/connect/github", async (ctx) => { - if (!compareOrigin(ctx)) { - ctx.throw(400, "invalid origin"); - return; - } - - const userToken = getUserToken(ctx); - if (!userToken) { - ctx.throw(400, "signin required"); - return; - } - - const params = { - redirect_uri: `${config.url}/api/gh/cb`, - scope: ["read:user"], - state: uuid(), - }; - - redisClient.set(userToken, JSON.stringify(params)); - - const oauth2 = await getOath2(); - ctx.redirect(oauth2!.getAuthorizeUrl(params)); -}); - -router.get("/signin/github", async (ctx) => { - const sessid = uuid(); - - const params = { - redirect_uri: `${config.url}/api/gh/cb`, - scope: ["read:user"], - state: uuid(), - }; - - ctx.cookies.set("signin_with_github_sid", sessid, { - path: "/", - secure: config.url.startsWith("https"), - httpOnly: true, - }); - - redisClient.set(sessid, JSON.stringify(params)); - - const oauth2 = await getOath2(); - ctx.redirect(oauth2!.getAuthorizeUrl(params)); -}); - -router.get("/gh/cb", async (ctx) => { - const userToken = getUserToken(ctx); - - const oauth2 = await getOath2(); - - if (!userToken) { - const sessid = ctx.cookies.get("signin_with_github_sid"); - - if (!sessid) { - ctx.throw(400, "invalid session"); - return; - } - - const code = ctx.query.code; - - if (!code || typeof code !== "string") { - ctx.throw(400, "invalid session"); - return; - } - - const { redirect_uri, state } = await new Promise((res, rej) => { - redisClient.get(sessid, async (_, state) => { - res(JSON.parse(state)); - }); - }); - - if (ctx.query.state !== state) { - ctx.throw(400, "invalid session"); - return; - } - - const { accessToken } = await new Promise((res, rej) => - oauth2!.getOAuthAccessToken( - code, - { - redirect_uri, - }, - (err, accessToken, refresh, result) => { - if (err) { - rej(err); - } else if (result.error) { - rej(result.error); - } else { - res({ accessToken }); - } - }, - ), - ); - - const { login, id } = (await getJson( - "https://api.github.com/user", - "application/vnd.github.v3+json", - 10 * 1000, - { - Authorization: `bearer ${accessToken}`, - }, - )) as Record; - if (typeof login !== "string" || typeof id !== "string") { - ctx.throw(400, "invalid session"); - return; - } - - const link = await UserProfiles.createQueryBuilder() - .where("\"integrations\"->'github'->>'id' = :id", { id: id }) - .andWhere('"userHost" IS NULL') - .getOne(); - - if (link == null) { - ctx.throw( - 404, - `@${login}と連携しているMisskeyアカウントはありませんでした...`, - ); - return; - } - - signin( - ctx, - (await Users.findOneBy({ id: link.userId })) as ILocalUser, - true, - ); - } else { - const code = ctx.query.code; - - if (!code || typeof code !== "string") { - ctx.throw(400, "invalid session"); - return; - } - - const { redirect_uri, state } = await new Promise((res, rej) => { - redisClient.get(userToken, async (_, state) => { - res(JSON.parse(state)); - }); - }); - - if (ctx.query.state !== state) { - ctx.throw(400, "invalid session"); - return; - } - - const { accessToken } = await new Promise((res, rej) => - oauth2!.getOAuthAccessToken( - code, - { redirect_uri }, - (err, accessToken, refresh, result) => { - if (err) { - rej(err); - } else if (result.error) { - rej(result.error); - } else { - res({ accessToken }); - } - }, - ), - ); - - const { login, id } = (await getJson( - "https://api.github.com/user", - "application/vnd.github.v3+json", - 10 * 1000, - { - Authorization: `bearer ${accessToken}`, - }, - )) as Record; - - if (typeof login !== "string" || typeof id !== "string") { - ctx.throw(400, "invalid session"); - return; - } - - const user = await Users.findOneByOrFail({ - host: IsNull(), - token: userToken, - }); - - const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); - - await UserProfiles.update(user.id, { - integrations: { - ...profile.integrations, - github: { - accessToken: accessToken, - id: id, - login: login, - }, - }, - }); - - ctx.body = `GitHub: @${login} を、Misskey: @${user.username} に接続しました!`; - - // Publish i updated event - publishMainStream( - user.id, - "meUpdated", - await Users.pack(user, user, { - detail: true, - includeSecrets: true, - }), - ); - } -}); - -export default router; diff --git a/packages/backend/src/server/api/service/twitter.ts b/packages/backend/src/server/api/service/twitter.ts deleted file mode 100644 index 369559241..000000000 --- a/packages/backend/src/server/api/service/twitter.ts +++ /dev/null @@ -1,226 +0,0 @@ -import type Koa from "koa"; -import Router from "@koa/router"; -import { v4 as uuid } from "uuid"; -import autwh from "autwh"; -import { IsNull } from "typeorm"; -import { publishMainStream } from "@/services/stream.js"; -import config from "@/config/index.js"; -import { fetchMeta } from "@/misc/fetch-meta.js"; -import { Users, UserProfiles } from "@/models/index.js"; -import type { ILocalUser } from "@/models/entities/user.js"; -import signin from "../common/signin.js"; -import { redisClient } from "../../../db/redis.js"; - -function getUserToken(ctx: Koa.BaseContext): string | null { - return ((ctx.headers["cookie"] || "").match(/igi=(\w+)/) || [null, null])[1]; -} - -function compareOrigin(ctx: Koa.BaseContext): boolean { - function normalizeUrl(url?: string): string { - return url == null - ? "" - : url.endsWith("/") - ? url.substr(0, url.length - 1) - : url; - } - - const referer = ctx.headers["referer"]; - - return normalizeUrl(referer) === normalizeUrl(config.url); -} - -// Init router -const router = new Router(); - -router.get("/disconnect/twitter", async (ctx) => { - if (!compareOrigin(ctx)) { - ctx.throw(400, "invalid origin"); - return; - } - - const userToken = getUserToken(ctx); - if (userToken == null) { - ctx.throw(400, "signin required"); - return; - } - - const user = await Users.findOneByOrFail({ - host: IsNull(), - token: userToken, - }); - - const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); - - profile.integrations.twitter = undefined; - - await UserProfiles.update(user.id, { - integrations: profile.integrations, - }); - - ctx.body = "Twitterの連携を解除しました :v:"; - - // Publish i updated event - publishMainStream( - user.id, - "meUpdated", - await Users.pack(user, user, { - detail: true, - includeSecrets: true, - }), - ); -}); - -async function getTwAuth() { - const meta = await fetchMeta(true); - - if ( - meta.enableTwitterIntegration && - meta.twitterConsumerKey && - meta.twitterConsumerSecret - ) { - return autwh({ - consumerKey: meta.twitterConsumerKey, - consumerSecret: meta.twitterConsumerSecret, - callbackUrl: `${config.url}/api/tw/cb`, - }); - } else { - return null; - } -} - -router.get("/connect/twitter", async (ctx) => { - if (!compareOrigin(ctx)) { - ctx.throw(400, "invalid origin"); - return; - } - - const userToken = getUserToken(ctx); - if (userToken == null) { - ctx.throw(400, "signin required"); - return; - } - - const twAuth = await getTwAuth(); - const twCtx = await twAuth!.begin(); - redisClient.set(userToken, JSON.stringify(twCtx)); - ctx.redirect(twCtx.url); -}); - -router.get("/signin/twitter", async (ctx) => { - const twAuth = await getTwAuth(); - const twCtx = await twAuth!.begin(); - - const sessid = uuid(); - - redisClient.set(sessid, JSON.stringify(twCtx)); - - ctx.cookies.set("signin_with_twitter_sid", sessid, { - path: "/", - secure: config.url.startsWith("https"), - httpOnly: true, - }); - - ctx.redirect(twCtx.url); -}); - -router.get("/tw/cb", async (ctx) => { - const userToken = getUserToken(ctx); - - const twAuth = await getTwAuth(); - - if (userToken == null) { - const sessid = ctx.cookies.get("signin_with_twitter_sid"); - - if (sessid == null) { - ctx.throw(400, "invalid session"); - return; - } - - const get = new Promise((res, rej) => { - redisClient.get(sessid, async (_, twCtx) => { - res(twCtx); - }); - }); - - const twCtx = await get; - - const verifier = ctx.query.oauth_verifier; - if (!verifier || typeof verifier !== "string") { - ctx.throw(400, "invalid session"); - return; - } - - const result = await twAuth!.done(JSON.parse(twCtx), verifier); - - const link = await UserProfiles.createQueryBuilder() - .where("\"integrations\"->'twitter'->>'userId' = :id", { - id: result.userId, - }) - .andWhere('"userHost" IS NULL') - .getOne(); - - if (link == null) { - ctx.throw( - 404, - `@${result.screenName}と連携しているMisskeyアカウントはありませんでした...`, - ); - return; - } - - signin( - ctx, - (await Users.findOneBy({ id: link.userId })) as ILocalUser, - true, - ); - } else { - const verifier = ctx.query.oauth_verifier; - - if (!verifier || typeof verifier !== "string") { - ctx.throw(400, "invalid session"); - return; - } - - const get = new Promise((res, rej) => { - redisClient.get(userToken, async (_, twCtx) => { - res(twCtx); - }); - }); - - const twCtx = await get; - - const result = await twAuth!.done(JSON.parse(twCtx), verifier); - - const user = await Users.findOneByOrFail({ - host: IsNull(), - token: userToken, - }); - - const profile = await UserProfiles.findOneByOrFail({ userId: user.id }); - - await UserProfiles.update(user.id, { - integrations: { - ...profile.integrations, - twitter: { - accessToken: result.accessToken, - accessTokenSecret: result.accessTokenSecret, - userId: result.userId, - screenName: result.screenName, - }, - }, - }); - - ctx.body = `Twitter: @${result.screenName} を、Misskey: @${user.username} に接続しました!`; - - // Publish i updated event - publishMainStream( - user.id, - "meUpdated", - await Users.pack(user, user, { - detail: true, - includeSecrets: true, - }), - ); - } -}); - -export default router; diff --git a/packages/client/src/components/MkSignin.vue b/packages/client/src/components/MkSignin.vue index d7630f8d0..2708cc07f 100644 --- a/packages/client/src/components/MkSignin.vue +++ b/packages/client/src/components/MkSignin.vue @@ -124,38 +124,6 @@ - @@ -169,7 +137,6 @@ import { apiUrl, host as configHost } from "@/config"; import { byteify, hexify } from "@/scripts/2fa"; import * as os from "@/os"; import { login } from "@/account"; -import { instance } from "@/instance"; import { i18n } from "@/i18n"; const signing = ref(false); @@ -184,8 +151,6 @@ const queryingKey = ref(false); const hCaptchaResponse = ref(null); const reCaptchaResponse = ref(null); -const meta = computed(() => instance); - const emit = defineEmits<{ (ev: "login", v: any): void; }>(); diff --git a/packages/client/src/pages/admin/index.vue b/packages/client/src/pages/admin/index.vue index ed9f9f612..7deffdddd 100644 --- a/packages/client/src/pages/admin/index.vue +++ b/packages/client/src/pages/admin/index.vue @@ -267,14 +267,6 @@ const menuDef = computed(() => [ to: "/admin/relays", active: currentPage.value?.route.name === "relays", }, - { - icon: "ph-plug ph-bold ph-lg", - text: i18n.ts.integration, - to: "/admin/integrations", - active: - currentPage.value?.route.name === - "integrations", - }, { icon: "ph-prohibit ph-bold ph-lg", text: i18n.ts.instanceBlocking, diff --git a/packages/client/src/pages/admin/integrations.discord.vue b/packages/client/src/pages/admin/integrations.discord.vue deleted file mode 100644 index 8be7582d3..000000000 --- a/packages/client/src/pages/admin/integrations.discord.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - diff --git a/packages/client/src/pages/admin/integrations.github.vue b/packages/client/src/pages/admin/integrations.github.vue deleted file mode 100644 index 2f3416b08..000000000 --- a/packages/client/src/pages/admin/integrations.github.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - diff --git a/packages/client/src/pages/admin/integrations.vue b/packages/client/src/pages/admin/integrations.vue deleted file mode 100644 index 505080d9e..000000000 --- a/packages/client/src/pages/admin/integrations.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - diff --git a/packages/client/src/pages/settings/index.vue b/packages/client/src/pages/settings/index.vue index 6bb3f9809..8d7354716 100644 --- a/packages/client/src/pages/settings/index.vue +++ b/packages/client/src/pages/settings/index.vue @@ -116,12 +116,6 @@ const menuDef = computed(() => [ to: "/settings/email", active: currentPage.value?.route.name === "email", }, - { - icon: "ph-share-network ph-bold ph-lg", - text: i18n.ts.integration, - to: "/settings/integration", - active: currentPage.value?.route.name === "integration", - }, { icon: "ph-lock ph-bold ph-lg", text: i18n.ts.security, diff --git a/packages/client/src/pages/settings/integration.vue b/packages/client/src/pages/settings/integration.vue deleted file mode 100644 index 2eb48a547..000000000 --- a/packages/client/src/pages/settings/integration.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - diff --git a/packages/client/src/router.ts b/packages/client/src/router.ts index 60e9d37c5..dd1621777 100644 --- a/packages/client/src/router.ts +++ b/packages/client/src/router.ts @@ -103,11 +103,6 @@ export const routes = [ name: "email", component: page(() => import("./pages/settings/email.vue")), }, - { - path: "/integration", - name: "integration", - component: page(() => import("./pages/settings/integration.vue")), - }, { path: "/security", name: "security", @@ -525,11 +520,6 @@ export const routes = [ name: "relays", component: page(() => import("./pages/admin/relays.vue")), }, - { - path: "/integrations", - name: "integrations", - component: page(() => import("./pages/admin/integrations.vue")), - }, { path: "/instance-block", name: "instance-block", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fa0a532b8..464f2fa4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -312,9 +312,6 @@ importers: nsfwjs: specifier: 2.4.2 version: 2.4.2(@tensorflow/tfjs@4.2.0) - oauth: - specifier: ^0.10.0 - version: 0.10.0 opencc-js: specifier: ^1.0.5 version: 1.0.5