utils/validation.go (133 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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. */ // qualifiedname.go package utils import ( "encoding/json" "github.com/apache/openwhisk-client-go/whisk" "github.com/apache/openwhisk-wskdeploy/wski18n" "github.com/apache/openwhisk-wskdeploy/wskprint" "strings" ) var LocalLicenseRecords = map[string][]string{ "APACHE": {"1.0", "1.1", "2.0"}, "LGPL": {"2.0", "2.1", "3.0"}, "GPL": {"1.0", "2.0", "3.0"}, "MPL": {"1.0", "1.1", "2.0", "2.0-no-copyleft-exception"}, "BSD": {"2-Clause", "2-Clause-FreeBSD", "2-Clause-NetBSD", "3-Clause", "3-Clause-Clear", "3-Clause-No-Nuclear-License", "3-Clause-No-Nuclear-License-2014", "3-Clause-No-Nuclear-Warranty", "3-Clause-Attribution", "4-Clause", "Protection", "Source-Code", "4-Clause-UC", "3-Clause-LBNL"}, "0BSD": {""}, "GFDL": {"1.0", "1.2", "1.3"}, "AGPL": {"3.0"}, "MIT": {"", "feh", "enna", "advertising", "CMU"}, "AFL": {"1.1", "1.2", "2.0", "2.1", "3.0"}, "APSL": {"1.0", "1.1", "1.2", "2.0"}, "EPL": {"1.0"}, "OSL": {"1.0", "1.1", "2.0", "2.1", "3.0"}, "PHP": {"3.0", "3.01"}, } var RemoteLicenseURL = "https://raw.githubusercontent.com/spdx/license-list-data/master/json/licenses.json" type LicenseJSON struct { Description string `json:"licenseListVersion"` Licenses []LicenseItem `json:"licenses"` ReleaseDate string `json:"releaseDate"` } type LicenseItem struct { Name string `json:"name"` LicenseID string `json:"licenseId"` } var license_json = LicenseJSON{} //Check if the license is valid //Check local data record at first //Then check remote json data func CheckLicense(license string) bool { // TODO(#673) Strict flag should cause an error to be generated if !LicenseLocalValidation(license) && !LicenseRemoteValidation(license) { warningString := wski18n.T( wski18n.ID_WARN_KEYVALUE_INVALID, map[string]interface{}{ wski18n.KEY_KEY: license}) wskprint.PrintlnOpenWhiskWarning(warningString) return false } return true } // Check if the license is in local license record // If it is, return ture // If it is not, return false func LicenseLocalValidation(license string) bool { license_upper := strings.ToUpper(license) //change it to upper case parts := strings.SplitN(license_upper, "-", 2) license_type := parts[0] license_version := "" if len(parts) > 1 { license_version = parts[1] } version_list := LocalLicenseRecords[license_type] if version_list == nil { return false } else { for _, version := range LocalLicenseRecords[license_type] { if license_version == strings.ToUpper(version) { return true } } return false } } //Check if license is one of validate license in //https://github.com/spdx/license-list-data/blob/master/json/licenses.json // If it is, return ture // If it is not, return false func LicenseRemoteValidation(license string) bool { license_upper := strings.ToUpper(license) //change it to upper case if len(license_json.Licenses) == 0 { json_data, err := Read(RemoteLicenseURL) if err != nil { // TODO() i18n errString := wski18n.T("Failed to get the remote license json.\n") whisk.Debug(whisk.DbgError, errString) return false } //parse json err = json.Unmarshal(json_data, &license_json) if err != nil || len(license_json.Licenses) == 0 { // TODO() i18n errString := wski18n.T("Failed to parse the remote license json.\n") whisk.Debug(whisk.DbgError, errString) return false } } //check license for _, licenseobj := range license_json.Licenses { if strings.ToUpper(licenseobj.LicenseID) == license_upper { return true } } return false } //if valid or nil, true //or else, false func LimitsTimeoutValidation(timeout *int) bool { if timeout == nil { return true } if *timeout < 100 { // Do not allow invalid limit to be added to API wskprint.PrintlnOpenWhiskWarning(wski18n.T(wski18n.ID_WARN_LIMITS_TIMEOUT)) return false } else if *timeout > 600000 { // Emit a warning, but allow to pass through to provider wskprint.PrintlnOpenWhiskWarning(wski18n.T(wski18n.ID_WARN_LIMITS_TIMEOUT)) } return true } //if valid or nil, true //or else, false func LimitsMemoryValidation(memory *int) bool { if memory == nil { return true } if *memory < 128 { // Do not allow invalid limit to be added to API wskprint.PrintlnOpenWhiskWarning(wski18n.T(wski18n.ID_WARN_LIMITS_MEMORY_SIZE)) return false } else if *memory > 2048 { // Emit a warning, but allow to pass through to provider wskprint.PrintlnOpenWhiskWarning(wski18n.T(wski18n.ID_WARN_LIMITS_MEMORY_SIZE)) } return true } //if valid or nil, true //or else, false func LimitsLogsizeValidation(logsize *int) bool { if logsize == nil { return true } if *logsize < 0 { // Do not allow invalid limit to be added to API wskprint.PrintlnOpenWhiskWarning(wski18n.T(wski18n.ID_WARN_LIMITS_LOG_SIZE)) return false } else if *logsize > 10 { // Emit a warning, but allow to pass through to provider wskprint.PrintlnOpenWhiskWarning(wski18n.T(wski18n.ID_WARN_LIMITS_LOG_SIZE)) } return true } func NotSupportLimits(value *int, name string) { if value != nil { warningString := wski18n.T( wski18n.ID_WARN_LIMIT_UNCHANGEABLE_X_name_X, map[string]interface{}{wski18n.KEY_NAME: name}) wskprint.PrintlnOpenWhiskWarning(warningString) } }