##### Coverage Report - jp.co.y_net.amm.page.AppPage

Classes in this File | Line Coverage | Branch Coverage | Complexity

AppPage

0% | 0/120

0% | 0/120

0.0;0

1

     package jp.co.y_net.amm.page;

2

3

     import java.text.DateFormat;

4

     import java.text.ParseException;

5

     import java.text.SimpleDateFormat;

6

     import java.util.List;

7

8

     import javax.servlet.http.Cookie;

9

10

     import jp.co.y_net.amm.AppSession;

11

     import jp.co.y_net.amm.common.AppLogger;

12

     import jp.co.y_net.amm.common.ResourceReader;

13

     import jp.co.y_net.amm.dao.GrpDao;

14

     import jp.co.y_net.amm.dao.GrpusrDao;

15

     import jp.co.y_net.amm.dao.InfDao;

16

     import jp.co.y_net.amm.dao.OrgDao;

17

     import jp.co.y_net.amm.dao.PwtcktDao;

18

     import jp.co.y_net.amm.dao.Usr;

19

     import jp.co.y_net.amm.dao.UsrDao;

20

     import jp.co.y_net.amm.service.Challengestring;

21

     import jp.co.y_net.amm.service.Logincheck;

22

     import jp.co.y_net.amm.service.Logout;

23

     import jp.co.y_net.amm.service.MailAddressCheck;

24

     import jp.co.y_net.amm.service.PasswordTicketManager;

25

26

     import org.apache.commons.lang.StringUtils;

27

     import org.apache.wicket.markup.html.WebPage;

28

     import org.apache.wicket.request.http.WebRequest;

29

     import org.apache.wicket.request.http.WebResponse;

30

     import org.apache.wicket.request.mapper.parameter.PageParameters;

31

     import org.apache.wicket.spring.injection.annot.SpringBean;

32

33

     /**

34

      * このアプリケーションの最上位のPageクラス

35

      * pageパッケージ配下のPageクラスは必ず継承しなければならない。

36

      *

37

      * CommonFrameXを経由して継承することを想定するため、

38

      * このPageクラスは画面のレイアウトは決定せず、

39

      * 共通処理を責務とする。

40

      *

41

      * @author k_inaba

42

      */

43

     public abstract class AppPage extends WebPage{

44

45

         /*

46

          * SpringBean宣言

47

          */

48

49

         @SpringBean(name="usrDao")

50

         protected UsrDao usrDao;

51

52

         @SpringBean(name="orgDao")

53

         protected OrgDao orgDao;

54

55

         @SpringBean(name="pwtcktDao")

56

         protected PwtcktDao pwtcktDao;

57

58

         @SpringBean(name="infDao")

59

         protected InfDao infDao;

60

61

         @SpringBean(name="grpDao")

62

         protected GrpDao grpDao;

63

64

         @SpringBean(name="grpusrDao")

65

         protected GrpusrDao grpusrDao;

66

67

         @SpringBean(name="challengestring")

68

         protected Challengestring challengestring;

69

70

         @SpringBean(name="logincheck")

71

         protected Logincheck logincheck;

72

73

         @SpringBean(name="logout")

74

         protected Logout logout;

75

76

         @SpringBean(name="passwordTicketManager")

77

         protected PasswordTicketManager passwordTicketManager;

78

79

         @SpringBean(name="mailAddressCheck")

80

         protected MailAddressCheck mailAddressCheck;

81

82

0

         public AppPage() {

83

             /* ステートレスなページでも、

84

              * JavaEEの実際のSessionオブジェクトと関連付けする */

85

0

             AppSession.get().bind();

86

0

         }

87

88

         /**

89

          * コンストラクタ呼び出しが行われなくても処理対象となるメソッド

90

          * 戻るボタンによる遷移でも呼び出される。

91

          * @see org.apache.wicket.Component#onConfigure()

92

          */

93

         @Override

94

         protected void onConfigure() {

95

             /* ログインチェック */

96

0

             if (validateLogin() == false) {

97

                 /* 戻り画面を設定 */

98

0

                 AppSession.get().returnPageClass = getPageClass();

99

0

                 AppSession.get().returnPageParameters = getPageParameters();

100

                 /* ログイン画面へ遷移 */

101

0

                 setResponsePage(LoginPage.class, getPageParameters());

102

0

                 return;

103

             }

104

0

         }

105

106

         /**

107

          * ログインチェック

108

          * 　ログイン認証が必要な画面ではOverrideして実装すること

109

          * @return Pageへのアクセスを認める場合はTrue

110

          */

111

         protected boolean validateLogin() {

112

0

             return true; // 既定では必ず「チェックOK」となる。

113

         }

114

115

116

117

118

         /* ---------------------------------------------------------------------------------------------------------------

119

          * 入力値検査

120

          */

121

122

123

         /**

124

          * 【文字列】

125

          * valueが妥当な値でなければ error でメッセージをセットする。

126

          * @param value 検査対象

127

          * @param itemname メッセージで使用する項目名

128

          * @param min 許容される最小値（必須入力の場合は1以上の値を設定すること）

129

          * @param max 許容される最大値

130

          */

131

         protected void validItem(String value, String itemname, int min, int max) {

132

0

             if(StringUtils.isEmpty(value)) {

133

0

                 if(min > 0) {

134

0

                     error(itemname + "を入力してください。");

135

                 } else {

136

                     /* 処理なし */

137

                 }

138

0

             } else {

139

0

                 if ((value.length() >= min &&  value.length() <= max) == false ) {

140

0

                     if(min == max) {

141

0

                         error(itemname + "は" + min + "文字で入力してください。");

142

0

                     } else {

143

0

                         if(min == 1 || min == 0) {

144

0

                             error(itemname + "は" + max + "文字以下で入力してください。");

145

0

                         } else {

146

0

                             error(itemname + "は" + min + "～" + max + "文字で入力してください。");

147

                         }

148

                     }

149

                 }

150

             }

151

0

         }

152

         /**

153

          * 【数値】

154

          * valueが妥当な値でなければ error でメッセージをセットする。

155

          * @param value 検査対象

156

          * @param itemname メッセージで使用する項目名

157

          * @param min 許容される最小値（必須入力の場合は1以上の値を設定すること）

158

          * @param max 許容される最大値

159

          */

160

         protected void validItemNum(String value, String itemname, int min, int max) {

161

0

             validItem(value, itemname, min, max);

162

0

             if(hasInputError()) return; // ここまでにエラーがあれば中断

163

0

             if(StringUtils.isEmpty(value) == false) {

164

0

                 if(isNumeric(value) == false) {

165

0

                     error(itemname + "は数字で入力してください。");

166

                 }

167

             }

168

0

         }

169

         /**

170

          * 【電話番号】

171

          * valueが妥当な値でなければ error でメッセージをセットする。

172

          * @param value 検査対象

173

          * @param itemname メッセージで使用する項目名

174

          * @param min 許容される最小値（必須入力の場合は1以上の値を設定すること）

175

          * @param max 許容される最大値

176

          */

177

         protected void validItemTel(String value, String itemname, int min, int max) {

178

0

             validItem(value, itemname, min, max);

179

0

             if(hasInputError()) return; // ここまでにエラーがあれば中断

180

0

             if(StringUtils.isEmpty(value) == false) {

181

0

                 value = value.replaceAll("-", "");

182

0

                 if(isNumeric(value) == false) {

183

0

                     error(itemname + "は数字とハイフンのみ使用できます。");

184

                 }

185

             }

186

0

         }

187

         /**

188

          * 【英数記号】

189

          * valueが妥当な値でなければ error でメッセージをセットする。

190

          * @param value 検査対象

191

          * @param itemname メッセージで使用する項目名

192

          * @param min 許容される最小値（必須入力の場合は1以上の値を設定すること）

193

          * @param max 許容される最大値

194

          */

195

         protected void validItemAscii(String value, String itemname, int min, int max) {

196

0

             validItem(value, itemname, min, max);

197

0

             if(hasInputError()) return; // ここまでにエラーがあれば中断

198

0

             if(StringUtils.isEmpty(value) == false) {

199

0

                 if(StringUtils.isAsciiPrintable(value) == false) {

200

0

                     error(itemname + "に使用できない文字が含まれています。");

201

                 }

202

             }

203

0

         }

204

         /**

205

          * 【メールアドレス】

206

          * @param value 検査対象

207

          * @param itemname メッセージで使用する項目名

208

          * @param min 許容される最小値（必須入力の場合は1以上の値を設定すること）

209

          * @param max 許容される最大値

210

          */

211

         protected void validItemMail(String value, String itemname) {

212

0

             validItemMail(value, itemname, false);

213

0

         }

214

         /**

215

          * 【メールアドレス】

216

          * @param value 検査対象

217

          * @param itemname メッセージで使用する項目名

218

          * @param min 許容される最小値（必須入力の場合は1以上の値を設定すること）

219

          * @param max 許容される最大値

220

          */

221

         protected void validItemMail(String value, String itemname, boolean freemailCheck) {

222

223

0

             if(StringUtils.isEmpty(value)) {

224

0

                 error(itemname + "を入力してください。");

225

0

                 return;

226

             }

227

0

             if (value.length() > 256 ) {

228

0

                 error(itemname + "は256文字以内で入力してください。");

229

0

                 return;

230

             }

231

0

             if(StringUtils.isAsciiPrintable(value) == false) {

232

0

                 error(itemname + "に使用できない文字が含まれています。");

233

0

                 return;

234

             }

235

0

             if(value.indexOf('@') == -1) {

236

                 /* @がないメールアドレスは不正とする */

237

0

                 error(itemname + "は形式が正しくありません。");

238

0

                 return;

239

             }

240

0

             if(freemailCheck) {

241

                 /* フリーメールチェック */

242

0

                 for (String ng: ResourceReader.getLines("omitmaildomains")) {

243

0

                     if(ng == null) ng = "";

244

0

                     ng = ng.trim();

245

0

                     if(StringUtils.isEmpty(ng) == false) {

246

0

                         if(value.endsWith(ng)) {

247

0

                             error(itemname + "は利用できないドメインです。");

248

249

                             /* 攻撃時の調査のため、ログ出力 */

250

0

                             AppLogger.info("次のメールアドレスで申請されましたが、拒否リストに含まるため受け付けませんでした。：" + value);

251

252

0

                             return;

253

                         }

254

                     }

255

                 }

256

             }

257

0

         }

258

259

         /**

260

          * @return エラーが検知されているときにTrue

261

          */

262

         protected boolean hasInputError() {

263

0

             return AppSession.get().getFeedbackMessages().isEmpty() == false;

264

         }

265

266

267

268

         /**

269

         * 文字列が数値かどうかチェックする

270

         * @param value   対象文字列

271

         * @return  数値 true   数値以外 false

272

         */

273

         public static boolean isNumeric(String value) {

274

     //        try { 以下の実装では Intの最大値以上で不正な結果を返す。

275

     //            Integer.parseInt(value);

276

     //        } catch (NumberFormatException e) {

277

     //            return false;

278

     //        }

279

     //        return true;

280

0

             if("-1".equals(value)) {

281

0

                 return true; // 「指定なし」を示す数値として許可する

282

             }

283

0

             if(StringUtils.isNumeric(value) == false) {

284

0

                 return false;

285

             }

286

287

0

             if(StringUtils.isEmpty(value) != false) {

288

                 /* 全角の数字をNGとする。*/

289

0

                 if(value.indexOf('０') != -1) return false;

290

0

                 if(value.indexOf('１') != -1) return false;

291

0

                 if(value.indexOf('２') != -1) return false;

292

0

                 if(value.indexOf('３') != -1) return false;

293

0

                 if(value.indexOf('４') != -1) return false;

294

0

                 if(value.indexOf('５') != -1) return false;

295

0

                 if(value.indexOf('６') != -1) return false;

296

0

                 if(value.indexOf('７') != -1) return false;

297

0

                 if(value.indexOf('８') != -1) return false;

298

0

                 if(value.indexOf('９') != -1) return false;

299

             }

300

0

             return true;

301

         }

302

303

304

305

306

307

         /*

308

          * ユーティリティ ---------------------------------------------------------------------------------------------

309

          */

310

         /** @return 機関会員がログインしているときにTrue */

311

         protected boolean isMember() {

312

0

             return AppSession.get().isLogin()

313

0

                     && AppSession.get().getLoginUser().getKind() != null

314

0

                     && AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関会員);

315

         }

316

         /** @return 機関管理者がログインしているときにTrue */

317

         protected boolean isOrgAdmin() {

318

0

             return AppSession.get().isLogin()

319

0

                     && AppSession.get().getLoginUser().getKind() != null

320

0

                     && AppSession.get().getLoginUser().getKind().equals(Usr.KIND_機関管理者);

321

         }

322

         /** @return 運営管理者がログインしているときにTrue */

323

         protected boolean isSystemAdmin() {

324

0

             return AppSession.get().isLogin()

325

0

                     && AppSession.get().getLoginUser().getKind() != null

326

0

                     && AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者);

327

         }

328

         protected boolean isSystemAdmin代表者() {

329

0

             return AppSession.get().isLogin()

330

0

                     && AppSession.get().getLoginUser().getKind() != null

331

0

                     && AppSession.get().getLoginUser().getKind().equals(Usr.KIND_運営管理者)

332

0

                     && AppSession.get().getLoginUser().getOrgrole() != null

333

0

                     && AppSession.get().getLoginUser().getOrgrole().equals(Usr.ROLE_管理者);

334

         }

335

         /**

336

          * @param usr

337

          * @return usr のログインIDが、ログインユーザのIDと一致するときにTrue

338

          */

339

         protected boolean isLoginUser(Usr usr) {

340

0

             return AppSession.get().isLogin()

341

0

                     && AppSession.get().getLoginUser().getUsrid().equals(usr.getUsrid());

342

         }

343

344

     //    protected String createFullUrl(String url, boolean https) {

345

     //        /* URLを作成する */

346

     //        Url urlMe = getRequestCycle().getRequest().getOriginalUrl();

347

     //        /* 必要に応じてプロトコルを変更する */

348

     //        String protocol = https ? "https://" : "http://";

349

     //        String host = urlMe.getHost(); // 現在のホスト名を引き継ぐ

350

     //        String port = String.valueOf(urlMe.getPort()); // 現在のポートを引き継ぐ

351

     //        if (StringUtils.isEmpty(port) || "80".equals(port)) {

352

     //            port = "";

353

     //        } else {

354

     //            port = ":" + port;

355

     //        }

356

     //        String contextPath = getRequestCycle().getRequest().getContextPath(); // 現在のコンテキストパスを引き継ぐ

357

     //        String urlBase = protocol + host + port + contextPath + "/" + url;

358

     //        return urlBase;

359

     //    }

360

361

         protected String getScreenId() {

362

0

             return getPage().getClass().getSimpleName();

363

         }

364

         protected PageParameters getParams() {

365

0

             return super.getPageParameters();

366

         }

367

         protected void addCookie(String name, String value, int time) {

368

0

             Cookie cookie = new Cookie(name, value);

369

0

             cookie.setPath("/");

370

0

             cookie.setMaxAge(time); // 保存期間

371

0

             ((WebResponse) getRequestCycle().getResponse()).addCookie(cookie);

372

0

         }

373

         protected String getCookie(String name) {

374

0

             List<Cookie> cookies = ((WebRequest) getRequestCycle().getRequest()).getCookies();

375

0

             if (cookies != null) {

376

0

                 for (Cookie cookie : cookies) {

377

0

                     if (name.equals(cookie.getName())) {

378

0

                         return cookie.getValue();

379

                     }

380

                 }

381

             }

382

0

             return "";

383

         }

384

     // TODO 実装箇所再検討

385

         protected static boolean validFromToDate(String value) {

386

0

             if("00000000".equals(value)){

387

0

                 return true; // 未指定として正しい値

388

             }

389

0

             final DateFormat DF = new SimpleDateFormat("yyyyMMdd");

390

0

             DF.setLenient(false); // 厳密な変換

391

             try {

392

0

                 DF.parse(value);

393

0

                 return true;

394

0

             } catch (ParseException e) {

395

0

                 return false;

396

             }

397

         }

398

399

400

401

402

403

404

     }