diff --git a/package-lock.json b/package-lock.json
index 5c2cdf2..9be3781 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1756,6 +1756,11 @@
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
"integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
},
+ "charenc": {
+ "version": "0.0.2",
+ "resolved": "http://registry.npm.taobao.org/charenc/download/charenc-0.0.2.tgz",
+ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
+ },
"chokidar": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
@@ -2216,6 +2221,11 @@
"which": "1.3.1"
}
},
+ "crypt": {
+ "version": "0.0.2",
+ "resolved": "http://registry.npm.taobao.org/crypt/download/crypt-0.0.2.tgz",
+ "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
+ },
"crypto-browserify": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
@@ -6562,6 +6572,16 @@
"resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
"integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w="
},
+ "md5": {
+ "version": "2.2.1",
+ "resolved": "http://registry.npm.taobao.org/md5/download/md5-2.2.1.tgz",
+ "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
+ "requires": {
+ "charenc": "0.0.2",
+ "crypt": "0.0.2",
+ "is-buffer": "1.1.6"
+ }
+ },
"md5.js": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz",
diff --git a/package.json b/package.json
index 073f7f4..3b3fdc4 100644
--- a/package.json
+++ b/package.json
@@ -5,6 +5,7 @@
"dependencies": {
"copy-to-clipboard": "^3.0.8",
"load-script": "^1.0.0",
+ "md5": "^2.2.1",
"pressure": "^2.1.2",
"react": "^16.4.2",
"react-dom": "^16.4.2",
diff --git a/src/App.js b/src/App.js
index 3d465ff..474415b 100644
--- a/src/App.js
+++ b/src/App.js
@@ -5,6 +5,20 @@ import {Sidebar} from './Sidebar';
import {PressureHelper} from './PressureHelper';
import {TokenCtx} from './UserAction';
+function TokenDeprecatedAlert(props) {
+ if(!props.token || props.token.startsWith('isop_')) // noinspection JSConstructorReturnsPrimitive
+ return null;
+ else
+ return (
+
+
+
树洞已更换登录方式,您原来的登录状态已失效。
+
请按右上角的按钮,点“注销”,然后重新登录。
+
+
+ );
+}
+
class App extends Component {
constructor(props) {
super(props);
@@ -62,14 +76,15 @@ class App extends Component {
backgroundImage: 'url('+(localStorage['REPLACE_ERIRI_WITH_URL'] || 'static/eriri_bg.jpg')+')'
}} />
-
-
{(token)=>(
+ {(token)=>(
+
+
- )}
-
-
+
+
+ )}
{
this.setState({
sidebar_content: null,
diff --git a/src/Flows.js b/src/Flows.js
index 799710f..7297b40 100644
--- a/src/Flows.js
+++ b/src/Flows.js
@@ -341,14 +341,16 @@ function FlowChunk(props) {
{!!props.title && }
{props.list.map((info,ind)=>(
- {!!(props.deletion_detect && props.mode==='list' && ind && props.list[ind-1].pid-info.pid>1) &&
-
-
- {props.list[ind-1].pid-info.pid-1} 条被删除
+
+ {!!(props.deletion_detect && props.mode==='list' && ind && props.list[ind-1].pid-info.pid>1) &&
+
+
+ {props.list[ind-1].pid-info.pid-1} 条被删除
+
-
- }
-
+ }
+
+
))}
diff --git a/src/UserAction.css b/src/UserAction.css
index 7908ab2..e9d4cb0 100644
--- a/src/UserAction.css
+++ b/src/UserAction.css
@@ -1,4 +1,4 @@
-.login-form form p {
+.login-form p {
margin: 1em 0;
text-align: center;
}
diff --git a/src/UserAction.js b/src/UserAction.js
index 87c84a3..ce7a8dd 100644
--- a/src/UserAction.js
+++ b/src/UserAction.js
@@ -1,5 +1,6 @@
import React, {Component, PureComponent} from 'react';
import {SafeTextarea} from './Common';
+import md5 from 'md5';
import './UserAction.css';
@@ -8,6 +9,10 @@ const LOGIN_BASE=window.location.protocol==='https:' ? '/login_proxy' : 'http://
const MAX_IMG_PX=2000;
const MAX_IMG_FILESIZE=256000;
+const ISOP_APPKEY='0feb3a8a831e11e8933a0050568508a5';
+const ISOP_APPCODE='0fec960a831e11e8933a0050568508a5';
+const ISOP_SVCID='PERSON_BASE_INFO,STUDENT_SCORE,STUDENT_COURSE_TABLE,STUDENT_COURSE_TABLE_ROOM,CARD_BALANCE';
+
export const TokenCtx=React.createContext({
value: null,
set_value: ()=>{},
@@ -24,8 +29,25 @@ export class LoginForm extends Component {
this.password_ref=React.createRef();
}
- do_login(event,set_token) {
- event.preventDefault();
+ do_sendcode() {
+ if(this.state.loading_status==='loading')
+ return;
+
+ let param=
+ 'user='+this.username_ref.current.value+
+ '&svcId='+ISOP_SVCID+
+ '&appKey='+ISOP_APPKEY+
+ '×tamp='+(+new Date());
+
+ fetch(
+ 'https://isop.pku.edu.cn/svcpub/svc/oauth/validcode?'+param+
+ '&msg='+md5(param+ISOP_APPCODE),
+ {mode: 'no-cors'}
+ );
+ alert('短信验证码应该会发到您的手机上,请注意查收!');
+ }
+
+ do_login(set_token) {
if(this.state.loading_status==='loading')
return;
@@ -33,8 +55,9 @@ export class LoginForm extends Component {
loading_status: 'loading',
});
let data=new URLSearchParams();
- data.append('uid', this.username_ref.current.value);
- data.append('password', this.password_ref.current.value);
+ data.append('username', this.username_ref.current.value);
+ data.append('valid_code', this.password_ref.current.value);
+ data.append('isnewloginflow', 'true');
fetch(LOGIN_BASE+'/login.php?platform=hole_xmcp_ml', {
method: 'POST',
headers: {
@@ -68,44 +91,43 @@ export class LoginForm extends Component {
return (
{(token)=>
}
)
diff --git a/src/flows_api.js b/src/flows_api.js
index 542aabc..1903dcf 100644
--- a/src/flows_api.js
+++ b/src/flows_api.js
@@ -137,5 +137,5 @@ export const API={
}
return json;
});
- }
+ },
};
\ No newline at end of file