8000 GitHub - Wooseobee/PASDS-WORLD
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Wooseobee/PASDS-WORLD

8000
Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

PASDS-WORLD

πŸ“– λͺ©μ°¨

🚢 ν”„λ‘œμ νŠΈ μ†Œκ°œ

  • PASDS-WORLDλŠ” 곡톡 λΉ„λ°€λ²ˆν˜Έμ™€ 같은 νŒ€λ³„ 민감데이터λ₯Ό κ³΅μœ ν•΄μ£ΌλŠ” μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.

🚢 μ£Όμš” κΈ°λŠ₯

  • TOTP 기반 2μ°¨ 인증을 톡해 μ•ˆμ „ν•œ λ‘œκ·ΈμΈμ„ μ œκ³΅ν•©λ‹ˆλ‹€.
  • RBACλ₯Ό ν†΅ν•œ 민감 데이터λ₯Ό κ³΅μœ ν•©λ‹ˆλ‹€.
  • KMS μ„œλ²„λ₯Ό 톡해 λ°œκΈ‰λ°›μ€ ν‚€λ‘œ 민감 데이터λ₯Ό μ•ˆμ „ν•˜κ²Œ μ•”ν˜Έν™” ν•©λ‹ˆλ‹€.

πŸ“ 개발 λ…Έμ…˜

πŸ‘· νŒ€μ› ꡬ성

κΉ€μ§„μš© μ‹ μš°μ„­ μœ κ΄‘μš° 이쀀범 μž„λ•κΈ° μ΄ν•˜μ€
@jinyong3512 @Wooseobee @godsun7892 @bum19 @DKIMDK @haisley77

πŸ“† 개발 κΈ°κ°„

2024.04.08 - 2024.05.20 (6μ£Ό)

πŸ› οΈ 기술 μŠ€νƒ

Front-end

JavaScript vue.js tailwind

Back-end

Java Spring Boot redis android

Monitoring

elasticsearch Logstash kibana beats

prometheus grafana

Database

MySQL

버전 및 μ΄μŠˆκ΄€λ¦¬

gitlab

ν˜‘μ—… 툴

discord jira notion mattermost

μ„œλΉ„μŠ€ 배포 ν™˜κ²½

amazon ec2 docker nginx

CI/CD

jenkins

λ³΄μ•ˆ ν…ŒμŠ€νŠΈ

jenkins

πŸ—οΈ μ•„ν‚€ν…μ²˜

πŸ“ ERD

πŸ“Œ μ—­ν•  λΆ„λ‹΄

  • κΉ€μ§„μš©

    • Front
      • νšŒμ› 도메인
      • λΌμš°ν„°κ°€λ“œ, 인터셉터, μΏ ν‚€
    • Back
      • 이메일 도메인
        • Async, 이메일 계정 νšŒμ „
      • SpringSecurity
        • 인증, 인가
        • pepper + BCrypt
        • JwtCustomFilter
        • λ³΄μ•ˆκ΄€λ ¨ 헀더 μ„€μ •
      • 취약점 진단
        • OWASP (Zed Attack Proxy)
        • Cookie
    • Android
      • 전체적인 UI/UX
      • QR μ½”λ“œ 인식
      • TOTP기반 μΈμ¦μ½”λ“œ λ°œκΈ‰
      • λ‚΄λΆ€ν…ŒμŠ€νŠΈ 배포
  • μ‹ μš°μ„­

    • Front
      • 메인: νŒ€, 민감데이터
      • μ•Œλ¦Ό
    • Back
      • μ•Œλ¦Ό: SSEλ₯Ό ν™œμš©ν•΄ 쑰직 μ΄ˆλŒ€, νŒ€ μ΄ˆλŒ€ μ•Œλ¦Ό κ΅¬ν˜„
      • κΆŒν•œ: CRUD
      • μ΄ˆλŒ€: CRUD
      • 쑰직: CRUD
      • νŒ€: CRUD
      • μ—­ν• : CRUD
      • 민감데이터: CRUD + Elasticsearchλ₯Ό ν™œμš©ν•œ 검색
    • Monitoring
      • ELK + Filebeat λ‘œκΉ… νŒŒμ΄ν”„λΌμΈ ꡬ좕
    • Kms
      • λ‘œκΉ… μ‹œμŠ€ν…œ ꡬ좕
  • μœ κ΄‘μš°

    • Infra
      • VPC 내에 private, private subnet 인프라 ν™˜κ²½ ꡬ좕
      • Route, NACL, λ³΄μ•ˆ 그룹을 ν™œμš©ν•œ λ„€νŠΈμ›Œν¬ ν™˜κ²½ ꡬ좕
      • Jenkinsλ₯Ό μ‚¬μš©ν•œ 무쀑단, μžλ™ν™” 배포 κ΅¬ν˜„
    • Back
      • μ‚¬μš©μž λŒ€μ‹œλ³΄λ“œλ₯Ό μœ„ν•œ 월별 μ‚¬μš©λŸ‰ log μ €μž₯ 및 쑰회 κΈ°λŠ₯ κ΅¬ν˜„
    • Monitoring
      • Actuator, Prometheus, Grafanaλ₯Ό μ‚¬μš©ν•œ Spring Boot λͺ¨λ‹ˆν„°λ§ ν™˜κ²½ ꡬ좕
  • 이쀀범

    • FRONT
      • 쑰직별 νŒ€λͺ©λ‘ 쑰회 κΈ°λŠ₯ κ΅¬ν˜„
      • 쑰직별 쑰직 ꡬ성원 쑰회 κΈ°λŠ₯ κ΅¬ν˜„
      • 쑰직 ꡬ성원 μ΄ˆλŒ€ κΈ°λŠ₯ κ΅¬ν˜„
    • KMS
      • Jwt Secret Key λ°œκΈ‰ 및 νšŒμ „ 둜직 κ΅¬ν˜„
      • Data Key λ°œκΈ‰ 및 νšŒμ „ 둜직 κ΅¬ν˜„
      • Master Key λ°œκΈ‰ 및 νšŒμ „ 둜직 κ΅¬ν˜„
  • μž„λ•κΈ°

    • front
      • Vue.js μ„€μ • 및 Tailwind CSS 톡합, 폰트 μ„€μ •
      • 곡톡 μ»΄ν¬λ„ŒνŠΈ 및 νŽ˜μ΄μ§€ 별 μ»΄ν¬λ„ŒνŠΈ μž‘μ„±
      • λ ˆμ΄μ•„μ›ƒ ꡬ성
      • λ°˜μ‘ν˜• λ””μžμΈ 및 닀크λͺ¨λ“œ κ΅¬ν˜„
      • νŽ˜μ΄μ§€ λΌμš°νŒ…
  • μ΄ν•˜μ€

    • Back
      • 둜그인 브루트포슀 곡격 λ°©μ–΄ 둜직 (IP 차단, 계정 LOCK)
      • 2FA μ‚¬μš©μžλ³„ 고유 νŒ¨μŠ€ν‚€ λ°œκΈ‰ 둜직
      • TOTP μ•Œκ³ λ¦¬μ¦˜ (HMAC, HOTP ν™œμš©) ν™œμš© 2FA 둜직
      • 이메일 인증 μ„œλ²„ 둜직
    • Front
      • 쑰직별 λŒ€μ‹œλ³΄λ“œ 차트 ꡬ성 및 νŽ˜μ΄μ§€ κΈ°λŠ₯ κ΅¬ν˜„
      • νšŒμ› κΈ°λŠ₯ (이메일 인증, 검증 κΈ°λŠ₯, λΉ„λ°€λ²ˆν˜Έ μž¬μ„€μ •, μ•± μž¬μ—°λ™)

πŸŽ₯ κΈ°λŠ₯ μ‹œμ—°

νšŒμ›

νšŒμ›κ°€μž…
둜그인
λΉ„λ°€λ²ˆν˜Έ μž¬μ„€μ •
νŒ¨μŠ€ν‚€ μž¬λ°œκΈ‰
1μ°¨ 둜그인 μ‹€νŒ¨
2μ°¨ 둜그인 μ‹€νŒ¨
νŒ¨μŠ€ν‚€ μŠ€μΊ”
νŒ¨μŠ€μ½”λ“œ λ°œκΈ‰

쑰직

쑰직 생성
쑰직 μ΄ˆλŒ€
쑰직 μ΄ˆλŒ€ 수락
쑰직 μΆ”λ°©
쑰직 이름 λ³€κ²½
쑰직 μ—­ν•  λ³€κ²½
쑰직 λŒ€μ‹œλ³΄λ“œ

νŒ€ 관리

νŒ€ 생성
νŒ€ 이름변경
νŒ€ μΆ”λ°©
νŒ€ μ‚­μ œ
νŒ€μ›λͺ©λ‘
νŒ€μž₯λ³€κ²½
μ—­ν•  λ°°μ •
μ—­ν•  μ‚­μ œ
μ—­ν•  μˆ˜μ •
μ—­ν•  μΆ”κ°€

민감 데이터

둜그인 ν˜•μ‹ μ €μž₯
ν…μŠ€νŠΈ ν˜•μ‹ μ €μž₯
ν…μŠ€νŠΈ 쑰회
ν…μŠ€νŠΈ μˆ˜μ •
ν…μŠ€νŠΈ μ‚­μ œ
검색

πŸ’» μ‚¬μš© 기술

TOTP

  • 2FA(2단계 인증)
    • λ¦¬μ†ŒμŠ€ 및 데이터에 μ•‘μ„ΈμŠ€ν•  λ•Œ 두 κ°€μ§€ ν˜•νƒœμ˜ 인증이 μš”κ΅¬λ˜λŠ” ID 및 μ•‘μ„ΈμŠ€ 관리 λ³΄μ•ˆ λ°©λ²•μœΌλ‘œ, λ‹€μ–‘ν•œ κ΅¬ν˜„ 방법이 있으며 TOTPλ₯Ό ν™œμš©ν•œ 2FAλ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.
  • OTP vs TOTP
    • OTP : 일반적으둜 각 인증 μ‹œλ„λ§ˆλ‹€ κ³ μœ ν•œ λΉ„λ°€λ²ˆν˜Έλ₯Ό 생성(ex. 이메일 μΈμ¦μ½”λ“œ, SMS μΈμ¦μ½”λ“œ)
    • TOTP : μ‚¬μš©μžμ™€ μ„œλΉ„μŠ€ μ œκ³΅μžκ°€ κ³΅μœ ν•œ λΉ„λ°€ 킀와 ν˜„μž¬ μ‹œκ°„μ„ κ²°ν•©ν•˜μ—¬ 주기적으둜 λ³€κ²½λ˜λŠ” OTP
  • TOTP 인증 κ³Όμ •
    1. μ‚¬μš©μž λ””λ°”μ΄μŠ€ μ•±μ—μ„œ ν˜„μž¬ μ‹œκ°„κ³Ό λΉ„λ°€ ν‚€λ₯Ό κ²°ν•©ν•΄ 고유 λΉ„λ°€λ²ˆν˜Έ(TOTP)λ₯Ό 생성
    2. μƒμ„±ν•œ TOTP둜 μ‚¬μš©μž 인증 μš”μ²­
    3. 인증 μš”μ²­μ„ 받은 μ„œλ²„λŠ” μ‚¬μš©μž λ””λ°”μ΄μŠ€μ™€ 사전에 κ³΅μœ ν•œ 고유 λΉ„λ°€ 킀와 ν˜„μž¬ μ‹œκ°„μ„ κ²°ν•©ν•΄ TOTP 생성
    4. 인증 μš”μ²­ 받은 μ„œλ²„κ°€ μƒμ„±ν•œ TOTP와 μ‚¬μš©μžλ‘œλΆ€ν„° 받은 TOTP 일치 μ—¬λΆ€ 확인
      • 일치 : 인증 성곡
      • 뢈일치 : 인증 μ‹€νŒ¨

πŸ’» ꡬ동 방법

0. mysql, elk, prometheus κ°œλ³„μ μœΌλ‘œ μ„€μΉ˜ ν•΄μ£Όμ…”μ•Ό ν•©λ‹ˆλ‹€.

1. Clone Project

git clone https://lab.ssafy.com/s10-final/S10P31S101.git

front

  1. change path to /front & npm install
npm i
  1. front start
npm run dev

back

  1. change path to /back/src/main & make resources directory
mkdir resources
  1. change path to /back/src/main/resources & make application.yml file
server:
  port: {spring boot application port number}

spring:
  application:
    name: back
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: {back database url}
    username: {back database username}
    password: {back database userpassword}
  elasticsearch:
    uris: {elasticsearch url}
    username: {elasticsearch username}
    password: {elasticserach password}
  jpa:
    hibernate:
      ddl-auto: update
  mail:
    host: smtp.{email domain}
    port: 587
    accounts:
      - username: {sender email address}
        password: {sender email password}
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
          connectiontimeout: 5000
          timeout: 5000
          writetimeout: 5000
    auth-code-expiration-millis: 180000 # 3λΆ„
  data:
    redis:
      host: {redis address} # λ‚΄λΆ€ 톡신망
      port: 6379
      password: {redis password}
      lettuce:
        pool:
          max-active: 10
          max-idle: 5
          min-idle: 1

security:
  pepper: {jwt secret pepper}
  jwt:
    access-token-expiration-ms: 900000 # 15λΆ„
    refresh-token-expiration-ms: 86400000 # 1일
    temporary-token-expiration-ms: 900000 # 15λΆ„
    email-token-expiration-ms: 900000 # 15λΆ„

cookie:
  path: "/app/api"
  secure: true
  httpOnly: true
  sameSite: "Strict"

kms-server:
  url: {kms url} # you should deploy this server in private-subnet

management:
  health:
    mail:
      enabled: false # MailHealthIndicator λΉ„ν™œμ„±ν™”
  endpoints:
    web:
      cors:
        allowed-origins: {prometheus url}
      exposure:
        include: "*"
  metrics:
    export:
      prometheus:
        enabled: true
  endpoint:
    health:
      show-details: ALWAYS
  1. change path to /back & build
./gradlew build
  1. back start
java -jar back-0.0.1-SNAPSHOT.jar

KMS

  1. change path to /kms/src/main & make resources directory
mkdir resources
  1. change path to /kms/src/main/resources & make application.yml file
server:
  port: {kms spring application port number}

spring:
  application:
    name: kms
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: {kms database url}
    username: {kms database username}
    password: {kms database password}
  jpa:
    hibernate:
      ddl-auto: update

logging:
  config: classpath:logback-spring.xml

main-server:
    url: {back server address}/app/api/key-rotate/handle-masterkey-change
  1. change path to /kms & build
./gradlew build
  1. kms start
java -jar kms-0.0.1-SNAPSHOT.jar

πŸ“¦ ν”„λ‘œμ νŠΈ ꡬ쑰

Front

β”œβ”€β”€ node_modules
β”œβ”€β”€ README.md
β”œβ”€β”€ certificate.pem
β”œβ”€β”€ index.html
β”œβ”€β”€ jsconfig.json
β”œβ”€β”€ package-lock.json
β”œβ”€β”€ package.json
β”œβ”€β”€ postcss.config.js
β”œβ”€β”€ privatekey.pem
β”œβ”€β”€ project_structure.txt
β”œβ”€β”€ public
β”‚ └── favicon.ico
β”œβ”€β”€ src
β”‚ β”œβ”€β”€ App.vue
β”‚ β”œβ”€β”€ api
β”‚ β”‚ β”œβ”€β”€ data.js
β”‚ β”‚ β”œβ”€β”€ invitation.js
β”‚ β”‚ β”œβ”€β”€ notification.js
β”‚ β”‚ β”œβ”€β”€ organization.js
β”‚ β”‚ β”œβ”€β”€ role.js
β”‚ β”‚ └── team.js
β”‚ β”œβ”€β”€ assets
β”‚ β”‚ β”œβ”€β”€ fonts
β”‚ β”‚ β”‚ └── SamsungOneKorean-700C.ttf
β”‚ β”‚ β”œβ”€β”€ fonts.css
β”‚ β”‚ β”œβ”€β”€ images
β”‚ β”‚ β”‚ β”œβ”€β”€ QR_example.png
β”‚ β”‚ β”‚ β”œβ”€β”€ background1-example.jpg
β”‚ β”‚ β”‚ β”œβ”€β”€ pasdsworld_v1_qr.png
β”‚ β”‚ β”‚ β”œβ”€β”€ pasdsworld_v2_qr.png
β”‚ β”‚ β”‚ β”œβ”€β”€ pasdsworld_v3_qr.png
β”‚ β”‚ β”‚ └── secret_key_qr_example.png
β”‚ β”‚ β”œβ”€β”€ logo.png
β”‚ β”‚ └── main.css
β”‚ β”œβ”€β”€ components
β”‚ β”‚ β”œβ”€β”€ common
β”‚ β”‚ β”‚ β”œβ”€β”€ BaseAlert.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ BaseButton.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ BaseFailAlert.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ BaseModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ BasePagination.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ BaseSearchBar.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ BaseSpinner.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ BaseTimer.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ HeaderNavigation.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MainAuthorizationModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MainMemberRoleModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MainPrivateDataCreate.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MainPrivateDataDetail.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MainSidebar.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MainTable.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MainTeamButtonGroup.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberChangePasswordModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationAuthorizationModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationChangeHeaderModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationChangeNameModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationCounts.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationCreationModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationInvitationModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationKeyRotations.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationSidebar.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationViewCounts.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ TeamChangeLeaderModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ TeamChangeNameModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ TeamCreationModal.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ TeamInvitationModal.vue
β”‚ β”‚ β”‚ └── TeamRoleCreationModal.vue
β”‚ β”‚ β”œβ”€β”€ dashboard
β”‚ β”‚ β”‚ β”œβ”€β”€ CircleChart.vue
β”‚ β”‚ β”‚ └── CircleChart2.vue
β”‚ β”‚ β”œβ”€β”€ main
β”‚ β”‚ β”‚ β”œβ”€β”€ MainMainpage.vue
β”‚ β”‚ β”‚ └── MainTeamManagement.vue
β”‚ β”‚ β”œβ”€β”€ member
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberForgotPassword.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberForgotTotpKey.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberLogin.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberLogin2.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberMyPage.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberSignup.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberSignup2.vue
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberSignup3.vue
β”‚ β”‚ β”‚ └── MemberSignup4.vue
β”‚ β”‚ └── organization
β”‚ β”‚ β”œβ”€β”€ OrganizationDashboard.vue
β”‚ β”‚ β”œβ”€β”€ OrganizationMember.vue
β”‚ β”‚ β”œβ”€β”€ OrganizationMemberRoleModal.vue
β”‚ β”‚ β”œβ”€β”€ OrganizationSetting.vue
β”‚ β”‚ └── OrganizationTeam.vue
β”‚ β”œβ”€β”€ main.js
β”‚ β”œβ”€β”€ router
β”‚ β”‚ └── index.js
β”‚ β”œβ”€β”€ stores
β”‚ β”‚ β”œβ”€β”€ common.js
β”‚ β”‚ └── user.js
β”‚ β”œβ”€β”€ utils
β”‚ β”‚ β”œβ”€β”€ cookie.js
β”‚ β”‚ └── http-commons.js
β”‚ └── views
β”‚ β”œβ”€β”€ HomeView.vue
β”‚ β”œβ”€β”€ HomeViewOnePageScrollTest.vue
β”‚ β”œβ”€β”€ MainView.vue
β”‚ β”œβ”€β”€ MemberView.vue
β”‚ └── OrganizationView.vue
β”œβ”€β”€ tailwind.config.js
└── vite.config.js
Back

β”œβ”€β”€ Dockerfile
β”œβ”€β”€ back_s
9E88
tructure.txt
β”œβ”€β”€ build.gradle
β”œβ”€β”€ gradle
β”‚ └── wrapper
β”‚ β”œβ”€β”€ gradle-wrapper.jar
β”‚ └── gradle-wrapper.properties
β”œβ”€β”€ gradlew
β”œβ”€β”€ gradlew.bat
β”œβ”€β”€ settings.gradle
└── src
β”œβ”€β”€ main
β”‚ └── java
β”‚ └── world
β”‚ └── pasds
β”‚ └── back
β”‚ β”œβ”€β”€ BackApplication.java
β”‚ β”œβ”€β”€ authority
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── AuthorityController.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ Authority.java
β”‚ β”‚ β”‚ β”œβ”€β”€ AuthorityDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ AuthorityName.java
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ └── GetAuthoritiesResponseDto.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ └── AuthorityRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ └── AuthorityService.java
β”‚ β”œβ”€β”€ common
β”‚ β”‚ β”œβ”€β”€ BaseEntity.java
β”‚ β”‚ β”œβ”€β”€ ControllerAdvice.java
β”‚ β”‚ β”œβ”€β”€ DataKeyRotationTask.java
β”‚ β”‚ β”œβ”€β”€ config
β”‚ β”‚ β”‚ β”œβ”€β”€ AppConfig.java
β”‚ β”‚ β”‚ β”œβ”€β”€ ElasticsearchConfig.java
β”‚ β”‚ β”‚ β”œβ”€β”€ ElasticsearchRepositoryConfig.java
β”‚ β”‚ β”‚ β”œβ”€β”€ EmailConfig.java
β”‚ β”‚ β”‚ β”œβ”€β”€ JpaRepositoryConfig.java
β”‚ β”‚ β”‚ β”œβ”€β”€ RedisConfig.java
β”‚ β”‚ β”‚ └── SecurityConfig.java
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ β”œβ”€β”€ EmailController.java
β”‚ β”‚ β”‚ β”œβ”€β”€ KeyRotateController.java
β”‚ β”‚ β”‚ └── RedisController.java
β”‚ β”‚ β”œβ”€β”€ dto
β”‚ β”‚ β”‚ β”œβ”€β”€ EmailCodeGeneralVerificationRequestDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ EmailSendGeneralRequestDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ ErrorResponse.java
β”‚ β”‚ β”‚ β”œβ”€β”€ KmsDecryptionKeysResponseDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ KmsEncryptionKeysResponseDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ KmsKeyDto.java
β”‚ β”‚ β”‚ └── KmsReGenerationKeysResponseDto.java
β”‚ β”‚ β”œβ”€β”€ exception
β”‚ β”‚ β”‚ β”œβ”€β”€ BusinessException.java
β”‚ β”‚ β”‚ └── ExceptionCode.java
β”‚ β”‚ β”œβ”€β”€ filter
β”‚ β”‚ β”‚ └── CustomAuthenticationFilter.java
β”‚ β”‚ β”œβ”€β”€ service
β”‚ β”‚ β”‚ β”œβ”€β”€ EmailAsyncService.java
β”‚ β”‚ β”‚ β”œβ”€β”€ EmailService.java
β”‚ β”‚ β”‚ β”œβ”€β”€ KeyService.java
β”‚ β”‚ β”‚ β”œβ”€β”€ RedisJwtSecretKeyListener.java
β”‚ β”‚ β”‚ └── RedisService.java
β”‚ β”‚ └── util
β”‚ β”‚ β”œβ”€β”€ AesUtil.java
β”‚ β”‚ β”œβ”€β”€ CookieProvider.java
β”‚ β”‚ β”œβ”€β”€ JwtTokenProvider.java
β”‚ β”‚ └── LoginUserAuditorAware.java
β”‚ β”œβ”€β”€ dashboard
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── DashboardController.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationDashboard.java
β”‚ β”‚ β”‚ β”œβ”€β”€ TeamDashboard.java
β”‚ β”‚ β”‚ └── dto
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ β”œβ”€β”€ MainDashboardResponseDto.java
β”‚ β”‚ β”‚ └── TeamDashboardResponseDto.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationDashboardRepository.java
β”‚ β”‚ β”‚ └── TeamDashboardRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ β”œβ”€β”€ OrganizationDashboardService.java
β”‚ β”‚ └── TeamDashboardService.java
β”‚ β”œβ”€β”€ invitaion
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── InvitationController.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ Invitation.java
β”‚ β”‚ β”‚ └── dto
β”‚ β”‚ β”‚ β”œβ”€β”€ request
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ AcceptOrganizationInviteRequestDto.java
β”‚ β”‚ β”‚ β”‚ └── AcceptTeamInviteRequestDto.java
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ β”œβ”€β”€ AcceptResponseDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ GetInvitationsResponseDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ RejectOrganizationInviteRequestDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ RejectResponseDto.java
β”‚ β”‚ β”‚ └── RejectTeamInviteRequestDto.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ └── InvitationRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ └── InvitationService.java
β”‚ β”œβ”€β”€ member
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── MemberController.java
β”‚ β”‚ β”œβ”€β”€ dto
β”‚ β”‚ β”‚ β”œβ”€β”€ request
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ ChangeNicknameRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ ChangePasswordRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ ResetPasswordRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ SecondLoginRequestDto.java
β”‚ β”‚ β”‚ β”‚ └── SignupRequestDto.java
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ └── FirstLoginResponseDto.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ CustomUserDetails.java
β”‚ β”‚ β”‚ β”œβ”€β”€ Member.java
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberOrganization.java
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberRole.java
β”‚ β”‚ β”‚ └── MemberTeam.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberOrganizationRepository.java
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberRepository.java
β”‚ β”‚ β”‚ β”œβ”€β”€ MemberRoleRepository.java
β”‚ β”‚ β”‚ └── MemberTeamRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ β”œβ”€β”€ CustomUserDetailsService.java
β”‚ β”‚ └── MemberService.java
β”‚ β”œβ”€β”€ notification
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── NotificationController.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ Notification.java
β”‚ β”‚ β”‚ β”œβ”€β”€ NotificationStatus.java
β”‚ β”‚ β”‚ β”œβ”€β”€ NotificationType.java
β”‚ β”‚ β”‚ └── dto
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ └── NotificationResponseDto.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ └── NotificationRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ β”œβ”€β”€ NotificationEventPublisher.java
β”‚ β”‚ └── NotificationService.java
β”‚ β”œβ”€β”€ organization
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── OrganizationController.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ Organization.java
β”‚ β”‚ β”‚ β”œβ”€β”€ OrganizationRole.java
β”‚ β”‚ β”‚ └── dto
β”‚ β”‚ β”‚ β”œβ”€β”€ request
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ AssignNewHeaderRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ CreateOrganizationRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ DeleteOrganizationRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ InviteMemberToOrganizationRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ LeaveOrganizationRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ RemoveMemberFromOrganizationRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ RenameOrganizationRequestDto.java
β”‚ β”‚ β”‚ β”‚ └── UpdateRoleRequestDto.java
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ β”œβ”€β”€ GetOrganizationMemberDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ GetOrganizationMemberResponseDto.java
β”‚ β”‚ β”‚ └── GetOrganizationsResponseDto.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ └── OrganizationRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ └── OrganizationService.java
β”‚ β”œβ”€β”€ privateData
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── PrivateDataController.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ DataType.java
β”‚ β”‚ β”‚ β”œβ”€β”€ PrivateData.java
β”‚ β”‚ β”‚ β”œβ”€β”€ PrivateDataDocument.java
β”‚ β”‚ β”‚ β”œβ”€β”€ PrivateDataRole.java
β”‚ β”‚ β”‚ └── dto
β”‚ β”‚ β”‚ β”œβ”€β”€ PrivateDataRoleDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ request
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ CreatePrivateDataRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ DeletePrivateDataRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ GetPrivateDataRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ UpdatePrivateDataRequestDto.java
β”‚ β”‚ β”‚ β”‚ └── UpdatePrivateDataRoleRequestDto.java
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ β”œβ”€β”€ GetPrivateDataListResponseDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ GetPrivateDataResponseDto.java
β”‚ β”‚ β”‚ └── PrivateDataResponse.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ β”œβ”€β”€ elasticsearch
β”‚ β”‚ β”‚ β”‚ └── PrivateDataSearchRepository.java
β”‚ β”‚ β”‚ └── jpa
β”‚ β”‚ β”‚ β”œβ”€β”€ PrivateDataCustomRepository.java
β”‚ β”‚ β”‚ β”œβ”€β”€ PrivateDataCustomRepositoryImpl.java
β”‚ β”‚ β”‚ β”œβ”€β”€ PrivateDataRepository.java
β”‚ β”‚ β”‚ └── PrivateDataRoleRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ β”œβ”€β”€ PrivateDataSearchService.java
β”‚ β”‚ └── PrivateDataService.java
β”‚ β”œβ”€β”€ role
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── RoleController.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ Role.java
β”‚ β”‚ β”‚ β”œβ”€β”€ RoleAuthority.java
β”‚ β”‚ β”‚ └── dto
β”‚ β”‚ β”‚ β”œβ”€β”€ request
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ CreateRoleRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ DeleteRoleRequestDto.java
β”‚ β”‚ β”‚ β”‚ └── UpdateRoleRequestDto.java
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ β”œβ”€β”€ GetRoleDetailResponseDto.java
β”‚ β”‚ β”‚ └── GetRoleResponseDto.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ β”œβ”€β”€ RoleAuthorityCustomRepository.java
β”‚ β”‚ β”‚ β”œβ”€β”€ RoleAuthorityCustomRepositoryImpl.java
β”‚ β”‚ β”‚ β”œβ”€β”€ RoleAuthorityRepository.java
β”‚ β”‚ β”‚ └── RoleRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ └── RoleService.java
β”‚ β”œβ”€β”€ team
β”‚ β”‚ β”œβ”€β”€ controller
β”‚ β”‚ β”‚ └── TeamController.java
β”‚ β”‚ β”œβ”€β”€ entity
β”‚ β”‚ β”‚ β”œβ”€β”€ Team.java
β”‚ β”‚ β”‚ └── dto
β”‚ β”‚ β”‚ β”œβ”€β”€ request
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ AssignNewTeamHeaderRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ AssignRoleRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ CreateTeamRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ DeleteTeamRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ InviteMemberToTeamRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ LeaveTeamRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ RemoveMemberFromTeamRequestDto.java
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ RenameTeamRequestDto.java
β”‚ β”‚ β”‚ β”‚ └── RotateTeamDataKeyRequestDto.java
β”‚ β”‚ β”‚ └── response
β”‚ β”‚ β”‚ β”œβ”€β”€ GetAdminTeamsResponseDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ GetTeamLeaderResponseDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ GetTeamMemberDto.java
β”‚ β”‚ β”‚ β”œβ”€β”€ GetTeamMemberResponseDto.java
β”‚ β”‚ β”‚ └── GetTeamsResponseDto.java
β”‚ β”‚ β”œβ”€β”€ repository
β”‚ β”‚ β”‚ └── TeamRepository.java
β”‚ β”‚ └── service
β”‚ β”‚ └── TeamService.java
β”‚ └── totp
β”‚ β”œβ”€β”€ controller
β”‚ β”‚ └── TotpController.java
β”‚ β”œβ”€β”€ dto
β”‚ β”‚ β”œβ”€β”€ EmailCodeKeyVerificationRequestDto.java
β”‚ β”‚ └── TotpCodeVerificationRequestDto.java
β”‚ β”œβ”€β”€ repository
β”‚ β”‚ └── TotpRepository.java
β”‚ └── service
β”‚ └── TotpService.java
└── test
└── java
└── world
└── pasds
└── back
└── BackApplicationTests.java

KMS

β”œβ”€β”€ build.gradle
β”œβ”€β”€ gradle
β”‚   └── wrapper
β”‚       β”œβ”€β”€ gradle-wrapper.jar
β”‚       └── gradle-wrapper.properties
β”œβ”€β”€ gradlew
β”œβ”€β”€ gradlew.bat
β”œβ”€β”€ kms_structure.txt
β”œβ”€β”€ settings.gradle
└── src
    β”œβ”€β”€ main
    β”‚   β”œβ”€β”€ java
    β”‚   β”‚   └── world
    β”‚   β”‚       └── pasds
    β”‚   β”‚           └── kms
    β”‚   β”‚               β”œβ”€β”€ KmsApplication.java
    β”‚   β”‚               β”œβ”€β”€ common
    β”‚   β”‚               β”‚   β”œβ”€β”€ BaseEntity.java
    β”‚   β”‚               β”‚   β”œβ”€β”€ ControllerAdvice.java
    β”‚   β”‚               β”‚   β”œβ”€β”€ dto
    β”‚   β”‚               β”‚   β”‚   └── ErrorResponse.java
    β”‚   β”‚               β”‚   β”œβ”€β”€ exception
    β”‚   β”‚               β”‚   β”‚   β”œβ”€β”€ BusinessException.java
    β”‚   β”‚               β”‚   β”‚   └── ExceptionCode.java
    β”‚   β”‚               β”‚   └── logging
    β”‚   β”‚               β”‚       β”œβ”€β”€ GlobalExceptionHandler.java
    β”‚   β”‚               β”‚       β”œβ”€β”€ LogInfo.java
    β”‚   β”‚               β”‚       └── LoggingAspect.java
    β”‚   β”‚               β”œβ”€β”€ config
    β”‚   β”‚               β”‚   └── RestTemplateConfig.java
    β”‚   β”‚               β”œβ”€β”€ datakey
    β”‚   β”‚               β”‚   β”œβ”€β”€ controller
    β”‚   β”‚               β”‚   β”‚   └── DataKeyController.java
    β”‚   β”‚               β”‚   β”œβ”€β”€ dto
    β”‚   β”‚               β”‚   β”‚   β”œβ”€β”€ DecryptionKeysResponseDto.java
    β”‚   β”‚               β”‚   β”‚   β”œβ”€β”€ EncryptedDataKeyDto.java
    β”‚   β”‚               β”‚   β”‚   β”œβ”€β”€ EncryptionKeysResponseDto.java
    β”‚   β”‚               β”‚   β”‚   └── RegenerateKeysResponseDto.java
    β”‚   β”‚               β”‚   β”œβ”€β”€ model
    β”‚   β”‚               β”‚   β”‚   └── MasterKeyData.java
    β”‚   β”‚               β”‚   └── service
    β”‚   β”‚               β”‚       └── DataKeyService.java
    β”‚   β”‚               β”œβ”€β”€ jwtsecretkey
    β”‚   β”‚               β”‚   β”œβ”€β”€ controller
    β”‚   β”‚               β”‚   β”‚   └── JwtSecretKeyController.java
    β”‚   β”‚               β”‚   └── service
    β”‚   β”‚               β”‚       └── JwtSecretKeyService.java
    β”‚   β”‚               β”œβ”€β”€ masterkey
    β”‚   β”‚               β”‚   β”œβ”€β”€ entity
    β”‚   β”‚               β”‚   β”‚   └── MasterKey.java
    β”‚   β”‚               β”‚   β”œβ”€β”€ repository
    β”‚   β”‚               β”‚   β”‚   └── MasterKeyRepository.java
    β”‚   β”‚               β”‚   └── service
    β”‚   β”‚               β”‚       └── MasterKeyService.java
    β”‚   β”‚               └── util
    β”‚   β”‚                   β”œβ”€β”€ AesUtil.java
    β”‚   β”‚                   └── HmacUtil.java
    β”‚   └── resources
    β”‚       └── logback-spring.xml
    └── test
        └── java
            └── world
                └── pasds
                    └── kms
                        β”œβ”€β”€ KmsApplicationTests.java
                        └── MasterKeyServiceTest.java

Android

β”œβ”€β”€ and_structure.txt
β”œβ”€β”€ app
β”‚   β”œβ”€β”€ build.gradle.kts
β”‚   β”œβ”€β”€ proguard-rules.pro
β”‚   └── src
β”‚       └── main
β”‚           β”œβ”€β”€ AndroidManifest.xml
β”‚           β”œβ”€β”€ java
β”‚           β”‚   └── com
β”‚           β”‚       └── world
β”‚           β”‚           └── pasds
β”‚           β”‚               β”œβ”€β”€ GenerateTotpActivity.kt
β”‚           β”‚               β”œβ”€β”€ MainActivity.kt
β”‚           β”‚               └── ui
β”‚           β”‚                   └── theme
β”‚           β”‚                       β”œβ”€β”€ Color.kt
β”‚           β”‚                       β”œβ”€β”€ Theme.kt
β”‚           β”‚                       └── Type.kt
β”‚           └── res
β”‚               β”œβ”€β”€ drawable
β”‚               β”‚   β”œβ”€β”€ ic_launcher.xml
β”‚               β”‚   β”œβ”€β”€ ic_launcher_background.xml
β”‚               β”‚   β”œβ”€β”€ ic_launcher_foreground.xml
β”‚               β”‚   β”œβ”€β”€ qr_code_scan.png
β”‚               β”‚   └── two_factor_authentication.png
β”‚               β”œβ”€β”€ mipmap-hdpi
β”‚               β”‚   β”œβ”€β”€ ic_launcher.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_background.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_foreground.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_monochrome.png
β”‚               β”‚   └── ic_launcher_round.png
β”‚               β”œβ”€β”€ mipmap-mdpi
β”‚               β”‚   β”œβ”€β”€ ic_launcher.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_background.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_foreground.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_monochrome.png
β”‚               β”‚   └── ic_launcher_round.png
β”‚               β”œβ”€β”€ mipmap-xhdpi
β”‚               β”‚   β”œβ”€β”€ ic_launcher.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_background.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_foreground.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_monochrome.png
β”‚               β”‚   └── ic_launcher_round.png
β”‚               β”œβ”€β”€ mipmap-xxhdpi
β”‚               β”‚   β”œβ”€β”€ ic_launcher.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_background.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_foreground.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_monochrome.png
β”‚               β”‚   └── ic_launcher_round.png
β”‚               β”œβ”€β”€ mipmap-xxxhdpi
β”‚               β”‚   β”œβ”€β”€ ic_launcher.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_background.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_foreground.png
β”‚               β”‚   β”œβ”€β”€ ic_launcher_monochrome.png
β”‚               β”‚   └── ic_launcher_round.png
β”‚               β”œβ”€β”€ values
β”‚               β”‚   β”œβ”€β”€ colors.xml
β”‚               β”‚   β”œβ”€β”€ strings.xml
β”‚               β”‚   └── themes.xml
β”‚               └── xml
β”‚                   β”œβ”€β”€ backup_rules.xml
β”‚                   └── data_extraction_rules.xml
β”œβ”€β”€ build.gradle.kts
β”œβ”€β”€ gradle
β”‚   β”œβ”€β”€ libs.versions.toml
β”‚   └── wrapper
β”‚       β”œβ”€β”€ gradle-wrapper.jar
β”‚       └── gradle-wrapper.properties
β”œβ”€β”€ gradle.properties
β”œβ”€β”€ gradlew
β”œβ”€β”€ gradlew.bat
└── settings.gradle.kts

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 50.4%
  • Vue 43.8%
  • JavaScript 3.2%
  • Kotlin 2.3%
  • CSS 0.3%
  • HTML 0.0%
0