diff --git a/labs/SpringDataJPATest/.gitignore b/labs/SpringDataJPATest/.gitignore new file mode 100644 index 00000000..0d82a354 --- /dev/null +++ b/labs/SpringDataJPATest/.gitignore @@ -0,0 +1,30 @@ +# Operating System Files + +*.DS_Store +Thumbs.db + +# Build Files # + +bin +target +build/ +.gradle + +# Eclipse Project Files # + +.classpath +.project +.settings + +# IntelliJ IDEA Files # + +*.iml +*.ipr +*.iws +*.idea + +# Spring Bootstrap artifacts + +dependency-reduced-pom.xml +out +README.html \ No newline at end of file diff --git a/labs/SpringDataJPATest/build.gradle b/labs/SpringDataJPATest/build.gradle new file mode 100644 index 00000000..5265aafe --- /dev/null +++ b/labs/SpringDataJPATest/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'org.springframework.boot' version '2.2.2.RELEASE' + id 'io.spring.dependency-management' version '1.0.8.RELEASE' + id 'java' +} + +group 'com.nbaxp' +version '1.0-SNAPSHOT' + +repositories { + maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'} +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-data-rest' + runtimeOnly 'com.h2database:h2' + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.jar b/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..f3d88b1c Binary files /dev/null and b/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.jar differ diff --git a/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.properties b/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..608f95c6 --- /dev/null +++ b/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu May 07 11:59:56 CST 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/labs/SpringDataJPATest/gradlew b/labs/SpringDataJPATest/gradlew new file mode 100644 index 00000000..2fe81a7d --- /dev/null +++ b/labs/SpringDataJPATest/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/labs/SpringDataJPATest/gradlew.bat b/labs/SpringDataJPATest/gradlew.bat new file mode 100644 index 00000000..9618d8d9 --- /dev/null +++ b/labs/SpringDataJPATest/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/labs/SpringDataJPATest/settings.gradle b/labs/SpringDataJPATest/settings.gradle new file mode 100644 index 00000000..a606194f --- /dev/null +++ b/labs/SpringDataJPATest/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'SpringDataJPATest' + diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Application.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Application.java new file mode 100644 index 00000000..8c66072c --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Application.java @@ -0,0 +1,13 @@ +package com.nbaxp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} \ No newline at end of file diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Controllers/HomeController.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Controllers/HomeController.java new file mode 100644 index 00000000..41979123 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Controllers/HomeController.java @@ -0,0 +1,23 @@ +package com.nbaxp.Controllers; + +import com.nbaxp.Entities.User; +import com.nbaxp.Services.UserService; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HomeController { + private final UserService userService; + + public HomeController(UserService userService) + { + this.userService=userService; + } + + @RequestMapping("/") + public Page index() + { + return this.userService.Query(); + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/BaseEntity.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/BaseEntity.java new file mode 100644 index 00000000..2944a624 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/BaseEntity.java @@ -0,0 +1,24 @@ +package com.nbaxp.Entities; + +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import java.util.UUID; + +@MappedSuperclass +public abstract class BaseEntity { + @Id + private String id; + + public BaseEntity() + { + this.id= UUID.randomUUID().toString(); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/Role.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/Role.java new file mode 100644 index 00000000..ed2c48b3 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/Role.java @@ -0,0 +1,31 @@ +package com.nbaxp.Entities; + +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import java.util.HashSet; +import java.util.Set; + +@Entity +public class Role extends BaseEntity { + + private String name; + + @OneToMany(mappedBy = "role") + private Set userRoles= new HashSet<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getUserRoles() { + return userRoles; + } + + public void setUserRoles(Set userRoles) { + this.userRoles = userRoles; + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/User.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/User.java new file mode 100644 index 00000000..49d24cb0 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/User.java @@ -0,0 +1,43 @@ +package com.nbaxp.Entities; + +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; +import java.util.HashSet; +import java.util.Set; + +@Table(uniqueConstraints = {@UniqueConstraint(columnNames = "userName"),@UniqueConstraint(columnNames = "email")}) +@Entity +public class User extends BaseEntity { + + private String userName; + private String email; + + @OneToMany(mappedBy = "user") + private Set userRoles= new HashSet<>(); + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Set getUserRoles() { + return userRoles; + } + + public void setUserRoles(Set userRoles) { + this.userRoles = userRoles; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/UserRole.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/UserRole.java new file mode 100644 index 00000000..c985b761 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/UserRole.java @@ -0,0 +1,38 @@ +package com.nbaxp.Entities; + +import javax.persistence.*; + +@Table(uniqueConstraints = {@UniqueConstraint(columnNames={"UserId", "RoleId"})}) +@Entity +public class UserRole extends BaseEntity { + + @Column(name = "UserId",nullable = false,updatable = false, insertable = false) + private String userId; + + @JoinColumn(name="UserId") + @ManyToOne + private User user; + + @Column(name="RoleId",nullable = false, updatable = false, insertable = false) + private String roleId; + + @JoinColumn(name="RoleId") + @ManyToOne + private Role role; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Repositories/UserRepository.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Repositories/UserRepository.java new file mode 100644 index 00000000..1393dd5c --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Repositories/UserRepository.java @@ -0,0 +1,8 @@ +package com.nbaxp.Repositories; + +import com.nbaxp.Entities.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface UserRepository extends JpaRepository,JpaSpecificationExecutor { +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Services/UserService.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Services/UserService.java new file mode 100644 index 00000000..7b0d3d33 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Services/UserService.java @@ -0,0 +1,35 @@ +package com.nbaxp.Services; + +import com.nbaxp.Entities.User; +import com.nbaxp.Repositories.UserRepository; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +public class UserService { + private final UserRepository userRepository; + + public UserService(UserRepository userRepository) + { + this.userRepository=userRepository; + } + + public Page Query() + { + User user = new User(); + user.setUserName("user"+ UUID.randomUUID().toString()); + user.setEmail("test@test.com"+ UUID.randomUUID().toString()); + this.userRepository.save(user); + List users= this.userRepository.findAll(); + Pageable pageRequest = PageRequest.of(0,10,Sort.by(Sort.Order.asc("id"))); + return this.userRepository.findAll((root, query, builder) -> { + return query.getRestriction(); + },pageRequest); + } +} diff --git a/labs/SpringDataJPATest/src/main/resources/application-development.properties b/labs/SpringDataJPATest/src/main/resources/application-development.properties new file mode 100644 index 00000000..39139478 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/resources/application-development.properties @@ -0,0 +1,4 @@ +spring.jpa.hibernate.ddl-auto=create +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace \ No newline at end of file diff --git a/labs/SpringDataJPATest/src/main/resources/application.properties b/labs/SpringDataJPATest/src/main/resources/application.properties new file mode 100644 index 00000000..1765f5cb --- /dev/null +++ b/labs/SpringDataJPATest/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port=5050 +spring.profiles.active=development \ No newline at end of file diff --git a/labs/WebApp/WebApp.sln b/labs/WebApp/WebApp.sln new file mode 100644 index 00000000..02dd3191 --- /dev/null +++ b/labs/WebApp/WebApp.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp", "WebApp.csproj", "{8763E5C0-790B-4A1D-A9CF-79A02118C559}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8763E5C0-790B-4A1D-A9CF-79A02118C559}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8763E5C0-790B-4A1D-A9CF-79A02118C559}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8763E5C0-790B-4A1D-A9CF-79A02118C559}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8763E5C0-790B-4A1D-A9CF-79A02118C559}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C9A67CB0-9D7E-40DA-B40E-7D53863BB159} + EndGlobalSection +EndGlobal diff --git a/labs/WebApp/wwwroot/index.html b/labs/WebApp/wwwroot/index.html index f1f37215..4425c86b 100644 --- a/labs/WebApp/wwwroot/index.html +++ b/labs/WebApp/wwwroot/index.html @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ - ʼ + home
@@ -18,7 +18,7 @@
-

+

loading

@@ -33,6 +33,7 @@ + diff --git a/labs/WebApp/wwwroot/js/app.js b/labs/WebApp/wwwroot/js/app.js index c1bd6b2c..70f2ebb2 100644 --- a/labs/WebApp/wwwroot/js/app.js +++ b/labs/WebApp/wwwroot/js/app.js @@ -1,4 +1,4 @@ -var userAgent = navigator.userAgent; +var userAgent = navigator.userAgent; var isApp = userAgent.indexOf('isapp') !== -1; //axios axios.interceptors.request.use( @@ -30,7 +30,7 @@ axios.interceptors.response.use(function (response) { console.log('拦截到返回错误:'); console.log(error.response); if (error.response.status === 401 && error.config.url.indexOf('refreshToken') === -1) { - var url = '/UserCenter/api/v1/token/refreshToken'; + var url = apiHost+'/UserCenter/api/v1/token/refreshToken'; var data = '"' + store.state.refreshToken + '"'; return axios.post(url, data, { headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) .then(function (response) { diff --git a/labs/WebApp/wwwroot/js/config.js b/labs/WebApp/wwwroot/js/config.js new file mode 100644 index 00000000..f6f5835b --- /dev/null +++ b/labs/WebApp/wwwroot/js/config.js @@ -0,0 +1,2 @@ +//var apiHost = "http://localhost"; +var apiHost = "http://iot.edusoa.com"; diff --git a/labs/WebApp/wwwroot/js/message.js b/labs/WebApp/wwwroot/js/message.js index 8b06a88b..2db4c5a8 100644 --- a/labs/WebApp/wwwroot/js/message.js +++ b/labs/WebApp/wwwroot/js/message.js @@ -1,4 +1,4 @@ -var hubUrl = "/IoTCenter/hub?group=page"; +var hubUrl = apiHost + "/IoTCenter/hub?group=page"; var connection = new signalR.HubConnectionBuilder().withUrl(hubUrl).build(); var connectionId; function connect() { diff --git a/labs/WebApp/wwwroot/js/util.js b/labs/WebApp/wwwroot/js/util.js index c4d8662d..6ba18982 100644 --- a/labs/WebApp/wwwroot/js/util.js +++ b/labs/WebApp/wwwroot/js/util.js @@ -50,7 +50,7 @@ function copy(from, to) { function execApi(number, method, query) { var loading = weui.loading('提交中...'); - axios.post('/IoTCenter/api/v1/api/execApi', { connectionId,number,method, query }) + axios.post(apiHost + '/IoTCenter/api/v1/api/execApi', { connectionId,number,method, query }) .then(function (response) { console.log(response); }) @@ -64,7 +64,7 @@ function execApi(number, method, query) { function execScene(id) { var loading = weui.loading('提交中...'); - axios.post('/IoTCenter/api/v1/api/execScene', '"' + id + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) + axios.post(apiHost + '/IoTCenter/api/v1/api/execScene', '"' + id + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) .then(function (response) { console.log(response); }) diff --git a/labs/WebApp/wwwroot/pages/home.js b/labs/WebApp/wwwroot/pages/home.js index 9dbfdbd3..341383a3 100644 --- a/labs/WebApp/wwwroot/pages/home.js +++ b/labs/WebApp/wwwroot/pages/home.js @@ -6,7 +6,7 @@ data() { return { title:'首页', - url: '/UserCenter/api/v1/user/getUserInfo' + url: apiHost + '/UserCenter/api/v1/user/getUserInfo' }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/device.js b/labs/WebApp/wwwroot/pages/iot/device.js index 6f9baf39..2d126331 100644 --- a/labs/WebApp/wwwroot/pages/iot/device.js +++ b/labs/WebApp/wwwroot/pages/iot/device.js @@ -5,7 +5,7 @@ template: response.data, data() { return { - url: '/IoTCenter/api/v1/device/getDevice?number=' + this.$route.query.number + url: apiHost + '/IoTCenter/api/v1/device/getDevice?number=' + this.$route.query.number }; }, mounted: function () { @@ -39,7 +39,7 @@ }, changeTime: function (key, time,title) { var vm = this; - var url = '/IoTCenter/api/v1/Device/GetChartData'; + var url = apiHost + '/IoTCenter/api/v1/Device/GetChartData'; var data = { number:this.device.number, key: key, diff --git a/labs/WebApp/wwwroot/pages/iot/node.js b/labs/WebApp/wwwroot/pages/iot/node.js index a60c6ece..1d8088b0 100644 --- a/labs/WebApp/wwwroot/pages/iot/node.js +++ b/labs/WebApp/wwwroot/pages/iot/node.js @@ -5,7 +5,7 @@ template: response.data, data() { return { - url: '/IoTCenter/api/v1/node/getNode?number=' + this.$route.query.number + url: apiHost + '/IoTCenter/api/v1/node/getNode?number=' + this.$route.query.number }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/nodes.js b/labs/WebApp/wwwroot/pages/iot/nodes.js index f8e2a841..aba7cc8a 100644 --- a/labs/WebApp/wwwroot/pages/iot/nodes.js +++ b/labs/WebApp/wwwroot/pages/iot/nodes.js @@ -6,7 +6,7 @@ data() { return { name: '智慧教室', - url: '/IoTCenter/api/v1/node/getNodes' + url: apiHost + '/IoTCenter/api/v1/node/getNodes' }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/product.js b/labs/WebApp/wwwroot/pages/iot/product.js index aed1f6b5..241b7c3e 100644 --- a/labs/WebApp/wwwroot/pages/iot/product.js +++ b/labs/WebApp/wwwroot/pages/iot/product.js @@ -5,7 +5,7 @@ template: response.data, data() { return { - url: '/IoTCenter/api/v1/product/getProduct?number=' + this.$route.query.number + url: apiHost + '/IoTCenter/api/v1/product/getProduct?number=' + this.$route.query.number }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/products.js b/labs/WebApp/wwwroot/pages/iot/products.js index bba4bfcd..eecd8d4d 100644 --- a/labs/WebApp/wwwroot/pages/iot/products.js +++ b/labs/WebApp/wwwroot/pages/iot/products.js @@ -6,7 +6,7 @@ data() { return { title: "产品", - url: '/IoTCenter/api/v1/product/getProducts' + url: apiHost + '/IoTCenter/api/v1/product/getProducts' }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/scenes.js b/labs/WebApp/wwwroot/pages/iot/scenes.js index 8ffc821a..9dbc2e95 100644 --- a/labs/WebApp/wwwroot/pages/iot/scenes.js +++ b/labs/WebApp/wwwroot/pages/iot/scenes.js @@ -6,7 +6,7 @@ data() { return { title: "场景", - url: '/IoTCenter/api/v1/Scene/GetScenes' + url: apiHost + '/IoTCenter/api/v1/Scene/GetScenes' }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/login.js b/labs/WebApp/wwwroot/pages/login.js index 67f7e7c7..1978b712 100644 --- a/labs/WebApp/wwwroot/pages/login.js +++ b/labs/WebApp/wwwroot/pages/login.js @@ -6,7 +6,7 @@ data() { return { title: '登录', - url: '/UserCenter/api/v1/token/getToken' + url: apiHost + '/UserCenter/api/v1/token/getToken' }; }, mounted: function () { diff --git a/projects/Infrastructure/Infrastructure.csproj b/projects/Infrastructure/Infrastructure.csproj index 20cb20a9..f5e202e9 100644 --- a/projects/Infrastructure/Infrastructure.csproj +++ b/projects/Infrastructure/Infrastructure.csproj @@ -11,7 +11,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -40,14 +40,14 @@ - - + + - +   diff --git a/projects/Infrastructure/Web/BaseStartup.cs b/projects/Infrastructure/Web/BaseStartup.cs index a98c7867..431925bb 100644 --- a/projects/Infrastructure/Web/BaseStartup.cs +++ b/projects/Infrastructure/Web/BaseStartup.cs @@ -264,7 +264,7 @@ namespace Infrastructure.Web { if (DateTime.UtcNow > context.SecurityToken.ValidTo) { - context.Fail(""); + context.Fail("token time out"); } return Task.CompletedTask; }, @@ -335,11 +335,6 @@ namespace Infrastructure.Web { app.UseDeveloperExceptionPage(); } - else - { - app.UseExceptionHandler("/Error"); - app.UseStatusCodePagesWithReExecute("/Error"); - } string basePath = this.Configuration.GetValue("BasePath", $"/{Assembly.GetEntryAssembly().GetName().Name}"); app.UsePathBase(basePath); app.UseForwardedHeaders(new ForwardedHeadersOptions diff --git a/projects/Infrastructure/Web/JwtTokenValidator.cs b/projects/Infrastructure/Web/JwtTokenValidator.cs index 2cca6408..7e03a84c 100644 --- a/projects/Infrastructure/Web/JwtTokenValidator.cs +++ b/projects/Infrastructure/Web/JwtTokenValidator.cs @@ -25,13 +25,22 @@ namespace Infrastructure.Web public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken) { - validatedToken = new JwtSecurityTokenHandler().ReadJwtToken(securityToken); - var claims = (validatedToken as JwtSecurityToken).Claims.ToList(); - var userName = claims.FirstOrDefault(o => o.Type == ClaimTypes.Name).Value; - using var scope = this._serviceProvider.CreateScope(); - var roles = scope.ServiceProvider.GetService().GetRoles(userName).Select(o => new Claim(ClaimTypes.Role, o)); - claims.AddRange(roles); - return new ClaimsPrincipal(new ClaimsIdentity(claims, JwtBearerDefaults.AuthenticationScheme)); + try + { + validatedToken = new JwtSecurityTokenHandler().ReadJwtToken(securityToken); + var claims = (validatedToken as JwtSecurityToken).Claims.ToList(); + var userName = claims.FirstOrDefault(o => o.Type == ClaimTypes.Name).Value; + using var scope = this._serviceProvider.CreateScope(); + var roles = scope.ServiceProvider.GetService().GetRoles(userName).Select(o => new Claim(ClaimTypes.Role, o)); + claims.AddRange(roles); + return new ClaimsPrincipal(new ClaimsIdentity(claims, JwtBearerDefaults.AuthenticationScheme)); + } + catch (Exception ex) + { + validatedToken = null; + Console.WriteLine(ex.ToString()); + } + return null; } } } \ No newline at end of file diff --git a/projects/JobServer/JobServer.csproj b/projects/JobServer/JobServer.csproj index 8f81faef..39c84903 100644 --- a/projects/JobServer/JobServer.csproj +++ b/projects/JobServer/JobServer.csproj @@ -21,7 +21,7 @@ - - + + \ No newline at end of file diff --git a/projects/UserCenter/UserCenter.csproj b/projects/UserCenter/UserCenter.csproj index 6944ace8..4cef0efd 100644 --- a/projects/UserCenter/UserCenter.csproj +++ b/projects/UserCenter/UserCenter.csproj @@ -12,8 +12,6 @@ - - diff --git a/projects/UserCenter/appsettings.Development.json b/projects/UserCenter/appsettings.Development.json index f0cd2eae..9f9ddd36 100644 --- a/projects/UserCenter/appsettings.Development.json +++ b/projects/UserCenter/appsettings.Development.json @@ -1,5 +1,7 @@ { "AppSettings": { "database": "sqlite" - } + }, + "AccessTokenHours": 0.05, + "RefreshToken": 0.1 } \ No newline at end of file diff --git a/projects/Version.cs b/projects/Version.cs index 161b7e56..c36231de 100644 --- a/projects/Version.cs +++ b/projects/Version.cs @@ -1,4 +1,4 @@ using System.Reflection; [assembly: AssemblyVersion("1.0.0.*")] -[assembly: AssemblyInformationalVersion("1.0.0.507-1")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("1.0.0.508")] \ No newline at end of file diff --git a/tools/nginx-1.16.0/.gitignore b/tools/nginx-1.18.0/.gitignore similarity index 100% rename from tools/nginx-1.16.0/.gitignore rename to tools/nginx-1.18.0/.gitignore diff --git a/tools/nginx-1.16.0/conf/edusoa.key b/tools/nginx-1.18.0/conf/edusoa.key similarity index 100% rename from tools/nginx-1.16.0/conf/edusoa.key rename to tools/nginx-1.18.0/conf/edusoa.key diff --git a/tools/nginx-1.16.0/conf/edusoa.pem b/tools/nginx-1.18.0/conf/edusoa.pem similarity index 100% rename from tools/nginx-1.16.0/conf/edusoa.pem rename to tools/nginx-1.18.0/conf/edusoa.pem diff --git a/tools/nginx-1.16.0/conf/fastcgi.conf b/tools/nginx-1.18.0/conf/fastcgi.conf similarity index 100% rename from tools/nginx-1.16.0/conf/fastcgi.conf rename to tools/nginx-1.18.0/conf/fastcgi.conf diff --git a/tools/nginx-1.16.0/conf/fastcgi_params b/tools/nginx-1.18.0/conf/fastcgi_params similarity index 100% rename from tools/nginx-1.16.0/conf/fastcgi_params rename to tools/nginx-1.18.0/conf/fastcgi_params diff --git a/tools/nginx-1.16.0/conf/koi-utf b/tools/nginx-1.18.0/conf/koi-utf similarity index 100% rename from tools/nginx-1.16.0/conf/koi-utf rename to tools/nginx-1.18.0/conf/koi-utf diff --git a/tools/nginx-1.16.0/conf/koi-win b/tools/nginx-1.18.0/conf/koi-win similarity index 100% rename from tools/nginx-1.16.0/conf/koi-win rename to tools/nginx-1.18.0/conf/koi-win diff --git a/tools/nginx-1.16.0/conf/mime.types b/tools/nginx-1.18.0/conf/mime.types similarity index 100% rename from tools/nginx-1.16.0/conf/mime.types rename to tools/nginx-1.18.0/conf/mime.types diff --git a/tools/nginx-1.16.0/conf/nginx.conf b/tools/nginx-1.18.0/conf/nginx.conf similarity index 100% rename from tools/nginx-1.16.0/conf/nginx.conf rename to tools/nginx-1.18.0/conf/nginx.conf diff --git a/tools/nginx-1.18.0/conf/nginx.conf.bk b/tools/nginx-1.18.0/conf/nginx.conf.bk new file mode 100644 index 00000000..29bc085f --- /dev/null +++ b/tools/nginx-1.18.0/conf/nginx.conf.bk @@ -0,0 +1,117 @@ + +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + +#pid logs/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include mime.types; + default_type application/octet-stream; + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + + sendfile on; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + #gzip on; + + server { + listen 80; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + + location / { + root html; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root html; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + +} diff --git a/tools/nginx-1.16.0/conf/scgi_params b/tools/nginx-1.18.0/conf/scgi_params similarity index 100% rename from tools/nginx-1.16.0/conf/scgi_params rename to tools/nginx-1.18.0/conf/scgi_params diff --git a/tools/nginx-1.16.0/conf/uwsgi_params b/tools/nginx-1.18.0/conf/uwsgi_params similarity index 100% rename from tools/nginx-1.16.0/conf/uwsgi_params rename to tools/nginx-1.18.0/conf/uwsgi_params diff --git a/tools/nginx-1.16.0/conf/win-utf b/tools/nginx-1.18.0/conf/win-utf similarity index 100% rename from tools/nginx-1.16.0/conf/win-utf rename to tools/nginx-1.18.0/conf/win-utf diff --git a/tools/nginx-1.16.0/contrib/README b/tools/nginx-1.18.0/contrib/README similarity index 100% rename from tools/nginx-1.16.0/contrib/README rename to tools/nginx-1.18.0/contrib/README diff --git a/tools/nginx-1.16.0/contrib/geo2nginx.pl b/tools/nginx-1.18.0/contrib/geo2nginx.pl similarity index 100% rename from tools/nginx-1.16.0/contrib/geo2nginx.pl rename to tools/nginx-1.18.0/contrib/geo2nginx.pl diff --git a/tools/nginx-1.16.0/contrib/unicode2nginx/koi-utf b/tools/nginx-1.18.0/contrib/unicode2nginx/koi-utf similarity index 100% rename from tools/nginx-1.16.0/contrib/unicode2nginx/koi-utf rename to tools/nginx-1.18.0/contrib/unicode2nginx/koi-utf diff --git a/tools/nginx-1.16.0/contrib/unicode2nginx/unicode-to-nginx.pl b/tools/nginx-1.18.0/contrib/unicode2nginx/unicode-to-nginx.pl similarity index 100% rename from tools/nginx-1.16.0/contrib/unicode2nginx/unicode-to-nginx.pl rename to tools/nginx-1.18.0/contrib/unicode2nginx/unicode-to-nginx.pl diff --git a/tools/nginx-1.16.0/contrib/unicode2nginx/win-utf b/tools/nginx-1.18.0/contrib/unicode2nginx/win-utf similarity index 100% rename from tools/nginx-1.16.0/contrib/unicode2nginx/win-utf rename to tools/nginx-1.18.0/contrib/unicode2nginx/win-utf diff --git a/tools/nginx-1.16.0/contrib/vim/ftdetect/nginx.vim b/tools/nginx-1.18.0/contrib/vim/ftdetect/nginx.vim similarity index 100% rename from tools/nginx-1.16.0/contrib/vim/ftdetect/nginx.vim rename to tools/nginx-1.18.0/contrib/vim/ftdetect/nginx.vim diff --git a/tools/nginx-1.16.0/contrib/vim/ftplugin/nginx.vim b/tools/nginx-1.18.0/contrib/vim/ftplugin/nginx.vim similarity index 100% rename from tools/nginx-1.16.0/contrib/vim/ftplugin/nginx.vim rename to tools/nginx-1.18.0/contrib/vim/ftplugin/nginx.vim diff --git a/tools/nginx-1.16.0/contrib/vim/indent/nginx.vim b/tools/nginx-1.18.0/contrib/vim/indent/nginx.vim similarity index 100% rename from tools/nginx-1.16.0/contrib/vim/indent/nginx.vim rename to tools/nginx-1.18.0/contrib/vim/indent/nginx.vim diff --git a/tools/nginx-1.16.0/contrib/vim/syntax/nginx.vim b/tools/nginx-1.18.0/contrib/vim/syntax/nginx.vim similarity index 99% rename from tools/nginx-1.16.0/contrib/vim/syntax/nginx.vim rename to tools/nginx-1.18.0/contrib/vim/syntax/nginx.vim index 6bee7a2e..1a3a7b7d 100644 --- a/tools/nginx-1.16.0/contrib/vim/syntax/nginx.vim +++ b/tools/nginx-1.18.0/contrib/vim/syntax/nginx.vim @@ -333,6 +333,7 @@ syn keyword ngxDirective contained js_access syn keyword ngxDirective contained js_content syn keyword ngxDirective contained js_filter syn keyword ngxDirective contained js_include +syn keyword ngxDirective contained js_path syn keyword ngxDirective contained js_preread syn keyword ngxDirective contained js_set syn keyword ngxDirective contained keepalive @@ -353,6 +354,7 @@ syn keyword ngxDirective contained limit_conn_zone syn keyword ngxDirective contained limit_rate syn keyword ngxDirective contained limit_rate_after syn keyword ngxDirective contained limit_req +syn keyword ngxDirective contained limit_req_dry_run syn keyword ngxDirective contained limit_req_log_level syn keyword ngxDirective contained limit_req_status syn keyword ngxDirective contained limit_req_zone @@ -472,6 +474,7 @@ syn keyword ngxDirective contained proxy_requests syn keyword ngxDirective contained proxy_responses syn keyword ngxDirective contained proxy_send_lowat syn keyword ngxDirective contained proxy_send_timeout +syn keyword ngxDirective contained proxy_session_drop syn keyword ngxDirective contained proxy_set_body syn keyword ngxDirective contained proxy_set_header syn keyword ngxDirective contained proxy_socket_keepalive @@ -1325,6 +1328,7 @@ syn keyword ngxDirectiveThirdParty contained lua_check_client_abort syn keyword ngxDirectiveThirdParty contained lua_code_cache syn keyword ngxDirectiveThirdParty contained lua_fake_shm syn keyword ngxDirectiveThirdParty contained lua_http10_buffering +syn keyword ngxDirectiveThirdParty contained lua_load_resty_core syn keyword ngxDirectiveThirdParty contained lua_malloc_trim syn keyword ngxDirectiveThirdParty contained lua_max_pending_timers syn keyword ngxDirectiveThirdParty contained lua_max_running_timers @@ -1779,6 +1783,7 @@ syn keyword ngxDirectiveThirdParty contained vod_expires_live_time_dependent syn keyword ngxDirectiveThirdParty contained vod_fallback_upstream_location syn keyword ngxDirectiveThirdParty contained vod_force_continuous_timestamps syn keyword ngxDirectiveThirdParty contained vod_force_playlist_type_vod +syn keyword ngxDirectiveThirdParty contained vod_force_sequence_index syn keyword ngxDirectiveThirdParty contained vod_gop_look_ahead syn keyword ngxDirectiveThirdParty contained vod_gop_look_behind syn keyword ngxDirectiveThirdParty contained vod_ignore_edit_list diff --git a/tools/nginx-1.16.0/docs/CHANGES b/tools/nginx-1.18.0/docs/CHANGES similarity index 97% rename from tools/nginx-1.16.0/docs/CHANGES rename to tools/nginx-1.18.0/docs/CHANGES index b347b0cc..6da9172b 100644 --- a/tools/nginx-1.16.0/docs/CHANGES +++ b/tools/nginx-1.18.0/docs/CHANGES @@ -1,7 +1,197 @@ -Changes with nginx 1.16.0 23 Apr 2019 +Changes with nginx 1.18.0 21 Apr 2020 - *) 1.16.x stable branch. + *) 1.18.x stable branch. + + +Changes with nginx 1.17.10 14 Apr 2020 + + *) Feature: the "auth_delay" directive. + + +Changes with nginx 1.17.9 03 Mar 2020 + + *) Change: now nginx does not allow several "Host" request header lines. + + *) Bugfix: nginx ignored additional "Transfer-Encoding" request header + lines. + + *) Bugfix: socket leak when using HTTP/2. + + *) Bugfix: a segmentation fault might occur in a worker process if OCSP + stapling was used. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: nginx used status code 494 instead of 400 if errors with code + 494 were redirected with the "error_page" directive. + + *) Bugfix: socket leak when using subrequests in the njs module and the + "aio" directive. + + +Changes with nginx 1.17.8 21 Jan 2020 + + *) Feature: variables support in the "grpc_pass" directive. + + *) Bugfix: a timeout might occur while handling pipelined requests in an + SSL connection; the bug had appeared in 1.17.5. + + *) Bugfix: in the "debug_points" directive when using HTTP/2. + Thanks to Daniil Bondarev. + + +Changes with nginx 1.17.7 24 Dec 2019 + + *) Bugfix: a segmentation fault might occur on start or during + reconfiguration if the "rewrite" directive with an empty replacement + string was used in the configuration. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "break" directive was used with the "alias" directive or with the + "proxy_pass" directive with a URI. + + *) Bugfix: the "Location" response header line might contain garbage if + the request URI was rewritten to the one containing a null character. + + *) Bugfix: requests with bodies were handled incorrectly when returning + redirections with the "error_page" directive; the bug had appeared in + 0.7.12. + + *) Bugfix: socket leak when using HTTP/2. + + *) Bugfix: a timeout might occur while handling pipelined requests in an + SSL connection; the bug had appeared in 1.17.5. + + *) Bugfix: in the ngx_http_dav_module. + + +Changes with nginx 1.17.6 19 Nov 2019 + + *) Feature: the $proxy_protocol_server_addr and + $proxy_protocol_server_port variables. + + *) Feature: the "limit_conn_dry_run" directive. + + *) Feature: the $limit_req_status and $limit_conn_status variables. + + +Changes with nginx 1.17.5 22 Oct 2019 + + *) Feature: now nginx uses ioctl(FIONREAD), if available, to avoid + reading from a fast connection for a long time. + + *) Bugfix: incomplete escaped characters at the end of the request URI + were ignored. + + *) Bugfix: "/." and "/.." at the end of the request URI were not + normalized. + + *) Bugfix: in the "merge_slashes" directive. + + *) Bugfix: in the "ignore_invalid_headers" directive. + Thanks to Alan Kemp. + + *) Bugfix: nginx could not be built with MinGW-w64 gcc 8.1 or newer. + + +Changes with nginx 1.17.4 24 Sep 2019 + + *) Change: better detection of incorrect client behavior in HTTP/2. + + *) Change: in handling of not fully read client request body when + returning errors in HTTP/2. + + *) Bugfix: the "worker_shutdown_timeout" directive might not work when + using HTTP/2. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2 and the "proxy_request_buffering" directive. + + *) Bugfix: the ECONNABORTED error log level was "crit" instead of + "error" on Windows when using SSL. + + *) Bugfix: nginx ignored extra data when using chunked transfer + encoding. + + *) Bugfix: nginx always returned the 500 error if the "return" directive + was used and an error occurred during reading client request body. + + *) Bugfix: in memory allocation error handling. + + +Changes with nginx 1.17.3 13 Aug 2019 + + *) Security: when using HTTP/2 a client might cause excessive memory + consumption and CPU usage (CVE-2019-9511, CVE-2019-9513, + CVE-2019-9516). + + *) Bugfix: "zero size buf" alerts might appear in logs when using + gzipping; the bug had appeared in 1.17.2. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "resolver" directive was used in SMTP proxy. + + +Changes with nginx 1.17.2 23 Jul 2019 + + *) Change: minimum supported zlib version is 1.2.0.4. + Thanks to Ilya Leoshkevich. + + *) Change: the $r->internal_redirect() embedded perl method now expects + escaped URIs. + + *) Feature: it is now possible to switch to a named location using the + $r->internal_redirect() embedded perl method. + + *) Bugfix: in error handling in embedded perl. + + *) Bugfix: a segmentation fault might occur on start or during + reconfiguration if hash bucket size larger than 64 kilobytes was used + in the configuration. + + *) Bugfix: nginx might hog CPU during unbuffered proxying and when + proxying WebSocket connections if the select, poll, or /dev/poll + methods were used. + + *) Bugfix: in the ngx_http_xslt_filter_module. + + *) Bugfix: in the ngx_http_ssi_filter_module. + + +Changes with nginx 1.17.1 25 Jun 2019 + + *) Feature: the "limit_req_dry_run" directive. + + *) Feature: when using the "hash" directive inside the "upstream" block + an empty hash key now triggers round-robin balancing. + Thanks to Niklas Keller. + + *) Bugfix: a segmentation fault might occur in a worker process if + caching was used along with the "image_filter" directive, and errors + with code 415 were redirected with the "error_page" directive; the + bug had appeared in 1.11.10. + + *) Bugfix: a segmentation fault might occur in a worker process if + embedded perl was used; the bug had appeared in 1.7.3. + + +Changes with nginx 1.17.0 21 May 2019 + + *) Feature: variables support in the "limit_rate" and "limit_rate_after" + directives. + + *) Feature: variables support in the "proxy_upload_rate" and + "proxy_download_rate" directives in the stream module. + + *) Change: minimum supported OpenSSL version is 0.9.8. + + *) Change: now the postpone filter is always built. + + *) Bugfix: the "include" directive did not work inside the "if" and + "limit_except" blocks. + + *) Bugfix: in byte ranges processing. Changes with nginx 1.15.12 16 Apr 2019 diff --git a/tools/nginx-1.16.0/docs/CHANGES.ru b/tools/nginx-1.18.0/docs/CHANGES.ru similarity index 97% rename from tools/nginx-1.16.0/docs/CHANGES.ru rename to tools/nginx-1.18.0/docs/CHANGES.ru index b8d53b3e..e4300216 100644 --- a/tools/nginx-1.16.0/docs/CHANGES.ru +++ b/tools/nginx-1.18.0/docs/CHANGES.ru @@ -1,7 +1,202 @@ -Изменения в nginx 1.16.0 23.04.2019 +Изменения в nginx 1.18.0 21.04.2020 - *) Стабильная ветка 1.16.x. + *) Стабильная ветка 1.18.x. + + +Изменения в nginx 1.17.10 14.04.2020 + + *) Добавление: директива auth_delay. + + +Изменения в nginx 1.17.9 03.03.2020 + + *) Изменение: теперь nginx не разрешает несколько строк "Host" в + заголовке запроса. + + *) Исправление: nginx игнорировал дополнительные строки + "Transfer-Encoding" в заголовке запроса. + + *) Исправление: утечки сокетов при использовании HTTP/2. + + *) Исправление: в рабочем процессе мог произойти segmentation fault, + если использовался OCSP stapling. + + *) Исправление: в модуле ngx_http_mp4_module. + + *) Исправление: при перенаправлении ошибок с кодом 494 с помощью + директивы error_page nginx возвращал ответ с кодом 494 вместо 400. + + *) Исправление: утечки сокетов при использовании подзапросов в модуле + njs и директивы aio. + + +Изменения в nginx 1.17.8 21.01.2020 + + *) Добавление: директива grpc_pass поддерживает переменные. + + *) Исправление: при обработке pipelined-запросов по SSL-соединению мог + произойти таймаут; ошибка появилась в 1.17.5. + + *) Исправление: в директиве debug_points при использовании HTTP/2. + Спасибо Даниилу Бондареву. + + +Изменения в nginx 1.17.7 24.12.2019 + + *) Исправление: на старте или во время переконфигурации мог произойти + segmentation fault, если в конфигурации использовалась директива + rewrite с пустой строкой замены. + + *) Исправление: в рабочем процессе мог произойти segmentation fault, + если директива break использовалась совместно с директивой alias или + директивой proxy_pass с URI. + + *) Исправление: строка Location заголовка ответа могла содержать мусор, + если URI запроса был изменён на URI, содержащий нулевой символ. + + *) Исправление: при возврате перенаправлений с помощью директивы + error_page запросы с телом обрабатывались некорректно; ошибка + появилась в 0.7.12. + + *) Исправление: утечки сокетов при использовании HTTP/2. + + *) Исправление: при обработке pipelined-запросов по SSL-соединению мог + произойти таймаут; ошибка появилась в 1.17.5. + + *) Исправление: в модуле ngx_http_dav_module. + + +Изменения в nginx 1.17.6 19.11.2019 + + *) Добавление: переменные $proxy_protocol_server_addr и + $proxy_protocol_server_port. + + *) Добавление: директива limit_conn_dry_run. + + *) Добавление: переменные $limit_req_status и $limit_conn_status. + + +Изменения в nginx 1.17.5 22.10.2019 + + *) Добавление: теперь nginx использует вызов ioctl(FIONREAD), если он + доступен, чтобы избежать чтения из быстрого соединения в течение + долгого времени. + + *) Исправление: неполные закодированные символы в конце URI запроса + игнорировались. + + *) Исправление: "/." и "/.." в конце URI запроса не нормализовывались. + + *) Исправление: в директиве merge_slashes. + + *) Исправление: в директиве ignore_invalid_headers. + Спасибо Alan Kemp. + + *) Исправление: nginx не собирался с MinGW-w64 gcc 8.1 и новее. + + +Изменения в nginx 1.17.4 24.09.2019 + + *) Изменение: улучшено детектирование некорректного поведения клиентов в + HTTP/2. + + *) Изменение: в обработке непрочитанного тела запроса при возврате + ошибок в HTTP/2. + + *) Исправление: директива worker_shutdown_timeout могла не работать при + использовании HTTP/2. + + *) Исправление: при использовании HTTP/2 и директивы + proxy_request_buffering в рабочем процессе мог произойти segmentation + fault. + + *) Исправление: на Windows при использовании SSL уровень записи в лог + ошибки ECONNABORTED был "crit" вместо "error". + + *) Исправление: nginx игнорировал лишние данные при использовании + chunked transfer encoding. + + *) Исправление: если использовалась директива return и при чтении тела + запроса возникала ошибка, nginx всегда возвращал ошибку 500. + + *) Исправление: в обработке ошибок выделения памяти. + + +Изменения в nginx 1.17.3 13.08.2019 + + *) Безопасность: при использовании HTTP/2 клиент мог вызвать чрезмерное + потребление памяти и ресурсов процессора (CVE-2019-9511, + CVE-2019-9513, CVE-2019-9516). + + *) Исправление: при использовании сжатия в логах могли появляться + сообщения "zero size buf"; ошибка появилась в 1.17.2. + + *) Исправление: при использовании директивы resolver в SMTP + прокси-сервере в рабочем процессе мог произойти segmentation fault. + + +Изменения в nginx 1.17.2 23.07.2019 + + *) Изменение: минимальная поддерживаемая версия zlib - 1.2.0.4. + Спасибо Илье Леошкевичу. + + *) Изменение: метод $r->internal_redirect() встроенного перла теперь + ожидает закодированный URI. + + *) Добавление: теперь с помощью метода $r->internal_redirect() + встроенного перла можно перейти в именованный location. + + *) Исправление: в обработке ошибок во встроенном перле. + + *) Исправление: на старте или во время переконфигурации мог произойти + segmentation fault, если в конфигурации использовалось значение hash + bucket size больше 64 килобайт. + + *) Исправление: при использовании методов обработки соединений select, + poll и /dev/poll nginx мог нагружать процессор во время + небуферизованного проксирования и при проксировании + WebSocket-соединений. + + *) Исправление: в модуле ngx_http_xslt_filter_module. + + *) Исправление: в модуле ngx_http_ssi_filter_module. + + +Изменения в nginx 1.17.1 25.06.2019 + + *) Добавление: директива limit_req_dry_run. + + *) Добавление: при использовании директивы hash в блоке upstream пустой + ключ хэширования теперь приводит к переключению на round-robin + балансировку. + Спасибо Niklas Keller. + + *) Исправление: в рабочем процессе мог произойти segmentation fault, + если использовалось кэширование и директива image_filter, а ошибки с + кодом 415 перенаправлялись с помощью директивы error_page; ошибка + появилась в 1.11.10. + + *) Исправление: в рабочем процессе мог произойти segmentation fault, + если использовался встроенный перл; ошибка появилась в 1.7.3. + + +Изменения в nginx 1.17.0 21.05.2019 + + *) Добавление: директивы limit_rate и limit_rate_after поддерживают + переменные. + + *) Добавление: директивы proxy_upload_rate и proxy_download_rate в + модуле stream поддерживают переменные. + + *) Изменение: минимальная поддерживаемая версия OpenSSL - 0.9.8. + + *) Изменение: теперь postpone-фильтр собирается всегда. + + *) Исправление: директива include не работала в блоках if и + limit_except. + + *) Исправление: в обработке byte ranges. Изменения в nginx 1.15.12 16.04.2019 diff --git a/tools/nginx-1.16.0/docs/LICENSE b/tools/nginx-1.18.0/docs/LICENSE similarity index 100% rename from tools/nginx-1.16.0/docs/LICENSE rename to tools/nginx-1.18.0/docs/LICENSE diff --git a/tools/nginx-1.16.0/docs/OpenSSL.LICENSE b/tools/nginx-1.18.0/docs/OpenSSL.LICENSE similarity index 100% rename from tools/nginx-1.16.0/docs/OpenSSL.LICENSE rename to tools/nginx-1.18.0/docs/OpenSSL.LICENSE diff --git a/tools/nginx-1.16.0/docs/PCRE.LICENCE b/tools/nginx-1.18.0/docs/PCRE.LICENCE similarity index 96% rename from tools/nginx-1.16.0/docs/PCRE.LICENCE rename to tools/nginx-1.18.0/docs/PCRE.LICENCE index 760a6666..57a54481 100644 --- a/tools/nginx-1.16.0/docs/PCRE.LICENCE +++ b/tools/nginx-1.18.0/docs/PCRE.LICENCE @@ -25,7 +25,7 @@ Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2019 University of Cambridge +Copyright (c) 1997-2020 University of Cambridge All rights reserved. @@ -36,7 +36,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2010-2019 Zoltan Herczeg +Copyright(c) 2010-2020 Zoltan Herczeg All rights reserved. @@ -47,7 +47,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2009-2019 Zoltan Herczeg +Copyright(c) 2009-2020 Zoltan Herczeg All rights reserved. diff --git a/tools/nginx-1.16.0/docs/README b/tools/nginx-1.18.0/docs/README similarity index 100% rename from tools/nginx-1.16.0/docs/README rename to tools/nginx-1.18.0/docs/README diff --git a/tools/nginx-1.16.0/docs/zlib.LICENSE b/tools/nginx-1.18.0/docs/zlib.LICENSE similarity index 100% rename from tools/nginx-1.16.0/docs/zlib.LICENSE rename to tools/nginx-1.18.0/docs/zlib.LICENSE diff --git a/tools/nginx-1.16.0/html/50x.html b/tools/nginx-1.18.0/html/50x.html similarity index 100% rename from tools/nginx-1.16.0/html/50x.html rename to tools/nginx-1.18.0/html/50x.html diff --git a/tools/nginx-1.16.0/html/index.html b/tools/nginx-1.18.0/html/index.html similarity index 100% rename from tools/nginx-1.16.0/html/index.html rename to tools/nginx-1.18.0/html/index.html diff --git a/tools/nginx-1.16.0/nginx.exe b/tools/nginx-1.18.0/nginx.exe similarity index 54% rename from tools/nginx-1.16.0/nginx.exe rename to tools/nginx-1.18.0/nginx.exe index a6cb46e9..b620d097 100644 Binary files a/tools/nginx-1.16.0/nginx.exe and b/tools/nginx-1.18.0/nginx.exe differ