webshit
7
.idea/inspectionProfiles/profiles_settings.xml
generated
@ -1,7 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="PROJECT_PROFILE" value="Default" />
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
6
.idea/vcs.xml
generated
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
0
.gitignore → android/.gitignore
vendored
10
android/.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<component name="InspectionProjectProfileManager">
|
||||||
|
<profile version="1.0">
|
||||||
|
<option name="myName" value="Project Default" />
|
||||||
|
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
|
||||||
|
<option name="processCode" value="true" />
|
||||||
|
<option name="processLiterals" value="true" />
|
||||||
|
<option name="processComments" value="true" />
|
||||||
|
</inspection_tool>
|
||||||
|
</profile>
|
||||||
|
</component>
|
0
app/.gitignore → android/app/.gitignore
vendored
@ -35,16 +35,17 @@ public class FBMService extends FirebaseMessagingService
|
|||||||
|
|
||||||
// TODO(developer): Handle FCM messages here.
|
// TODO(developer): Handle FCM messages here.
|
||||||
// Not getting messages here? See why this may be: https://goo.gl/39bRNJ
|
// Not getting messages here? See why this may be: https://goo.gl/39bRNJ
|
||||||
Log.i("FB::MessageReceived<1>", "From: " + remoteMessage.getFrom());
|
Log.i("FB::MessageReceived", "From: " + remoteMessage.getFrom());
|
||||||
|
|
||||||
// Check if message contains a data payload.
|
// Check if message contains a data payload.
|
||||||
if (remoteMessage.getData().size() > 0) {
|
if (remoteMessage.getData().size() > 0) {
|
||||||
Log.i("FB::MessageReceived<3>", "Payload: " + remoteMessage.getData());
|
Log.i("FB::MessageReceived", "Payload: " + remoteMessage.getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if message contains a notification payload.
|
// Check if message contains a notification payload.
|
||||||
if (remoteMessage.getNotification() != null) {
|
if (remoteMessage.getNotification() != null) {
|
||||||
Log.i("FB::MessageReceived<2>", "Payload: " + remoteMessage.getNotification().getBody());
|
Log.i("FB::MessageReceived", "Notify_Title: " + remoteMessage.getNotification().getTitle());
|
||||||
|
Log.i("FB::MessageReceived", "Notify_Body: " + remoteMessage.getNotification().getBody());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Also if you intend on generating your own notifications as a result of a received FCM
|
// Also if you intend on generating your own notifications as a result of a received FCM
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.9 KiB |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 6.9 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 9.0 KiB After Width: | Height: | Size: 9.0 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
0
gradlew → android/gradlew
vendored
0
gradlew.bat → android/gradlew.bat
vendored
183
web/.gitignore
vendored
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
|
||||||
|
# Created by https://www.gitignore.io/api/git,windows,intellij,phpstorm+all
|
||||||
|
|
||||||
|
### Git ###
|
||||||
|
# Created by git for backups. To disable backups in Git:
|
||||||
|
# $ git config --global mergetool.keepBackup false
|
||||||
|
*.orig
|
||||||
|
|
||||||
|
# Created by git when using merge tools for conflicts
|
||||||
|
*.BACKUP.*
|
||||||
|
*.BASE.*
|
||||||
|
*.LOCAL.*
|
||||||
|
*.REMOTE.*
|
||||||
|
*_BACKUP_*.txt
|
||||||
|
*_BASE_*.txt
|
||||||
|
*_LOCAL_*.txt
|
||||||
|
*_REMOTE_*.txt
|
||||||
|
|
||||||
|
### Intellij ###
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
.idea/**/workspace.xml
|
||||||
|
.idea/**/tasks.xml
|
||||||
|
.idea/**/usage.statistics.xml
|
||||||
|
.idea/**/dictionaries
|
||||||
|
.idea/**/shelf
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
.idea/**/contentModel.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
.idea/**/dataSources/
|
||||||
|
.idea/**/dataSources.ids
|
||||||
|
.idea/**/dataSources.local.xml
|
||||||
|
.idea/**/sqlDataSources.xml
|
||||||
|
.idea/**/dynamic.xml
|
||||||
|
.idea/**/uiDesigner.xml
|
||||||
|
.idea/**/dbnavigator.xml
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
.idea/**/gradle.xml
|
||||||
|
.idea/**/libraries
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
cmake-build-*/
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
.idea/**/mongoSettings.xml
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
.idea/replstate.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
.idea/httpRequests
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
.idea/caches/build_file_checksums.ser
|
||||||
|
|
||||||
|
### Intellij Patch ###
|
||||||
|
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||||
|
|
||||||
|
# *.iml
|
||||||
|
# modules.xml
|
||||||
|
# .idea/misc.xml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
# Sonarlint plugin
|
||||||
|
.idea/sonarlint
|
||||||
|
|
||||||
|
### PhpStorm+all ###
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
|
||||||
|
# User-specific stuff
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
|
||||||
|
# Sensitive or high-churn files
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
|
||||||
|
# Gradle and Maven with auto-import
|
||||||
|
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||||
|
# since they will be recreated, and may cause churn. Uncomment if using
|
||||||
|
# auto-import.
|
||||||
|
# .idea/modules.xml
|
||||||
|
# .idea/*.iml
|
||||||
|
# .idea/modules
|
||||||
|
|
||||||
|
# CMake
|
||||||
|
|
||||||
|
# Mongo Explorer plugin
|
||||||
|
|
||||||
|
# File-based project format
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
|
||||||
|
# Cursive Clojure plugin
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
|
||||||
|
# Editor-based Rest Client
|
||||||
|
|
||||||
|
# Android studio 3.1+ serialized cache file
|
||||||
|
|
||||||
|
### PhpStorm+all Patch ###
|
||||||
|
# Ignores the whole .idea folder and all .iml files
|
||||||
|
# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
|
||||||
|
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
|
||||||
|
|
||||||
|
*.iml
|
||||||
|
modules.xml
|
||||||
|
.idea/misc.xml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### Windows ###
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
|
||||||
|
# End of https://www.gitignore.io/api/git,windows,intellij,phpstorm+all
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#################
|
||||||
|
|
||||||
|
config.php
|
BIN
web/lib/httpful.phar
Normal file
73
web/model.php
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
include('lib/httpful.phar');
|
||||||
|
|
||||||
|
class Statics
|
||||||
|
{
|
||||||
|
public static $DB = NULL;
|
||||||
|
public static $CFG = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getConfig()
|
||||||
|
{
|
||||||
|
if (Statics::$CFG !== NULL) return Statics::$CFG;
|
||||||
|
|
||||||
|
return Statics::$CFG = require "config.php";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDatabase()
|
||||||
|
{
|
||||||
|
if (Statics::$DB !== NULL) return Statics::$DB;
|
||||||
|
|
||||||
|
$_config = getConfig()['database'];
|
||||||
|
|
||||||
|
$dsn = "mysql:host=" . $_config['host'] . ";dbname=" . $_config['database'] . ";charset=utf8";
|
||||||
|
$opt = [
|
||||||
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
|
PDO::ATTR_EMULATE_PREPARES => false,
|
||||||
|
];
|
||||||
|
|
||||||
|
return Statics::$DB = new PDO($dsn, $_config['user'], $_config['password'], $opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateRandomAuthKey()
|
||||||
|
{
|
||||||
|
$random = '';
|
||||||
|
for ($i = 0; $i < 64; $i++)
|
||||||
|
|
||||||
|
try {
|
||||||
|
switch (random_int(1, 3)) {
|
||||||
|
case 1:
|
||||||
|
$random .= chr(random_int(ord('0'), ord('9')));
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
$random .= chr(random_int(ord('A'), ord('Z')));
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
$random .= chr(random_int(ord('a'), ord('z')));
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception $e)
|
||||||
|
{
|
||||||
|
die(json_encode(['success' => false, 'message' => 'Internal error - no randomness']));
|
||||||
|
}
|
||||||
|
return $random;
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendPOST($url, $body, $header)
|
||||||
|
{
|
||||||
|
$builder = \Httpful\Request::post($url);
|
||||||
|
|
||||||
|
$builder->body($body);
|
||||||
|
|
||||||
|
foreach ($header as $k => $v) $builder->addHeader($k, $v);
|
||||||
|
|
||||||
|
$response = $builder->send();
|
||||||
|
|
||||||
|
if ($response->code != 200) throw new Exception("Repsponse code: " . $response->code);
|
||||||
|
|
||||||
|
return $response->body;
|
||||||
|
}
|
17
web/register.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
include_once 'model.php';
|
||||||
|
|
||||||
|
if (!isset($_GET['fcm_token'])) die(json_encode(['success' => false, 'message' => 'Missing parameter [[fcm_token]]']));
|
||||||
|
|
||||||
|
$fcmtoken = $_GET['fcm_token'];
|
||||||
|
$user_key = generateRandomAuthKey();
|
||||||
|
|
||||||
|
$pdo = getDatabase();
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare('INSERT INTO users (user_key, fcm_token, timestamp_accessed) VALUES (:key, :token, NOW())');
|
||||||
|
$stmt->execute(['key' => $user_key, 'token' => $fcmtoken]);
|
||||||
|
$user_id = $pdo->lastInsertId('user_id');
|
||||||
|
|
||||||
|
echo json_encode(['success' => true, 'user_id' => $user_id, 'user_key' => $user_key, 'message' => 'new user registered']);
|
||||||
|
return 0;
|
10
web/schema.sql
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
CREATE TABLE `users`
|
||||||
|
(
|
||||||
|
`id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`auth_token` VARCHAR(64) NOT NULL,
|
||||||
|
`fcm_token` VARCHAR(256) NULL DEFAULT NULL,
|
||||||
|
`messages_sent` INT(11) NOT NULL DEFAULT '0',
|
||||||
|
`timestamp_created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
`timestamp_accessed` DATETIME NULL DEFAULT NULL,
|
||||||
|
PRIMARY KEY (`id`)
|
||||||
|
);
|
72
web/send.php
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
include_once 'model.php';
|
||||||
|
|
||||||
|
|
||||||
|
if (!isset($_GET['user_id'])) die(json_encode(['success' => false, 'message' => 'Missing parameter [[user_id]]']));
|
||||||
|
if (!isset($_GET['user_key'])) die(json_encode(['success' => false, 'message' => 'Missing parameter [[user_token]]']));
|
||||||
|
if (!isset($_GET['message_title'])) die(json_encode(['success' => false, 'message' => 'Missing parameter [[message_title]]']));
|
||||||
|
|
||||||
|
$user_id = $_GET['user_id'];
|
||||||
|
$user_key = $_GET['user_key'];
|
||||||
|
$message = $_GET['message_title'];
|
||||||
|
$content = isset($_POST['message_content']) ? $_POST['message_content'] : '';
|
||||||
|
|
||||||
|
//----------------------
|
||||||
|
|
||||||
|
$pdo = getDatabase();
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare('SELECT user_id, user_key, fcm_token FROM users WHERE user_id = :uid LIMIT 1');
|
||||||
|
$stmt->execute(['uid' => $user_id]);
|
||||||
|
|
||||||
|
$datas = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if (count($datas)<=0) die(json_encode(['success' => false, 'message' => 'No User found']));
|
||||||
|
$data = $datas[0];
|
||||||
|
|
||||||
|
if ($data === null) die(json_encode(['success' => false, 'message' => 'User not found']));
|
||||||
|
if ($data['user_id'] !== (int)$user_id) die(json_encode(['success' => false, 'message' => 'UserID not found']));
|
||||||
|
if ($data['user_key'] !== $user_key) die(json_encode(['success' => false, 'message' => 'Authentification failed']));
|
||||||
|
|
||||||
|
$fcm = $data['fcm_token'];
|
||||||
|
|
||||||
|
|
||||||
|
$url = "https://fcm.googleapis.com/fcm/send";
|
||||||
|
$payload = json_encode(
|
||||||
|
[
|
||||||
|
'to' => $fcm,
|
||||||
|
//'dry_run' => true,
|
||||||
|
'notification' =>
|
||||||
|
[
|
||||||
|
'title' => $message,
|
||||||
|
'body' => $content,
|
||||||
|
],
|
||||||
|
'data' =>
|
||||||
|
[
|
||||||
|
'title' => $message,
|
||||||
|
'body' => $content,
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
$header=
|
||||||
|
[
|
||||||
|
'Authorization' => 'key=' . getConfig()['firebase']['server_key'],
|
||||||
|
'Content-Type' => 'application/json',
|
||||||
|
];
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
$httpresult = sendPOST($url, $payload, $header);
|
||||||
|
}
|
||||||
|
catch (Exception $e)
|
||||||
|
{
|
||||||
|
die(json_encode(['success' => false, 'message' => 'Exception: ' . $e->getMessage()]));
|
||||||
|
}
|
||||||
|
|
||||||
|
var_dump($httpresult);
|
||||||
|
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare('UPDATE users SET timestamp_accessed=NOW(), messages_sent=messages_sent+1 WHERE user_id = :uid');
|
||||||
|
$stmt->execute(['uid' => $user_id]);
|
||||||
|
|
||||||
|
|
||||||
|
echo (json_encode(['success' => true, 'message' => 'Message sent']));
|
||||||
|
return 0;
|
46
web/update.php
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
include_once 'model.php';
|
||||||
|
|
||||||
|
|
||||||
|
if (!isset($_GET['user_id'])) die(json_encode(['success' => false, 'message' => 'Missing parameter [[user_id]]']));
|
||||||
|
if (!isset($_GET['user_key'])) die(json_encode(['success' => false, 'message' => 'Missing parameter [[user_key]]']));
|
||||||
|
if (!isset($_GET['message'])) die(json_encode(['success' => false, 'message' => 'Missing parameter [[message]]']));
|
||||||
|
|
||||||
|
$user_id = $_GET['user_id'];
|
||||||
|
$user_key = $_GET['token'];
|
||||||
|
$fcm_token = isset($_GET['token']) ? $_GET['token'] : null;
|
||||||
|
|
||||||
|
//----------------------
|
||||||
|
|
||||||
|
$pdo = getDatabase();
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare('SELECT user_id, user_key FROM users WHERE user_id = :uid LIMIT 1');
|
||||||
|
$stmt->execute(['uid' => $user_id]);
|
||||||
|
|
||||||
|
$datas = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
if (count($datas)<=0) die(json_encode(['success' => false, 'message' => 'No User found']));
|
||||||
|
$data = $datas[0];
|
||||||
|
|
||||||
|
if ($data === null) die(json_encode(['success' => false, 'message' => 'User not found']));
|
||||||
|
if ($data['user_id'] !== (int)$user_id) die(json_encode(['success' => false, 'message' => 'UserID not found']));
|
||||||
|
if ($data['user_key'] !== $user_key) die(json_encode(['success' => false, 'message' => 'Authentification failed']));
|
||||||
|
|
||||||
|
$new_userkey = generateRandomAuthKey();
|
||||||
|
|
||||||
|
if ($fcm_token === null)
|
||||||
|
{
|
||||||
|
$stmt = $pdo->prepare('UPDATE users SET timestamp_accessed=NOW(), user_key=:at WHERE user_id = :uid');
|
||||||
|
$stmt->execute(['uid' => $user_id, 'at' => $new_userkey]);
|
||||||
|
|
||||||
|
echo json_encode(['success' => true, 'user_id' => $user_id, 'user_key' => $new_userkey, 'message' => 'user updated']);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$stmt = $pdo->prepare('UPDATE users SET timestamp_accessed=NOW(), fcm_token=:ft, user_key=:at WHERE user_id = :uid');
|
||||||
|
$stmt->execute(['uid' => $user_id, 'ft' => $fcm_token, 'at' => $new_userkey]);
|
||||||
|
|
||||||
|
echo json_encode(['success' => true, 'user_id' => $user_id, 'user_key' => $new_userkey, 'message' => 'user updated']);
|
||||||
|
return 0;
|
||||||
|
}
|