def message_send(service):
    text = request.form.get('message')
    if not text:
        return Error.ARGUMENT_MISSING('message')

    subscribers = Subscription.query.filter_by(service=service).count()
    if subscribers == 0:
        # Pretend we did something even though we didn't
        # Nobody is listening so it doesn't really matter
        return Error.NONE

    level = (request.form.get('level') or '3')[0]
    level = int(level) if level in "12345" else 3
    title = request.form.get('title', '').strip()[:255]
    link = request.form.get('link', '').strip()
    msg = Message(service, text, title, level, link)
    db.session.add(msg)
    db.session.commit()

    if google_api_key or current_app.config['TESTING']:
        Gcm.send_message(msg)

    if apns_cert_path or current_app.config['TESTING']:
        Apns.send_message(msg)

    if zeromq_relay_uri:
        queue_zmq_message(json_encode({"message": msg.as_dict()}))

    service.cleanup()
    db.session.commit()
    return Error.NONE
Example #2
0
def message_send(service):
    text = request.form.get('message')
    if not text:
        return Error.ARGUMENT_MISSING('message')

    subscribers = Subscription.query.filter_by(service=service).count()
    if subscribers == 0:
        # Pretend we did something even though we didn't
        # Nobody is listening so it doesn't really matter
        return Error.NONE

    level = (request.form.get('level') or '3')[0]
    level = int(level) if level in "12345" else 3
    title = request.form.get('title', '').strip()[:255]
    link = request.form.get('link', '').strip()
    msg = Message(service, text, title, level, link)
    db.session.add(msg)
    db.session.commit()

    if google_api_key or current_app.config['TESTING']:
        Gcm.send_message(msg)

    if zeromq_relay_uri:
        queue_zmq_message(json_encode({"message": msg.as_dict()}))

    service.cleanup()
    db.session.commit()
    return Error.NONE
Example #3
0
def message_send(service):
    text = request.form.get('message')
    if not text:
        return jsonify(Error.ARGUMENT_MISSING('message'))
    level = (request.form.get('level') or '3')[0]
    level = int(level) if level in "12345" else 3
    title = request.form.get('title', '').strip()[:255]
    link = request.form.get('link', '').strip()
    msg = Message(service, text, title, level, link)
    db.session.add(msg)
    db.session.commit()

    if google_api_key:
        Gcm.send_message(msg)

    if zeromq_relay_uri:
        queue_zmq_message(json_encode({"message": msg.as_dict()}))

    service.cleanup()
    db.session.commit()
    return jsonify(Error.NONE)
Example #4
0
def SpecificChannelHandler(channel_id):
    if 'X-User' not in request.headers:
        return Response('Unauthorized Access', 401, mimetype='text/html')
    
    chann = db.session.query(Channel).get(channel_id)
    user = json.loads(request.headers['X-User'])
    user = find_user(user["id"])
    if request.method == 'GET':
        # check if private channel and user apart of channel
        if chann.private==True and user not in chann.members:
            return Response('Access Forbidden', 403, mimetype='text/html')
        
        # check if before query parameter
        before = request.args.get('before')
        if before:
            # get 100 messages before this message id
            msgs = db.session.query(Message).filter((Message.chann_id==chann.id) & (Message.id < before)).limit(100).all()
            return Response(json.dumps([m.as_dict() for m in msgs]), 200, mimetype='application/json')
        else:
            # get 100 most recent messages
            msgs = db.session.query(Message).filter(Message.chann_id==chann.id).order_by(Message.id.desc()).limit(100)
            return Response(json.dumps([m.as_dict() for m in msgs]), 200, mimetype='application/json')

    if request.method == 'POST':
        if chann.private==True and user not in chann.members:
            return Response('Access Forbidden', 403, 'text/html')
        
        # create new message with json body and add to db
        # respond with 201, application/json and copy of new message as json
        msg = Message(body=request.json['body'], chann_id=chann.id)
        try:
            msg.creator = user
            db.session.add(msg)
            db.session.commit()

             # send event to msg queue
            event = {}
            event["type"] = "message-new"
            event["message"] = msg.as_dict()
            if chann.private == True:
                event["userIDs"] = [m.id for m in chann.members]
            mq_chan.basic_publish(exchange='', routing_key=config.rmQueue, body=json.dumps(event))

            return Response(json.dumps(msg.as_dict()), 201, mimetype='application/json')
        except Exception as e:
            print(e, file=sys.stderr)
            db.session.rollback()
            return Response('Bad Request', 400, mimetype='text/html')


    if request.method == 'PATCH':
        # check user is creator of channel
        if user.id != chann.creator_id:
            return Response('Access Forbidden', 403, mimetype='text/html')
        
        name = request.json['name']
        descr = request.json['description']
        try:
            if name != None:
                chann.name = name
            
            if descr != None:
                chann.description = descr
            chann.edited_at = datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")
            db.session.commit()

             # send event to msg queue
            event = {}
            event["type"] = "channel-update"
            event["channel"] = chann.as_dict()
            if chann.private == True:
                event["userIDs"] = [m.id for m in chann.members]
            mq_chan.basic_publish(exchange='', routing_key=config.rmQueue, body=json.dumps(event))

            return Response(json.dumps(chann.as_dict()), 200, mimetype='application/json')
        except Exception as e:
            print(e, file=sys.stderr)
            db.session.rollback()
            return Response('Bad Request', 400, mimetype='text/html')
    

    if request.method == 'DELETE':
        # check user is creator
        if user.id != chann.creator_id:
            return Response('Access Forbidden', 403, mimetype='text/html')
        
        # delete channel from db and all messages related to channel
        # respond with text/html indicating delete success
        try:
            Message.query.filter_by(chann_id=chann.id).delete()
            Channel.query.filter_by(id=chann.id).delete()
            db.session.commit()

             # send event to msg queue
            event = {}
            event["type"] = "channel-delete"
            event["channelID"] = chann.id
            if chann.private == True:
                event["userIDs"] = [m.id for m in chann.members]
            mq_chan.basic_publish(exchange='', routing_key=config.rmQueue, body=json.dumps(event))

            return Response('Channel Delete Successful', 200, mimetype='text/html')
        except Exception as e:
            print(e, file=sys.stderr)
            db.session.rollback()
            return Response('Internal Server Error', 500, mimetype='text/html')