From 89065bb1412f9cdcd9d88e81c2f35906eb5e755a Mon Sep 17 00:00:00 2001 From: FrostWalk Date: Mon, 30 Sep 2024 00:28:52 +0200 Subject: [PATCH] Made invite code and group optional. created build script --- .dockerignore | 4 +- .gitignore | 3 +- Dockerfile | 2 +- README.md | 27 ++++++++++---- assets/images/success.png | Bin 0 -> 34100 bytes build.sh | 44 ++++++++++++++++++++++ config/config.go | 44 +++++++++++++++------- docker-compose.yml | 2 +- github/github.go | 31 ++++++++++++++++ handlers/handlers.go | 53 ++++++++++++++++++-------- hash/hash.go | 28 +++++++++++--- main.go | 4 +- templates/index-code.html | 76 ++++++++++++++++++++++++++++++++++++++ templates/index.html | 10 +---- 14 files changed, 271 insertions(+), 57 deletions(-) create mode 100644 assets/images/success.png create mode 100755 build.sh create mode 100644 templates/index-code.html diff --git a/.dockerignore b/.dockerignore index 3fa43d4..fc1c469 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,4 +5,6 @@ Dockerfile docker-compose.yml LICENSE README.md -assets/ \ No newline at end of file +assets/ +build/ +build.sh \ No newline at end of file diff --git a/.gitignore b/.gitignore index 8a6f179..99f2df6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ gopath/ -.idea/ \ No newline at end of file +.idea/ +build/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index d2a04bb..b81d623 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ CMD ["/inviter"] ENV GITHUB_ORG_NAME="" ENV GITHUB_TOKEN="" ENV GITHUB_GROUP_NAME="" -ENV INVITE_CODE="" +ENV INVITE_CODE_HASH="" ENV TLS_CERT="" ENV TLS_KEY="" ENV HTTP_PORT="80" diff --git a/README.md b/README.md index bd7a7c8..8c57b3f 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # GitHub Inviter -GitHub Inviter is a web application that allows users to join a specific GitHub organization and team using an -invitation code. The application provides a simple web interface where users can enter their GitHub username and the -provided invitation code to get added to the organization's team. +GitHub Inviter is a web application that allows users to join a specific GitHub organization and a team (optional) using +an invitation code (optional). The application provides a simple web interface where users can enter their +GitHub username and the provided invitation code to get added to the organization's team. ## Features @@ -14,6 +14,7 @@ provided invitation code to get added to the organization's team. ## Screenshot ![Screenshot](/assets/images/index.png) +![Screenshot](/assets/images/success.png) ## Configuration @@ -23,13 +24,21 @@ The application is configured using environment variables. Here are the availabl |----------------------|---------------------------------------------------------|----------|---------| | `GITHUB_ORG_NAME` | The name of your GitHub organization | Yes | - | | `GITHUB_TOKEN` | GitHub personal access token with necessary permissions | Yes | - | -| `GITHUB_GROUP_NAME` | The name of the team in your organization | Yes | - | -| `INVITE_CODE` | The invitation code users need to provide | Yes | - | +| `GITHUB_GROUP_NAME` | The name of the team in your organization | No | - | +| `INVITE_CODE_HASH` | The invitation code users need to provide | No | - | | `HTTP_PORT` | The port on which the application will run | No | 80 | | `HTTPS_PORT` | The port on which the application will run (https) | No | 443 | | `TLS_CERT` | Path to the TLS certificate file | No | - | | `TLS_KEY` | Path to the TLS key file | No | - | +### How to generate the INVITE_CODE_HASH + +- On Linux: + - open a terminal + - write `echo -n 'invite code' | sha256sum` where *invite code* is your string **leave the '** +- On any other: + - go [here](https://emn178.github.io/online-tools/sha256.html) + ## Running with Docker Compose Here's an example `docker-compose.yml` file to run the GitHub Inviter: @@ -43,10 +52,10 @@ services: - GITHUB_ORG_NAME=your-org-name - GITHUB_TOKEN=your-github-token - GITHUB_GROUP_NAME=your-team-name - - INVITE_CODE=your-invite-code + - INVITE_CODE_HASH=your-invite-code - HTTP_PORT=80 - - HTTPS_PORT=443 # Uncomment the following lines if you want to use TLS + # - HTTPS_PORT=443 # - TLS_CERT=/path/to/your/cert.pem # - TLS_KEY=/path/to/your/key.pem ports: @@ -68,7 +77,9 @@ To run the application: docker-compose up -d ``` -The application will be available at `http://127.0.0.1:8080` (or `https://127.0.0.1:8080` if TLS is configured). +The application will be available at `http://127.0.0.1/` (or `https://127.0.0.1/` if TLS is configured) unless +otherwise +specified with environment variables. ## About the token diff --git a/assets/images/success.png b/assets/images/success.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8129a6445c9f3377226ad1e6065bdb5c97d2f5 GIT binary patch literal 34100 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 2 && hexString[:2] == "0x" { + hexString = hexString[2:] + } + + // Decode hex string to byte slice + byteArray, err := hex.DecodeString(hexString) + if err != nil { + log.Fatalf("failed to decode hex string: %v", err) + } + + return byteArray } diff --git a/main.go b/main.go index 9287b86..6f78bff 100644 --- a/main.go +++ b/main.go @@ -11,7 +11,7 @@ import ( func main() { // Load configuration - tlsEnable := config.Load() + config.Load() // Handle form submission http.HandleFunc("/submit", handlers.Submit) @@ -29,7 +29,7 @@ func main() { log.Fatalf("Error initializing cache: %v", err) } - if tlsEnable { + if config.IsTlsEnable() { go func() { // Start HTTP server that redirects all traffic to HTTPS log.Println("Starting HTTP to HTTPS redirect") diff --git a/templates/index-code.html b/templates/index-code.html new file mode 100644 index 0000000..a0da9b5 --- /dev/null +++ b/templates/index-code.html @@ -0,0 +1,76 @@ + + + + + + Join {{.OrgName}} + + + +
+ {{.OrgName}} Logo +

Join {{.OrgName}}{{.TeamName}}

+
+ + +

Do not enter your GitHub password

+ +
+
+ + \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 8f27600..9d99f6d 100644 --- a/templates/index.html +++ b/templates/index.html @@ -15,12 +15,6 @@ background-color: #f0f0f0; } - .warning { - color: red; - font-size: 1rem; - margin-top: 0.2rem; - } - .container { background-color: white; padding: 2rem; @@ -64,11 +58,9 @@
{{.OrgName}} Logo -

Join {{.OrgName}}'s {{.TeamName}}

+

Join {{.OrgName}}{{.TeamName}}

- -

Do not enter your GitHub password