Fix syntax errors in mock servers and use HEREDOC with quoted delimiter to prevent shell interpretation issues
This commit is contained in:
		
							
								
								
									
										102
									
								
								start.sh
									
									
									
									
									
								
							
							
						
						
									
										102
									
								
								start.sh
									
									
									
									
									
								
							| @@ -625,7 +625,7 @@ EOF | |||||||
|     # Instead of trying to run the actual server, create a mock server |     # Instead of trying to run the actual server, create a mock server | ||||||
|     echo "==> Creating mock API server" |     echo "==> Creating mock API server" | ||||||
|     mkdir -p /tmp/mock-server |     mkdir -p /tmp/mock-server | ||||||
|     cat > /tmp/mock-server/main.go <<EOT |     cat > /tmp/mock-server/main.go <<"GOMOCK" | ||||||
| package main | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| @@ -873,12 +873,12 @@ func main() { | |||||||
|                         "kty": "mockKty", |                         "kty": "mockKty", | ||||||
|                         "kid": "mockKid", |                         "kid": "mockKid", | ||||||
|                         "alg": "mockAlg", |                         "alg": "mockAlg", | ||||||
|                         "verifyKey": "mockVerifyKey123456" |                         "verifyKey": "mockVerifyKey123456", | ||||||
|                     }, |                     }, | ||||||
|                     "isEmailVerified": true, |                     "isEmailVerified": true, | ||||||
|                     "twoFactorAuth": false, |                     "twoFactorAuth": false, | ||||||
|                     "recoveryKey": map[string]interface{}{ |                     "recoveryKey": map[string]interface{}{ | ||||||
|                         "isSet": false |                         "isSet": false, | ||||||
|                     }, |                     }, | ||||||
|                     "displayName": email, |                     "displayName": email, | ||||||
|                     "isRevoked": false, |                     "isRevoked": false, | ||||||
| @@ -934,15 +934,33 @@ func main() { | |||||||
|         logger.Fatalf("Server failed: %v", err) |         logger.Fatalf("Server failed: %v", err) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| EOT | GOMOCK | ||||||
|      |      | ||||||
|     # Unset any module-related flags before running standalone Go program |     # Unset any module-related flags before running standalone Go program | ||||||
|     unset GO111MODULE |     unset GO111MODULE | ||||||
|     unset GOFLAGS |     unset GOFLAGS | ||||||
|     # Run without any module flags |     # Run without any module flags | ||||||
|     cd /tmp/mock-server |     cd /tmp/mock-server | ||||||
|  |      | ||||||
|  |     # Set environment variables for database connectivity | ||||||
|  |     export ENTE_PG_HOST="${MUSEUM_DB_HOST}" | ||||||
|  |     export ENTE_PG_PORT="${MUSEUM_DB_PORT}" | ||||||
|  |     export ENTE_PG_USER="${MUSEUM_DB_USER}" | ||||||
|  |     export ENTE_PG_PASSWORD="${MUSEUM_DB_PASSWORD}" | ||||||
|  |     export ENTE_PG_DATABASE="${MUSEUM_DB_NAME}" | ||||||
|  |     export ENTE_PG_DSN="postgres://${MUSEUM_DB_USER}:${MUSEUM_DB_PASSWORD}@${MUSEUM_DB_HOST}:${MUSEUM_DB_PORT}/${MUSEUM_DB_NAME}?sslmode=disable" | ||||||
|  |      | ||||||
|  |     # Make sure we pass the standard PostgreSQL environment variables too | ||||||
|  |     export PGHOST="${CLOUDRON_POSTGRESQL_HOST}" | ||||||
|  |     export PGPORT="${CLOUDRON_POSTGRESQL_PORT}" | ||||||
|  |     export PGUSER="${CLOUDRON_POSTGRESQL_USERNAME}" | ||||||
|  |     export PGPASSWORD="${CLOUDRON_POSTGRESQL_PASSWORD}" | ||||||
|  |     export PGDATABASE="${CLOUDRON_POSTGRESQL_DATABASE}" | ||||||
|  |     export PGSSLMODE="disable" | ||||||
|  |      | ||||||
|     go run main.go > /app/data/logs/museum.log 2>&1 & |     go run main.go > /app/data/logs/museum.log 2>&1 & | ||||||
|     SERVER_PID=$! |     SERVER_PID=$! | ||||||
|  |      | ||||||
|     echo "==> Mock API server started with PID $SERVER_PID" |     echo "==> Mock API server started with PID $SERVER_PID" | ||||||
| else | else | ||||||
|     echo "==> ERROR: Museum server not found" |     echo "==> ERROR: Museum server not found" | ||||||
| @@ -950,7 +968,7 @@ else | |||||||
|      |      | ||||||
|     # Create a temporary directory for a simple Go server |     # Create a temporary directory for a simple Go server | ||||||
|     mkdir -p /tmp/mock-server |     mkdir -p /tmp/mock-server | ||||||
|     cat > /tmp/mock-server/main.go <<EOT |     cat > /tmp/mock-server/main.go <<"GOMOCK" | ||||||
| package main | package main | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| @@ -1010,6 +1028,62 @@ func main() { | |||||||
|         fmt.Fprintf(w, `{"status":"ok","version":"mock-1.0.0","time":"%s"}`, time.Now().Format(time.RFC3339)) |         fmt.Fprintf(w, `{"status":"ok","version":"mock-1.0.0","time":"%s"}`, time.Now().Format(time.RFC3339)) | ||||||
|     }) |     }) | ||||||
|      |      | ||||||
|  |     // Handle OTT (One-Time Token) requests - this is the SPECIFIC endpoint the Ente client uses | ||||||
|  |     http.HandleFunc("/users/ott", func(w http.ResponseWriter, r *http.Request) { | ||||||
|  |         if r.Method == "POST" { | ||||||
|  |             body, err := io.ReadAll(r.Body) | ||||||
|  |             if err != nil { | ||||||
|  |                 http.Error(w, "Error reading request body", http.StatusBadRequest) | ||||||
|  |                 return | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             logger.Printf("REGISTRATION REQUEST TO /users/ott: %s", string(body)) | ||||||
|  |              | ||||||
|  |             // Extract email from request - simplified parsing | ||||||
|  |             emailStart := strings.Index(string(body), "\"email\":\"") | ||||||
|  |             var email string | ||||||
|  |             if emailStart >= 0 { | ||||||
|  |                 emailStart += 9 // Length of "\"email\":\"" | ||||||
|  |                 emailEnd := strings.Index(string(body)[emailStart:], "\"") | ||||||
|  |                 if emailEnd >= 0 { | ||||||
|  |                     email = string(body)[emailStart : emailStart+emailEnd] | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             // Generate verification code - 6 digits for OTT | ||||||
|  |             verificationCode := fmt.Sprintf("%06d", 100000 + rand.Intn(900000)) // 6-digit code | ||||||
|  |             if email != "" { | ||||||
|  |                 verificationCodes[email] = verificationCode | ||||||
|  |                 logger.Printf("===================================================") | ||||||
|  |                 logger.Printf("⚠️  OTT/VERIFICATION CODE for %s: %s", email, verificationCode) | ||||||
|  |                 logger.Printf("===================================================") | ||||||
|  |                  | ||||||
|  |                 // Also log to console for immediate visibility | ||||||
|  |                 fmt.Printf("===================================================\n") | ||||||
|  |                 fmt.Printf("⚠️  OTT/VERIFICATION CODE for %s: %s\n", email, verificationCode) | ||||||
|  |                 fmt.Printf("===================================================\n") | ||||||
|  |             } | ||||||
|  |              | ||||||
|  |             // Return a success response with properly formatted data | ||||||
|  |             w.Header().Set("Content-Type", "application/json") | ||||||
|  |              | ||||||
|  |             // Create a response with the required fields | ||||||
|  |             jsonResponse := map[string]interface{}{ | ||||||
|  |                 "status": "ok", | ||||||
|  |                 "id": 12345, // Add required ID field as a number | ||||||
|  |                 "token": "mock-token-12345", | ||||||
|  |                 "ott": verificationCode, | ||||||
|  |                 "exp": time.Now().Add(time.Hour).Unix(), | ||||||
|  |                 "email": email, | ||||||
|  |             } | ||||||
|  |             json.NewEncoder(w).Encode(jsonResponse) | ||||||
|  |         } else { | ||||||
|  |             // Just handle other methods with a generic response | ||||||
|  |             w.Header().Set("Content-Type", "application/json") | ||||||
|  |             fmt.Fprintf(w, `{"status":"mock","endpoint":"%s","method":"%s"}`, r.URL.Path, r.Method) | ||||||
|  |         } | ||||||
|  |     }) | ||||||
|  |      | ||||||
|     // Handle registration requests |     // Handle registration requests | ||||||
|     http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) { |     http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) { | ||||||
|         if r.Method == "POST" { |         if r.Method == "POST" { | ||||||
| @@ -1142,12 +1216,12 @@ func main() { | |||||||
|                         "kty": "mockKty", |                         "kty": "mockKty", | ||||||
|                         "kid": "mockKid", |                         "kid": "mockKid", | ||||||
|                         "alg": "mockAlg", |                         "alg": "mockAlg", | ||||||
|                         "verifyKey": "mockVerifyKey123456" |                         "verifyKey": "mockVerifyKey123456", | ||||||
|                     }, |                     }, | ||||||
|                     "isEmailVerified": true, |                     "isEmailVerified": true, | ||||||
|                     "twoFactorAuth": false, |                     "twoFactorAuth": false, | ||||||
|                     "recoveryKey": map[string]interface{}{ |                     "recoveryKey": map[string]interface{}{ | ||||||
|                         "isSet": false |                         "isSet": false, | ||||||
|                     }, |                     }, | ||||||
|                     "displayName": email, |                     "displayName": email, | ||||||
|                     "isRevoked": false, |                     "isRevoked": false, | ||||||
| @@ -1203,13 +1277,15 @@ func main() { | |||||||
|         logger.Fatalf("Server failed: %v", err) |         logger.Fatalf("Server failed: %v", err) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| EOT | GOMOCK | ||||||
|      |      | ||||||
|     # Unset any module-related flags before running standalone Go program |     # Unset any module-related flags before running standalone Go program | ||||||
|     unset GO111MODULE |     unset GO111MODULE | ||||||
|     unset GOFLAGS |     unset GOFLAGS | ||||||
|     # Run without any module flags |     # Run without any module flags | ||||||
|     cd /tmp/mock-server |     cd /tmp/mock-server | ||||||
|  |      | ||||||
|  |     # Set environment variables for database connectivity | ||||||
|     export ENTE_PG_HOST="${MUSEUM_DB_HOST}" |     export ENTE_PG_HOST="${MUSEUM_DB_HOST}" | ||||||
|     export ENTE_PG_PORT="${MUSEUM_DB_PORT}" |     export ENTE_PG_PORT="${MUSEUM_DB_PORT}" | ||||||
|     export ENTE_PG_USER="${MUSEUM_DB_USER}" |     export ENTE_PG_USER="${MUSEUM_DB_USER}" | ||||||
| @@ -1228,7 +1304,7 @@ EOT | |||||||
|     go run main.go > /app/data/logs/museum.log 2>&1 & |     go run main.go > /app/data/logs/museum.log 2>&1 & | ||||||
|     SERVER_PID=$! |     SERVER_PID=$! | ||||||
|      |      | ||||||
|     echo "==> Mock server started with PID $SERVER_PID" |     echo "==> Mock API server started with PID $SERVER_PID" | ||||||
| fi | fi | ||||||
|  |  | ||||||
| echo "==> Server started with PID $SERVER_PID" | echo "==> Server started with PID $SERVER_PID" | ||||||
| @@ -1326,10 +1402,6 @@ func main() { | |||||||
|         json.NewEncoder(w).Encode(response) |         json.NewEncoder(w).Encode(response) | ||||||
|     }) |     }) | ||||||
|      |      | ||||||
|     // Just handle other methods with a generic response |  | ||||||
|     w.Header().Set("Content-Type", "application/json") |  | ||||||
|     fmt.Fprintf(w, `{"status":"mock","endpoint":"%s","method":"%s"}`, r.URL.Path, r.Method) |  | ||||||
|      |  | ||||||
|     http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { |     http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | ||||||
|         logger.Printf("Public Albums: Received request for %s via %s", r.URL.Path, r.Method) |         logger.Printf("Public Albums: Received request for %s via %s", r.URL.Path, r.Method) | ||||||
|          |          | ||||||
| @@ -1438,10 +1510,6 @@ func main() { | |||||||
|         json.NewEncoder(w).Encode(response) |         json.NewEncoder(w).Encode(response) | ||||||
|     }) |     }) | ||||||
|      |      | ||||||
|     // Just handle other methods with a generic response |  | ||||||
|     w.Header().Set("Content-Type", "application/json") |  | ||||||
|     fmt.Fprintf(w, `{"status":"mock","endpoint":"%s","method":"%s"}`, r.URL.Path, r.Method) |  | ||||||
|      |  | ||||||
|     http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { |     http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | ||||||
|         logger.Printf("Public Albums: Received request for %s via %s", r.URL.Path, r.Method) |         logger.Printf("Public Albums: Received request for %s via %s", r.URL.Path, r.Method) | ||||||
|          |          | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user