Example #1
0
 def uris(self):
     return URIs(media=uri("media", {
         "id": self.media_name,
         "extension": self.extension
     }),
                 preview=uri("preview", {
                     "id": self.media_name,
                     "extension": self.extension
                 }))
Example #2
0
    async def post(self):

        user = self.current_user
        if not 'file' in self.request.files.keys():
            
            self.write({"Error": "File not provided"})
            self.set_status(422)
            return
            
        image = self.request.files['file'][0]

        # Search for a valid id 
        valid = False
        ident = ""
        while not valid:

            try:
                ident = str(uuid.uuid4())
                media = await self.application.objects.get(Media, media_name = ident)
            except Media.DoesNotExist:
                valid = True # If we are here that means that the object exits


        manager = MediaManager(self.request.files['file'][0]['body'])

        valid = manager.is_valid()

        if valid:
            description = self.get_argument('description', '')
            focus = (0,0)
            if self.get_argument('focus', False):
                args = self.get_argument('focus').replace(" ", "").split(',')
                if len(args) == 2:
                    focus = args[:2]

            extension = manager.get_media_type()
            
            urls = URIs(
                media=uri("media", {"id":ident, "extension": extension}),
                preview=uri("preview", {"id":ident, "extension": extension})
            )
            m = {
                "description": description,
                "id": ident, 
                "type": "unknown",
                "url": urls.media,
                "preview_url": urls.preview,
                "meta": None
            }   
            store_media(manager, ident, description, focus)

            self.write(json.dumps(m, default=str))
            self.set_status(200)
        else:
            raise CustomError(reason="Error storing files", status_code=400)
Example #3
0
 def uris(self):
     if self.remote:
         ap_id = self.ap_id
     else:
         ap_id = uri("status", {
             "username": self.user.username,
             "id": self.id
         })
     return URIs(id=ap_id,
                 media=uri("media", {"id": self.media_name}),
                 preview=uri("preview", {"id": self.media_name}))
Example #4
0
 def uris(self):
     from models.media import Media
     if self.remote:
         ap_id = self.ap_id
     else:
         ap_id = uri("status", {"username":self.user.username, "id":self.id})
         
     return URIs(id=ap_id,
                 url = uri("status_client_url", {"username": self.user.username, "id": self.id }), 
                 media=[uri.uris.media for uri in self.media_object],
                 preview=[uri.uris.preview for uri in self.media_object]
                 )
Example #5
0
    async def to_activitystream(self):
        uris = await self.uris

        json_dict = {
            "@context": [
                "https://www.w3.org/ns/activitystreams",
                "https://w3id.org/security/v1",
            ],
            "type": "Person",
            "id": uris.id,
            "name": self.name,
            "preferredUsername": await self.username,
        }

        if not self.is_remote:
            json_dict.update({
                "following": uris.following,
                "followers": uris.followers,
                "outbox": uris.outbox,
                "inbox": uris.inbox,
                "publicKey": {
                    'publicKeyPem': import_keys()["actorKeys"]["publicKey"],
                    'id': f'{BASE_URL}/users/{await self.username}#main-key',
                    'owner': f'{BASE_URL}/users/{await self.username}'
                },
                "summary": self.description,
                "manuallyApprovesFollowers": await self.is_private,
                "featured": uris.featured,
                "endpoints": {
                    "sharedInbox": uri('sharedInbox')
                }
            })

        return json_dict
Example #6
0
    async def to_activitystream(self):
        await self.fetch_related('user')
        media_files = await fetch_media_as_by_id(self.ident)
        
        data = {
            "id": uri("status", {"username":self.user.username, "id":self.id}),
            "type": "Note",
            "summary": None,
            
            "published": self.created_at.replace(microsecond=0).isoformat() + "Z",
            "url": self.uris.url,
            "attributedTo": await self.user.ap_id,
            #"hashtags": self.hashtags,
            "sensitive": self.sensitive,
            "attachment": media_files,
            "spoiler_text": self.spoiler_text,
            "content": self.caption,
        }

        if self.is_public:
            data['to'] = ["https://www.w3.org/ns/activitystreams#Public"]
        else:
            data['to'] = []
        
        data['cc'] = [self.user.uris.followers] 

        return data
Example #7
0
    def save(self,*args, **kwargs):
        if not self.ap_id:
            self.ap_id = uri("status", {"username":self.user.username, "id":self.id})

        if not self.identifier:
            self.identifier = self.generate_id()

        return super(Status, self).save(*args, **kwargs)
Example #8
0
 def uris(self):
     if self.remote:
         ap_id = self.ap_id
     else:
         ap_id = uri("activity", {
             "username": self.person.username,
             "id": self.id
         })
     return URIs(id=ap_id)
Example #9
0
    def save(self, *args, **kwargs):
        if not self.remote:
            self.ap_id = uri("user", {"username": self.username})

        if not self.private_key and not self.public_key:
            #Create a pair public/private key to sign messages
            random_generator = Random.new().read
            key = RSA.generate(2048, random_generator)
            self.public_key = key.publickey().exportKey().decode('utf-8')
            self.private_key = key.exportKey().decode('utf-8')

        return super(User, self).save(*args, **kwargs)
Example #10
0
    def uris(self):
        if self.is_remote:
            return URIs(
                id=self.ap_id,
                inbox=f'{self.ap_id}/inbox',
                outbox=f'{self.ap_id}/inbox',
                following=f'{self.ap_id}/following',
                followers=f'{self.ap_id}/followers',
            )

        return URIs(id=uri("user", {"username": self.username}),
                    following=uri("following", {"username": self.username}),
                    followers=uri("followers", {"username": self.username}),
                    outbox=uri("outbox", {"username": self.username}),
                    inbox=uri("inbox", {"username": self.username}),
                    atom=uri("atom", {"id": self.id}),
                    featured=uri("featured", {"username": self.username}),
                    avatar=uri('profile_image', {"name": self.avatar_file}),
                    client=uri('user_client', {'username': self.username}))
Example #11
0
    def uris(self):
        if self.remote:
            return URIs(id=self.ap_id)

        return URIs(
            id=uri("user", {"username": self.username}),
            following=uri("following", {"username": self.username}),
            followers=uri("followers", {"username": self.username}),
            outbox=uri("outbox", {"username": self.username}),
            inbox=uri("inbox", {"username": self.username}),
            atom=uri("atom", {"username": self.username}),
            avatar=self.avatar,
            featured=uri("featured", {"username": self.username}),
        )
Example #12
0
    def save(self, *args, **kwargs):
        if not self.is_remote:
            self.ap_id = uri("user", {"username": self.username})

        if not self.id:
            self.id = self.user.id

        if not self.avatar_file:
            pixel_avatar = PixelAvatar(rows=10, columns=10)
            image_byte_array = pixel_avatar.get_image(size=400,
                                                      string=self.ap_id,
                                                      filetype="jpeg")

            self.avatar_file = self._crate_avatar_file(image_byte_array)

        return super(UserProfile, self).save(*args, **kwargs)
Example #13
0
    def save(self, *args, **kwargs):
        if not self.remote:
            self.ap_id = uri("user", {"username": self.username})

        if not self.private_key and not self.public_key:
            #Create a pair public/private key to sign messages
            random_generator = Random.new().read
            key = RSA.generate(2048, random_generator)
            self.public_key = key.publickey().exportKey().decode('utf-8')
            self.private_key = key.exportKey().decode('utf-8')

        if not self.avatar_file:
            pixel_avatar = PixelAvatar(rows=10, columns=10)
            image_byte_array = pixel_avatar.get_image(size=400,
                                                      string=self.ap_id,
                                                      filetype="jpeg")

            self.avatar_file = self._crate_avatar_file(image_byte_array)

        return super(UserProfile, self).save(*args, **kwargs)
Example #14
0
    def to_activitystream(self):
        json = {
            "id": uri("status", {"username":self.user.username, "id":self.id}),
            "type": "Note",
            "summary": None,
            
            "published": self.created_at.replace(microsecond=0).isoformat() + "Z",
            "url": self.uris.url,
            "attributedTo": self.user.ap_id,
            #"hashtags": self.hashtags,
            "sensitive": self.sensitive,
            "attachment":[ media.to_activitystream() for media in self.media_object],
            "spoiler_text": self.spoiler_text,
            "content": self.caption,
        }

        if self.is_public:
            json['to'] = ["https://www.w3.org/ns/activitystreams#Public"]
        else:
            json['to'] = []
        
        json['cc'] = [self.user.uris.followers] 

        return json
Example #15
0
async def new_user_async(
        username: str,
        password: str,
        email: str,
        is_remote: bool = False,
        confirmed: bool = False,
        is_private: bool = False,
        is_admin: bool = False,
        public_key: str = None,
        name: str = None,
        description: str = "",
        ap_id: str = None,
        send_confirmation: bool = True,
        public_inbox: Union[str, None] = None) -> Union[bool, UserProfile]:
    """
        Returns False or UserProfile
    """

    if not (password and username and email):
        return False

    objects = Manager(db)

    # Verify username

    logging.debug(f"Starting to create user {username}")

    username_count = await objects.count(
        User.select().where(User.username == username))

    if not valid_username(username) or (username_count != 0):
        logger.error(f"@{username} is a not valid username")
        return False

    # Hash the password
    passw = bcrypt.hashpw(password, salt_code)

    # First we create the actual user
    try:
        user = await objects.create(
            User,
            username=username.lower(),
            password=passw,
            email=email,
            confirmed=confirmed,
            is_admin=is_admin,
            is_private=is_private,
        )
    except Exception as e:
        logging.error(f"User not created: {e}")
        return False

    logging.debug(f"Created user {user.username}")

    if name == None:
        name = username

    # Now we create the profile
    try:

        data = {
            "id": user.id,
            "disabled": True,
            "is_remote": is_remote,
            "user": user,
            "name": name,
            "public_key": public_key,
            "description": description,
            'public_inbox': public_inbox
        }

        if is_remote:
            data['ap_id'] = ap_id
        else:
            data['ap_id'] = uri("user", {"username": username})

        profile = await objects.create(UserProfile, **data)

        # Send the confirmation email

        if not user.confirmed and send_confirmation:
            send_activation_email(profile)

        logging.info(f"New Profile created: {profile}")
        return profile
    except Exception as e:
        logging.error(e)
        await objects.delete(user)
        return False
Example #16
0
 def avatar(self):
     return uri("profile_image", {"name": self.avatar_file})
Example #17
0
 def uris(self):
     return URIs(media=uri("media", {"id": self.media_name}),
                 preview=uri("preview", {"id": self.media_name}))