/* * Copyright (c) 2020 InterDigital Communications, Inc * * Licensed under the Apache License, Version 2.0 (the \"License\"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an \"AS IS\" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * AdvantEDGE Platform Controller REST API * * This API is the main Platform Controller API for scenario configuration & sandbox management

**Micro-service**
[meep-pfm-ctrl](https://github.com/InterDigitalInc/AdvantEDGE/tree/master/go-apps/meep-platform-ctrl)

**Type & Usage**
Platform main interface used by controller software to configure scenarios and manage sandboxes in the AdvantEDGE platform

**Details**
API details available at _your-AdvantEDGE-ip-address/api_ * * API version: 1.0.0 * Contact: AdvantEDGE@InterDigital.com * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) */ package server import ( "encoding/json" "errors" "fmt" "net/http" dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model" log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger" sm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions" ) func uaLoginUser(w http.ResponseWriter, r *http.Request) { log.Info("----- LOGIN -----") var sandboxName string // Get form data username := r.FormValue("username") password := r.FormValue("password") // Validate user credentials authenticated, err := pfmCtrl.userStore.AuthenticateUser(username, password) if err != nil || !authenticated { http.Error(w, "Unauthorized", http.StatusUnauthorized) return } // Get existing session by user name, if any sessionStore := pfmCtrl.sessionMgr.GetSessionStore() session, err := sessionStore.GetByName(username) if err != nil { // Check if max session count is reached before creating a new one count := sessionStore.GetCount() if count >= pfmCtrl.maxSessions { err = errors.New("Maximum session count exceeded") log.Error(err.Error()) http.Error(w, err.Error(), http.StatusServiceUnavailable) return } // Get requested sandbox name from user profile, if any user, err := pfmCtrl.userStore.GetUser(username) if err == nil { sandboxName = user.Sboxname } // Get a new unique sanbox name if not configured in user profile if sandboxName == "" { sandboxName = getUniqueSandboxName() if sandboxName == "" { err = errors.New("Failed to generate a unique sandbox name") log.Error(err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } } // Create sandbox in DB var sandboxConfig dataModel.SandboxConfig err = createSandbox(sandboxName, &sandboxConfig) if err != nil { log.Error("Failed to create sandbox with error: ", err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } // Create new session session = new(sm.Session) session.ID = "" session.Username = username session.Sandbox = sandboxName session.Role = user.Role } else { sandboxName = session.Sandbox } // Set session err = sessionStore.Set(session, w, r) if err != nil { log.Error("Failed to set session with err: ", err.Error()) // Remove newly created sandbox on failure if session.ID == "" { deleteSandbox(sandboxName) } return } // Prepare response var sandbox dataModel.Sandbox sandbox.Name = sandboxName // Format response jsonResponse, err := json.Marshal(sandbox) if err != nil { log.Error(err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) return } // Send response w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) fmt.Fprint(w, string(jsonResponse)) } func uaLogoutUser(w http.ResponseWriter, r *http.Request) { log.Info("----- LOGOUT -----") // Get existing session sessionStore := pfmCtrl.sessionMgr.GetSessionStore() session, err := sessionStore.Get(r) if err == nil { // Delete sandbox deleteSandbox(session.Sandbox) } // Delete session err = sessionStore.Del(w, r) if err != nil { log.Error("Failed to delete session with err: ", err.Error()) return } w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) } func uaTriggerWatchdog(w http.ResponseWriter, r *http.Request) { // Refresh session sessionStore := pfmCtrl.sessionMgr.GetSessionStore() err := sessionStore.Refresh(w, r) if err != nil { log.Error("Failed to refresh session with err: ", err.Error()) return } w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) }